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
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
回答: 要使用ArcGIS读取.prj文件,可以使用ArcGIS Desktop软件中的"Define Projection"工具。该工具可以将.prj文件中的坐标系信息应用到地理数据上。首先,打开ArcMap,然后将要读取的地理数据添加到地图中。接下来,右键点击图层,在弹出的菜单中选择"Properties"。在图层属性对话框中,选择"Source"选项卡,然后点击"Set Coordinate System"按钮。在弹出的对话框中,选择"Import"按钮,然后浏览到.prj文件所在的位置,选择该文件并点击"Add"按钮。最后,点击"OK"按钮应用坐标系信息到地理数据上。这样,ArcGIS就可以正确地读取.prj文件中定义的坐标系信息了。\[3\] #### 引用[.reference_title] - *1* *3* [java读取shapefile且用arcgis for js展示](https://blog.csdn.net/leftfist/article/details/106438704)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [shapefile(.shp,.dbf,.prj)导入导出](https://blog.csdn.net/qq_36305530/article/details/122457697)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wb175208

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

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

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

打赏作者

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

抵扣说明:

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

余额充值