PROJ4初探(转并整理格式)
Proj4是一个免费的GIS工具,软件还称不上。 它专注于地图投影的表达,以及转换。采用一种非常简单明了的投影表达--PROJ4,比其它的投影定义简单,但很明显。很容易就能看到各种地理坐标系和地 图投影的参数,同时它强大的投影转换功能,也是非常吸引人的。许多的 GIS软件中也将其集成在内。Proj可以在 window的命令下有可运行的 EXE文件,其实它更主要的是一个库!可以用来编一些批处理。在 Linux下除了可以直接运行外,还可以作为库来进行更高功能的开发。
1 安装
Window下安装:
从Proj4的网站下载安装文件,解压缩,把路径加到环境变量里即可。具体操作步骤在解压后的README有详细说明。
Ubuntu Linux下安装: 可以在终端输入:
sudo apt -get install proj
Fedora Linux 下安装: 可以在终端输入:
su -c 'yum install proj'
2 快速开始
在终端或 DOSshell下可以输入(带$的为向终端里输入的命令):
$proj Rel. 4.6.0, 21 Dec 2007 usage: proj [-beEfiIlormsStTvVwW [args]] [+opts[=arg]] [files]
会显示出 proj的用法。包括参数设置,可选项,和输入文件。
2.1 显示参数
对于作地图和 GIS工作者来说投影可谓是一切的基础,投影的正确与否将关第到最终结果正确与否。在 proj里边集成了,许多的制作地图用的投影参数。我们可以使用下边的命令来显示在 proj里的内置的有关地图投影的参数。显示投影类型:
$proj -l aea: Albers Equal Area aeqd: Azimuthal Equidistant ... ... ... wag5: Wagner V wag6: Wagner VI wag7: Wagner VII weren: Werenskiold I wink1: Winkel I wink2: Winkel II wintri: Winkel Tripel
同样的,还有命令:
$proj -le显示支持的椭球体(ellipsoid)信息,显示结果省略。
$proj -ld显示Proj4支持的基准面(Datum)信息,显示结果省略。
这两个概念是有区别的。学过地图学的都知道,地图学上对地球上的抽象,第一次抽象为水准面(等重力面),第二次抽象为椭球体(ellipsoid),第三次 抽象现在我认为是将椭球体进行定位之后,所确定的具有明确的方向的椭球体,它的要求能够很好的为当地区的地图制作服务,这个似乎才可称为基准面 (Datum)。当输入:
$ proj -ld __datum_id__ __ellipse___ __definition/comments______________________________ WGS84 WGS84 towgs84=0,0,0 GGRS87 GRS80 towgs84=-199.87,74.79,246.62 Greek_Geodetic_Reference_System_1987 NAD83 GRS80 towgs84=0,0,0 North_American_Datum_1983 NAD27 clrk66 nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat
上边显示的就是基准面和椭球体的差异。
2.2 投影转换
我 国常用的地图投影主要有:Albers,Lambert,Gauss-Kruger,UTM投影。 等积投影由于没有面积变形,所以在土地调查,植被盖度分类等涉及到要保持面积不能变形的情况.中国的全国性地图许多采用等积投影。国际上称为Albers投影,是一种圆锥等积投影。中国所使用的 Albers的参数是双标准纬线,25N,47N,中央经线为105E,椭球体为Krassovsky。用proj4表示为:
+proj=aea +ellps=krass +lon_0=105 +lat_1=25 +lat_2=47
下边将用中国的 Albers投影,简称为 Albers_China来作个简单的投影转换。
$proj +proj=aea +ellps=krass +lon_0=105 +lat_1=25 +lat_2=47 105 36 0.00 3847866.97 104d36'54 36d25'9 -33897.90 3895309.74 104d25'36.9E 36d52'41N -50158.40 3947261.73
也可以进行批量转:
$ proj +proj=aea +ellps=krass +lon_0=105 +lat_1=25 +lat_2=47 < 105 36 > 104 36 > 106 24 > EOF 0.00 3847866.97 -88522.43 3848312.80 102064.08 2503934.26
同样也可以进行反转,即将 Albers转为经纬度,只要在命令中加入参数-I
$ proj +proj=aea +ellps=krass +lon_0=105 +lat_1=25 +lat_2=47 -I < 0 3847866.97 > -88522.43 3848312.80 > 102064.08 2503934.26 > e 105dE 36dN 104dE 36dN 106dE 24dN
在这里转换的过程中始终是按经度-纬度,x-y的顺序放进的。你也许会想将它们的方向掉转。如果是输入时想转可在命令中加 -r,如果是输出想掉转,可以是加 -s
$ proj +proj=aea +ellps=krass +lon_0=105 +lat_1=25 +lat_2=47 -r -s < 36 105 > 33 104 > e 3847866.97 0.00 3509623.92 -91933.97
同样也可以通过文件来进行批量转换:
lat_lon.test 105dE 36dN 104dE 36dN 106dE 24dN $ proj +proj=aea +ellps=krass +lon_0=105 +lat_1=25 +lat_2=47 ~/lat_lon.test >alberst.test
生成的:alberst.test
0.00 3847866.97 -88522.43 3848312.80 102064.08 2503934.26
你也可以在文件中加注释和对坐标点的说明,在转换后仍可以保留:
lat_lon.test #it's just a test for convert file format 105dE 36dN not Lanzhou 104dE 36dN Lanzhou 106dE 24dN Unknow place
命令:
$ proj +proj=aea +ellps=krass +lon_0=105 +lat_1=25 +lat_2=47 ~/lat_lon.test >albers.test albers.test
#it's just a test for convert file format 0.00 3847866.97 not Lanzhou -88522.43 3848312.80 Lanzhou 102064.08 2503934.26 Unknow place
在命令上边的~/lat_lon.test是输入的文件,~在 linux下指的是当前目录,windows下没试过,不过可以用绝对路径。>是重定向,输出文件。<