function similar to Rafael Palacios's deg2utm.m but using formulas from "Map Projections - A Working Manual" by J.P. Snyder (1987) for better precision in Southern hemisphere.
This second version allows forcing UTM zone and hemisphere in input, but can still be used like the previous version in which the function finds the appropriate zone.
Lat=[48.866667; 34.05; -36.85 ];
Lon=[2.333056; -118.25; 174.783333];
% data zones:
[x1,y1,utmzone1,utmhemi1] = wgs2utm(Lat,Lon)
% forced zone:
[x2,y2,utmzone2,utmhemi2] = wgs2utm(Lat,Lon,60,'S')
1) Where is the companion function utm2wgs?
2) The utmzone is numeric whereas the utmzone from for example deg2utm is a number plus a character?
Works great, and gives better results in southern hemisphere than others on File Exchange. I guess the only thing I would have done differently would be the order of inputs - since the output is X then Y, I would have made the inputs Longitude then Latitude, but obviously not a big deal. Thanks for contributing
Sorry, really simple question. I need this code to work but i`m not very good in matlab.
Could you please explain how to put the inputs?
Sorry for the question
Thank you very much. This function works perfectly for me. I'm working on geolocation of buses in London and the function has no problems and is helping me a lot in my research.
Hey again, had been working on this issue since I wrote the comment, it appears Matlab's built-in functions need more tweaking (I checked this with ArcGIS too), your function works accuratesly with sub-meter precision. Please ignore my previous comment.
Hi and thanks for your code,
I just did a quick comparison between your code and Matlab's built-in functions to calculate UTM values based on LatLon, here are the results:
mstruct = defaultm('utm');
mstruct = defaultm(mstruct);
[x,y] = mfwdtran(mstruct,-43.5,172.5)
Result: 621272.828768645 5182478.29916538
[x,y,zone1,utmhemi1] = wgs2utm(-43.5, 172.5)
Result: 621267.241003134 5182565.80639284
(there is almost 100 meter diff in y).
By the way, you have used utmzone as variable name in the output which conflicts with Matlab's built-in function name, it took me a while why I am getting weird errors after trying your function (output from your function stops utmzone function from working). Good luck
FYI. I just submitted a new version of the wgs2utm allowing to force UTM zone and hemisphere in input, as per requests.
You can still use it like the old one though, ie with no forcing and let the function choose the appropriate zone. The new function should be compatible with any code using the old version. Check function's help for more info on use.
Thanks for the tip - I will use that when needed.
Comment about forcing output UTM zone.
Two parameters change for each UTM zone: the reference longitude and the false northing. In the current code, these values are caculated from the input data at lines 63 and 68:
Lon0 = floor(Lon./6).*6+3; % reference longitude in degrees
FN = (Lat < 0).*10000000; % false northing
In order to force the output UTM zone, one can force these two parameters to their desired value. If you know your reference longitude, just replace Lon0 by this value. If you know the zone number ii, replace Lon0 by 6*ii-183
Set FN to 0 for northern hemisphere, or 10000000 for southern hemisphere.
Thanks Andrew, I understand your concern. I have been working on data from an area in between two zones and my code didn't handle this issue.
I completely modified my original code to be able to force the UTM zone but also:
- to allow converting to local Transverse Mercator projections (NZ projections are preset)
- to compute grid convergence (difference between true north and grid north, absolutely needed information when dealing with orientation data)
I suggest you move to local projections if possible. If your data span on several UTM zones, your deformations will be huge.
I can provide you with the new function if you mail me directly. I am not sure of putting it online here for the moment. Same comment for everyone else who is interested.
Very good, thank you. Any chance to force output into a single zone? I work with models that cannot handle multiple UTM zones, yet sometimes my datasets span multiple zones, so it would be nice to re-project everything to a specified zone (recognizing that this will reduce the accuracy for those data points outside of the correct zone). Very nice regardless. Many thanks!
Users, can you please write reviews to assess the transformation quality in your areas of interest ? thanks
completed descriptions and examples
Following requests, this second version allows forcing utm input