在LBS应用中,根据坐标来解析获得对应是哪个城市是一个很常见的功能,比如App里面通过手机定位自动选择城市;本文介绍的是通过自己建的数据库,利用SQL空间查询来进行坐标解析得到对应的省市区,绝大部分支持空间数据类型(
Spatial
)的数据库均支持,包括但不限于:
MySQL
、
SQL Server
、
Oracle
、
PostgreSQL
等;开发语言不限,只要能进行数据库查询就都支持,用
Java
、
Python
、
PHP
、
C#
均能很简单的实现。
省市区边界数据在线预览、下载:
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
导入数据库外,还支持导出:
sql
、
shp
、
geojson
,和坐标系转换;还可执行自定义 JavaScript 脚本,扩展出丰富功能;软件是Windows版,如果需要在MacOs中用,可以用虚拟机。
转换工具执行导入数据库操作:
点击
选择ok_geo.csv文件
按钮,选择解压出来的CSV文件;
数据库设置中选择要导入的数据库类型,这里选的是
MySQL
,再填写数据库连接,包括:端口、数据库名称、账号密码;
点击
导入数据库
按钮,等待一会,大约3分钟左右,所有数据就都导入到了数据库按今天日期新建的表里面。
注:csv文件内的边界数据默认是高德地图
GCJ-02
火星坐标系,如果需要其他坐标系,比如百度的
BD-09
或GPS的
WGS-84
,可以通过高级脚本中的坐标系转换插件进行转换,选择好对应的插件后,点击应用就可以了,在导入数据库时会自动进行坐标系转换。
注:这个工具限制每次操作只可导出一个城市和它的下一级数据,导出少量数据还是很轻松的,所以我们可以多操作几次,将需要的城市数据全部导入数据库;比如要深圳的所有区县数据:第一遍导入全国所有的省,第二遍在城市名前缀中填写
广东省
(结尾带一个空格)导入广东所有的市,第三遍在城市名前缀中填写
广东省 深圳市
(结尾带一个空格)导入深圳所有的区。如果在密钥输入框中填写了密钥,此工具就没有这些限制了,开源库里面会不定期发放密钥搞福利,点击一次操作即可导出全国所有的省市区三级数据。
表结构和空间字段(MySQL版,其他数据库类似):
CREATE TABLE Areacity_Geo_20220216 (
id int NOT NULL,