Pull to refresh

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

Reading time2 min
Views2.1K
Стала задача построить сектор на карте 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. Был бы признателен за любую помощь в этом вопросе.
Tags:
Hubs:
Total votes 3: ↑2 and ↓1+1
Comments1

Articles