geotools 使用 部分代码总结
来源:互联网 发布:小米手环数据清除 编辑:程序博客网 时间:2024/06/07 19:22
前段时间的一个项目 本来用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中的featureClassSimpleFeatureSource 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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.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); //获取其中每一个geometryint 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, //构建拓扑查询的filterString 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 blocke.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 blocke1.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 blocke.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到图层中 在添加前要确定构造featureTypepublic static SimpleFeatureType createFeatureType(String typeName,Class type) {SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();builder.setName(typeName);builder.setCRS(DefaultGeographicCRS.WGS84); // <- Coordinate reference// systembuilder.add("the_geom", type); //这个为地理属性字段 postgis中为 the——geombuilder.add("StandName", String.class); // 这是其他属性字段 自己定义的....// build the typefinal 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 blocke.printStackTrace();} } finally { try {transaction.close();} catch (IOException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();} } finally { try {transaction.close();} catch (IOException e) {// TODO Auto-generated catch blocke.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');
- geotools 使用 部分代码总结
- geotools 使用 部分代码总结
- geotools 使用 部分代码总结
- GIS的学习(二十六)geotools 使用 部分代码总结
- geotools使用外部图片
- Geotools使用-1
- geoTools使用实例1
- geoTools使用实例-helloworld
- 部分代码总结7.29
- 代码安全部分总结
- 使用Eclipse构建GeoTools项目
- git 使用部分总结
- 使用GeoTools读取和绘制Shapefile格式
- Geotools使用-2,Maven的替代
- JdbcTemplate代码的部分使用
- JDBC的使用部分总结
- JDBC的使用部分总结
- JDBC的使用部分总结
- 罗马假日
- 从iphone 应用 和android 应用 看未来创业趋势
- oracle归档日志(archive log)
- android 中管理短信
- 杭电hdu 1527 取石子游戏 Wythoff Game 博弈
- geotools 使用 部分代码总结
- 80X86学习笔记--常用伪指令语句
- Eclipse与MyEclipse的联系和区别
- vc++中的cdc类
- 深入浅出分析C#接口的作用
- 递归下降分析法的简单例子的c语言实现
- 数组计算
- Transmitters
- 传说中的Java烟花程序