【数据技术】利用Python获取高德地图POI数据——以上海瑞幸门店为例

这篇具有很好参考价值的文章主要介绍了【数据技术】利用Python获取高德地图POI数据——以上海瑞幸门店为例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、概述

本文讲述利用Python获取高德地图POI数据的思路以及具体步骤。

此处以上海瑞幸门店为例,目的是同时讲述多边形搜索关键词搜索以及POI类型搜索的具体用法。

本文完整代码的获取方式在文末,有需求的小伙伴自取。

【数据技术】利用Python获取高德地图POI数据——以上海瑞幸门店为例
上海瑞幸门店地图可视化
【数据技术】利用Python获取高德地图POI数据——以上海瑞幸门店为例
上海瑞幸门店地图可视化

二、获取思路

通过调用高德地图API中的搜索POI(多边形搜索)接口来获取POI数据。

【数据技术】利用Python获取高德地图POI数据——以上海瑞幸门店为例
搜索POI接口
https://lbs.amap.com/api/webservice/guide/api/search#around

理论上来说,只需要将接口输入参数中的polygon设置为上海边界经纬度值,将keywords设置为瑞幸,将types设置为餐饮服务(编码:050000),就能够获取上海范围内的瑞幸咖啡门店数据。

【数据技术】利用Python获取高德地图POI数据——以上海瑞幸门店为例
GeoJSON格式的上海边界数据

但在多边形搜索接口中每个边界范围能够获取到的POI数量是有限制的,超过该限制的POI数据则不会返回。

因此,想要获取全量POI数据,需要将一个大多边形切割成若干个符合数量限制的小多边形。

此处,引入四叉树索引的概念,将大的多边形不断四分,直到所有小多边形均满足数量限制为止。

【数据技术】利用Python获取高德地图POI数据——以上海瑞幸门店为例

完成上述操作后,遍历所有小多边形并获取瑞幸POI,即可得到全量的上海瑞幸POI数据。

三、具体步骤

步骤1:申请高德地图API密钥

高德地图API密钥需要通过高德官网申请

【数据技术】利用Python获取高德地图POI数据——以上海瑞幸门店为例
高德地图API官网(https://lbs.amap.com/)

具体操作步骤可参考下面链接:https://kdocs.cn/l/coOAaCYwW0tg

步骤2:获取上海边界范围外接矩形的坐标值

# 通过读取GeoJSON格式的上海边界数据
# 获取上海边界外接矩形的最小经度、最大经度、最小纬度、最大纬度
​
import geopandas as gp
​
# 结果变量
resultMinLon = 99999.0  # 最小经度
resultMaxLon = 0.0  # 最大经度
resultMinLat = 99999.0  # 最小纬度
resultMaxLat = 0.0  # 最大纬度
​
# 读取上海边界数据
loadGeoData = gp.read_file("D:\\上海边界数据.geojson")
for i in range(0, len(loadGeoData)):
    # 读取几何数据
    loadGeometry = loadGeoData.loc[i, "geometry"]
    # 上海边界的几何数据是由多个多边形组成,如崇明岛、长兴岛、上海市区等
    # 所以需要遍历所有多边形
    # 多边形的类型是Polygon或者MultiPolygon
    for j in range(0, len(loadGeometry)):
        loadPolygon = loadGeometry[j]
        # 读取多边形的边界
        # 边界的类型是LineString(单线)或MultiLineString(多线)
        if loadPolygon.boundary.geom_type == 'LineString':
            # 读取边界中的每个坐标点
            for z in range(0, len(loadPolygon.boundary.coords)):
                loadLon = loadPolygon.boundary.coords[z][0]  # 经度
                loadLat = loadPolygon.boundary.coords[z][1]  # 纬度
                # 进行大小判断,并替换结果
                if loadLon <= resultMinLon:
                    resultMinLon = loadLon
                if loadLon >= resultMaxLon:
                    resultMaxLon = loadLon
                if loadLat <= resultMinLat:
                    resultMinLat = loadLat
                if loadLat >= resultMaxLat:
                    resultMaxLat = loadLat
        elif loadPolygon.boundary.geom_type == 'MultiLineString':
            # 如果边界是MultiLineString,则需要遍历其中的每条LineString
            for z in range(0, len(loadPolygon.boundary[0].coords)):
                loadLon = loadPolygon.boundary[0].coords[z][0]
                loadLat = loadPolygon.boundary[0].coords[z][1]
                if loadLon <= resultMinLon:
                    resultMinLon = loadLon
                if loadLon >= resultMaxLon:
                    resultMaxLon = loadLon
                if loadLat <= resultMinLat:
                    resultMinLat = loadLat
                if loadLat >= resultMaxLat:
                    resultMaxLat = loadLat
# 结果输出
print("上海最小经度:", resultMinLon)
print("上海最大经度:", resultMaxLon)
print("上海最小纬度:", resultMinLat)
print("上海最大纬度:", resultMaxLat)
【数据技术】利用Python获取高德地图POI数据——以上海瑞幸门店为例
步骤2输出结果

步骤3:以四叉树索引的方式不断四分矩形,直到所有矩形符合POI数量限制

import requests
​
# 上海边界经纬度值
minLon = 120.859465  # 最小经度
maxLon = 122.122756  # 最大经度
minLat = 30.677191  # 最小纬度
maxLat = 31.868458  # 最大纬度
​
# 存放符合POI数量限制多边形的列表
resultPolygonList = []
# 用来存放不符合POI数量限制多边形的列表
currentPolygonList = [[minLon, maxLon, minLat, maxLat]]
​
# 以四叉树的方式不断四分外接矩形
for currentLevel in range(1, 9999999):
    # 用来存放不符合POI数量限制多边形的临时列表
    tempPolygonList = []
    for z in range(0, len(currentPolygonList)):
        loadMinLon = currentPolygonList[z][0]
        loadMaxLon = currentPolygonList[z][1]
        loadMinLat = currentPolygonList[z][2]
        loadMaxLat = currentPolygonList[z][3]
        # 判断当前矩形是否符合POI数量限制
        # 如果符合则放入resultPolygonList
        # 如果不符合则进行四分,并将四分结果放入tempPolygonList
        ifSatisfy = judgeIfSatisfy_GaoDe([loadMinLon, loadMaxLon, loadMinLat, loadMaxLat])
        if ifSatisfy == True:
            resultPolygonList.append([loadMinLon, loadMaxLon, loadMinLat, loadMaxLat])
        else:
            # 进行四叉树
            tempQuadtree = executeQuadtree(loadMinLon, loadMaxLon, loadMinLat, loadMaxLat)
            # 左下角
            tempPolygonList.append(tempQuadtree[0])
            # 右下角
            tempPolygonList.append(tempQuadtree[1])
            # 右上角
            tempPolygonList.append(tempQuadtree[2])
            # 左上角
            tempPolygonList.append(tempQuadtree[3])
    currentPolygonList = tempPolygonList.copy()
    # 如果没有多边形进入下一层级,则跳出
    print("第", currentLevel, "层", "......", "符合要求的矩形:", len(resultPolygonList), "......", "剩余矩形:",
          len(currentPolygonList))
    if len(currentPolygonList) == 0:
        break
【数据技术】利用Python获取高德地图POI数据——以上海瑞幸门店为例
步骤3结果

步骤4:遍历所有矩形,获取上海瑞幸POI

# 遍历所有矩形,获取上海瑞幸POI数据
savePoiList = []  # 存放POI数据的结果列表
for i in range(0, len(resultPolygonList)):
    # 读取每个矩形
    loadPolygon = resultPolygonList[i]
    # 获取矩形中的POI数据,并添加到结果列表中
    savePoiList.extend(getPoiFromPolygon(loadPolygon, gaodeKey))

下面代码为获取单个矩形中POI数据的方法

# 从单个矩形获取瑞幸POI的方法
# 其中key为高德地图API密钥,需要自行申请
def getPoiFromPolygon(inputPolygon, key):
    # 存放POI数据结果的列表
    resultList = []
    # 由于POI数量限制是100,每页返回POI数量是20
    # 因此,最大的页数为5
    for currentPage in range(1, 6):
        # 组成Url
        currentUrl = "https://restapi.amap.com/v3/place/polygon?polygon=" + str(inputPolygon[0]) + "," + str(
            inputPolygon[2]) + "|" + str(inputPolygon[1]) + "," + str(
            inputPolygon[2]) + "|" + str(inputPolygon[1]) + "," + str(inputPolygon[3]) + "|" + str(
            inputPolygon[0]) + "," + str(inputPolygon[3]) + "|" + str(inputPolygon[0]) + "," + str(
            inputPolygon[2]) + "&offset=20&page=" + str(
            currentPage) + "&keywords=瑞幸&types=050000&output=json&key=" + key
        # 发送Get请求,并接收返回内容
        response = requests.get(currentUrl, stream=True, verify=False, timeout=60)
        returnData = response.json()
        returnPoiList = returnData['pois']
        if len(returnPoiList) > 0:
            for i in range(0, len(returnPoiList)):
                saveName = returnPoiList[i]['name']
                saveType = returnPoiList[i]['type']
                saveAddress = returnPoiList[i]['address']
                saveLocation = returnPoiList[i]['location']
                saveProvince = returnPoiList[i]['pname']
                saveCity = returnPoiList[i]['cityname']
                saveArea = returnPoiList[i]['adname']
                resultList.append(
                    [saveName, saveType, saveType, saveAddress, saveLocation, saveProvince, saveCity, saveArea])
                print(saveName, saveType, saveType, saveAddress, saveLocation, saveProvince, saveCity, saveArea)
        else:
            # 如果当前页POI数量为0,则返回已获取的POI数据并跳出
            return resultList
    return resultList
【数据技术】利用Python获取高德地图POI数据——以上海瑞幸门店为例
上海瑞幸POI数据

四、代码获取方式

点击下面链接获取代码

【数据技术】利用Python获取高德地图POI数据——以上海瑞幸门店为例 (qq.com)文章来源地址https://www.toymoban.com/news/detail-452453.html

到了这里,关于【数据技术】利用Python获取高德地图POI数据——以上海瑞幸门店为例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue 高德地图(@amap/amap-jsapi-loader)的基本使用:添加标记、POI关键字搜索、路线规划...(方法一)

    具体的步骤可以参考我的上一篇博客,有详细说明如何注册申请高德的Key、秘钥,初始化地图等等 vue-amap : vue-amap 基于 Vue 2.x 与高德的地图组件 高德官方介绍:地图 JS API Web服务API简介 高德Web服务API向开发者提供HTTP接口,开发者可通过这些接口使用各类型的地理数据服务,

    2024年01月18日
    浏览(50)
  • Axure中利用JSBOX制作3D高德地图组件

    JSBOX 是一个面向 Axure 提供便捷开发方式的组件,我们将用它来制作可以显示三维白模的高德地图组件,下面是制作步骤,可以先 点击此处预览效果 将JSBOX标准版组件拖进Axure,可以见到JSBOX的载体就是一个空白的中继器: 注:不想了解代码的童鞋请到文末直接下载完成后的

    2024年02月05日
    浏览(97)
  • Echarts+高德地图,获取全国省市区,区域板块地图获取并高亮显示

    当用户选择省市区之后,可以看到对应区域的高亮显示。 如图: 之前用户选择的是江苏省,因此当前高亮显示的是江苏省地图板块,如果之前用户选择的是成都市,那么地图则会变成四川省的版图,高亮显示成都市,如下图: 可以继续下钻,选择区域高亮显示。 这里分享一个

    2024年02月16日
    浏览(49)
  • 高德API JS 高德地图获取多个坐标点的中心点

    我需要: 在地图上展示多个地点 地图缩放到合适的大小,要求刚好能显示全部点位 边缘留有一部分间隔。 做成如图所示这样。 经过一下午的研究,弄出来了。 需要以下这些 AMap 的类库: AMap.Bounds() 区域 AMap.LngLat() 点坐标(基础点位) AMap.setBounds() 设置地图区域,这会自动

    2024年02月07日
    浏览(59)
  • 高德地图根据经纬度获取地址信息

    主要是使用高德里面 地理编码与逆地理编码 的 getAddress 这个方法, 根据逆向地理编码:将地理坐标(经纬度)转换成地址描述信息,对应为AMap.Geocoder的getAddress方法。 具体使用的代码为 最后看效果 这是传的经纬度与解析出来的地理位置 如果需要正向解析将地理位置变成经

    2024年02月11日
    浏览(53)
  • 微信小程序使用高德地图获取当前定位

    1.在腾讯地图官网注册一个key(创建一个应用会自动生成一个key,详细步骤如图) 腾讯位置服务 - 立足生态,连接未来 注意点:开通webserviceAPI服务:控制台 -应用管理 - 我的应用 -添加key- 勾选WebServiceAPI - 保存 (小程序SDK需要用到webserviceAPI的部分服务,所以使用该功能的KEY需

    2024年02月06日
    浏览(64)
  • vue项目接入高德地图点击地图获取经纬度及省市区

    准备工作,可以先看官方的介绍,JSAPI结合Vue使用,这个不需要在main.js中引入 index.html中 index.vue的html部分 index.vue的script部分 index.vue的css部分 页面效果 逆解析经纬度得到的详细地址

    2024年02月16日
    浏览(53)
  • 关于升级高德地图导航9.5.0以上版本的问题 ‘com.amap.api:navi-3dmap:X.X.X_3dmapX.X.X‘

    问题(1. 最近打开项目,发现高德有新版本更新,果断更新。哈哈哈哈。然而结果好像并没有这么简单。要是世界上什么事情这么简单就好了。年轻人。还是太年轻了啊。 然后更新完最新的依赖 然后就报错了。具体就四个要点,中间一样的省略一万个字。

    2024年02月16日
    浏览(40)
  • 小程序通过经纬度获取省市区(高德地图)

    在app.js文件中引入高德地图的js文件 获取当前定位   amap-wx.130.js文件

    2024年02月08日
    浏览(56)
  • uniapp h5获取用户地理位置信息(高德地图)

     使用uni.getLocation()先获取到当前位置信息的经纬度 H5端测试可以使用http,上线打包需要设置为https模式 谷歌浏览器可能会获取不到任何信息,因为谷歌浏览器位置信息是连接谷歌服务器获取的,国内用户可能获取位置信息失败 使用高德开发平台注册一个key 高德开发平台:高

    2024年02月13日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包