ΠΡΠ²Π΅ΡΡΡΠΈΡ Π½Π΅ ΡΡΠΈΡΡΠ²Π°ΡΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΠΏΠΎΠ»ΠΈΠ»ΠΈΠ±Π»Π΅Π²ΠΎΠΉ ΠΌΠ΅ΡΠΊΠΈ shapely.
from shapely.geometry import Polygon
from shapely.algorithms.polylabel import polylabel
poly1=Polygon(shell=[(0,0),(10,0),(10,10),(0,10),(0,0)][::-1], holes=[[(2,2),(6,2),(6,6),(2,6),(2,2)]])
import geopandas
gdf2 = geopandas.GeoDataFrame(geometry=[poly1])
gdf2.plot()
label_location = polylabel(poly1, tolerance=0.05)
print(label_location.x)
print(label_location.y)
Π Π΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ ΡΡΠΎΠ³ΠΎ ΡΡΠ΅Π½Π°ΡΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ:
6.25
3.75
ΠΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½Π°Ρ ΠΏΠΎΠ·ΠΈΡΠΈΡ - ΡΡΠΎ-ΡΠΎ Π±Π»ΠΈΠ·ΠΊΠΎΠ΅ ΠΊ 7,65625, 7,65625. Π ΡΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΠΏΠΎΡΠΌΠΎΡΡΠ΅Π² Π½Π° Π³ΡΠ°ΡΠΈΠΊ ΡΡΠΎΠ³ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ°.
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ Π΄Π΅Π»Π°Ρ ΡΡΠΎ-ΡΠΎ Π½Π΅ ΡΠ°ΠΊ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ°, Π½ΠΎ Ρ ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π·Π½ΡΡ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΡΡΠΎΠ³ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ° ΠΈ Π²ΡΠ΅Π³Π΄Π° ΠΏΠΎΠ»ΡΡΠ°Ρ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ.
Linux
ΠΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΎ Ρ shapely Π²Π΅ΡΡΠΈΠΈ 1.6 ΠΈ 1.7a3
ΠΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π²Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ, ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΠΌΡΠ΅ ΡΠ°ΠΌΠΈΠΌ https://github.com/mapbox/polylabel , ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ?
ΠΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ Π² TypeScript:
import polylabel from "polylabel";
let exterior = [[0,0],[10,0],[10,10],[0,10],[0,0]];
let hole = [[2,2],[6,2],[6,6],[2,6],[2,2]];
let polygon = [exterior, hole]
console.log(polylabel(polygon, 0.01));
PS> .\node_modules\.bin\tsc test.ts
PS> node .\test.js
[ 7.65625, 7.65625 ]
Π‘ΡΡΠΎΠΉΠ½ΡΠΉ:
>>> from shapely.ops import polylabel
>>> from shapely.geometry import Polygon
>>> exterior = [[0,0],[10,0],[10,10],[0,10],[0,0]]
>>> hole = [[2,2],[6,2],[6,6],[2,6],[2,2]]
>>> p = Polygon(exterior, [hole])
>>> polylabel(p, 0.01).coords[:]
[(6.25, 3.75)]
ΠΡ ΠΏΡΠ°Π²Ρ @benediktbrandt. Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Shapely Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΎΡΠ²Π΅ΡΡΡΠΈΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅ Π΄ΠΎ Π²Π½Π΅ΡΠ½Π΅ΠΉ ΡΠ°ΡΡΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ°. Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΡΠΎ ΠΎΡΠΈΠ±ΠΊΠ°, ΠΈ Π΅Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ, ΡΡΠΎΠ±Ρ ΠΎΠ½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°Π»Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°.
ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ½Π° Π² Π»ΠΈΠ½Π΅ΠΉΠ½ΡΡ Π»ΠΈΠ½ΠΈΡ Π·Π΄Π΅ΡΡ ΡΠΎΠΆΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ΅ΠΉΠΊΠΈ.
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
ΠΡ ΠΏΡΠ°Π²Ρ @benediktbrandt. Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Shapely Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΎΡΠ²Π΅ΡΡΡΠΈΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅ Π΄ΠΎ Π²Π½Π΅ΡΠ½Π΅ΠΉ ΡΠ°ΡΡΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ°. Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΡΠΎ ΠΎΡΠΈΠ±ΠΊΠ°, ΠΈ Π΅Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ, ΡΡΠΎΠ±Ρ ΠΎΠ½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°Π»Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°.
https://github.com/Toblerity/Shapely/blob/cfa66d418fe3afe2fcb48438fcc9156142abaeb8/shapely/algorithms/polylabel.py#L44 -L53
ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ½Π° Π² Π»ΠΈΠ½Π΅ΠΉΠ½ΡΡ Π»ΠΈΠ½ΠΈΡ Π·Π΄Π΅ΡΡ ΡΠΎΠΆΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ΅ΠΉΠΊΠΈ.