基于GeoTools的GeoJson导入到PostGis实战

简介: 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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
MyBatisPlus+PostGIS实现Geometry数据的通用读写
MyBatisPlus+PostGIS实现Geometry数据的通用读写
1317 0
|
数据可视化 前端开发 关系型数据库
基于Mybatis-Plus实现Geometry字段在PostGis空间数据库中的使用
本文讲解在mybatis-plus中操作geometry空间字段,同时实现查询和插入操作​。通过geojson,结合前端可视化组件即可完成​矢量数据的空间可视化。
3618 0
基于Mybatis-Plus实现Geometry字段在PostGis空间数据库中的使用
|
NoSQL Redis
Redis进阶-bind参数详解
Redis进阶-bind参数详解
812 0
|
JavaScript 前端开发 Java
springboot整合minio+vue实现大文件分片上传,断点续传(复制可用,包含minio工具类)
springboot整合minio+vue实现大文件分片上传,断点续传(复制可用,包含minio工具类)
4221 2
|
12月前
|
JSON 前端开发 Java
深入理解 Spring Boot 中日期时间格式化:@DateTimeFormat 与 @JsonFormat 完整实践
在 Spring Boot 开发中,日期时间格式化是前后端交互的常见痛点。本文详细解析了 **@DateTimeFormat** 和 **@JsonFormat** 两个注解的用法,分别用于将前端传入的字符串解析为 Java 时间对象,以及将时间对象序列化为指定格式返回给前端。通过完整示例代码,展示了从数据接收、业务处理到结果返回的全流程,并总结了解决时区问题和全局配置的最佳实践,助你高效处理日期时间需求。
1863 0
|
关系型数据库 Serverless 定位技术
PostgreSQL GIS函数判断两条线有交点的函数是什么?
PostgreSQL GIS函数判断两条线有交点的函数是什么?
1046 60
|
消息中间件 SQL 运维
AIOps 智能运维:比专家经验更优雅的错/慢调用分析工具
本文主要介绍ARMS 错/慢 Trace 分析功能基本原理; 该功能能够覆盖哪些异常 Trace 根因; 最后会介绍一些最佳实践案例。
50359 122
|
监控 算法 安全
视频实景三维---实时视频与三维融合,数字孪生的升级版
实时视频与三维融合技术将监控视频与三维模型有机结合,实现室内外连续、实时、动态的三维全景展示。该技术通过先进算法,将视频内容精准映射到三维场景中,提供直观、立体的监控视角,增强场景理解与感知,广泛应用于安防、智慧城市、建筑设计、应急救援和工业生产等领域,提升监控效率和决策准确性。
1721 0
使用JTS及其姐妹项目GeoTools进行坐标系转换
【6月更文挑战第7天】使用JTS及其姐妹项目GeoTools进行坐标系转换
1601 0
|
存储 Java 数据挖掘