一,爬取高德POI数据(高德开放平台接口+ Python)

参考记者博客https://blog.csdn.net/hxx099/article/details/88974264

1,申请高德开放平台的数据接口

1)申请高德地图API帐户https://lbs.amap.com/dev/key登录后—创建新应用![登录后点及创建新应用](https://img-blog.csdnimg。 cn / 20200629211016724.png)在建立的应用中添加密钥类型选择Web服务![在这里插入图片描述(https://img-blog.csdnimg.cn/20200629211526589.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3p6enp6ejIwMTY =,size_16,color_FFFFFF,t_70)然后可以被要求提供服务的密钥

![在这里插入图片描述(https://img-blog.csdnimg.cn/20200629211931735.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3p6enp6ejIwMTY=,size_16,color_FFFFFF,t_70)

2、下载高德地图POI分类编码表和城市编码表

–下载地址为:https://lbs.amap.com/api/webservice/download
通过城市编码表,可以查看行政区划名称,以便在后面的代码中填写一致的城市名称;
POI分类编码如下图所示,代码通过读取这个表中的大类、中类、小类的名称爬取POI数据,如有不需要的类别,可先将输入POI分类编码中的部分类别删除。

3、使用python代码获取目标行政区范围和目标POI类别

代码如下,更改输出文件夹、输入POI分类编码表、高德密钥、目标行政区范围

from urllib.parse import quote
import urllib
import pandas as pd
import xlwt
import jsonclass getpoi:output_path="E:/out/"             ##########输出文件夹名称###########path_class ="E:/in/amap_poicode.xlsx.xlsx"         ##########输入的POI分类编码表(用以指示需要爬取的POI类型)###########amap_web_key = 'c8e8b1f7f265618cbb531517'        ##########高德API的密钥###########poi_search_url = "https://restapi.amap.com/v3/place/text?key=%s&extensions=all&keywords=&types=%s&city=%s&citylimit=true&offset=25&page=%s&output=json"   ##########不需要更改##########cityname = '上海'          ############目标的城市(与城市编码表中的名称需要一致)#############areas = ['奉贤区']         ############目标城市的次级行政范围(与城市编码表中的名称需要一致)#############totalcontent = {}def __init__(self):data_class = self.getclass()for type_class in data_class:for area in self.areas:page = 1;if type_class['type_num'] / 10000 < 10:classtype = str('0') + str(type_class['type_num'])else:classtype = str(type_class['type_num'])while True:if classtype[-4:] =="0000":break;poidata = self.get_poi(classtype, area, page);poidata = json.loads(poidata)if poidata['count'] == "0":break;else:poilist = self.hand(poidata)print("area:" + area + "  type:" + classtype + "  page:第" + str(page) + "页  count:" + poidata['count'] + "poilist:")page += 1for pois in poilist:if classtype[0:2] in self.totalcontent.keys():pois['bigclass'] = type_class['bigclass']pois['midclass'] = type_class['midclass']pois['smallclass'] = type_class['smallclass']list_total = self.totalcontent[classtype[0:2]]list_total.append(pois)else:self.totalcontent[classtype[0:2]] = []pois['bigclass'] = type_class['bigclass']pois['midclass'] = type_class['midclass']pois['smallclass'] = type_class['smallclass']self.totalcontent[classtype[0:2]].append(pois)for content in self.totalcontent:self.writeexcel(self.totalcontent[content], content)def writeexcel(self, data, classname):book = xlwt.Workbook(encoding='utf-8', style_compression=0)sheet = book.add_sheet(classname, cell_overwrite_ok=True)# 第一行(列标题)sheet.write(0, 0, 'x')sheet.write(0, 1, 'y')sheet.write(0, 2, 'count')sheet.write(0, 3, 'name')sheet.write(0, 4, 'adname')sheet.write(0, 5, 'smallclass')sheet.write(0, 6, 'typecode')sheet.write(0, 7, 'midclass')classname = data[0]['bigclass']for i in range(len(data)):sheet.write(i + 1, 0, data[i]['lng'])sheet.write(i + 1, 1, data[i]['lat'])sheet.write(i + 1, 2, 1)sheet.write(i + 1, 3, data[i]['name'])sheet.write(i + 1, 4, data[i]['adname'])sheet.write(i + 1, 5, data[i]['smallclass'])sheet.write(i + 1, 6, data[i]['classname'])sheet.write(i + 1, 7, data[i]['midclass'])book.save(self.output_path + self.cityname + '_' + classname + '.xls')def hand(self, poidate):pois = poidate['pois']poilist = []for i in range(len(pois)):content = {}content['lng'] = float(str(pois[i]['location']).split(",")[0])content['lat'] = float(str(pois[i]['location']).split(",")[1])content['name'] = pois[i]['name']content['adname'] = pois[i]['adname']content['classname'] = pois[i]['typecode']poilist.append(content)return poilistdef readfile(self, readfilename, sheetname):data = pd.read_excel(readfilename, sheet_name=sheetname)return datadef getclass(self):readcontent = self.readfile(self.path_class, "POI分类与编码(中英文)")data = []for num in range(readcontent.shape[0]):content = {}content['type_num'] = readcontent.iloc[num]['NEW_TYPE']content['bigclass'] = readcontent.iloc[num]['大类']content['midclass'] = readcontent.iloc[num]['中类']content['smallclass'] = readcontent.iloc[num]['小类']data.append(content)return datadef get_poi(self, keywords, city, page):poiurl = self.poi_search_url % (self.amap_web_key, keywords, quote(city), page)data = ''with urllib.request.urlopen(poiurl) as f:data = f.read().decode('utf8')return dataif __name__ == "__main__":gp = getpoi()

最后获得的结果如图所示:每个大类输出为一个单独的excel文件,每个EXCEL文件中包括POI数据的经纬度和相关信息。

二、将POI数据转换到WGS84坐标系

参考链接:https://blog.csdn.net/qq_37089628/article/details/88622304
原始的坐标系为火星坐标系,与平时使用的WGS84坐标系中间存在一个位置偏移,如果想要和别的WGS84坐标系的数据一起使用,需要先进行坐标系转换。
下述代码需要更改输入文件夹,输入EXCEL名称和输出名称。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import pandas as pd
import json
import math
import os
import csv## 转换函数:x_pi = 3.14159265358979324 * 3000.0 / 180.0
pi = 3.1415926535897932384626  # π
a = 6378245.0  # 长半轴
ee = 0.00669342162296594323  # 扁率def gcj02towgs84(lng, lat):"""GCJ02(火星坐标系)转GPS84:param lng:火星坐标系的经度:param lat:火星坐标系纬度:return:"""if out_of_china(lng, lat):return lng, latdlat = transformlat(lng - 105.0, lat - 35.0)dlng = transformlng(lng - 105.0, lat - 35.0)radlat = lat / 180.0 * pimagic = math.sin(radlat)magic = 1 - ee * magic * magicsqrtmagic = math.sqrt(magic)dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)mglat = lat + dlatmglng = lng + dlngreturn [lng * 2 - mglng, lat * 2 - mglat]def transformlat(lng, lat):ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + \0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng))ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *math.sin(2.0 * lng * pi)) * 2.0 / 3.0ret += (20.0 * math.sin(lat * pi) + 40.0 *math.sin(lat / 3.0 * pi)) * 2.0 / 3.0ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 *math.sin(lat * pi / 30.0)) * 2.0 / 3.0return retdef transformlng(lng, lat):ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + \0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *math.sin(2.0 * lng * pi)) * 2.0 / 3.0ret += (20.0 * math.sin(lng * pi) + 40.0 *math.sin(lng / 3.0 * pi)) * 2.0 / 3.0ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 *math.sin(lng / 30.0 * pi)) * 2.0 / 3.0return retdef out_of_china(lng, lat):"""判断是否在国内,不在国内不做偏移:param lng::param lat::return:"""if lng < 72.004 or lng > 137.8347:return Trueif lat < 0.8293 or lat > 55.8271:return Truereturn False# 主程序:if __name__ == '__main__':filepath = 'E:\\out\\POI数据\\'poifile=filepath+'道路与交通设施用地.xlsx'print(poifile)
#         if not os.path.exists(path):
#             os.mkdir(path)poifile84=filepath+'上海_道路与交通设施用地_84.csv'pd_poifile=pd.read_excel(poifile)with open(poifile84,"w",newline="") as file:print(file)writter = csv.writer(file)writter.writerow(["x", "y", "name", "adname", "smallclass", "typecode", "midclass"])for index,row in pd_poifile.iterrows():i = gcj02towgs84(row["x"],row["y"])writter.writerow([i[0],i[1],row["name"],row["adname"],row["smallclass"],row["typecode"],row["midclass"]])file.close()print("坐标转换完毕")

三、将EXCEL文件转换为SHP矢量文件

可以直接在ArcGIS中通过添加XY数据实现![在这里插入图片,size_16,color_FFFFFF,t_70)

使用python爬取高德POI数据,并转换为WGS84经纬度坐标的点矢量相关推荐

  1. python爬取高德poi数据_Python突破高德API限制完全爬取POI兴趣点数据

    一.背景 爬取POI数据,基本上是个老生常谈的话题了,现在市面上随处可见各路大神制作的获取POI数据的工具,但是当我将从高德地图中实际获取的POI数据与工具爬取的POI数据进行对比之后发现,市面上流行 ...

  2. python爬高德地图_利用Python爬取高德地图数据

    准备1.高德开放平台注册账户 https://lbs.amap.com/dev/index 验证手机号码.邮箱后进入开发者后台创建一个应用: 并为该应用添加 Key,服务平台选择 web 服务 申请完 ...

  3. python爬取高德数据_利用Python爬取高德地图数据

    准备1.高德开放平台注册账户 https://lbs.amap.com/dev/index 验证手机号码.邮箱后进入开发者后台创建一个应用: 并为该应用添加 Key,服务平台选择 web 服务 申请完 ...

  4. python输入数据爬取_利用 Python 爬取高德地图数据

    准备1.高德开放平台注册账户 https://lbs.amap.com/dev/index 验证手机号码.邮箱后进入开发者后台创建一个应用: 并为该应用添加 Key,服务平台选择 web 服务 申请完 ...

  5. python爬取高德地图数据_你的未来有我导航----教你如何爬取高德地图

    简单一文教你如何爬取高德地图 目录 推荐 一. 分析网页结构 二.拿到相关网址 三.代码实现 3.1 查询所有城市名称和编号 3.2 根据编号查询天气 四.完整代码 五.保存结果 一. 分析网页结构 ...

  6. FME爬取高德POI数据

    参考https://blog.csdn.net/qq_28148071/article/details/85837919?utm_medium=distribute.pc_relevant.none- ...

  7. python爬取高德POI并生成shp(关键字搜索/多边形搜索)

    高德开放平台提供了搜索POI功能,可以调用API来获取兴趣点的地理位置信息.本篇尝试用python获取高德POI并生成GIS常用shp文件.需要用的库有urllib3(或者request),json, ...

  8. PYTHON爬取高德地图POI

    PYTHON爬取高德地图POI 使用高德地图API爬取POI数据,首先需要申请高德地图API的KEY和获取<POI分类编码表>,本实例的最后结果是根据不同的poi类型分别生成多个EXCEL ...

  9. python爬取高德地图_爬虫实战:如何爬取高德地图?

    提起高德地图,咱们每一个人都不会陌生,高德地图是一款非常好用的地区服务软件,很多用户在出行的时候都会使用这款软件,日程用来导航,也可以用来打车,一次呼叫多种车型,用户可以在这里获得更好的服务,随时都可 ...

最新文章

  1. lucene正向索引——正向信息,Index – Segments (segments.gen, segments_N) – Field(fnm, fdx, fdt) – Term (tvx, ...
  2. makefile ifneq多个判断条件_Python基础语法——条件判断
  3. socket通信(C#)
  4. java 白皮书的关键术语
  5. 京东双十一大促网关承载十亿调用量背后的架构实践
  6. (转)最近100年全球最顶尖公司的共性
  7. Linux修改默认静态IP
  8. 7-33 电话聊天狂人 (25 分)(map水题)
  9. CyanogenMod源码下载和编译 CM7
  10. 专升本英语——语法知识——高频语法——第四节 定语从句(限制性定语从句-非限制性定语从句)【学习笔记】
  11. 【CV】斯坦福CS231n DL-CV by李飞飞 team
  12. VR和AR可以怎样干掉智能手机
  13. 几何分布的期望和方差公式推导_平方差公式证明推导过程及运用详解(数学简便计算方法之一)...
  14. js强制保留两位小数
  15. 深圳小众爬山点推荐 人少景美周末必备
  16. 概率论与数理统计学习笔记——第二章
  17. 关于ARM Kinetis MCU唤醒源NVIC和AWIC的工作过程解惑
  18. 阿里云技术认证ACP是什么?阿里ACP认证需要具备哪些知识?
  19. Unity1.16 坐标系分类/监控面板中的Terrian/导入素材包
  20. Your configuration specifies to merge with the ref ‘refs/hea

热门文章

  1. SSO(single sign on)模式 单点登录
  2. Hibernate之load和get的区别
  3. 你知道吗?火狐搜集您的数据?
  4. 汉字Collection
  5. 毕设专题1 — 开始准备结束的任务
  6. 自己动手制作RPM包
  7. Fedora 19安装Fcitx输入法并安装搜狗输入法资源包
  8. 台式计算机连不上网,台式机插上网线连不上网怎么办?
  9. 《数字语音处理》- 实验4. 基于MATLAB与VQ的特定人孤立词语音识别研究(附代码)
  10. 腾讯云 wafer2 上手,轻松部署小程序后端!