gpt4 book ai didi

python - 使用圆角坐标在 Python 中序列化 GeoJSON

转载 作者:行者123 更新时间:2023-12-05 07:03:31 24 4
gpt4 key购买 nike

我想在 Python 中以有限的坐标精度序列化 GeoJSON FeatureCollections。

例如,这是一个 FeatureCollection(在 Python 中表示为 dictlist):

{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"name": "Liberty Island",
"area_sqm": 24950.40123456,
"established": 1875,
"height_ft": 305
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[ -74.04715418815613, 40.690994683044906 ],
[ -74.04499769210815, 40.68873311507798 ],
[ -74.04354929924011, 40.689676800252016 ],
[ -74.04715418815613, 40.690994683044906 ]
]
]
}
}
]
}

我可以使用 json.dumps 序列化它:

print(json.dumps(fc))

这会打印出 JSON:

{"type": "FeatureCollection", "features": [{"type": "Feature", "properties": {"name": "Liberty Island", "area_sqm": 24950.40123456, "established": 1875, "height_ft": 305}, "geometry": {"type": "Polygon", "coordinates": [[[-74.04715418815613, 40.690994683044906], [-74.04499769210815, 40.68873311507798], [-74.04354929924011, 40.689676800252016], [-74.04715418815613, 40.690994683044906]]]}}]}

那些坐标太精确了。根据维基百科,7 digits is ~cm precision 应该足够好。我得到的是~纳米精度。

我想序列化仅具有七位坐标精度的 GeoJSON FeatureCollection。请注意,我想对 properties 中的所有内容使用 Python 的默认序列化:因为那里的值可以是任何东西,所以我无法就多少精度就足够做出任何普遍的声明。

我想要的输出是这样的:

{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"name": "Liberty Island",
"area_sqm": 24950.40123456,
"established": 1875,
"height_ft": 305
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[ -74.0471541, 40.6909946 ],
[ -74.0449976, 40.6887331 ],
[ -74.0435492, 40.6896768 ],
[ -74.0471541, 40.6909946 ]
]
]
}
}
]
}

最佳答案

我不确定您想要的是什么序列化,但是当涉及到FeatureCollection 简化时,这应该让您开始:

import json
from copy import copy


def simplify_geometries(feat_collection):
new_coll = copy(feat_collection)
old_features = new_coll['features']
new_features = []

for feature in old_features:
geometry = feature['geometry']
coords = shorten_arr(geometry['coordinates'])
geometry['coordinates'] = coords

new_features.append(feature)

new_coll['features'] = new_features
return json.dumps(new_coll)


print(simplify_geometries(
json.loads('{"type": "FeatureCollection",...')
))

其中 shorten_arr 是一个简单的递归:

def shorten_arr(arr, dec_places=7):
if not isinstance(arr, list):
return round(arr, dec_places)

to_ret = []
for n in arr:
if isinstance(n, list):
n = shorten_arr(n, dec_places)
to_ret.append(shorten_arr(n, dec_places))
return to_ret

关于python - 使用圆角坐标在 Python 中序列化 GeoJSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63179028/

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