Hola a todos,
No encontré una lista de correo de un foro, así que voy a preguntar aquí. ¿Existe una forma "canónica" para convertir de una lista de puntos a un polígono? Por ejemplo,
list_points = []
vertices = [Point(1,1), Point(2,2), Point(3,3)]
for i in xrange(len(vertices)):
list_points.append(vertices[i])
polygon = Polygon(list_points)
Este código no funciona. Tuve que usar convex_hull:
poly = MultiPoint(list_points).convex_hull
Lo que no es exactamente lo que estoy buscando.
¡Gracias por la paciencia y el buen trabajo!
Aquí hay una cosa: los anillos de polígono (instancias de LinearRing) no están definidos por Puntos, están definidos por secuencias de tuplas de coordenadas. Los puntos y las coordenadas son cosas diferentes a Shapely. Debe pasar las coordenadas de los puntos al constructor de polígono. Como esto:
>>> points = [Point(0,0), Point(2,2), Point(2,0)]
>>> coords = sum(map(list, (p.coords for p in points)), [])
>>> poly = Polygon(coords)
>>> poly.area
2.0
Como sigo buscando en Google de vez en cuando, así es como prefiero hacerlo (lo encuentro más legible así):
>>> points = [Point(0,0), Point(2,2), Point(2,0)]
>>> coords = [(p.x, p.y) for p in points]
>>> poly = Polygon(coords)
>>> poly.area
2.0
timeit dice que las cosas pueden estar almacenadas en caché, pero el enfoque de @sgillies parece consistentemente 2/3 más rápido (~ 65 µs mío frente a ~ 45 µs de él), así que si necesitas un rendimiento super ultra hardcore para miles de millones de puntos o polys, considéralo.
Un poco más rápido de nuevo:
points = [Point(0,0), Point(2,2), Point(2,0)]
coords = [p.coords[:][0] for p in points]
poly = Polygon(coords)
poly.area
Comentario más útil
Un poco más rápido de nuevo: