Я создал код в R, который извлекает bbox из списка точек, а затем создает многоугольник, используя st_as_sfc. Теперь я пытаюсь сделать то же самое в python, где я смог получить координаты bbox из списка данных точек, а затем попытался создать многоугольник, используя две точки с помощью shapely.geometry, что выдает ошибку. Есть ли альтернатива st_as_sfc в питоне или как создать многоугольник из полученных bbox координат?
Код R:-
print(st_as_sfc(st_bbox(sgrid)))
result:-
Geometry set for 1 feature
Geometry type: POLYGON
Dimension: XY
Bounding box: xmin: -9574057 ymin: 3590448 xmax: -9494057 ymax: 3670448
Projected CRS: WGS 84 / Pseudo-Mercator
POLYGON ((-9574057 3590448, -9494057 3590448, -...
Питон: - фрейм данных из bbox с координатами xmin,ymin и xmax,ymax
from shapely import geometry
print(df)
x y geometry
0 3.418932e+06 -2.088506e+07 POINT (-20885056.99629 3418931.63321)
1 3.478932e+06 -2.082506e+07 POINT (-20825056.99629 3478931.63321)
poly = geometry.Polygon([[p.x, p.y] for p in gdf_p['geometry'].tolist()])
print(poly.wkt)
ошибка:-
ValueError: A linearring requires at least 4 coordinates.






Нет необходимости сначала создавать геометрию точек из ваших координат. Просто предоставьте все 4 угла следующим образом:
poly = geometry.Polygon(((xmin,ymin), (xmin,ymax), (xmax,ymax), (xmax,ymin)))
Если у вас уже есть фрейм данных, вы можете добиться этого с помощью unary_union и envelope:
import pandas as pd
import geopandas as gpd
from io import StringIO
points = '''geometry
POINT (-20885056.99629 3418931.63321)
POINT (-20825056.99629 3478931.63321)'''
df = pd.read_table(StringIO(points))
gdf = gpd.GeoDataFrame(geometry=gpd.GeoSeries.from_wkt(df['geometry']))
print(gdf)
# geometry
# 0 POINT (-20885056.996 3418931.633)
# 1 POINT (-20825056.996 3478931.633)
print(gdf.geometry.unary_union.envelope.wkt)
# POLYGON ((-20885056.99629 3418931.63321, -20825056.99629 3418931.63321, -20825056.99629 3478931.63321, -20885056.99629 3478931.63321, -20885056.99629 3418931.63321))
С кортежами (minx, miny, maxx, maxy) вы можете использовать shapely.geometry.box():
from shapely import geometry
bbox_tuple = gdf.total_bounds
print(bbox_tuple)
# [-20885056.99629 3418931.63321 -20825056.99629 3478931.63321]
bbox_polygon = geometry.box(*bbox_tuple)
print(bbox_polygon.wkt)
# POLYGON ((-20825056.99629 3418931.63321, -20825056.99629 3478931.63321, -20885056.99629 3478931.63321, -20885056.99629 3418931.63321, -20825056.99629 3418931.63321))