陳永松,羅定福
(廣東松山職業(yè)技術學院計算機與信息工程學院,廣東 韶關 512126)
近年來,休閑農(nóng)業(yè)空間布局成為研究熱點,但其面臨數(shù)據(jù)采集困難的問題。百度、高德等開放地圖提供了海量空間數(shù)據(jù),借助開放地圖進行空間數(shù)據(jù)采集可起到事半功倍的效果[1]。
本文通過百度地圖API 結合Scrapy 數(shù)據(jù)采集技術,獲取POI、電子地圖使用痕跡為數(shù)據(jù)源,并進行坐標轉換,為休閑農(nóng)業(yè)空間布局研究提供需要的數(shù)據(jù)。
百度地圖API是一套為開發(fā)者提供的基于百度地圖的應用程序接口,利用百度區(qū)域檢索API 可以方便的獲取各類地點的具體信息。百度區(qū)域檢索API接口為https://api.map.baidu.com/place/v2/search。
主要請求參數(shù)如下:
query:檢索關鍵字,tag:標簽,region:檢索區(qū)域,city_limit:為true 時僅返回檢索區(qū)域數(shù)據(jù),output:為json 時返回json 格式,ak:百度ak 號,scope:為2 時返回詳細信息,page_size:返回記錄數(shù),page_num:分頁頁碼。
主要返回參數(shù)如下:
name:名稱,location:經(jīng)緯度坐標,address:地址信息,province:所屬省份,city:所屬城市,area:所屬區(qū)縣,uid:POI唯一標示,tag:標簽,overall_rating:總體評分,service_rating:服務評分,facility_rating:星級評分,hygiene_rating:衛(wèi)生評分,comment_num:評論數(shù),checkin_num:簽到數(shù)。
國際電子地圖使用WGS-84坐標系統(tǒng),國內(nèi)電子地圖使用GCJ-02 或BD09 坐標系統(tǒng),不同的坐標系之間可能有幾十到幾百米的偏移,所以在地圖上繪制矢量圖形、做地理數(shù)據(jù)可視化等,需要修正不同坐標系之間的偏差,即需要對不同的地理坐標進行轉換。
百度API 接口可以將其他地理坐標系統(tǒng)轉換為BD09,由于BD09 是百度坐標系統(tǒng),因此可以認為轉換是準確的,但是百度API 沒有提供BD09 坐標轉換為WGS-84坐標功能。
可使用公式法或利用開源庫將BD09 坐標轉換為WGS-84 坐標,其中公式法精度可達到10m 以內(nèi)[2]。地理坐標轉換開源庫有Coordtransform 和Gcoord,為驗證兩種開源庫的坐標轉換精度并和公式法比較,利用百度區(qū)域檢索API接口檢索出韶關休閑農(nóng)業(yè)相關的BD09 坐標3142 個,從中隨機提取300 個坐標,然后分別用Coordtransfor 和Gcoord 轉換為WGS-84 坐標,再用百度API接口轉換為BD09坐標,對轉換前后的BD09坐標進行比較,計算偏移量,結果如表1所示。
表1 coordtransform、Gcoord坐標轉換精度對比表
通過對韶關市內(nèi)300 個隨機點進行評價,兩個開源庫的精度都比公式法高,Coordtransform 坐標轉換與原坐標點距離的均值為1.16 米,而Gcoord 坐標轉換與原坐標點相差0.67 米,中位數(shù)、最大值也是Gcoord占優(yōu)。很明顯,在韶關市范圍內(nèi)Gcoord 的精度更高,因此后續(xù)的百度坐標數(shù)據(jù)轉換使用Gcoord 開源庫進行轉換。
為方便后期使用SQL 語句進行數(shù)據(jù)處理,使用MySQL 數(shù)據(jù)庫存儲采集數(shù)據(jù),采集數(shù)據(jù)表包含主要字段及說明如表2所示。
表2 采集數(shù)據(jù)表主要字段及說明
由于Scrapy 框架批量獲取API 數(shù)據(jù)[3]和存儲數(shù)據(jù)[4]都比較方便,因此本文使用Scrapy 框架實現(xiàn)數(shù)據(jù)采集。
使用“scrapy startproject Baidu”創(chuàng)建名稱為Baidu的Scrapy項目,修改配置文件settings.py,進行以下設置:
⑴配置ROBOTSTXT_OBEY 為False,拒絕遵守Robot協(xié)議;
⑵ 在谷歌瀏覽器中輸入about:version,如圖1所示,在DEFAULT_REQUEST_HEADERS 配置項中,配置'User-Agent'屬性為谷歌瀏覽器獲取的用戶代理代碼[5]。
圖1 谷歌瀏覽器“關于”頁面
修改items.py,在BaiduItem類中定義Scrapy字段,格式為:字段名=scrapy.Field(),其中字段名參考表2。
修改pipelines.py,定義BaiduMysqlPipeline 類,設置數(shù)據(jù)使用MySQL存儲,核心代碼如下:
修改settings.py,在ITEM_PIPELINES 配置項中,配置'Baidu.pipelines.BaiduMysqlPipeline'為200。
以采集韶關市農(nóng)莊、莊園數(shù)據(jù)為例,調(diào)用百度地圖API 服務[6],并使用Gcoord 開源庫,將百度BD09 坐標轉換為WGS-84 坐標,實現(xiàn)數(shù)據(jù)采集。方法是定義
執(zhí)行Scrapy 項目之后,共采集韶關市農(nóng)莊、莊園記錄541條,為滿足數(shù)據(jù)處理要求,需要對數(shù)據(jù)進行清洗、轉換。
數(shù)據(jù)清洗(Data Cleaning)是對數(shù)據(jù)進行重新審查和校驗的過程,目的在于刪除重復信息、糾正存在的錯誤,保證數(shù)據(jù)的一致性。通過對采集后的原始數(shù)據(jù)進行審查和校驗,發(fā)現(xiàn)包含房地產(chǎn)、照相館、行政地標、家居建材等干擾項和重復記錄,刪除之后,記錄數(shù)為521條。
數(shù)據(jù)轉換(Data Transfer),是將數(shù)據(jù)從一種表現(xiàn)形式變?yōu)榱硪环N表現(xiàn)形式的過程。本案例采集的數(shù)據(jù)格式為MySQL 數(shù)據(jù)表,無法滿足ArcMap 數(shù)據(jù)處理的要求,需要進行數(shù)據(jù)轉換,轉換過程如下。
首先,從采集之后的MySQL 數(shù)據(jù)提取其中的經(jīng)緯度等數(shù)據(jù),形成多點geojson[7]如下:
然后,通過網(wǎng)站https://mapshaper.org/,將geojson 轉換為shapefile[8],得到ArcMap能處理的數(shù)據(jù)。
下面以分析韶關市人氣農(nóng)莊、莊園分布情況為例,檢驗數(shù)據(jù)采集結果的有效性。首先,從shapefile 數(shù)據(jù)中篩選總體評分大于等于3 或評論數(shù)大于等于3 的數(shù)據(jù),結果共191 條記錄;其次,將數(shù)據(jù)導入ArcMap,得到韶關市人氣農(nóng)莊、莊園分布圖如圖2所示。從圖2可以得出初步結論,韶關市人氣農(nóng)莊、莊園主要分布在韶關市中心周邊,另一個聚集點是新豐縣大廣高速兩側。進一步的,可采用最近鄰指數(shù)(Nearest Neighbor Index)、核密度函數(shù)等算法,分析人氣農(nóng)莊、莊園與城市人口、交通的依賴關系。
圖2 韶關市人氣農(nóng)莊、莊園分布圖
本文在分析百度地圖API和不同地理坐標轉換開源庫精度的基礎上,結合Scrapy 框架技術、MySQL 存儲技術,并使用Gcoord 開源庫地理坐標轉換,實現(xiàn)韶關市農(nóng)莊、莊園空間數(shù)據(jù)采集,對采集數(shù)據(jù)結果進行清洗、轉換,利用ArcMap 工具獲取分布圖,結果證明可滿足休閑農(nóng)業(yè)空間布局分析的需要。用同樣的方法可采集其他類型休閑農(nóng)業(yè)數(shù)據(jù)并進行空間布局分析。