Proj.Net是開源地圖投影庫Proj.4的.net版本,許多GIS開源軟件的投影都直接或間接地使用Proj.4的庫,Proj.4是用C語言編寫。.Net下的開源GIS項目NetTopologySuite中開發維護最新版的Proj.Net項目,地址地址是:
https://github.com/NetTopologySuite/ProjNet4GeoAPI
一、空間坐標系的概念
空間中的某一個位置,通常是由一個坐標來表示,坐標和位置要想正確對應起來,則必須了解該坐標的坐標系是如何定義的,坐標系在有些軟件中也稱為空間參考(SpatialReference)。地圖的每個坐標都必須知道其坐標系的定義方法,一幅地圖中各圖層或者各要素的數據,必須是在同一坐標系或者轉化為同一個坐標系下,才能直接進行運算,比如計算面積,距離,或者判斷空間關系等。空間坐標系的相關概念有大地水准面、參考橢球體、基准面、地理坐標系、投影坐標系等。
大地水准面(geoid):靜止的平均海水面及其向陸地延伸后組成的封閉曲面,稱為大地水准面,是一個不規則形狀。大地水准面是對地球形狀的最底層的描述,在大地水准面上,每一處的重力方向均與大地水准面垂直。大地水准面沒有准確的數學公式。
參考橢球體(ellipsoid):將大地水准面用一個規則的橢球面進行擬合,該橢球體用長半軸、短半軸和扁率三個參數中的兩個來表示。由於測量方法的不同,會有不同的參考橢球體的參數,北京54坐標系使用的是Krassovsky 1940橢球體,西安80坐標系使用的是IAG 75橢球體,GPS坐標使用的是WGS 1984橢球體。
基准面(datum):在參考橢球體的基礎上,定義橢球體相對於地心的位置。基准面可分為地心基准面和區域基准面,地心基准面橢球體的中心位於地心(地球的質心),最廣泛的基准是 WGS 1984,被用作在世界范圍內進行定位測量。局域基准面是在特定區域內與地球表面極為吻合,橢球體表面上的某一點與地球表面上的特定點相匹配,該點稱作基准面的原點,54坐標系基准面原點在前蘇聯的普爾科沃,80坐標系基准面原點在西安。
地理坐標系(GeographicCoordinateSystem):是一種球面坐標系,在基准面的基礎上,加上本初子午線(原點的位置)、坐標軸方向(x方向向東為正,y方向向北為正)、坐標單位(角度還是弧度)的定義。地理坐標系下的坐標就是我們常見的經緯度坐標。
投影坐標系(ProjectedCoordinateSystem):是基於平面的坐標系(二維平面坐標),在地理坐標系的基礎上,加上投影方法、參數、坐標軸方向和坐標單位的定義。
二、Proj.Net中創建坐標系的方法
Proj.NET支持基准面轉換,地理坐標系,投影坐標系,地心坐標系,可在多種.NET框架下使用,並支持SilverLight。它可進行點對點之間的坐標變換,同時也可以把坐標系轉換為 Well-Known Text (WKT) 和 XML。目前支持投影類型有:Mercator、橫軸墨卡托投影(Transverse Mercator)、Albers、正軸等角割圓錐投影(Lambert Conformal Conic、蘭勃特投影)等。
2.1 手工代碼創建:
首先初始化一個工廠對象用來創建坐標系的相關對象:
var cFac = new CoordinateSystemFactory();
1) 創建參考橢球體
var ellipsoid = cFac.CreateFlattenedSphere("Bessel 1840", 6377397.155, 299.15281, LinearUnit.Metre);
2) 創建基准面
var datum = cFac.CreateHorizontalDatum("Bessel 1840", DatumType.HD_Geocentric, ellipsoid, null);
3) 創建地理坐標系
var gcs = cFac.CreateGeographicCoordinateSystem(
"Bessel 1840", // 自定義名稱
AngularUnit.Degrees, datum, PrimeMeridian.Greenwich, new AxisInfo("Lon", AxisOrientationEnum.East), new AxisInfo("Lat", AxisOrientationEnum.North) );
4) 創造投影坐標系
// 投影參數
var parameters = new List<ProjectionParameter>(5);
parameters.Add(new ProjectionParameter("latitude_of_origin", 0)); parameters.Add(new ProjectionParameter("central_meridian", 110)); parameters.Add(new ProjectionParameter("scale_factor", 0.997)); parameters.Add(new ProjectionParameter("false_easting", 3900000)); parameters.Add(new ProjectionParameter("false_northing", 900000)); // 投影定義 var projection = cFac.CreateProjection( "MercatorProjection", // 自定義名稱 "Mercator_1SP", // 系統可識別的投影方法名稱
parameters ); // 投影坐標系 var pcs= cFac.CreateProjectedCoordinateSystem( "Makassar / NEIEZ", // 自定義名稱
gcs,
projection,
LinearUnit.Metre, new AxisInfo("East", AxisOrientationEnum.East), new AxisInfo("North", AxisOrientationEnum.North)
);
5) 項目中預置的常用坐標系
var centricCS = GeocentricCoordinateSystem.WGS84; // 地心坐標系 var geoCs = GeographicCoordinateSystem.WGS84; // 地理坐標系 var webMercator = ProjectedCoordinateSystem.WebMercator; // WebMercator投影坐標系 var utm33 = ProjectedCoordinateSystem.WGS84_UTM(33, true); // UTM投影坐標系
2.2 根據WKT字符串創建
將描述一個坐標系所需要各種數據,按照GIS標准化組織所規定的格式,用字符串的形式來進行表達,該字符串就是表示該坐標系的wkt字符串,比如我國100萬地形圖所采用的地圖投影是雙標准緯線等角圓錐投影,其wkt字符串如下:
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]] ;
根據該wkt字符串,創建其對應的坐標系的代碼如下:
var pcs = CoordinateSystemWktReader.Parse(bj1954Lcc) as IProjectedCoordinateSystem;
2.3 根據SRID文件創建
為記錄和保存各種常用的坐標系,將wkt字符串中的各部分內容進行分解,以然后以表格的形式存入到SRID.csv文件中,表格中一行代表一種坐標系的定義,並由GIS標准化組織對每種坐標系進行了統一的編號和命名,我們可以根據編號即可創建其相應的坐標系。
var cs = SRIDReader.GetCSbyID(4326);
三、投影類型與應用場合
前面已經介紹,投影坐標系是在地理坐標系的基礎上,加上投影方法、參數、坐標軸方向和坐標單位等來進行定義的。其中最重要的是投影方法和參數,投影方法是指我們采用哪一種數學公式,將經緯度坐標轉換為平面坐標,參數是確定投影方法后,需要設置其投影參數,不同的參數設置,可以滿足不同地區數據的需要。
Proj.Net中通用的投影參數有5個,各自的含義如下:
central_meridian:中央經線(投影中心點經度)
latitude_of_origin:投影中心點緯度
scale_factor:比例系數
false_easting:東偽偏移(原點在新坐標系中的x值)
false_northing:北偽偏移(原點在新坐標系中的y值)
另外不同的投影方法,還有自己所特有的投影參數,在后面投影方法中具體介紹。
Proj.Net目前最新版本支持的投影方法有11種,在項目中由11個類來表示,分別是:Mercator、 PseudoMercator、 TransverseMercator、 AlbersProjection、 LambertConformalConic2SP、 ObliqueStereographicProjection、 KrovakProjection、 PolyconicProjection、 CassiniSoldnerProjection、 HotineObliqueMercatorProjection和ObliqueMercatorProjection,在創建投影坐標系時,需要指定投影方法名稱,系統根據投影方法名稱來查找對應的投影類,一個投影類可能對應多個投影方法名稱,下面依次介紹其使用方法和場合。
3.1 Mercator(墨卡托投影)
墨卡托投影是等角正軸圓柱投影,投影后經緯線為互相正交的平行直線。該投影在航海航空應用很廣,使用該投影,等角航線在地圖上是一條直線。該投影方法名稱為mercator、mercator_1sp和mercator_2sp均對應該類。mercator_1sp為切圓柱投影、mercator_2sp為割圓柱投影。投影方法名稱mercator_1sp有5個通用參數(SRID.cvs中沒有找到mercator和mercator_2sp的投影)
3.2 PseudoMercator(偽墨卡托投影)
偽墨卡托投影,又稱為Web Mercator ,這個坐標系統是 Google Map 最先使用的,或者更確切地說,是Google 最先發明的。在投影過程中,將表示地球的參考橢球體近似的作為正球體處理(正球體半徑 R = 橢球體半長軸 a),然后使用等角正軸切圓柱投影。使用該投影,緯度-85度(近似值)至85度的區域在投影平面上是一個正方形。該投影方法名稱可以是pseudo-mercator、popular_visualisation pseudo-mercator或者google_mercator。
這個坐標系的ID經歷了曲折的過程,好多做Web開發的朋友都感到困惑。簡單地順一下: OpenLayers:900913 由於得不到官方的認證ID,Google為Web Mercator 任性地制定了這個ID,google=900913
EPSG:3785 這是 EPSG 在 2008 年給 Web Mercator 設立的WKID,但是這個坐標系的基准面是正圓球,不是WGS 1984。 存在了一段時間后被棄用。
EPSG:3857 EPSG為 Web Wercator 最終設立的WKID,也就是現在我們常用的Web 地圖的坐標系,並且給定官方命名 “WGS 84 / Pseudo-Mercator“。
ESRI:102113 Esri內部使用ID,與 EPSG:3785 相應。已被棄用。
ESRI:102100 Esri內部使用ID,與 EPSG:3857 相應。
3.3 TransverseMercator(橫軸墨卡托投影)
橫軸墨卡托投影(Transverse Mercator)墨卡托投影類似,不同之處在於圓柱沿經線而不是沿赤道相切。通過這種方法生成的等角投影不會保持真實的方向。該投影是把地球看作半徑=R的球,如果把地球看作橢球即為通用橫軸墨卡托投影或高斯-克呂格投影。該投影等高圈和垂直圈互相正交,經緯線為曲線。墨卡托投影因其經線為平行直線,便於顯示時區划分,如時區圖、航空圖、航海圖等。
通用橫軸墨卡托投影(Universal Transverse Mercator) (UTM):通用橫軸墨卡托坐標系是對橫軸墨卡托投影的專門化應用。地球被分為 60 個區域,每個區域所跨經度為 6 度。已被許多國家作為地形圖的數學基礎。一般從南緯度80到北緯度84度的范圍內使用該投影, 對於兩極地區則采用UPS投影(通用球面極投影)。
高斯-克呂格投影(Gauss-Krüger):此投影與墨卡托投影類似,不同之處在於圓柱沿經線而不是沿赤道相切。通過這種方法生成的等角投影不會保持真實的方向。高斯-克呂格(GAUSS-KRUGER)是等角橫切橢圓柱投影。該投影以中央經線和赤道投影后為坐標軸,中央經線長度比=1。該投影將地球划分為60個投影帶,每帶經差為6度,已被許多國家作為地形圖的數學基礎。一般從南緯度80到北緯度84度的范圍內使用該投影。 對於兩極地區則采用UPS投影(通用球面極投影)。高斯-克呂格投影通常投影帶為6度范圍或3度,超過了6度后變形會增大。一般常用來制作大比例尺的地圖投影,如1/50萬、1/10萬、1/5萬、1/1萬等。
投影方法名為transverse_mercator,5個通用參數
3.4 AlbersProjection(亞爾勃斯投影)
亞爾伯斯等積圓錐投影(Albers equal area conic) 即為雙標准緯線投影,也即正軸等面積割圓錐投影。該投影經緯網的經線為輻射直線,緯線為同心圓圓弧。亞爾伯斯等積圓錐投影的應用在編制一些行政區划圖,人口地圖,地勢圖等方面應用較廣。如中國地勢圖,即是以Q1=25度,Q2=45度的亞爾伯斯等積圓錐投影。這種圓錐投影使用兩條標准緯線,相比使用一條標准緯線的投影可在某種程度上減少變形。標准緯線之間的形狀和線性比例變形最小。
投影方法名為albers、 albers_conic_equal_area。
albers_conic_equal_area的參數為:standard_parallel_1、standard_parallel_2、latitude_of_origin、longitude_of_center、false_easting、false_northing
3.5 LambertConformalConic2SP(蘭勃特投影)
蘭伯特等角圓錐投影是最適用於中緯度的一種投影。其類似於亞爾勃斯等積圓錐投影,不同之處在於蘭勃特等角圓錐投影描繪形狀更准確。蘭伯特等角圓錐投影也稱蘭勃特正形圓錐投影,該投影的微分圓投影后仍為圓形。經線為輻射直線,緯線為同心圓圓弧。指定兩條標准緯度線Q1,Q2,在這兩條緯度線上沒有長度變形,即M=N=1。此種投影也叫等角割圓錐投影,可用來編制中,小比例尺地圖。我國的分省圖,即為兩條標准緯度線為Q1=25度,Q2=45度的蘭伯特等角圓錐投影。1962年以后,百萬分一地圖采用了等角圓錐投影,極區附近,采用等角方位投影(極球面投影)。
投影方法名為lambert_conformal_conic、lambert_conformal_conic_2sp、LambertConformalConic2SP
SRID.cvs中有Lambert_Conformal_Conic_1SP,具有5個通用參數
Lambert_Conformal_Conic_2SP的參數為:standard_parallel_1、standard_parallel_2、latitude_of_origin、central_meridian、false_easting、false_northing
3.6 ObliqueStereographicProjection(斜球面投影)
Proj.Net 1.3.2以上版本支持該投影。此投影為等角方位投影,最適合的地區是兩極地區,投影中心點在北極或者南極時(latitude_of_origin參數值為90或者-90),稱為極球面投影(Polar stereographic)。通用極球面投影(Universal Polar Stereographic) (UPS)是美國於1948年設計的專用地形圖投影,用於南北緯80°以上地區。UPS的投影平面割橢球於81度緯線圈(scale_factor參數值為0.994),central_meridian參數為0,false_easting和false_northing參數均為2000000
3.7 KrovakProjection(Krovak投影)
Krovak 投影是一種斜蘭勃特等角圓錐投影,專為前捷克斯洛伐克而設計。
3.8 PolyconicProjection(多圓錐投影)
多圓錐投影(Polyconic):此投影的名稱可理解為“許多圓錐”,也指出了投影方法。
普通多圓錐投影(ordinary polyconic projection):普通多圓錐投影的經線為對稱於中央經線和赤道的曲線,緯線投影為同軸圓圓弧,弧 心位於中央直徑線上,中央經線是直線,M=1,緯線與中央經線正交,N=1.該投影適用於沿中央經線延伸的區域(15度范圍內)。常用於編制中、小比例尺的數學基礎。該投影在美國被廣泛應用,是百萬分一地圖投影的基礎。
3.9 CassiniSoldnerProjection(卡西尼-斯洛德投影)
卡西尼-斯洛德投影(Cassini-Soldner):沿中央子午線及與其平行的所有線方向,該橫軸圓柱投影的比例保持不變。此投影既不是等積投影也不是等角投影。
3.10 HotineObliqueMercatorProjection(洪特尼斜軸墨卡托投影)
洪特尼斜軸墨卡托投影(Hotine Oblique Mercator):此投影是沿斜軸旋轉墨卡托投影所得的投影,開發該投影的目的是針對既不朝南北方向也不朝東西方向,而是方向傾斜的區域繪制等角地圖。
3.11 ObliqueMercatorProjection(斜軸墨卡托投影)
空間斜軸墨卡托投影(Space Oblique Mercator):對於此投影,在軌道地圖繪制衛星(如,美國陸地資源衛星)的探測范圍內形狀幾乎保持不變,且幾乎不發生比例變形。
