Как узнать, содержится ли точка Lat, Lng внутри круга? - PullRequest
14 голосов
/ 16 декабря 2010

Хорошо, довольно понятно. Я использую карты Google, и я пытаюсь выяснить, находится ли длинная точка широты в окружности радиуса, скажем, x (x выбрано пользователем).

Ограничительная рамка не будет работать для этого. Я уже пробовал использовать следующий код:

distlatLng = new google.maps.LatLng(dist.latlng[0],dist.latlng[1]);
var latLngBounds = circle.getBounds();
if(latLngBounds.contains(distlatLng)){
      dropPins(distlatLng,dist.f_addr);
}

Это по-прежнему приводит к тому, что маркеры находятся за пределами круга.

Полагаю, это простая математика, требующая вычисления кривизны или площади, но я не уверен, с чего начать. Есть предложения?

Ответы [ 6 ]

16 голосов
/ 16 декабря 2011

Рабочий раствор с перетаскиваемым центральным маркером

Вы когда-нибудь пробовали contains?Взгляните на конструктор LatLngBounds.

Я написал об этом статью, в которой содержится ссылка на рабочий пример JSFiddle.net .

Screenshot of jsFiddle


Обновленная версия .

10 голосов
/ 12 сентября 2012

К сожалению, Пифагор не помогает в сфере. Таким образом, ответ Стюарта Борода неверен; перепады долготы не имеют фиксированного отношения к метрам, но зависят от широты.

Правильный способ - использовать формулу для расстояний большого круга. Хорошее приближение, предполагая сферическую землю, это (в C ++):

/** Find the great-circle distance in metres, assuming a spherical earth, between two lat-long points in degrees. */
inline double GreatCircleDistanceInMeters(double aLong1,double aLat1,double aLong2,double aLat2)
    {
    aLong1 *= KDegreesToRadiansDouble;
    aLat1 *= KDegreesToRadiansDouble;
    aLong2 *= KDegreesToRadiansDouble;
    aLat2 *= KDegreesToRadiansDouble;
    double cos_angle = sin(aLat1) * sin(aLat2) + cos(aLat1) * cos(aLat2) * cos(aLong2 - aLong1);

    /*
    Inaccurate trig functions can cause cos_angle to be a tiny amount
    greater than 1 if the two positions are very close. That in turn causes
    acos to give a domain error and return the special floating point value
    -1.#IND000000000000, meaning 'indefinite'. Observed on VS2008 on 64-bit Windows.
    */
    if (cos_angle >= 1)
        return 0;

    double angle = acos(cos_angle);
    return angle * KEquatorialRadiusInMetres;
    }

, где

const double KPiDouble = 3.141592654;
const double KDegreesToRadiansDouble = KPiDouble / 180.0;

и

/**
A constant to convert radians to metres for the Mercator and other projections.
It is the semi-major axis (equatorial radius) used by the WGS 84 datum (see http://en.wikipedia.org/wiki/WGS84).
*/
const int32 KEquatorialRadiusInMetres = 6378137;
5 голосов
/ 09 декабря 2015

Это очень просто. Вам просто нужно рассчитать расстояние между центром и заданной точкой и сравнить его с радиусом. Вы можете получить справку для расчета расстояния между двумя широтами от здесь

5 голосов
/ 16 июня 2014

Используйте библиотеку геометрии API Карт Google, чтобы вычислить расстояние между центром круга и маркером, а затем сравнить его с вашим радиусом.

var pointIsInsideCircle = google.maps.geometry.spherical.computeDistanceBetween(circle.getCenter(), point) <= circle.getRadius();
4 голосов
/ 12 апреля 2013

У меня работает следующий код: мой маркер нельзя перетаскивать за пределы круга, вместо этого он просто висит на краю (в любом направлении) и сохраняется последняя действительная позиция.

Функция - обработчик событийза событие перетаскивания маркеров.

_markerDragged : function() {
    var latLng = this.marker.getPosition();
    var center = this.circle.getCenter();
    var radius = this.circle.getRadius();
    if (this.circleBounds.contains(latLng) &&
        (google.maps.geometry.spherical.computeDistanceBetween(latLng, center) <= radius)) {
        this.lastMarkerPos = latLng;
        this._geocodePosition(latLng);
    } else {
        // Prevent dragging marker outside circle
        // see (comments of) http://unserkaiser.com/code/google-maps-marker-check-if-in-circle/
        // see http://www.mvjantzen.com/blog/?p=3190 and source code of http://mvjantzen.com/cabi/trips4q2012.html
        this.marker.setPosition(this.lastMarkerPos);
    }
},

Благодаря http://unserkaiser.com/code/google-maps-marker-check-if-in-circle/ и http://www.mvjantzen.com/blog/?p=3190.

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

Я был немного глуп, правда.Размышляя об этом, мы можем использовать теорему Пифагора.

У нас есть максимальное расстояние от точки (X миль), две широты и две долготы.Если мы сформируем треугольник, используя их, то мы сможем определить расстояние от точки.

Так, скажем, мы знаем point1 с координатами lat1,lng1 - центр круга и point2 с координатами lat2,lng2 это точка, которую мы пытаемся определить, находится в круге или нет.

Мы формируем прямоугольный треугольник, используя точку, определяемую point1 и point2.Это, point3 будет иметь координаты lat1,lng2 или lat2,lng1 (не важно, какие).Затем мы рассчитываем разницу (или, если хотите) расстояний - latDiff = lat2-lat1 и lngDiff = lng2-lng1

, затем вычисляем расстояние от центра с помощью Пифагора - dist=sqrt(lngDiff^2+latDiff^2).

Мы должныПереведите все в метры так, чтобы это работало корректно с картами Google, чтобы мили умножались на 1609 (приблизительно), а градусы широты / долготы - на 111000 (приблизительно).Это не совсем точно, но это делает адекватную работу.

Надеюсь, что все имеет смысл.

...