Отрицательный становится положительным при привязке для преобразования DMS в Lat / lon - PullRequest
0 голосов
/ 30 мая 2020

Давненько сижу с ошибкой. Я работаю с координатами, пытаюсь преобразовать координаты из десятичных градусов в 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. Как вы можете видеть, он идет от отрицательного юга до положительного севера , как это может быть?

Спасибо!

...