基于GeoTools的GeoJson导入到PostGis实战
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实战相关推荐
- 视频教程-Three.js(webgl) webpack+es6 geojson 3d地图 项目实战视频教程-JavaScript
Three.js(webgl) webpack+es6 geojson 3d地图 项目实战视频教程 2008年开始从事C#编程工作,2013年转向Unity游戏开发领域,在谷歌市场及苹果商店陆续 发布 ...
- R语言导入SPSS文件实战
R语言导入SPSS文件实战 目录 R语言导入SPSS文件实战 #导入SPSS文件的基本语法 #包的安装和导入
- R语言导入.dta文件实战
R语言导入.dta文件实战 #导入.dta文件的基本语法 R的导入.dta文件最简单方法是使用haven库中的read_dta()函数. 此函数使用以下基本语法: data <- read_dt ...
- R基于H2O包构建深度学习模型实战
R基于H2O包构建深度学习模型实战 目录 R基于H2O包构建深度学习模型实战 #案例分析
- 基于Winsock API的VC网络编程实战
基于Winsock API的VC网络编程实战 随着计算机信息技术的飞速发展,互联网与人类社会的工作.生活越来越紧密相关,它已经成为人类获取.交流信息的重要途径和手段.所以当前对于开发人员来说,网络编程 ...
- 【项目实战课】基于Pytorch的Pix2Pix黑白图片上色实战
欢迎大家来到我们的项目实战课,本期内容是<基于Pytorch的黑白图像上色实战>.所谓项目实战课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题,进行代码级的实战讲解. ...
- 推荐一本基于ASP.NET Core 3.1的实战来了
第一本基于 ASP.NET Core 3.1 的实战书来了 我脱产花费了一年时间创作书籍<深入浅出 ASP.NET Core>,终于上架了.目前天猫.京东等主流平台均有销售. 这本书是基于 ...
- python如何使用geotools_基于GeoTools实现道路结点的提取
最近公司的地图业务数据换了供应商,由于在进行路径规划的时候需 要使用到道路结点进行图的构建,因而需要根据道路图层提取出道路的节点.因为经常使用arcpy,所以先用python写了个版本,通常将数据放在 ...
- [NLP]基于IMDB影评情感分析之BERT实战-测试集上92.24%
系列文章目录 深度学习NLP(一)之Attention Model; 深度学习NLP(二)之Self-attention, Muti-attention和Transformer; 深度学习NLP(三) ...
最新文章
- MySQL事务的回滚
- h3c怎么创建虚拟服务器,h3c 设置虚拟服务器
- 转:WinForm程序中两份mdf文件问题的解决方法
- mysql语句在node.js中的写法
- 解决跨域问题:No ‘Access-Control-Allow-Origin‘ header is present on the requested resource.
- java 多线程工具_多线程测试工具groboutils的使用
- python实时读取日志并打印关键字怎么实现_python pytest测试框架介绍五---日志实时输出...
- jdbc关于操作Oracle时间数据解析
- mysql数据库写分页函数_mysql数据库写分页函数
- w7如何调出计算机图标来,W7电脑系统怎么显示桌面图标
- 1.转子动力学——引言
- 6.1 阈值处理-- threshold函数
- 快速入门Opentracing-cpp
- 安装pyrit qq5ed84579da89e
- 你需要知道的50颗卫星:地球卫星清单
- MTK 轨迹球(JOG_BALL)
- C/C++编译器gcc的windows版本MinGW-w64安装教程
- 量化投资学习——股指期货理论价格说明
- Unity 渲染顺序
- 换天空的几个方式技巧