WKT


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
 
OpenGIS的說明書中還規定了空間對象的內部存儲格式要包括一個空間參考系統標識(SRID)。當創建空間對象並向數據插入的時候需要這樣的SRID。下面是一個有效創建和插入一個OGC空間對象的語句: 
 INSERT INTO SPATIALTabLE ( THE_GEOM, THE_NAME ) 
 
 
  VALUES ( GeomFromText(''POINT(-126.4 45.32)'', 312), ''A Place'' ) 
 
 
  注意:上面的THE_GEOM字段是GEOMETRY類型,該類型的對象可以用WKB定義,也可以用WKT定義。如:
 
  
 geometry = GeomFromWKB(bytea WKB, SRID); 
 
 
  geometry = GeometryFromText(text WKT, SRID); 
 
 
  所以GeomFromText(''POINT(-126.4 45.32)'', 312)中的POINT(-126.4 45.32)就是WKT,312就是這個空間對象的SRID。
 
  
PostGIS的EWKB, EWKT 
 
 
  OGC的格式只支持2D的地理要素,而且其相關聯的SRID不能嵌入到輸入輸出表達中。PostGIS的擴展格式目前是OGC格式的超集,也就是說只要是有效的WKB或WKT就是有效的EWKB或EWKT。當然,如果今后OGC發布與該擴展格式相沖突的新格式,那么這種超集的情況就會有所變化了。PostGIS的EWKB, EWKT增加了對3DZ,3DM和4D坐標的支持,並可嵌入SRID信息。
 
  下面是一些EWKT的例子: 
 
 
  POINT(0 0 0)-- XYZ 
 
 
  SRID=32632;POINT(0 0) – XY with SRID 
 
 
  由於SRID可以嵌入到EWKT或EWKB中,空間對象的定義就可以簡化為:
 
  geometry = GeomFromEWKB(bytea EWKB);
 
  geometry = GeomFromEWKT(text EWKT);
 
  那么,相數據庫中插入PostGIS空間對象就可以寫成:
 
  INSERT INTO SPATIALTabLE ( THE_GEOM, THE_NAME )
 
  VALUES ( GeomFromText(''POINT(-126.4 45.32 312)''), ''A Place'' )

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"]
 

基礎知識:坐標參照系有三種最常見的子類:地心坐標系(geocentric cs、GEOCCS),地理坐標系(geographic cs、GEOGCS),和投影坐標系(projected cs、PROJCS)以及相互之間的關系,可以參考《坐標參照系》。投影參數內容:Ellipsoid 、 Datum ;Projection,可以參考《地圖投影為什么》。

坐標系的文字描述的擴展BN范式(EBNF)定義如下:
<coordinate system> = <projected cs> | <geographic cs> | <geocentric cs>

 

 

<projection> = PROJECTION["<name>"]

<parameter> = PARAMETER["<name>", <value>]

<value> = <number>

 

 

<datum> = DATUM["<name>", <spheroid>]

<spheroid> = SPHEROID["<name>", <semi-major axis>, <inverse flattening>]

<semi-major axis> = <number> NOTE: semi-major axis is measured in meters and must be > 0.

<inverse flattening> = <number>

<prime meridian> = PRIMEM["<name>", <longitude>]

<longitude> = <number>

 

 

<angular unit> = <unit>

<linear unit> = <unit>

<unit> = UNIT["<name>", <conversion factor>]

<conversion factor> = <number>

以下示例說明,參照上述參數,然后比瓢畫葫蘆即可自行用WKT創建坐標系。

地理坐標系的格式:<geographic cs> = GEOGCS["<name>", <datum>, <prime meridian>, <angular unit>]

WGS1984的地理坐標系WKT形式:
GEOGCS["WGS 84",
DATUM["WGS_1984",
SPHEROID["WGS 84", 6378137, 298.257223563, AUTHORITY["EPSG", "7030"]],
AUTHORITY["EPSG", "6326"]],
PRIMEM["Greenwich", 0, AUTHORITY["EPSG", "8901"]],
UNIT["degree", 0.0174532925199433, AUTHORITY["EPSG", "9122"]],
AUTHORITY["EPSG", "4326"]]

投影坐標系的格式:<projected cs> = PROJCS["<name>", <geographic cs>, <projection>, {<parameter>,}* <linear unit>]

WGS1984地理坐標,統一橫軸墨卡托(UTM)投影,中央經線117E的投影坐標系WKT形式:

PROJCS["WGS 84 / UTM zone 50N",
GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84", 6378137, 298.257223563, AUTHORITY["EPSG", "7030"]], AUTHORITY["EPSG", "6326"]], PRIMEM["Greenwich", 0, AUTHORITY["EPSG", "8901"]], UNIT["degree", 0.0174532925199433, AUTHORITY["EPSG", "9122"]], AUTHORITY["EPSG", "4326"]],
PROJECTION["Transverse_Mercator"],
PARAMETER["latitude_of_origin", 0],
PARAMETER["central_meridian", 117],
PARAMETER["scale_factor", 0.9996],
PARAMETER["false_easting", 500000],
PARAMETER["false_northing", 0],
UNIT["metre", 1, AUTHORITY["EPSG", "9001"]],
AUTHORITY["EPSG", "32650"]]

地心坐標系格式相似於地理坐標系:<geocentric cs> = GEOCCS["<name>", <datum>, <prime meridian>, <linear unit>]

參數中出現AUTHORITY是EPSG的玩意,在自定義坐標系時可以忽略,我會在后面詳細介紹EPSG相關內容。WKT更具體的可參考OGC相關文檔:如SFA、《SF for OLE/COM》等。

 

練習:給出下屬投影坐標系參數,請用WKT方式表述。
投影參數:橢球體,Krasovsky_1940;基准面,北京1954;投影:蘭勃特雙標准緯線,25N,47N;中央經線,117E。

 

參考答案:

PROJCS["liongg",
GEOGCS["GCS_Beijing_1954",
DATUM["D_Beijing_1954",SPHEROID["Krasovsky_1940",6378245.0,298.3]],
PRIMEM["Greenwich",0.0],
UNIT["Degree",0.0174532925199433]],
PROJECTION["Lambert_Conformal_Conic"],
PARAMETER["False_Easting",20500000.0],
PARAMETER["False_Northing",0.0],
PARAMETER["Central_Meridian",0.0],
PARAMETER["Standard_Parallel_1",25.0],
PARAMETER["Standard_Parallel_2",47.0],
PARAMETER["Scale_Factor",1.0],
PARAMETER["Latitude_Of_Origin",0.0],
UNIT["Meter",1.0]]

 

有個偷懶的方法就是用商業軟件譬如ArcGIS按照參數新建投影,然后在.prj文件中提取投影內容並修改。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM