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