http://yjphhw.blog.sohu.com/105207727.html
终端或DOSshell下可以输入(带$的为向终端里输入的命令):
$proj
Rel. 4.6.0, 21 Dec 2007
usage: proj [ -beEfiIlormsStTvVwW [args] ] [ +opts[=arg] ] [ files ]
会显示出proj的用法。包括参数设置,可选项,和输入文件。
对于作地图和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 显示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
上边显示的就是基准面和椭球 体的差异。
我国常用的地图投影主要有,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下指的是当前目录,win下没试过,不过可以用绝对路径。 ‘>’是重定向,输出文件。
proj支持许多单位,可以通过 proj -lu,看到支持的单位:
$ proj -lu
km 1000. Kilometer
m 1. Meter
dm 1/10 Decimeter
cm 1/100 Centimeter
mm 1/1000 Millimeter
kmi 1852.0 International Nautical Mile
其中proj默认的单位为米(meter),我们设置参数 +units 来控制输入的坐标单位。我们可以将它的输入或输出的数据的单位改为其它:
$ proj +proj=aea +ellps=krass +lon_0=105 +lat_1=25 +lat_2=47 +units=km -I <
> 0 3847.86697
> -88.52243 3848.31280
> 102.06408 2503.93426
> e
105dE 36dN
104dE 36dN
106dE 24dN
其实在上边我们已经用到了一些参数。比如进行投影的反转,所使的是-I。还有就是给出的中国等积投影是: proj +proj=aea +ellps=krass +lon_0=105 +lat_1=25 其中有许多参数前边都加了前缀‘+’,这后边的参数是对地图投影的真正的设置,proj命令也将按这个规定来进行转换。这种的参数的形式是 +param=value 为param(参数)来给定一个value(值),这个值可以是一个以度分秒格式或实数,整数,甚至可以是一个ASCII字符串。
所要注意的是一种拼错了的参数名会被不理会,如果一个参数输入了两次,则第一次输入的将被使用。所以在执行前要将参数检查好。另一个很有用的特点是,proj会自动决定中央经线并且追加一个+lon_0参数到你的定义中,如果你没有定义中央经线的话。
选择投影使用的参数是+proj=name。proj中集成了不少的投影而且还在不断的增加。可惜的对我们中国的并没增加多少!它在这里提供我们增加我们自己投影的方法。
我们可以用命令:
$proj -l #得到内置的投影类型
aea : Albers Equal Area #可以看到Albers等积投影的在proj中的值是aea
$proj -lP #得到更详细的投影信息,投影包含的参数。
aea : Albers Equal Area #更详细的信息
Conic Sph&Ell
lat_1= lat_2=
这样我们就可以来定你想要的投影了。
虽然投影定了,可是还要确定椭球体。有两种办法:一种是利用内置的一些椭球体。
$proj -le #显示出内置的椭球体。
找几个我国经常用的椭球体:
clrk66 a=6378206.4 b=6356583.8 Clarke 1866
krass a=6378245.0 rf=298.3 Krassovsky, 1942
WGS84 a=6378137.0 rf=298.257223563 WGS 84
另一种就是你可以自定义一个你自己的地球,在上边的三个椭球体上就包含了定义一个椭球体的参数。以下面是这几个参数的含义:
必须有的:
+a=A 椭球的赤道半径(半长轴)
下边的这些只要一个就行的参数:
+b=B 椭球的极半径(半短轴)
+f=F 椭球的扁率 F=(A-B)/A
+rf=RF 椭球的反扁率 RF=1/F
+e=E 偏心率
+es=ES 偏心率的平方 E^2
例如指定一个Clark1866 椭球来作为中国等积投影的参数就可以这样来设置:
$proj +proj=aea +ellps=clrk66 +lon_0=105 +lat_1=25
105 36 #可以和上边的krass椭球体比较
0.00 3850517.66
104 36
-88731.89 3850957.52
106 24
102046.72 2507997.23
同样也可以自定义:
$ proj +proj=aea +a=6378206.4 +es=.006768658 +lon_0=105 +lat_1=25
或:
$ proj +proj=aea +a=6378206.4 b=6356583.8 +lon_0=105 +lat_1=25
得到结果都是一样的。
如果你仅仅只指定了一个+a则会得到一个正规的球体。例如:proj +a=1
你会定义一个半径R=1的单位球体。
我们知道UTM投影,为确保每个带中的点全为正,在北半球将坐标从每带的中央径线西移500公里。而南半球为了保证Y轴为正,不得不还向南移。这样两个参数在proj中可以用两个参数+x_0和+y_0来确定。
利如在UTM中,+x_0=5000000 +y_0=0
还有一个是+lat_0:不太清楚,把原文贴过来。 A fourth parameter, lat_0=φ0 , is used to designate a
central parallel and associated y axis origin for several projections.
还有最后一个+lon_0:指中央径线,在UTM还有Albers中要设置。
上边的四个参数是可选的如果没有将会默认为0,除+lon_0,它会计算。
这样我们就完成了一个投影的完整定义了,至少我认为这是一种很很简单很优美的定义投影的方式。
通常把这种proj定义出的投影形式称为PROJ4格式,例如刚开始写的中国的等积投影:
+proj=aea +ellps=krass +lon_0=105 +lat_1=25
还有中国的Lambert投影,写法和上边差不多,在proj4里的投影名称叫+proj=lcc
定义一个UTM投影的方法
$proj +proj=utm +zone=48
105 36 #在离兰州最近的一条中央经线
500000.00 3983948.45 #可以看出西移500000米
定义一个高斯克吕格(它是横轴墨卡托的一种,也是横轴黑卡托的默认值)
$proj +proj=tmerc +lon_0=105 #这上边没带,可以简单的算出每个带的中央经线的度数:(带数*6)-3就是中央经线