前言
不管是GIS空間分析叉谜、城市規(guī)劃旗吁,還是地理數(shù)據(jù)的管理和統(tǒng)計(jì),如何獲取統(tǒng)計(jì)單元的邊界停局,常常會(huì)困擾我們很钓。調(diào)研的數(shù)據(jù)往往需要耗費(fèi)大量的人力物力,而網(wǎng)上又很難找到公開的數(shù)據(jù)董栽。其實(shí)許多互聯(lián)網(wǎng)地圖已經(jīng)有了這些數(shù)據(jù)码倦,本文朕將與愛卿們探討從互聯(lián)網(wǎng)地圖中獲取數(shù)據(jù)的一種思路。
-
谷歌瀏覽器中打開互聯(lián)網(wǎng)地圖(這里以百度地圖為例)锭碳,按鍵盤F12調(diào)出調(diào)試界面诈铛。
-
找到調(diào)試面板中的network這一選項(xiàng),點(diǎn)擊clear按鈕集灌,先清除所有監(jiān)控绽乔。
-
在搜索框中搜索需要的獲取的區(qū)域邊界,如搜索“深圳大學(xué)”闻葵,在地圖中會(huì)顯示相應(yīng)的區(qū)域民泵,藍(lán)色虛線邊界的區(qū)域就是我們要獲取的區(qū)域。
-
對(duì)network中的要素按type排序槽畔,找到所有xhr類型的文件栈妆。
-
在xhr文件中,有一項(xiàng)格式類似下圖所示的文件厢钧,點(diǎn)擊打開鳞尔。
-
在右側(cè)的preview欄中找到content底下有一個(gè)geo的屬性,其中紅框內(nèi)的數(shù)據(jù)就是我們要獲取的區(qū)域邊界坐標(biāo)(如果沒有找到早直,嘗試查看其他xhr文件)寥假。
-
為了更好地處理這些坐標(biāo),先復(fù)制下來霞扬,觀察它的特征糕韧,發(fā)現(xiàn)這一系列數(shù)字是將邊界的xy依次列出,用逗號(hào)隔開的喻圃。為了方便處理萤彩,可以將格式整理為如下圖所示的csv文件。(文末附有轉(zhuǎn)換的python程序斧拍,僅供參考)
-
打開arcmap雀扶,添加剛剛生成的csv文件,右鍵肆汹,選擇display XY Data愚墓。
-
在彈出的對(duì)話框中分別選擇X與Y的字段與相應(yīng)的坐標(biāo)系(當(dāng)前應(yīng)選擇米制坐標(biāo)系)予权。
-
這樣,就可以生成地塊邊界點(diǎn)圖層了浪册。下圖所示為點(diǎn)圖層轉(zhuǎn)換為面圖層需要用到的工具扫腺。
由于我們獲取到的坐標(biāo)采用的是BD09坐標(biāo),與常用的GPS坐標(biāo)有偏差(如上圖议经,深圳大學(xué)被偏移到了香港)斧账,需要將百度的坐標(biāo)轉(zhuǎn)換為GPS坐標(biāo)。但是煞肾,百度并不會(huì)公開轉(zhuǎn)換的算法咧织,也不會(huì)提供相應(yīng)的接口,這里提供一種轉(zhuǎn)換思路籍救,僅供參考习绢。
百度坐標(biāo)和GPS坐標(biāo)轉(zhuǎn)換在很近的距離時(shí)偏差非常接近, 通過計(jì)算就可以得到GPS的坐標(biāo)蝙昙。
假設(shè)有百度坐標(biāo):x1=116.397428闪萄,y1=39.90923,把這個(gè)坐標(biāo)當(dāng)成GPS坐標(biāo)奇颠,通過坐標(biāo)轉(zhuǎn)換接口獲得其百度坐標(biāo): x2=116.41004950566败去,y2=39.916979519873
通過計(jì)算就可以得到GPS的坐標(biāo):
x = 2x1-x2,y = 2y1-y2
x=116.38480649434001
y=39.901480480127
-
轉(zhuǎn)換后再將得到的GPS坐標(biāo)轉(zhuǎn)為點(diǎn)和面烈拒,最終得到的shp圖層如下圖:
熟悉了流程之后圆裕,不管是小區(qū)、大廈荆几、學(xué)校吓妆,還是行政區(qū)的邊界,都可以輕松獲取到吨铸,再也不會(huì)再為統(tǒng)計(jì)單元數(shù)據(jù)獲取而愁了行拢。本文僅提供一種思路,如果你有更好的方法诞吱,歡迎來騷擾朕舟奠。
附-轉(zhuǎn)換格式python代碼:
file_r = open('data/xy.txt', 'r')
file_w = open('result/result.csv', 'w')
first_line = file_r.readline()
xy_split = first_line.split(',')
file_w.write('x,y\n')
i=0
for xy in xy_split:
if i%2==0:
file_w.write(xy+',')
else:
file_w.write(xy + '\n')
i=i+1
file_r.close()
file_w.close()