![]() |
|
||||||||||
|
|
|
|||||
|
Привет. Мне нужно сделать что-то вроде этого: http://www.yourcharter.ru/map/
То есть имеется географическая карта. Мы указываем две точки и получаем расстояние в километрах. Вообщем-то всё уже готово за исключением корректного определения расстояния по карте. Я сначала думал, что это будет просто, но выяснилось что таки нет. То есть по идее нужно взять расстояние в пикселях и умножить на масштаб, но на деле так не получается. Все карты которые я смог найти имеют не постоянный масштаб. То есть к примеру если 100 пикселей в одном месте карты равны 1000 км, то в другом месте карты 100 пикселей могут быть равны 1700 км. Так что такой вариант не проходит. Как можно померять расстояние по такой карте? Кто-то сталкивался с подобными задачами? Может быть есть карты с постоянным масштабом? Пока что единственная идея - использовать меркаторскую проекцию, приводить экранные координаты к географическим, а по географическим уже считать расстояние. ИМХО не лучший вариант. Помогите плиз. Спасибо.
__________________
while(1) {} Последний раз редактировалось Division; 17.10.2008 в 00:34. |
|
|||||
|
Регистрация: Mar 2006
Адрес: Москва
Сообщений: 415
|
а что мешает воспользоваться нормальной картой с обозначенный масштабом 1:..., перерисовать в кривые (если надо)
и использовать именно её. Ну и далее уже производить расчет... Вопрос в другом, как расчитать это расстояние на любой карте не по прямой, а с учетом существующих дорог и прочего, т .е. особенностей местности без заморочек с расстановкой клипов и проверкой каждого, в поисках ближайшего, чтобы уже от клипа к клипу рисовать кривую, что в последствии будет выглядеть как проложеный маршрут... |
|
|||||
|
Здесь как раз выскакивают мои пробелы знаний в географии. Какая карта подойдёт в данном случае? Я смотрел инфу по разным картографическим проекциям и так и не смог найти проекцию, при котором длины бы не искажались, а масштаб оставался постоянным. Мне не требуется учитывать дороги, просто расстояние по прямой(на самом деле по дуге большого круга).
Если можно - дай ссылку на нормальную карту, хоть посмотрю как они выглядят. PS вообще мне нужны крупномасштабные карты Евразии или мира. На мелкомасштабных картах ИМХО неточность измерения можно и не заметить. UPD, да, в флешке с примером они же как-то определяют расстояние. И карта у них тоже с не постоянным масштабом (можно приложить ручку к монитору в одном месте карты, померять, повторить то же самое в другом месте и результат будет разный). Цитата:
__________________
while(1) {} Последний раз редактировалось Division; 17.10.2008 в 11:25. |
|
|||||
|
Регистрация: Nov 2005
Сообщений: 1,058
|
Класс не очень точен, но для больших карт (и даже для масштаба города) вполне подходит.
package fzn7.utils
{
public class GeoUtil extends Object
{
/**
* Helper function
* */
static private function deg2rad(degrees:Number):Number {
var retVal:Number = degrees * Math.PI / 180;
return retVal;
}
/**
* Helper function
* */
static private function rad2deg(radians:Number):Number {
var retVal:Number = radians * 180 / Math.PI;
return retVal;
}
/**
* Function finds distance between 2 geo points.
* */
static public function getDistance(lat1:Number, lon1:Number, lat2:Number, lon2:Number, units:String = "K"): Number {
var distance:Number = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) +
Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
Math.cos(deg2rad(lon1 - lon2));
distance = Math.acos(distance);
distance = rad2deg(distance);
var retVal:Number = distance * 60 * 1.1515;
units = units.toUpperCase();
if (units == "K")
{
return retVal * 1.60934;
}
if (units == "N")
{
return retVal * 0.8684;
}
return undefined;
}
}
}
Последний раз редактировалось †‡Paladin‡†; 17.10.2008 в 18:37. |
|
|||||
|
Цитата:
Цитата:
UPD: †‡Paladin‡†, спасибо, посмотрю UPD2: †‡Paladin‡†, здесь я так понял, требуется для начала пребразовать экранные координаты в географические? Такой метод я описывал в первом посте. Вообще по идее надо ещё учитывать наименование широты и долготы (СШ/ЮШ или ЗД/ВД) и в зависимости от неё выбирать знак числа, который передать в твой метод getDistance . Не помнишь как?
__________________
while(1) {} Последний раз редактировалось Division; 17.10.2008 в 13:50. |
|
|||||
|
Регистрация: Nov 2005
Сообщений: 1,058
|
Цитата:
Я его юзал при работе с yahoo maps, что-бы не бегать к ним на сервер для расчета расстояния. К счастью ихний API сам отдает правильною широту и долготу. |
|
|||||
|
Banned
|
Если карта ТОПОГРАФИЧЕСКАЯ, т.е. крупномасштабная, то мерить расстояние легко и просто - так же как линейкой на распечатке этой карты. Разумеется в любом случае надо знать масштаб.
Но если речь о длине большого круга и более мелком масштабе - то тут совсем другая история. Придется рисовать сетку координат, и уже по координатам (долгота/широта) рассчитывать расстояния. Я вот так делал похожую задачу: http://flasher.ru/forum/showthread.php?t=103787 |
|
|||||
|
Регистрация: Nov 2005
Адрес: West_UA
Сообщений: 119
|
http://mainmaps.com/fly - старушка, еще на Flash MX. С точки зрения флеш-проекта - мягко скажем слабенько. Но расстояния считает четко. Договаривайся, я там уже не работаю.
![]() |
|
|||||
|
Всем спасибо, сделал(почти, жду пока дизайнер карту подготовит) определением расстояния по географическим координатам.
dantist86, что-то мне подсказывает, что раз уж меркаторская проекция, то сделано тем же способом что и у меня. Кстати, до сих пор не могу представить как можно получить из экранных координат географические на проекциях, где параллели не перпендикулярны меридианам. Вот код мегакласса с комментариями (: Может кому-то когда-то пригодится. /*
Мегакласс для определения расстояний между
точками на поверхности земли
*/
class Distance {
public static var R = 6371; // Радиус Земли в км
// Входные данные в градусах
// Знаки должны быть такие:
// СШ +
// ЮШ -
// ВД +
// ЗД -
public static function GetDistance(lat1, lon1, lat2, lon2) : Number {
// Переводим в радианы
lon1 *= Math.PI/180; // Долгота
lat1 *= Math.PI/180; // Широта
lon2 *= Math.PI/180;
lat2 *= Math.PI/180;
var cosd = Math.sin(lat1)*Math.sin(lat2)+Math.cos(lat1)*Math.cos(lat2)*Math.cos(lon1-lon2);
var d = Math.acos(cosd);
var L = d*R; // Расстояние в км
return L;
}
}
__________________
while(1) {} |
![]() |
![]() |
Часовой пояс GMT +4, время: 16:07. |
|
|
« Предыдущая тема | Следующая тема » |
|
|