Как вычислить точное расстояние между двумя местоположениями программно в андроиде, таком как карта google? [Дубликат]

1) Так называемая проблема «Mutable Default Argument» - это, в общем, специальный пример, демонстрирующий, что: «Все функции с этой проблемой также страдают от аналогичной проблемы побочного эффекта от фактического параметра». Это противоречит правилам

Пример:

def foo(a=[]):                 # the same problematic function
    a.append(5)
    return a

>>> somevar = [1, 2]           # an example without a default parameter
>>> foo(somevar)
[1, 2, 5]
>>> somevar
[1, 2, 5]                      # usually expected [1, 2]

Решение: копия Совершенно безопасным решением является copy или deepcopy входной сигнал сначала, а затем делать все с копией.

def foo(a=[]):
    a = a[:]     # a copy
    a.append(5)
    return a     # or everything safe by one line: "return a + [5]"

Многие встроенные изменяемые типы имеют метод копирования, такой как some_dict.copy() или some_set.copy(), или могут быть скопированы легко, как somelist[:] или list(some_list) , Каждый объект также может быть скопирован с помощью copy.copy(any_object) или более тщательным с помощью copy.deepcopy() (последний полезен, если изменяемый объект состоит из изменяемых объектов). Некоторые объекты основаны на побочных эффектах, таких как «файл», и не могут быть осмысленно воспроизведены копией. копирование

Пример проблемы для аналогичного вопроса SO

class Test(object):            # the original problematic class
  def __init__(self, var1=[]):
    self._var1 = var1

somevar = [1, 2]               # an example without a default parameter
t1 = Test(somevar)
t2 = Test(somevar)
t1._var1.append([1])
print somevar                  # [1, 2, [1]] but usually expected [1, 2]
print t2._var1                 # [1, 2, [1]] but usually expected [1, 2]

Он не должен быть ни сохранен ни в одном ] public экземпляра, возвращаемого этой функцией. (Предполагая, что атрибуты private экземпляра не должны быть изменены извне этого класса или подкласса по соглашению, т. Е. _var1 является частным атрибутом)

Заключение: Параметры входных параметров shouldn 'изменяются на месте (мутированные), и они не должны быть привязаны к объекту, возвращаемому функцией. (Если мы предпочитаем программирование без побочных эффектов, которые настоятельно рекомендуются, см. Wiki о «побочном эффекте» (первые два абзаца имеют смысл в этом контексте.).)

2) Только если побочный эффект на фактический параметр требуется, но нежелателен по параметру по умолчанию, тогда полезным решением является def ...(var1=None): if var1 is None: var1 = [] Подробнее ..

3) В некоторых случаях используется изменчивое поведение параметров по умолчанию .

53
задан stema 8 November 2011 в 14:21
поделиться

6 ответов

http://developer.android.com/reference/android/location/Location.html

Посмотрите на distanceTo или distanceBetween. Вы можете создать объект Location из широты и долготы:

Location locationA = new Location("point A");

locationA.setLatitude(latA);
locationA.setLongitude(lngA);

Location locationB = new Location("point B");

locationB.setLatitude(latB);
locationB.setLongitude(lngB);

float distance = locationA.distanceTo(locationB);

или

private double meterDistanceBetweenPoints(float lat_a, float lng_a, float lat_b, float lng_b) {
    float pk = (float) (180.f/Math.PI);

    float a1 = lat_a / pk;
    float a2 = lng_a / pk;
    float b1 = lat_b / pk;
    float b2 = lng_b / pk;

    double t1 = Math.cos(a1) * Math.cos(a2) * Math.cos(b1) * Math.cos(b2);
    double t2 = Math.cos(a1) * Math.sin(a2) * Math.cos(b1) * Math.sin(b2);
    double t3 = Math.sin(a1) * Math.sin(b1);
    double tt = Math.acos(t1 + t2 + t3);

    return 6366000 * tt;
}
145
ответ дан Patrick Boos 21 August 2018 в 15:19
поделиться
  • 1
    Это дает расстояние между двумя местами по дороге? – Harsha M V 29 January 2013 в 19:27
  • 2
    нет, он возвращает смещение (кратчайшее расстояние между двумя точками) – Zeeshan Chaudhry 20 February 2013 в 13:04
  • 3
    float pk = (float) (180/3.14169); - небольшая орфографическая ошибка, это не Pi ... это должно быть 3.141 5 9 или Math.PI использовано (также Math класс вместо устаревших FloatMath). 57 оборотов и никто не заметил? : D – snachmsm 18 September 2015 в 07:40
  • 4
    Кто-нибудь подтверждает, учитывает ли locationA.distanceTo(locationB) высоту? – Secret Squirrel 23 February 2016 в 11:25
  • 5
    Для чего нужен второй блок кода? Почему бы вам просто не использовать Location. distanceBetween()? – spaaarky21 4 May 2016 в 20:19

distanceTo даст вам расстояние в метрах между двумя данными местоположением ej target.distanceTo (destination).

distanceBetween также дает вам расстояние, но оно будет хранить расстояние в массиве float (результаты [0]). документ говорит, что если результаты имеют длину 2 или больше, исходный подшипник сохраняется в результатах [1]. Если результаты имеют длину 3 или больше, конечный подшипник сохраняется в результатах [2]

надеюсь, что это поможет

Я использовал distanceTo, чтобы получить расстояние от точки A до B Я думаю, что это путь.

0
ответ дан eOnOe 21 August 2018 в 15:19
поделиться

Существует только одно местоположение пользователя, поэтому вы можете выполнять итерацию. Список ближайших мест может вызвать функцию distanceTo(), чтобы получить расстояние, вы можете сохранить в массиве, если хотите.

Из того, что я понимаю, distanceBetween() находится в отдаленных местах, его выход представляет собой эллипсоид WGS84.

3
ответ дан Reno 21 August 2018 в 15:19
поделиться
  • 1
    можете ли вы предложить, какой из них обеспечивает точное расстояние? – Paresh Mayani 18 July 2012 в 14:44

Попробуйте этот код. здесь мы имеем два значения долготы и широты, а функция selected_location.distanceTo (near_locations) возвращает расстояние между этими местами в метрах.

Location selected_location=new Location("locationA");
            selected_location.setLatitude(17.372102);
            selected_location.setLongitude(78.484196);
Location near_locations=new Location("locationB");
            near_locations.setLatitude(17.375775);
            near_locations.setLongitude(78.469218);
double distance=selected_location.distanceTo(near_locations);

здесь «расстояние» - это расстояние между местоположением A & amp; locationB (в метрах)

11
ответ дан sytolk 21 August 2018 в 15:19
поделиться
  • 1
    отлично подходит для упоминания метрики .. !!! – Ragu Swaminathan 29 December 2015 в 19:57
    private static Double _MilesToKilometers = 1.609344;
    private static Double _MilesToNautical = 0.8684;


    /// <summary>
    /// Calculates the distance between two points of latitude and longitude.
    /// Great Link - http://www.movable-type.co.uk/scripts/latlong.html
    /// </summary>
    /// <param name="coordinate1">First coordinate.</param>
    /// <param name="coordinate2">Second coordinate.</param>
    /// <param name="unitsOfLength">Sets the return value unit of length.</param>
    public static Double Distance(Coordinate coordinate1, Coordinate coordinate2, UnitsOfLength unitsOfLength)
    {

        double theta = coordinate1.getLongitude() - coordinate2.getLongitude();
        double distance = Math.sin(ToRadian(coordinate1.getLatitude())) * Math.sin(ToRadian(coordinate2.getLatitude())) +
                       Math.cos(ToRadian(coordinate1.getLatitude())) * Math.cos(ToRadian(coordinate2.getLatitude())) *
                       Math.cos(ToRadian(theta));

        distance = Math.acos(distance);
        distance = ToDegree(distance);
        distance = distance * 60 * 1.1515;

        if (unitsOfLength == UnitsOfLength.Kilometer)
            distance = distance * _MilesToKilometers;
        else if (unitsOfLength == UnitsOfLength.NauticalMiles)
            distance = distance * _MilesToNautical;

        return (distance);

    }
3
ответ дан user2871325 21 August 2018 в 15:19
поделиться
public double distance(Double latitude, Double longitude, double e, double f) {
        double d2r = Math.PI / 180;

        double dlong = (longitude - f) * d2r;
        double dlat = (latitude - e) * d2r;
        double a = Math.pow(Math.sin(dlat / 2.0), 2) + Math.cos(e * d2r)
                * Math.cos(latitude * d2r) * Math.pow(Math.sin(dlong / 2.0), 2)
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        double d = 6367 * c;
                return d;

    }
0
ответ дан Vinay 21 August 2018 в 15:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: