Skip to content

Instantly share code, notes, and snippets.

@muloka
Last active August 29, 2015 14:08
Show Gist options
  • Save muloka/943ab37cf222381ef7d6 to your computer and use it in GitHub Desktop.
Save muloka/943ab37cf222381ef7d6 to your computer and use it in GitHub Desktop.
// NAD27 to NAD83/WSG84 converter
// http://transition.fcc.gov/mb/audio/bickel/DDDMMSS-decimal.html
// http://home.hiwaay.net/~taylorc/bookshelf/math-science/geodesy/datum/transform/molodensky/
// http://www.gov.bm/portal/server.pt?open=512&objID=330&&PageID=1460&mode=2&in_hi_userid=2&cached=true
var data = [
{ item: '1', lat: [32,19,45.5], lon: [-64,50,7.8] },
{ item: '2', lat: [32,19,1.6], lon: [-64,50,33.8] },
{ item: '3', lat: [32,18,49.2], lon: [-64,50,31.9] },
{ item: '4', lat: [32,18,10.3], lon: [-64,52,1.5] },
{ item: '5', lat: [32,18,9.9], lon: [-64,52,5.6] },
{ item: '6', lat: [32,17,52.6], lon: [-64,51,56.1] },
{ item: '7', lat: [32,17,52.2], lon: [-64,51,55.5] },
{ item: '8', lat: [32,17,7.8], lon: [-64,52,21.3] },
{ item: '9', lat: [32,15,7.9], lon: [-64,51,6.6] },
{ item: '10', lat: [32,14,55.7], lon: [-64,51,41.1] },
{ item: '11', lat: [32,15,15.7], lon: [-64,50,18.4] },
{ item: '12', lat: [32,15,10.1], lon: [-64,50,5.1] },
{ item: '13', lat: [32,15,13.4], lon: [-64,49,37.0] },
{ item: '14', lat: [32,15,22.8], lon: [-64,50,0.0] },
{ item: '15', lat: [32,16,4.0], lon: [-64,47,40.5] },
{ item: '16', lat: [32,18,7.5], lon: [-64,47,39.9] },
{ item: '17', lat: [32,18,2.2], lon: [-64,47,38.1] },
{ item: '18', lat: [32,17,41.4], lon: [-64,47,4.4] },
{ item: '19', lat: [32,17,42.3], lon: [-64,47,10.7] },
{ item: '20', lat: [32,17,35.5], lon: [-64,46,45.2] },
{ item: '21', lat: [32,17,42.4], lon: [-64,46,38.2] },
{ item: '22', lat: [32,16,32.3], lon: [-64,46,35.7] },
{ item: '23', lat: [32,17,18.5], lon: [-64,45,46.5] },
{ item: '24A', lat: [32,17,54.2], lon: [-64,45,46.2] },
{ item: '24B', lat: [32,17,54.2], lon: [-64,45,46.2] },
{ item: '25', lat: [32,17,54.4], lon: [-64,45,47.8] },
{ item: '26A', lat: [32,17,57.6], lon: [-64,45,52.6] },
{ item: '26B', lat: [32,17,57.6], lon: [-64,45,52.6] },
{ item: '27A', lat: [32,17,58.2], lon: [-64,45,57.2] },
{ item: '27B', lat: [32,17,58.2], lon: [-64,45,57.2] },
{ item: '28', lat: [32,18,4.1], lon: [-64,46,3.7] },
{ item: '29', lat: [32,18,0.2], lon: [-64,45,55.5] },
{ item: '30', lat: [32,18,13.2], lon: [-64,46,5.8] },
{ item: '31', lat: [32,18,34.8], lon: [-64,45,31.1] },
{ item: '32', lat: [32,18,49.9], lon: [-64,44,57.1] },
{ item: '33', lat: [32,18,49.6], lon: [-64,44,58.5] },
{ item: '34', lat: [32,18,52.8], lon: [-64,44,55.0] },
{ item: '35A', lat: [32,18,52.8], lon: [-64,44,55.0] },
{ item: '35B', lat: [32,18,52.8], lon: [-64,44,55.0] },
{ item: '36', lat: [32,19,2.6], lon: [-64,43,59.5] },
{ item: '37', lat: [32,19,0.3], lon: [-64,43,57.9] },
{ item: '38', lat: [32,19,0.9], lon: [-64,43,55.5] },
{ item: '39', lat: [32,20,8.7], lon: [-64,44,12.0] },
{ item: '40', lat: [32,20,21.6], lon: [-64,42,17.4] },
{ item: '41', lat: [32,20,51.6], lon: [-64,43,11.6] },
{ item: '42', lat: [32,20,57.0], lon: [-64,43,15.0] },
{ item: '43', lat: [32,22,0.6], lon: [-64,40,38.5] },
{ item: '44', lat: [32,22,2.7], lon: [-64,40,38.0] },
{ item: '45', lat: [32,22,1.0], lon: [-64,40,12.6] },
{ item: '46', lat: [32,21,49.2], lon: [-64,39,22.2] },
{ item: '47', lat: [32,21,53.6], lon: [-64,39,32.9] },
{ item: '48A', lat: [32,22,49.4], lon: [-64,40,56.8] },
{ item: '48B', lat: [32,22,49.4], lon: [-64,40,56.8] },
{ item: '49', lat: [32,22,48.6], lon: [-64,40,57.9] },
{ item: '50', lat: [32,23,2.2], lon: [-64,40,7.0] },
{ item: '51', lat: [32,22,59.4], lon: [-64,40,8.6] },
{ item: '52', lat: [32,22,3.1], lon: [-64,38,58.4] },
{ item: '53', lat: [32,21,57.8], lon: [-64,40,6.0] },
{ item: '54', lat: [32,20,52.6], lon: [-64,39,12.5] },
{ item: '55', lat: [32,20,55.5], lon: [-64,39,22.1] },
{ item: '56', lat: [32,21,21.8], lon: [-64,39,47.9] },
{ item: '57', lat: [32,21,20.5], lon: [-64,39,45.5] }
]
absoluteNad27 = function (nad27) {
if (nad27.degrees < 0) { sign = -1 } else { sign = 1 }
return absolute = {
degrees: Math.abs(Math.round(nad27[0] * 1000000.)),
minutes: Math.abs(Math.round(Math.abs(Math.round(nad27[1] * 1000000.)/1000000) * 1000000.)), //integer
seconds: Math.abs(Math.round(Math.abs(Math.round(nad27[2] * 1000000.)/1000000) * 1000000.)), // Note: kept as big integer for now, even if submitted as decimal
sign: sign,
}
}
convertNad27toNad83 = function (absolute_nad27) {
return Math.round(absolute_nad27.degrees + (absolute_nad27.minutes/60.) + (absolute_nad27.seconds/3600.) ) * absolute_nad27.sign/1000000
}
convertToAbsolute = function (latitude, longitude) {
return absolute = { latitude: absoluteNad27(latitude), longitude: absoluteNad27(longitude) }
}
convertToCoordinates = function (absolute_nad27) {
return coordinates = {
latitude: convertNad27toNad83(absolute_nad27.latitude),
longitude: convertNad27toNad83(absolute_nad27.longitude),
}
}
data.forEach(function(element, index) {
transform = convertToCoordinates(convertToAbsolute(element.lat, element.lon))
console.log(element.item + ', ' + transform.latitude + ', ' + transform.longitude)
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment