如何将多索引DataFrame转换为GeoJSON FeatureCollections

时间:2016-05-30 23:45:54

标签: python mongodb dataframe geojson multi-index

我有两个multi-index DataFrames如下。

  • 1st DataFrame

enter image description here

  • 第二DataFrame

enter image description here

我想使用上面的DataFrames以下列格式为每个对象构建GeoJSON FeatureCollections,然后将它们插入MongoDB

# GeoJSON
# Loop over all Object IDs

object[i] = {
    "type": "FeatureCollection",
    "features": [
        {
            # 1st DataFrame
            "type": "Feature",
            "properties": {},
            "geometry": {"type": "Polygon", "coordinates": [[[·,·],[·,·],[·,·],...]]}
        },
        {
            # 2nd DataFrame
            "type": "Feature",
            "properties": {},
            "geometry": {"type": "LineString", "coordinates": [[·,·],[·,·],[·,·],...]}
        }
    ]
}

# MongoDB
# Loop over all Object IDs

from pymongo import MongoClient
client = MongoClient()
db = client.object
result = db.object.insert_one(object[i])

由于特定对象的点数随机,且功能Polygon和{{1}的点数在相同的LingString 必然相等彼此之间,很难使用FeatureCollection循环来实现该目标。有人能想出这个问题吗?

1 个答案:

答案 0 :(得分:0)

如果"点数"表示"每个功能中的点数",然后这应该有效:

# transform to hierarchical series of [lat, lon]
s1 = df1.apply(lambda row: pd.concat([row['lat'], row['lon']]).tolist())
# now group that series by object id into a series of lists
coords1 = s1.groupby(level=0).apply(lambda s : s.tolist())

df2相同 - > S2。这会产生[[lat_0, lon_0], [lat_1, lon_1], ...],这是一个LineString。 制作df1 - >将s1放入geojson Polygon的坐标列表/数组中,您需要将每个成员的坐标列表包装在另一个列表中。有关多边形坐标的规则,请参阅RFC 7946 section 3.1.6。最后,您必须将所有内容包装在FeatureCollection中的Feature中的Polygon / Geometry中。如果这看起来好像很多,请考虑导入geojson库的json扩展名。

我已经构建了一个更通用的函数来将pandas聚合到此gist中的几何中。