Windows环境下GeoTools 连接PostGIS时候一些坑

在写一个使用GeoTools连接PostGIS数据库的测试程序的时候,遇到了一些坑,分享给大家。

软件环境和版本如下:

Windows 10 专业版

GeoTools-19(GeoTools官网

PostgreSQL10(PostgreSQL下载地址

PostGIS2.4.4(PostGIS官网

IDE 用的是IntelliJ IDEA 2017.2.4 x64

1.PostgreSQL安装包的下载

     PostGIS官方网站提供的Windows安装包,针对的是EnterpriseDb 发行的版本,下载要去上文给出的连接下载。


2.新建Geotools角色

      新建Geotools角色,我这里直接给的是超级管理员的角色。

      没有Geotools的角色,连接的时候会报错。

3.新建EPSG数据库

     数据库及PostGIS安装完成后,需要手动新建一个EPSG的数据库,定义基本的坐标系。否则会报找不到EPSG的错误。

     建EPSG数据库的方法见官方文档(新建EPSG数据库的方法)。

     我这里的步骤是,新建一个空的EPSG数据库,下载EPSG_v65.mdb-sql.zip文件(上面官方文档中有)。在数据库中依次执行:

  •       EPSG_v65.mdb_DDL.sql
  •       EPSG_v65.mdb_DDL2.sql
  •       EPSG_v65.mdb_DML.sql

     注意,不要执行EPSG_v65.mdb_DDL3.sql,它会把刚建的表都删了。

4.加载GeoTools的Jar包

   解压从官网下载的Geotools的Jar包到开发环境,但是要注意GeoTools操作ESPG数据库的Jar只能存在一个,否则会报奇怪的错误。

   比如我这里是连接PostgreSQL数据库,那么我就要删掉除了gt-epsg-postgresql之外的其他3个Jar包(官网解释)。

  • gt-epsg-hsql
  • gt-epsg-oracle
  • gt-epsg-wkt

然后将全部jar加载到工程的Libraries下面,开发环境就配好了。

4.测试代码如下


import java.io.IOException;
import java.util.*;

import org.geotools.data.DataStore;
import org.geotools.data.DataStoreFinder;

import org.geotools.data.postgis.PostgisNGDataStoreFactory;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.feature.FeatureIterator;
import org.opengis.feature.simple.SimpleFeature;
import com.vividsolutions.jts.geom.MultiPolygon;

import java.util.HashMap;

public class JTSTest {
    public static void main(String[] args) throws IOException {
        //数据库连接参数配置
        Map<String, Object> params = new HashMap<String, Object>();
        params.put( PostgisNGDataStoreFactory.DBTYPE.key, "postgis");
        params.put( PostgisNGDataStoreFactory.HOST.key, "localhost");
        params.put( PostgisNGDataStoreFactory.PORT.key, 5432);
        //数据库名
        params.put( PostgisNGDataStoreFactory.DATABASE.key, "AreaTest");
        //用户名和密码
        params.put( PostgisNGDataStoreFactory.USER.key, "postgres");
        params.put( PostgisNGDataStoreFactory.PASSWD.key, "admin");
        ArrayList<SimpleFeature> featureList = new ArrayList<SimpleFeature>();
        DataStore pgDatastore = DataStoreFinder.getDataStore(params);
        //图层名
        SimpleFeatureSource featureSource =pgDatastore.getFeatureSource("loadshp");
        SimpleFeatureCollection result = featureSource.getFeatures();
        FeatureIterator<SimpleFeature> itertor = result.features();
        while (itertor.hasNext()) {
            SimpleFeature feature = itertor.next();
            featureList.add(feature);
        }
        itertor.close();
        //计算得到多边形面积
        SimpleFeature sf = featureList.get(0);
        MultiPolygon geom=(MultiPolygon)sf.getDefaultGeometry();
        System.out.println(geom.getArea());
    }
}

计算得到第一个多边形的面积如下:

转载自:https://blog.csdn.net/chajizhuo3103/article/details/80353056

You may also like...