当前位置: 代码迷 >> GIS >> GIS的学习(二十六)geotools 应用 部分代码总结
  详细解决方案

GIS的学习(二十六)geotools 应用 部分代码总结

热度:145   发布时间:2016-05-05 06:27:16.0
GIS的学习(二十六)geotools 使用 部分代码总结

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

以下是部分功能总结:

1、连接数据库 这里使用的postgis 链接代码如下:

?

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、图层的操作

?

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;	}
2.2 要素操作  对上面4.1中的 SimpleFeature操作//获取feature的geometryGeometry geo=(Geometry) feature.getDefaultGeometry();//获取geometry中的坐标 这里用string的方式保存int geoUnm = geo.getNumGeometries();  // 一个geometry可能含有n个geometryfor (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);
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;		}	}
// 普通的拓扑查询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);  	}
//联合属性的拓扑查询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,编辑图层?

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;	}
    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方法:这里转载一个别人写的比较好的?

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;      }?
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;      }?
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;      } ?
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;      }?
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');

?