将GeoJSON FeatureCollection转换为GeoJSON几何对象

时间:2015-03-20 16:23:45

标签: python json geojson

我目前有一个GeoJSON FeatureCollection,但我需要在Python中对此文件执行的函数仅支持GeoJSON几何对象,例如PointPolygon(没有所有属性)并协调数据)。有没有办法简单地将GeoJSON FeatureCollection转换为Python中的GeoJSON几何对象?

2 个答案:

答案 0 :(得分:0)

最简单的方法是遍历您的要素集并从那里提取几何图形。我认为你现在已经找到了问题的答案,因为之后还没有其他帖子?

答案 1 :(得分:0)

要拆分 GeoJSON 特征集合的特征,需要遍历 features 元素并导出每个特征。

for f in data['features']:
    if f.get("type") == "Feature":
        with open(somefile, "w") as out:
            json.dump(f, out)

以下 Python 代码将遍历 GeoJSON 要素集合,并将每个要素拆分为单独的 GeoJSON 文件。

如果源 GeoJSON 文件有 10 个特征,则它们将保存在文件中:1.geojson、2.geojson、...、10.geojson。

import json
import sys

class Splitter:
    def __init__(self):
        self.count = 0

    def check(self, input_file):
        print("Input:", input_file)
        with open(input_file, encoding="utf-8") as file:
            data = json.load(file)
        data_type = data.get("type")
        if data_type == "FeatureCollection":
            for f in data['features']:
                obj_type = f.get("type")
                if obj_type == "Feature":
                    self.export_feature(data, f)
                else:
                    print("WARN: non-feature:", obj_type)
        elif data_type == "Feature":
            print("GeoJSON is already a feature object")
        else:
            print("WARN: unknown/other type:", data_type)

    def export_feature(self, parent, feature):
        self.count += 1
        name = f"{self.count}.geojson"
        print("Output:", name)
        if "crs" in parent and "crs" not in feature:
            # copy coordinate reference system (CRS) definition from parent
            # if not present in feature
            feature["crs"] = parent["crs"]
        with open(name, "w") as out:
            json.dump(feature, out)

##############################################################################
# main #
##############################################################################

if len(sys.argv) < 2:
    print("usage: geojson-split.py <file>")
    sys.exit(0)

splitter = Splitter()
for f in sys.argv[1:]:
    splitter.check(f)

如果需要将 GeometryCollection 拆分为其组件几何,请参阅相关的 answer