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

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

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 EMPTY
 
MULTIPOLYGON 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各四分之一圆弧。如果不在乎太准确可以将圆弧都换成矩形。

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

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

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

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

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

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的空间计算能力。

相关文章