OSpider v3.0.0 开发者手册
OSpider是GPL v3.0协议下的开源桌面软件及python库,致力于提供便捷的矢量地理数据获取和预处理体验。项目主页为:https://skytruine.github.io/OSpider/
OSpider v3.0.0桌面版的核心功能为按行政区划名称、矩形框、圆形区和自定义面文件四种方式抓取POI(暂仅支持百度POI,高德POI将再下一次更新中加入),支持通过csv批处理文件批量执行POI抓取任务,且提供了分城市获取POI总量的实用工具。OSpider v3.0.0也集成了WGS84/BD09/GCJ02坐标互转工具与地址解析工具。
OSpider v3.0.0源码的功能模块包括POI抓取模块、坐标转换模块、行政区划获取模块、地址解析模块。
1 运行环境与依赖库
OSpider v3.0.0的开发环境为python3.7,依赖关系存于requirements.txt中。主要依赖geopandas (基于pandas, 进一步依赖pyproj,GDAL,Fiona和Shapely)和requests, 此外应用程序打包使用pyinstaller。由于GDAL等库的特殊性,直接采用pip install -r requirements.txt
可能会报错,建议先行在Unofficial Windows Binaries for Python Extension Packages或其镜像站(速度快)下载pyproj,GDAL,Fiona和Shapely的whl文件进行手动安装。本处也提供了百度云的下载版本(适合python3.7版本):https://pan.baidu.com/s/1OH2Pn1ohjn4Sm3OZ6xSJng 提取码:nn1s。下载完成后,以GDAL为例,安装对应whl的命令为pip install YourPath\GDAL-3.0.4-cp37-cp37m-win_amd64.whl
。
2 功能模块与文件说明
2.1 功能模块
-
POISpider.py
POI抓取模块,内含不同数据源的POI爬虫类。以百度地图数据源POI爬虫类BaiduPOISpider为例。对外暴露8个功能函数
- set_key (设置key池)
- set_dispStatus (设置是否持续显示抓取进度)
- getPOI_byAD(按行政区划名称抓取POI)
- getPOI_byBounds(按矩形框抓取POI)
- getPOI_byCircle(按圆形区抓取POI)
- getPOI_byFile(按自定义面文件抓取POI)
- getPOI_byBatch(按批处理文件批量抓取POI)
- getPOI_CityNum(分城市获取POI总量)
在使用时应该先调用set_key设置key池,再执行6种功能函数。按批处理文件批量抓取POI无返回值,直接把抓取结果存入批处理文件声明的路径中;分城市获取POI总量执行成功返回pandas.DataFrame,失败返回None;其余四个抓取函数执行成功返回geopandas.GeoDataFrame, 失败返回None。此外在服务器端执行时建议设置set_dispStatus(False)关闭持续显示抓取进度功能从而提高运行速度。该类的抓取功能基于百度地图的Place API-按矩形抓取,在实现上比较值得注意的点在于Key池和线程关系的处理,POI抓取算法(初始格网阈值四分递归)。
- CoordTrans.py
坐标转换模块,基于numpy,未封装成类,提供WGS84/GCJ02/BD09坐标互转的8个功能函数
-
gcj02_to_bd09(lng, lat)
-
bd09_to_gcj02(lng, lat)
-
wgs84_to_gcj02(lng, lat)
-
gcj02_to_wgs84(lng, lat)
-
bd09_to_wgs84(lng, lat)
-
wgs84_to_bd09(lng, lat)
-
coordtrans(lng,lat,origin_crs,target_crs)
-
coordtrans_byFile(inputFilePath,outFilePath,origin_crs,target_crs)
lng,lat分别为经纬度,可以是单独的数字,也可以是array-like的一维数组,如list。1-7返回numpy.narray或np.float64形式的结果: [result_lng, result_lat]。1-6是特定类型的坐标转换函数,coordtrans对1-6进行了封装,其中origin_crs,target_crs分别表示输入输出坐标系,可取’WGS84’,‘GCJ02’,‘BD09’。此外coordtrans_byFile则执行基于文件的坐标转换。
- ADSpider.py
行政区划抓取模块,内含ChinaADSpider类,对外暴露出两个功能函数:
- getADblur(模糊查询行政区划名称,返回指定长度的list)
- getAD_byName(模糊查询行政区划的空间数据,返回geopandas.GeoDataFrame)
该类模糊查询的实现基于python内置的difflib.get_close_matches,行政区划空间数据的获取基于高德的DATAV.Geoatlas
-
Geocoder.py
地址解析模块,写这个模块时作者偷懒了,单线程单Key且未考虑服务器部署的问题,只暴露了根据单key和待解析地址的CSV文件,进行地址解析并直接输出为指定目录下定名CSV解析结果文件的函数Geocoder。暂不建议调用。 -
OSpider_GUI.py
OSpider的用户界面文件,功能实现基于上述四个功能模块,而界面基于tkinter,各窗口封装成了类,包括一个继承tkinter.Tk的主窗口类和5个继承tkinter.Toplevel的子窗口类。具体为OSpider_Main(主窗口)、OSpider_KeyPool(Key池窗口)、OSpider_CityNum(分城市获取POI总量窗口)、OSpider_POIBatch(批量抓取POI窗口)、OSpider_CoordTrans(坐标转换窗口)、OSpider_Geocoder(地址解析窗口)。此外类TextRedirector用于将流输出重定向至widget,从而实现运行状态及报错信息在GUI界面中的即时显示。另一个值得注意的点是在每个窗口类中定义了**@staticmethod: thread_it**, 用于将耗时操作打包进独立线程从而防止用户界面卡死。
2.2 其余文件
-
Demo
文件输入样例,如对OSpider_GUI进行打包,请将该文件夹复制至打包结果的根目录中。
-
icon.ico
OSpider图标,运行OSpider_GUI.py所需资源文件,如对OSpider_GUI进行打包,请将该文件夹复制至打包结果的根目录中。
-
property.ini
OSpider配置文件,运行OSpider_GUI.py所需资源文件,如对OSpider_GUI进行打包,请将该文件夹复制至打包结果的根目录中。
-
help.pdf
样例用户手册,如对OSpider_GUI进行打包,请将该文件夹复制至打包结果的根目录中。
-
requirements.txt
OSpider依赖结构,通过
pip install -r requirements.txt
配置环境。 -
LICENSE
GPL v3.0许可,不论在何种情况下使用OSpider或基于OSpider进一步开发,请保留该许可。
3 打包与调用样例
3.1 打包OSpider_GUI.py
由于调用了Geopandas库,故需要额外的操作才能用pyinstaller打包成功,具体操作如下:
-
在shapely库文件目录下,找到geos_c.dll文件,将其复制一份重命名为geos.dll
-
找到geopandas库文件下的
__init__.py
,将import geopandas.datasets
这句注释掉 -
在rtree库文件目录下,找到spatialindex_c.dll和spatialindex-64.dll并将其复制到待打包.py文件所在目录下
-
在待打包.py文件头部加入如下的额外引用(OSpider_GUI中我已加入,故直接打包OSpider_GUI.py无需该步)
from pyproj import _datadir, datadir
from osgeo import ogr
from osgeo import gdal
from fiona import _shim, schema
完成上述操作后可通过如下命令进行打包。如果依然失败请参考博客。
pyinstaller --clean -y -F -w --add-binary=spatialindex_c.dll;. --add-binary=spatialindex-64.dll;. -i icon.ico -n YourAppName OSpider_GUI.py
此外,不建议在Anoconda环境下进行打包(会一并打包进大量无用文件,造成速度慢,结果体积大),建议使用独立纯净环境进行打包(仅包含标准库和所需库)。
3.2 功能模块调用样例
3.2.1 按区域抓取POI
from POISpider import BaiduPOISpider
keylist=['YourBAIDUKeySample1'<