1. 程式人生 > >utm座標和經緯度相互轉換

utm座標和經緯度相互轉換

專案中用到經緯度相互轉換,自己寫感覺太麻煩,查詢後發現利用geos和proj4可以完成座標轉換,現在記錄一下方便以後自己查詢。

    //經緯度轉utm座標
    int convert_lonlat_utm(const new3s_PointXYZ &lon_lat_coord, new3s_PointXYZ &utm_coord)
    {
        OGRSpatialReference *RefSource = new OGRSpatialReference;
        RefSource->SetWellKnownGeogCS("WGS84"
); OGRSpatialReference *RefTarget = new OGRSpatialReference; RefTarget = RefSource->CloneGeogCS(); int utmzone = lon_lat_coord.get_x() / 6 + 31; RefTarget->SetProjCS("UTM(WGS84) in northern hemisphere."); RefTarget->SetUTM(utmzone, TRUE); OGRCoordinateTransformation *poTransform = OGRCreateCoordinateTransformation(RefSource, RefTarget); double
tempX = lon_lat_coord.get_x(); double tempY = lon_lat_coord.get_y(); double tempZ = lon_lat_coord.get_z(); poTransform->Transform(1, &tempX, &tempY, &tempZ); utm_coord.set_x(tempX); utm_coord.set_y(tempY); utm_coord.set_z(tempZ); return
utmzone; }

這裡返回的是條帶數,因為在下面UTM座標轉經緯度的時需要條帶數。

//utm轉經緯度
void convert_utm_lonlat(const new3s_PointXYZ &utm_coord, const int &utmzone, new3s_PointXYZ &lon_lat_coord)
{
    //建立投影座標系到經緯度座標系的轉換
    OGRSpatialReference *RefSource = new OGRSpatialReference;
    RefSource->SetWellKnownGeogCS("WGS84");
    RefSource->SetProjCS("UTM(WGS84) in northern hemisphere.");
    RefSource->SetUTM(utmzone, TRUE);
    OGRSpatialReference *RefTarget = new OGRSpatialReference;
    RefTarget = RefSource->CloneGeogCS();
    OGRCoordinateTransformation *poTranform = OGRCreateCoordinateTransformation(RefSource, RefTarget);

    OGRPoint *poPoint = new OGRPoint();
    double tempx = utm_coord.get_x();
    double tempy = utm_coord.get_y();
    double tempz = utm_coord.get_z(); 

    poTranform->Transform(1, &tempx, &tempy, NULL);
    lon_lat_coord = new3s_PointXYZ(tempx, tempy, tempz);

}