大数跨境
0
0

POI数据获取与可视化

POI数据获取与可视化 GIS前沿
2023-06-27
2

01

POI数据概述


1.POI数据定义

POI是“Point of Interest”的缩写,中文称为“兴趣点”。顾名思义,兴趣点就是我们感兴趣的一个位置。比如,一个POI可以是一家饭店、一家电影院、一个地铁站、一个公交站等。通常来说,一个POI包含四个必有字段:名称、类别、地址、位置(经纬度

下面是高德地图一个图书馆POI点的详细信息,除了上述四个字段外还有其他属性信息。

   
   
   

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        }

2.POI数据应用

一个POI点包含的信息可以让人们快速了解某一个位置有一个场所,可以通过导航到达该地。当拥有海量POI数据时,便可以做很多数据分析与预测之类的工作,这便是大数据的价值。比如,全面的POI数据是导航地图的必备信息,POI点能提醒用户道路的分支及周边建筑等各类详尽信息,也能方便导航中查到你所需要的各个地方(商场、电影院等),选择最为便捷和通畅的道路来进行路径规划。再比如,可以通过获取某城市所有大型购物POI数据,通过数据可视化与分析判断该城市的经济发展程度以及城区商业中心所在地等。


02

数据获取


1.高德地图POI搜索:

搜索服务API是一类简单的HTTP接口,提供多种查询POI信息的能力,其中包括关键字搜索、周边搜索、多边形搜索、ID查询四种筛选机制。(使用API前您需先申请Key,若无高德地图API账号需要先申请账号。)

  • 关键字搜索:通过用POI的关键字进行条件搜索,例如:肯德基、朝阳公园等;同时支持设置POI类型搜索,例如:银行

  • 周边搜索:在用户传入经纬度坐标点附近,在设定的范围内,按照关键字或POI类型搜索;

  • 多边形搜索:在多边形区域内进行搜索;

  • ID查询:通过POI ID,查询某个POI详情,建议可同输入提示API配合使用;


2.多边形搜索API:


由于高德地图每一次访问返回的数据量有限,因此可以对目标区域按经纬度进行格网划分,依次对每个格网进行POI搜索。如下图所示,可以在高德地图坐标拾取页面拾取西安市行政区经纬度坐标对范围。多边形为矩形时,可只拾取左上右下两顶点坐标对即可。

3.核心代码

①划分格网批量生成URL地址

   
   
   

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

②获取POI数据并保存

   
   
   

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



03


POI数据点坐标转换


由于高德地图使用的是加密后的GCJ-02坐标系,而我们可视化的底图为OSM地图,其使用的坐标系是WGS-84坐标系,直接显示可能位置会有偏移,因此需要进行坐标转换。

1.常见地图产品的坐标系

①CGCS2000

也称2000国家大地坐标系,是全球地心坐标系在我国的具体体现,是我国当前最新的国家大地坐标系。坐标系的原点为包括海洋和大气的整个地球的质量中心,Z轴指向BIH1984.0定义的协议极地方向(BIH国际时间局),X轴指向BIH1984.0定义的零子午面与协议赤道的交点,Y轴按右手坐标系确定。

WGS84与CGCS2000的基本定义是一致的,采用的参考椭球非常相近,椭球常数中仅扁率有细微差别,相同的点大多数下在两种坐标系中的坐标仅仅有细微差异。

②WGS-84

1984年世界大地坐标系,是为GPS全球定位系统使用而建立的全球地心坐标系。坐标系的原点位于地球质心,z轴指向BIH1984.0定义的协议地球极(CTP)方向(BIH国际时间局),x轴指向BIH1984.0的零度子午面和CTP赤道的交点,y轴通过右手规则确定。

③GCJ-02

也称火星坐标系。GCJ-02是由中国国家测绘局(G表示Guojia国家,C表示Cehui测绘,J表示Ju局)制订的地理信息系统的坐标系统。它是一种对经纬度数据使用加密算法加密后的坐标系统,国内出版的各种地图系统(包括电子形式),必须至少采用GCJ-02对地理位置进行首次加密。

④BD-09

也称百度坐标系。BD-09是在在GCJ-02坐标系的基础上再次进行加密后的坐标系。其中,BD09LL表示百度经纬度坐标,BD09MC表示百度墨卡托米制坐标。

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


04


POI点热力图可视化


1.folium库

folium是js上著名的地理信息可视化库leaflet.js为Python提供的接口,通过它,我们可以通过在Python端编写代码操纵数据,来调用leaflet的相关功能,基于内建的osm或自行获取的osm资源和地图原件进行地理信息内容的可视化,以及制作优美的可交互地图。

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)


05


示例展示


以西安市的电影院为例,获取西安市电影院POI点数据并进行可视化。

1.POI数据

2.热力图

以上就是这次的分享,如有需要完整源码与POI数据的朋友,可咨询爬虫与地理信息公众号。

- END -





历史干货

李德仁院士:精准农业中的遥感技术
去除影像黑边的N种方法
最新招聘!内业负责人、测绘技术员、GIS研发....

CC、Pix4D、大疆智图、M3D...国内外常用实景三维建模软件电脑配置推荐
全球首套长时序、可对比、高数据质量的夜间灯光遥感数据集下载!2000-2022年全球500米逐年“类NPP-VIIRS”



【声明】内容源于网络
0
0
GIS前沿
分享测绘地信资讯,交流行业软件技巧。
内容 4549
粉丝 0
GIS前沿 分享测绘地信资讯,交流行业软件技巧。
总阅读68
粉丝0
内容4.5k