基于GeoTools的GeoJson导入到PostGis实战

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: GeoJson是一种对各种地理数据结构进行编码的格式,基于json的地理空间信息数据交换格式。GeoJson对象可以用来表示几何,特征或者特征集合。支持地理点、线、面、多点、多线、多面及几何集合。GeoJson不是本文的重点,因此不再赘述。

   GeoJson是一种对各种地理数据结构进行编码的格式,基于json的地理空间信息数据交换格式。GeoJson对象可以用来表示几何,特征或者特征集合。支持地理点、线、面、多点、多线、多面及几何集合。GeoJson不是本文的重点,因此不再赘述。

   PostGIS是在对象关系型数据库PostgreSQL上增加了存储管理空间数据的能力的开源GIS数据库。本文的例子不能直接运行在PostgreSql的数据库上,需要装扩展依赖才行(具体可参考某度的详细教程)。

   本文将重点介绍如何基于GeoTools将GeoJson数据导入到PostGis中,并通过数据库客户端软件查询到导入结果。

   本实例运行环境:

1:win7+jdk8+GeoTools 24+POSTGIS: 3.1+PostgreSQL 9.6.14

第一步:准备GeoTools依赖的包,详情见pom.xml

<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-shapefile</artifactId><version>${geotools.version}</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-swing</artifactId><version>${geotools.version}</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-main</artifactId><version>${geotools.version}</version></dependency><dependency><groupId>org.geotools.jdbc</groupId><artifactId>gt-jdbc-postgis</artifactId><version>${geotools.version}</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-metadata</artifactId><version>${geotools.version}</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-referencing</artifactId><version>${geotools.version}</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-geojson</artifactId><version>${geotools.version}</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-epsg-hsql</artifactId><version>${geotools.version}</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency><!--非必需,简化I/O操作--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency><dependency><groupId>org.postgis</groupId><artifactId>postgis-driver</artifactId><version>1.0</version></dependency></dependencies>

第二步:创建PostGis数据源操作对象,相当于JDBC 数据源

publicclassPostgisDataStore {
privatestaticLoggerlogger=Logger.getLogger(PostgisDataStore.class);
privatestaticDataStorepostgisDataStore=null;
privatestaticStringdbtype=null;
privatestaticStringhost=null;
privatestaticStringport=null;
privatestaticStringdatabase=null;
privatestaticStringschema=null;
privatestaticStringusername=null;
privatestaticStringpassword=null;
publicPostgisDataStore() {
    }
publicstaticDataStoregetInstance() {
if (postgisDataStore==null) {
Map<String, Object>params=newHashMap<String, Object>();
params.put(PostgisNGDataStoreFactory.DBTYPE.key, dbtype);
params.put(PostgisNGDataStoreFactory.HOST.key, host);
params.put(PostgisNGDataStoreFactory.PORT.key, newInteger(port));
params.put(PostgisNGDataStoreFactory.DATABASE.key, database);
params.put(PostgisNGDataStoreFactory.SCHEMA.key, schema);
params.put(PostgisNGDataStoreFactory.USER.key, username);
params.put(PostgisNGDataStoreFactory.PASSWD.key, password);
try {
postgisDataStore=DataStoreFinder.getDataStore(params);
logger.info("\nPostgisDataStore 初始化geotools中的 Datastore成功\n");
            } catch (IOExceptione) {
logger.error("\nPostgisDataStore 初始化geotools中的 Datastore失败\n");
logger.error(e.getMessage());
            }
        }
returnpostgisDataStore;
    }
}

以上代码仅供参考,如需在实战中使用,还是尽可能利用已有的连接池技术提高应用性能。

第三步:准备待带入的GeoJson数据,以Line为例

{
"type": "FeatureCollection",
"features": [
    {
"type": "Feature",
"properties": {
"name": "north",
"linedesc": "A"      },
"geometry": {
"type": "LineString",
"coordinates": [
          [
476.7884016036988,
39.9663655061331          ],
          [
476.7959976196289,
39.96679309103126          ],
          [
476.80423736572268,
39.96613526700328          ]
        ]
      }
    }
   ]
}

第四步:将GeoJson数据写入到数据库中,关键代码如下:

/**     * geojson 文件导入的Postgis数据库     *     * @param geojsonpath geojson文件存储路径,包括文件拓展名.json或者.geojson     * @param tablename   自定义存储到postgis数据库存储的表的名称     * @return 导入结果     * @throws IOException     */publicstaticbooleanimportGeojson(Stringgeojsonpath, Stringtablename) throwsIOException {
if (!validateGeojson(geojsonpath, true)) returnfalse;
DataStorepgDatastore=postgisDataStore.getInstance();
FeatureJSONfeatureJSON=newFeatureJSON();
FeatureCollectionfeatureCollection=featureJSON.readFeatureCollection(newFileInputStream(geojsonpath));
SimpleFeatureTypegeojsontype= (SimpleFeatureType) featureCollection.getSchema();
SimpleFeatureTypeBuildertypeBuilder=newSimpleFeatureTypeBuilder();
typeBuilder.init(geojsontype);
typeBuilder.setName(tablename);
SimpleFeatureTypenewtype=typeBuilder.buildFeatureType();
pgDatastore.createSchema(newtype);
FeatureIteratoriterator=featureCollection.features();
FeatureWriter<SimpleFeatureType, SimpleFeature>featureWriter=pgDatastore.getFeatureWriterAppend(tablename, Transaction.AUTO_COMMIT);
while (iterator.hasNext()) {
Featurefeature=iterator.next();
SimpleFeaturesimpleFeature=featureWriter.next();
Collection<Property>properties=feature.getProperties();
Iterator<Property>propertyIterator=properties.iterator();
while (propertyIterator.hasNext()) {
Propertyproperty=propertyIterator.next();
simpleFeature.setAttribute(property.getName().toString(), property.getValue());
            }
featureWriter.write();
        }
iterator.close();
featureWriter.close();
pgDatastore.dispose();
returntrue;
    }

第五步:测试调用

PostgisDataStorepostgisDataStore=newPostgisDataStore();
PostgisDataStore.setHost("127.0.0.1");
PostgisDataStore.setPort("5432");
// 扩展数据库类型,读取postgis该参数类型设置为postgis// 其余设置对应的数据库类型,要求jdbc支持并且引入相关库PostgisDataStore.setDbtype("postgis");
PostgisDataStore.setDatabase("postgis_31_sample");
PostgisDataStore.setSchema("public");
PostgisDataStore.setUsername("asus");
PostgisDataStore.setPassword("postgres");
PostgisUtility.setPostgisDataStore(postgisDataStore);
booleanflag=PostgisUtility.importGeojson("D:\\wzh_workspace_20210320\\geotools4postgis\\src\\main\\java\\iwuang\\line.geojson", "wzh_line2");
System.out.println(flag);

使用数据客户端软件打开后可以查询到导入的数据

image.png

总结,通过以上程序可以实现GeoJson数据的导入,如果遇到数据库连不上,请查找是不是数据连接信息没有正确配置,比如用户名密码等有没有正确输入。应用程序处理通用序列图如下:

image.png

本文代码参考至https://github.com/yieryi/geotools4postgis,有兴趣的各位可以到github上将代码下载下来进行调试。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
存储 Java 定位技术
gis利器之Gdal(二)shp数据读取
本文首先简单介绍了空间数据shp数据的基本知识,其常见的文件组成形式。使用qgis软件对数据进行常规预览,最后重点介绍了使用gdal对矢量信息进行读取,​包括空间信息和属性信息
1329 0
gis利器之Gdal(二)shp数据读取
|
数据可视化 前端开发 关系型数据库
基于Mybatis-Plus实现Geometry字段在PostGis空间数据库中的使用
本文讲解在mybatis-plus中操作geometry空间字段,同时实现查询和插入操作​。通过geojson,结合前端可视化组件即可完成​矢量数据的空间可视化。
2670 0
基于Mybatis-Plus实现Geometry字段在PostGis空间数据库中的使用
|
5月前
|
SQL 关系型数据库 数据库
利用geopandas与PostGIS进行交互
利用geopandas与PostGIS进行交互
98 1
|
7月前
使用JTS及其姐妹项目GeoTools进行坐标系转换
【6月更文挑战第7天】使用JTS及其姐妹项目GeoTools进行坐标系转换
773 0
|
API C++ Python
Fiona简介及Shapefile数据读取
用GDAL的Python绑定API书写程序有没有一种仍然在写C/C++的感觉,Fiona基于GDAL提供了更加Pythonic的读取空间矢量数据的API,参见:http://toblerity.org/fiona/index.html
123 0
|
存储 JSON 前端开发
GIS开发:GeoJSON文件压缩
GIS开发:GeoJSON文件压缩
725 0
|
算法 定位技术 Apache
GIS开发:echarts的GeoJSON文件压缩
GIS开发:echarts的GeoJSON文件压缩
426 0
|
数据可视化
excel点数据导入arcgis
在最近的工作中,需要将坐标点(Excel格式)导入到ArcGIS中,用来做地理可视化和数据统计,例如下面的坐标点数据。
287 0
|
定位技术 API 数据库
GIS开发:开源gdal切片
GIS开发中开源gdal切片使用
463 0
|
关系型数据库 数据库 PostgreSQL

热门文章

最新文章