网上搜到的GeoServer发布MongoDB中的矢量数据或shp数据的文章比较少,有一些文章还设置了付费可见,十分不方便。鉴于此,我们发一期shp数据到MongoDB再到GeoServer的过程梳理。
由于MongoDB是文档型数据库,因此需要先将shp转geojson,然后才能存入MongoDB,我们使用ogr2ogr工具将shp转geojson。ogr2ogr工具被集成到了QGIS、PostgreSQL和GDAL中,因此只要你安装了三者中的任意一个软件,都可以使用这个工具。本文以QGIS为例,ogr2ogr工具一般都位于bin目录下,如QGIS中位置如下图:
在这个目录下直接输入cmd后回车,cmd就进入了这个目录,然后输入ogr2og --help即可看到相应的帮助说明。


shp转geojson的命令为:
//ogr2ogr -f geojson <源shp路径> ogr2ogr -f geojson D:\test\test.geojson D:\test\shp\testline.shp 
执行完毕之后会看到已经出现了geojson文件
打开这个文件看看,OK,非常完美,标准的geojson。
接下来我们就需要将shp导入MongoDB了,先来看看MongoDB的安装路径如下:
注意:从
MongoDB4.4开始,mongodump.exe 、mongoexport.exe 、mongoimport.exe等数据库工具需要单独安装,所以当你看到你的MongoDB的bin目录下并没有这几个工具的时候,不要惊讶,不要着急。下载地址为:https://www.MongoDB.com/try/download/database-tools
shp导入MongoDB,首先我们需要将上面转成功的geojson处理一下,把原始的geojson的头尾去掉,也就是只留features:
变为这样:
cmd进入MongoDB的bin路径下,执行如下命令:
//mongoimport -h localhost:27017 -d dbname -c collectionname --file --jsonArray mongoimport -h localhost:27017 -d MLM -c cjg_roads --file "D:\test\test.geojson" --jsonArray 看到MongoDB中已经导入了数据
这一步在MongoDB中是必选项,使用其他数据库时,比如PostGIS、MySQL等并不需要。为什么要创建空间索引?因为不创建空间索引就会导致发布时找不到图层
创建空间索引的命令为:
//cjg_roads是集合名称 db.cjg_roads.createIndex({ "geometry": "2dsphere" }) 确保geometry字段显示了索引
到GeoServer官网下载自己的GeoServer版本对应的MongoDB插件即可。
https://GeoServer.org/download/#archive


下载完成后解压到GeoServer的webapps\geoserver\WEB-INF\lib目录下即可,然后重启GeoServer
经过了前面的步骤,发布就顺理成章了,点击新建数据存储,选择MongoDB即可。




为什么要把头尾去掉?如果不去掉头尾,那么导入命令是这样的:
//mongoimport -h localhost:27017 -d test -c json --type json --file mongoimport -h localhost:27017 -d MLM -c trees --type json --file "D:\test\test.geojson" 最后在GeoServer中发布时就会遇到坐标范围计算失败的问题
前文已经说过,从MongoDB4.4开始,mongodump.exe 、mongoexport.exe 、mongoimport.exe等数据库工具需要单独安装,所以当你看到你的MongoDB的bin目录下并没有这几个工具的时候,不要惊讶,不要着急。下载地址为:https://www.mongodb.com/try/download/database-tools
前文也说过了,没有空间索引,或空间索引未生效,会导致添加图层时读取不到图层,这里也就不再赘述了。
本文详细的梳理shp文件导入到MongoDB的过程,以及在GeoServer中发布的全过程,并提出了几个注意点,希望能引起读者的注意,回见~