Biorąc pod uwagę tabelę z geometrią linii i jeden lub więcej punktów, które są przyciągane do tej linii w osobnej tabeli, chciałbym podzielić każdą linię jednym lub więcej przecinającymi się punktami w każdym z miejsc, w których linia przecina punkt.
Na przykład istnieje linia L z trzema przecinającymi się punktami A, B i C w kolejności wzdłuż geometrii linii. Chciałbym zwrócić L jako cztery różne geometrie: od początku L do A, od A do B wzdłuż L, od B do C wzdłuż L i od C do końca L.
W przeszłości używałem zgrabnie do tego zadania, które jest liniowym problemem odniesienia ( http://sgillies.net/blog/1040/shapely-recipes/ ). Nie byłoby to jednak możliwe w tym przypadku, który ma wiele milionów linii i punktów. Zamiast tego szukam rozwiązania wykorzystującego PostgreSQL / PostGIS.
Zauważ, że punkty są ograniczone do linii. Ponadto punkt może znajdować się na początku lub na końcu linii, w którym to przypadku linia nie musi być dzielona (chyba że istnieją inne punkty, które nie są zbieżne z punktami początkowymi lub końcowymi tej samej linii). Linie podzestawu muszą zachować swój kierunek i atrybuty, ale atrybuty cech punktowych nie mają znaczenia.
źródło
IF geom_geometry_type NOT ILIKE '%LINESTRING' THEN
- ja to zredagowałem.ST_Split
obsługuje multi * ostrzypostgis 2.2
i powyżej postgis.net/docs/ST_Split.htmlUaktualnij do PostGIS 2.2 , gdzie ST_Split został rozszerzony, aby obsługiwać podział przez granicę multilinii, wielopunktów lub (wielu) wielokątów.
źródło
Nie mam dla ciebie całej odpowiedzi, ale ST_Line_Locate_Point przyjmuje argumenty i linię i zwraca liczbę od 0 do 1 reprezentującą odległość wzdłuż linii do pozycji najbliższej punktu.
ST_Line_Substring przyjmuje jako argument linię i dwie liczby, każda od 0 do 1. Liczby reprezentują pozycje na linii jako odległości ułamkowe. Funkcja zwraca segment linii biegnący między tymi dwiema pozycjami.
Pracując z tymi dwiema funkcjami, powinieneś być w stanie osiągnąć to, co chcesz zrobić.
źródło
Zostałem już o to poproszony dwa razy, więc przepraszam za opóźnienie. Jest mało prawdopodobne, aby uznać to za zwięzłe rozwiązanie; Napisałem to, gdy jestem nieco dalej niż w trakcie nauki. Wszelkie wskazówki są mile widziane, nawet te stylistyczne.
źródło
Chcę rozwinąć powyższe odpowiedzi z perspektywy początkującego. W tym scenariuszu masz serię punktów i patrzysz, aby użyć ich jako „ostrza” do cięcia linii na segmenty. Cały ten przykład zakłada, że najpierw przyciągnąłeś punkty do linii i że punkty mają unikalny atrybut ID z ich linii przyciągania. Używam „column_id” do reprezentowania unikalnego identyfikatora linii.
Po pierwsze , chcesz grupie swoje punkty na multipoints gdy więcej niż jedno ostrze spada na linię. W przeciwnym razie funkcja split_line_multipoint działa jak funkcja ST_Split, co nie jest pożądanym rezultatem.
Następnie chcesz podzielić sieć na podstawie tych wielopunktów.
Powtórz kroki 1 i 2 dla linii, które mają tylko jeden punkt przecięcia. Aby to zrobić, należy zaktualizować kod z kroku 1 do „HAVING COUNT (*) = 1”. Zmień nazwy tabel odpowiednio.
Następnie utwórz zduplikowaną tabelę linii i usuń wpisy z punktami na nich.
Na koniec połącz trzy tabele razem, używając
UNION ALL
:BAM!
źródło