asignar y mover los centroides a sus polígonos

9

Estoy usando QGIS 1.8 Lisboa. Después de calcular los centroides a partir de un archivo de forma de polígono, si algunos de ellos se encuentran fuera de los contornos del polígono, me gustaría moverlos sobre el polígono del que provienen. El criterio debe ser unívoco, ya que debo usarlos para extraer las coordenadas que se utilizarán como el código de identificación del polígono. Por lo tanto, el procedimiento debería generar la misma ubicación de punto cada vez que se ejecuta para el mismo polígono (no una posición aleatoria como la dada por la función "puntos aleatorios", que da un nuevo resultado cada vez que se ejecuta).

umbe1987
fuente
1
Suena como dos preguntas. Si entiendo correctamente, desea (a) agregar puntos aleatorios dentro de un polígono y (b) darles a ellos o al polígono una identificación única basada en esto. Lo más simple que viene a la mente para (a) es usar las capacidades de puntos aleatorios existentes en QGIS y luego simplemente intersecar esa nube de puntos con su polígono.
lynxlynxlynx
El uso de la función "puntos aleatorios" en diferentes momentos con los mismos polígonos conduce a resultados diferentes (es decir, la posición de los puntos derivados de cada polígono es diferente en cada nuevo uso de la función), y quiero crear un método que me dé siempre el mismo punto por polígono desde donde podría extraer las coordenadas que quiero usar como código de identificación para los polígonos mismos.
umbe1987
use la herramienta fTools 'verdadero centroide' en herramientas de geometría - docs.qgis.org/html/en/docs/user_manual/plugins/…
Mapperz
solo me da el centroide, pero esto también podría estar fuera del polígono, lo que debo evitar. Necesito moverlos en el polígono del que derivan, usando una función como distancia mínima (pero no estoy interesado en la distancia, quiero que se mueva). En otro blog, alguien me dijo que usara ST_PointOnSurface de PostGIS (pero estoy usando QGIS).
umbe1987
2
¿es esto un duplicado de gis.stackexchange.com/questions/50029/… ahora?
oscuro

Respuestas:

7

Puede usar la biblioteca de Python Shapely, que proporciona una función representative_point()que se garantiza que se encuentra dentro del polígono.

Aquí hay un script de Python que se puede ejecutar en la consola QGIS Python. Se debe seleccionar la capa de polígono para la que desea crear el atributo. La función toma el nombre del atributo que desea actualizar. El atributo ya debe existir en su capa, debe ser de tipo cadena y debe ser lo suficientemente largo (30 caracteres).

Aquí hay un ejemplo de los puntos que encontró el algoritmo:

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
fuente
Estoy tratando de probarlo, parece exactamente lo que estaba buscando. ¡Te lo haré saber tan pronto como lo ejecute!
umbe1987
una cosa que no entendí es a qué te refieres con "tiene que ser tipo cadena y debe ser lo suficientemente largo (30 caracteres)". ¿Esta biblioteca está trabajando directamente en archivos de polígono? Si es así, ¿se supone que debo crear un nuevo campo de tipo de cadena en la pestaña Att con 30 caracteres como mínimo, y este sería el que se actualizará?
umbe1987
@ user9518: Sí, la forma en que se escribe la función en el momento en que tiene que crear el atributo en la tabla usted mismo y luego solo pasar el nombre del campo a la función. El script también podría adaptarse fácilmente para crear el campo requerido, si eso es lo que se necesita.
Jake
Solo extraño una cosa. Parece que ahora estoy definiendo una función (o una clase) escribiendo "def", pero cuando termino de escribir el script no sucede nada. ¿Cómo puedo finalmente tener el resultado en mi tabla?
umbe1987
1
¡Funcionó perfectamente! Me imagino que las coordenadas están escritas de acuerdo con el sistema de coordenadas de la capa y que si quiero tener los puntos necesito crear un shp con esas coordenadas, ¿verdad? Si estuvieras aquí, ¡te ofrecería 3 cervezas al menos! ¡¡¡Muchas gracias por tus esfuerzos!!!
umbe1987
5

La herramienta centroide ftools puede colocar el centroide fuera del polígono si es cóncavo.

ST_PointOnSurfacedefinitivamente hará lo que quieras. Puede usar el comando desde QGIS si lo ha instalado usando SPIT para obtener su shapefile en PostGIS y luego usar el complemento PgQuery para ejecutar la consulta.

Alternativamente, si instalar PostGIS es un poco excesivo para un uso único, puede usar Spatialite desde QGIS. Luego puede usar el complemento QSpatiaLite para importar sus datos a SpatiaLite y ejecutar la consulta (honores SpatialLite ST_PointOnSurface).

MappaGnosis
fuente
2

cuando te entiendo bien, usa: Vector-> Herramientas de investigación_> Puntos aleatorios. Ahora seleccione bajo "Diseño de muestreo estratificado (polígonos individuales)" use el valor del campo de entrada y use el campo apropiado, que proporciona el valor numérico de los puntos, que deben generarse para cada polígono diferente

Kurt
fuente
¿Qué quieres decir con "campo apropiado"? Estaba pensando en usar el centroide y luego vincularlo a la parte más cercana del polígono al que se refiere, si se encuentra fuera del contorno, al (por ejemplo) calcular la distancia mínima de ese punto a su polígono más cercano. El propósito es extraer esas coordenadas de puntos para usarlas como el código de identificación específico único del polígono.
umbe1987
Básicamente, lo que intento hacer es asignar cada centroide a su polígono relativo y moverlo para que se encuentre dentro de su polígono (o al menos para tocar su borde).
umbe1987
@ user9518: lo siento, no entendí bien tu pregunta. Pensé que deseaba un número específico de puntos aleatorios dentro de cada poli, por ejemplo, 2 puntos fpr poli 1, 10 puntos dentro de poly2, etc., por lo tanto, el término "campo apropiado". por supuesto, puede seleccionar 1 para "usar este número de puntos" para generar solo un punto por cada poli. este punto está dentro del polietileno o al menos toca su límite. pero este punto todavía se encuentra por azar, así que cuando rehaces el procedimiento obtienes otros puntos :-(
Kurt
1

El complemento realcentroids, disponible para instalar a través de Complementos> Administrar e instalar complementos, funcionó para mí en QGIS 2.2 para generar puntos tipo centroide, forzados dentro de cada polígono si es cóncavo (el punto se ubicará muy cerca del borde). Probé la herramienta de Puntos aleatorios según lo sugerido por Kurt, y aunque especifiqué 1 punto por polígono, genera dos en su lugar. Una desventaja adicional es que, en la mayoría de los casos, los puntos no representan el centroide ya que son aleatorios.

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

Alexandra Mates
fuente