如何基于Pandas DataFrame生成符合Sentinelhub格式要求的JSON文件?
没问题,我来帮你把这个流程补全,从分组坐标到生成符合Sentinel Hub要求的JSON一步到位!
完整实现步骤
首先我们需要把你的分组逻辑扩展,构建出FeatureCollection的完整结构,最后导出为JSON文件。下面是完整的代码和解释:
1. 导入依赖库并准备示例数据
import pandas as pd import json # 你的示例数据 data = { 'Id': ['01', '01', '01', '02', '02', '02'], 'Latitude': [-17.658200, -17.658151, -17.658063, -11.896096, -11.896096, -11.896088], 'Longitude': [36.123498, 36.123522, 36.123576, 30.388277, 30.388277, 30.388275] } df = pd.DataFrame(data)
2. 按Id分组获取坐标列表
这里提供两种方式,你可以选一种:
- 方式1:用Pandas GroupBy(更简洁高效)
一行代码就能完成分组,适合数据量大的场景:places = df.groupby('Id').apply(lambda x: x[['Latitude', 'Longitude']].values.tolist()).to_dict() - 方式2:保留你的循环逻辑
如果更习惯手动循环,原代码可以直接用:places = {} for row in df.itertuples(): if row.Id not in places: places[row.Id] = [[row.Latitude, row.Longitude]] else: places[row.Id].append([row.Latitude, row.Longitude])
3. 构建符合Sentinel Hub要求的FeatureCollection
接下来把分组后的坐标转换成FeatureCollection结构:
# 初始化FeatureCollection的基础框架 feature_collection = { "type": "FeatureCollection", "features": [] } # 遍历每个Id对应的坐标,生成Feature for id_, coords in places.items(): # 构建单个Feature feature = { "type": "Feature", "properties": {}, # 可以在这里添加自定义属性,比如{"Id": id_} "geometry": { "type": "Polygon", "coordinates": [coords] # 三层列表结构是Sentinel Hub要求的格式 } } # 将Feature添加到集合中 feature_collection["features"].append(feature)
4. 导出为JSON文件
最后把结构转换成格式化的JSON字符串,保存到文件或者直接输出:
# 生成格式化的JSON(indent=2让结构更易读) json_result = json.dumps(feature_collection, indent=2) # 保存到本地文件 with open('sentinelhub_polygons.json', 'w') as f: f.write(json_result) # 打印输出查看结果 print(json_result)
几个关键注意点
- 坐标顺序:你的示例输出用了
[纬度, 经度]的顺序,如果需要遵循Sentinel Hub默认的[经度, 纬度]标准,只需要把代码中['Latitude', 'Longitude']改成['Longitude', 'Latitude']即可。 - Polygon闭合性:标准的GeoJSON Polygon要求线性环是闭合的(第一个点和最后一个点相同),如果需要满足这个要求,可以在每个坐标列表末尾添加第一个点:
coords.append(coords[0])。 - 自定义属性:如果需要在Feature中携带Id或其他信息,修改
properties字段即可,比如"properties": {"Id": id_}。
运行上面的代码后,你就能得到完全符合要求的JSON文件啦!
内容的提问来源于stack exchange,提问作者Aly
相关产品推荐
相关产品推荐

