您現在的位置是:首頁 > 遊戲

「情報百科」如何從開放的地理資訊系統(GIS)中獲取資料

由 網路情報研究 發表于 遊戲2022-01-03
簡介f=json&where=1=1&returnGeometry=false&spatialRel=esriSpatialRelIntersects&outFields=*&orderByFields=

情報資訊怎麼找

「情報百科」如何從開放的地理資訊系統(GIS)中獲取資料

「情報百科」如何從開放的地理資訊系統(GIS)中獲取資料

圖源:攝圖網可商用圖片

交通流量

是指在選定時間段內透過道路某一地點、某一斷面或某一車道的交通實體數或當量數,從車流量的大小可以判定交通的擁擠狀況,從而決定當前採取何種交通管理措施,以及對未來交通變化趨勢和道路建設規劃給出量化的指導依據,因此對交通量的準確檢測在交通工程以及未來發展佔有十分重要的位置。

交通流量的統計資訊,在國內的部分城市是可以在政府網站上查閱的,比如上海市公共資料開放平臺就可以查到金山區道路交通流量。資料下載則需要註冊和申請。

「情報百科」如何從開放的地理資訊系統(GIS)中獲取資料

相比於國內,國外的交通流量資料開放程度更高,以西方某國為例,其每個地方行政單位大多都會公開交通流量資料,部分地方會以年報的形式釋出,或者在GIS中提供了原始資料下載。比如下面西方國家的某地的年均交通日流量就提供了csv格式的原始資料下載。

「情報百科」如何從開放的地理資訊系統(GIS)中獲取資料

但是,更多的GIS系統對於交通流量的統計資料只提供線上檢視,並不提供下載功能。面對這種情況,我們又該如何獲取這些資料呢?下面以arcgis系統為例,淺談一下資料獲取問題。

ArcGIS 是一個全面的系統,使用者可用其來收集、組織、管理、分析、交流和釋出地理資訊。

作為世界領先的地理資訊系統(GIS) 構建和應用平臺,ArcGIS 可供全世界的人們將地理知識應用到政府、企業、科技、教育和媒體領域。ArcGIS 可以釋出地理資訊,以便所有人都可以訪問和使用。

首先,我們開啟一個arcgis的交通流量地圖,選擇圖層列表,在開啟的選項卡中注意到帶有資料的圖層

,本例中我們選擇“2020-average annual daily traffic and 10 year historic counts”,按住鍵盤上的F12,調出開發者工具,在network選項卡中先停止錄製再開始錄製,這樣可以清空已經記錄的http報文,專門記錄後續操作所觸發的網路通訊。

之後我們選擇“2020-averageannual daily traffic and 10 year historic counts”,圖層後的三個點,在選單中選擇按“在屬性表中檢視”

。此時,頁面下方就會彈出該圖層對應的資料表。這無疑就是我們想要的資料了。

「情報百科」如何從開放的地理資訊系統(GIS)中獲取資料

對應

觀察右邊的開發者工具

,隨著滑鼠向下滑動,檢視資料表,右邊會記錄越來越多的報文,且都帶有json字樣。依次檢視這些報文,會發現有一個報文的preview(預覽)中依次展開 displayFieldName,fields就可以看到表格中的資料啦。

「情報百科」如何從開放的地理資訊系統(GIS)中獲取資料

這裡需要簡單介紹一下其

原理

,首先,我們在network中查到的這種帶有資料檔案屬於xhr型別,全稱為XmlHttpRequest,用於伺服器和瀏覽器之間交換資料,在建站的時候我們往往用到XmlHttpRequest物件的open和send方法,前者規定請求方式和需要互動的檔案位置,以及是否非同步上傳;如果是get請求,則後者空參,即可將請求傳送至伺服器。W3CSHOOL上的業務程式碼示例如下。

xmlhttp。open(“GET”,“ajax_info。txt”,true);

xmlhttp。send();

知道了xhr,再來了解json,這是一種基於JavaScript的輕量級資料交換格式。通常用{ },[ ]符號表示資料層級,用 : 表示鍵和值得關係,用,表示分隔符。顯然,這要比用雙標籤傳遞資料的xml輕了許多。

綜上所述,

網站開發時用 XmlHttpRequest將編寫好的json檔案傳給瀏覽器,使用者就可以看到資料啦

。當然,傳給瀏覽器的json檔案不可能是開發者編寫的,而是從網站資料庫中查詢的結果生成的。知道了原理,我們只需要把這些瀏覽器請求到的json檔案再還原成二維表,就萬事大吉了。

回到上面這個檔案的headers選項卡,我們確定了報文的請求方式是GET,並且請求地址也知道。仔細分析地址,有兩個引數這裡需要修改,一個是resultOffset,見名知意,這裡指的是查詢結果的偏移量。

當然,

我們需要從0開始查詢,即資料庫中的第一條資料

。ResultRecordCount為每次查詢返回的結果集大小,此處我們試著把它改大一些,比如說1000。最後,我們修改過的請求地址就是:

https://enterprise。firstmap。delaware。gov/arcgis/rest/services/Transportation/DE_Assets/MapServer/11/query?f=json&where=1=1&returnGeometry=false&spatialRel=esriSpatialRelIntersects&outFields=*&orderByFields=OBJECTIDASC&resultOffset=0&resultRecordCount=1000

「情報百科」如何從開放的地理資訊系統(GIS)中獲取資料

此時,

我們只需要用python的requests庫的get剛發向這個地址傳送請求,再用請求物件的json方法解析返回的資料就可以了

。在下面的程式碼中,變數data就已經是以字典的形式拿到了1000行交通資料(在名為features的列表中)。

import json

import requests

import pandas

url = “https://enterprise。firstmap。delaware。gov/arcgis/rest/services/Transportation/DE_Assets/MapServer/11/query?f=json&where=1=1&returnGeometry=false&spatialRel=esriSpatialRelIntersects&outFields=*&orderByFields=OBJECTID ASC&resultOffset=0&resultRecordCount=1000”

r =requests。get(url)

data = r。json()

「情報百科」如何從開放的地理資訊系統(GIS)中獲取資料

最後,

只需要把這個列表儲存成二維表並輸出即可

,這裡選用pandas工具代為整理,完整程式碼如下,整理過程不再贅述。

import json

import requests

import pandas

url = “https://enterprise。firstmap。delaware。gov/arcgis/rest/services/Transportation/DE_Assets/MapServer/11/query?f=json&where=1=1&returnGeometry=false&spatialRel=esriSpatialRelIntersects&outFields=*&orderByFields=OBJECTID ASC&resultOffset=0&resultRecordCount=1000”

r =requests。get(url)

data = r。json()

df = pandas。DataFrame(data[“features”][0][“attributes”],index =[0])

df2 = pandas。DataFrame(columns=df。columns)

for d in data[“features”]:

df = pandas。DataFrame(d[“attributes”],index =[0])

df2 = pandas。concat([df2,df],axis = 0)

print(d)

df2。to_excel(“c://Users//Administrator//Desktop//AADT_m_2019。xlsx”)

「情報百科」如何從開放的地理資訊系統(GIS)中獲取資料

封面來源:攝圖網可商用圖片

「情報百科」如何從開放的地理資訊系統(GIS)中獲取資料

END

「情報百科」如何從開放的地理資訊系統(GIS)中獲取資料

推薦文章