gpt4 book ai didi

python - 如何有效地将数据从 geopandas 保存到 django(从 shapely 转换为 geodjango)?

转载 作者:太空宇宙 更新时间:2023-11-04 04:10:48 28 4
gpt4 key购买 nike

我正在使用 geopandas 操作 GIS 数据并将其存储在各种 Django 模型中。 geopandas 在底层使用了 shapelyDjango 则没有。

这是一些代码:

import geopandas as gpd
from django.contrib.gis.db import models

class MyModel(models.Model):
geometry = models.PolygonField()
name = models.CharField(max_length=255, null=False, unique=True)
some_property = models.IntegerField()

gdf = gpd.read_file("some_data.geojson")
# ...do some stuff w/ gdf...

for data in gdf.to_dict("records"):
name = data.pop("name")
MyModel.objects.create_or_update(
name=name,
defaults=data,
)

上面的代码会失败并出现如下错误:

TypeError: Cannot set MyModel SpatialProxy (POLYGON) with value of type: <class 'shapely.geometry.polygon.Polygon'>

除非我添加一些恶心的代码,例如:

from django.contrib.gis.geos import fromstr, Polygon 
data["geometry"] = Polygon(fromstr(str(data["geometry"])))

有什么方法可以避免这种情况并直接从 shapely 映射到 Django 吗?


编辑:

以下是一些值:

>> data["geometry"]
<shapely.geometry.polygon.Polygon object at 0x7fb374f41908>
>> str(data["geometry"])
'POLYGON ((-4.337076919429241 53.41842814531255, -4.336698521348041 53.4182242737367, ....))'
>> fromstr(str(data["geometry"]))
<Polygon object at 0x7fb3733d158e>

最佳答案

您的解决方案并没有您想象的那么棘手。

由于您的 data['geometry'] 字段返回一个 WKT 字符串表示形式 ('POLYGON ((-4.337076919429241 53.41842814531255, ... ))) 你可以避免fromstr这一步,直接传递to a GEOSGeometry :

from django.contrib.gis.geos import GEOSGeometry

polygon = GEOSGeometry('POLYGON ((-4.337076919429241 53.41842814531255, ... ))')

您还可以添加一些错误处理,不再担心您的解决方案会崩溃 :) :

for data in gdf.to_dict("records"):
name = data.pop("name")
geometry_str = data.pop('geometry')
try:
geometry = GEOSGeometry(geometry_str)
except (TypeError, ValueError) as exc:
# If the geometry_str is not a valid WKT, EWKT or HEXEWKB string
# or is None then either continue, break or do something else.
# I will go with continue here.
continue

if geometry.geom_type != 'Polygon':
# If the created geometry is not a Polygon don't pass it on MyModel
continue

MyModel.objects.update_or_create(
name=name, geometry=geometry,
defaults=data,
)

关于python - 如何有效地将数据从 geopandas 保存到 django(从 shapely 转换为 geodjango)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56299888/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com