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上将代码下载下来进行调试。
GeoJson是一种对各种地理数据结构进行编码的格式,基于json的地理空间信息数据交换格式。GeoJson对象可以用来表示几何,特征或者特征集合。支持地理点、线、面、多点、多线、多面及几何集合。GeoJson不是本文的重点,因此不再赘述。 PostGIS是在对象关系型数据库PostgreSQL上增加了存储管理空间数据的能力的开源GIS数据库。本文的例子不能直接运行在PostgreSql的数据库上,需要装扩展依赖才行(具体可参考某度的详细教程)。 本......
是一个开放源Java库,提供了地理空间数据工具。 我们的用户指南了核心功能,支持的格式和标准支持。
GeoTools已根据。 用户指南页面描述了对文档和源代码示例的限制较少的许可证。
开发人员指南概述了使用补丁,提取请求和设置新模块为
GeoTools方法。
如果您已经对GitHub有经验,请在开始之前检查我们的页面!
GeoTools使用作为构建系统。 要构建库,请从存储库的根目录运行maven。
% mvn clean install
有关更多详细信息,请参见。
GeoTools使用托管的进行问题跟踪。
适用于与
GeoTools使用相关的所有问题。
Geotools操作GeoJSON:解析FeatureCollection对象文件GeoJSON是基于JavaScript的对象的地理信息数据格式。GeoJSON格式示例:{
"type":"FeatureCollection",
"features":[
"type":"Feature",
"propertie...
用ECharts画区域地图的时候,需要geoJson,可以在下面链接获取
http://datav.aliyun.com/tools/atlas/#&lat=33.50475906922609&lng=104.2822265625&zoom=4
获取后到json.cn格式化下载下来就ok了...
1. geotools简介
geotools是java语言封装的空间数据框架。类似于spring之与java web项目,geotools提供丰富的GIS组件,可用于快速二次搭建GIS平台。详细可登录geotools官网了解其功能信息(https://geotools.org/)。
2. geotools postgis源码解析
postgis是postgresql数据库的扩展,可以理解为postgresql的GIS化功能封装。
本博文用postgresql 11和postgis 3.1.1版本给大
好的,如果您出现了获取 geojson SimpleFeatureType 失败的问题,可能是由于以下原因:
1. 文件路径不正确:请确保您的文件路径是正确的,并且可以被您的程序访问。
2. 文件格式错误:请确保您的文件是符合 geojson 格式的,并且可以被 geotools 解析。
3. 编码问题:请确保您的文件的编码方式正确,并且可以被 geotools 正确解析。
对于如何读取 geojson SimpleFeatureType,您可以参考以下代码:
```java
// 1. 创建一个 GeoJSON 文件对象
File file = new File("path/to/your/geojson/file");
// 2. 创建一个 GeoJSON 数据存储对象
DataStore dataStore = DataStoreFinder.getDataStore(Collections.singletonMap("url", file.toURI().toURL()));
// 3. 获取 GeoJSON 数据的 FeatureSource 对象
SimpleFeatureSource featureSource = dataStore.getFeatureSource(dataStore.getTypeNames()[0]);
// 4. 获取 FeatureCollection 对象
FeatureCollection<SimpleFeatureType, SimpleFeature> featureCollection = featureSource.getFeatures();
// 5. 遍历 FeatureCollection 对象
try (FeatureIterator<SimpleFeature> features = featureCollection.features()) {
while (features.hasNext()) {
SimpleFeature feature = features.next();
// 在这里处理每个 feature
如果您还有其它问题或者需要更详细的帮助,请告诉我。