Расчет расстояния между двумя PointField (s) - Почему мой результат неверен? - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь рассчитать расстояние между двумя точками в милях, но полученный результат неверен.

Причина, по которой я считаю ее неправильной, заключается в том, что я размещаю местоположения (широту и долготу) на этом веб-сайте и получаю расстояние в милях как 0.055.Вот детали из моего кода

PointField A : (-122.1772784, 47.7001663)
PointField B : (-122.1761632, 47.700408)
Distance : 0.001141091551967795

Однако, согласно веб-сайту, расстояние должно быть

Distance: 0.055 miles

Вот как я вычисляю расстояние.

Это моя модель

class modelEmp(models.Model):
       user                = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
       location            = models.PointField(srid=4326,max_length=40, blank=True, null=True)  
       objects             = GeoManager() 

и вот как я вычисляю расстояние

 result = modelEmpInstance.location.distance(PointFieldBLocation)
   where result = 0.001141091551967795

Любые предложения о том, что я могу делать не так и почему мой результат отличается от веб-сайта

1 Ответ

0 голосов
/ 28 сентября 2018

Ваш расчет не ошибочен, но результат в единицах EPSG:4326, которые равны degrees.Чтобы рассчитать расстояние в требуемой единице, нам нужно сделать следующее:

  1. Преобразовать точки в EPSG с meter единицами.

    • Если вас не очень заботит точность расчетов, вы можете использовать EPSG:3857 (но результат будет 0.08104046068988752mi).
    • Если вы делаете позаботьтесь о точности ваших расчетов, однако вам нужно найти EPSG с единицами измерения, которые соответствуют вашему местоположению.Поскольку ваши точки расположены в районе Сиэтла, соответствующий EPSG будет 32148.
  2. Создать объект Distance с вычислением расстояния вметров

  3. Наконец, преобразуйте его в miles:

    from django.contrib.gis.measure import Distance
    
    result = Distance(
        m = modelEmpInstance.location.transform(
            32148, clone=True
        ).distance(PointFieldBLocation.transform(32148, clone=True)
    )
    print(
        'Raw calculation: {}\nRounded calculation: {}'
        .format(result.mi, round(result.mi, 2)
    )
    

    Это напечатает:

    Raw calculation: 0.0546237743898667 
    Rounded calculation: 0.055
    
...