Как стать автором
Обновить

Как построить сектор на карте Google Maps?

Время на прочтение2 мин
Количество просмотров2.3K
Стала задача построить сектор на карте Google maps (GM). Насколько известно мне, это возможно сделать только при помощи прямых. http://maps.forum.nu/ вот тут есть примеры как строить окружность, но мне это немного неподходит. Так как окружность строится по следующему принципу: вычисляются координаты произвольной точки на окружности по формулам:

var PGlat = (PGradius/3963)*r2d; // using 3963 miles as earth's radius
var PGlng = PGlat/Math.cos(lat*d2r);

где r2d и d2r перевод из радиан в градусы и обратно соответственно.lat — latitude центра окружности.
скажу сразу, что мне не свовсем понятна эта формула, но она работает и дает правильные координаты точки на окружности.
После этого от полученной точки мы чертим с определенным шагом 360 прямых.
var PGsides = 360;
var PGstart = (PGsides%2 == 1) ? 2/PGsides : 1/PGsides;
PGstart = (0.5 - PGstart) * Math.PI;

for (var i=-1; i < PGsides; i++) {
var theta = 2*i*Math.PI/PGsides + PGstart;
PGx = lng + (PGlng * Math.cos(theta));
PGy = lat + (PGlat * Math.sin(theta));
PGpoints.push(new GPoint(PGx,PGy));
}

есть еще вот такой вариант построения окружности, но его расчетов я немного не понял, но делается все по тому же принципу
if (circleUnits == 'KM') {
var d = circleRadius/6378.8; // radians
}
else { //miles
var d = circleRadius/3963.189; // radians
}

var lat1 = (PI/180)* center.lat(); // radians
var lng1 = (PI/180)* center.lng(); // radians

for (var a = 0 ; a < 361 ; a++ ) {
var tc = (PI/180)*a;
var y = asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc));
var dlng = atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(y));
var x = ((lng1-dlng+PI) % (2*PI)) - PI ; // MOD function
var point = new GLatLng(parseFloat(y*(180/PI)),parseFloat(x*(180/PI)));
circlePoints.push(point);
bounds.extend(point);
}

if (d < 1.5678565720686044) {
circle = new GPolygon(circlePoints, '#000000', 2, 1, '#000000', 0.25);
}
else {
circle = new GPolygon(circlePoints, '#000000', 2, 1);
}
map.addOverlay(circle);


Вернемся к построению сектора.
Входные величины:
lat, lng — координаты центра;
r — радиус;
azimuth — азимут центра сектора (медианы вписанного треугольника) в градусах;
width — угол сектора.

Основная проблемма — нати координаты первой и последней точек сектора. По идее эти координаты получаются при помощи следующих формул:
PGlat = lat + (r * Math.cos( (azimuth - width/2 )));
PGlon = lng + (r* Math.sin( (azimuth - width/2 )));

PGlat = lat + (r * Math.cos( (azimuth + width/2 )));
PGlon = lng + (r* Math.sin( (azimuth + width/2 )));

Но мешает r — радиус в милях. По идее он долежн быть преобразован, так как мы должны получить величину в градусах, нро вот что за преобразования я понять немогу.

Может кто сможет помочь или видел где-нибудь построение сектора на GM. Был бы признателен за любую помощь в этом вопросе.
Теги:
Хабы:
Всего голосов 3: ↑2 и ↓1+1
Комментарии1

Публикации

Истории

Ближайшие события

19 августа – 20 октября
RuCode.Финал. Чемпионат по алгоритмическому программированию и ИИ
МоскваНижний НовгородЕкатеринбургСтавропольНовосибрискКалининградПермьВладивостокЧитаКраснорскТомскИжевскПетрозаводскКазаньКурскТюменьВолгоградУфаМурманскБишкекСочиУльяновскСаратовИркутскДолгопрудныйОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
10 – 11 октября
HR IT & Team Lead конференция «Битва за IT-таланты»
МоскваОнлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн