Давненько сижу с ошибкой. Я работаю с координатами, пытаюсь преобразовать координаты из десятичных градусов в DMS и обратно с флажком.
Это текущий код (JS Fiddle): https://jsfiddle.net/Mtihc/m2n8tejs/61/ HTML:
<label>Lat</label><input id="latitude" type="text" value="-8.3692° S"/>
<label>Long</label><input id="longtitude" type="text" value="115.1383° E"/>
<input id="dmstoggler" type="checkbox"/>
<br/>
<label id="dmstoggler_state">Decimal degrees</label>
JavaScript:
$("#dmstoggler").on('change', function (eventInfo) {
let longInput = document.getElementById("longtitude")
let latInput = document.getElementById("latitude")
if (eventInfo.target.checked) {
// convert to DMS
let long = parseFloat(longInput.value.replace(/° \w/, ""))
let lat = parseFloat(latInput.value.replace(/° \w/, ""))
let dms = convertDMS(lat, long)
longInput.value = dms.long;
latInput.value = dms.lat;
} else {
// convert back to long/lat
let longdms = longInput.value.replace(/[^\d\s]/g, "").split(' ').map(n => parseFloat(n))
let latdms = latInput.value.replace(/[^\d\s]/g, "").split(' ').map(n => parseFloat(n))
let latlong = convertLatLong(latdms, longdms)
longInput.value = latlong.long
latInput.value = latlong.lat
}
$("#dmstoggler_state").html(eventInfo.target.checked ? "DMS" : "Decimal degrees")
})
function toDegreesMinutesAndSeconds(coordinate) {
var absolute = Math.abs(coordinate);
var degrees = Math.floor(absolute);
var minutesNotTruncated = (absolute - degrees) * 60;
var minutes = Math.floor(minutesNotTruncated);
var seconds = Math.floor((minutesNotTruncated - minutes) * 60);
if (coordinate < 0) degrees *= -1;
return degrees + "° " + minutes + "' " + seconds;
}
function convertDMS(lat, lng) {
var latitude = toDegreesMinutesAndSeconds(lat);
var latitudeCardinal = lat > 0 ? "'' N" : "'' S";
var longitude = toDegreesMinutesAndSeconds(lng);
var longitudeCardinal = lng > 0 ? "'' E" : "'' W";
return {
lat: latitude + latitudeCardinal,
long: longitude + longitudeCardinal
}
}
function convertLatLong(lat, long) {
let dmslat = lat[0] + (lat[1]/60) + (lat[2]/3600)
let dmslong = long[0] + (long[1]/60) + (long[2]/3600)
dmslat = parseFloat(dmslat.toFixed(4))
dmslong = parseFloat(dmslong.toFixed(4))
if (lat[0] < 0) dmslat *= -1;
if (long[0] < 0) dmslong *= -1;
return {
lat: dmslat + "° " + (lat[0] > 0 ? "N" : "S"),
long: dmslong + "° " + (long[0] > 0 ? "E" : "W"),
}
}
Как видите, он начинается с: -8,3692 ° S
После преобразования из широты / долготы в DMS (отлично работает) обратное преобразование в широту / долготу является проблемой. При обратном преобразовании в широту / долготу возвращается значение.
При обратном преобразовании в широту / долготу возвращается: 8,3692 ° с.ш.
Мы подозреваем математическую проблему, но не могу найти конкретную проблему c. Как вы можете видеть, он идет от отрицательного юга до положительного севера , как это может быть?
Спасибо!