1、 JTS(Geometry) 空间数据模型 (1)、JTS Geometry model (2)、ISO Geometry model (Geometry Plugin and JTS Wrapper Plugin) GeoTools has two implementations of these interfaces: Geometry Plugin a port of JTS 1.7 to the ISO Geometry interfaces JTS Wrapper Plugin an implementation that delegates all the work
2、to JTS JTS包结构 系(linearref包)、计算交点(noding包)、几何图形操作(operation包)、平面图(planargraph包)、多边形化(polygnize包)、精度(precision)、工具(util包) 重点理解JTS Geometry model (1) JTS提供了如下的空间数据类型 Point MultiPoint LineString LinearRing 封闭的线条 MultiLineString 多条线 Polygon Mult
3、iPolygon GeometryCollection 包括点,线,面 (2) 支持接口 Coordinate Coordinate(坐标)是用来存储坐标的轻便的类。它不同于点,点是Geometry的子类。不像模范Point的对象(包含额外的信息,例如一个信包,一个精确度模型和空间参考系统信息),Coordinate只包含纵座标值和存取方法。 Envelope(矩形) 一个具体的类,包含一个最大和最小的x 值和y 值。 GeometryFactory GeometryFactory提供一系列的有效方法用来构造来自Coordinat
4、e类的Geometry对象。支持接口 [java] view plain copy package com.mapbar.geo.jts; import org.geotools.geometry.jts.JTSFactoryFinder; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryCollection; import
5、com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.LineString; import com.vividsolutions.jts.geom.LinearRing; import com.vividsolutions.jts.geom.Point; import com.vividsolutions.jts.geom.Polygon; import com.vividsolutions.jts.geom.MultiPolygon; import c
6、om.vividsolutions.jts.geom.MultiLineString; import com.vividsolutions.jts.geom.MultiPoint; import com.vividsolutions.jts.io.ParseException; import com.vividsolutions.jts.io.WKTReader; /** * Class GeometryDemo.java * Description Geometry 几何实体的创建,读取操作 * Company map
7、bar * author Chenll E-mail: Chenll@ * Version 1.0 * Date 2012-2-17 上午11:08:50 */ public class GeometryDemo { private GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory( null ); /** * create a point * @return
8、 */ public Point createPoint(){ Coordinate coord = new Coordinate(109.013388, 32.715519); Point point = geometryFactory.createPoint( coord ); return point; } /** * create a point by WKT * @return * @throws ParseExce
9、ption */ public Point createPointByWKT() throws ParseException{ WKTReader reader = new WKTReader( geometryFactory ); Point point = (Point) reader.read("POINT (109.013388 32.715519)"); return point; } /** * create multiPoint
10、 by wkt * @return */ public MultiPoint createMulPointByWKT()throws ParseException{ WKTReader reader = new WKTReader( geometryFactory ); MultiPointmpoint=(MultiPoint)reader.read ("MULTIPOINT(109.013388 32.715519,119.32488 31.435678)"); return mp
11、oint; } /** * * create a line * @return */ public LineString createLine(){ Coordinate[] coords = new Coordinate[] {new Coordinate(2, 2), new Coordinate(2, 2)}; LineString line = geometryFactory.createLineString(coords);
12、 return line; } /** * create a line by WKT * @return * @throws ParseException */ public LineString createLineByWKT() throws ParseException{ WKTReader reader = new WKTReader( geometryFactory ); LineString line = (LineSt
13、ring) reader.read("LINESTRING(0 0, 2 0)"); return line; } /** * create multiLine * @return */ public MultiLineString createMLine(){ Coordinate[] coords1 = new Coordinate[] {new Coordinate(2, 2), new Coordinate(2, 2)};
14、 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];
15、 lineStrings[0]= line1; lineStrings[1] = line2; MultiLineString ms = geometryFactory.createMultiLineString(lineStrings); return ms; } /** * create multiLine by WKT * @return * @throws ParseException */ publi
16、c 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; } /** * create a p
17、olygon(多边形) by WKT * @return * @throws ParseException */ 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 1
18、0))"); return polygon; } /** * create multi polygon by wkt * @return * @throws ParseException */ public MultiPolygon createMulPolygonByWKT() throws ParseException{ WKTReader reader = new WKTReader( geometryFactory );
19、 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; } /** * create GeometryCollection contain point or multiPoint or line or multiLine or polygon
20、or multiPolygon * @return * @throws ParseException */ public GeometryCollection createGeoCollect() throws ParseException{ LineString line = createLine(); Polygon poly = createPolygonByWKT(); Geometry g1 = geometryFactory.createGeometry(li
21、ne); Geometry g2 = geometryFactory.createGeometry(poly); Geometry[] garray = new Geometry[]{g1,g2}; GeometryCollection gc = geometryFactory.createGeometryCollection(garray); return gc; } /** * create a Circle 创建一个圆,圆心(x,y) 半径R
22、ADIUS * @param x * @param y * @param RADIUS * @return */ 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 <
23、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 ); }
24、 coords[SIDES] = coords[0]; LinearRing ring = geometryFactory.createLinearRing( coords ); Polygon polygon = geometryFactory.createPolygon( ring, null ); return polygon; } /** * @param args * @throws ParseException */
25、 public static void main(String[] args) throws ParseException { GeometryDemo gt = new GeometryDemo(); Polygon p = gt.createCircle(0, 1, 2); //圆上所有的坐标(32个) Coordinate coords[] = p.getCoordinates(); for(Coordinate coord:coords){ System.out.println(coord.x+","+coord.y); } } }






