JTS基本概念和使用


簡介

  1. JTS是加拿大的 Vivid Solutions公司做的一套開放源碼的 Java API。它提供了一套空間數據操作的核心算法。為在兼容OGC標准的空間對象模型中進行基礎的幾何操作提供2D空間謂詞API。

操作

  1. 表示Geometry對象
    1. Geometry類型介紹見另一篇文章:WKT WKB和GeoJSON
    2. package com.alibaba.autonavi;
      
      
      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;
      
      
      public class GeometryDemo {
      
          private GeometryFactory geometryFactory = new GeometryFactory();
      
          /**
           * 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);
              }
          }
      }

       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM