当前位置:首页 > 问答 > 正文

其实把shp文件放进MySQL里,操作起来没那么复杂,大家别怕试试看

“其实把shp文件放进MySQL里,操作起来没那么复杂,大家别怕试试看”

这话是我在一个搞城市规划的朋友那里听来的,当时他正对着电脑上一大堆零散的地理数据发愁,他说,老用那些专门的GIS软件,虽然功能强大,但一到团队协作或者想用程序自动处理点数据的时候就头疼,后来他心一横,决定把常用的基础地图数据,就是那些.shp文件,整个搬到MySQL数据库里去,一开始也觉得这是个高深的技术活,怕搞不定,但真动手做下来,发现也就那么几步路,走通了之后,感觉打开了一扇新的大门。

你得明白一个关键点:MySQL从5.7版本开始,就自带了对空间数据的支持,这意味着它不仅能存普通的数字、文字,还能直接把点、线、面这些地理图形存进去,并且还能进行一些基本的空间查询,找出这个点周围500米内所有的便利店”,这功能是内置的,不需要你再装什么额外的插件,这就省去了很多麻烦。

那具体怎么把.shp文件这个“外来客”请进MySQL的“家门”呢?最直接、最常用的一个工具叫ogr2ogr,这名字听起来有点怪,但它是个神器,是GDAL库里的一个命令行工具,你不需要去理解GDAL是啥,就把它想象成一个万能的“数据格式转换器”就行,这个工具在很多GIS软件(比如QGIS)的安装包里其实已经自带了你可能已经在用了但没注意到,你也可以自己去网上下载独立的GDAL安装包,安装好后就能在命令行里使用了。

其实把shp文件放进MySQL里,操作起来没那么复杂,大家别怕试试看

操作步骤其实非常“傻瓜式”,就跟我们平时用命令拷贝文件差不多,你打开命令行(Windows是CMD或者PowerShell,Mac是终端),然后输入一条长得有点像下面这样的命令:

ogr2ogr -f "MySQL" MySQL:"你的数据库名,user=你的用户名,password=你的密码,host=localhost" "你的shp文件路径.shp" -nln 你想要的表名 -update -overwrite -lco GEOMETRY_NAME=geometry

看着长,别怕,我们把它拆开看:

  • -f "MySQL":意思是“我要输出到MySQL数据库”。
  • MySQL:"数据库名,user=用户名...":这一长串就是在告诉工具你的MySQL数据库住在哪里,门牌号(数据库名)是啥,用户名和密码是什么才能进门。
  • "你的shp文件路径.shp":这个就是你要搬家的那个shp文件的位置。
  • -nln 你想要的表名:这是给你在数据库里新建的那张表起个名字,比如叫city_roads(城市道路)。
  • -update -overwrite:大概是说,如果这个表已经存在,就更新覆盖它。
  • -lco GEOMETRY_NAME=geometry:这个是设定存储空间几何信息的列名叫geometry,这是默认的,用这个就行。

你唯一要做的,就是把上面命令里引号中的内容,换成你自己电脑上真实的数据信息,输完命令,一按回车,如果没报错,唰的一下,数据就导进去了!比你用图形界面点来点去可能还快。

其实把shp文件放进MySQL里,操作起来没那么复杂,大家别怕试试看

进去之后有什么用呢?好处就体现出来了,数据现在在MySQL里,就是个普通的数据库表,只不过多了一列叫geometry的特殊数据,你的团队成员,哪怕不懂GIS,只要会写点SQL,也能轻松地查询和调用这些地图数据了,比如你想知道一条新建的地铁线经过了哪些行政区划,在以前可能得在GIS软件里进行一通“叠加分析”操作,现在呢,可能一句SQL查询就搞定了,类似SELECT 行政区名 FROM 区划表 WHERE ST_Intersects(几何列, 地铁线几何对象)这样的逻辑。

备份和版本管理变得超级简单,整个地图数据现在就是数据库里的一张表,你备份数据库的时候,顺带就把地图数据备份了,用Git这类工具管理数据库结构变更时,也能间接地跟踪地图数据表结构的变化。

也不是说完全没有注意事项,shp文件其实是由好几个文件组成的(.shp, .shx, .dbf等),你要确保它们都在同一个文件夹下,并且名字一致,数据库的字符集最好设置成utf8mb4,免得中文地名什么的出现乱码,第一次操作前,在测试数据库上练练手是最稳妥的。

我那朋友最后总结说,这个过程最大的障碍不是技术,而是心理上觉得它很难、很专业,从而不敢尝试,一旦你成功地导进去第一个点图层,就会发现,后面再导线、面图层,甚至是其他格式的地理数据,都是换汤不换药的事儿,如果你也有类似的需求,被shp文件的管理和协作问题困扰,真的别怕,找个下午茶的时间,照着步骤试试看,很可能会有意想不到的收获。