Страница 1 из 2
Google Maps и их сферические проекции
Добавлено: 27 июл 2011, 23:40
sipk
Доброго времени суток всем, уважаемые коллеги. Подскажите пожалуйста по решению следующей задачи. Пусть имеется прямоугольный "тайл" карты Google Map, географические координаты углов которого известны (в градусах) и получены через обычный API Google Maps. Требуется отобразить на нем объект, определенный также в географических координатах. Но растр карты Google Maps выполнен в сферической проекции (считая Землю сферой). Таким образом, для расчета долготы (при отображении в пикселях) расчет получается линейный, но для широты он не подходит, так как объект смещается на север, и смещается тем более, чем более по площади заданный "тайл" карты (или масштаб карты, как удобнее). Собственно весь вопрос, как правильно рассчитать широту (понимаю, что расчет нужно делать как бы "по длине дуги"), чтобы объект отображался корректно на этой прямоугольной области (как и долгота, она считается всегда точно, в проекции WGS84)? Отображение объекта важно сделать без использования API Google Maps. Всем большое спасибо за внимание!
P.S. Насколько знаю, Google Earth в отличие от Google Maps дает картинку сразу в циллиндрической проекции WGS84 и там такой проблемы не возникает
Re: Google Maps и их сферические проекции
Добавлено: 28 июл 2011, 00:40
Mavka
Формулы пересчета из OpenLayers:
SphericalMercator.js - ищите forwardMercator.
Там буквально 3 строчки.
Re: Google Maps и их сферические проекции
Добавлено: 28 июл 2011, 09:56
sipk
Mavka писал(а):Формулы пересчета из OpenLayers:
SphericalMercator.js - ищите forwardMercator.
Там буквально 3 строчки.
Спасибо Вам, я понимаю, это перевод в метры Меркатора, а в моем случае мне из этих функций просто необходим пересчет параметров "lat" и "y" (соответственно, для прямого и обратного преобразования), т. е. без непосредственного перехода к метрам Меркатора. Но у меня получилось слишком большое смещение и объекты вовсе "унесло" далеко на север. Например широту в районе 54.997985 градусов СШ она пересчитывает приблизительно в 66.129256 градусов СШ. И здесь главный вопрос -
как она может рассчитать это "радиальное искажение" по широте, не зная размеров (разброса широт) видимого "тайла" карты? Ведь оно зависит как раз от охватываемого этим "тайлом" карты диапазона широт. А сам растр Google Maps дан в сферической проекции (правда, не в метрах Меркатора, а в градусах). Так что это, скорее всего, не то, что нужно. Пожалуйста направьте, как можно правильно рассчитать широту в моем случае (постановка задачи описана в моем первом сообщении)? Большое спасибо за внимание!
P.S. Эти формулы мне знакомы, по моему аналогичны формулам в библиотеке proj4 для MapServer, но здесь частный случай, боюсь, задача может быть сложнее. По существу да, нужна именно проекция EPSG:4326, но так как растр дан в сферической проекции, то нужен расчет, исходя из его диапазона широт
Re: Google Maps и их сферические проекции
Добавлено: 28 июл 2011, 11:34
Mavka
Давайте тогда разберемся с СК:
epsg:4326 - на эллипсоиде WGS84
epsg:900913 - тоже (!) на эллипсоиде WGS84
Широта и долгота на гугло-шарике строго равна широте/долготе на WGS84. При проецировании берут широту с WGS84 и делают вид, что это была сфера, с которой потом получают метры. (Такая вот псевдо проекция.)
Если известны географические координаты гугло-тайла, то берете свой тайл с такими же координатами - по ширине/долготе они будет равными, а по высоте/широте тайл нужно вытянуть. Полученный тайл должен быть квадратным.
Re: Google Maps и их сферические проекции
Добавлено: 28 июл 2011, 12:34
sipk
Mavka писал(а):Давайте тогда разберемся с СК:
epsg:4326 - на эллипсоиде WGS84
epsg:900913 - тоже (!) на эллипсоиде WGS84
Широта и долгота на гугло-шарике строго равна широте/долготе на WGS84. При проецировании берут широту с WGS84 и делают вид, что это была сфера, с которой потом получают метры. (Такая вот псевдо проекция.)
Если известны географические координаты гугло-тайла, то берете свой тайл с такими же координатами - по ширине/долготе они будет равными, а по высоте/широте тайл нужно вытянуть. Полученный тайл должен быть квадратным.
Спасибо за ответ, прошу прощения, если не точно изъясняюсь, я совсем не специалист в картографии)
Или действительно, растянуть картинку, но вот как, на сколько пикселей, вот вопрос. Ситуация следующая - есть тайл и он имеет координаты
A(lon1,lat1) и
B(lon2,lat2), полученные от Google API через
GMap2.getBounds (для OpenLayers это будет
OpenLayers.Map.GetExtent) левого нижнего и правого верхнего углов и они в сферической проекции. При отображении на получившемся растре точки
С(lon,lat) в пикселях получим
X = (lon-lon1)*W/(lon2-lon1), где W-разрешение по горизонтали (пусть будет, как Вы сказали, квадрат, тогда по вертикали такое же значение). X в таком случае ложится четко, но если таким же способом рассчитать широту для точки С (
Y = W-(lat-lat1)*W/(lat2-lat1)), то точка С смещается на сервер. Вот и вопрос, на сколько растянуть тогда по вертикали.. Пробовал считать в пикселях как длину дуги (lon=const, в проекции получаем дугу), тоже не помогло, да и обратный перевод становится тогда нетривиальной задачей.
P.S. Можно попробовать заставить Google Maps выдать Bounds в нормальной WGS84, но, читая многие зарубежные форумы (например
http://osgeo-org.1803224.n2.nabble.com/ ... 03101.html), пришел к выводу, что ни у кого это пока не получилось (в OpenLayers таки есть параметр
displayProjection) или даже невозможно. У меня тоже не вышло, да и хотелось бы все же разобраться с расчетом. А на Earth такое должно сработать без проблем, там растр "правильный"
Re: Google Maps и их сферические проекции
Добавлено: 28 июл 2011, 13:43
Mavka
Если гугла выдала долготу/широту, то это уже WGS84...
Что то не понимаю сути вопроса или логики работы Google Map API...
1. Имеем границы карты - левая lon1 и верхняя lat2 в градусах (extent.left и extent.top).
2. Преобразуем их в метры (см. forwardMercator выше).
3. Берем точку (lon,lat) в градусах.
4. Преобразуем в метры (forwardMercator).
5. Пересчитываем в экранные пиксели (
getViewPortPxFromLonLat).
6. Наносим точку относительно края div'а.
Re: Google Maps и их сферические проекции
Добавлено: 28 июл 2011, 14:09
sipk
Это да, только в моем случае имеется полученный от Google API растр и от него же координаты углов, а все расчеты мне необходимо делать уже без использования OpenLayers или родного API или любых других подобных средств в другой программе. Если бы с ними, вопрос бы не возник даже, там все нормально при помощи родного API от Google отображается правильно с первого раза. А так вот и не знаю, как рассчитать широту, нужен именно алгоритм или формула ее расчета для тайла Гугла, определенного координатами углов.
Если гугла выдала долготу/широту, то это уже WGS84...
В общем да, но сплющенный по широте, и чем больше тайл, тем сильнее это проявляется. Суть вопроса проста, как математически получить широту для растра гугла в задаче, описанной в моем предыдущем сообщении (долгота рассчитывается линейно).
Re: Google Maps и их сферические проекции
Добавлено: 28 июл 2011, 14:30
sipk
Mavka писал(а):Если гугла выдала долготу/широту, то это уже WGS84...
Что то не понимаю сути вопроса или логики работы Google Map API...
1. Имеем границы карты - левая lon1 и верхняя lat2 в градусах (extent.left и extent.top).
2. Преобразуем их в метры (см. forwardMercator выше).
3. Берем точку (lon,lat) в градусах.
4. Преобразуем в метры (forwardMercator).
5. Пересчитываем в экранные пиксели (
getViewPortPxFromLonLat).
6. Наносим точку относительно края div'а.
Да, дело было не в бобине))) перенес алгоритмы перерасчета из указанного Вами источника, выдал карту в родной проекции EPSG:900913 и все заработало. Спасибо Вам большое!
Re: Google Maps и их сферические проекции
Добавлено: 04 авг 2011, 15:05
ArzArt
Здравствуйте,
У меня такая же проблема с пересчетом Y. Я сделал растровую карту jpg из SASPlanet с привязкой.
Если конвертирую проекцию карты в Geographic с помощью Global Mapper, то все координаты отображаются верно, но карта получается сплюснутой по вертикали (растянутой по горизонтали). Если этого не делать, и оставить в проекции Mercator, то неправильно вычисляется Y (по формулам из 3 строк, которые привел Mavka)
sipk как у Вас получилось выполнить пересчет Y, что за алгоритм пересчета?
Re: Google Maps и их сферические проекции
Добавлено: 04 авг 2011, 15:44
Mavka
Re: Google Maps и их сферические проекции
Добавлено: 04 авг 2011, 16:02
ArzArt
Да, я уже видел.
Но я не пойму, что мне можно сделать в данном случае? Недавно только начал вникать во все это.
Global Mapper отображает снизу формы и географические и Mercator координаты одновременно и правильно, при нормальном виде карты. Значит он их как-то конвертирует?
Re: Google Maps и их сферические проекции
Добавлено: 04 авг 2011, 17:48
Mavka
Координаты в WGS84 невозможно "нарисовать", точнее можно, но это получится 3-мерный шарик. Что бы его перевести в плоскость выбирают проекцию, она будет уже не в градусах, а в метрах. Тот же "Сферический гугл" - это проекция.
С Global Mapper я не работал, какую он проекцию подбирает для WGS84 по-умолчанию не знаю. Какой-нибудь Меркатор уже выглядит "не сплющенным".
У вас какая конечная цель? Своя программа? Хотите склеить и получить красивую карту? Для территории России хорошо подходит проекция
Albers-Siberia.
Re: Google Maps и их сферические проекции
Добавлено: 05 авг 2011, 08:08
ArzArt
Ну скажем так программка, я уже склеил в файл jpg программой SASPlanet, карта не очень красивая), обычная с Google, размер маленький. В SASPlanet нельзя создать файл привязки jgw, поэтому я создаю файл привязки map, а затем уже в Global Mapper создаю jgw.
Т.е. у меня есть обычная ("не сплющенная") jpg карта с файлом привязки jgw в проекции Mercator. Хочу на ней как и
sipk отобразить точку определенную в географических координатах (пришедших с GPS, например).
Но файл привязки (jgw) получается такого вида:
Код: Выделить всё
0.29793426115513905
0.00000000000000000
0.00000000000000000
-0.29793426115514227
4879236.02803752760000000
7402515.09942454470000000
А как из этих чисел получить географические X и Y, и обратно (именно Y, X вроде получается по формулам).
Если поменять проекцию карты на Geographic, то все координаты будут реальными и ничего переводить не надо, естественно. Но карта будет "сплющенная", а хочется красивую "не сплющенную"). Если нельзя перевести координату Y, то может можно как-то извернуться и сделать что-то иначе?
Вообщем, возможно как-то получить обычную ("не сплющенную") плоскую карту Google с привязкой по географическим координатам?
Re: Google Maps и их сферические проекции
Добавлено: 05 авг 2011, 08:25
ArzArt
Похоже проблема решена.
Оказывается SASPlanet может делать файл привязки jpgw такого вида:
Код: Выделить всё
0.298582141738838
0
0
-0.298582141739165
4879235.8790704
7437711.00893191
И тогда все переводится правильно.
Re: Google Maps и их сферические проекции
Добавлено: 05 авг 2011, 16:19
ggis
ArzArt писал(а):Похоже проблема решена.
Оказывается SASPlanet может делать файл привязки jpgw такого вида:
Код: Выделить всё
0.298582141738838
0
0
-0.298582141739165
4879235.8790704
7437711.00893191
И тогда все переводится правильно.
как задать сохранение файла привязки jpgw такого вида в SASPlanet ? Спасибо.