您的位置:首页 > 编程语言

geotools 使用 部分代码总结

2017-03-28 17:19 453 查看
本文转载自博客:http://blog.csdn.net/woshioosm/article/details/7438564

前段时间的一个项目 本来用ae完成了种种的 查询,空间分析等等功能的代码,但是不幸的是 这是一个web项目,无奈 ae各种错误,显然ae放在server端是不好使的 无奈 一咬牙一跺脚 全部换 换成geotools 看文档 看api 从零 开始算是把 原来AE实现的东西 统统改了过来 用起来 反而觉得既稳定 效率还不错哈!

以下是部分功能总结:
1、连接数据库 这里使用的postgis
链接代码如下:


[java] view
plain copy

private static void conn(String dbtype, String host, String port,

String database, String userName, String password) {

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, new Integer(5432));

// params.put(PostgisNGDataStoreFactory.DATABASE.key, "postgis");

// params.put(PostgisNGDataStoreFactory.SCHEMA.key, "public");

// params.put(PostgisNGDataStoreFactory.USER.key, "postgres");

// params.put(PostgisNGDataStoreFactory.PASSWD.key, "root");

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, "public");

params.put(PostgisNGDataStoreFactory.USER.key, userName);

params.put(PostgisNGDataStoreFactory.PASSWD.key, password);

try {

pgDatastore = DataStoreFinder.getDataStore(params);

if (pgDatastore != null) {

System.out.println("系统连接到位于:" + host + "的空间数据库" + database

+ "成功!");

} else {

System.out.println("系统连接到位于:" + host + "的空间数据库" + database

+ "失败!请检查相关参数");

}

} catch (IOException e) {

e.printStackTrace();

System.out.println("系统连接到位于:" + host + "的空间数据库" + database

+ "失败!请检查相关参数");

}

}

调用方法为:conn("postgis", "localhost", 5432, "postgis", "postgres", "root");

2、图层的操作

[java] view
plain copy

2.1 查询

public static ArrayList<SimpleFeature> queryMethod(String filterStr,

String layerName) {

//pgDatastore为上文连接数据库获取相当于AE中的workspace

//SimpleFeatureSource相当于AE中的featureClass

SimpleFeatureSource featureSource =pgDatastore.getFeatureSource(layerName);

ArrayList<SimpleFeature> featureList = new ArrayList<SimpleFeature>();

if(featureSource==null)

return featureList;

try {

Filter filter;

filter = CQL.toFilter(filterStr); // filterStr形式 如 name='武汉大学' or code like 'tt123%'

SimpleFeatureCollection result = featureSource.getFeatures(filter);

FeatureIterator<SimpleFeature> itertor = result.features();

while (itertor.hasNext()) {

SimpleFeature feature = itertor.next();

featureList.add(feature);

}

itertor.close();

return featureList;

} catch (CQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return null;

}

[java] view
plain copy

2.2 要素操作 对上面4.1中的 SimpleFeature操作

//获取feature的geometry

Geometry geo=(Geometry) feature.getDefaultGeometry();

//获取geometry中的坐标 这里用string的方式保存

int geoUnm = geo.getNumGeometries(); // 一个geometry可能含有n个geometry

for (int i = 0; i < geoUnm; i++) {

Geometry singleGeo = geo.getGeometryN(i); //获取其中每一个geometry

int pointCount = singleGeo.getNumPoints();

Coordinate[] coords = singleGeo.getCoordinates();

for (int j = 0; j < pointCount; j++) {

if (j == pointCount - 1)

sBuilder.append(coords[j].x + "," + coords[j].y);

else {

sBuilder.append(coords[j].x + "," + coords[j].y

+ ";");

}

}

if (i != geoUnm - 1) {

sBuilder.append("|");

}

}

//获取feature中的属性

feature.getAttribute(arg0);

[java] view
plain copy

2.3 拓扑查询

public static Filter getGeoFilter(FilterFactory2 ff, //构建拓扑查询的filter

String geometryAttributeName, Geometry refGeo,

SpatialReltionType.TopoRelTypeEnum relType) { //这个SpatialReltionType是我自己定义的。。。

switch (relType) {

case intersect:

return ff.intersects(ff.property(geometryAttributeName), ff

.literal(refGeo));

case contains:

return ff.contains(ff.property(geometryAttributeName), ff

.literal(refGeo));

case within:

return ff.within(ff.property(geometryAttributeName), ff

.literal(refGeo));

case cross:

return ff.crosses(ff.property(geometryAttributeName), ff

.literal(refGeo));

case overlaps:

return ff.overlaps(ff.property(geometryAttributeName), ff

.literal(refGeo));

case touches:

return ff.touches(ff.property(geometryAttributeName), ff

.literal(refGeo));

case equals:

return ff.equals(ff.property(geometryAttributeName), ff

.literal(refGeo));

case disjoint:

return ff.disjoint(ff.property(geometryAttributeName), ff

.literal(refGeo));

default:

return null;

}

}

[java] view
plain copy

// 普通的拓扑查询

public static ArrayList<Geometry> topoQueryMethod(Geometry refGeo,

String layerName, SpatialReltionType.TopoRelTypeEnum relType) {

ArrayList<SimpleFeature> featurelist=new ArrayList<SimpleFeature>();

FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2(null);

SimpleFeatureSource featureSource=pgDatastore.getFeatureSource(layerName);

SimpleFeatureType schema = featureSource.getSchema();

String geometryAttributeName = schema.getGeometryDescriptor().getLocalName();

Filter filter1= getGeoFilter(ff,geometryAttributeName, refGeo, relType); //上面的方法

SimpleFeatureCollection result=null;

try {

result = featureSource.getFeatures(filter1);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

if(result==null)

return null;

FeatureIterator<SimpleFeature> itertor = result.features();

while (itertor.hasNext()) {

SimpleFeature feature = itertor.next();

featurelist.add(feature);

}

//这个方法是将feature转为geometry 自己定义的

return SpatialUtil.ConverToGeoList(featurelist);

}

[java] view
plain copy

//联合属性的拓扑查询

public static ArrayList<Geometry> topoQueryMethod(Geometry refGeo,

String queryName, String layerName,

SpatialReltionType.TopoRelTypeEnum relType) {

FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2(null);

ArrayList<SimpleFeature> featurelist=new ArrayList<SimpleFeature>();

SimpleFeatureSource featureSource=pgDatastore.getFeatureSource(layerName);

SimpleFeatureType schema = featureSource.getSchema();

String geometryAttributeName = schema.getGeometryDescriptor().getLocalName();

Filter filter1= SpatialUtil.getGeoFilter(ff,geometryAttributeName, refGeo, relType);

Filter filter2=null;

try {

filter2=CQL.toFilter("StandName = '"+queryName+"'");

} catch (CQLException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

List<Filter> match = new ArrayList<Filter>();

match.add(filter1);

match.add(filter2);

Filter filter = ff.and(match);

SimpleFeatureCollection result=null;

try {

result = featureSource.getFeatures(filter);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

if(result==null)

return null;

FeatureIterator<SimpleFeature> itertor = result.features();

while (itertor.hasNext()) {

SimpleFeature feature = itertor.next();

featurelist.add(feature);

}

return SpatialUtil.ConverToGeoList(featurelist);

}



3,编辑图层


[java] view
plain copy

3.1 添加要素

//添加一个feature到图层中 在添加前要确定构造featureType

public static SimpleFeatureType createFeatureType(String typeName,Class type) {

SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();

builder.setName(typeName);

builder.setCRS(DefaultGeographicCRS.WGS84); // <- Coordinate reference

// system

builder.add("the_geom", type); //这个为地理属性字段 postgis中为 the——geom

builder.add("StandName", String.class); // 这是其他属性字段 自己定义的....

// build the type

final SimpleFeatureType TYPE = builder.buildFeatureType();

return TYPE;

}

//添加到图层的图层名,添加的要素空间属性和要素的某属性名

public static boolean addFeature(String layerName,Geometry geo,String featureName){

String type=geo.getGeometryType();

Class TypeClass=null;

if(type.toLowerCase().equals("point")){

TypeClass=Point.class;

}else if(type.toLowerCase().equals("polygon")){

TypeClass=Polygon.class;

}else if(type.toLowerCase().equals("polyline")){

TypeClass=Polyline.class;

}else if(type.toLowerCase().equals("multipolygon")){

TypeClass=MultiPolygon.class;

}

SimpleFeatureType featureType=createFeatureType(layerName,TypeClass);

SimpleFeatureCollection collection = FeatureCollections.newCollection();

SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(featureType);

/* Longitude (= x coord) first ! */

GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(null);

featureBuilder.add(geo);

featureBuilder.add(featureName);

SimpleFeature feature = featureBuilder.buildFeature(null);

collection.add(feature);

FeatureSource featureSource=pgDatastore.getFeatureSource(layerName);

if (featureSource instanceof SimpleFeatureStore) {

SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource;

Transaction transaction = new DefaultTransaction("create");

featureStore.setTransaction(transaction);

try {

featureStore.addFeatures(collection);

transaction.commit();

return true;

} catch (Exception problem) {

problem.printStackTrace();

try {

transaction.rollback();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

} finally {

try {

transaction.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

} else {

System.out.println(layerName + " does not support read/write access");

}

return false;

}

[java] view
plain copy

3.2 修改要素

/ 修改feacode为XX的要素的名字为featureName 地理方位为geo (feacode StandName为你的属性字段自定义)

public static boolean modifyFeature(String layerName,Geometry geo,String featureName,String FeaCode){

FeatureSource featureSource=pgDatastore.getFeatureSource(layerName);

if (featureSource instanceof SimpleFeatureStore) {

SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource;

Transaction transaction = new DefaultTransaction("create");

featureStore.setTransaction(transaction);

try {

String filterStr="FeaCode= '"+FeaCode+"'";

String[] names=new String[2];

names[0]="StandName";

names[1]="the_geom";

Object[] values=new Object[2];

values[0]=featureName;

values[1]=geo;

featureStore.modifyFeatures(names, values, CQL.toFilter(filterStr));

transaction.commit();

return true;

} catch (Exception problem) {

problem.printStackTrace();

try {

transaction.rollback();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

} finally {

try {

transaction.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

} else {

System.out.println(layerName + " does not support read/write access");

}

return false;

4 、Geometry 与 JTS
geotools 构建 geometry方法:这里转载一个别人写的比较好的




[java] view
plain copy

4.1构建点

public Point createPoint(){

Coordinate coord = new Coordinate(109.013388, 32.715519);

Point point = geometryFactory.createPoint( coord );

return point;

}

public Point createPointByWKT() throws ParseException{

WKTReader reader = new WKTReader( geometryFactory );

Point point = (Point) reader.read("POINT (109.013388 32.715519)");

return point;

}

public MultiPoint createMulPointByWKT()throws ParseException{

WKTReader reader = new WKTReader( geometryFactory );

MultiPoint mpoint = (MultiPoint) reader.read("MULTIPOINT(109.013388 32.715519,119.32488 31.435678)");

return mpoint;

}

[java] view
plain copy

4.2 构建线

public LineString createLine(){

Coordinate[] coords = new Coordinate[] {new Coordinate(2, 2), new Coordinate(2, 2)};

LineString line = geometryFactory.createLineString(coords);

return line;

}

public LineString createLineByWKT() throws ParseException{

WKTReader reader = new WKTReader( geometryFactory );

LineString line = (LineString) reader.read("LINESTRING(0 0, 2 0)");

return line;

}

public MultiLineString createMLine(){

Coordinate[] coords1 = new Coordinate[] {new Coordinate(2, 2), new Coordinate(2, 2)};

LineString line1 = geometryFactory.createLineString(coords1);

Coordinate[] coords2 = new Coordinate[] {new Coordinate(2, 2), new Coordinate(2, 2)};

LineString line2 = geometryFactory.createLineString(coords2);

LineString[] lineStrings = new LineString[2];

lineStrings[0]= line1;

lineStrings[1] = line2;

MultiLineString ms = geometryFactory.createMultiLineString(lineStrings);

return ms;

}

public MultiLineString createMLineByWKT()throws ParseException{

WKTReader reader = new WKTReader( geometryFactory );

MultiLineString line = (MultiLineString) reader.read("MULTILINESTRING((0 0, 2 0),(1 1,2 2))");

return line;

}

[java] view
plain copy

4.3 构建多边形

public Polygon createPolygonByWKT() throws ParseException{

WKTReader reader = new WKTReader( geometryFactory );

Polygon polygon = (Polygon) reader.read("POLYGON((20 10, 30 0, 40 10, 30 20, 20 10))");

return polygon;

}

public MultiPolygon createMulPolygonByWKT() throws ParseException{

WKTReader reader = new WKTReader( geometryFactory );

MultiPolygon mpolygon = (MultiPolygon) reader.read("MULTIPOLYGON(((40 10, 30 0, 40 10, 30 20, 40 10),(30 10, 30 0, 40 10, 30 20, 30 10)))");

return mpolygon;

}

[java] view
plain copy

4.4 构建geo集合

public GeometryCollection createGeoCollect() throws ParseException{

LineString line = createLine();

Polygon poly = createPolygonByWKT();

Geometry g1 = geometryFactory.createGeometry(line);

Geometry g2 = geometryFactory.createGeometry(poly);

Geometry[] garray = new Geometry[]{g1,g2};

GeometryCollection gc = geometryFactory.createGeometryCollection(garray);

return gc;

}

[java] view
plain copy

4.5 构建圆

public Polygon createCircle(double x, double y, final double RADIUS){

final int SIDES = 32;//圆上面的点个数

Coordinate coords[] = new Coordinate[SIDES+1];

for( int i = 0; i < SIDES; i++){

double angle = ((double) i / (double) SIDES) * Math.PI * 2.0;

double dx = Math.cos( angle ) * RADIUS;

double dy = Math.sin( angle ) * RADIUS;

coords[i] = new Coordinate( (double) x + dx, (double) y + dy );

}

coords[SIDES] = coords[0];

LinearRing ring = geometryFactory.createLinearRing( coords );

Polygon polygon = geometryFactory.createPolygon( ring, null );

return polygon;

}

postgis 删除表 SELECT DropGeometryTable ('my_schema','my_spatial_table');
如: SELECT DropGeometryTable ('public','river');
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Geotools