Hello.
I am build support for UTM projections into the WMS-part of OpenMap.
I am using UTMPoint for the calculation, but would like to be able to
convert a LatLonPoint to a UTMPoint for a specified UTM zone that may
not include the given LatLonPoint. This is normal practice in the WMS
context.
Does this seem to be a good idea? I have attached a patch to UTMPoint
that works for me.
Regards,
- Tore.
### Eclipse Workspace Patch 1.0
#P openmap
Index: src/openmap/com/bbn/openmap/proj/coords/UTMPoint.java
===================================================================
RCS file: /cvs/openmap/openmap/src/openmap/com/bbn/openmap/proj/
coords/UTMPoint.java,v
retrieving revision 1.10
diff -u -r1.10 UTMPoint.java
--- src/openmap/com/bbn/openmap/proj/coords/UTMPoint.java 24 Oct 2005
14:39:14 -0000 1.10
+++ src/openmap/com/bbn/openmap/proj/coords/UTMPoint.java 16 Mar 2007
14:26:23 -0000
_at_@ -197,8 +197,31 @@
public static UTMPoint LLtoUTM(LatLonPoint llpoint, Ellipsoid
ellip,
UTMPoint utmpoint) {
- double Lat = llpoint.getLatitude();
- double Long = llpoint.getLongitude();
+ // find the native zone for the given llpoint
+ int zoneNumber = zoneNumber(llpoint.getLatitude(),
llpoint.getLongitude());
+ boolean isnorthern = (llpoint.getLatitude() >= 0f);
+
+ return LLtoUTM(llpoint, ellip, utmpoint, zoneNumber,
isnorthern);
+ }
+
+ /**
+ * Converts a set of Longitude and Latitude co-ordinates to UTM
+ * given an ellipsoid and the UTM zone to use.
+ *
+ * _at_param ellip an ellipsoid definition.
+ * _at_param llpoint the coordinate to be converted
+ * _at_param utmpoint A UTMPoint instance to put the results in. If
+ * null, a new UTMPoint will be allocated.
+ * _at_param ZoneNumber the number of the zone
+ * _at_param isnorthern true if zone is in norhering hemispehere
+ * _at_return A UTM class instance containing the value of
+ * <code>null</code> if conversion failed. If you pass
+ * in a UTMPoint, it will be returned as well if
+ * successful.
+ */
+ public static UTMPoint LLtoUTM(LatLonPoint llpoint, Ellipsoid
ellip,
+ UTMPoint utmpoint, int
ZoneNumber, boolean isnorthern) {
+
double a = ellip.radius;
double eccSquared = ellip.eccsq;
double k0 = 0.9996;
_at_@ -210,31 +233,7 @@
double LatRad = llpoint.radlat_;
double LongRad = llpoint.radlon_;
double LongOriginRad;
- int ZoneNumber;
-
- ZoneNumber = (int) ((Long + 180) / 6) + 1;
- //Make sure the longitude 180.00 is in Zone 60
- if (Long == 180) {
- ZoneNumber = 60;
- }
-
- // Special zone for Norway
- if (Lat >= 56.0f && Lat < 64.0f && Long >= 3.0f && Long <
12.0f) {
- ZoneNumber = 32;
- }
-
- // Special zones for Svalbard
- if (Lat >= 72.0f && Lat < 84.0f) {
- if (Long >= 0.0f && Long < 9.0f)
- ZoneNumber = 31;
- else if (Long >= 9.0f && Long < 21.0f)
- ZoneNumber = 33;
- else if (Long >= 21.0f && Long < 33.0f)
- ZoneNumber = 35;
- else if (Long >= 33.0f && Long < 42.0f)
- ZoneNumber = 37;
- }
LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3; //+3 puts origin
// in middle of
// zone
_at_@ -272,7 +271,7 @@
* (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A
* A * A
/ 24.0d + (61 - 58 * T + T * T + 600 * C -
330 * eccPrimeSquared)
* A * A * A * A * A * A / 720.0d)));
- if (Lat < 0.0f) {
+ if (!isnorthern) {
UTMNorthing += 10000000.0f; //10000000 meter offset for
// southern hemisphere
}
_at_@ -284,11 +283,11 @@
utmpoint.northing = (float) Math.rint(UTMNorthing);
utmpoint.easting = (float) Math.rint(UTMEasting);
utmpoint.zone_number = ZoneNumber;
- utmpoint.zone_letter = utmpoint.getLetterDesignator(Lat);
+ utmpoint.zone_letter = isnorthern ? 'N' : 'S';
return utmpoint;
}
-
+
/**
* Returns 'N' if the latitude is equal to or above the equator,
* 'S' if it's below.
_at_@ -538,5 +537,44 @@
return new LatLonPoint((float) Lat, (float) Long);
}
}
+
+ /**
+ * Find zone number based on the given latitude and longitude in
*degrees*.
+ *
+ * _at_param Lat
+ * _at_param Long
+ * _at_return
+ */
+ public static int zoneNumber(double Lat, double Long) {
+ int ZoneNumber;
+
+ ZoneNumber = (int) ((Long + 180) / 6) + 1;
+
+ //Make sure the longitude 180.00 is in Zone 60
+ if (Long == 180) {
+ ZoneNumber = 60;
+ }
+
+ // Special zone for Norway
+ if (Lat >= 56.0f && Lat < 64.0f && Long >= 3.0f && Long <
12.0f) {
+ ZoneNumber = 32;
+ }
+
+ // Special zones for Svalbard
+ if (Lat >= 72.0f && Lat < 84.0f) {
+ if (Long >= 0.0f && Long < 9.0f)
+ ZoneNumber = 31;
+ else if (Long >= 9.0f && Long < 21.0f)
+ ZoneNumber = 33;
+ else if (Long >= 21.0f && Long < 33.0f)
+ ZoneNumber = 35;
+ else if (Long >= 33.0f && Long < 42.0f)
+ ZoneNumber = 37;
+ }
+
+ return ZoneNumber;
+ }
+
+
}
--
[To unsubscribe to this list send an email to "majdart_at_bbn.com"
with the following text in the BODY of the message "unsubscribe openmap-users"]
Received on Fri Mar 16 2007 - 10:58:44 EDT