Google Maps и их сферические проекции

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
sipk
Интересующийся
Сообщения: 17
Зарегистрирован: 27 июл 2011, 23:16
Репутация: 0

Google Maps и их сферические проекции

Сообщение sipk » 27 июл 2011, 23:40

Доброго времени суток всем, уважаемые коллеги. Подскажите пожалуйста по решению следующей задачи. Пусть имеется прямоугольный "тайл" карты Google Map, географические координаты углов которого известны (в градусах) и получены через обычный API Google Maps. Требуется отобразить на нем объект, определенный также в географических координатах. Но растр карты Google Maps выполнен в сферической проекции (считая Землю сферой). Таким образом, для расчета долготы (при отображении в пикселях) расчет получается линейный, но для широты он не подходит, так как объект смещается на север, и смещается тем более, чем более по площади заданный "тайл" карты (или масштаб карты, как удобнее). Собственно весь вопрос, как правильно рассчитать широту (понимаю, что расчет нужно делать как бы "по длине дуги"), чтобы объект отображался корректно на этой прямоугольной области (как и долгота, она считается всегда точно, в проекции WGS84)? Отображение объекта важно сделать без использования API Google Maps. Всем большое спасибо за внимание!
P.S. Насколько знаю, Google Earth в отличие от Google Maps дает картинку сразу в циллиндрической проекции WGS84 и там такой проблемы не возникает

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: Google Maps и их сферические проекции

Сообщение Mavka » 28 июл 2011, 00:40

Формулы пересчета из OpenLayers:
SphericalMercator.js - ищите forwardMercator.
Там буквально 3 строчки.
лангольеры под окном жрали время ом-ном-ном

sipk
Интересующийся
Сообщения: 17
Зарегистрирован: 27 июл 2011, 23:16
Репутация: 0

Re: Google Maps и их сферические проекции

Сообщение sipk » 28 июл 2011, 09:56

Mavka писал(а):Формулы пересчета из OpenLayers:
SphericalMercator.js - ищите forwardMercator.
Там буквально 3 строчки.
Спасибо Вам, я понимаю, это перевод в метры Меркатора, а в моем случае мне из этих функций просто необходим пересчет параметров "lat" и "y" (соответственно, для прямого и обратного преобразования), т. е. без непосредственного перехода к метрам Меркатора. Но у меня получилось слишком большое смещение и объекты вовсе "унесло" далеко на север. Например широту в районе 54.997985 градусов СШ она пересчитывает приблизительно в 66.129256 градусов СШ. И здесь главный вопрос - как она может рассчитать это "радиальное искажение" по широте, не зная размеров (разброса широт) видимого "тайла" карты? Ведь оно зависит как раз от охватываемого этим "тайлом" карты диапазона широт. А сам растр Google Maps дан в сферической проекции (правда, не в метрах Меркатора, а в градусах). Так что это, скорее всего, не то, что нужно. Пожалуйста направьте, как можно правильно рассчитать широту в моем случае (постановка задачи описана в моем первом сообщении)? Большое спасибо за внимание!
P.S. Эти формулы мне знакомы, по моему аналогичны формулам в библиотеке proj4 для MapServer, но здесь частный случай, боюсь, задача может быть сложнее. По существу да, нужна именно проекция EPSG:4326, но так как растр дан в сферической проекции, то нужен расчет, исходя из его диапазона широт

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: Google Maps и их сферические проекции

Сообщение Mavka » 28 июл 2011, 11:34

Давайте тогда разберемся с СК:
epsg:4326 - на эллипсоиде WGS84
epsg:900913 - тоже (!) на эллипсоиде WGS84

Широта и долгота на гугло-шарике строго равна широте/долготе на WGS84. При проецировании берут широту с WGS84 и делают вид, что это была сфера, с которой потом получают метры. (Такая вот псевдо проекция.)

Если известны географические координаты гугло-тайла, то берете свой тайл с такими же координатами - по ширине/долготе они будет равными, а по высоте/широте тайл нужно вытянуть. Полученный тайл должен быть квадратным.
лангольеры под окном жрали время ом-ном-ном

sipk
Интересующийся
Сообщения: 17
Зарегистрирован: 27 июл 2011, 23:16
Репутация: 0

Re: Google Maps и их сферические проекции

Сообщение sipk » 28 июл 2011, 12:34

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 и их сферические проекции

Сообщение Mavka » 28 июл 2011, 13:43

Если гугла выдала долготу/широту, то это уже WGS84...
Что то не понимаю сути вопроса или логики работы Google Map API...

1. Имеем границы карты - левая lon1 и верхняя lat2 в градусах (extent.left и extent.top).
2. Преобразуем их в метры (см. forwardMercator выше).
3. Берем точку (lon,lat) в градусах.
4. Преобразуем в метры (forwardMercator).
5. Пересчитываем в экранные пиксели (getViewPortPxFromLonLat).
6. Наносим точку относительно края div'а.
лангольеры под окном жрали время ом-ном-ном

sipk
Интересующийся
Сообщения: 17
Зарегистрирован: 27 июл 2011, 23:16
Репутация: 0

Re: Google Maps и их сферические проекции

Сообщение sipk » 28 июл 2011, 14:09

Это да, только в моем случае имеется полученный от Google API растр и от него же координаты углов, а все расчеты мне необходимо делать уже без использования OpenLayers или родного API или любых других подобных средств в другой программе. Если бы с ними, вопрос бы не возник даже, там все нормально при помощи родного API от Google отображается правильно с первого раза. А так вот и не знаю, как рассчитать широту, нужен именно алгоритм или формула ее расчета для тайла Гугла, определенного координатами углов.
Если гугла выдала долготу/широту, то это уже WGS84...
В общем да, но сплющенный по широте, и чем больше тайл, тем сильнее это проявляется. Суть вопроса проста, как математически получить широту для растра гугла в задаче, описанной в моем предыдущем сообщении (долгота рассчитывается линейно).

sipk
Интересующийся
Сообщения: 17
Зарегистрирован: 27 июл 2011, 23:16
Репутация: 0

Re: Google Maps и их сферические проекции

Сообщение sipk » 28 июл 2011, 14:30

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 и все заработало. Спасибо Вам большое!

ArzArt
Новоприбывший
Сообщения: 12
Зарегистрирован: 03 авг 2011, 13:12
Репутация: 0

Re: Google Maps и их сферические проекции

Сообщение ArzArt » 04 авг 2011, 15:05

Здравствуйте,

У меня такая же проблема с пересчетом Y. Я сделал растровую карту jpg из SASPlanet с привязкой.
Если конвертирую проекцию карты в Geographic с помощью Global Mapper, то все координаты отображаются верно, но карта получается сплюснутой по вертикали (растянутой по горизонтали). Если этого не делать, и оставить в проекции Mercator, то неправильно вычисляется Y (по формулам из 3 строк, которые привел Mavka)

sipk как у Вас получилось выполнить пересчет Y, что за алгоритм пересчета?

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: Google Maps и их сферические проекции

Сообщение Mavka » 04 авг 2011, 15:44

Сплющенная: 1 и 2
лангольеры под окном жрали время ом-ном-ном

ArzArt
Новоприбывший
Сообщения: 12
Зарегистрирован: 03 авг 2011, 13:12
Репутация: 0

Re: Google Maps и их сферические проекции

Сообщение ArzArt » 04 авг 2011, 16:02

Да, я уже видел.
Но я не пойму, что мне можно сделать в данном случае? Недавно только начал вникать во все это.
Global Mapper отображает снизу формы и географические и Mercator координаты одновременно и правильно, при нормальном виде карты. Значит он их как-то конвертирует?

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: Google Maps и их сферические проекции

Сообщение Mavka » 04 авг 2011, 17:48

Координаты в WGS84 невозможно "нарисовать", точнее можно, но это получится 3-мерный шарик. Что бы его перевести в плоскость выбирают проекцию, она будет уже не в градусах, а в метрах. Тот же "Сферический гугл" - это проекция.

С Global Mapper я не работал, какую он проекцию подбирает для WGS84 по-умолчанию не знаю. Какой-нибудь Меркатор уже выглядит "не сплющенным".

У вас какая конечная цель? Своя программа? Хотите склеить и получить красивую карту? Для территории России хорошо подходит проекция Albers-Siberia.
Последний раз редактировалось Mavka 05 авг 2011, 17:14, всего редактировалось 1 раз.
лангольеры под окном жрали время ом-ном-ном

ArzArt
Новоприбывший
Сообщения: 12
Зарегистрирован: 03 авг 2011, 13:12
Репутация: 0

Re: Google Maps и их сферические проекции

Сообщение ArzArt » 05 авг 2011, 08:08

Ну скажем так программка, я уже склеил в файл 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 с привязкой по географическим координатам?

ArzArt
Новоприбывший
Сообщения: 12
Зарегистрирован: 03 авг 2011, 13:12
Репутация: 0

Re: Google Maps и их сферические проекции

Сообщение ArzArt » 05 авг 2011, 08:25

Похоже проблема решена.
Оказывается SASPlanet может делать файл привязки jpgw такого вида:

Код: Выделить всё

0.298582141738838
0
0
-0.298582141739165
4879235.8790704
7437711.00893191
И тогда все переводится правильно.

ggis
Завсегдатай
Сообщения: 302
Зарегистрирован: 31 окт 2008, 10:39
Репутация: 2

Re: Google Maps и их сферические проекции

Сообщение ggis » 05 авг 2011, 16:19

ArzArt писал(а):Похоже проблема решена.
Оказывается SASPlanet может делать файл привязки jpgw такого вида:

Код: Выделить всё

0.298582141738838
0
0
-0.298582141739165
4879235.8790704
7437711.00893191
И тогда все переводится правильно.
как задать сохранение файла привязки jpgw такого вида в SASPlanet ? Спасибо.

Ответить

Вернуться в «Веб-картография»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей