proj4经纬度bl转换xy_多种坐标系之间的转换之Proj.NET_转载
Proj.NET (http://www.codeplex.com/ProjNET)是一個.NET下開源的空間參照和投影引擎,遵循OGC相關標準。負責人(Coordinators
)是D_Guidi
和SharpGIS,開發者(Developers)還有codekaizen、rstuven等,這些人也是.NET下其他的開源系統如GeoAPI.NET、SharpMap等主要貢獻者。License:
GNU Library General Public License (LGPL).
Proj.NET支持基準面轉換,地理坐標系,投影坐標系,地心坐標系,可在多種.NET框架下使用,并支持SilverLight。它可進行點對點之間的坐標變換,同時也可以把坐標系轉換為
Well-Known Text (WKT) 和 XML。目前支持投影類型有:Mercator、橫軸墨卡托投影(Transverse
Mercator)、Albers、正軸等角割圓錐投影(Lambert Conformal Conic、蘭勃特投影)等。
目前最新版發布版本是1.0,2007年8月,binaries內含Proj.NET.dll和Proj.NET.XML兩個文件,創建程序時引入dll文件,即可使用相關類、函數、接口等。若想深入了解,建議把源碼和示例一并下載。下面以實例來注解Proj.NET進行坐標轉換的用法。
對地圖投影基本概念,如投影參數,坐標系,SRID,WKT等概念不清楚的話,LionGG前面幾篇文章都已介紹。理解則有助于閱讀下面的示例程序,像我先前一知半解,看著示例修改代碼也可以完成你自己的工作。
一個多月前,同學提供投影參數和四個投影坐標,讓幫忙轉換成經緯度坐標。ArcGIS我玩得不熟練,當時便使用剛接觸不久的著名開源投影庫proj4解決了問題。這一個月閑散時間主要集中在.NET開源GIS上,看了GeoAPI.NET和Proj.NET,于是順便用Proj.NET完成同樣的工作,兩相驗證結果。
投影參數:橢球體Krasovsky_1940;Datum:北京1954;投影:蘭勃特雙標準緯線,25N,47N。
坐標數據: 20634500,4660000; 20635500,466000; 20634500,
4659000;20635500,4659000 。
求經緯度無非就是從自定義投影坐標系轉換到WGS1984坐標系,反之若求地理坐標則是從WGS84geogCS轉換到要求的投影坐標系。首先了解下在Proj.NET創建坐標系的方法:
predefined、SRID、WKT、Code。
用預定義方法或SRID創建WGS84地理坐標系:
GeographicCoordinateSystem toCS =
GeographicCoordinateSystem.WGS84;
預定義方法,十分簡單,但系統預定義坐標系為數不多。
ICoordinateSystem toCS = SridReader.GetCSbyID(4326);
使用SRID也比較容易,前提是引入EPSG的數據集,還有SridReader類文件,在源碼中有。不知道什么EPSG什么SRID?參考《SRID、EPSG》。
用WKT或Code創建給定的投影坐標系(寫代碼時注意轉義字符"和刪除換行):
string bj1954Lcc = 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?比瓢畫葫蘆,請參考《WKT
(Well Known Text)》。然后用下行語句解析為投影坐標系。
IProjectedCoordinateSystem fromCS =
CoordinateSystemWktReader.Parse(bj1954Lcc) as
IProjectedCoordinateSystem;
對于用戶自定義坐標系,即系統和EPSG沒有預設的坐標系,只有通過WKT和Code方式來定義。所謂Code方式即把WKT中的“元素”如DATUM、SPHEROID、UNIT等分別定義,最后組合,何必那么麻煩?就像沒必要用WKT方式去創建WGS84地理坐標系一樣。
看一下轉換多個坐標對的函數原型:List
TransformList(List
points);
參數和返回值都是List型,List的每個元素是一個一維double型數組。每個一維數組即一個坐標對:兩個或三個元素,取決于有沒有高程等第三個坐標Z,順序為(x,y,z)。因此我們需要把給的坐標存儲到List中。(不懂泛型?不是吧……)
LionGG寫了一個多點到多點的轉換函數:參數分別是源坐標系,目標坐標系,要轉換的坐標值List,返回的坐標值List。函數內容就不再解釋,不精通設計模式?知道工廠模式不至于迷糊就行。
static void
PtsToPts(ICoordinateSystem fromCS, ICoordinateSystem
toCS,List pts, out
List results)
{
CoordinateTransformationFactory ctfac = new
CoordinateTransformationFactory();
ICoordinateTransformation trans =
ctfac.CreateFromCoordinateSystems(fromCS, toCS);
results = trans.MathTransform.TransformList(pts);
}
下面是主函數,簡略起見,命名空間的引用,異常捕捉等省略,并不再注釋。
static void Main(string[] args)
{
string bj1954Lcc= "……"; //見上文
IProjectedCoordinateSystem fromCS =
CoordinateSystemWktReader.Parse(bj1954Lcc) as
IProjectedCoordinateSystem;
GeographicCoordinateSystem toCS =
GeographicCoordinateSystem.WGS84;
double[] xPts = new double[4] { 20634500, 20635500, 20634500,
20635500 };
double[] yPts = new double[4] { 4660000, 4660000, 4659000, 4659000
};
List pts = new
List();
for (int i = 0; i < 4; i++)
{
double[] xy = new double[] { xPts[i], yPts[i] };
pts.Add(xy);
List results = new
List();
PtsToPts(fromCS, toCS, pts, out results);
foreach (double[] result in results)
{
Console.WriteLine("{0},{1}", result[0], result[1]);
}
}
下面是計算結果,可以看出來和使用proj4的計算結果只有精度位數的差異。
118.611065451529,40.4621006468135
118.623041399559,40.4619479215536
118.610866262964,40.4529532936788
118.622840730867,40.4528005852267
proj4是用C寫的,很好很強大,我暫且只會簡單使用,沒看過源代碼。Proj4的計算結果:
Beijing 1954:?20634500.0?4660000.00
pj_inv result:
118.611065?40.462077
Beijing 1954:?20635500.0?4660000.00
pj_inv result:
118.623041?40.461924
Beijing 1954:?20634500.0?4659000.00
pj_inv result:
118.610866?40.452929
Beijing 1954:?20635500.0?4659000.00
pj_inv result:
118.622841?40.452777
本文介紹了Proj.NET的基本情況,如何創建坐標系,如何在坐標系間進行多個坐標點的轉換,滿足了最基本的需求。后續會逐步介紹更加深入一點功能。
總結
以上是生活随笔為你收集整理的proj4经纬度bl转换xy_多种坐标系之间的转换之Proj.NET_转载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 货币基金赎回当天有没有收益
- 下一篇: 白条晚了4天上征信吗