如何将GeoJSON上传至Mapbox API?接口未返回job_id问题解决
正确的Mapbox API上传GeoJSON流程
你的代码仅完成了第一步(获取S3临时上传凭证),但缺少上传文件到指定S3桶和触发Mapbox上传任务两个核心步骤,因此无法拿到job_id。完整流程如下:
步骤1:获取S3上传凭证
调用Mapbox的凭证接口获取临时S3权限,这一步你已实现,但需提取返回的url(S3上传地址)、key(文件存储路径)等关键信息:
import requests import geopandas as gpd # 转换GeoDataFrame为GeoJSON字符串 gdf = gpd.GeoDataFrame(df, geometry="GEOMETRY") geojson_str = gdf.to_json() # 获取S3上传凭证 username = "你的Mapbox用户名" my_access_token = "你的Mapbox访问令牌" cred_url = f"https://api.mapbox.com/uploads/v1/{username}/credentials?access_token={my_access_token}" cred_response = requests.post(cred_url) cred_data = cred_response.json() # 提取关键凭证字段 s3_upload_url = cred_data["url"] s3_file_key = cred_data["key"] s3_bucket = cred_data["bucket"]
步骤2:将GeoJSON上传至指定S3桶
使用拿到的S3凭证,通过PUT请求将GeoJSON内容上传到指定地址,需设置正确的Content-Type:
# 上传GeoJSON到S3 s3_upload_response = requests.put( s3_upload_url, data=geojson_str.encode("utf-8"), headers={"Content-Type": "application/geo+json"} ) s3_upload_response.raise_for_status() # 确保上传成功,失败则抛出异常
步骤3:触发Mapbox上传任务
文件上传到S3后,调用Mapbox的上传任务接口,传入S3文件路径和自定义瓦片集信息,即可获取job_id:
# 发起Mapbox上传任务 job_url = f"https://api.mapbox.com/uploads/v1/{username}?access_token={my_access_token}" job_payload = { "name": "mydata", "url": f"s3://{s3_bucket}/{s3_file_key}", "tileset": f"{username}.mydata_tileset" # 瓦片集格式必须为「用户名.自定义名称」 } job_response = requests.post(job_url, json=job_payload) job_data = job_response.json() job_id = job_data["job"] # 查询上传状态 status_url = f"https://api.mapbox.com/uploads/v1/{username}/{job_id}/status?access_token={my_access_token}" status_response = requests.get(status_url) print(status_response.json())
核心注意事项
- 确保你的Mapbox令牌拥有
uploads:write和uploads:read权限 - 瓦片集名称必须遵循「用户名.自定义名称」格式,不能包含特殊字符
- 上传到S3时必须设置
Content-Type为application/geo+json,否则Mapbox无法识别文件格式 - 若GeoJSON体积较大,建议先保存为本地文件再上传,避免内存溢出
内容的提问来源于stack exchange,提问作者code_bug
相关产品推荐
相关产品推荐

