百度地图开放平台web api 获取某项目方圆一公里的poi信息

百度地图开放平台web api 获取方圆一公里的poi信息

背景

手里头有集中式公寓的9个项目,并且知道对应的坐标,现在要由这9个项目出发,获取其周边一公里内的小区,地铁站,酒店等信息,仔细分析属于地理检索功能,由已知的地理位置出发,根据距离关系,检索出其周边相关poi点,一般做法有下面两种
在这里插入图片描述

  • 利用arcgis软件,把这9个项目落点到底图进去,形成一个图层layer,再把小区数据,地铁站数据,酒店数据落点到底图上形成对应的layers, 以项目为圆心,做出9个半径为1公里的圆形缓冲区,把缓冲区里面的小区图层,酒店图层和地铁站图层的目录(directory)都拎出来。
  • 利用百度地图开放平台web api接口,调用其地点检索服务,利用其中的圆形区域检索,把9个项目里面的小区,酒店,地铁都检索出来。

本次主要探讨第二个方案

完整代码

# -*- coding: utf-8 -*-
"""
project_name:集中式公寓周边一公里poi点
@author: 帅帅de三叔
Created on Tue Aug 20 11:16:10 2019
"""

import pandas as pd #导入数据分析模块
import requests #导入网页请求模块
data=pd.read_excel("集中式公寓项目.xlsx") #读取数据
lat_partion=data["百度纬度"] #纬度
lng_partion=data["百度经度"] #经度
store=data["项目名称"] #门店
targets=[] #用来存要查找的名称
addresss=[] #用来存放地址
stores=[] #用来存放项目名称
distances=[] #用来存放距离

def get_directory(keyword,radius): #定义圆形区域检索函数
    for i in range(len(lat_partion)):
        location=str(lat_partion[i])+","+ str(lng_partion[i]) #构造圆中心点的经纬度
        #print(location) #测试
        try:                
            url="http://api.map.baidu.com/place/v2/search?query="+keyword+"&page_size=10&page_num=0&location="+location+"&radius="+str(radius)+"&output=json&ak=【你的ak】&scope=2"#构造请求网址
            #print(url) #测试请求接口拼接是否正确,此url可以直接复制到浏览器查看返回结果
            response=requests.get(url) #发出请求
            answer=response.json() #返回结果json化
            #print(answer) #测试
            print("一共%s条数据"%len(answer['results']))
            for k in range(len(answer['results'])):  
                target=answer['results'][k]['name'] #标的物名称
                address=answer['results'][k]['address'] #地址
                distance=answer['results'][k]['detail_info']['distance'] #距离
                targets.append(target)
                addresss.append(address)
                stores.append(store[i])
                distances.append(distance)
                print(target,distance,address)
        except:
            print("the circle contains no message")
            stores.append(store[i])
            targets.append("")
            distances.append("")
            addresss.append("")
           
if __name__=='__main__':
    keyword=input("please input the keywords:") #输入poi的关键词
    radius=input("please input the radius:") #输入半径
    get_directory(keyword,radius) #调用函数get_directory
    dict={"项目名称":stores,"标的物":targets,"距离":distances,"地址":addresss} #构造字典
    df=pd.DataFrame(dict)
df.to_excel("检索结果.xlsx") 

代码解读

整个流程是当你输入关键词,如“公司”,再输入距离(单位是米),如“1000”,然后调用get_directory()函数,把返回的结果json化,提取里面的公司名称,距离,地址等信息,并追加起来,然后字典化处理形成数据框,最后写入到excel表

在这里插入图片描述
从excel表可以看到这个一个1对多的映射关系,比如上海昌林路店这个项目周边一公里就有10个公司,代码的关键是读取原数据,提取经纬度数据,并构造圆中心点的经纬度数据location=str(lat_partion[i])+","+ str(lng_partion[i]) ,然后放到请求地址里面去,利用循环不断请求,不断解析保存。

改进思路

后续发现还需要周边poi的经纬度信息,故需要添加两个字段,一个是经度,一个是纬度,同时在使用try except 的同时会掩盖很多真实情况,以后在写程序的时候会考虑尽量少用这个结构来规避报错。

改进的代码

# -*- coding: utf-8 -*-
"""
project_name:周边一公里poi点检索
@author: 帅帅de三叔
Created on Tue Aug 20 11:16:10 2019
"""
import pandas as pd #导入数据分析模块
import requests #导入网页请求模块
data=pd.read_excel("检索.xlsx") #读取数据
lat_partion=data["百度纬度"] #纬度
lng_partion=data["百度经度"] #经度
center=data["检索中心"] #检索中心
targets=[] #用来存要查找的名称
addresss=[] #用来存放地址
centers=[] #用来检索中心的名称
distances=[] #用来存放距离
lngs=[] #用来存目标放经度
lats=[] #用来存目标放纬度
def get_directory(keyword,radius): #定义圆形区域检索函数
    for i in range(len(lat_partion)):
        location=str(lat_partion[i])+","+ str(lng_partion[i]) #构造圆中心点的经纬度
        print(location) #测试请求url               
        url="http://api.map.baidu.com/place/v2/search?query="+keyword+"&page_size=20&page_num=0&location="+location+"&radius="+str(radius)+"&output=json&ak=rSXLRzPzHMcvSy1V33SNE111wx7UHEYB&scope=2"#构造请求网址
        #print(url) #测试请求接口拼接是否正确,此url可以直接复制到浏览器查看返回结果
        response=requests.get(url) #发出请求
        answer=response.json() #返回结果json化
        #print(answer) #测试
        print("一共%s条数据"%len(answer['results']))
        for k in range(len(answer['results'])):  
            try:
                target=answer['results'][k]['name'] #标的物名称
                targets.append(target)
            except:
                targets.append("")
            try:
                address=answer['results'][k]['address'] #地址
                addresss.append(address)
            except:
                addresss.append("")
            try:
                distance=answer['results'][k]['detail_info']['distance'] #距离
                distances.append(distance)
            except:
                distances.append("")
            try:
                longitude=answer['results'][k]['location']['lng'] #导航引导点经度
                lngs.append(longitude)
                print(longitude)
            except:
                lngs.append("")
            try:
                latitude=answer['results'][k]['location']['lat'] #导航引导点纬度
                lats.append(latitude)
                print(latitude)
            except:
                lats.append("")      
            centers.append(center[i])
            print(center[i],target,longitude,latitude,distance,address) #测试结果 longitude,latitude
if __name__=='__main__':
    keyword=input("please input the keywords:") #输入poi的关键词
    radius=input("please input the radius:") #输入半径
    get_directory(keyword,radius) #调用函数get_directory
    dict={"中心":centers,"标的物":targets,"百度经度":lngs,"百度纬度":lats,"距离":distances,"地址":addresss} #构造字典
    df=pd.DataFrame(dict)
df.to_excel("检索结果.xlsx") 

如果还有不懂的话可以关注“三行科创”公众号,进交流群一起交流。

延申阅读
百度AI开放平台情感分类
百度地图开放平台web api 获取上海市所有小区信息

在这里插入图片描述

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
当然可以!你可以按照以下步骤在 Android Studio 中创建一个项目,并使用百度地图 API 来搜索民宿并获取相关信息。 1. 首先,确保你已经在百度开放平台上注册并创建了一个应用,获取到了对应的 API Key。 2. 在 Android Studio 中创建一个新的项目。 3. 在项目的 `build.gradle` 文件中添加以下依赖项,以引入百度地图 SDK: ```groovy implementation 'com.baidu.lbsapi:base:12.1.5' implementation 'com.baidu.lbsapi:search:7.1.0' ``` 4. 在你的 `AndroidManifest.xml` 文件中添加以下权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> ``` 5. 创建一个 `MainActivity` 类,并在布局文件中添加一个按钮和一个用于显示结果的文本视图。 6. 在 `MainActivity` 类中,添加以下代码来初始化百度地图 SDK: ```java import com.baidu.mapapi.SDKInitializer; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 初始化百度地图 SDK SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); } } ``` 7. 在按钮的点击事件中,添加以下代码来进行搜索并获取民宿信息: ```java import com.baidu.mapapi.search.core.SearchResult; import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener; import com.baidu.mapapi.search.poi.PoiCitySearchOption; import com.baidu.mapapi.search.poi.PoiDetailSearchOption; import com.baidu.mapapi.search.poi.PoiResult; import com.baidu.mapapi.search.poi.PoiSearch; import com.baidu.mapapi.search.poi.PoiSortType; public class MainActivity extends AppCompatActivity { private Button searchButton; private TextView resultTextView; private PoiSearch poiSearch; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); searchButton = findViewById(R.id.search_button); resultTextView = findViewById(R.id.result_text_view); searchButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 创建 PoiSearch 实例 poiSearch = PoiSearch.newInstance(); // 设置搜索结果监听器 poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() { @Override public void onGetPoiResult(PoiResult poiResult) { if (poiResult == null || poiResult.error != SearchResult.ERRORNO.NO_ERROR) { // 搜索失败 return; } // 获取到搜索结果,处理民宿信息 // 可以通过 poiResult.getAllPoi() 获取到所有的民宿信息 // 将结果显示在文本视图中 resultTextView.setText(poiResult.getAllPoi().toString()); } @Override public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) { // 获取单个民宿的详细信息 } }); // 设置搜索参数,并发起搜索 PoiCitySearchOption searchOption = new PoiCitySearchOption() .city("城市名称") .keyword("民宿") .pageNum(0) // 搜索页码,默认从0开始 .pageCapacity(10) // 每页搜索结果数量,默认为10条 .sortType(PoiSortType.distance_from_near_to_far); // 搜索结果排序方式 poiSearch.searchInCity(searchOption); } }); } } ``` 请注意,你需要将代码中的 `"城市名称"` 替换为你要搜索的城市名称。 这样,当你点击按钮时,就会进行搜索并将结果显示在文本视图中。你可以根据实际需求进一步处理搜索结果。 希望这能帮到你!如果有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三行数学

赞赏也是一种肯定!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值