如何用Python批量下載衛星地圖


這篇文章是我17年寫的。

前言

作為城鄉規划的學生,有時需要某一個城市片區的衛星地圖作為設計作業的底圖,地圖從何來?百度?高德?谷歌?但是它們都只提供了瀏覽的服務啊。市面上倒是有不少自動的地圖下載器。什么Bigemap啊、水經注啊、91衛圖,啥的,但是它們都不是完全免費的(免費版有水印),想要授權就要幫它們推廣或者花錢買。蛋疼。。。

然而作為會編程的人,怎么能讓這種事情難住?

網上有不少文章分析了地理坐標系、投影坐標系的原理,還有各大地圖網站瓦片的分割方式,也有提供下載的網址,只要把瓦片坐標系和縮放級別填到指定的位置,就可以下載到地圖的瓦片。

參考文章如下:
客戶端地圖拼圖算法解析
WGS84經緯度坐標與web墨卡托之間的轉換【轉】
國內主要地圖瓦片坐標系定義及計算原理
Google 地圖切片URL地址解析
騰訊與百度地圖瓦片規則分析

看了這些文章以后,就會理解網絡地圖的分片原理,並且知道在瀏覽器中,是可以看到這些瓦片的地址的,只要我們知道從經緯度到瓦片坐標的轉換方法,就可以在已知經緯度范圍的情況下,下載這一范圍內的地圖。

谷歌地圖

對於坐標偏移問題,國內的經緯度坐標在WGS-84的基礎上經過了一些偏移(不是單純的線性,但是在一定范圍內長度面積什么的還是不會變形的,不然國內地圖怎么導航?),也就是在高德等地圖上采集到的坐標並不是WGS-84的坐標,而是GCJ-02坐標。在參考文章中用的谷歌的源就是國內的源(.cn結尾嘛)。不過對於當底圖來看就夠用了,實測應該使用http://www.google.cn/maps/采集到的經緯度來進行下載前的坐標獲取。

難道瓦片坐標也進行了相應的偏移?
再次詳細試驗,發現gl參數決定了衛星圖是否會偏移。

假設不加這個參數,會按WGS-84來,會和路線圖有偏移(因為路線圖只有GCJ-02的版本)
加了這個參數(gl=CN)就會使衛星圖也變成GCJ-02。
也就是說,如果你使用www.google.cn/maps或者ditu.google.cn來獲取坐標,那么最后你還按照這個坐標進行瓦片的獲取,同時加上gl參數即可。如果你想按照WGS-84來獲取坐標,那么就訪問國際版的谷歌地圖
,獲取瓦片時不加gl參數就好了。

瓦片參數解析:
http://mt{index}.google.com/vt/lyrs={style}&hl=zh-CN&gl=CN&src=app&x={x}&y={y}&z={z}"
{index}為0到3,分別為谷歌的4個服務器,隨便取一個就行~

{style}為地圖的類型,比如衛星圖、路線圖什么的.

m:路線圖
t:地形圖
p:帶標簽的地形圖
s:衛星圖
y:帶標簽的衛星圖
h:標簽層(路名、地名等)

其中m路線圖和s衛星圖是我們想要的。
{x}{y}{z} 則分別是瓦片坐標的xy和縮放級別z,z取0-22。但是我測試發現衛星圖最大只能取到20。不過即使是路線圖,到20級也就足夠用了。

對於python3,可以用urllib.request庫進行圖片的下載,然后用PIL.Image庫(pillow)進行圖片的合並。
如果想下載快一些,還可以使用多線程。

高德地圖

高德地圖的坐標是GCJ-02坐標(國內的所有地圖都是,有的還進行了二次加偏)
至於怎么在高德地圖上看坐標:高德地圖怎么看經緯度
還是谷歌方便啊,直接地址欄就有,汗。。。。
高德的瓦片分割方式和谷歌的一樣。
這里是瓦片的下載網址:
http://wprd03.is.autonavi.com/appmaptile?style=7&x=427289&y=227618&z=19
經過我的測試
style=7是路線圖,6的話是衛星圖。其他就不知道了。
實際測試中style=8好像是單獨的路線層,背景為透明,結合ltype參數還有不同效果,這個以后可以慢慢摸索。我只下載最基本的圖,這里就不深入討論了。不過也基本夠用了。一般不也就要這兩個這嗎?
x和y自然就是瓦片的坐標,z自然是縮放級別了。高德的z取值范圍是[1,19]。不過衛星圖實測只能取到18。
wprd03想必是和谷歌一樣,有多個服務器提供服務。測試下來可以取到01 到 04。
也就是說,把同樣的xyz從谷歌地圖(中國版)填到高德里面,可以得到同一塊地方的瓦片!

百度地圖等

從資料看,百度的坐標在GCJ-02的基礎上二次加偏形成了BD-09。百度的瓦片分割方式也和高德谷歌不一樣,處理起來略麻煩,就不管了~~
騰訊地圖則是瓦片坐標原點在左下角,而谷歌在左上角。xy的輸入方式是進行一定的編碼。

好麻煩。。。感覺有倆就夠用了,其他的就不管了。

源代碼參見我的Github項目
https://github.com/modyuan/getmap


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM