• JTS(Geometry) 简单例子
    时间:2014-08-04   作者:佚名   出处:互联网

    本文主要介绍使用JTS进行几何图形的基本操作。

    空间数据模型

    (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对象。

    Example


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

    网友留言/评论

    我要留言/评论

    相关文章

    GeoTools是什么,以及与JTS和GeoAPI之间的关系如何?:Geotools是一个java类库,它提供了很多的标准类和方法来处理空间数据,同时这个类库是构建在OGC标准之上的,是OGC思想的一种实现。而OGC是国际标准,所以geotools将来必定会成为开源空间数据处理的主要工具,目前的大部分开源软件,如udig,geoserver等,对空间数据的处理都是由geotools来做支撑。而其他很多的web服务,命令行工具和桌面程序都可以由geotools来实现。
    程序那些事:日志记录的作用和方法:程序中记录日志一般有两个目的:Troubleshooting和显示程序运行状态。好的日志记录方式可以提供我们足够多定位问题的依据。日志记录大家都会认为简单,但如何通过日志可以高效定位问题并不是简单的事情。这里列举下面三个方面的内容,辅以代码示例,总结如何写好日志,希望对他人有所启发和帮助:1、怎样记日志可以方便Troubleshooting。 2、程序运行状态可以记哪些。3、应该避免怎样的日志方式。
    Lucene 基础理论与实例:Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。本文将介绍Lucene 基础理论与实例。
    List,set,Map 的用法和区别等:List按对象进入的顺序保存对象,不做排序或编辑操作。Set对每个对象只接受一次,并使用自己内部的排序方法(通常,你只关心某个元素是否属于Set,而不关心它的顺序--否则应该使用List)。Map同样对每个元素保存一份,但这是基于"键"的,Map也有内置的排序,因而不关心元素添加的顺序。如果添加元素的顺序对你很重要,应该使用 LinkedHashSet或者LinkedHashMap.
    web压力测试工具集介绍:当一套程序写完或者一台服务器配置完成后,相必很多朋友会像我一样,非 常想知道它到底能 够承受多大的负载压力,那在本文中,就给大家介绍十个免 费的可以用来进行 Web 的负载/压力测试的工具,这样,你就可以知道你的服务 器以及你的 Web 应用 能够顶得住多少的并发量,以及你的网站的性能。
    五种 JSP页面跳转方法详解:本文向您介绍Servlet页面跳转实现方法的几种区别,包括Servlet和JSP中的不同实现,比如Servlet中的redirect方式和forward方式得区别等。
    JAVA,HashSet面试题:本文列举java面试题中关于HashSet的一些知识点
    开源混淆工具ProGuard配置详解及配置实例:ProGuard是一个免费的java类文件压缩,优化,混淆器.它探测并删除没有使用的类,字段,方法和属性.它删除没有用的说明并使用字节码得到最大优化.它使用无意义的名字来重命名类,字段和方法.
    在代码重构中蜕变:这几天,要对我半年前写的代码进行一些整理工作,在看代码时发现当时有很多地方写得不够好,俗称的有“坏味道”,呵呵,重构,必须的。
    搞懂java中的synchronized关键字:实际上,我关于java的基础知识的90%以上都来自Thinking in Java。对于其中的synchronized关键字,当时就是浏览一下,大概知道意思,也没有细看。后来一直没有用过这个关键字。昨天看Thinking in Patterns with Java中的Observer模式,看了其中的Observable类的源码,发现里面几乎所有的方法都用了synchronized关键字(不是全部),其中个别用了synchronized(this){}的区块。于是,我发觉有必要好好理解一下这个关键字了。