您的位置:首页 > 其它

JTS 空间数据模型

2013-12-02 17:53 239 查看
空间数据模型

空间数据模型
(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 to JTS

JTS包结构

系(linearref包)、计算交点(noding包)、几何图形操作(operation包)、平面图(planargraph包)、多边形化(polygnize包)、精度(precision)、工具(util包)

重点理解JTS Geometry model
(1) JTS提供了如下的空间数据类型
     Point     
     MultiPoint
     LineString     
     LinearRing  封闭的线条
     MultiLineString    多条线
     Polygon
     MultiPolygon         

     GeometryCollection  包括点,线,面

(2) 支持接口

Coordinate

   Coordinate(坐标)是用来存储坐标的轻便的类。它不同于点,点是Geometry的子类。不像模范Point的对象(包含额外的信息,例如一个信包,一个精确度模型和空间参考系统信息),Coordinate只包含纵座标值和存取方法。

Envelope(矩形)

   一个具体的类,包含一个最大和最小的x 值和y 值。

GeometryFactory

   GeometryFactory提供一系列的有效方法用来构造来自Coordinate类的Geometry对象。支持接口

[java] view
plaincopy

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 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 com.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 mapbar  

 

 * author Chenll E-mail: Chenll@mapbar.com 

 

 * Version 1.0  

 

 * Date 2012-2-17 上午11:08:50 

 

 */  

public class GeometryDemo {  

  

    private GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory( null );  

      

    /** 

     * create a point 

     * @return 

     */  

    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 ParseException  

     */  

    public Point createPointByWKT() throws ParseException{  

        WKTReader reader = new WKTReader( geometryFactory );  

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

        return point;  

    }  

      

    /** 

     * create multiPoint by wkt 

     * @return 

     */  

    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;  

    }  

    /** 

     *  

     * create a line 

     * @return 

     */  

    public LineString createLine(){  

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

        LineString line = geometryFactory.createLineString(coords);  

        return line;  

    }  

      

    /** 

     * create a line by WKT 

     * @return 

     * @throws ParseException 

     */  

    public LineString createLineByWKT() throws ParseException{  

        WKTReader reader = new WKTReader( geometryFactory );  

        LineString line = (LineString) 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)};  

        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;  

    }  

      

    /** 

     * create multiLine by WKT 

     * @return 

     * @throws ParseException 

     */  

    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;  

    }  

      

    /** 

     * create a polygon(多边形) 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 10))");  

        return polygon;  

    }  

      

    /** 

     * create multi polygon by wkt 

     * @return 

     * @throws ParseException 

     */  

    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;  

    }  

      

    /** 

     * create GeometryCollection  contain point or multiPoint or line or multiLine or polygon or multiPolygon 

     * @return 

     * @throws ParseException 

     */  

    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;  

    }  

      

    /** 

     * create a Circle  创建一个圆,圆心(x,y) 半径RADIUS 

     * @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 < 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;  

    }  

      

    /** 

     * @param args 

     * @throws ParseException  

     */  

    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);  

        }  

    }  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: