Как создать многоугольник из данных bbox в python?

Я создал код в 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.
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Нет необходимости сначала создавать геометрию точек из ваших координат. Просто предоставьте все 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))

Другие вопросы по теме