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);
}
![](http://static.blog.csdn.net/images/save_snippets.png)
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');
前段时间的一个项目 本来用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);
}
![](http://static.blog.csdn.net/images/save_snippets.png)
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 使用 部分代码总结
- geotools 使用 部分代码总结
- geotools 使用 部分代码总结
- GIS的学习(二十六)geotools 使用 部分代码总结
- Delphi listview使用部分总结代码
- MSDN:Windows SharePoint Services 3.0 中使用代码的开发工具和技术(第 1 部分)
- MSDN:Windows SharePoint Services 3.0 中使用代码的开发工具和技术(第 2 部分)
- kshen转总结:ADO.NET在开发中的部分使用方法和技巧
- 总结:ADO.NET在开发中的部分使用方法和技巧
- XStream使用方法总结附实例代码
- 使用 lex 和 yacc 编译代码,第 1 部分:介绍
- JDBC的使用部分总结
- 总结:ADO.NET在开发中的部分使用方法和技巧
- [翻译]一步步教你配置SQL SERVER合并复制(八)代码部分(使用.NET CompactFramework)
- 在.net中使用jmail发送Email(部分代码)
- 使用 XML: UML、XMI 和代码生成,第 1 部分
- 总结:ADO.NET在开发中的部分使用方法和技巧 选择自 yangyifan0 的 Blog
- [导入]使用GEOTOOLS(2.3)读取POSTGIS内容
- ASP之对象总结(如果你使用过大部分,那么你的ASP功力应该是非常高的了)
- 使用freetextbox时,插入代码,会自动去除param部分地内容,怎么解决?