下載特定區域內街景照片資料 | Download Street View Photos within Selected Region

天靖居士發表於2017-10-20

作者:姜虹,劉子煜,王玥瑤,楊安琪,天靖居士

街景圖片可以通過api下載,但需要提供引數,引數中的poiid、panoid、location可以用來確定位置或全景圖片的ID以確定對應的街景圖片。優先順序為poiid>panoid>location。為了能夠獲得一定經緯度範圍內的全部街景圖片,需要先獲取上述三個引數中的至少一個,這裡採用arcgis中沿道路等距採點的方法,來對應獲得範圍內的全部街景圖。簡而言之,首先獲取路網資料,之後沿著路網進行等間距採點,獲取大量經緯度點,再根據這些點的座標獲取相應的街景圖片資料即可。

路網資料的下載

首先需要根據給定的範圍下載路網資料,這裡使用OSM(Open Street Map)下載,使用OSM下載資料的方法有很多,這篇知乎專欄的文章列出了多種方法,這裡採用第二種通過安裝通過ArcGIS Editor for OpenStreetMap外掛的方法下載。
下載地址:http://www.esri.com/software/arcgis/extensions/openstreetmap
下載的時候要注意已裝的arcgis版本,外掛的版本要與其對應。
下載後將其安裝到arctoolbox中,單擊”Download OSM data”設定引數即可下載。需要注意下載的範圍不能過大,否則會報錯,下載路徑一定要是地理資料庫,否則檔案無法載入會出錯。在需要下載範圍較大的資料時可以分割槽下載。
下載特定區域內街景照片資料 | Download Street View Photos within Selected Region
下載特定區域內街景照片資料 | Download Street View Photos within Selected Region

下載好路網資料後,如果需要獲取行政區範圍的資料,可以使用不規則的政區邊界進行裁切,可以使用ArcGIS中的merge工具。

對道路進行採點

先對圖層座標系進行變換,使其與百度地圖投影座標系一致,確保採點座標無誤。
下載特定區域內街景照片資料 | Download Street View Photos within Selected Region

採點使用CreatePiontsLines工具,下載網址:https://github.com/kkyyhh96/CollectGISData
選中需要採點的道路段,執行CreatePointsLines工具,設定引數,型別選擇“INTERVAL BY DISTANCE”.
下載特定區域內街景照片資料 | Download Street View Photos within Selected Region
下載特定區域內街景照片資料 | Download Street View Photos within Selected Region
下載特定區域內街景照片資料 | Download Street View Photos within Selected Region

可以通過ArcGIS中的測量工具檢驗兩點之間的距離:
下載特定區域內街景照片資料 | Download Street View Photos within Selected Region

採點之後需要獲取點的座標,並以表的形式儲存,方便呼叫api下載圖片時使用。
開啟採點圖層的屬性表,首先新增經緯度欄位:
下載特定區域內街景照片資料 | Download Street View Photos within Selected Region

在屬性表中右鍵單擊經度欄位名,選擇“計算幾何”並設定引數,同理對緯度也進行計算:
下載特定區域內街景照片資料 | Download Street View Photos within Selected Region
下載特定區域內街景照片資料 | Download Street View Photos within Selected Region

之後要將採點圖層的屬性表資訊(經緯度)匯出.dbf檔案:
下載特定區域內街景照片資料 | Download Street View Photos within Selected Region
下載特定區域內街景照片資料 | Download Street View Photos within Selected Region

使用excel開啟.dbf檔案:
下載特定區域內街景照片資料 | Download Street View Photos within Selected Region

修改為以下格式,並儲存為.csv檔案:

下載特定區域內街景照片資料 | Download Street View Photos within Selected Region
下載特定區域內街景照片資料 | Download Street View Photos within Selected Region

下載百度全景圖

下面是呼叫百度api金鑰下載全景圖的過程
百度地圖的api申請比較方便,其提供的全景地圖api可以用來下載街景圖片,下面是引數和說明:
下載特定區域內街景照片資料 | Download Street View Photos within Selected Region

需要注意的是,引數中的“pitch”範圍為[0,90],因此只能下載水平到豎直向下的90度範圍視角的圖片,無法下載水平視角及以上的圖片。
首先進入百度地圖api首頁,在下方選擇開發者認證.
填寫資訊完成認證並啟用,之後就可以申請開發者金鑰了。
下載百度全景圖片的程式碼如下,替換自己申請的apikey就可以了:

# coding: utf-8
# version: python3.5
# author: Yuhao Kang
# collect street view data from BaiduMap

import requests


# Baidu API request
class BaiduAPI(project):
    def __init__(self):
        # Your baidu api key
        self.api_key = "                "

    # Each search request
    def search_photo(self, longitude, latitude):
        params = {
            "ak": self.api_key,
            "coordtype": "wgs84ll",
            "location": "{0},{1}".format(longitude, latitude),
            "fov": 360 #設定為360即為全景圖
        }
        try:
            # Download pictures
            r = requests.get("http://api.map.baidu.com/panorama/v2", params)
            open("{0}_{1}.png".format(longitude, latitude), 'wb').write(r.content)
        except Exception as e:
            open("e:log.txt", 'a').writelines(e)


if __name__ == '__main__':
    # Read data from csv
    with open('data.csv', 'r') as data:
        lines = data.readlines()
        for line in lines:
            # Get coordinates
            longitude = line.split(',')[0]
            latitude = line.split(',')[1]
            # Get pictures
            baidu = BaiduAPI()
            baidu.search_photo(longitude, latitude)

需要注意的是,在國內除了百度地圖可以下載全景圖之外,也可以使用騰訊地圖下載全景圖。相比較於百度地圖,騰訊地圖API提供了反查的方法,即可以通過照片的ID獲取照片的精確位置。但騰訊地圖API獲取較為麻煩,需要企業帳號。
騰訊地圖API獲取地址:http://lbs.qq.com/

相關文章