陳永松,羅定福
(廣東松山職業技術學院計算機與信息工程學院,廣東 韶關 512126)
近年來,休閑農業空間布局成為研究熱點,但其面臨數據采集困難的問題。百度、高德等開放地圖提供了海量空間數據,借助開放地圖進行空間數據采集可起到事半功倍的效果[1]。
本文通過百度地圖API 結合Scrapy 數據采集技術,獲取POI、電子地圖使用痕跡為數據源,并進行坐標轉換,為休閑農業空間布局研究提供需要的數據。
百度地圖API是一套為開發者提供的基于百度地圖的應用程序接口,利用百度區域檢索API 可以方便的獲取各類地點的具體信息。百度區域檢索API接口為https://api.map.baidu.com/place/v2/search。
主要請求參數如下:
query:檢索關鍵字,tag:標簽,region:檢索區域,city_limit:為true 時僅返回檢索區域數據,output:為json 時返回json 格式,ak:百度ak 號,scope:為2 時返回詳細信息,page_size:返回記錄數,page_num:分頁頁碼。
主要返回參數如下:
name:名稱,location:經緯度坐標,address:地址信息,province:所屬省份,city:所屬城市,area:所屬區縣,uid:POI唯一標示,tag:標簽,overall_rating:總體評分,service_rating:服務評分,facility_rating:星級評分,hygiene_rating:衛生評分,comment_num:評論數,checkin_num:簽到數。
國際電子地圖使用WGS-84坐標系統,國內電子地圖使用GCJ-02 或BD09 坐標系統,不同的坐標系之間可能有幾十到幾百米的偏移,所以在地圖上繪制矢量圖形、做地理數據可視化等,需要修正不同坐標系之間的偏差,即需要對不同的地理坐標進行轉換。
百度API 接口可以將其他地理坐標系統轉換為BD09,由于BD09 是百度坐標系統,因此可以認為轉換是準確的,但是百度API 沒有提供BD09 坐標轉換為WGS-84坐標功能。
可使用公式法或利用開源庫將BD09 坐標轉換為WGS-84 坐標,其中公式法精度可達到10m 以內[2]。地理坐標轉換開源庫有Coordtransform 和Gcoord,為驗證兩種開源庫的坐標轉換精度并和公式法比較,利用百度區域檢索API接口檢索出韶關休閑農業相關的BD09 坐標3142 個,從中隨機提取300 個坐標,然后分別用Coordtransfor 和Gcoord 轉換為WGS-84 坐標,再用百度API接口轉換為BD09坐標,對轉換前后的BD09坐標進行比較,計算偏移量,結果如表1所示。

表1 coordtransform、Gcoord坐標轉換精度對比表
通過對韶關市內300 個隨機點進行評價,兩個開源庫的精度都比公式法高,Coordtransform 坐標轉換與原坐標點距離的均值為1.16 米,而Gcoord 坐標轉換與原坐標點相差0.67 米,中位數、最大值也是Gcoord占優。很明顯,在韶關市范圍內Gcoord 的精度更高,因此后續的百度坐標數據轉換使用Gcoord 開源庫進行轉換。
為方便后期使用SQL 語句進行數據處理,使用MySQL 數據庫存儲采集數據,采集數據表包含主要字段及說明如表2所示。

表2 采集數據表主要字段及說明
由于Scrapy 框架批量獲取API 數據[3]和存儲數據[4]都比較方便,因此本文使用Scrapy 框架實現數據采集。
使用“scrapy startproject Baidu”創建名稱為Baidu的Scrapy項目,修改配置文件settings.py,進行以下設置:
⑴配置ROBOTSTXT_OBEY 為False,拒絕遵守Robot協議;
⑵ 在谷歌瀏覽器中輸入about:version,如圖1所示,在DEFAULT_REQUEST_HEADERS 配置項中,配置'User-Agent'屬性為谷歌瀏覽器獲取的用戶代理代碼[5]。

圖1 谷歌瀏覽器“關于”頁面
修改items.py,在BaiduItem類中定義Scrapy字段,格式為:字段名=scrapy.Field(),其中字段名參考表2。
修改pipelines.py,定義BaiduMysqlPipeline 類,設置數據使用MySQL存儲,核心代碼如下:

修改settings.py,在ITEM_PIPELINES 配置項中,配置'Baidu.pipelines.BaiduMysqlPipeline'為200。
以采集韶關市農莊、莊園數據為例,調用百度地圖API 服務[6],并使用Gcoord 開源庫,將百度BD09 坐標轉換為WGS-84 坐標,實現數據采集。方法是定義

執行Scrapy 項目之后,共采集韶關市農莊、莊園記錄541條,為滿足數據處理要求,需要對數據進行清洗、轉換。
數據清洗(Data Cleaning)是對數據進行重新審查和校驗的過程,目的在于刪除重復信息、糾正存在的錯誤,保證數據的一致性。通過對采集后的原始數據進行審查和校驗,發現包含房地產、照相館、行政地標、家居建材等干擾項和重復記錄,刪除之后,記錄數為521條。
數據轉換(Data Transfer),是將數據從一種表現形式變為另一種表現形式的過程。本案例采集的數據格式為MySQL 數據表,無法滿足ArcMap 數據處理的要求,需要進行數據轉換,轉換過程如下。
首先,從采集之后的MySQL 數據提取其中的經緯度等數據,形成多點geojson[7]如下:

然后,通過網站https://mapshaper.org/,將geojson 轉換為shapefile[8],得到ArcMap能處理的數據。
下面以分析韶關市人氣農莊、莊園分布情況為例,檢驗數據采集結果的有效性。首先,從shapefile 數據中篩選總體評分大于等于3 或評論數大于等于3 的數據,結果共191 條記錄;其次,將數據導入ArcMap,得到韶關市人氣農莊、莊園分布圖如圖2所示。從圖2可以得出初步結論,韶關市人氣農莊、莊園主要分布在韶關市中心周邊,另一個聚集點是新豐縣大廣高速兩側。進一步的,可采用最近鄰指數(Nearest Neighbor Index)、核密度函數等算法,分析人氣農莊、莊園與城市人口、交通的依賴關系。

圖2 韶關市人氣農莊、莊園分布圖
本文在分析百度地圖API和不同地理坐標轉換開源庫精度的基礎上,結合Scrapy 框架技術、MySQL 存儲技術,并使用Gcoord 開源庫地理坐標轉換,實現韶關市農莊、莊園空間數據采集,對采集數據結果進行清洗、轉換,利用ArcMap 工具獲取分布圖,結果證明可滿足休閑農業空間布局分析的需要。用同樣的方法可采集其他類型休閑農業數據并進行空間布局分析。