Olá a todos,
Não encontrei a lista de discussão de um fórum, então vou perguntar aqui. Existe uma forma "canônica" para converter de uma lista de pontos em um polígono? Por exemplo,
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 não funciona. Tive que usar convex_hull:
poly = MultiPoint(list_points).convex_hull
O que não é exatamente o que estou procurando.
Obrigado pela paciência e pelo bom trabalho!
Aqui está o seguinte: anéis poligonais (instâncias de LinearRing) não são definidos por pontos, eles são definidos por sequências de tuplas de coordenadas. Pontos e coordenadas são coisas diferentes para o Shapely. Você precisa passar as coordenadas dos pontos para o construtor Polygon. Assim:
>>> 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 eu continuo pesquisando no Google de vez em quando, aqui está como eu prefiro fazer (acho mais legível assim):
>>> 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 diz que as coisas podem estar sendo armazenadas em cache, mas a abordagem de @sgillies parece consistentemente 2/3 mais rápida (~ 65µs meu vs ~ 45µs dele) então se você precisa de um desempenho super ultra hardcore para zilhões de pontos ou polys, considere isso.
Mais uma vez, ligeiramente mais rápido:
points = [Point(0,0), Point(2,2), Point(2,0)]
coords = [p.coords[:][0] for p in points]
poly = Polygon(coords)
poly.area
Comentários muito úteis
Mais uma vez, ligeiramente mais rápido: