Shapely: ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· списка Ρ‚ΠΎΡ‡Π΅ΠΊ Π² ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 24 Π°Π²Π³. 2012  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: Toblerity/Shapely

ВсСм ΠΏΡ€ΠΈΠ²Π΅Ρ‚,

Π― Π½Π΅ нашСл списка рассылки Ρ„ΠΎΡ€ΡƒΠΌΠ°, поэтому я ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ ΡΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ здСсь. Π•ΡΡ‚ΡŒ Π»ΠΈ «каноничСская» Ρ„ΠΎΡ€ΠΌΠ° для прСобразования списка Ρ‚ΠΎΡ‡Π΅ΠΊ Π² ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ? НапримСр,

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)

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. МнС ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ convx_hull:

poly = MultiPoint(list_points).convex_hull

Π§Ρ‚ΠΎ Π½Π΅ совсСм Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ я ΠΈΡ‰Ρƒ.

Бпасибо Π·Π° Ρ‚Π΅Ρ€ΠΏΠ΅Π½ΠΈΠ΅ ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ!

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π‘Π½ΠΎΠ²Π° Ρ‚Π°ΠΊ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ быстрСС:

points = [Point(0,0), Point(2,2), Point(2,0)]
coords = [p.coords[:][0] for p in points]
poly = Polygon(coords)
poly.area

ВсС 3 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ: ΠΊΠΎΠ»ΡŒΡ†Π° ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ² (экзСмпляры LinearRing) Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ, ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡΠΌΠΈ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚. Π’ΠΎΡ‡ΠΊΠΈ ΠΈ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ - это Ρ€Π°Π·Π½Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ для Shapely. Π’Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ‚ΠΎΡ‡Π΅ΠΊ конструктору Polygon. Нравится:

>>> 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

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ я врСмя ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΡ‰Ρƒ это Π² Google, я ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ это Π΄Π΅Π»Π°Ρ‚ΡŒ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ (ΠΌΠ½Π΅ это каТСтся Π±ΠΎΠ»Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ):

>>> 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 Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π²Π΅Ρ‰ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½Ρ‹, Π½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ @sgillies каТСтся ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π° 2/3 быстрСС (~ 65 мкс Ρƒ мСня ΠΏΡ€ΠΎΡ‚ΠΈΠ² ~ 45 мкс Ρƒ Π½Π΅Π³ΠΎ), поэтому, Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ½Π° супСр-ΡƒΠ»ΡŒΡ‚Ρ€Π°-хардкорная ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ для ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄ΠΎΠ² Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ½ΠΎΠ², ΠΏΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ ΠΎΠ± этом.

Π‘Π½ΠΎΠ²Π° Ρ‚Π°ΠΊ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ быстрСС:

points = [Point(0,0), Point(2,2), Point(2,0)]
coords = [p.coords[:][0] for p in points]
poly = Polygon(coords)
poly.area
Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ