proj4 笔记

http://yjphhw.blog.sohu.com/105207727.html

终端或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  显示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 <<EOF

> 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 <<e

> 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  <<e

> 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下没试过,不过可以用绝对路径。 ‘>’是重定向,输出文件。

 

2.3地图单位

   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 <<e

> 0 3847.86697

> -88.52243 3848.31280

> 102.06408 2503.93426

> e

105dE     36dN

104dE     36dN

106dE     24dN

3、地图投影设置

 

其实在上边我们已经用到了一些参数。比如进行投影的反转,所使的是-I。还有就是给出的中国等积投影是: proj +proj=aea +ellps=krass +lon_0=105 +lat_1=25 其中有许多参数前边都加了前缀‘+’,这后边的参数是对地图投影的真正的设置,proj命令也将按这个规定来进行转换。这种的参数的形式是 +param=value 为param(参数)来给定一个value(值),这个值可以是一个以度分秒格式或实数,整数,甚至可以是一个ASCII字符串。

所要注意的是一种拼错了的参数名会被不理会,如果一个参数输入了两次,则第一次输入的将被使用。所以在执行前要将参数检查好。另一个很有用的特点是,proj会自动决定中央经线并且追加一个+lon_0参数到你的定义中,如果你没有定义中央经线的话。

 

3.1选择投影

选择投影使用的参数是+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=

这样我们就可以来定你想要的投影了。

 

3.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的单位球体。

 

3.3通用的参数

我们知道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就是中央经线

转载自:https://blog.csdn.net/Witch_Soya/article/details/7597644

You may also like...

退出移动版