ArcGIS的.prj文件生成proj4格式的字符串

  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
**ArcGISPRJ 文件简介** PRJ 文件ArcGIS 中扮演着至关重要的角色,它是一种文本文件,用于存储地理坐标系统(Coordinate Reference System, CRS)的信息。在地图制作、数据处理以及空间分析等 GIS 活动中,PRJ 文件帮助确保数据能够在正确的地理位置上显示,并提供精确的空间参考信息。 ### PRJ 文件内容 PRJ 文件通常包含以下关键信息: 1. **投影名称**: 描述使用的投影类型和特定设置。 2. **单位**: 指定坐标系中的长度单位(如米、度分秒等)。 3. **椭球体定义**: 描述地球形状模型的参数。 4. **轴定向**: 定义坐标系统的坐标轴方向(东经、西经、北纬、南纬等)。 5. **地理坐标区**: 对于某些国家特有的坐标系统,PRJ 文件还可能包含地理坐标区的详细信息。 ### PRJ 文件用途 PRJ 文件主要用于以下方面: - **坐标转换**: 当需要将数据从一个坐标系统转换到另一个系统时,PRJ 文件指导转换过程,确保数据位置的准确性和一致性。 - **数据兼容性**: 在不同软件之间共享数据时,PRJ 文件确保了坐标信息的一致性,促进了跨平台的数据交换。 - **数据分析**: 在进行空间统计、网络分析和其他空间操作前,理解数据所在的坐标系统至关重要,这直接影响到结果的精度和可靠性。 ### 如何创建和使用 PRJ 文件 - **创建**: 使用 ArcGIS 的制图工具或脚本语言如 Python 来自动生成 PRJ 文件,或者通过手动编辑文本文件完成。 - **导入/导出**: 在 ArcGIS 工具中直接导入或导出含有坐标系统的矢量数据时,会自动处理 PRJ 文件生成和应用。 - **查看与验证**: 利用 ArcGIS 的属性表功能,可以检查和验证已附加到数据集的 PRJ 文件信息,确保其与实际需求相符。 ### 相关问题: 1. **如何更改 ArcGIS 中的数据坐标系统?** 2. **PRJ 文件对于移动设备上的 ArcGIS 应用有何影响?** 3. **为什么在处理高精度测量数据时特别关注 PRJ 文件的重要性?**
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值