Rysowanie granicy zbioru punktów za pomocą QGIS?

9

Mam zestaw punktów, które chciałbym zmienić w wielokąt.

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Próbowałem kadłuba wklęsłego, ale nie otrzymuję zamierzonego wielokąta, jak widać poniżej,

wprowadź opis zdjęcia tutaj

Kiedy korzystam z triangulacji Denaulaya, muszę usunąć zewnętrzne trójkąty.

wprowadź opis zdjęcia tutaj

Czy istnieje skuteczny sposób na zrobienie tego samego?

Próbowałem też wypukłego kadłuba.

wprowadź opis zdjęcia tutaj

Stephen Jacob
źródło
Czy wypróbowujesz Wektor -> Narzędzia geoprzetwarzania -> Wypukły kadłub (y) ... lub Przybornik geoprzetwarzania -> Narzędzia geometrii wektorowej -> Wypukły kadłub?
Dmitrij Barysznikow
Tak, próbowałem tego. Myślałem jednak, że nie dotyczy to wymaganego kształtu. Zaktualizuję pytanie.
Stephen Jacob
3
czy masz linie pokazane na pierwszym obrazie, czy tylko punkty?
radouxju,
1
Mam pytanie: jaki jest twój cel? co reprezentują dane? rzeka? Droga ? Obawiam się, że jeśli masz kształty „S” lub skręcone, to nie zadziała, nawet z pytonem ...
Keiko,
2
@StephenJacob - Jak zamawia się twoje punkty? Jeśli ich kolejność jest zgodna z ruchem wskazówek zegara lub przeciwnie do ruchu wskazówek zegara, możliwe jest najpierw przekonwertowanie punktów na linie (np. Za pomocą narzędzia Konwertuj punkty na linie (linie) SAGA ), a następnie przekonwertowanie linii na wielokąt (np. Narzędzie Linie na wielokąty ).
Joseph

Odpowiedzi:

5

Zakładam, że wiesz, które punkty należą do „lewej” lub „prawej”, ponieważ w przeciwnym razie istnieje wiele rozwiązań. Jeśli tak, możesz użyć triangulacji delaunay, a następnie wybrać trójkąty „centralne”. Dzięki tej metodzie nie trzeba mieć punktów w określonej kolejności. Wszystko, co musisz wziąć pod uwagę, to fakt, że potrzebne trójkąty muszą dotykać co najmniej jednego punktu z każdej strony.

otwórz tabelę atrybutów> wybierz według wyrażenia> „kod” = 1

wektor> narzędzie badawcze> wybierz według lokalizacji (nowy wybór, przecięcie)

wprowadź opis zdjęcia tutaj

otwórz tabelę atrybutów> odwróć zaznaczenie punktów (ctrl + R)

wektor> narzędzie badawcze> wybierz według lokalizacji (usuń z wyboru, rozłącz)

wprowadź opis zdjęcia tutaj

wektor> narzędzie geoprzetwarzania> rozpuścić

wprowadź opis zdjęcia tutaj

radouxju
źródło
3

Mam taki sam wynik jak @radouxju.

Operacje:

  1. Wybierz 1 polilinię [wybierz po kliknięciu]
  2. Zaktualizuj tabelę polilinii i wprowadź liczbę dla każdej funkcji [kalkulator polowy]
  3. Wybierz punkty, które przecinają jedną polilinię [narzędzie do zapytań przestrzennych]
  4. Zaktualizuj wybrane punkty o uprzednio zmienioną wartość polilinii [kalkulator pola]
  5. Zachowaj punkt zaznaczenia i wybierz trójkąty delaunay, które przecinają te wybrane punkty [narzędzie do zapytań przestrzennych]
    wprowadź opis zdjęcia tutaj
    wprowadź opis zdjęcia tutaj

  6. Odwróć zaznaczenie punktu lub wybierz punkty, które przecinają drugą polilinię [zaznaczenie wyrażeniem] lub [odwróć zaznaczenie]

  7. Usuń z bieżącego wyboru trójkąty delaunay, które są rozłączne z innymi punktami [narzędzie do zapytań przestrzennych]
    wprowadź opis zdjęcia tutaj
    wprowadź opis zdjęcia tutaj

  8. Scal funkcje przez zaznaczenie [narzędzie geoprzetwarzania> rozpuść]
    wprowadź opis zdjęcia tutaj
    wprowadź opis zdjęcia tutaj


WAŻNE : MUSISZ mieć polilinie, aby uzyskać ten wynik!

Keiko
źródło
Dzięki @Keiko twoja odpowiedź była przydatna do interpretacji odpowiedzi radouxju
Stephen Jacob
Nie ma za co @StephenJacob! To była tylko praca zespołowa! ;-)
Keiko,
1

Jeśli masz doświadczenie z pythonem, możesz użyć biblioteki Shapely i utworzyć wielokąt z punktów w dwóch liniach. Musisz powiedzieć Pythonowi, jakie są początkowe i końcowe punkty obu linii.

from shapely.geometry import Point, Polygon, LineString
import geopandas as gpd
import pandas as pd
line1 = [(1,1),(2,1.2),(3,1)]
line2 = [(1,2),(2,2.2),(3,2)]
# you need to reverse the order of one line to make it a polygon
line2reverse = list(reversed(line2))
polgonList2 = line1 + line2reverse
Polygon(polgonList2)

Jeszcze lepiej: możesz do tego użyć również geopand. geopandas pozwala na łatwe zapisywanie do wielu formatów, w tym plików kształtów

d = {'identifier' : [1, 2],
 'name' : ["Netherlands", "Germany"],
 "line1": [[(1,1),(2,1.2),(3,1)], [(1,1),(2,1.2),(3,1)]],
 "line2": [[(1.1,2.1),(2.1,2.3),(3.1,2.2)],[(1,2),(2,2.2),(3,2)]]
}

df = pd.DataFrame(d)
def makePolygon(row):
    line2reverse = list(reversed(row["line2"]))
    return Polygon(line1+line2reverse)    
geometries = []

for index, row in df.iterrows():
    geometries.append(makePolygon(row))
crs = {'init': 'epsg:4326'} 
gdf = gpd.GeoDataFrame(df, crs=crs, geometry=geometries)
gdf.to_file('MyGeometries.shp', driver='ESRI Shapefile')

możesz odczytać geometrie linii za pomocą funkcji geopandas gpd.read_file ().

Rząd wierzchołków wielokątów w ogólnym GIS: zgodnie z ruchem wskazówek zegara lub przeciwnie do ruchu wskazówek zegara

https://nbviewer.jupyter.org/gist/rutgerhofste/b01c17aa6851ea577f10c21a4c3717bc

RutgerH
źródło
Jak przekonwertować to na plik kształtu?
Stephen Jacob
1
Możesz używać wielu narzędzi, ale jestem fanem geopand. Użyj gdf.to_file ('MyGeometries.shp', driver = 'ESRI Shapefile')
RutgerH