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 数据源

public class PostgisDataStore {private static Logger logger = Logger.getLogger(PostgisDataStore.class);private static DataStore postgisDataStore = null;private static String dbtype = null;private static String host = null;private static String port = null;private static String database = null;private static String schema = null;private static String username = null;private static String password = null;public PostgisDataStore() {}public static DataStore getInstance() {if (postgisDataStore == null) {Map<String, Object> params = new HashMap<String, Object>();params.put(PostgisNGDataStoreFactory.DBTYPE.key, dbtype);params.put(PostgisNGDataStoreFactory.HOST.key, host);params.put(PostgisNGDataStoreFactory.PORT.key, new Integer(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 (IOException e) {logger.error("\nPostgisDataStore 初始化geotools中的 Datastore失败\n");logger.error(e.getMessage());}}return postgisDataStore;}}

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

第三步:准备待带入的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*/public static boolean importGeojson(String geojsonpath, String tablename) throws IOException {if (!validateGeojson(geojsonpath, true)) return false;DataStore pgDatastore = postgisDataStore.getInstance();FeatureJSON featureJSON = new FeatureJSON();FeatureCollection featureCollection = featureJSON.readFeatureCollection(new FileInputStream(geojsonpath));SimpleFeatureType geojsontype = (SimpleFeatureType) featureCollection.getSchema();SimpleFeatureTypeBuilder typeBuilder = new SimpleFeatureTypeBuilder();typeBuilder.init(geojsontype);typeBuilder.setName(tablename);SimpleFeatureType newtype = typeBuilder.buildFeatureType();pgDatastore.createSchema(newtype);FeatureIterator iterator = featureCollection.features();FeatureWriter<SimpleFeatureType, SimpleFeature> featureWriter = pgDatastore.getFeatureWriterAppend(tablename, Transaction.AUTO_COMMIT);while (iterator.hasNext()) {Feature feature = iterator.next();SimpleFeature simpleFeature = featureWriter.next();Collection<Property> properties = feature.getProperties();Iterator<Property> propertyIterator = properties.iterator();while (propertyIterator.hasNext()) {Property property = propertyIterator.next();simpleFeature.setAttribute(property.getName().toString(), property.getValue());}featureWriter.write();}iterator.close();featureWriter.close();pgDatastore.dispose();return true;}

第五步:测试调用

PostgisDataStore postgisDataStore = new PostgisDataStore();
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);boolean flag = PostgisUtility.importGeojson("D:\\wzh_workspace_20210320\\geotools4postgis\\src\\main\\java\\iwuang\\line.geojson", "wzh_line2");
System.out.println(flag);

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

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

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

基于GeoTools的GeoJson导入到PostGis实战相关推荐

  1. 视频教程-Three.js(webgl) webpack+es6 geojson 3d地图 项目实战视频教程-JavaScript

    Three.js(webgl) webpack+es6 geojson 3d地图 项目实战视频教程 2008年开始从事C#编程工作,2013年转向Unity游戏开发领域,在谷歌市场及苹果商店陆续 发布 ...

  2. R语言导入SPSS文件实战

    R语言导入SPSS文件实战 目录 R语言导入SPSS文件实战 #导入SPSS文件的基本语法 #包的安装和导入

  3. R语言导入.dta文件实战

    R语言导入.dta文件实战 #导入.dta文件的基本语法 R的导入.dta文件最简单方法是使用haven库中的read_dta()函数. 此函数使用以下基本语法: data <- read_dt ...

  4. R基于H2O包构建深度学习模型实战

    R基于H2O包构建深度学习模型实战 目录 R基于H2O包构建深度学习模型实战 #案例分析

  5. 基于Winsock API的VC网络编程实战

    基于Winsock API的VC网络编程实战 随着计算机信息技术的飞速发展,互联网与人类社会的工作.生活越来越紧密相关,它已经成为人类获取.交流信息的重要途径和手段.所以当前对于开发人员来说,网络编程 ...

  6. 【项目实战课】基于Pytorch的Pix2Pix黑白图片上色实战

    欢迎大家来到我们的项目实战课,本期内容是<基于Pytorch的黑白图像上色实战>.所谓项目实战课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题,进行代码级的实战讲解. ...

  7. 推荐一本基于ASP.NET Core 3.1的实战来了

    第一本基于 ASP.NET Core 3.1 的实战书来了 我脱产花费了一年时间创作书籍<深入浅出 ASP.NET Core>,终于上架了.目前天猫.京东等主流平台均有销售. 这本书是基于 ...

  8. python如何使用geotools_基于GeoTools实现道路结点的提取

    最近公司的地图业务数据换了供应商,由于在进行路径规划的时候需 要使用到道路结点进行图的构建,因而需要根据道路图层提取出道路的节点.因为经常使用arcpy,所以先用python写了个版本,通常将数据放在 ...

  9. [NLP]基于IMDB影评情感分析之BERT实战-测试集上92.24%

    系列文章目录 深度学习NLP(一)之Attention Model; 深度学习NLP(二)之Self-attention, Muti-attention和Transformer; 深度学习NLP(三) ...

最新文章

  1. MySQL事务的回滚
  2. h3c怎么创建虚拟服务器,h3c 设置虚拟服务器
  3. 转:WinForm程序中两份mdf文件问题的解决方法
  4. mysql语句在node.js中的写法
  5. 解决跨域问题:No ‘Access-Control-Allow-Origin‘ header is present on the requested resource.
  6. java 多线程工具_多线程测试工具groboutils的使用
  7. python实时读取日志并打印关键字怎么实现_python pytest测试框架介绍五---日志实时输出...
  8. jdbc关于操作Oracle时间数据解析
  9. mysql数据库写分页函数_mysql数据库写分页函数
  10. w7如何调出计算机图标来,W7电脑系统怎么显示桌面图标
  11. 1.转子动力学——引言
  12. 6.1 阈值处理-- threshold函数
  13. 快速入门Opentracing-cpp
  14. 安装pyrit qq5ed84579da89e
  15. 你需要知道的50颗卫星:地球卫星清单
  16. MTK 轨迹球(JOG_BALL)
  17. C/C++编译器gcc的windows版本MinGW-w64安装教程
  18. 量化投资学习——股指期货理论价格说明
  19. Unity 渲染顺序
  20. 换天空的几个方式技巧

热门文章

  1. 文件管理工具,文件批量改名,文件从1到100命名
  2. lotus notes 闪退_黑鲨研习win7系统Lotus Notes邮箱闪退的技巧
  3. 2. 深度生成模型-扩散模型(去噪扩散概率模型)
  4. go桌面计算机,GO桌面快速找到应用程序方法教程
  5. 《中华护理杂志》(半月刊)投稿须知
  6. 高压功率放大器ATA4051VS高压功率放大器HSA4051
  7. 新能源汽车行业资讯-2022-9-11
  8. 基于51单片机的超声波测距模块
  9. HC-SR04超声波测距模块功能简述
  10. 常用正则表达式—邮箱