Geometry几何结构与WKT空间坐标计算缓冲距离模型构建

x33g5p2x  于2022-05-24 转载在 其他  
字(3.6k)|赞(0)|评价(0)|浏览(483)

geometry,英语单词,名词,意思是“几何学几何结构”。

  1. 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字串样例:

  1. POINT(6 10)
  2. LINESTRING(3 4,10 50,20 25)
  3. POLYGON((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2))
  4. MULTIPOINT(3.5 5.6, 4.8 10.5)
  5. MULTILINESTRING((3 4,10 50,20 25),(-5 -8,-10 -8,-15 -4))
  6. 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)))
  7. GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10))
  8. POINT ZM (1 1 5 60)
  9. POINT M (1 1 80)
  10. POINT EMPTY
  11. MULTIPOLYGON EMPTY

空间参照系统/WKT

一个表示空间参照系统的WKT字串描述了空间物体的测地基准、大地水准面、坐标系统及地图投影。

WKT在许多GIS程序中被广泛采用。ESRI亦在其shape文件格式(*.prj)中使用WKT。

以下是空间参照系统的WKT表示样例:

  1. COMPD_CS["OSGB36 / British National Grid + ODN",
  2. PROJCS["OSGB 1936 / British National Grid",
  3. GEOGCS["OSGB 1936",
  4. DATUM["OSGB_1936",
  5. spheroid["Airy 1830",6377563.396,299.3249646,AUTHORITY["EPSG","7001"]],
  6. TOWGS84[375,-111,431,0,0,0,0],
  7. AUTHORITY["EPSG","6277"]],
  8. PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],
  9. UNIT["DMSH",0.0174532925199433,AUTHORITY["EPSG","9108"]],
  10. AXIS["Lat",NORTH],
  11. AXIS["Long",EAST],
  12. AUTHORITY["EPSG","4277"]],
  13. PROJECTION["Transverse_Mercator"],
  14. PARAMETER["latitude_of_origin",49],
  15. PARAMETER["central_meridian",-2],
  16. PARAMETER["scale_factor",0.999601272],
  17. PARAMETER["false_easting",400000],
  18. PARAMETER["false_northing",-100000],
  19. UNIT["metre",1,AUTHORITY["EPSG","9001"]],
  20. AXIS["E",EAST],
  21. AXIS["N",NORTH],
  22. AUTHORITY["EPSG","27700"]],
  23. VERT_CS["Newlyn",
  24. VERT_DATUM["Ordnance Datum Newlyn",2005,AUTHORITY["EPSG","5101"]],
  25. UNIT["metre",1,AUTHORITY["EPSG","9001"]],
  26. AXIS["Up",UP],
  27. AUTHORITY["EPSG","5701"]],
  28. AUTHORITY["EPSG","7405"]]

缓冲距离计算模型构建

点-缓冲距离——>圆

缓冲距离模拟真实近似圆图形,至少需要8个点。取值16个点,32个点,64个点…之后点越多画的圆越准确。

线-缓冲距离——>面

最简单的处理就是两个面。

缓冲面积包括矩形和绿色半圆

矩形-缓存距离——>面

得到的缓冲结果包括四个矩形和4各四分之一圆弧。如果不在乎太准确可以将圆弧都换成矩形。

多边形——>不规则转规则图形

由于多边形的不确定性,没法按照常规方法处理。

查找距离最远的两个点以此为半径画圆。难点:需要算出中心点和半径。

或者通过最大边最远距离画矩形。难点:

  1. 确定起始点。
  2. 关注边的角度计算。

Geometry与WKT的应用

  • 计算区域内的点:区域匹配点
  • 附近人搜索:以点画圆

以点画圆的Geometry计算:

  1. /**
  2. * create a Circle 创建一个圆,圆心(x,y) 半径RADIUS
  3. * @param x
  4. * @param y
  5. * @param RADIUS 单位(米)
  6. * @return
  7. */
  8. public static Polygon createCircle(double x, double y, final double RADIUS){
  9. final int SIDES = 32;//圆上面的点个数
  10. //距离转度
  11. double degree = RADIUS / (2 * Math.PI * 6378137.0) * 360;
  12. // System.out.println("度:"+degree);
  13. Coordinate coords[] = new Coordinate[SIDES+1];
  14. for( int i = 0; i < SIDES; i++){
  15. double angle = ((double) i / (double) SIDES) * Math.PI * 2.0;
  16. double dx = Math.cos( angle ) * degree;
  17. double dy = Math.sin( angle ) * degree;
  18. coords[i] = new Coordinate( (double) x + dx, (double) y + dy );
  19. }
  20. coords[SIDES] = coords[0];
  21. LinearRing ring = geometryFactory.createLinearRing( coords );
  22. Polygon polygon = geometryFactory.createPolygon( ring, null );
  23. return polygon;
  24. }

geometry多边形是否包含某个点:

  1. /**
  2. * 判断一个点是否在多边形上
  3. * @param geomWKT
  4. * @return true为在面上,false则不是
  5. * @throws ParseException
  6. */
  7. public static boolean isContains(String geomWKT,String pointWKT) throws ParseException{
  8. WKTReader reader = new WKTReader( geometryFactory );
  9. Geometry geom =reader.read(geomWKT);
  10. Geometry point = reader.read(pointWKT);
  11. return geom.contains(point);
  12. }

注:GEO计算能力可以使用Redis的geohash 和Postgresql的空间计算能力。

相关文章