• 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将来必定会成为qq运动的红包存在哪里空间数据处理的主要工具,目前的大部分qq运动的红包存在哪里软件,如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的一些知识点
    qq运动的红包存在哪里混淆工具ProGuard配置详解及配置实例:ProGuard是一个免费的java类文件压缩,优化,混淆器.它探测并删除没有使用的类,字段,方法和属性.它删除没有用的说明并使用字节码得到最大优化.它使用无意义的名字来重命名类,字段和方法.
    在代码重构中蜕变:这几天,要对我半年前写的代码进行一些整理工作,在看代码时发现当时有很多地方写得不够好,俗称的有“坏味道”,呵呵,重构,必须的。
    搞懂java中的synchronized关键字:实际上,我关于java的基础知识的90%以上都来自Thinking in Java。对于其中的synchronized关键字,当时就是浏览一下,大概知道意思,也没有细看。后来一直没有用过这个关键字。昨天看Thinking in Patterns with Java中的Observer模式,看了其中的Observable类的源码,发现里面几乎所有的方法都用了synchronized关键字(不是全部),其中个别用了synchronized(this){}的区块。于是,我发觉有必要好好理解一下这个关键字了。