Google Maps и их сферические проекции
-
- Интересующийся
- Сообщения: 17
- Зарегистрирован: 27 июл 2011, 23:16
- Репутация: 0
Google Maps и их сферические проекции
Доброго времени суток всем, уважаемые коллеги. Подскажите пожалуйста по решению следующей задачи. Пусть имеется прямоугольный "тайл" карты Google Map, географические координаты углов которого известны (в градусах) и получены через обычный API Google Maps. Требуется отобразить на нем объект, определенный также в географических координатах. Но растр карты Google Maps выполнен в сферической проекции (считая Землю сферой). Таким образом, для расчета долготы (при отображении в пикселях) расчет получается линейный, но для широты он не подходит, так как объект смещается на север, и смещается тем более, чем более по площади заданный "тайл" карты (или масштаб карты, как удобнее). Собственно весь вопрос, как правильно рассчитать широту (понимаю, что расчет нужно делать как бы "по длине дуги"), чтобы объект отображался корректно на этой прямоугольной области (как и долгота, она считается всегда точно, в проекции WGS84)? Отображение объекта важно сделать без использования API Google Maps. Всем большое спасибо за внимание!
P.S. Насколько знаю, Google Earth в отличие от Google Maps дает картинку сразу в циллиндрической проекции WGS84 и там такой проблемы не возникает
P.S. Насколько знаю, Google Earth в отличие от Google Maps дает картинку сразу в циллиндрической проекции WGS84 и там такой проблемы не возникает
- Mavka
- Гуру
- Сообщения: 2060
- Зарегистрирован: 14 мар 2008, 17:36
- Репутация: 9
Re: Google Maps и их сферические проекции
Формулы пересчета из OpenLayers:
SphericalMercator.js - ищите forwardMercator.
Там буквально 3 строчки.
SphericalMercator.js - ищите forwardMercator.
Там буквально 3 строчки.
лангольеры под окном жрали время ом-ном-ном
-
- Интересующийся
- Сообщения: 17
- Зарегистрирован: 27 июл 2011, 23:16
- Репутация: 0
Re: Google Maps и их сферические проекции
Спасибо Вам, я понимаю, это перевод в метры Меркатора, а в моем случае мне из этих функций просто необходим пересчет параметров "lat" и "y" (соответственно, для прямого и обратного преобразования), т. е. без непосредственного перехода к метрам Меркатора. Но у меня получилось слишком большое смещение и объекты вовсе "унесло" далеко на север. Например широту в районе 54.997985 градусов СШ она пересчитывает приблизительно в 66.129256 градусов СШ. И здесь главный вопрос - как она может рассчитать это "радиальное искажение" по широте, не зная размеров (разброса широт) видимого "тайла" карты? Ведь оно зависит как раз от охватываемого этим "тайлом" карты диапазона широт. А сам растр Google Maps дан в сферической проекции (правда, не в метрах Меркатора, а в градусах). Так что это, скорее всего, не то, что нужно. Пожалуйста направьте, как можно правильно рассчитать широту в моем случае (постановка задачи описана в моем первом сообщении)? Большое спасибо за внимание!Mavka писал(а):Формулы пересчета из OpenLayers:
SphericalMercator.js - ищите forwardMercator.
Там буквально 3 строчки.
P.S. Эти формулы мне знакомы, по моему аналогичны формулам в библиотеке proj4 для MapServer, но здесь частный случай, боюсь, задача может быть сложнее. По существу да, нужна именно проекция EPSG:4326, но так как растр дан в сферической проекции, то нужен расчет, исходя из его диапазона широт
- Mavka
- Гуру
- Сообщения: 2060
- Зарегистрирован: 14 мар 2008, 17:36
- Репутация: 9
Re: Google Maps и их сферические проекции
Давайте тогда разберемся с СК:
epsg:4326 - на эллипсоиде WGS84
epsg:900913 - тоже (!) на эллипсоиде WGS84
Широта и долгота на гугло-шарике строго равна широте/долготе на WGS84. При проецировании берут широту с WGS84 и делают вид, что это была сфера, с которой потом получают метры. (Такая вот псевдо проекция.)
Если известны географические координаты гугло-тайла, то берете свой тайл с такими же координатами - по ширине/долготе они будет равными, а по высоте/широте тайл нужно вытянуть. Полученный тайл должен быть квадратным.
epsg:4326 - на эллипсоиде WGS84
epsg:900913 - тоже (!) на эллипсоиде WGS84
Широта и долгота на гугло-шарике строго равна широте/долготе на WGS84. При проецировании берут широту с WGS84 и делают вид, что это была сфера, с которой потом получают метры. (Такая вот псевдо проекция.)
Если известны географические координаты гугло-тайла, то берете свой тайл с такими же координатами - по ширине/долготе они будет равными, а по высоте/широте тайл нужно вытянуть. Полученный тайл должен быть квадратным.
лангольеры под окном жрали время ом-ном-ном
-
- Интересующийся
- Сообщения: 17
- Зарегистрирован: 27 июл 2011, 23:16
- Репутация: 0
Re: Google Maps и их сферические проекции
Спасибо за ответ, прошу прощения, если не точно изъясняюсь, я совсем не специалист в картографии)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 такое должно сработать без проблем, там растр "правильный"
- Mavka
- Гуру
- Сообщения: 2060
- Зарегистрирован: 14 мар 2008, 17:36
- Репутация: 9
Re: Google Maps и их сферические проекции
Если гугла выдала долготу/широту, то это уже WGS84...
Что то не понимаю сути вопроса или логики работы Google Map API...
1. Имеем границы карты - левая lon1 и верхняя lat2 в градусах (extent.left и extent.top).
2. Преобразуем их в метры (см. forwardMercator выше).
3. Берем точку (lon,lat) в градусах.
4. Преобразуем в метры (forwardMercator).
5. Пересчитываем в экранные пиксели (getViewPortPxFromLonLat).
6. Наносим точку относительно края div'а.
Что то не понимаю сути вопроса или логики работы Google Map API...
1. Имеем границы карты - левая lon1 и верхняя lat2 в градусах (extent.left и extent.top).
2. Преобразуем их в метры (см. forwardMercator выше).
3. Берем точку (lon,lat) в градусах.
4. Преобразуем в метры (forwardMercator).
5. Пересчитываем в экранные пиксели (getViewPortPxFromLonLat).
6. Наносим точку относительно края div'а.
лангольеры под окном жрали время ом-ном-ном
-
- Интересующийся
- Сообщения: 17
- Зарегистрирован: 27 июл 2011, 23:16
- Репутация: 0
Re: Google Maps и их сферические проекции
Это да, только в моем случае имеется полученный от Google API растр и от него же координаты углов, а все расчеты мне необходимо делать уже без использования OpenLayers или родного API или любых других подобных средств в другой программе. Если бы с ними, вопрос бы не возник даже, там все нормально при помощи родного API от Google отображается правильно с первого раза. А так вот и не знаю, как рассчитать широту, нужен именно алгоритм или формула ее расчета для тайла Гугла, определенного координатами углов.
В общем да, но сплющенный по широте, и чем больше тайл, тем сильнее это проявляется. Суть вопроса проста, как математически получить широту для растра гугла в задаче, описанной в моем предыдущем сообщении (долгота рассчитывается линейно).Если гугла выдала долготу/широту, то это уже WGS84...
-
- Интересующийся
- Сообщения: 17
- Зарегистрирован: 27 июл 2011, 23:16
- Репутация: 0
Re: Google Maps и их сферические проекции
Да, дело было не в бобине))) перенес алгоритмы перерасчета из указанного Вами источника, выдал карту в родной проекции EPSG:900913 и все заработало. Спасибо Вам большое!Mavka писал(а):Если гугла выдала долготу/широту, то это уже WGS84...
Что то не понимаю сути вопроса или логики работы Google Map API...
1. Имеем границы карты - левая lon1 и верхняя lat2 в градусах (extent.left и extent.top).
2. Преобразуем их в метры (см. forwardMercator выше).
3. Берем точку (lon,lat) в градусах.
4. Преобразуем в метры (forwardMercator).
5. Пересчитываем в экранные пиксели (getViewPortPxFromLonLat).
6. Наносим точку относительно края div'а.
-
- Новоприбывший
- Сообщения: 12
- Зарегистрирован: 03 авг 2011, 13:12
- Репутация: 0
Re: Google Maps и их сферические проекции
Здравствуйте,
У меня такая же проблема с пересчетом Y. Я сделал растровую карту jpg из SASPlanet с привязкой.
Если конвертирую проекцию карты в Geographic с помощью Global Mapper, то все координаты отображаются верно, но карта получается сплюснутой по вертикали (растянутой по горизонтали). Если этого не делать, и оставить в проекции Mercator, то неправильно вычисляется Y (по формулам из 3 строк, которые привел Mavka)
sipk как у Вас получилось выполнить пересчет Y, что за алгоритм пересчета?
У меня такая же проблема с пересчетом Y. Я сделал растровую карту jpg из SASPlanet с привязкой.
Если конвертирую проекцию карты в Geographic с помощью Global Mapper, то все координаты отображаются верно, но карта получается сплюснутой по вертикали (растянутой по горизонтали). Если этого не делать, и оставить в проекции Mercator, то неправильно вычисляется Y (по формулам из 3 строк, которые привел Mavka)
sipk как у Вас получилось выполнить пересчет Y, что за алгоритм пересчета?
- Mavka
- Гуру
- Сообщения: 2060
- Зарегистрирован: 14 мар 2008, 17:36
- Репутация: 9
Re: Google Maps и их сферические проекции
лангольеры под окном жрали время ом-ном-ном
-
- Новоприбывший
- Сообщения: 12
- Зарегистрирован: 03 авг 2011, 13:12
- Репутация: 0
Re: Google Maps и их сферические проекции
Да, я уже видел.
Но я не пойму, что мне можно сделать в данном случае? Недавно только начал вникать во все это.
Global Mapper отображает снизу формы и географические и Mercator координаты одновременно и правильно, при нормальном виде карты. Значит он их как-то конвертирует?
Но я не пойму, что мне можно сделать в данном случае? Недавно только начал вникать во все это.
Global Mapper отображает снизу формы и географические и Mercator координаты одновременно и правильно, при нормальном виде карты. Значит он их как-то конвертирует?
- Mavka
- Гуру
- Сообщения: 2060
- Зарегистрирован: 14 мар 2008, 17:36
- Репутация: 9
Re: Google Maps и их сферические проекции
Координаты в WGS84 невозможно "нарисовать", точнее можно, но это получится 3-мерный шарик. Что бы его перевести в плоскость выбирают проекцию, она будет уже не в градусах, а в метрах. Тот же "Сферический гугл" - это проекция.
С Global Mapper я не работал, какую он проекцию подбирает для WGS84 по-умолчанию не знаю. Какой-нибудь Меркатор уже выглядит "не сплющенным".
У вас какая конечная цель? Своя программа? Хотите склеить и получить красивую карту? Для территории России хорошо подходит проекция Albers-Siberia.
С Global Mapper я не работал, какую он проекцию подбирает для WGS84 по-умолчанию не знаю. Какой-нибудь Меркатор уже выглядит "не сплющенным".
У вас какая конечная цель? Своя программа? Хотите склеить и получить красивую карту? Для территории России хорошо подходит проекция Albers-Siberia.
Последний раз редактировалось Mavka 05 авг 2011, 17:14, всего редактировалось 1 раз.
лангольеры под окном жрали время ом-ном-ном
-
- Новоприбывший
- Сообщения: 12
- Зарегистрирован: 03 авг 2011, 13:12
- Репутация: 0
Re: Google Maps и их сферические проекции
Ну скажем так программка, я уже склеил в файл jpg программой SASPlanet, карта не очень красивая), обычная с Google, размер маленький. В SASPlanet нельзя создать файл привязки jgw, поэтому я создаю файл привязки map, а затем уже в Global Mapper создаю jgw.
Т.е. у меня есть обычная ("не сплющенная") jpg карта с файлом привязки jgw в проекции Mercator. Хочу на ней как и sipk отобразить точку определенную в географических координатах (пришедших с GPS, например).
Но файл привязки (jgw) получается такого вида:А как из этих чисел получить географические X и Y, и обратно (именно Y, X вроде получается по формулам).
Если поменять проекцию карты на Geographic, то все координаты будут реальными и ничего переводить не надо, естественно. Но карта будет "сплющенная", а хочется красивую "не сплющенную"). Если нельзя перевести координату Y, то может можно как-то извернуться и сделать что-то иначе?
Вообщем, возможно как-то получить обычную ("не сплющенную") плоскую карту Google с привязкой по географическим координатам?
Т.е. у меня есть обычная ("не сплющенная") jpg карта с файлом привязки jgw в проекции Mercator. Хочу на ней как и sipk отобразить точку определенную в географических координатах (пришедших с GPS, например).
Но файл привязки (jgw) получается такого вида:
Код: Выделить всё
0.29793426115513905
0.00000000000000000
0.00000000000000000
-0.29793426115514227
4879236.02803752760000000
7402515.09942454470000000
Если поменять проекцию карты на Geographic, то все координаты будут реальными и ничего переводить не надо, естественно. Но карта будет "сплющенная", а хочется красивую "не сплющенную"). Если нельзя перевести координату Y, то может можно как-то извернуться и сделать что-то иначе?
Вообщем, возможно как-то получить обычную ("не сплющенную") плоскую карту Google с привязкой по географическим координатам?
-
- Новоприбывший
- Сообщения: 12
- Зарегистрирован: 03 авг 2011, 13:12
- Репутация: 0
Re: Google Maps и их сферические проекции
Похоже проблема решена.
Оказывается SASPlanet может делать файл привязки jpgw такого вида:
И тогда все переводится правильно.
Оказывается SASPlanet может делать файл привязки jpgw такого вида:
Код: Выделить всё
0.298582141738838
0
0
-0.298582141739165
4879235.8790704
7437711.00893191
-
- Завсегдатай
- Сообщения: 302
- Зарегистрирован: 31 окт 2008, 10:39
- Репутация: 2
Re: Google Maps и их сферические проекции
как задать сохранение файла привязки jpgw такого вида в SASPlanet ? Спасибо.ArzArt писал(а):Похоже проблема решена.
Оказывается SASPlanet может делать файл привязки jpgw такого вида:И тогда все переводится правильно.Код: Выделить всё
0.298582141738838 0 0 -0.298582141739165 4879235.8790704 7437711.00893191
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей