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

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

发布了627 篇原创文章 · 获赞 535 · 访问量 359万+

猜你喜欢

转载自blog.csdn.net/boonya/article/details/103174549