Благодарю за ответ, garl!
Это был бы идеальный вариант. К примеру, брать с сервера тайл 256х280, подрезать снизу до стандартных 256, а последующий нижестоящий тайл уже брать с поправкой на подрезку предыдущего. К сожалению, личные познания в Паскале оставляют желать лучшего. Может быть есть уже готовый скрипт для эстонской EPSG:3301, которой можно было бы использовать как пример для изучения?
Global Mapper
Модератор: Tolik
- garl
- Гуру
- Сообщения: 1625
- Зарегистрирован: 16 июл 2008, 14:40
- Откуда: Краснодар, Кубанская столица.
- Благодарил (а): 97 раз
- Поблагодарили: 272 раза
Re: Global Mapper
для начала сделайте себе zmp по аналогии с вот этимvalsw писал(а):Благодарю за ответ, garl!
Это был бы идеальный вариант. К примеру, брать с сервера тайл 256х280, подрезать снизу до стандартных 256, а последующий нижестоящий тайл уже брать с поправкой на подрезку предыдущего. К сожалению, личные познания в Паскале оставляют желать лучшего. Может быть есть уже готовый скрипт для эстонской EPSG:3301, которой можно было бы использовать как пример для изучения?
https://bitbucket.org/sas_team/sas.plus ... at=default
чтобы он брал тайлы 256*256 с нормальной привязкой и ватермарками, затем приступим к второй фазе операции : "обрезке копирайтов" ))
-
valsw
- Новичок
- Сообщения: 20
- Зарегистрирован: 22 апр 2014, 16:36
- Благодарил (а): 8 раз
- Поблагодарили: 9 раз
Re: Global Mapper
Добро, пробую. По params.txt вопросов не возникло, всё понятно. Последную строку прописал вот такую (нашёл в прикреплённом файле к теме про proj4.dll):garl писал(а):для начала сделайте себе zmp по аналогии с вот этим
https://bitbucket.org/sas_team/sas.plus ... at=default
чтобы он брал тайлы 256*256 с нормальной привязкой и ватермарками, затем приступим к второй фазе операции : "обрезке копирайтов" ))
Proj4Args=+proj=lcc +lat_1=59.33333333333334 +lat_2=58 +lat_0=57.51755393055556 +lon_0=24 +x_0=500000 +y_0=6375000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs
Со скриптом разобраться пока не получается. Изменяемая часть URL для сервера следующего вида (отследил при работе GM):
350000,6350000,750000,6650000&WIDTH=1164&HEIGHT=873 (рабочая поверхность всей карты, но на данном минимальном масштабе карта не видна в GM)
Четыре числа подряд- Y, X, Y, X левого нижнего и правого верхнего углов соответственно в EPSG:3301. Отсчёт ведётся от левого нижнего угла. Масштаб отдаваемого тайла явно в URL не задаётся, и похоже, что определяется соотношением координат углов с размерами отдаваемого тайла. Вот изменяемая часть URL при минимальном масштабе, на котором карта становится видна в GM:
574477.403,6513061.922,587844.952,6519445.694&WIDTH=1919&HEIGHT=916
-
valsw
- Новичок
- Сообщения: 20
- Зарегистрирован: 22 апр 2014, 16:36
- Благодарил (а): 8 раз
- Поблагодарили: 9 раз
Re: Global Mapper
Разобрался. Пришла мысль, т.к. тайлы всегда будем брать постоянного размера, то решил перенести &WIDTH=256&HEIGHT=256 в DefURLBase. Проверил браузером изменённый URL - тайл карты загрузился. Затем убрал из скрипта запрос зума (9), строка выглядит теперь так:valsw писал(а):Со скриптом разобраться пока не получается.
ResultURL := GetURLBase + RoundEx(M.X) + ',' + RoundEx(N.Y) + ',' + RoundEx(N.X) + ',' + RoundEx(M.Y);
Запустил SAS.Планету и карта загружается на 14 и 15 зумах!
Привязка карты есть, проверил по OSM-слою, дороги примерно совпадают. Но пока не работает перепроецирование из LCC в Меркатор. На границе зон О-34 и О-35 расхождения практически не заметны, но чем дальше на восток, тем "недоворот" до Меркатора всё больше и больше. Пример в приложенном файле. К сожалению, сервер тайлы отдаёт в формате png, а это значит, что из-за недостатка цветов при трансформации тайлов появятся неприятные искажения на прямых линиях. И есть небольшое несовпадение с бланковкой ГШ по долготе. Но, по-любому, дело сдвинулось с мёртвой точки, и я весьма благодарен вам за участие и помощь!
- garl
- Гуру
- Сообщения: 1625
- Зарегистрирован: 16 июл 2008, 14:40
- Откуда: Краснодар, Кубанская столица.
- Благодарил (а): 97 раз
- Поблагодарили: 272 раза
-
valsw
- Новичок
- Сообщения: 20
- Зарегистрирован: 22 апр 2014, 16:36
- Благодарил (а): 8 раз
- Поблагодарили: 9 раз
Re: Global Mapper
garl, проверил браузером на рабочем URL 3785, а заодно до кучи и 3395 с 4326, тайл не отдаёт и выдаёт ошибку (файл application/vnd.ogc.se_xml). Похоже на то, что действительно работает лишь в 3301. И без явного указания в URL SRS=EPSG:3301 таже самая ошибка.
-
zed
- Гуру
- Сообщения: 2888
- Зарегистрирован: 16 авг 2008, 20:21
- Благодарил (а): 89 раз
- Поблагодарили: 568 раз
Re: Global Mapper
Обсуждение wms в этой теме несколько оффтопно, но коль уж начали, то присоединюсь.
1. У wms нельзя запрашивать тайлы 256*256 pix, если он не поддерживает проекции, известные SAS
2. Разрешение тайла в запросе нужно вычислять, для каждого тайла отдельно
3. Полученный от сервера тайл нужно перепроецировать в одну из поддерживаемых в SAS проекций
4. После перепроецирования, мы должны получить тайл 256*256 pix, который уже можно скармливать SAS
Таким образом, у нас 2 проблемы: как вычислить разрешение тайла для запроса и как перепроецировать полученный тайл. И решить эти проблемы сходу не получится - SAS пока что не готов к такому "из коробки", поэтому придётся программировать на стороне пользователя. Опять же, на стороне пользователя возможны 2 варианта: написание dll, которую можно вызывать из zmp (старожилы помнят как раньше работали Яндекс.Пробки? Ага, через dll, написанную пользователем и подключённую к zmp) и написание и встраивание проксика между SAS и wms.
Ну а теперь про то, как теоретически решаются проблемы. Есть такая библиотека и набор консольных утилит, под одним общим названием - GDAL, в которой есть возможность перепроецировать растры между всеми известными науке проекциями (юзается proj4). И всё становится очень просто. Для начала, нам нужно взять "бланк" тайла 256*256 pix в проекции A, которую поддерживает SAS и перепроецировать его в проекцию B, в которой отдаёт тайлы наш wms. Таким образом, мы получим бланк тайла, разрешением Wb*Hb и именно это разрешение и нужно будет подставить в запрос к серверу. Над полученным же от сервера тайлом, мы должны проделать обратную операцию: из проекции B, тайл (уже тайл, а не бланк) разрешением Wb*Hb перепроецировать в проекцию A, получив тайл разрешением Wa*Ha, которое, в итоге, должно точно равняться заветным 256*256 pix. И только после всех этих мытарств мы можем со спокойной душой отдавать тайл SAS - никаких смещений не будет (зато появятся артефакты от перепроецирования - возможно сильные, возможно и незаметные, но тут уж не попишешь...).
У GDAL есть API для кучи языков:
1. У wms нельзя запрашивать тайлы 256*256 pix, если он не поддерживает проекции, известные SAS
2. Разрешение тайла в запросе нужно вычислять, для каждого тайла отдельно
3. Полученный от сервера тайл нужно перепроецировать в одну из поддерживаемых в SAS проекций
4. После перепроецирования, мы должны получить тайл 256*256 pix, который уже можно скармливать SAS
Таким образом, у нас 2 проблемы: как вычислить разрешение тайла для запроса и как перепроецировать полученный тайл. И решить эти проблемы сходу не получится - SAS пока что не готов к такому "из коробки", поэтому придётся программировать на стороне пользователя. Опять же, на стороне пользователя возможны 2 варианта: написание dll, которую можно вызывать из zmp (старожилы помнят как раньше работали Яндекс.Пробки? Ага, через dll, написанную пользователем и подключённую к zmp) и написание и встраивание проксика между SAS и wms.
Ну а теперь про то, как теоретически решаются проблемы. Есть такая библиотека и набор консольных утилит, под одним общим названием - GDAL, в которой есть возможность перепроецировать растры между всеми известными науке проекциями (юзается proj4). И всё становится очень просто. Для начала, нам нужно взять "бланк" тайла 256*256 pix в проекции A, которую поддерживает SAS и перепроецировать его в проекцию B, в которой отдаёт тайлы наш wms. Таким образом, мы получим бланк тайла, разрешением Wb*Hb и именно это разрешение и нужно будет подставить в запрос к серверу. Над полученным же от сервера тайлом, мы должны проделать обратную операцию: из проекции B, тайл (уже тайл, а не бланк) разрешением Wb*Hb перепроецировать в проекцию A, получив тайл разрешением Wa*Ha, которое, в итоге, должно точно равняться заветным 256*256 pix. И только после всех этих мытарств мы можем со спокойной душой отдавать тайл SAS - никаких смещений не будет (зато появятся артефакты от перепроецирования - возможно сильные, возможно и незаметные, но тут уж не попишешь...).
У GDAL есть API для кучи языков:
Плюс, как я уже упоминал - консольные утилиты, которые можно смело использовать откуда угодно, пусть и с накладными расходами. Для перепроецирования тайлов достаточно утилиты gdalwarp.C
C++
Perl
Python
VB6 Bindings (not using SWIG)
Java
C# / .Net
Ruby
R
-
valsw
- Новичок
- Сообщения: 20
- Зарегистрирован: 22 апр 2014, 16:36
- Благодарил (а): 8 раз
- Поблагодарили: 9 раз
Re: Global Mapper
zed, благодарю, что откликнулись! И простите за оффтоп.
Тактика понятна. Буду эксперементировать. Немного недопонял лишь это:
&WIDTH=Wb&HEIGHT=Hb
Правильно мыслю? Как думаете, чем можно будет определять разрешение полученного тайла в проекции B, чтобы передавать параметры Wb*Hb скрипту для запроса?
Если получится, то карта будет с логотипом на каждом тайле. Выводить "на лету" (изучил тему) из-за возможных артефактов не вариант, потому что это карта, а не снимок. Остаётся только подрезать, благо логотип постояннен по местоположению на каждом тайле. Новая "засада"
Может, всё таки проще заставить Global Mapper брать строки высотой 512 со смещением на подрезку предыдущей строки? Тайлы у него, судя по информации в данной теме, 512х512.
Тактика понятна. Буду эксперементировать. Немного недопонял лишь это:
Откуда же его взять, если WMS категорически не поддерживает проекцию SAS? Думаю, что, с какой-нибудь другой карты той же местности в проекции 3785 и индентичного зума. Т.е. с другого онлайн-источника, но, наверное, одновременное подключение к двум картам в SAS невозможно, значит тогда прямо из полного рабочего кэша другой карты. Тогда это будет уже не "бланк" тайла, но ведь картинка на нём никакой роли не играет. Строка скрипта, в которой фомируется изменяемая часть URL, останется прежней, за исключением того, что добавится концовка (её нужно будет написать в соответствии с правилами Паскаля):zed писал(а):Для начала, нам нужно взять "бланк" тайла 256*256 pix в проекции A, которую поддерживает SAS
&WIDTH=Wb&HEIGHT=Hb
Правильно мыслю? Как думаете, чем можно будет определять разрешение полученного тайла в проекции B, чтобы передавать параметры Wb*Hb скрипту для запроса?
А это, наверное, возможно решить путём перегона "на лету" полученного от сервера тайла в проекции B перед перепроецированием его в проекцию А в полноцветный BMP консольными утилитами из пакета ImageMagick.zed писал(а):зато появятся артефакты от перепроецирования - возможно сильные, возможно и незаметные, но тут уж не попишешь...
Если получится, то карта будет с логотипом на каждом тайле. Выводить "на лету" (изучил тему) из-за возможных артефактов не вариант, потому что это карта, а не снимок. Остаётся только подрезать, благо логотип постояннен по местоположению на каждом тайле. Новая "засада"
-
zed
- Гуру
- Сообщения: 2888
- Зарегистрирован: 16 авг 2008, 20:21
- Благодарил (а): 89 раз
- Поблагодарили: 568 раз
Re: Global Mapper
Координаты углов тайла взять в скрипте, они там есть, а сам тайл-бланк - сгенерировать как обычную пустую битмапку 256*256 pix. Просто gdalwarp работает с растрами, вот и нужен бланк, чтобы он что-то смог перепроецировать, в проекцию B. По-хорошему, если знать алгоритм перехода из проекции А в В, то можно и без растра пересчитать пиксели и вычислить конечное разрешение Wb*Hb, но это нужно лезть в дебри GDAL.valsw писал(а):Откуда же его взять
Да.valsw писал(а):Строка скрипта, в которой фомируется изменяемая часть URL, останется прежней, за исключением того, что добавится концовка (её нужно будет написать в соответствии с правилами Паскаля):
&WIDTH=Wb&HEIGHT=Hb
Как я уже говорил, определять можно средствами GDAL. А GDAL можно использовать либо через свою dll в zmp, либо через свой проксик. Кстати, я в предыдущем посте упустил один момент - из скрипта мы не сможем сделать полноценное перепроецирование полученного тайла из В в А, т.к. в SAS нету скриптовой постобработки ответа сервера. Но тайл автоматом приведётся к разрешению 256*256 pix, правда, линейным алгоритмом, что вероятно несколько снизит точность наложения растра. Хотя, сейчас этот линейный алгоритм используется для отображения тайлов из кэша GoogleEarth и особых проблем с точность там не заметно.valsw писал(а):Как думаете, чем можно будет определять разрешение полученного тайла в проекции B, чтобы передавать параметры Wb*Hb скрипту для запроса?
Перепроецирование и так работает с полноцветными растрами, так что дополнительно там ничего не нужно вкорячивать.valsw писал(а):А это, наверное, возможно решить путём перегона "на лету" полученного от сервера тайла в проекции B перед перепроецированием его в проекцию А в полноцветный BMP консольными утилитами из пакета ImageMagick.
Вот по этому поводу ничего сказать не могу.valsw писал(а):Может, всё таки проще заставить Global Mapper брать строки высотой 512 со смещением на подрезку предыдущей строки? Тайлы у него, судя по информации в данной теме, 512х512.
Re: Global Mapper
Столкнулся с проблемой подготовки в GM (v.16) карты для Саспланеты (Палеарктика).
Исходник: http://www.zin.ru/animalia/coleoptera/i ... arctic.gif (1,1 Мб).
Собственно, карту привязываю в GM по узлам сетки (по всем), меняю проекцию на Меркатора и режу на тайлы, все работает, но карта не ложится - в средних широтах, до 60 градуса с.ш. все более-менее хорошо, но чем дальше на север, тем хуже. 70-я параллель карты отображается почти на 40 км южнее, чем должна, 80-я - на 20 км.
Потыкавшись, пришел к мысли, что, вероятно, исходно неправильно определил проекцию карты - я решил, что это равновеликая эллиптическая Эккерта (Eckert IV), что, вероятно, не так
.
Подскажите, в чем я ошибся - если в проекции, можно ли как ее определить точно на такой картинке?
___________
Нарезанная для САСа карта (z1-z4) с zmp, 5,2 Мб http://rusfolder.com/42672237
Исходник: http://www.zin.ru/animalia/coleoptera/i ... arctic.gif (1,1 Мб).
Собственно, карту привязываю в GM по узлам сетки (по всем), меняю проекцию на Меркатора и режу на тайлы, все работает, но карта не ложится - в средних широтах, до 60 градуса с.ш. все более-менее хорошо, но чем дальше на север, тем хуже. 70-я параллель карты отображается почти на 40 км южнее, чем должна, 80-я - на 20 км.
Потыкавшись, пришел к мысли, что, вероятно, исходно неправильно определил проекцию карты - я решил, что это равновеликая эллиптическая Эккерта (Eckert IV), что, вероятно, не так
Подскажите, в чем я ошибся - если в проекции, можно ли как ее определить точно на такой картинке?
___________
Нарезанная для САСа карта (z1-z4) с zmp, 5,2 Мб http://rusfolder.com/42672237