Shapely: Converter de uma lista de pontos em um polígono

Criado em 24 ago. 2012  ·  3Comentários  ·  Fonte: Toblerity/Shapely

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!

Comentários muito úteis

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

Todos 3 comentários

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
Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

LostFan123 picture LostFan123  ·  3Comentários

sgillies picture sgillies  ·  6Comentários

FuriousRococo picture FuriousRococo  ·  5Comentários

mromanie picture mromanie  ·  3Comentários

doctor-ian picture doctor-ian  ·  4Comentários