POI搜索工具、地理编码工具

Related tags

GUI javafx poi amap
Overview

POIKit

build Maintenance version

POIKit 目的是提供一套简单易用且稳定的 POI 获取与处理工具套件,方便 GIS 相关从业者。目前软件处于初步构建状态,希望各位多多尝试,多多提问题(The More Questions,The Better)。

目录

Preview

preview

功能演示

POI 搜索功能

以行政区为例。POI 类型:餐饮服务;行政区:371723;初始网格数:4;阈值:850;线程数目:2;输出格式:csv,POI 搜索功能如下所示:

POI搜索

功能配置参数如下表:

参数 说明 注意
高德 key 软件支持多个 key,不同 key 之间需要用逗号分割 注意,只能使用英文逗号,且不能包含换行符、空格等
开发者类型 个人开发者或个人认证开发者或企业开发者 用于设置 QPS 值,当用户设置线程数大于最大线程数,将强制设为最大线程,防止过高并发
POI 关键字 搜索关键字,如KFC,不同关键字之间使用逗号分割 只能使用英文逗号 分割
POI 类型 搜索类型,可为分类代码或汉字,如 010000,不同类型之间使用逗号分割 只能使用英文逗号分割,若使用汉字,必须严格按照高德 POI 分类编码中的汉字编写
行政区 行政区六位代码 -
矩形 格式严格遵循左上角经纬度#右下角经纬度,如133,34#135,30 经纬度坐标可以使用wgs84/gcj02/bd09 坐标,请使用下拉框选择合适的经纬度坐标
自定义 支持用户上传 geojson 边界文件 经纬度坐标可以使用wgs84/gcj02/bd09 坐标,类型可以为PolygonMultiPolygon
初始网格数 初始网格剖分数目 一般情况按默认值为 4 即可
阈值 当该网格 POI 数量超出阈值,会对网格进一步四分 一般情况下按 850 即可
线程数目 线程数量一般不大于 QPS * keys_num,个人开发者最多设为 20,个人认证开发者最多设为 50,网速较快时也应降低 QPS 可以在流量限制说明查看
输出格式 目前支持 geojson、shp、csv、txt 结果包含 gcj02 和 wgs84 两种坐标,若输出格式为 geojson 或 shp,使用 wgs84 坐标

注意:

  1. 若爬取过程中 key 池额度用尽,软件会停止爬取,但不会删除之前爬取得到的数据,仍会导出。

  2. 若爬取过程中,用户点击取消,软件会停止爬取,不会导出。

输出参数说明:

参数 说明
name 名称
type 兴趣点类型
typecode 兴趣点类型编码
address 地址
pname POI 所在省份名称
cityname 城市名
adname 区域名称
gcj02_lon gcj02 经度
gcj02_lat gcj02 纬度
wgs84_lon wgs84 经度
wgs84_lat wgs84 纬度

地理编码功能

地理编码

功能配置参数如下表所示:

参数 说明 注意
高德 key 软件支持多个 key,不同 key 之间需要用逗号分割 注意,只能使用英文逗号,且不能包含换行符、空格等
开发者类型 个人开发者或个人认证开发者或企业开发者 用于设置 QPS 值,当用户设置线程数大于最大线程数,将强制设为最大线程,防止过高并发
线程数目 线程数量一般不大于 QPS * keys_num QPS 可以在流量限制说明查看
输入文件 支持 csv 或 txt 格式文件 至少需要包含address字段
输出目录 结果输出路径,目前地理编码结果包括 gcj02 和 wgs84 两种坐标 -

注意:

  1. 若地理编码过程中 key 池额度用尽,软件会停止地理编码,但不会删除之前得到的数据,仍会导出。
  2. 若地理编码过程中,用户点击取消,软件会停止地理编码,不会导出。

输出参数说明:

参数 说明
formatted_address 结构化地址信息
country 国家
province 地址所在的省份名
city 地址所在的省份名
citycode 城市编码
district 地址所在的区
adcode 区域编码
street 街道
number 门牌
level 匹配级别
gcj02_lon gcj02 经度
gcj02_lat gcj02 纬度
wgs84_lon wgs84 经度
wgs84_lat wgs84 纬度

格式转换

地理编码

功能配置参数如下表所示:

参数 说明
输入文件 支持 geojson 或 shp 格式文件
输出格式 若选择 geojson,则可以输出 shp,若选择 shp,则可以输出 geojson 或 csv
输出目录 结果输出路径

坐标转换

坐标转换

功能配置参数如下表所示:

参数 说明
输入文件 支持 geojson 或 shp 格式文件
输入坐标格式 即输入文件的坐标格式,wgs84/gcj02/bd09
输出目录 结果输出路径
输入坐标格式 即输出文件的坐标格式,wgs84/gcj02/bd09

安装

  1. 软件基于 Java 环境运行,需要首先安装 jre/jdk(1.8 版本),安装步骤如下:
    • 下载JDK8,选择适合本系统的版本;
    • 配置环境变量JAVA_HOME为安装目录,然后在Path中添加%JAVA_HOME%\bin
    • 打开终端,输入java -version,若出现 Java 版本号,则配置成功。
  2. 下载最新发布的软件压缩包,以POIKit.zip为例,解压缩后,双击start.bat即可运行。

技术选型

目前软件采用 MVC 软件架构模式,技术选型如下:

维护人员

@Civitasv

@SkyTreeDelivery

支持该项目

若遇到任何问题,你可以通过以下方式联系我:

  1. 邮箱:[email protected],我会定时查看邮箱,但不保证实时性;
  2. 用户 QQ 群:1097532420
  3. issue:这是我推荐的方式,有问题时,也应该首先查看 issue 列表是否已有该问题的解答;

若帮助到了您,Github Star 是对我最大的肯定。

开发路线

  • v0.0.1 2021-04-20

    • 初步实现软件及安装文档;
  • v0.0.2 2021-04-22

    • 修复重复 bug;
  • v0.0.3 2021-04-23

    • 线程池运行优化;
    • 添加运行状态提示
  • v0.0.4-alpha 2021-04-23

    • 添加 POI 检索错误码输出;
    • 修改地理编码返回字段;
    • 添加开发者类型选择下拉框,防止过高并发;
    • 解决点击“执行按钮”卡顿 bug;
    • 【重要更新】POI 搜索添加导出 shp 功能
  • v0.0.4 2021-04-26

    • 添加选取坐标类型(gcj02/wgs84)功能
    • 初步完成 geojson 转 shp,shp 转 geojson,shp 转 csv
    • 添加 cpg 格式文件,防止乱码
    • 若干 bug 修复
  • v0.05 2021-04-27

    • 行政区、用户自定义文件爬取得到的 POI 不再是其外接矩形的 POI,即用户不需要再做裁切处理;
    • 完成坐标转换工具开发,进行 wgs84、gcj02 和 bd09 坐标之间的转换,文件格式支持 geojson/shp,其中 geojson 支持 Point、MultiPoint、LineString、MultiLineString、Polygon 和 MultiPolygon,不支持 GeometryCollection;
    • 使用不同的线程控制机制,能够增加线程数目,更加快速的获取 POI
    • UI bug 修复、cpg 文件生成修复等。

License

MIT © Civitasv

Comments
  • [BUG]

    [BUG]

    你好,最近在使用poikit的0.0.7版本时,发现在爬取一二线城市(例如北京、上海、广州、武汉等)的poi数据时,如果poi代码输入的是数据量较大的050000或者是060000,则会出现两种情况:1)停住不动,就一直停在还剩多少多少个数据那儿。2)爬到中途会提示key池用尽,可是明明key池还有很多的剩余量。PS:本人在爬取时同时输入了3个账号的key。

    bug help wanted 
    opened by sobrietyyyyy 3
  • errorCode : 90003

    errorCode : 90003

    请问一下出现了errorCode : 90003;显示信息errorMessage : 任务终止 --- com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line 1 column 2959 path $.pois[8].name 怎么办呢

    opened by AirisAir 2
  • POIKIT2.0版本_基础功能使用疑问

    POIKIT2.0版本_基础功能使用疑问

    十分感谢各位老师百忙之中阅读我的邮件,以下是我的问题:

    使用POIkit过程中,输入【行政区】代码可以成功输出,但输入【自定义】区域geojson文件却没办法输出,显示“开始POI爬取,请勿操作-解析用户geojson文件中-成功解析用户文件”,就此卡住。

    我仔细检查我简单的geojson文件没问题,希望老师有空的时候能帮帮我,这对我真的很重要,十分感谢。

    附文件代码:

    { "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": {}, "geometry": { "type": "Polygon", "coordinates": [ [ [ 119.30860519409178, 41.60697150486485 ], [ 119.28757667541502, 41.59509765066552 ], [ 119.31075096130373, 41.5806535322673 ], [ 119.3407917022705, 41.59124620173383 ], [ 119.30860519409178, 41.60697150486485 ] ] ] } } ] }

    opened by Frantoki 1
  • POIKit-2.0.1启动问题求助

    POIKit-2.0.1启动问题求助

    您好开发者,在使用最新版的POIKit时,点击star会显示:

    E:\POIKit-2.0.1>cd app

    E:\POIKit-2.0.1\app>java -jar spider.jar 错误: 找不到或无法加载主类 com.civitasv.spider.MainApplication 原因: java.lang.NoClassDefFoundError: javafx/application/Application

    请问该如何解决,十分感谢您开发的软件!

    opened by Waidalie 1
  • 行政区边界无法获取

    行政区边界无法获取

    问题

    无法获取行政区边界,请检查行政区代码后重试

    异常:

    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
            at sun.security.ssl.Alert.createSSLException(Alert.java:131)
            at sun.security.ssl.TransportContext.fatal(TransportContext.java:370)
            at sun.security.ssl.TransportContext.fatal(TransportContext.java:313)
            at sun.security.ssl.TransportContext.fatal(TransportContext.java:308)
            at sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:652)
            at sun.security.ssl.CertificateMessage$T12CertificateConsumer.onCertificate(CertificateMessage.java:471)
            at sun.security.ssl.CertificateMessage$T12CertificateConsumer.consume(CertificateMessage.java:367)
            at sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:376)
            at sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:479)
            at sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:457)
            at sun.security.ssl.TransportContext.dispatch(TransportContext.java:200)
            at sun.security.ssl.SSLTransport.decode(SSLTransport.java:154)
            at sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1290)
            at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1199)
            at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:401)
            at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:373)
            at okhttp3.internal.connection.RealConnection.connectTls(RealConnection.kt:379)
            at okhttp3.internal.connection.RealConnection.establishProtocol(RealConnection.kt:337)
            at okhttp3.internal.connection.RealConnection.connect(RealConnection.kt:209)
            at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:226)
            at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:106)
            at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:74)
            at okhttp3.internal.connection.RealCall.initExchange$okhttp(RealCall.kt:255)
            at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:32)
            at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
            at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:95)
            at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
            at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:83)
            at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
            at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:76)
            at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
            at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:201)
            at okhttp3.internal.connection.RealCall.execute(RealCall.kt:154)
            at retrofit2.OkHttpCall.execute(OkHttpCall.java:204)
            at com.civitasv.spider.dao.impl.DataVDaoImpl.getBoundary(DataVDaoImpl.java:17)
            at com.civitasv.spider.util.BoundaryUtil.getBoundaryAndAdNameByAdCode(BoundaryUtil.java:35)
            at com.civitasv.spider.controller.POIController.getBoundaryByAdCode(POIController.java:338)
            at com.civitasv.spider.controller.POIController.lambda$execute$10(POIController.java:220)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
            at java.lang.Thread.run(Thread.java:748)
    Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
            at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:439)
            at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:306)
            at sun.security.validator.Validator.validate(Validator.java:271)
            at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:312)
            at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:221)
            at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:128)
            at sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:636)
            ... 36 more
    Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
            at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
            at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
            at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
            at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:434)
            ... 42 more
    

    参数设置

    开发者类型:个人开发者 POI关键字:KFC 行政区:310000 切分阈值:850 线程数目:5 输出格式:csv

    环境

    • jdk 版本:1.8.0_291
    • POIKit 版本:0.0.6

    截图

    FYH7J6Y6L)@`HGSC8{4_AGY

    bug help wanted 
    opened by Eaten-by-pineapple 1
  • Web Development IDE

    Web Development IDE

    Come and check the Lipstick lover💄's profile in #BIGOLIVE! https://slink.bigovideo.tv/YvcgRT

    Download the #1 IDE for Web Development ( HTML + JS + CSS ) with a lot of FrameWork Support like Angular etc... https://play.google.com/store/apps/details?id=codetoinvent.codetoinvent.web_development

    opened by Deep-Devil-mm 0
  • 调用量超出限制后任务停止,但是无数据导出

    调用量超出限制后任务停止,但是无数据导出

    非常感谢制作团队开发的优秀软件帮助我解决了很多问题! 但是我在程序运行过程中遇到一个奇怪的问题:当账号调用量超出限制后,已收集的POI数据却一直停留在保存任务状态,而没有任何数据导出,请问这是什么原因呢? 已执行任务:2619/3160 已执行任务:2620/3160 errorCode: 10044 errorMessage: 账号维度日调用量超出限制 helpInfo:账号维度日调用量超出限制,超出部分的请求被拒绝。限流阈值内的请求依旧会正常返回 停止POI爬取 任务即将停止,正在保存任务状态...请不要关闭软件

    opened by ZhangSongxi 1
  • [feature]加入提取POI的评价信息

    [feature]加入提取POI的评价信息

    首先非常感谢制作团队,能帮助我们非技术背景出身的研究者方便获取POI。

    如果方便的话,再次想向开发团队提一个请求。请问是否能够加入提取“景点”,“餐饮”,“酒店”,“服务”等类别POI的评价信息,可能包括: (1)评分; (2)近期内多少人到访或者查看

    这些信息中,(1)评分在高德地图API中的返回值有提及(https://lbs.amap.com/api/webservice/guide/api/search) (2)到访次数的信息我能以用户角度在手机app中查看,但不知道如何通过API提取。有一篇学术论文提到了可以提取到访次数信息。(https://www.sciencedirect.com/science/article/pii/S0048969719332747)

    非常感谢您的考虑。

    祝好

    enhancement 
    opened by CWen001 1
Releases(v2.0.2)
Owner
simple
一旦眼神变得黯淡,灵魂也会失去光辉
simple