Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

LBS应用中,为了实现“经纬度转地址”的需求,快速定位选择用户地址,奈何百度、高德的API又要钱钱

那就自己下载城市边界数据,处理数据并导入到MySQL当中去吧!

省市区边界数据:https://xiangyuecn.gitee.io/areacity-jsspider-statsgov/

这里用的是省市区三级坐标边界数据

四级的数据要钱

好了,csv文件下载下来了,怎么把它导入到MySQL?好像直接用MySQL的指令没法导入这个csv文件哦?

看到这个边界数据提供者主页,他有提供一个转换工具,可以把csv转sql,不过好像……只能转10个哦,转多了他就要收钱了emm

那我们就自己解析一下csv文件,转成sql吧

首先咱先在MySQL当中建个表!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
CREATE TABLE Geo  (
id varchar(50) NOT NULL,
pid varchar(250) NOT NULL,
deep varchar(250) NOT NULL,
name varchar(250) NOT NULL,
ext_path varchar(255) NOT NULL,
geo geometry NOT NULL,
polygon geometry NOT NULL
) ENGINE = InnoDB CHARACTER SET = utf8;
import csv;
csv.field_size_limit(500 * 1024 * 1024)
path = "D:/Users/DELL/Desktop/Area-City/ok_geo.csv"; #csv地址
out = "D:/Users/DELL/Desktop/Area-City/sql.sql"; #sql地址
with open(path,'r',encoding="UTF-8-sig") as file:
with open(out,'w',encoding="UTF-8") as write:
reader = csv.DictReader(file);
for row in reader:
sid = row.get("id")
pid = row.get("pid")
deep = row.get("deep")
name = row.get("name")
ext_path = row.get("ext_path")
geo = row.get("geo")
polygon = row.get("polygon")
polygon+=","+(str.split(polygon, ",", 1)[0])
s = "INSERT INTO `Geo` VALUES('%s','%s','%s','%s','%s',ST_GeomFromText('POINT (%s)',0),ST_GeomFromText('POLYGON ((%s))',0));"
a=s%(sid,pid,deep,name,ext_path,geo,polygon)
write.write(a);

然后在mysql当中执行指令 就好啦,例如

1
source D:/Users/DELL/Desktop/Area-City/sql.sql

接下来,我们就可以在MySQL当中直接使用sql语句来做地址逆解析啦!

例如,我想获取经度116.929976 纬度28.342231的地名,那么就可以使用sql语句

1
SELECT id,deep,name FROM Geo WHERE ST_Intersects(polygon, ST_GeomFromText('POINT(116.929976 28.342231)',0))=1;

评论