从URL导入JSON数据,拆分嵌套属性生成点、线GeoDataFrame的技术问询
拆分嵌套GeoJSON数据为点、线GeoDataFrame
实现步骤
- 导入依赖库:除数据加载工具外,需用
geopandas处理地理数据,shapely构建几何对象。 - 加载JSON数据:使用你提供的代码获取并解析GeoJSON数据。
- 拆分嵌套数据:遍历每个线要素,分别提取线本身信息和嵌套的站点(点)信息。
- 转换为GeoDataFrame:将提取的列表数据转换为带地理信息的GeoDataFrame。
完整代码
import urllib.request import json import geopandas as gpd from shapely.geometry import Point, LineString # 加载GeoJSON数据 with urllib.request.urlopen('https://transit.land/api/v2/rest/routes.geojson?operator_onestop_id=o-9q8y-sfmta&api_key=LsyqCJs5aYI6uyxvUz1d0VQQLYoDYdh4&l&') as url: data = json.loads(url.read()) # 初始化存储线和点数据的列表 lines_data = [] stops_data = [] # 遍历每个要素,拆分线和嵌套的点 for feature in data['features']: # 处理线要素 route_properties = feature['properties'] line_geometry = LineString(feature['geometry']['coordinates']) lines_data.append({ 'id': route_properties.get('id'), 'route_id': route_properties.get('route_id'), 'route_name': route_properties.get('route_long_name'), 'geometry': line_geometry }) # 处理嵌套的站点(点要素) if 'stops' in route_properties: for stop in route_properties['stops']: stop_geometry = Point(stop['geometry']['coordinates']) stops_data.append({ 'id': stop.get('id'), 'stop_id': stop.get('onestop_id'), 'stop_name': stop.get('name'), 'route_id': route_properties.get('route_id'), 'geometry': stop_geometry }) # 转换为GeoDataFrame,指定坐标系为WGS84(EPSG:4326) line_gdf = gpd.GeoDataFrame(lines_data, crs="EPSG:4326") stop_gdf = gpd.GeoDataFrame(stops_data, crs="EPSG:4326") # 查看结果示例 print("线要素GeoDataFrame:") print(line_gdf.head()) print("\n点要素GeoDataFrame:") print(stop_gdf.head())
说明
- 字段适配:用
get()方法获取属性避免字段缺失报错;若实际数据字段名(如站点名称为stop_name而非name)与示例不符,可打印route_properties或stop查看实际字段后调整。 - 坐标系:GeoJSON默认使用WGS84(EPSG:4326),转换时直接指定即可。
- 关联关系:通过
route_id将站点与所属线路绑定,方便后续关联分析。
内容的提问来源于stack exchange,提问作者SMar3552
相关产品推荐
相关产品推荐

