geometry,英語單詞,名詞,意思是“幾何學幾何結構”。
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各四分之一圓弧。如果不在乎太準確可以將圓弧都換成矩形。
多邊形——>不規則轉規則圖形
由於多邊形的不確定性,沒法按照常規方法處理。
查找距離最遠的兩個點以此爲半徑畫圓。難點:需要算出中心點和半徑。
或者通過最大邊最遠距離畫矩形。難點:
- 確定起始點。
- 關注邊的角度計算。
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的空間計算能力。