7 votos

¿Cálculo de la longitud y anchura de un polígono mediante un SIG de código abierto?

¿Cómo puedo calcular la longitud y con de polígonos utilizando herramientas de código abierto? Por "longitud del polígono" me refiero a la longitud de la línea más larga dentro del polígono (actualización: para ser correcto, sólo necesito la línea más larga dentro del casco convexo del polígono) y la anchura como la medida más larga perpendicular a la medida de longitud.

Intento crear un rectángulo mínimo no alineado con el eje para un polígono. La longitud de este rectángulo mínimo sería el diámetro del polígono.

0 votos

La anchura es "la medida más larga perpendicular a la medida de longitud" (como se ha indicado anteriormente).

1 votos

Creo que lo que está intentando hacer es crear un rectángulo de contorno mínimo no alineado con el eje para un polígono que primero está restringido por el segmento más largo dentro del polígono y después expandido por los vértices restantes del polígono.

0 votos

@Dandy: Sí, eso es lo que estoy buscando.

3voto

Lars Mæhlum Puntos 4569

FWIW, en Postgis hay una función desde 1.5, ST_Longestline que devuelve la longestline entre dos geometrías. Si usted alimenta esa función con la misma geometría dos veces en lugar de dos diferentes, obtendrá la línea más larga en esa geometría. http://postgis.net/docs/ST_LongestLine.html

@Whuber. usted escribe arriba que la línea más larga no tiene que comenzar y terminar en los vértices de los polígonos. Utilizas la letra I como ejemplo. No lo entiendo. Si I está representado por una línea con dos vértices, entonces esa línea tiene que ser la línea más larga en sí, ¿verdad?

Si la letra I está representada por un polígono delgado, la línea más larga será una línea diagonal desde, por ejemplo, el vértice superior izquierdo hasta el vértice inferior derecho.

Pero no puedo entender cómo puede haber una línea más larga que no termine y empiece en vértices del polígono.

¿He entendido algo mal?

/Nicklas

Ok, Whuber, te entendí mal, leí tu respuesta una vez más. Yo estaba hablando de lo que usted llama el diámetro y que estaba hablando de otra cosa. Lo siento

/Nicklas

2voto

Adam Ernst Puntos 6939

El STC proporciona un círculo mínimo ( http://tsusiatsoftware.net/jts/javadoc/com/vividsolutions/jts/algorithm/MinimumBoundingCircle.html ) y un Diámetro Mínimo ( http://tsusiatsoftware.net/jts/javadoc/index.html ) - una vez que los tengas, el rectángulo debería ser fácil de calcular.

1 votos

Buena solución Java. ¿Alguien sabe de algo similar en Python?

0 votos

Un círculo también puede ser una gran región delimitadora.

0 votos

GEOS puede tener funciones similares a las que podrías acceder usando Python. No estoy seguro de hasta qué punto el STC y GEOS han divergido.

1voto

BWW Puntos 302

Utilice Postgis y use ST_envelope(geometry) para obtener las coordenadas mínimas de la caja delimitadora (definida con cuatro puntos). A partir de este resultado, sólo tienes que calcular ahora longitud y anchura

Una solución que utiliza consultas Postgis puras. Hace el trabajo, pero yo no hago la prueba de velocidad, yo uso algunos wkb para la depuración rápida, por lo que este script se puede mejorar.

SELECT line1,
       line2,
       CASE WHEN line1>line2 THEN line1
            WHEN line1<=line2 THEN line2           
       END AS length,
       CASE WHEN line2>line1 THEN line1
            WHEN line2<=line1 THEN line2           
       END AS width FROM (
SELECT ST_length(ST_AsText(ST_MakeLine(ST_AsText(ST_PointN(ST_Boundary(ST_envelope(the_geom)),1)),
ST_AsText(ST_PointN(ST_Boundary(ST_envelope(the_geom)),2))))) AS line1,ST_length(ST_AsText(ST_MakeLine(ST_AsText(ST_PointN(ST_Boundary(ST_envelope(the_geom)),2)),ST_AsText(ST_PointN(ST_Boundary(ST_envelope(the_geom)),3))))) AS line2
from tm_world_borders) AS size;

0 votos

¿Es ST_envelope() independiente del eje?

1 votos

Después de algunas pruebas; parece que no :( Lo siento...

0voto

Farray Puntos 253

Si no puedes encontrar una herramienta específica para hacerlo podrías usar pgSQL y PostGIS o conseguir un desarrollador que implemente ese algoritmo por ti.

Hay muchas maneras de hacerlo, pero aquí hay una dividida en 2 etapas:

1) Para cada vértice encontrar la mayor distancia a cada otro vértice dentro del polígono que se puede hacer con un simple pequeño bucle anidado en un SISD como .NET:

for(var i=0; i<count; i++)
 for(var j=i; j<count; j++)
  find the 2 vertices with the greatest distance
construct a segment from those two points
var length = Distance(segment.Begin,segment.End);

2) para la anchura hay algunas maneras, la más fácil de implementar creo que sería esta:

// make the longest segment horizontal
transform the polygon with a rotation of the negative angle of the longest segment
for each vertex in the polygon find the highest and lowest y-coord values
// the "width" would be the max y-coord minus the min y-coord
var width = maxy-miny

4 votos

Buen intento, pero (1) no parece resolver el problema: es sólo una manera ineficiente de encontrar el polígono de diámetro. No hay garantía de que el diámetro se encuentre realmente dentro del polígono. De hecho, la "línea [segmento] más larga dentro del polígono" no tiene por qué tener ninguno de sus puntos extremos coincidentes con ninguno de los vértices del polígono. (Por ejemplo, considere el interior de una "I" mayúscula: las soluciones son segmentos casi verticales que suben por el centro de la letra y terminan cerca de los puntos medios de los bordes superior e inferior de la letra).

0 votos

Yo lo leo como que se busca el segmento más largo sobre el polígono y no el segmento más grande dentro del interior del polígono. Viéndolo así puedes conceptualizarlo como el mayor segmento dentro del casco convexo de esos vértices. Si esa es la intención del que pregunta creo que tengo la idea correcta.

0 votos

Dadas las aclaraciones posteriores a la pregunta, estoy totalmente de acuerdo en que has leído correctamente la mente del OP.

0voto

ZOOM ZOOM Puntos 16

Esto resuelve el problema en PostGIS - probado y funciona. Gracias a Mapbox por esta gran y elegante solución. ¡Tenga en cuenta su licencia de uso!

https://raw.githubusercontent.com/mapbox/postgis-vt-util/master/postgis-vt-util.sql

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