作者:姜虹,劉子煜,王玥瑤,楊安琪,天靖居士
街景圖片可以通過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”設置參數即可下載。需要注意下載的范圍不能過大,否則會報錯,下載路徑一定要是地理數據庫,否則文件無法載入會出錯。在需要下載范圍較大的數據時可以分區下載。
下載好路網數據后,如果需要獲取行政區范圍的數據,可以使用不規則的政區邊界進行裁切,可以使用ArcGIS中的merge工具。
對道路進行采點
先對圖層坐標系進行變換,使其與百度地圖投影坐標系一致,確保采點坐標無誤。
采點使用CreatePiontsLines工具,下載網址:https://github.com/kkyyhh96/CollectGISData
選中需要采點的道路段,運行CreatePointsLines工具,設置參數,類型選擇“INTERVAL BY DISTANCE”.
可以通過ArcGIS中的測量工具檢驗兩點之間的距離:
采點之后需要獲取點的坐標,並以表的形式存儲,方便調用api下載圖片時使用。
打開采點圖層的屬性表,首先添加經緯度字段:
在屬性表中右鍵單擊經度字段名,選擇“計算幾何”並設置參數,同理對緯度也進行計算:
之后要將采點圖層的屬性表信息(經緯度)導出.dbf文件:
使用excel打開.dbf文件:
修改為以下格式,並存儲為.csv文件:
下載百度全景圖
下面是調用百度api密鑰下載全景圖的過程
百度地圖的api申請比較方便,其提供的全景地圖api可以用來下載街景圖片,下面是參數和說明:
需要注意的是,參數中的“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/