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的空間計算能力。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章