geometry,英语单词,名词,意思是“几何学几何结构”。
http://www.baike.com/wiki/WKT
WKT,是一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。它的二进制表示方式,亦即WKB(well-known binary)则胜于在传输和在数据库中存储相同的信息。该格式由开放地理空间联盟(OGC)制定。
概念/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 EMPTYMULTIPOLYGON EMPTY
空间参照系统/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"]]
缓冲距离计算模型构建
点-缓冲距离——>圆
缓冲距离模拟真实近似圆图形,至少需要8个点。取值16个点,32个点,64个点…之后点越多画的圆越准确。
线-缓冲距离——>面
最简单的处理就是两个面。
缓冲面积包括矩形和绿色半圆
矩形-缓存距离——>面
得到的缓冲结果包括四个矩形和4各四分之一圆弧。如果不在乎太准确可以将圆弧都换成矩形。
多边形——>不规则转规则图形
由于多边形的不确定性,没法按照常规方法处理。
查找距离最远的两个点以此为半径画圆。难点:需要算出中心点和半径。
或者通过最大边最远距离画矩形。难点:
- 确定起始点。
- 关注边的角度计算。
Geometry与WKT的应用
- 计算区域内的点:区域匹配点
- 附近人搜索:以点画圆
以点画圆的Geometry计算:
/*** create a Circle 创建一个圆,圆心(x,y) 半径RADIUS* @param x* @param y* @param RADIUS 单位(米)* @return*/public static Polygon createCircle(double x, double y, final double RADIUS){final int SIDES = 32;//圆上面的点个数//距离转度double degree = RADIUS / (2 * Math.PI * 6378137.0) * 360;
// System.out.println("度:"+degree);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 ) * degree;double dy = Math.sin( angle ) * degree;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;}
geometry多边形是否包含某个点:
/*** 判断一个点是否在多边形上* @param geomWKT* @return true为在面上,false则不是* @throws ParseException*/public static boolean isContains(String geomWKT,String pointWKT) throws ParseException{ WKTReader reader = new WKTReader( geometryFactory ); Geometry geom =reader.read(geomWKT); Geometry point = reader.read(pointWKT); return geom.contains(point); }
注:GEO计算能力可以使用Redis的geohash 和Postgresql的空间计算能力。