Стала задача построить сектор на карте Google maps (GM). Насколько известно мне, это возможно сделать только при помощи прямых. http://maps.forum.nu/ вот тут есть примеры как строить окружность, но мне это немного неподходит. Так как окружность строится по следующему принципу: вычисляются координаты произвольной точки на окружности по формулам:
где r2d и d2r перевод из радиан в градусы и обратно соответственно.lat — latitude центра окружности.
скажу сразу, что мне не свовсем понятна эта формула, но она работает и дает правильные координаты точки на окружности.
После этого от полученной точки мы чертим с определенным шагом 360 прямых.
есть еще вот такой вариант построения окружности, но его расчетов я немного не понял, но делается все по тому же принципу
Вернемся к построению сектора.
Входные величины:
lat, lng — координаты центра;
r — радиус;
azimuth — азимут центра сектора (медианы вписанного треугольника) в градусах;
width — угол сектора.
Основная проблемма — нати координаты первой и последней точек сектора. По идее эти координаты получаются при помощи следующих формул:
Но мешает r — радиус в милях. По идее он долежн быть преобразован, так как мы должны получить величину в градусах, нро вот что за преобразования я понять немогу.
Может кто сможет помочь или видел где-нибудь построение сектора на GM. Был бы признателен за любую помощь в этом вопросе.
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. Был бы признателен за любую помощь в этом вопросе.