googlemaps получает ограничивающую рамку вокруг маркера - PullRequest
0 голосов
/ 07 марта 2011

В googlemaps api v2 у меня есть один маркер на карте, и мне нужно вычислить ограничивающий прямоугольник вокруг этого.Как мне получить склеивающую коробку 5 на 5 километров, центром которой является этот маркер?

Ответы [ 2 ]

2 голосов
/ 07 марта 2011

Я не уверен, что такую ​​функциональность предоставляет карта Google, но математика поможет вам выжить;) Рассчитать расстояние, пеленг и многое другое между точками широты / долготы является отличной ссылкой на разныерасчеты с географическими данными.Откройте эту страницу и перейдите к разделу «Пункт назначения с заданным расстоянием и азимутом от начальной точки», здесь есть формулы, а также онлайн-калькулятор, чтобы вы могли их проверить (а также увидеть точки на карте).Формула имеет несколько параметров:

(lat1,lng1) - your point (marker coordinates)
d - distance (in your case it would be 2.5km)
brng - angle.. 

, чтобы найти границу, вам нужно найти координаты сторон прямоугольника юг, север, восток и запад, поэтому все, что вы будете изменять в параметрах, это угол, и в вашем случае это будет0, 90, 180 и 270 град.Формулы:

var lat2 = Math.asin( Math.sin(lat1)*Math.cos(d/R) + 
                      Math.cos(lat1)*Math.sin(d/R)*Math.cos(brng) );
var lon2 = lon1 + Math.atan2(Math.sin(brng)*Math.sin(d/R)*Math.cos(lat1), 
                             Math.cos(d/R)-Math.sin(lat1)*Math.sin(lat2));

Ну, указав угол = 0, вы найдете север, PI / 2 - восток, PI - юг, 3 * PI / 2 - запад (углы следует передавать в радианах).

R = earth’s radius (mean radius = 6,371km)

ADD-ON : только что посмотрел исходный код этой страницы, потому что, когда я вхожу в онлайн-форму с азимутом = 0, расстоянием = 2, я вижу карту с двумя точками и в соответствии смасштаб карты расстояние между ними действительно 2 км.Ну, вы можете использовать эту библиотеку под простой атрибуцией лицензии, без каких-либо явных или подразумеваемых гарантий, просто включите ее

<script src="http://www.movable-type.co.uk/scripts/latlon.js"></script>

Функция, которая вам нужна:

/**
 * Returns the destination point from this point having travelled the given distance (in km) on the
 * given initial bearing (bearing may vary before destination is reached)
 *
 * see http://williams.best.vwh.net/avform.htm#LL
 *
 * @param {Number} brng: Initial bearing in degrees
 * @param {Number} dist: Distance in km
 * @returns {LatLon} Destination point
 */
LatLon.prototype.destinationPoint = function(brng, dist) {
 dist = typeof(dist)=='number' ? dist : typeof(dist)=='string' && dist.trim()!='' ? +dist : NaN;
 dist = dist/this._radius; // convert dist to angular distance in radians
 brng = brng.toRad(); //
 var lat1 = this._lat.toRad(), lon1 = this._lon.toRad();

 var lat2 = Math.asin( Math.sin(lat1)*Math.cos(dist) +
 Math.cos(lat1)*Math.sin(dist)*Math.cos(brng) );
 var lon2 = lon1 + Math.atan2(Math.sin(brng)*Math.sin(dist)*Math.cos(lat1),
 Math.cos(dist)-Math.sin(lat1)*Math.sin(lat2));
 lon2 = (lon2+3*Math.PI)%(2*Math.PI) - Math.PI; // normalise to -180...+180

 return new LatLon(lat2.toDeg(), lon2.toDeg());
}

и когда я вхожу в онлайн-форму, имея = 0, расстояние = 2, этот метод выполняется с аргументами latLonCalc.destinationPoint( 0, "2" );

, попробуйте, в противном случае дайте мне входные параметры, чтобы я мог проверить, что не так

UPDATE2 эта библиотека работает с градами и преобразует их в радианы для вычислений, а затем обратно в грады.Только что выполнил простой тест:

var latLonCalc = new  new LatLon( 25, 45 );
var point = latLonCalc.destinationPoint( 0, "2" );
console.info( point );
// prints 25°01′05″N, 045°00′00″E { _lat=25.01798643211838, _lon=45.00000000000005, _radius=6371}

, поэтому расстояние между точкой входа и конечным пунктом назначения составляет чуть более 1 минуты;

earth = 2 * PI * 6371; // 40 009.98km
=> 40 009.98km / 360grad =~111.14
=> 111,14 / 60 = 1.85 (km/minute) ~2km

это был круглый расчет, который говорит мне, что последнийточка находится недалеко от точки входа, а расстояние должно быть 2 км;)

1 голос
/ 07 марта 2011

Не тот, который вам нужен, но проверьте эту статью

http://www.svennerberg.com/2008/11/bounding-box-in-google-maps/

...