OSpider v3.0.0 开发者手册

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个功能函数

    1. set_key (设置key池)
    2. set_dispStatus (设置是否持续显示抓取进度)
    3. getPOI_byAD(按行政区划名称抓取POI)
    4. getPOI_byBounds(按矩形框抓取POI)
    5. getPOI_byCircle(按圆形区抓取POI)
    6. getPOI_byFile(按自定义面文件抓取POI)
    7. getPOI_byBatch(按批处理文件批量抓取POI)
    8. 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个功能函数
  1. gcj02_to_bd09(lng, lat)

  2. bd09_to_gcj02(lng, lat)

  3. wgs84_to_gcj02(lng, lat)

  4. gcj02_to_wgs84(lng, lat)

  5. bd09_to_wgs84(lng, lat)

  6. wgs84_to_bd09(lng, lat)

  7. coordtrans(lng,lat,origin_crs,target_crs)

  8. 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类,对外暴露出两个功能函数:
  1. getADblur(模糊查询行政区划名称,返回指定长度的list)
  2. 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打包成功,具体操作如下:

  1. 在shapely库文件目录下,找到geos_c.dll文件,将其复制一份重命名为geos.dll

  2. 找到geopandas库文件下的__init__.py,将import geopandas.datasets这句注释掉

  3. 在rtree库文件目录下,找到spatialindex_c.dll和spatialindex-64.dll并将其复制到待打包.py文件所在目录下

  4. 在待打包.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',
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值