高德poi数据下载思路

第二篇博客写个poi点数吧,简单写一下思路。
一、需求:
获取某个中心城区的所有poi点,要素成果直接为shp格式
二、数据源与工具:
高德api,pandas库,pyshp(用来直接生成shp文件)
三、实现步骤:
注意点:
1.本次调用的是高德api矩阵选框,所以api构造需符合矩阵函数。详见高德api:https://lbs.amap.com/api/webservice/guide/api/search。offset为单页个数,最大值为25,回调参数有个count,则该poi点的页码数为:pages = math.ceil(float(dt[‘count’])/25) #math.ceil为页码进一。
在这里插入图片描述
2.由于每次仅能从单一矩阵采集数据900个,所以需要切割矩阵,将其做切割成多个矩阵,写一个类或者函数来实现,核心思路为确定左下右上角范围坐标,切割尺度。本次的范围为1500km2。
3.利用json.cn查看回调的json,确定需要存储的指标,我选取的指标为大类、中类、小类、name、address和timestamp以及location。
4.构造pois字典,按照键值对存放大类和中类,pois={‘交通设施服务’:[‘停车场’,‘公交车站’],‘商务住宅’:[‘楼宇’,‘住宅区’]};
5.坐标切割,遍历调用高德api函数get_datapoi(key,query,loc),参数分别为:key,query(查询字段)和loc(当前坐标);
6.坐标转换及数据清洗,github上提供了坐标转换函数,https://github.com/wandergis/coordTransform_py。数据清洗主要是由于网络不佳造成的try重复采集,所有需要利用到drop.duplicates()函数去重。
7.利用pyshp第三库,将数据生成shp。
在这里插入图片描述
成果:封装写好后,就让它跑吧,福州市中心城区1500km2,大概4个小时能全部下载完,暂时还没想到用处,先放着,做基础数据库,后期做一些设施评价和便利性以及与同类型城市横向对比用。
在这里插入图片描述

### 使用高德地图API实现POI数据抓取 为了高效地使用高德地图API进行POI数据的抓取,通常采用多边形搜索的方式。由于单次请求的数据量有限制,因此需要将目标区域划分为多个较小的子区域逐一查询[^2]。 #### 准备工作 首先,在开始之前需确保已注册成为开发者并获得相应的API Key。这一步骤可通过访问高德开放平台完成[^4]。 #### Python环境配置 安装必要的Python库: ```bash pip install requests pandas geopandas shapely ``` 这些工具可以帮助处理HTTP请求以及地理空间数据分析。 #### 实现逻辑概述 1. 定义待检索的大范围边界框; 2. 将大范围分割成若干个小矩形或多边形; 3. 对每一个小区域发起API调用; 4. 收集响应中的POI记录; 5. 存储最终结果至CSV文件或其他持久化存储介质中; #### 示例代码 下面是一个简单的例子展示如何基于上述思路编写程序: ```python import time from math import ceil, sqrt import requests import pandas as pd def fetch_pois(api_key, bounds, keywords=None): """Fetch POIs within given bounding box.""" base_url = 'https://restapi.amap.com/v3/place/polygon' params = { 'key': api_key, 'polygon': f"{bounds['min_lng']},{bounds['min_lat']}|{bounds['max_lng']},{bounds['max_lat']}", 'offset': 20, # Maximum number of results per page 'page': 1, 'extensions': 'all', 'output': 'json' } if keywords is not None: params.update({'keywords': keywords}) all_items = [] while True: response = requests.get(base_url, params=params).json() items = response.get('pois', []) all_items.extend(items) total_count = int(response.get('count')) current_size = len(all_items) if current_size >= min(total_count, params['offset']*params['page']): break params['page'] += 1 # Avoid hitting rate limit by sleeping between pages time.sleep(0.1) return all_items def split_bounds(lng_min, lat_min, lng_max, lat_max, divisions=8): """Split a large area into smaller rectangles for better API performance.""" delta_lng = (lng_max - lng_min) / float(divisions) delta_lat = (lat_max - lat_min) / float(int(sqrt((lng_max-lng_min)*(lat_max-lat_min))/delta_lng)) sub_areas = [] for i in range(int(divisions)): for j in range(int(delta_lat)+1): new_lng_min = round(lng_min + i * delta_lng, 6) new_lat_min = round(lat_min + j * delta_lat, 6) new_lng_max = round(new_lng_min + delta_lng, 6) new_lat_max = round(new_lat_min + delta_lat, 6) sub_area = dict( min_lng=new_lng_min, max_lng=min(new_lng_max, lng_max), min_lat=new_lat_min, max_lat=min(new_lat_max, lat_max) ) sub_areas.append(sub_area) return sub_areas if __name__ == '__main__': YOUR_API_KEY = '<Your AMap Web Service API Key>' city_boundaries = {'min_lng': 116.279744, 'min_lat': 39.804737, 'max_lng': 116.60425, 'max_lat': 40.06071} small_regions = split_bounds(**city_boundaries, divisions=16) pois_data = [] for region in small_regions: try: pois = fetch_pois(YOUR_API_KEY, region) pois_data.extend(pois) except Exception as e: print(f"Error fetching data from {region}: ", str(e)) df = pd.DataFrame.from_records([poi.__dict__.get('_data') or poi for poi in pois_data]) df.to_csv('./amap_poi.csv', index=False, encoding='utf_8_sig') ``` 此脚本实现了对指定区域内POI信息的收集,并将其保存到本地CSV文件中。需要注意的是,实际操作过程中应当遵循服务条款合理控制频率以免触发限流机制[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值