
本文介绍如何使用嵌套循环或列表推导式生成两个数值范围的所有唯一坐标对,并将其高效应用于 http 请求循环中,实现 nearmap 瓦片图像的批量下载。
本文介绍如何使用嵌套循环或列表推导式生成两个数值范围的所有唯一坐标对,并将其高效应用于 http 请求循环中,实现 nearmap 瓦片图像的批量下载。
在地理空间数据批量获取场景中,常需基于行列号(如 x, y)构造大量瓦片 URL 并依次请求。核心难点在于:如何结构化生成所有 (x, y) 坐标对,并无缝注入到请求逻辑中。下面提供一套清晰、健壮且可扩展的实现方案。
✅ 步骤一:定义坐标范围并生成笛卡尔积
避免手动嵌套 for 循环拼接列表,推荐使用列表推导式生成所有组合——简洁、高效且符合 Python 风格:
range1 = range(634797, 634876) # x 坐标范围(共 79 个值)
range2 = range(776458, 776512) # y 坐标范围(共 54 个值)
combinations = [(x, y) for x in range1 for y in range2]
print(f"共生成 {len(combinations)} 个唯一坐标对") # 输出:4266
该写法等价于 itertools.product(range1, range2),但无需导入额外模块,语义直观。
✅ 步骤二:在循环中解包坐标对并构造请求
关键技巧:直接在 for 语句中解包元组 for myVal1, myVal2 in combinations:,使代码高度可读,避免索引访问或重复赋值:
import requests
API_KEY = "YOUR_API_KEY_HERE" # ⚠️ 务必替换为真实密钥,切勿硬编码到生产环境
for x, y in combinations:
url = f"https://api.nearmap.com/tiles/v3/surveys/6e33c960-4310-11ee-90f9-b3c1b4806389/North/21/{x}/{y}.jpg?apikey={API_KEY}"
headers = {"accept": "image/*"}
try:
response = requests.get(url, headers=headers, timeout=30)
if response.status_code == 200:
file_path = f"/arcgis/home/nearmap/{x}_{y}.jpg"
with open(file_path, 'wb') as f:
f.write(response.content)
print(f"✅ 成功下载: {file_path}")
else:
print(f"❌ 请求失败 [{response.status_code}]: {x}, {y}")
except requests.exceptions.RequestException as e:
print(f"⚠️ 网络异常 {x}, {y}: {e}")
⚠️ 重要注意事项
-
API 限流与节流:NearMap 等服务通常限制 QPS(每秒请求数)。建议添加
time.sleep(0.1)(100ms 间隔)缓解压力,或使用requests.adapters.HTTPAdapter配置连接池。 -
文件路径安全:确保
/arcgis/home/nearmap/目录存在且有写入权限;建议用os.makedirs(..., exist_ok=True)预创建。 - 错误恢复与日志:生产环境应记录失败坐标到 CSV 或数据库,便于断点续传。
-
密钥管理:切勿将
API_KEY明文提交至 Git。推荐使用环境变量:os.getenv("NEARMAP_API_KEY")。 -
内存优化(超大数据集):若坐标对超过 10 万,改用生成器表达式
((x, y) for x in range1 for y in range2)避免一次性加载全部元组到内存。
通过以上结构化设计,你不仅能完成当前批量下载任务,还可快速适配其他瓦片服务(如 Google Maps Static API、Mapbox Raster Tiles),只需调整 URL 模板和坐标参数即可。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











