Dado un conjunto de coordenadas, ¿Cómo encontramos las coordenadas del límite?
<== Figura 1
Dadas las coordenadas en el conjunto anterior, ¿Cómo puedo obtener las coordenadas en el límite rojo? Límite es el polígono que está formado por las coordenadas de entrada para vértices, de tal manera que maximiza el área.
Estoy trabajando en una aplicación que busca propiedades dentro de 'x' millas de una ciudad . Lo que tengo es:
- Coordenadas de todas las propiedades.
- Un conjunto de coordenadas para cada ciudad (tengo una coordenada para cada código postal. Y como la mayoría de las ciudades tienen más de un código postal, cada ciudad tiene un conjunto de coordenadas)
La razón por la que solicito el área máxima es para que no se me ocurra un polígono como el siguiente:
<== Figura 2
Lo que necesito es el algoritmo para obtener el conjunto de coordenadas para el límite. Un algoritmo que me permitirá encontrar coordenadas de límites para la Figura 1 .
algorithm
polygon-creation
vertices
convex-hull
Khaja Minhajuddin
fuente
fuente
Respuestas:
Hay muchos algoritmos para resolver este problema ( Wikipedia "Convex_hull_algorithms" ):
fuente
1) Casco convexo en GRASS GIS: http://grass.fbk.eu/grass64/manuals/html64_user/v.hull.html
2) Casco convexo en Qgis Vector Tools (muy fácil de usar):
fuente
Hawth's Tools for ArcGIS tiene esto funcionalidad . Además de un script para ArcInfo 10.
También hay una herramienta de casco convexo en QuantumGIS a través del complemento ftools .
fuente
Lo que quieres es el casco convexo. En PostGIS hay una función (en realidad GEOS) que te da el casco convexo, ST_ConvexHull (geometría) .
En wikipedia hay mucha información sobre cascos cóncavos.
fuente
Si desea que un algoritmo haga esto (en lugar de los paquetes que pueden hacerlo), creo que necesitaría triangular los datos; o básicamente define una línea desde cada punto a cualquier otro punto. Luego, comenzando en (digamos) el punto con el valor Y más alto, trace una ruta alrededor del exterior siguiendo la línea conectada con el ángulo / rumbo exterior más pequeño.
Podría acelerar el trazado tirando primero las líneas de intersección. El límite externo no tendrá intersecciones.
Por cierto, ¡FME también lo hará con los transformadores ConvexHullAccumulator o ConvexHullReplacer!
fuente
Si está interesado en ver un algoritmo existente implementado en código, NetTopologySuite tiene un algoritmo para hacer esto
Ver ConvexHull.cs
Por cierto, NTS y un montón de otras bibliotecas están envueltas en un proyecto genial llamado DotSpatial, que se encuentra aquí
fuente