12 votos

Distancia entre el centroide y el punto más alejado del polígono

Tengo una capa de polígonos de pueblos que tiene más de 6.00.000 registros. He calculado el centroide de cada pueblo. Quiero encontrar la distancia entre el centroide y el nodo más lejano de cada polígono. Compruebe la siguiente imagen como referencia. Las líneas negras son los límites de los polígonos. enter image description here

enter image description here

enter image description here

0 votos

Interesante... Acabo de hacer esto el viernes con postgis para producir un círculo alrededor de un polígono. Necesito unos minutos para buscar el código que he utilizado.. i.stack.imgur.com/EKnkg.png

1 votos

En primer lugar, necesitamos saber qué programas tienes a tu disposición. ¿Cómo has creado los centroides y los nodos? (Aunque parezca un poco obvio que los nodos de los polígonos son los que se utilizan para establecer los límites de tus formas, pero ¿añadiste algún punto adicional sobre ellos?)

0 votos

¿Es importante la ubicación del centroide? ¿Cómo los ha creado?

15voto

Minh Le Puntos 711

Usando PostGIS, usé ST_ConvexHull para simplificar el polígono para un resultado más rápido:

Consigue el punto más lejano:

SELECT Villages_v4_Trial_region.geom as FarPoint from (
SELECT ST_PointN(ST_ExteriorRing(ST_ConvexHull(Villages_v4_Trial_region.geom)),
generate_series(1, ST_NPoints(ST_ExteriorRing(ST_ConvexHull(Villages_v4_Trial_region.geom))))) as points, 
geom
FROM Villages_v4_Trial_region
ORDER BY ST_MaxDistance(points,ST_Centroid(Villages_v4_Trial_region.geom)) DESC
LIMIT 1;

Y si estás interesado en crear un Círculo desde el centroide:

SELECT ST_Buffer(Center,ST_Distance(Center,FarPoint)) as Circle
FROM (
SELECT Villages_v4_Trial_region.geom as FarPoint, Center from (
    SELECT ST_PointN(ST_ExteriorRing(ST_ConvexHull(Villages_v4_Trial_region.geom)),
    generate_series(1, ST_NPoints(ST_ExteriorRing(ST_ConvexHull(Villages_v4_Trial_region.geom))))) as points,
    ST_Centroid(Villages_v4_Trial_region.geom) as Center, 
    geom
    FROM Villages_v4_Trial_region
    ) as Villages_v4_Trial_region
    ORDER BY ST_MaxDistance(points,Center) DESC
    LIMIT 1) as foo;

enter image description here

0 votos

Sencillo, rápido y eficaz. Gracias por publicar esto porque esto me ayudará también en lo que estoy trabajando en este momento.

0 votos

@kttii No sé cómo usar PostGIS. ¿Puedes proporcionar una solución más sencilla, en arc o mapinfo o qgis

0 votos

@kttii Así que he instalado Postgresql. He copiado y pegado esta misma consulta pero me ha dado un ERROR: la columna "the_geom" no existe. ¿Qué debo hacer?

4voto

Yada Puntos 9489

Utilizando el siguiente PyQGIS código:

from math import sqrt

layer = iface.activeLayer()

feats = [ feat for feat in layer.getFeatures() ]

n = len(feats)

centroids = [ feat.geometry().centroid().asPoint() for feat in feats ]
polygons = [ feat.geometry().asPolygon()[0] for feat in feats ]

lengths = []

for i, pol in enumerate(polygons):
    max_dist = 0
    idx_j = 0
    for j, point in enumerate(pol):
        dist = sqrt(centroids[i].sqrDist(point))
        if dist > max_dist:
            max_dist = dist
            idx_j = j
    print i, idx_j, max_dist
    lengths.append([centroids[i], pol[idx_j]])

crs = layer.crs()
epsg = crs.postgisSrid()

uri = "LineString?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           'max_distance',
                           'memory')

prov = mem_layer.dataProvider()

feats = [ QgsFeature() for i in range(n) ]

for i, feat in enumerate(feats):
    feat.setAttributes([i])
    feat.setGeometry(QgsGeometry.fromPolyline(lengths[i]))

prov.addFeatures(feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

y este shapefile (con 11 características):

enter image description here

Obtuve una capa de memoria donde las polilíneas eran la distancia entre el centroide y el punto más lejano de cada polígono (característica); como se puede observar en la siguiente imagen:

enter image description here

En la consola de Python de QGIS, también se imprimió el índice de la característica, el índice del punto en la característica donde la distancia del centroide es un máximo y, finalmente, la distancia máxima.

enter image description here

0 votos

No sé cómo utilizar PyQGIS. Puede proporcionar una solución más simple, en arco o mapinfo o qgis

1 votos

Pruebe este enlace para obtener ayuda para empezar con PyQgis spatialgalaxy.net/2014/10/09/

3voto

Nate Puntos 1986

Parece que estás trabajando con MapInfo. La "Calculadora de distancias" (encuéntrala en el gestor de herramientas) tiene muchas opciones y creo que también puede encargarse de esta tarea. Hay un artículo sobre ello aquí: http://web.pb.com/mapinfopro-jul-2013/Toolbox-Distance-Calculator

0voto

Bob Rivers Puntos 111

Como parece que estás usando MapInfo, aquí hay una función de MapBasic que escribí hace un tiempo para una herramienta interna en la que estaba trabajando. Toma un nodo fuente (tu punto centroide) y un objeto región (el polígono) como argumentos y devuelve un objeto punto en el nodo más lejano del polígono desde el punto fuente.

Function GetFurthest(ByVal oNode1 as Object, ByVal oObj as Object) as Object

Dim sourceE,sourceN,East,North,Longest,Dist as Float,
    nNodes,nPolys,i,j as SmallInt,
    oNode2 as Object

    sourceE = CentroidX(oNode1)
    sourceN = CentroidY(oNode1)
    Longest = 0

    nPolys = ObjectInfo(oObj,OBJ_INFO_NPOLYGONS)
    For i = 1 to nPolys
        nNodes = ObjectInfo(oObj,OBJ_INFO_NPOLYGONS+nPolys)
        For j = 1 to nNodes
            East = ObjectNodeX(oObj,i,j)
            North = ObjectNodeY(oObj,i,j)
            Dist = Distance(sourceE,sourceN,East,North,"m")
            If Dist > Longest then
                Longest = Dist
                oNode2 = CreatePoint(East,North)
            End if
        Next
    Next

    GetFurthest = oNode2

End Function

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X