proj4经纬度bl转换xy-凯发k8官方网
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的基本情况,如何创建坐标系,如何在坐标系间进行多个坐标点的转换,满足了最基本的需求。后续会逐步介绍更加深入一点功能。
总结
以上是凯发k8官方网为你收集整理的proj4经纬度bl转换xy_多种坐标系之间的转换之proj.net_转载的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇:
- 下一篇: