1. 程式人生 > >高德地圖之根據矩形範圍爬取範圍內的分類POI資料

高德地圖之根據矩形範圍爬取範圍內的分類POI資料

     之前寫了一篇在城市範圍內根據關鍵字爬取POI資料的部落格,由於一個城市的POI資料量太大,高德地圖介面容易返回錯誤資料,因此有個比較好的辦法就是藉助高德地圖POI搜尋中根據多邊形範圍或矩形範圍搜尋POI資料,具體分為兩個步驟:其一是將城市分為多個小矩形(得到左上和右下兩個頂點的座標即可);二是根據得到的矩形座標呼叫高德地圖WEB API得到資料解析即可。這篇文章主要是記錄根據矩形範圍搜尋POI的流程,至於如何切分城市為矩形,我也還沒弄過,可以自行百度搜索解決。

     先看下爬取到的資料吧:

http://restapi.amap.com/v3/place/polygon?polygon=116.80708,31.449926,117.510206,32.247823&key=c5304f29d1a11f14c4fb29854a831ef0&extensions=all&offset=25&page=1&keywords=%E5%A4%A7%E5%AD%A6

引數說明:

               polygon:多邊形邊界範圍(或者是矩形左上和右下兩個頂點座標)

               key : 高德地圖web api申請的金鑰key

               extensions :此項預設返回基本地址資訊;取值為all返回地址資訊、附近POI、道路以及道路交叉口資訊。

               offset :分頁的頁大小

               page:請求的頁碼

其餘的具體引數介紹詳見文件說明。

可以在瀏覽器看到示例URL返回的資料。剩餘的就是迴圈獲取資料,然後解析入庫的事情了,挺簡單的。這裡就直接貼上程式碼了:

from urllib.parse import quote
from urllib import request
import json
import xlwt

# TODO
amap_web_key = '你申請的AK'  # 高德地圖官網申請的Web API KEY
filename = r'C:\study\hehe.xls'     # 爬取到的資料寫入的EXCEL路徑

# 矩形邊界集合
polygon_list = ['116.80708,31.449926,117.510206,32.247823','116.80708,31.449926,117.158643,31.8488745','116.80708,31.449926,116.9828615,31.64940025','116.9828615,31.449926,117.158643,31.64940025','116.80708,31.64940025,116.9828615,31.8488745','116.9828615,31.64940025,117.158643,31.8488745','117.158643,31.449926,117.510206,31.8488745','117.158643,31.449926,117.3344245,31.64940025','117.3344245,31.449926,117.510206,31.64940025','117.158643,31.64940025,117.3344245,31.8488745','117.158643,31.64940025,117.24653375,31.749137375','117.24653375,31.64940025,117.3344245,31.749137375','117.158643,31.749137375,117.24653375,31.8488745','117.24653375,31.749137375,117.3344245,31.8488745','117.3344245,31.64940025,117.510206,31.8488745','116.80708,31.8488745,117.158643,32.247823','117.158643,31.8488745,117.510206,32.247823','117.158643,31.8488745,117.3344245,32.04834875','117.3344245,31.8488745,117.510206,32.04834875','117.3344245,31.8488745,117.42231525,31.948611625','117.42231525,31.8488745,117.510206,31.948611625','117.3344245,31.948611625,117.42231525,32.04834875','117.42231525,31.948611625,117.510206,32.04834875','117.158643,32.04834875,117.3344245,32.247823','117.3344245,32.04834875,117.510206,32.247823']

# POI分類集合
#class_list = ['商城', '超級市場']
type_list = '060401|060402|060403|060404|060405|060406|060407|060408|060409|060411|060413|060414|060415|060100|060101|060102|060103'

poi_search_url = "http://restapi.amap.com/v3/place/polygon"  # URL

offset=25  # 分頁請求資料時的單頁大小

# 根據矩形座標獲取poi資料
def getpois(polygon, type_list):
    i = 1
    current_polygon_poi_list = []
    while True:  # 使用while迴圈不斷分頁獲取資料
        result = getpoi_page(polygon, i, type_list)
        result = json.loads(result)  # 將字串轉換為json

        #print('第', str(i),'頁,結果',result)

        if result['status'] is not '1':  # 介面返回的狀態不是1代表異常
            print('======爬取錯誤,返回資料:' + result)
            break
        pois = result['pois']
        if len(pois) < offset:  # 返回的資料不足分頁頁大小,代表資料爬取完
            current_polygon_poi_list.extend(pois)
            break
        current_polygon_poi_list.extend(pois)
        i += 1
    print('===========當前polygon:', polygon,',爬取到的資料數量:' ,str(len(current_polygon_poi_list)))

    return current_polygon_poi_list




# 單頁獲取pois
'''
http://restapi.amap.com/v3/place/polygon?polygon=116.80708,31.449926,117.510206,32.247823&key=c5304f29d1a11f14c4fb29854a831ef0&extensions=all&offset=5&page=1
'''
def getpoi_page(polygon, page, type_list):
    req_url = poi_search_url + "?key=" + amap_web_key + '&extensions=all&polygon=' + polygon + '&offset=' + str(offset) + '&types=' + type_list + '&page=' + str(page) + '&output=json'
    data = ''
    with request.urlopen(req_url) as f:
        data = f.read()
        data = data.decode('utf-8')
    return data

# 資料寫入excel
def write_to_excel(poilist, filename):
    # 一個Workbook物件,這就相當於建立了一個Excel檔案
    book = xlwt.Workbook(encoding='utf-8', style_compression=0)
    sheet = book.add_sheet('0', cell_overwrite_ok=True)
    # 第一行(列標題)
    sheet.write(0, 0, 'id')
    sheet.write(0, 1, 'name')
    sheet.write(0, 2, 'location')
    sheet.write(0, 3, 'type')
    for i in range(len(poilist)):
        sheet.write(i + 1, 0, poilist[i]['id'])
        sheet.write(i + 1, 1, poilist[i]['name'])
        sheet.write(i + 1, 2, poilist[i]['location'])
        sheet.write(i + 1, 3, poilist[i]['type'])
    book.save(filename)


all_poi_list = [] #爬取到的所有資料

for polgon in polygon_list:
    polygon_poi_list = getpois(polgon, type_list)
    all_poi_list.extend(polygon_poi_list)

print('爬取完成,總的數量', len(all_poi_list))
write_to_excel(all_poi_list, filename)
print('寫入成功')

自己執行的話需要修改的地方都在程式碼上方位置,具體的說明在程式碼中已有註釋。

相關推薦

地圖根據矩形範圍範圍分類POI資料

     之前寫了一篇在城市範圍內根據關鍵字爬取POI資料的部落格,由於一個城市的POI資料量太大,高德地圖介面容易返回錯誤資料,因此有個比較好的辦法就是藉助高德地圖POI搜尋中根據多邊形範圍或矩形範圍搜尋POI資料,具體分為兩個步驟:其一是將城市分為多個小矩形(得到左上和右

地圖駕車跨城路線

我要爬取這張地圖的底圖的那些線。   F12找到url https://report.amap.com/crossCityStatis/queryAll.do?date=2018-10-16  寫程式碼處理這些資料 import pandas as pd

(六)地圖駕車路線規劃

在專案中用到地圖的地方往往會有導航功能,那麼這一節將介紹一下使用高德地圖來實現駕車路線規劃的功能。 首先來兩張示例圖供參考:                       &nbs

(五)地圖新增groundoverlay覆蓋物

本節主要實現的功能是往地圖上新增一個groundoverlay覆蓋物,用此方式可以實現公園電子導遊,下面先來看一張效果圖吧: 接下來我們還是直接上程式碼: 新建佈局檔案activity_groundoverlay.xml <?xml version="1.0" encod

(四)地圖定位的幾種模式

這一節主要實現的功能是地圖定位的幾種模式,包括展示、定位、追隨、旋轉、旋轉位置、跟隨不移動中心點、旋轉不移動中心點、旋轉位置不移動到中心點,我們根據實際需要來選擇用那種模式。下面還是主要從程式碼中來體現,主要部分有註釋。 還是先新建佈局檔案:activity_locationmodesour

(三)地圖自定義縮放及縮放動畫效果

這一節主要實現的功能是地圖的自定義縮放及縮放的動畫效果,還是直接放上程式碼更直觀些,主要部位裡面基本有註解 還是老樣子,首先是新建activity_zoom_animate.xml佈局檔案 <?xml version="1.0" encoding="utf-8"?> <

(二)地圖手勢互動

上一結主要介紹瞭如何繼承高德地圖,以及地圖的幾種不同的顯示方式,那麼本節我們接著往下看,這一節主要介紹地圖的手勢互動功能,其中包括滑動手勢(地圖是否可以滑動)、縮放手勢(是否可以通過手勢放大縮小地圖)、切斜手勢以及旋轉手勢,另外又加了兩小部分,地圖的單擊、長按、觸控事件,比如點一下獲取地圖上點選

(一)地圖基本屬性以及顯示模式

       我們在開發中常常會用到地圖功能,那麼我們最常用的就是百度地圖和高德地圖了,今天我們就來看一下高德地圖怎麼用,我個人認為高德地圖封裝的還是比較好的,使用起來方便快捷。 首先我們需要到高德開發者平臺註冊賬號,根據API進行操作即可,高德開放平

地圖軌跡回放

最近專案中有需要做車輛的軌跡回放功能,在這裡就給打分享一下還是挺簡單的。 <!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Com

地圖周邊搜尋及兩點間距離計算(Poi的使用)

最近比較閒,所以就順便研究高德地圖,原因是之前基本上都用的百度地圖,但是百度地圖的程式碼太多了,兩字,很煩。 先來個效果圖: 藍色的marker就是點選的,藍色的圓圈是我當前位置。 apk下載地址:http://download.csdn.net/de

安卓地圖API根據城市名獲取對應的經緯度和地理編碼

private void getLatlon(String cityName){ GeocodeSearch geocodeSearch=new GeocodeSearch(con

Android地圖多InfoWindow

本文是高德地圖系列的最後一文,因為光是寫這幾篇博文,就花去了我一整天時間,什麼也沒做,甚至飯也沒吃,做了一整天,現在身體已經空蕩蕩了,而且最近一段時間工作很忙,每天都很累,所以打算多去鍛鍊身體。有任何疑問也可以留言。 最終效果:生成marker並顯示詳情

地圖改變圖示

一、準備工作 1、獲取LatLng物件 2、可以通過BitmapDescriptorFactory獲得一個BitmapDescriptor物件。 3、定義了一個marker的選項 二、核心程式碼:

地圖地理編碼

首先申明是地理編碼呢?地理編碼,又稱為地址匹配,是從已知的地址描述到對應的經緯度座標的轉換過程。該功能適用於根據使用者輸入的地址確認使用者具體位置的場景,常用於配送人員根據使用者輸入的具體地址找地點。既地理編碼(地址轉座標)。 下面一步步來看怎麼實現的:

地圖逆地理編碼

上一篇講述了地理編碼的使用,沒看的朋友可以看看http://blog.csdn.net/hedong_77/article/details/54287292,Ok,我們繼續來看你地理編碼,首先要理解它的概念,逆地理編碼,又稱地址解析服務,是指從已知的經緯度座標到

Android地圖基礎

最終效果圖1:選擇日曆選擇日期,其中有下標的日期是有資料的,點選顯示當天地圖上的資料 效果圖2: 生成marker並顯示詳情 由於不能上傳2M以上的截圖,只錄了重點,廢話不多講,速度上車。 - 申請賬號 http://lbs.amap.com

地圖JavaScript根據後臺座標點繪製軌跡

專案中用到所以看了一下,可以完善之處請指正 <script type="text/javascript">              //這裡可以傳入後臺的json資料,類似此格式  

地圖拾取地點

高德地圖官方有API,有文件,但是大家懂的,有些東西並沒有說明。所以,我打算將自己實現對高德地圖展示、定位以及導航的功能步驟做一個總結,分享給大家。本文作為總結高德地圖使用,首先總結自己對於拾取地點這樣的功能的實現。 第一步,準備工作: 首先,我們需要去

python實戰網路爬蟲(新聞文資訊)

(1)前期準備:開啟谷歌瀏覽器,進入新浪新聞網國內新聞頁面,點選進入其中一條新聞,開啟開發者工具介面。獲取當前網頁資料,然後使用BeautifulSoup進行剖析,程式碼: import requests from bs4 import BeautifulSoup res = requests.

喜歡抖音上面的音樂怎麼辦?用Python音樂並分類放置資料

最近小編也在刷著抖音,上面的小哥哥、小姐姐各個都是人才,小編超喜歡裡面的 歌也挺好聽的,小編就打算把抖音上面歌曲都下載並且分類,把自己的喜歡的歌換成手機鈴聲,那麼抖音上面都有那些好聽的歌呢,比如: 《最美的期待》 周筆暢 《那個人》 周延英 《Panama》 Matteo 《病變