在LBS应用中,根据坐标来解析获得对应是哪个城市是一个很常见的功能,比如App里面通过手机定位自动选择城市;本文介绍的是通过自己建的数据库,利用SQL空间查询来进行坐标解析得到对应的省市区,绝大部分支持空间数据类型(Spatial)的数据库均支持,包括但不限于:MySQLSQL ServerOraclePostgreSQL等;开发语言不限,只要能进行数据库查询就都支持,用JavaPythonPHPC#均能很简单的实现。

省市区边界数据在线预览、下载:https://xiangyuecn.gitee.io/areacity-jsspider-statsgov/

GitHub地址:https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov

通过坐标来获取地址:百度地图提供的接口叫 “地址逆解析”,高德地图提供的接口叫 “地理逆编码”,它们开放平台均提供了前后端接口,发个http请求就可以拿到数据,相关的接口调用请自行阅读平台开发文档,使用起来很方便。

当然这篇文章不会去介绍怎么搞街道门牌号这些完整地址,也不讲怎么样调用人家的接口,只介绍坐标对应的省市区名称的获取,自建数据库写SQL进行空间查询,完全自己实现,比调开放平台接口相对会复杂些。

由于全国区县每年都会有比较多的变更,所以省市区边界数据需要经常去同步维护,好在这上面这个开源库有在持续的长期维护,新数据发布后更新相对容易很多。由于开源库更新维护数据比较及时,所以只要开源库没有被关闭,本文介绍的提取方法就一直适用; 比那些上传到下载平台就万年不更新的数据优秀很多。

查询效果展示:

从这里随便拿的一个坐标:

直观的效果如上图,在百度地图里面随便点选一下(或App定位获得的坐标)得到一个坐标,然后到数据库里面利用空间查询SQL就能查询到坐标所在的城市。

步骤一、下载省市区边界数据

到开源库里面下载最新的 ok_geo.csv.7z 文件(13M大小,解压130M+),点此下载。下载好后解压得到 ok_geo.csv,此文件内包含了最新全国所有的省市区县坐标边界矢量数据。

注:这个文件只包含三级(省市区)数据不含第四级(乡镇街道),如需乡镇坐标边界数据,可以请点此下载 ok_geo4_*.csv 文件(90MB+压缩包 导出后300M+)。

步骤二、解析CSV文件导入数据库

下载好的文件 ok_geo.csv 是纯文本文件,可以自行编写脚本进行解析,然后导进数据库中,自行解析处理比较复杂,请参考开源库内文档;开源库内提供了一个格式转换工具,此工具支持将CSV数据导入数据库,因此我们直接在下载数据时顺带把工具下载好,点此下载

此转换工具除了支持将 ok_geo.csv 导入数据库外,还支持导出:sqlshpgeojson,和坐标系转换;还可执行自定义 JavaScript 脚本,扩展出丰富功能;软件是Windows版,如果需要在MacOs中用,可以用虚拟机。

转换工具执行导入数据库操作:

  1. 点击 选择ok_geo.csv文件 按钮,选择解压出来的CSV文件;
  2. 数据库设置中选择要导入的数据库类型,这里选的是MySQL,再填写数据库连接,包括:端口、数据库名称、账号密码;
  3. 点击导入数据库按钮,等待一会,大约3分钟左右,所有数据就都导入到了数据库按今天日期新建的表里面。

注:csv文件内的边界数据默认是高德地图GCJ-02火星坐标系,如果需要其他坐标系,比如百度的BD-09或GPS的WGS-84,可以通过高级脚本中的坐标系转换插件进行转换,选择好对应的插件后,点击应用就可以了,在导入数据库时会自动进行坐标系转换。

注:这个工具限制每次操作只可导出一个城市和它的下一级数据,导出少量数据还是很轻松的,所以我们可以多操作几次,将需要的城市数据全部导入数据库;比如要深圳的所有区县数据:第一遍导入全国所有的省,第二遍在城市名前缀中填写广东省 (结尾带一个空格)导入广东所有的市,第三遍在城市名前缀中填写广东省 深圳市 (结尾带一个空格)导入深圳所有的区。如果在密钥输入框中填写了密钥,此工具就没有这些限制了,开源库里面会不定期发放密钥搞福利,点击一次操作即可导出全国所有的省市区三级数据。

表结构和空间字段(MySQL版,其他数据库类似):

CREATE TABLE Areacity_Geo_20220216 (
id int NOT NULL, --城市id
pid int NOT NULL, --上级城市id
deep int NOT NULL, --层级:0省、1市、2区
name varchar(250) NOT NULL, --城市名称:`深圳市`
ext_path varchar(255) NOT NULL, --省市区三级完整名称:广东省 深圳市 罗湖区
geo geometry NOT NULL, --城市中心坐标,空间数据格式
--,ST_AsText转成WKT文本后:`POINT EMPTY`、`POINT (123.456 34.567)`
polygon geometry NOT NULL --城市边界范围图形,空间数据格式
--,ST_AsText转成WKT文本后:`POLYGON EMPTY`、`POLYGON ((123.456 34.567,...))`、`MULTIPOLYGON (((123.456 34.567,...)),...)`
) 对空间字段的查询,需要用`ST_AsText()`方法才能查询出字符串文本(WKT: Well Known Text),否则查询出来的是二进制数据
-- MySQL版:
SELECT id, name, ST_AsText(geo) AS geo, ST_AsText(polygon) AS polygon FROM 表名
-- SQL Server版:
SELECT id, name, geo.STAsText() AS geo, polygon.STAsText() AS polygon FROM 表名

步骤三、在程序中根据坐标解析获得城市

省市区边界导入到了数据库后,我们就可以在在 JavaPythonPHPC# 等程序中对数据库进行查询,通过SQL的空间计算函数ST_Intersects来查询一个坐标在哪些边界范围内,就能得到对应的省市区信息了。

空间查询SQL语句

比如要查询坐标`lng:113.929976 lat:22.529497`是在哪个城市
-- MySQL版:
SELECT id,deep,name FROM 表名 WHERE ST_Intersects(polygon, ST_GeomFromText('POINT(113.929976 22.529497)',0))=1
-- SQL Server版:
SELECT id,deep,name FROM 表名 WHERE polygon.STIntersects(geometry::STGeomFromText('POINT(113.929976 22.529497)',0))=1

查询结果例子(MySQL版,其他数据库类似)

程序代码连接上数据库,通过以上SQL查询到数据库数据后,就获得了省市区信息,可以通过deep字段来区分哪条数据是省(deep=0)、市(deep=1)、区县(deep=2)

通过以上三步,我们就完全是自己实现了根据经纬度坐标来解析获得对应是哪个城市这一功能。

【END】

根据经纬度坐标获得省市区县行政区划城市名称,自建数据库 java python php c# .net 均适用的更多相关文章

  1. 通过ip得到所在城市,以及城市所在经纬度坐标(监控系统中用的该代码,小航哥)

    监控系统中就是利用的该段代码,实现通过ip得到所在城市,以及城市所在经纬度坐标,最后得以利用echarts实现模拟迁移的效果 api官方介绍: http://lbsyun.baidu.com/inde ...

  2. 从统计局采集最新的省市区县数据,纯js

    本文更新(移步查阅): 19-04-15 新采集了2018的省市区三级坐标和行政区域边界 19-03-22 采集了2018的城市数据 18-11-28 采集了2017的城市数据 数据下载 GitHub ...

  3. echarts地图边界数据的实时获取与应用,省市区县多级联动【附最新geoJson文件下载】

    首先,来看下效果图 在线体验地址:https://hxkj.vip/demo/echartsMap/,并提供实时geoJson数据文件下载 echarts官方社区链接地址(可在线编辑):https:/ ...

  4. 百度地图 echarts tooltip属性 经纬度坐标不显示

    中国地图.散点图结合点击后显示当前城市数量 不显示经纬度坐标 echarts.appMap = function (id, opt) { // 实例 var chart = this.init(doc ...

  5. 从区划边界geojson中查询经纬度坐标对应的省市区县乡镇名称,开源Java工具,内存占用低、高性能

    目录 坐标边界查询工具:AreaCity-Query-Geometry 性能测试数据 测试一:Init_StoreInWkbsFile 内存占用很低(性能受IO限制) 测试二:Init_StoreIn ...

  6. WGS84经纬度坐标与北京54坐标或者西安80坐标的关系

    一般来讲,GPS直接提供的坐标(B,L,H)是1984年世界大地坐标系(WordGeodetic System 1984即WGS-84)的坐标,其中B为纬度,L为经度,H为大地高即是到WGS-84椭球 ...

  7. Pyqt QComboBox 省市区县联动效果

    在Qt中, QComboBox方法窗口组件允许用户从列表清单中选择,在web中就是select标签,下拉选项. 省市区县的联动就是currentIndexChanged 获取当前的Index,通过这个 ...

  8. 循序渐进VUE+Element 前端应用开发(21)--- 省市区县联动处理的组件使用

    在很多应用中,往往都涉及到记录用户所在省份.城市.区县或者街道等信息,一般我们可以通过联动的Select或者类似的界面组件进行展示,或者使用Element中的el-cascader界面组件进行展示,而 ...

  9. Java 根据两个经纬度坐标计算距离

    public class Distance{ private static final double EARTH_RADIUS = 6378137;    private static double  ...

随机推荐

  1. 初识python: 字符编码转换

    指定当前文件编码格式:#-*- coding:utf-8 -*-unicode(万国码): 英文字母 1个字节,中文3个字节python中所有的字符都是unicode编码所有非unicode编码互转都 ...

  2. JMeter_事务控制器

    性能测试的结果统计时我们一定会关注TPS,TPS代表的是每秒事务数,每个事务对应的是我们的请求.虽然JMeter能够帮我们把每个请求统计成一个事务,但有时候我们希望把多个操作统计成一个事务,JMete ...

  3. Spark案例练习-UV的统计

    关注公众号:分享电脑学习回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新)云盘目录说明:tools目录是安装包res 目录是每一个课件对应的代码和资源等doc 目录是一 ...

  4. Allwinner F1C100s coremark测试

    ccu register base:0x01c20000 devmem 0x01c20000 The PLL output=(24MHz*N*K)/(M*P) N=31 K=1 M=1 P=/1 re ...

  5. jenkins学习9-测试报告发邮件(Email Extension Plugin)

    前言 前面已经实现在jenkins上展示html的测试报告,接下来只差最后一步,把报告发给你的领导,展示你的劳动成果了. 安装 Email Extension Plugin 插件 jenkins首页- ...

  6. HIVE理论学习笔记

    概述 参加了新的公司新的工作新的环境之后,本人必须学习更多的知识,所以稳固之前的知识和学习新的知识是重中之重,新的公司把hadoop大部分的组件都进行了架构源码深度改造,所以使用过程确实遇到一些麻烦, ...

  7. Keil MDK STM32系列(五) 使用STM32CubeMX创建项目基础结构

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  8. docker镜像制作及发布

    以centos为例. 主要内容:安装docker,制作镜像,发布镜像. 安装docker 1. 安装docker yum install -y docker 等待一会,安装成功,查看安装列表 2. 启 ...

  9. git文件管理与索引,深入理解工作原理

    前言 这一夜,注定是个不眠之夜,小白和cangls的对话已然进入了白热化.小白孜孜不倦的咨询关于git方面的知识,对索引越来越感兴趣.小白以前存的小电影文件可以进行版本的对比,探索哪个版本画质更好. ...

  10. 论文翻译:2019_TCNN: Temporal convolutional neural network for real-time speech enhancement in the time domain

    论文地址:TCNN:时域卷积神经网络用于实时语音增强 论文代码:https://github.com/LXP-Never/TCNN(非官方复现) 引用格式:Pandey A, Wang D L. TC ...