ArcGIS的prj文件是一个专门用来描述坐标系投影的文件,里面定义了坐标系的名称、长短半轴、基准面、投影参数等一些其他重要的信息。proj4是C用语言编写的专门用来处理各个坐标系之间的转换的开源库。可以实现经纬度坐标转平面坐标或者两个不同的椭球体之间的坐标系转换,运算精度高,计算准确,在很多GIS项目和软件中都有使用。
那么既然都是描述坐标系的文件,如何在他们之间进行转换呢,下面举个例子:
PROJCS[
"Ain_el_Abd_UTM_Zone_38N"
,GEOGCS[
"GCS_Ain_el_Abd_1970"
,DATUM["D_Ain_el_Abd_1970"
,SPHEROID["International_1924",6378388.0,297.0]]
,PRIMEM["Greenwich",0.0]
,UNIT["Degree",0.0174532925199433]
]
,PROJECTION["Transverse_Mercator"]
,PARAMETER["False_Easting",500000.0]
,PARAMETER["False_Northing",0.0]
,PARAMETER["Central_Meridian",45.0]
,PARAMETER["Scale_Factor",0.9996]
,PARAMETER["Latitude_Of_Origin",0.0]
,UNIT["Meter",1.0]
,AUTHORITY["EPSG",20438]
]
这是一个投影坐标系。
PROJCS:代表的是其投影坐标系。
投影名称是:Ain_el_Abd_UTM_Zone_38N
基准面信息:D_Ain_el_Abd_1970
椭球体:SPHEROID[“International_1924”,6378388.0,297.0]-长半轴和反扁率
单位:UNIT[“Degree”,0.0174532925199433]
PARAMETER:代表投影重要的参数信息
GEOGCS[
"GCS_Beijing_1954"
,DATUM[
"D_Beijing_1954"
,SPHEROID["Krasovsky_1940",6378245.0,298.3]
]
,PRIMEM["Greenwich",0.0]
,UNIT["Degree",0.0174532925199433]
,AUTHORITY["EPSG",4214]
]
这是一个经纬度坐标系。
GEOGCS:代表是其地理坐标系
基准面:D_Beijing_1954
椭球体:Krasovsky_1940
长半轴:6378245.0
反扁率:298.3
中央经线:PRIMEM[“Greenwich”,0.0] - 格林威治
单位:UNIT[“Degree”,0.0174532925199433]
自己写了一个转换工具,C++代码。
proj4其对应的参数信息:
投影参数:
Projection_Param proj_param_list[]=
{
{ "False_Easting" , "x_0" },
{ "False_Northing" , "y_0" },
{ "Central_Meridian" , "lon_0" },
{ "Latitude_Of_Origin" , "lat_0" },
{ "Latitude_Of_Center" , "lat_0" },
{ "Standard_Parallel_1" , "lat_ts" },
{ "Standard_Parallel_2" , "lat_2" },
{ "Latitude_Of_1st_Point" , "lat_1" },
{ "Latitude_Of_2nd_Point" , "lat_2" },
{ "Longitude_Of_1st_Point" , "lon_1" },
{ "Longitude_Of_2nd_Point" , "lon_2" },
{ "Scale_Factor" , "k" },
{ "Azimuth" , "alpha" },
{ "Longitude_Of_Center" , "lonc" },
{ NULL , NULL }
};
投影名称:
Proj_Aliases proj_aliases_list[]=
{
{"Aitoff", "aitoff" },
{"Albers", "aea" },
{"Azimuthal_Equidistant", "aeqd" },
{"Bonne", "bonne" },
{"Cassini", "cass" },
{"Chamberlin_Trimetric", "chamb" },
{"Craster_Parabolic", "crast" },
{"Cylindrical_Equal_Area", "cea" },
{"Eckert_I", "eck1" },
{"Eckert_II", "eck2" },
{"Eckert_III", "eck3" },
{"Eckert_IV", "eck4" },
{"Eckert_V", "eck5" },
{"Eckert_VI", "eck6" },
{"Equidistant_Conic", "eqdc" },
{"Equidistant_Cylindrical", "eqc" },
{"Plate_Carree", "eqc" },
{"Gall_Stereographic", "gall" },
{"Gauss_Kruger", "tmerc" },
{"Gnomonic", "gnom" },
{"Goode_Homolosine", "goode" },
{"Hammer_Aitoff", "hammer" },
{"Hotine_Oblique_Mercator_Azimuth_Center" , "merc" },
{"Krovak", "krovak" },
{"Lambert_Azimuthal_Equal_Area", "laea" },
{"Lambert_Conformal_Conic", "lcc" },
{"Loximuthal", "loxim" },
{"Mercator", "merc" },
{"Miller_Cylindrical", "mill" },
{"Mollweide", "moll" },
{"New_Zealand_Map_Grid", "nzmg" },
{"Orthographic", "ortho" },
{"Perspectice", "pconic" },
{"Polyconic", "poly" },
{"Quartic_Authalic", "qua_aut" },
{"Robinson", "robin" },
{"Sinusoidal", "sinu" },
{"Stereographic", "stere" },
{"Stereographic_South_Pole", "stere" },
{"Double_Stereographic", "sterea" },
{"Transverse_Mercator", "tmerc" },
{"Two_Point_Equidistant", "tpeqd" },
{"Universal_Polar_Stereographic", "ups" },
{"Universal_Transverse_Mercator", "utm" },
{"Van_der_Grinten_I", "vandg" },
{"Winkel_I", "wink1" },
{"Winkel_II", "wink2" },
{"Winkel_Tripel", "wintri" },
{"Hotine_Oblique_Mercator_Azimuth_Natural_Origin", "merc" },
{"Hotine_Oblique_Mercator_Two_Point_Natural_Origin", "tpeqd" },
{"Mercator_Auxiliary_Sphere", "merc" },
{"Stereographic_North_Pole", "stere" },
{"Transverse_Mercator_Complex", "tmerc" },
{ NULL , NULL }
};
单位名称:
Uint uint_list[] =
{
{ "Kilometer" , "km" },
{ "Meter" , "m" },
{ "Decimeter" , "dm" },
{ "Centimeter" , "cm" },
{ "Millimeter" , "mm" },
{ "Foot_US" , "us-ft" },
{ "Foot_Gold_Coast" , "us-ft" },
{ "Degree" , "" },
{ NULL , NULL }
};
一些重要的参数定义:
#define PKW_GEOGCS "GEOGCS" //地理坐标系 定椭球体类型
#define PKW_DATUM "DATUM" //大地基准面
#define PKW_SPHEROID "SPHEROID" //椭球体定义
#define PKW_PRIMEM "PRIMEM" //本初子午线
#define PKW_UNIT "UNIT" //单位
#define PKW_AUTHORITY "AUTHORITY" //权威定义
#define PKW_PROJCS "PROJCS" //投影定义 若是平面坐标则会定义这个关键字
#define PKW_PROJECTION "PROJECTION" //投影类型
#define PKW_PARAMETER "PARAMETER" //投影参数
主要解析过程:
prj_file prg_f;
char epsg[8]={0};
prg_f.load_doc( prj_path.c_str() );
char* str = prg_f.generate_proj4_str( epsg );
char* prj_file::generate_proj4_str( char* epsg_str )
{
prj_text p_text( _doc_text );
//获得投影类型
char projetion_type[128] = { 0 };
if ( p_text.coord_type() )
{
sprintf( projetion_type , "+proj=longlat " );
}
else
{
p_text.proj_type( projetion_type );
char* proj_text = get_proj4_text( projetion_type );
if ( strlen( proj_text ) == 0 )
{
printf( "没有此投影:%s\n%s\n" , projetion_type , _doc_path );
//getchar();
return "";
}
sprintf( projetion_type ,"+proj=%s " , proj_text );
}
sprintf( _proj4_str , projetion_type );
//椭球体
char a_str[32]={ 0 };
char rf_str[32]={ 0 };
p_text.ellipse( a_str , rf_str );
char ellps[128] = { 0 };
sprintf( ellps , "+a=%s +rf=%s " , a_str , rf_str );
strcat( _proj4_str , ellps );
//投影参数
char pj_param[PROJ4_LEN] = { 0 };
p_text.proj_param( pj_param );
strcat( _proj4_str , pj_param );
//单位
char pj_uint[32] = { 0 };
char* p_uint = p_text.uint( );
if ( strlen( p_uint ) != 0 )
{
sprintf( pj_uint , "+uint=%s " , p_uint );
}
strcat( _proj4_str , pj_uint );
//七参数
//if ( _k > 0 )
{
_k = 1.0 ;
char param_7[128] = { 0 };
sprintf( param_7 , "+towgs84=%f,%f,%f,%f,%f,%f,%f"
, -_dx , -_dy , -_dz , _rx , _ry , _rz , _k );
strcat( _proj4_str , param_7 );
}
//ESPG
char* p_epsg = p_text.epsg();
strcpy( epsg_str , p_epsg );
delete[] p_epsg;
p_epsg = NULL ;
return _proj4_str;
}
源码下载
http://download.csdn.net/detail/wb175208/9734255