Широта и долгота меняются каждый раз, когда я конвертирую из градусов, минут, секунд в десятичные градусы в c # - PullRequest
3 голосов
/ 07 декабря 2010

Если я введу местоположение:

Широта = 28 градусов, 45 минут, 12 секунд Долгота = 81 градус, 39 минут, 32,4 секунды

Преобразуется в формат десятичных градусов для хранения в базе данных со следующим кодом:

Coordinates coordinates = new Coordinates();
coordinates.LatitudeDirection = this.radLatNorth.Checked ? Coordinates.Direction.North : Coordinates.Direction.South;
coordinates.LatitudeDegree = this.ConvertDouble(this.txtLatDegree.Text);
coordinates.LatitudeMinute = this.ConvertDouble(this.txtLatMinute.Text);
coordinates.LatitudeSecond = this.ConvertDouble(this.txtLatSecond.Text);
coordinates.LongitudeDirection = radLongEast.Checked ? Coordinates.Direction.East :     Coordinates.Direction.West; 
coordinates.LongitudeDegree = this.ConvertDouble(this.txtLongDegree.Text);
coordinates.LongitudeMinute = this.ConvertDouble(this.txtLongMinute.Text);
coordinates.LongitudeSecond = this.ConvertDouble(this.txtLongSecond.Text);
//gets the calulated fields of Lat and Long
coordinates.ConvertDegreesMinutesSeconds();

В приведенном выше коде ConvertDouble определяется как:

  private double ConvertDouble(string value)
  {
        double newValue = 0;
        double.TryParse(value, out newValue);

        return newValue;
  }

и ConvertDegreesMinutesSeconds определяются как:

public void ConvertDegreesMinutesSeconds()
{
    this.Latitude = this.LatitudeDegree + (this.LatitudeMinute / 60) + (this.LatitudeSecond / 3600);
        this.Longitude = this.LongitudeDegree + (this.LongitudeMinute / 60) + (this.LongitudeSecond / 3600);

        //adds the negative sign
        if (LatitudeDirection == Direction.South)
        {
            this.Latitude = 0 - this.Latitude;

        }
        else if (LongitudeDirection == Direction.West)
        {
            this.Longitude = 0 - this.Longitude;
        }
    }

Если я не внесу никаких изменений в широту или долготу и нажму «Применить изменения», в результате чего, как правило, снова выполняется вышеупомянутая калькуляция, он генерирует другую широту и долготу в базе данных. Это происходит каждый раз, когда я захожу, чтобы отредактировать его и не вносить изменения (я просто нажимаю «Применить изменения», и вычисление снова выполняется с другим результатом).

В приведенном выше сценарии новая широта и долгота:

Широта = 28 градусов, 45 минут, 12 секунд Долгота = 81 градус, 40 минут, 32,4 секунды

Если я сделаю это снова, оно станет:

широта = 28 градусов, 45 минут, 12 секунд Долгота = 81 градус, 41 минута, 32,4 секунды

Другая часть этого заключается в том, что когда я перехожу в режим редактирования, он принимает формат десятичных градусов широты и долготы и преобразует его в формат градусов-минут и секунд и помещает их в соответствующие текстовые поля. Код для этого:

public void SetFields()
{
    Coordinates coordinateLocation = new Coordinates();
    coordinateLocation.Latitude = this.Latitude;
    coordinateLocation.Longitude = this.Longitude;
    coordinateLocation.ConvertDecimal();

    this.radLatNorth.Checked =
        coordinateLocation.LatitudeDirection == Coordinates.Direction.North;
    this.radLatSouth.Checked = !this.radLatNorth.Checked;
    this.txtLatDegree.Text = coordinateLocation.LatitudeDegree.ToString().Replace("-", string.Empty);
    this.txtLatMinute.Text = Math.Round(coordinateLocation.LatitudeMinute, 0).ToString().Replace("-", string.Empty);
    this.txtLatSecond.Text = Math.Round(coordinateLocation.LatitudeSecond, 2).ToString().Replace("-", string.Empty);

    this.radLongEast.Checked =
        coordinateLocation.LongitudeDirection == Coordinates.Direction.East;
    this.radLongWest.Checked = !this.radLongEast.Checked;
    this.txtLongDegree.Text = coordinateLocation.LongitudeDegree.ToString().Replace("-", string.Empty); ;
    this.txtLongMinute.Text = Math.Round(coordinateLocation.LongitudeMinute, 0).ToString().Replace("-", string.Empty);
    this.txtLongSecond.Text = Math.Round(coordinateLocation.LongitudeSecond, 2).ToString().Replace("-", string.Empty);
}

Из приведенных выше примеров вы можете видеть, что Минута продолжала увеличиваться на 1, что указывало бы на то, почему она генерирует в базе данных другую широту и долготу в десятичных градусах, поэтому я полагаю, что проблема больше в вышеуказанной области, но я не уверен, где или почему он это делает?

  public void ConvertDecimal()
    {
        this.LatitudeDirection = this.Latitude > 0 ? Direction.North : Direction.South;
        this.LatitudeDegree = (int)Math.Truncate(this.Latitude);
        if (LatitudeDirection == Direction.South)
        {
            this.LatitudeDegree = 0 - this.LatitudeDegree;
        }            
        this.LatitudeMinute = (this.Latitude - Math.Truncate(this.Latitude)) * 60;
        this.LatitudeSecond = (this.LatitudeMinute - Math.Truncate(this.LatitudeMinute)) * 60;

        this.LongitudeDirection = this.Longitude > 0 ? Direction.East : Direction.West;
        this.LongitudeDegree = (int)Math.Truncate(this.Longitude);            
        if (LongitudeDirection == Direction.West)
        {
            this.LongitudeDegree = 0 - this.LongitudeDegree;
        }            
        this.LongitudeMinute = (this.Longitude - Math.Truncate(this.Longitude)) * 60;
        this.LongitudeSecond = (this.LongitudeMinute - Math.Truncate(this.LongitudeMinute)) * 60;
    }

Ответы [ 2 ]

3 голосов
/ 07 декабря 2010

Вам нужно обрезать свои минуты (возможно, и секунды, я не уверен), а не округлять. Обратите внимание, что используемый ниже Math.Round предназначен только для получения компонентов Minutes / Seconds нужного числа значащих цифр.

double Minutes(double decimalDegrees)
{
  //Get hours
  double h = Math.Truncate(lat);
  //Get minutes + seconds
  double x = (Math.Abs(h - Math.Round(lat, 12)) * 60.0);
  //Everything after the decimal is seconds
  double min = Math.Truncate(x);
  return min;
}

Я основал этот код преобразования для этого проекта codeplex: http://geoframework.codeplex.com/ Посмотрите в классе Локатор.

1 голос
/ 07 декабря 2010

Вы округляете свои минуты и секунды при отображении их вместо усечения или использования Math.Floor. Поскольку у вас есть более 30 секунд, ваши минуты имеют дробное значение более 0,5, поэтому они округляются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...