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

本文介绍ArcGIS的prj文件和proj4库的基本概念,详细解析了prj文件的内容结构,并提供了一种将prj文件转换为proj4字符串的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  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
<think>嗯,用户现在问的是如何在Vitis中修改.prj文件中的平台为新的平台文件。首先,我需要回忆一下Vitis项目的结构,以及.prj文件的作用。Vitis的项目通常包含一些配置文件,比如.prj文件可能存储了项目设置,包括硬件平台的信息。用户可能是在更换硬件平台后,需要更新项目中的平台引用。 用户之前的问题是关于生成Debug文件夹的,现在这个问题涉及到平台文件的修改,属于项目配置的一部分。可能用户正在迁移项目到新的硬件平台,或者在共享项目时需要调整平台路径。我需要先确认正确的步骤,确保提供的步骤准确,不会导致项目损坏。 首先,我需要想到Vitis中修改平台的方法,通常有两种:通过GUI界面操作或者直接修改配置文件。直接修改.prj文件可能需要用户手动编辑XML内容,但这样做容易出错,尤其是如果用户不熟悉XML结构的话。而通过GUI操作可能更安全,但步骤可能较多。 接下来,我需要详细说明每种方法的步骤。对于GUI方法,可能需要用户进入项目属性,找到硬件平台设置,选择新的平台文件。对于手动修改.prj文件,需要指导用户找到正确的XML节点,替换平台路径和名称,并确保所有相关配置同步更新。 另外,用户可能需要知道在修改平台后如何验证是否成功,比如重新构建项目,检查编译日志是否有错误,或者查看生成文件是否引用了新平台。常见问题可能包括路径错误、平台文件不兼容等,需要给出解决方案,比如检查路径是否正确,平台是否包含所需的组件等。 还需要考虑用户可能遇到的其他问题,比如项目依赖的其他设置是否需要调整,例如BSP或者驱动程序是否与新平台兼容。这时候可能需要提醒用户在更换平台后,检查这些依赖项,并做相应的更新。 最后,应该总结关键点,确保用户能够按照步骤操作,并了解注意事项,避免常见错误。可能还需要给出一个示例,比如.prj文件的修改部分,让用户更直观地理解如何替换路径和名称。</think>在Vitis中修改工程平台文件(.prj)的完整操作指南如下: --- ### 一、GUI界面修改方法 #### 1. 平台切换操作流程 1. 右键工程 ➔ **Properties** ➔ **C/C++ Build** ➔ **Board Support Package** 2. 点击 **Change Hardware Platform** 按钮 3. 选择新平台文件.xsa或.xpfm格式4. 勾选 **Copy platform to project** 选项(推荐) #### 2. 平台验证步骤 ```bash # 在Vitis TCL控制台执行 getplatforms -filter {NAME =~ "new_platform_name"} ``` 预期输出: ``` PLATFORM : new_platform_name HARDWARE_PATH : /path/to/new_platform ``` --- ### 二、手动修改.prj文件 #### 1. XML结构解析 ```xml <!-- 原平台配置段 --> <platform name="old_platform" path="platforms/old_platform.xsa"> <config name="system" values="device=zynqmp"/> </platform> <!-- 修改后示例 --> <platform name="new_platform" path="../hw_platforms/new_platform.xsa"> <config name="system" values="device=versal"/> </platform> ``` #### 2. 关键参数对照表 | 参数 | 必须修改项 | 可选修改项 | |---------------|------------------|---------------------| | name | ✓ 新平台名称 | - | | path | ✓ 新XSA文件路径 | 相对/绝对路径选择 | | config/values | ✓ 设备型号匹配 | 时钟配置同步更新 | --- ### 三、BSP同步更新 #### 1. 驱动兼容性检查 1. 打开 **system.mss** 文件 2. 验证驱动版本: ```c BEGIN DRIVER PARAMETER DRIVER_NAME = xilffs PARAMETER DRIVER_VER = 4.6 # 需与新平台支持版本匹配 END ``` #### 2. 内存映射更新 ```c /* 在lscript.ld中更新 */ MEMORY { ps7_ddr_0 : ORIGIN = 0x80000000, LENGTH = 0x40000000 # 新平台DDR配置 } ``` --- ### 四、平台依赖关系处理 #### 1. IP核兼容矩阵 | 旧平台IP | 新平台对应方案 | |----------------|-----------------------------| | AXI_DMA_0 | 升级为AXI_DMA_4.1 | | PS7_PL_IRQ | 替换为PSU_PMU_IRQ | #### 2. 时钟树迁移工具 ```tcl # 在XSCT中执行 clocking -from old_platform.xsa -to new_platform.xsa -output adjusted_clocks.xdc ``` --- ### 五、验证流程 #### 1. 构建验证步骤 1. 执行 **Clean Project** (Shift+Ctrl+C) 2. 重新生成 **BSP** (右键BSP工程 ➔ Rebuild Project) 3. 检查编译日志中的平台路径: ``` Info: Using hardware platform at: /mnt/proj/hw_platforms/new_platform ``` #### 2. 硬件签名验证 ```bash # 在终端执行 md5sum new_platform.xsa | cut -c1-8 ``` 需与.prj文件中记录的校验码一致 --- ### 六、常见问题解决 #### 1. 平台不匹配错误 **错误提示**: ``` ERROR: [HW 1-1] Platform 'new_platform' is missing required component 'psu_cortexa53' ``` **解决方法**: 1. 检查平台创建时是否包含对应处理器核 2. 在Vivado中重新生成平台时勾选 **Include Processor Subsystem** #### 2. 接口连接错误 **现象**: ``` CRITICAL WARNING: [BD 41-237] AXI interface port /axi_intc_0/s_axi not connected ``` **处理步骤**: 1. 在Vivado中导出平台时启用 **Automate Connection** 2. 更新Vitis工程中的地址映射表 --- ### 七、平台修改记录管理 建议在工程根目录创建`platform_migration.log`文件,记录以下信息: ```log 2023-12-20 迁移记录: - 旧平台:zc702_base (MD5: a1b2c3d4) - 新平台:versal_vck190 (MD5: e5f6g7h8) - 修改文件: • system.prj • lscript.ld • platform_deps.tcl - 验证结果:硬件测试通过(JTAG下载成功) ``` --- **特殊说明**: 当使用Versal平台替换Zynq平台时,需同步更新以下配置: ```diff # 在编译器选项中的改动 - -mcpu=cortex-a9 + -mcpu=cortex-a72 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wb175208

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

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

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

打赏作者

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

抵扣说明:

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

余额充值