码迷,mamicode.com
首页 > 其他好文 > 详细

JTS(Geometry)(转)

时间:2015-12-22 17:48:50      阅读:673      评论:0      收藏:0      [点我收藏+]

标签:

原文链接:http://blog.csdn.net/cdl2008sky/article/details/7268577

空间数据模型
(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对象。支持接口

 

  1 package com.mapbar.geo.jts;
  2 
  3 import org.geotools.geometry.jts.JTSFactoryFinder;
  4 
  5 import com.vividsolutions.jts.geom.Coordinate;
  6 import com.vividsolutions.jts.geom.Geometry;
  7 import com.vividsolutions.jts.geom.GeometryCollection;
  8 import com.vividsolutions.jts.geom.GeometryFactory;
  9 import com.vividsolutions.jts.geom.LineString;
 10 import com.vividsolutions.jts.geom.LinearRing;
 11 import com.vividsolutions.jts.geom.Point;
 12 import com.vividsolutions.jts.geom.Polygon;
 13 import com.vividsolutions.jts.geom.MultiPolygon;
 14 import com.vividsolutions.jts.geom.MultiLineString;
 15 import com.vividsolutions.jts.geom.MultiPoint;
 16 import com.vividsolutions.jts.io.ParseException;
 17 import com.vividsolutions.jts.io.WKTReader;
 18 
 19 /**  
 20 
 21  * Class GeometryDemo.java 
 22 
 23  * Description Geometry 几何实体的创建,读取操作
 24 
 25  * Company mapbar 
 26 
 27  * author Chenll E-mail: Chenll@mapbar.com
 28 
 29  * Version 1.0 
 30 
 31  * Date 2012-2-17 上午11:08:50
 32 
 33  */
 34 public class GeometryDemo {
 35 
 36     private GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory( null );
 37     
 38     /**
 39      * create a point
 40      * @return
 41      */
 42     public Point createPoint(){
 43         Coordinate coord = new Coordinate(109.013388, 32.715519);
 44         Point point = geometryFactory.createPoint( coord );
 45         return point;
 46     }
 47     
 48     /**
 49      * create a point by WKT
 50      * @return
 51      * @throws ParseException 
 52      */
 53     public Point createPointByWKT() throws ParseException{
 54         WKTReader reader = new WKTReader( geometryFactory );
 55         Point point = (Point) reader.read("POINT (109.013388 32.715519)");
 56         return point;
 57     }
 58     
 59     /**
 60      * create multiPoint by wkt
 61      * @return
 62      */
 63     public MultiPoint createMulPointByWKT()throws ParseException{
 64         WKTReader reader = new WKTReader( geometryFactory );
 65         MultiPoint mpoint = (MultiPoint) reader.read("MULTIPOINT(109.013388 32.715519,119.32488 31.435678)");
 66         return mpoint;
 67     }
 68     /**
 69      * 
 70      * create a line
 71      * @return
 72      */
 73     public LineString createLine(){
 74         Coordinate[] coords  = new Coordinate[] {new Coordinate(2, 2), new Coordinate(2, 2)};
 75         LineString line = geometryFactory.createLineString(coords);
 76         return line;
 77     }
 78     
 79     /**
 80      * create a line by WKT
 81      * @return
 82      * @throws ParseException
 83      */
 84     public LineString createLineByWKT() throws ParseException{
 85         WKTReader reader = new WKTReader( geometryFactory );
 86         LineString line = (LineString) reader.read("LINESTRING(0 0, 2 0)");
 87         return line;
 88     }
 89     
 90     /**
 91      * create multiLine 
 92      * @return
 93      */
 94     public MultiLineString createMLine(){
 95         Coordinate[] coords1  = new Coordinate[] {new Coordinate(2, 2), new Coordinate(2, 2)};
 96         LineString line1 = geometryFactory.createLineString(coords1);
 97         Coordinate[] coords2  = new Coordinate[] {new Coordinate(2, 2), new Coordinate(2, 2)};
 98         LineString line2 = geometryFactory.createLineString(coords2);
 99         LineString[] lineStrings = new LineString[2];
100         lineStrings[0]= line1;
101         lineStrings[1] = line2;
102         MultiLineString ms = geometryFactory.createMultiLineString(lineStrings);
103         return ms;
104     }
105     
106     /**
107      * create multiLine by WKT
108      * @return
109      * @throws ParseException
110      */
111     public MultiLineString createMLineByWKT()throws ParseException{
112         WKTReader reader = new WKTReader( geometryFactory );
113         MultiLineString line = (MultiLineString) reader.read("MULTILINESTRING((0 0, 2 0),(1 1,2 2))");
114         return line;
115     }
116     
117     /**
118      * create a polygon(多边形) by WKT
119      * @return
120      * @throws ParseException
121      */
122     public Polygon createPolygonByWKT() throws ParseException{
123         WKTReader reader = new WKTReader( geometryFactory );
124         Polygon polygon = (Polygon) reader.read("POLYGON((20 10, 30 0, 40 10, 30 20, 20 10))");
125         return polygon;
126     }
127     
128     /**
129      * create multi polygon by wkt
130      * @return
131      * @throws ParseException
132      */
133     public MultiPolygon createMulPolygonByWKT() throws ParseException{
134         WKTReader reader = new WKTReader( geometryFactory );
135         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)))");
136         return mpolygon;
137     }
138     
139     /**
140      * create GeometryCollection  contain point or multiPoint or line or multiLine or polygon or multiPolygon
141      * @return
142      * @throws ParseException
143      */
144     public GeometryCollection createGeoCollect() throws ParseException{
145         LineString line = createLine();
146         Polygon poly =  createPolygonByWKT();
147         Geometry g1 = geometryFactory.createGeometry(line);
148         Geometry g2 = geometryFactory.createGeometry(poly);
149         Geometry[] garray = new Geometry[]{g1,g2};
150         GeometryCollection gc = geometryFactory.createGeometryCollection(garray);
151         return gc;
152     }
153     
154     /**
155      * create a Circle  创建一个圆,圆心(x,y) 半径RADIUS
156      * @param x
157      * @param y
158      * @param RADIUS
159      * @return
160      */
161     public Polygon createCircle(double x, double y, final double RADIUS){
162         final int SIDES = 32;//圆上面的点个数
163         Coordinate coords[] = new Coordinate[SIDES+1];
164         for( int i = 0; i < SIDES; i++){
165             double angle = ((double) i / (double) SIDES) * Math.PI * 2.0;
166             double dx = Math.cos( angle ) * RADIUS;
167             double dy = Math.sin( angle ) * RADIUS;
168             coords[i] = new Coordinate( (double) x + dx, (double) y + dy );
169         }
170         coords[SIDES] = coords[0];
171         LinearRing ring = geometryFactory.createLinearRing( coords );
172         Polygon polygon = geometryFactory.createPolygon( ring, null );
173         return polygon;
174     }
175     
176     /**
177      * @param args
178      * @throws ParseException 
179      */
180     public static void main(String[] args) throws ParseException {
181         GeometryDemo gt = new GeometryDemo();
182         Polygon p = gt.createCircle(0, 1, 2);
183         //圆上所有的坐标(32个)
184         Coordinate coords[] = p.getCoordinates();
185         for(Coordinate coord:coords){
186             System.out.println(coord.x+","+coord.y);
187         }
188     }
189 }

WKT简介

WKT - 概念

WKT(Well-known text)是一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。它的二进制表示方式,亦即WKB(well-known binary)则胜于在传输和在数据库中存储相同的信息。该格式由开放地理空间联盟(OGC)制定。

WKT - 几何对象

WKT可以表示的几何对象包括:点,线,多边形,TIN(不规则三角网)及多面体。可以通过几何集合的方式来表示不同维度的几何对象。

几何物体的坐标可以是2D(x,y),3D(x,y,z),4D(x,y,z,m),加上一个属于线性参照系统的m值。

以下为几何WKT字串样例:

 

POINT(6 10)
LINESTRING(3 4,10 50,20 25)
POLYGON((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2))
MULTIPOINT(3.5 5.6, 4.8 10.5)
MULTILINESTRING((3 4,10 50,20 25),(-5 -8,-10 -8,-15 -4))
MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2)),((6 3,9 2,9 4,6 3)))
GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10))
POINT ZM (1 1 5 60)
POINT M (1 1 80)
POINT EMPTY
MULTIPOLYGON EMPTY
 
OpenGIS的说明书中还规定了空间对象的内部存储格式要包括一个空间参考系统标识(SRID)。当创建空间对象并向数据插入的时候需要这样的SRID。下面是一个有效创建和插入一个OGC空间对象的语句: ? INSERT INTO SPATIALTabLE ( THE_GEOM, THE_NAME ) ? 
 
  VALUES ( GeomFromText(‘‘POINT(-126.4 45.32)‘‘, 312), ‘‘A Place‘‘ ) ? 
 
  注意:上面的THE_GEOM字段是GEOMETRY类型,该类型的对象可以用WKB定义,也可以用WKT定义。如:
 
  ? geometry = GeomFromWKB(bytea WKB, SRID); ? 
 
  geometry = GeometryFromText(text WKT, SRID); ? 
 
  所以GeomFromText(‘‘POINT(-126.4 45.32)‘‘, 312)中的POINT(-126.4 45.32)就是WKT,312就是这个空间对象的SRID。
 
  ?PostGIS的EWKB, EWKT ? 
 
  OGC的格式只支持2D的地理要素,而且其相关联的SRID不能嵌入到输入输出表达中。PostGIS的扩展格式目前是OGC格式的超集,也就是说只要是有效的WKB或WKT就是有效的EWKB或EWKT。当然,如果今后OGC发布与该扩展格式相冲突的新格式,那么这种超集的情况就会有所变化了。PostGIS的EWKB, EWKT增加了对3DZ,3DM和4D坐标的支持,并可嵌入SRID信息。
 
  下面是一些EWKT的例子: ? 
 
  POINT(0 0 0)-- XYZ ? 
 
  SRID=32632;POINT(0 0) – XY with SRID ? 
 
  由于SRID可以嵌入到EWKT或EWKB中,空间对象的定义就可以简化为:
 
  geometry = GeomFromEWKB(bytea EWKB);
 
  geometry = GeomFromEWKT(text EWKT);
 
  那么,相数据库中插入PostGIS空间对象就可以写成:
 
  INSERT INTO SPATIALTabLE ( THE_GEOM, THE_NAME )
 
  VALUES ( GeomFromText(‘‘POINT(-126.4 45.32 312)‘‘), ‘‘A Place‘‘ )

WKT - 空间参照系统

一个表示空间参照系统的WKT字串描述了空间物体的测地基准、大地水准面、坐标系统及地图投影。
WKT在许多GIS程序中被广泛采用。ESRI亦在其shape文件格式(*.prj)中使用WKT。
以下是空间参照系统的WKT表示样例:
COMPD_CS["OSGB36 / British National Grid + ODN",
PROJCS["OSGB 1936 / British National Grid",
GEOGCS["OSGB 1936",
DATUM["OSGB_1936",
SPHEROID["Airy 1830",6377563.396,299.3249646,AUTHORITY["EPSG","7001"]],
TOWGS84[375,-111,431,0,0,0,0],
AUTHORITY["EPSG","6277"]],
PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],
UNIT["DMSH",0.0174532925199433,AUTHORITY["EPSG","9108"]],
AXIS["Lat",NORTH],
AXIS["Long",EAST],
AUTHORITY["EPSG","4277"]],
PROJECTION["Transverse_Mercator"],
PARAMETER["latitude_of_origin",49],
PARAMETER["central_meridian",-2],
PARAMETER["scale_factor",0.999601272],
PARAMETER["false_easting",400000],
PARAMETER["false_northing",-100000],
UNIT["metre",1,AUTHORITY["EPSG","9001"]],
AXIS["E",EAST],
AXIS["N",NORTH],
AUTHORITY["EPSG","27700"]],
VERT_CS["Newlyn",
VERT_DATUM["Ordnance Datum Newlyn",2005,AUTHORITY["EPSG","5101"]],
UNIT["metre",1,AUTHORITY["EPSG","9001"]],
AXIS["Up",UP],
AUTHORITY["EPSG","5701"]],
AUTHORITY["EPSG","7405"]
 

基础知识:坐标参照系有三种最常见的子类:地心坐标系(geocentric cs、GEOCCS),地理坐标系(geographic cs、GEOGCS),和投影坐标系(projected cs、PROJCS)以及相互之间的关系,可以参考《坐标参照系》。投影参数内容:Ellipsoid 、 Datum ;Projection,可以参考《地图投影为什么》。

坐标系的文字描述的扩展BN范式(EBNF)定义如下:
<coordinate system> = <projected cs> | <geographic cs> | <geocentric cs>

 

 

<projection> = PROJECTION["<name>"]

<parameter> = PARAMETER["<name>", <value>]

<value> = <number>

 

 

<datum> = DATUM["<name>", <spheroid>]

<spheroid> = SPHEROID["<name>", <semi-major axis>, <inverse flattening>]

<semi-major axis> = <number> NOTE: semi-major axis is measured in meters and must be > 0.

<inverse flattening> = <number>

<prime meridian> = PRIMEM["<name>", <longitude>]

<longitude> = <number>

 

 

<angular unit> = <unit>

<linear unit> = <unit>

<unit> = UNIT["<name>", <conversion factor>]

<conversion factor> = <number>

以下示例说明,参照上述参数,然后比瓢画葫芦即可自行用WKT创建坐标系。

地理坐标系的格式:<geographic cs> = GEOGCS["<name>", <datum>, <prime meridian>, <angular unit>]

WGS1984的地理坐标系WKT形式:
GEOGCS["WGS 84", 
DATUM["WGS_1984", 
SPHEROID["WGS 84", 6378137, 298.257223563, AUTHORITY["EPSG", "7030"]], 
AUTHORITY["EPSG", "6326"]], 
PRIMEM["Greenwich", 0, AUTHORITY["EPSG", "8901"]], 
UNIT["degree", 0.0174532925199433, AUTHORITY["EPSG", "9122"]],
AUTHORITY["EPSG", "4326"]]

投影坐标系的格式:<projected cs> = PROJCS["<name>", <geographic cs>, <projection>, {<parameter>,}* <linear unit>]

WGS1984地理坐标,统一横轴墨卡托(UTM)投影,中央经线117E的投影坐标系WKT形式:

PROJCS["WGS 84 / UTM zone 50N", 
GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84", 6378137, 298.257223563, AUTHORITY["EPSG", "7030"]], AUTHORITY["EPSG", "6326"]], PRIMEM["Greenwich", 0, AUTHORITY["EPSG", "8901"]], UNIT["degree", 0.0174532925199433, AUTHORITY["EPSG", "9122"]], AUTHORITY["EPSG", "4326"]], 
PROJECTION["Transverse_Mercator"], 
PARAMETER["latitude_of_origin", 0], 
PARAMETER["central_meridian", 117], 
PARAMETER["scale_factor", 0.9996], 
PARAMETER["false_easting", 500000], 
PARAMETER["false_northing", 0], 
UNIT["metre", 1, AUTHORITY["EPSG", "9001"]], 
AUTHORITY["EPSG", "32650"]]

地心坐标系格式相似于地理坐标系:<geocentric cs> = GEOCCS["<name>", <datum>, <prime meridian>, <linear unit>]

参数中出现AUTHORITY是EPSG的玩意,在自定义坐标系时可以忽略,我会在后面详细介绍EPSG相关内容。WKT更具体的可参考OGC相关文档:如SFA、《SF for OLE/COM》等。

 

练习:给出下属投影坐标系参数,请用WKT方式表述。
投影参数:椭球体,Krasovsky_1940;基准面,北京1954;投影:兰勃特双标准纬线,25N,47N;中央经线,117E。

 

参考答案:

PROJCS["liongg",
GEOGCS["GCS_Beijing_1954",
DATUM["D_Beijing_1954",SPHEROID["Krasovsky_1940",6378245.0,298.3]],
PRIMEM["Greenwich",0.0],
UNIT["Degree",0.0174532925199433]],
PROJECTION["Lambert_Conformal_Conic"],
PARAMETER["False_Easting",20500000.0],
PARAMETER["False_Northing",0.0],
PARAMETER["Central_Meridian",0.0],
PARAMETER["Standard_Parallel_1",25.0],
PARAMETER["Standard_Parallel_2",47.0],
PARAMETER["Scale_Factor",1.0],
PARAMETER["Latitude_Of_Origin",0.0],
UNIT["Meter",1.0]]

 

有个偷懒的方法就是用商业软件譬如ArcGIS按照参数新建投影,然后在.prj文件中提取投影内容并修改。
 

JTS(Geometry)(转)

标签:

原文地址:http://www.cnblogs.com/gaopeng527/p/5067321.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!