Czy przyciągać linie automatycznie do punktów?

19

Mam dwa wektorowe pliki kształtów: jeden plik to punkty reprezentujące włazy, a drugi to plik polilinii reprezentujący rury prowadzące do i z włazów. Muszę zatrzasnąć linie w określonej odległości od najbliższego włazu.

Czy istnieje prosty sposób na osiągnięcie tego celu bez robienia tego ręcznie?

linie -> punkty

Aktualizacja

Zgodnie z Alexandre, wyeksportowałem moje pliki kształtu do formatu przestrzennego. Nie jestem pewien, co dalej.

wprowadź opis zdjęcia tutaj

Aktualizacja nr 2 Utworzyłem nowy plik db i zaimportowałem pliki shapefile do nowego db za pomocą spatialite-gui, dostosowałem zapytanie SQL, ale jak widać, pojawia się błąd „brak takiej kolumny: f.geom”

wprowadź opis zdjęcia tutaj

GreyHippo
źródło
W tabeli przestrzennej (warstwie) Spatialite geometrie elementów są zapisywane w atrybucie. Nazwy mogą być różne. W tabeli „potok” ten atrybut nosi nazwę Geometria. Zaktualizuję moją odpowiedź, zakładając, że mh również jako atrybut geometrii.
Alexandre Neto,
Wystąpił błąd „brak takiej funkcji: ST_Snap”. Używam QGIS 1.8 na Windows 7 64bit.
GreyHippo,
Jaki masz Spatialite? Możesz to sprawdzić w QGIS> Pomoc> Informacje
Alexandre Neto
„no such column: f.geom” - spróbuj z f.Geometry
vinayan
Moja wersja Spatialite to 3.0.1
GreyHippo

Odpowiedzi:

26

Jeśli chcesz umieścić swoje dane w Postgis (lub Spatialite ), możesz użyć ST_Snap do robienia tego, co chcesz.

Wystarczy użyć linii warstwa \ tabela jako danych wejściowych, a warstwa punktów jako odniesienie i ustawić tolerancję. Coś takiego:

SELECT
    f.gid as gid,
    ST_Snap(f.Geometry, g.Geometry, 2) as geom
FROM
    pipe as f,
    (SELECT ST_Collect(Geometry) as Geometry
     FROM mh) as g

Rezultat jest następujący:

wprowadź opis zdjęcia tutaj

Następnie możesz zaktualizować geometrie za pomocą identyfikatora elementu.

Alexandre Neto
źródło
Gdzie mam umieścić kod „Wybierz ... Od ...”? Co rozumie się przez „używanie identyfikatora funkcji”?
GreyHippo,
Po zaimportowaniu plików do bazy danych (postgis lub spatialite) możesz użyć DB Managera, aby zobaczyć tabele bazy danych i uruchomić zapytanie SQL (kod) w oknie SQL, a następnie załadować go do swojego obszaru roboczego. Powiedz mi, czy to działa dla Ciebie, a następnie wykonamy część aktualizacji.
Alexandre Neto,
Alexandre, patrz aktualizacja powyżej. Wyeksportowałem plik do dwóch plików spatiallite.
GreyHippo,
Powinieneś umieścić oba pliki w tej samej bazie danych Spatialite, po prostu przeciągnij powiedz „pipe” do bazy danych „mh.sqlite”. Po tym zaktualizuj Kod SQL, aby zmienić „punkty” na „mh”, a „linie” na „potok”. Dostosuj także „gid” do swojego identyfikatora „pipe”. Następnie możesz wykonać i załadować wyniki.
Alexandre Neto,
3

Nie wiem dużo o QGIS ani GRASS, ale niektóre szybkie googlingy przyniosły v.clean w GRASS powinny załatwić sprawę .

Zobacz ten post i ten .

Alternatywy dla QGIS i GRASS:

Gdybym miał to zrobić w ArcGIS, prawdopodobnie zapisałbym moje dane w zbiorze danych elementu w geobazie pliku i utworzyłbym topologię w celu zidentyfikowania obszarów, w których warstwa punktowa nie znajdowała się na punktach końcowych linii. Następnie możesz naprawić błędy za pomocą Inspektora błędów .

Ale prawdopodobnie najszybszym i najłatwiejszym rozwiązaniem byłoby FME. Możesz spróbować użyć Snapper Tool lub jeszcze lepszego narzędzia AnchoredSnapper . Jeśli używasz AnchoredSnapper, upewnij się, że typem przyciągania jest Przyciąganie do punktu końcowego. Oczywiście będziesz potrzebować licencji na FME. Ale możesz pobrać 14-dniowy okres próbny, jeśli go nie masz.

Fezter
źródło
Spojrzałem na v.clean, ale używa tylko jednej warstwy, muszę porównać jedną warstwę do drugiej. Poza tym bardziej szukałem opcji QGIS / opensource.
GreyHippo,
1
@GreyHippo, GRASS jest opensource
grafika
1
Wiem, że GRASS jest oprogramowaniem typu open source, ale inne opcje nie.
GreyHippo,
-1

Sposób ręczny

Qgis -> Ustawienia -> Opcje przyciągania (nie jestem pewien, ale może potrzebować rozszerzenia CadTools) i włączyć edycję topologiczną.

Sposób automatyczny

v.clean, który znajduje się w narzędziach GRASS w zestawie narzędzi SEXTANTE w QGIS. Jeśli masz PostGIS 2.0, to ST_Snap i ST_SnapToGrid () (I nie ma powodu, dla którego nie możesz go używać, jest to bardzo dobre narzędzie przestrzenne)

Sposób komercyjny

Narzędzie FME i MRF (rozszerzenie komercyjne, miałem wersję ewaluacyjną. Jest bardzo dobra).

Interesuje mnie również zarządzanie wodociągami / kanalizacją za pomocą narzędzi open source, czy masz jakieś wskazówki?

simplexio
źródło
Myślę, że właśnie to GreyHippo rozumie przez „robienie tego ręcznie”. Wystarczy użyć opcji przyciągania, będziesz musiał ręcznie przesunąć każdy wiszący węzeł, aby aktywować przyciąganie. A może coś mi brakuje?
Jake,
Nie. byłem ślepy.
simplexio
Simplexio, NIE chcę tego robić ręcznie. Miałem nadzieję na wtyczkę lub proces, o którym nie wiem.
GreyHippo
Nie sądziłem, że możesz użyć GRASS v.clean na dwóch warstwach?
GreyHippo,
1
jeśli dobrze pamiętam, może naprawić zbyt krótkie linie. widzisz, problem nie polega na tym, że włazy nie są w odpowiednich miejscach, lecz na tym, że twoja sieć kanalizacyjna nie jest poprawna topologicznie. A to wymaga tylko warstwy rur. Każdy system sieci komunalnej, który widziałem, zakłada, że ​​na każdym skrzyżowaniu kanału znajduje się właz. To offcourse zakłada, że ​​chcesz mieć poprawną topologię.
simplexio