文章目录

  • 步骤一、下载省市区边界数据
  • 步骤二、解析CSV文件导入数据库
  • 步骤三、在程序中根据坐标解析获得城市

在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, --城市idpid int NOT NULL, --上级城市iddeep 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. android往天气接口里面传城市,Android使用中国天气网API数据通过城市名称获取天气情况...

    项目要求在应用首页面展示本地当日天气的概况,首先想到的是google和雅虎,前者很久之前接触过,听说后来用不了了,后者由于邮箱事件的缘故个人不喜欢(虽然貌似苹果也用雅虎的天气预报),之后又想到了前段时 ...

  2. 百度地图--展示行政区划(省市区县)和添加多个标注点案例

    百度地图JavaScript API支持HTTP和HTTPS,免费对外开放,可直接使用.接口使用无次数限制.在使用前,您需先申请密钥(ak)才可使用. 申请密钥链接: http://lbsyun.ba ...

  3. JAVA根据省市区县获取配置文件经纬度(静态)

    突然间有个小伙伴咨询我根据省市区县获取配置文件经纬度,于是我就按照自己的思路,写了一个demo给到小伙伴.同时,很感谢我大卢进,毕竟我是在他的基础上,做优化的. 本人采用的maven库,做jar包的托 ...

  4. 【02】中国县区以上行政区划经纬度坐标

    []中国县区以上行政区划经纬度坐标 百度云盘下载地址: 链接:https://pan.baidu.com/s/14qrydITszqZvP9hWcPlbpw 密码:0u1u 是过去使用过的经纬度资料. ...

  5. python百度地图api经纬度_Python调用百度地图和高德地图API批量获取国内城市地址经纬度坐标...

    1 数据准备 经过尝试,百度地图API需要输入城市中文名称才能获取对应经纬度坐标,因此先将英文的城市名称转为中文 一共347个城市 由于在测试过程中发现高德和百度地图API分别有几个城市的地址无法获取 ...

  6. 百度地图 省市区县 信息展示

    先上效果图(PS:数据为mock数据): 1.一级地图 2.二级地图 3.三级地图 . 4.四级地图 概述 效果图是不是有点多呀,不过能看到这里的估计这些效果图就是你们想要的效果啦,好,下面就来介绍一 ...

  7. 根据经纬度确定行政区域_基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标...

    前言 近来由于工作需要,需要提取某些城市的经纬度坐标,稍微搜索了一下,发现百度地图和高德地图都提供了相关的函数和例子.那么剩余的工作也就比较简单了,保存坐标,然后转换为WGS坐标,这样才能和现有的GP ...

  8. python取省边界_提取行政区边界经纬度坐标(高德+百度)

    前言 近来由于工作需要,需要提取某些城市的经纬度坐标,稍微搜索了一下,发现百度地图和高德地图都提供了相关的函数和例子.那么剩余的工作也就比较简单了,保存坐标,然后转换为WGS坐标,这样才能和现有的GP ...

  9. 使用echarts完成中国省市区县镇地图展示

    目录 前言 一.中国地图 1.1 地图数据-china.js 1.2 代码应用 二.省份地图--以山东为例,其他省份同理 2.1 地图数据-shandong.js 2.2 代码应用 三.市级地图--以 ...

最新文章

  1. 大数据与数据挖掘考试题_北京2020届中考物理出题策略大揭秘!
  2. 已解决 问题ModuleNotFoundError: No module named ‘tensorflow.examples.tutorials‘
  3. Java的ATM界面任务台选择同时有文本和数据库登陆注册
  4. 1-java学习笔记
  5. DSP sawtooth锯齿波与square方波matlab产生(M2.2)
  6. 转:Java中abstract和interface的区别
  7. GAN生成式对抗网络简介及MINST实现
  8. Windows系统安装运行库
  9. 改手机为自动开机的车载导航仪
  10. java中前加加++和后加加++的详解
  11. Latex的一些排版技巧
  12. ARM来中关村“卖艺”,地平线机器人科技拜码头
  13. 我们整理了20个Python项目,送给正在求职的你
  14. Qt+OSG/osgEarth跨平台编译(用Qt Creator组装各个库,实现一套代码、一套框架,跨平台编译)
  15. Debian10英语环境安装搜狗输入法
  16. YOLOv5-Lite:NCNN+Int8部署和量化,树莓派也可实时
  17. 赵明magic4升鸿蒙,荣耀Magic新机生猛:折叠屏+骁龙888+鸿蒙系统,赵明:超越华为...
  18. 大数据的理解,大数据是什么,大数据能干什么?
  19. 区块链对抑制公共部门的腐败有什么作用?
  20. 期刊模板-如何去除左下角的横线

热门文章

  1. 机器学习之决策树实现隐形眼镜预测
  2. Pychram连接mist远程服务器踩坑指南
  3. IDE 的主题应该用亮色还是暗色?终极答案来了!
  4. 【报错排查】MAC系统升级后项目无法启动踩坑
  5. 在MQTT中使用SSL/TLS提高安全性
  6. java.lang.IllegalStateException: getOutputStream() has already been ca...
  7. 用java画一个小猪佩奇_python 画个小猪佩奇
  8. Wordpress响应式Git主题/响应式CMS主题模板
  9. java文件读取报(文件名、目录名或卷标语法不正确。)
  10. VC遍历INI配置文件