Desenhando o limite do conjunto de pontos usando o QGIS?

9

Eu tenho um conjunto de pontos que gostaria de transformar em um polígono.

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Tentei o casco côncavo, mas não obtive o polígono pretendido, como você pode ver abaixo,

insira a descrição da imagem aqui

E quando uso a triangulação de Denaulay, preciso excluir os triângulos externos.

insira a descrição da imagem aqui

Existe uma maneira eficiente de fazer o mesmo?

Eu também tentei o casco convexo.

insira a descrição da imagem aqui

Stephen Jacob
fonte
Você tenta Vector -> Ferramentas de geoprocessamento -> Casco (s) convexo ... ou Caixa de ferramentas de geoprocessamento -> Ferramentas de geometria vetorial -> Casco convexo?
Dmitry Baryshnikov
Sim, eu tentei isso. No entanto, pensei que isso não se aplica à forma que eu preciso. Vou atualizar a pergunta.
Stephen Jacob
3
você tem as linhas mostradas na sua primeira imagem ou apenas os pontos?
radouxju
11
Eu tenho uma pergunta: qual é o seu objetivo? o que os dados representam? rio? estrada? Tenho medo de que se você tiver formas "S" ou formas torcidas, que não vai funcionar, mesmo com python ...
Keiko
2
@StephenJacob - Como seus pontos são pedidos? Se eles tiverem uma ordem no sentido horário ou anti-horário, é possível primeiro converter seus pontos em linhas (por exemplo, usando a ferramenta Converter pontos em linha (s) da SAGA ) e depois converter as linhas em um poygon (por exemplo, ferramenta Linhas para polígonos ).
31417 Joseph

Respostas:

5

Presumo que você saiba quais pontos pertencem à "esquerda" ou "direita", porque, caso contrário, existem muitas soluções. Nesse caso, você pode usar a triangulação delaunay seguida de uma seleção dos triângulos "centrais". Com esse método, não é necessário ter os pontos em uma ordem específica. Tudo o que você precisa considerar é o fato de que os triângulos necessários devem tocar pelo menos um ponto de cada lado.

abrir tabela de atributos> selecionar por expressão> "código" = 1

vetor> ferramenta de pesquisa> selecione por local (nova seleção, interseção)

insira a descrição da imagem aqui

abrir tabela de atributos> inverter a seleção dos pontos (ctrl + R)

vetor> ferramenta de pesquisa> selecionar por local (remover da seleção, separar)

insira a descrição da imagem aqui

vetor> ferramenta de geoprocessamento> dissolver

insira a descrição da imagem aqui

radouxju
fonte
3

Eu tenho o mesmo resultado que @radouxju.

Operações :

  1. Selecione 1 polilinha [selecione ao clicar]
  2. Atualize sua tabela de polilinha e afeta um número para cada recurso [calculadora de campo]
  3. Selecione os pontos que cruzam uma polilinha [ferramenta de consulta espacial]
  4. Atualize os pontos selecionados pelo valor da polilinha afetado anteriormente [calculadora de campo]
  5. Mantenha o ponto de seleção e selecione os triângulos delaunay que cruzam esses pontos selecionados [ferramenta de consulta espacial]
    insira a descrição da imagem aqui
    insira a descrição da imagem aqui

  6. Inverta a seleção de pontos ou selecione os pontos que cruzam a outra polilinha [seleção por expressão] ou [inverter seleção]

  7. Remova da seleção atual os triângulos delaunay que são disjuntos com os outros pontos [ferramenta de consulta espacial]
    insira a descrição da imagem aqui
    insira a descrição da imagem aqui

  8. Mesclar os recursos pela seleção [ferramenta de geoprocessamento> dissolver]
    insira a descrição da imagem aqui
    insira a descrição da imagem aqui


IMPORTANTE : DEVE ter as polilinhas para obter este resultado!

Keiko
fonte
Graças @Keiko sua resposta foi útil para interpretar a resposta de radouxju
Stephen Jacob
De nada @StephenJacob! Foi apenas trabalho em equipe! ;-)
Keiko
1

Se você tem experiência com python, pode usar a biblioteca Shapely e criar um polígono a partir dos pontos nas duas linhas. Você precisará dizer ao python quais são os pontos inicial e final de ambas as linhas.

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)

Ainda melhor: você também pode usar geopandas para fazer isso. geopandas permite salvar facilmente em vários formatos, incluindo shapefiles

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')

você pode ler as geometrias da linha usando a função geopandas gpd.read_file ().

Ordem dos vértices poligonais em geral GIS: no sentido horário ou anti-horário

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

RutgerH
fonte
Como converter isso em um arquivo de forma?
Stephen Jacob
11
Você pode usar várias ferramentas, mas eu sou um fã de geopandas. Use gdf.to_file ('MyGeometries.shp', driver = 'ESRI Shapefile')
RutgerH