当前位置:首页>python>GIS高级篇——Python爬取poi数据

GIS高级篇——Python爬取poi数据

  • 2026-09-13 22:11:08
GIS高级篇——Python爬取poi数据
{Python批量爬取高德poi}
01
在高德地图开放平台注册key

高德开放平台——注册一个新账号——控制台——应用管理——我的应用——创建key

如图是已经创建完成的key.

02
python爬取南昌市韵达快递poi数据

注:完成此次数据爬取需要安装request模块!

爬取成功以后,会得到如下信息。

源代码在文末尾!

03
导入GIS进行空间分析

首先在天地图官网下载南昌市行政区划,然后去mapshaper将其转化为shp格式(该格式能直接导入GIS)

其次,将爬取到的快递点信息保存为CSV格式,导入GIS。右键——显示xy数据(具体设置如下)

完成后,将得到韵达快递点的分布数据,如下图所示

接下来我们用GIS工具对其进行空间分析,核密度分析(计算每个像元周围单位面积内的“快递点密度”)、缓冲区分析(分析每个快递点的服务半径)、欧式距离(需要与住区poi数据配套使用,来计算出区域内的居住小区到某个快递站的最小距离)

以核密度分析为例,开始前须进行环境配置(详见GIS基础篇——栅格数据的生成)具体配置如下图

分析结果如下图

为使得成果更美观,可以考虑用按掩膜提取工具,使神格图像与行政边界相契合,最终成果如下。

源代码:

import requests
import csv
import time

# 高德API配置
API_KEY = ''  # 替换为你的高德开放平台Web服务API Key
CITY = '南昌'
KEYWORDS = '韵达快递'
OUTPUT_FILE = 'nanchang_ydexpress_poi——1.csv'
MAX_PAGE_SIZE = 50  # 高德API每页最大返回数量
def get_poi_data(page):
url = "https://restapi.amap.com/v3/place/text"
params = {
'key': API_KEY,
'keywords': KEYWORDS,
'city': CITY,
'offset': MAX_PAGE_SIZE,
'page': page,
'extensions': 'all'  # 获取全部信息
}

try:
response = requests.get(url, params=params)
response.raise_for_status()
data = response.json()

if data['status'] == '1':
return data['pois']
else:
print(f"请求失败: {data.get('info', '未知错误')}")
return None
   except Exception as e:
print(f"请求异常: {str(e)}")
return None
def parse_poi(pois):
results = []
for poi in pois:
result = {
'名称': poi.get('name', ''),
'地址': poi.get('address', ''),
'经度': poi.get('location', '').split(',')[0] if poi.get('location') else '',
'纬度': poi.get('location', '').split(',')[1] if poi.get('location') else '',
'联系电话': poi.get('tel', ''),
'省份': poi.get('pname', ''),
'城市': poi.get('cityname', ''),
'区域': poi.get('adname', ''),
'ID': poi.get('id', '')
}
results.append(result)
return results


def save_to_csv(data):
if not data:
return
   with open(OUTPUT_FILE, 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.DictWriter(f, fieldnames=data[0].keys())
writer.writeheader()
writer.writerows(data)


def main():
all_pois = []
page = 1
while True:
print(f"正在获取第 {page} 页数据...")
pois = get_poi_data(page)

if not pois:
break
parsed_data = parse_poi(pois)
all_pois.extend(parsed_data)

# 检查是否还有更多数据
if len(pois) < MAX_PAGE_SIZE:
break
page += 1
time.sleep(0.5) # 控制请求频率避免触发限流
save_to_csv(all_pois)
print(f"数据已保存至 {OUTPUT_FILE},共获取 {len(all_pois)} 条记录")


if __name__ == '__main__':
main()

最新文章

随机文章