
1{
2 "parent":Array[0],
3 "distance":Array[0],
4 "pcode":"610000",
5 "importance":Array[0],
6 "biz_ext":Object{...},
7 "recommend":"0",
8 "type":"科教文化服务;图书馆;图书馆",
9 "photos":Array[3],
10 "discount_num":"0",
11 "gridcode":"5108277521",
12 "typecode":"140500",
13 "shopinfo":"0",
14 "poiweight":Array[0],
15 "citycode":"029",
16 "adname":"碑林区",
17 "children":Array[0],
18 "alias":Array[0],
19 "tel":"029-85397162",
20 "id":"B001D06VRS",
21 "tag":Array[0],
22 "event":Array[0],
23 "entr_location":"108.946021,34.230709",
24 "indoor_map":"0",
25 "email":Array[0],
26 "timestamp":"2021-03-29 02:53:38",
27 "website":Array[0],
28 "address":"长安北路18号",
29 "adcode":"610103",
30 "pname":"陕西省",
31 "biz_type":Array[0],
32 "cityname":"西安市",
33 "postcode":Array[0],
34 "match":"0",
35 "business_area":"长安路",
36 "indoor_data":Object{...},
37 "childtype":Array[0],
38 "exit_location":Array[0],
39 "name":"陕西省图书馆",
40 "location":"108.945397,34.231526",
41 "shopid":Array[0],
42 "navi_poiid":"I49F022008_265717",
43 "groupbuy_num":"0"
44 }
数据获取


1#划分格网批量生成url
2def create_urls(lon1,lat1,lon2,lat2,grid_size,type,keywordstr):
3 # 高德地图密钥
4 AK = "自己的密钥"
5 urls=[]
6 #生成格网
7 lon_num = int((lon2 - lon1) / grid_size + 1)
8 lat_num = int((lat2 - lat1) / grid_size + 1)
9
10 for lon_c in range(0, lon_num):
11 lon = lon1 + grid_size * lon_c
12 for lat_c in range(0,lat_num):
13 lat = lat1 + grid_size * lat_c
14 for i in range(0,20):
15 page_num=str(i)
16 url = "https://restapi.amap.com/v3/place/polygon?key=" + AK+ "&polygon=" + str(lon) + "," +str(lat) +"|"+str(lon+grid_size)+","+str(lat+grid_size) + "&city=西安市&type="+type+"&keywords="+keywordstr+"&citylimit=true&&output=json&offset=20&page="+page_num+"&extensions=all"
17 urls.append(url)
18 return urls
1def spider(urls, fname):
2 f = open(fname, 'w', encoding='utf-8', newline="")
3 csv_writer = csv.writer(f)
4 csv_writer.writerow(["名称", "经度", "纬度", "地址"])
5 info_list = []
6 for url in urls:
7 print(url)
8 time.sleep(5)
9 user_agent = random.choice(USER_AGENTS)
10 headers = {
11 'User-Agent': user_agent
12 }
13 html=requests.get(url, headers = headers)
14 data=html.json()
15 for item in data.get('pois'):
16 info_dic = {}
17 info_dic['name'] =item.get('name')
18 lon = item['location'].split(',')[0]
19 lat = item['location'].split(',')[1]
20 list = gcj02towgs84(float(lon), float(lat))
21 info_dic['lon'] = list[0]
22 info_dic['lat'] = list[1]
23 info_dic['add']=item.get('address')
24 info_dic['city'] = item.get('cityname')
25 if info_dic['city'] == "西安市":
26 csv_writer.writerow(info_dic.values())
27 info_list.append(info_dic)
28 f.close()
29 return info_list
1.常见地图产品的坐标系
①CGCS2000
WGS84与CGCS2000的基本定义是一致的,采用的参考椭球非常相近,椭球常数中仅扁率有细微差别,相同的点大多数下在两种坐标系中的坐标仅仅有细微差异。
②WGS-84
③GCJ-02
④BD-09

2.GCJ02转WGS84代码(网上搜集)
1x_pi = 3.14159265358979324 * 3000.0 / 180.0
2pi = 3.1415926535897932384626 # π
3a = 6378245.0 # 长半轴
4ee = 0.00669342162296594323 # 扁率
5
6def gcj02towgs84(lng, lat):
7 """
8 GCJ02(火星坐标系)转GPS84
9 :param lng:火星坐标系的经度
10 :param lat:火星坐标系纬度
11 :return:
12 """
13 if out_of_china(lng, lat):
14 return lng, lat
15 dlat = transformlat(lng - 105.0, lat - 35.0)
16 dlng = transformlng(lng - 105.0, lat - 35.0)
17 radlat = lat / 180.0 * pi
18 magic = math.sin(radlat)
19 magic = 1 - ee * magic * magic
20 sqrtmagic = math.sqrt(magic)
21 dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)
22 dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)
23 mglat = lat + dlat
24 mglng = lng + dlng
25 return [lng * 2 - mglng, lat * 2 - mglat]
26
27def transformlat(lng, lat):
28 ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + \
29 0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng))
30 ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *
31 math.sin(2.0 * lng * pi)) * 2.0 / 3.0
32 ret += (20.0 * math.sin(lat * pi) + 40.0 *
33 math.sin(lat / 3.0 * pi)) * 2.0 / 3.0
34 ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 *
35 math.sin(lat * pi / 30.0)) * 2.0 / 3.0
36 return ret
37
38def transformlng(lng, lat):
39 ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + \
40 0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))
41 ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *
42 math.sin(2.0 * lng * pi)) * 2.0 / 3.0
43 ret += (20.0 * math.sin(lng * pi) + 40.0 *
44 math.sin(lng / 3.0 * pi)) * 2.0 / 3.0
45 ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 *
46 math.sin(lng / 30.0 * pi)) * 2.0 / 3.0
47 return ret
48
49def out_of_china(lng, lat):
50 """
51 判断是否在国内,不在国内不做偏移
52 :param lng:
53 :param lat:
54 :return:
55 """
56 if lng < 72.004 or lng > 137.8347:
57 return True
58 if lat < 0.8293 or lat > 55.8271:
59 return True
60 return False
POI点热力图可视化
1.folium库
folium documentation:
https://python-visualization.github.io/folium/
folium examples:
https://nbviewer.jupyter.org/github/python-visualization/folium/tree/master/examples/
2.代码
1def createHeatmap(info_list, html_path):
2 data = [ [info['lat'], info['lon']] for info in info_list]
3 map_osm = folium.Map(location=[34.343147,108.939621],zoom_start = 10)
4 HeatMap(data).add_to(map_osm)
5 map_osm.save(html_path)
6 webbrowser.open(html_path)
示例展示
以西安市的电影院为例,获取西安市电影院POI点数据并进行可视化。
1.POI数据

2.热力图

以上就是这次的分享,如有需要完整源码与POI数据的朋友,可咨询爬虫与地理信息公众号。
- END -
李德仁院士:精准农业中的遥感技术
去除影像黑边的N种方法
最新招聘!内业负责人、测绘技术员、GIS研发....
CC、Pix4D、大疆智图、M3D...国内外常用实景三维建模软件电脑配置推荐
全球首套长时序、可对比、高数据质量的夜间灯光遥感数据集下载!2000-2022年全球500米逐年“类NPP-VIIRS”




