atribuir e mover centróides para seus polígonos

9

Estou usando o QGIS 1.8 Lisboa. Depois de calcular os centróides a partir de um shapefile de polígono, se alguns deles estiverem fora dos contornos do polígono, eu gostaria de movê-los no polígono de onde eles vieram. O critério deve ser unívoco, pois devo usá-los para extrair coordenadas a serem usadas como o código de identificação do próprio polígono. Portanto, o procedimento deve gerar o mesmo local do ponto sempre que for executado no mesmo polígono (não uma posição aleatória como a fornecida pela função "pontos aleatórios", que fornece um novo resultado cada vez que é executada).

umbe1987
fonte
11
Parece duas perguntas. Se bem entendi, você deseja (a) adicionar pontos aleatórios dentro de um polígono e (b) atribuir a eles ou ao polígono um ID exclusivo com base nisso. A coisa mais simples que vem à mente para (a) é usar os recursos de pontos aleatórios existentes no QGIS e, em seguida, apenas cruzar essa nuvem de pontos com seu polígono.
Lynxlynxlynx
o uso da função "pontos aleatórios" tempos diferentes com os mesmos polígonos leva a resultados diferentes (ou seja, a posição dos pontos derivados de cada polígono é diferente a cada novo uso da função) e eu quero criar um método que me dê sempre o mesmo ponto por polígono de onde eu poderia extrair coordenadas que eu quero usar como código de identificação para os próprios polígonos.
umbe1987
use a ferramenta 'true centróide' do fTools em ferramentas de geometria - docs.qgis.org/html/en/docs/user_manual/plugins/…
Mapperz
isso só me dá o centróide, mas isso também pode estar fora do polígono, o que devo evitar. Preciso movê-los no polígono de onde eles derivam, usando uma função como distância mínima (mas não estou interessado na distância, quero que seja movido). Em outro blog, alguém me disse para usar o ST_PointOnSurface do PostGIS (mas estou usando o QGIS).
umbe1987
2
isso é uma duplicata do gis.stackexchange.com/questions/50029/… agora?
Underdark

Respostas:

7

Você pode usar a biblioteca python Shapely, que fornece uma função representative_point()que é garantida por estar dentro do polígono.

Aqui está um script Python que pode ser executado no console do QGIS Python. A camada de polígono para a qual você deseja criar o atributo deve ser selecionada. A função leva o nome do atributo que você deseja atualizar. O atributo já deve existir na sua camada, deve ser do tipo string e deve ser longo o suficiente (30 caracteres).

Aqui está um exemplo dos pontos que o algoritmo encontrou:

import shapely.wkb

def setIDPoint(attributename):
 layer = qgis.utils.iface.activeLayer()
 provider = layer.dataProvider()
 fields = provider.fields()
 provider.select(provider.attributeIndexes() )
 attributeID = provider.fieldNameIndex(attributename)
 feature = QgsFeature()
 layer.startEditing()
 while provider.nextFeature(feature):
  wkb = feature.geometry().asWkb()
  polygon = shapely.wkb.loads(wkb)
  reprPoint = ','.join([str(polygon.representative_point().x), str(polygon.representative_point().y)] )
  feature.changeAttribute(attributeID, reprPoint)
  layer.updateFeature(feature)
 layer.commitChanges()
Jake
fonte
Estou tentando testá-lo, parece exatamente o que estava procurando. Eu vou deixar você saber assim que eu corro!
Umbe1987
uma coisa que eu não entendi é o que você quer dizer com "deve ser do tipo string e deve ser longo o suficiente (30 caracteres)". Esta biblioteca está trabalhando diretamente em shpfiles de polígono? Nesse caso, devo criar um novo campo de tipo de string na guia Att com pelo menos 30 caracteres, e esse seria o único a ser atualizado?
umbe1987
@ user9518: Sim, a maneira como a função é escrita no momento em que você precisa criar o atributo na tabela e depois passar apenas o nome do campo para a função. O script também pode ser facilmente adaptado para criar o próprio campo necessário, se for necessário.
Jake
Eu só sinto falta de uma coisa. Parece que agora estou definindo uma função (ou uma classe) digitando "def", mas quando termino de escrever o script não acontece nada. Como finalmente posso ter o resultado na minha mesa?
umbe1987
11
Funcionou perfeitamente !!! Eu imagino que as coordenadas sejam escritas de acordo com o sistema de coordenadas da camada e que, se eu quiser ter os pontos, preciso criar um shp com essas coordenadas, certo? Se você estivesse aqui, eu lhe ofereceria pelo menos 3 cervejas! Muito obrigado por seus esforços !!!
Umbe1987
5

A ferramenta centróide ftools pode colocar o centróide fora do polígono, se for côncavo.

ST_PointOnSurfacedefinitivamente fará o que você quiser. Você pode usar o comando de dentro do QGIS se tiver instalado usando o SPIT para colocar seu shapefile no PostGIS e, em seguida, use o plug-in PgQuery para executar a consulta.

Como alternativa, se a instalação do PostGIS é um pouco exagerada , você pode usar o Spatialite no QGIS. Você pode usar o plug-in QSpatiaLite para importar seus dados para o SpatiaLite e executar a consulta (honras do SpatialLite ST_PointOnSurface).

MappaGnosis
fonte
2

Quando eu entendi direito, use: Vetor-> Ferramentas de pesquisa_> Pontos aleatórios. Agora selecione em "Design de amostragem estratificado (polígonos individuais)" use o valor do campo de entrada e use o campo apropriado, que fornece o valor numérico dos pontos, que devem ser gerados para cada polígono diferente

Kurt
fonte
o que você quer dizer com "campo apropriado"? Eu estava pensando em usar o centróide e depois vinculá-lo à parte mais próxima do polígono a que ele se refere, se estiver fora do contorno, calculando (por exemplo) a distância mínima desse ponto ao polígono mais próximo. O objetivo é extrair as coordenadas do ponto para usá-las como o código de identificação específico exclusivo do polígono.
umbe1987
Basicamente, o que estou tentando fazer é atribuir cada centróide ao polígono relativo e movê-lo para dentro do polígono (ou pelo menos para tocar sua borda).
umbe1987
@ user9518: desculpe, eu entendi mal sua pergunta. Eu pensei que você queria um número específico de pontos aleatórios dentro de cada poli, por exemplo, 2 pontos fpr poli 1, 10 pontos dentro de poli2 etc., portanto, o termo "campo apropriado". é claro que você pode selecionar 1 para "usar esse número de pontos" para gerar apenas um ponto para cada poli. esse ponto está dentro do poli ou pelo menos toca sua borda. mas este ponto ainda é encontrado por acaso, então quando você refazer o procedimento que você começa outros pontos :-(
Kurt
1

O plug-in realcentroids, disponível para instalação por meio de Plug-ins> Gerenciar e Instalar Plug-ins, trabalhou para mim no QGIS 2.2 para gerar pontos do tipo centróide, forçados dentro de cada polígono se côncavos (o ponto ficará muito próximo da borda). Tentei a ferramenta de pontos aleatórios, como sugerido por Kurt, e, embora tenha especificado 1 ponto por polígono, gera dois. Uma desvantagem adicional é que, na maioria dos casos, os pontos não representam o centróide, pois são aleatórios.

http://www.agt.bme.hu/gis/qgis/realcentroid/

Alexandra Mates
fonte