[GIS] Convert Lat/Long to UTM specifying which zone to use (Java)

javalatitude longitudeutm

I have a set of coordinates in decimal degrees spread across two UTM zones in my Java application that I want to export to use in Petrel, so they need to be in the same UTM zone.

Is there a java library out there where I can specify what zone I want to use for the outputdata? tried quite a few libraries now and they only have utils for converting to the correct UTM zone.

Best Answer

GDAL is your best bet here. My code sample is in C++, however the Java bindings have the same essential API, so the concept will carry over.

This is code chopped from another project. The key is to create two SpatialReference objects, then set their datums. For the output, since it is in UTM, you set the UTM zone there. Normally, you pick the best utm grid zone based on the longitude, but since you need it in another, you can just manually set it to what you want.

/**
 * Compute the best utm zone. (Just don't go to Svalbard)
*/
int compute_utm_zone( CoordinateLatLon const& coord, bool& isNorth ){

    // check the isNorth flag
    if( coord.lat >= 0 ) isNorth = true;
    else                 isNorth = false;

    // compute the appropriate UTM Zone
    int zone = std::floor(( coord.lon + 180 )/6.0) + 1;

    return zone;
}

CoordinateUTM convert_coordinate( CoordinateLatLon const& coord ){

    // create the spatial reference objects
    OGRSpatialReference sourceSRS, targetSRS;

    // set the required datim
    sourceSRS.SetWellKnownGeogCS( coord.datum.c_str() ); // "WGS84"
    targetSRS.SetWellKnownGeogCS( coord.datum.c_str() ); // "WGS84"

    // specify the target as UTM and compute proper zone and hemisphere
    bool isNorth;
    int zone = compute_utm_zone( coord, isNorth );
    targetSRS.SetUTM( zone, isNorth );

    // create the coordinate transform
    OGRCoordinateTransformation *poTransform = OGRCreateCoordinateTransformation( &sourceSRS, &targetSRS );
    if( poTransform == NULL ){
        throw string("ERROR: call failed");
    }


    double x = coord.lon;
    double y = coord.lat;
    double z = coord.elevation;

    if( !poTransform->Transform( 1, &x, &y, &z ) )
        throw string("ERROR: transform failed");

    OCTDestroyCoordinateTransformation( poTransform );

    return CoordinateUTM( zone, isNorth, x, y, z, coord.datum );

}

Link to OSR Bindings http://gdal.org/java/org/gdal/osr/package-summary.html