Привязка растра по точкам (как в QGIS)

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
Volk
Новоприбывший
Сообщения: 3
Зарегистрирован: 25 янв 2018, 20:08
Репутация: 0
Откуда: Новочеркасск

Привязка растра по точкам (как в QGIS)

Сообщение Volk » 25 янв 2018, 20:40

Здравствуйте. Задача в следующая, необходимо в web-приложении (php) сделать привязку растровых изображений к карте, на подобии того, как это реализовано в QGIS http://gis-lab.info/qa/georef-qgis.html, т.е. пользователь выбирает несколько точек на загруженном изображении, затем несколько точек им соответствующих на карте и нажимает привязать. Изображение должно (возможно дифформироваться) отобразится на карте привязанным за эти точки. Подскажите возможно ли это сделать средствами MapServer-а или тут нужно будет прибегнуть к помощи библиотеки GDAL http://gis-lab.info/qa/georef-gdal.html? Если да, то что у неё (GDAL) будет на выходе geotif, который сразу можно кидать на растровый слой или же будет сгенерино новое изображение в том же формате + world файл? Как вообще это делается? Куда смотреть? В какую сторону копать? Может кто то делал, подскажите.

Аватара пользователя
antonv
Активный участник
Сообщения: 229
Зарегистрирован: 29 ноя 2016, 10:44
Репутация: 114
Откуда: Санкт-Петербург

Re: Привязка растра по точкам (как в QGIS)

Сообщение antonv » 27 янв 2018, 16:45

У меня была похожая задача, решить которую требовалось совсем топорно. Нужно было сделать так, чтобы после загрузки пользователем на сервер geotiff-растра, его превьюшка отобразилась бы на мини-карте.
Сделано было так: мини-карта создана при помощи leaflet.js, на ней какая-то растровая подложка для красоты. Пользователь аплоадит свой geotiff, библиотека GDAL конвертирует растр в какой-то совсем легковесный (geotiff-то весит ого-го, но для превьюшки его можно как угодно пережать) png или jpg, не помню, попутно меняя проекцию файла на проекцию, соответствующую мини-карте в leaflet.js. В leaflet можно накладывать прямоугольный растровый оверлей по координатам углов, а для этого необходимо, чтобы превьюшка в проекции мини-карты оказалась прямоугольной (а не раскореженной трапецией - ведь пользователь может загружать картинку в любой проекции). А дальше тем же самым GDAL вытаскиваем координаты двух углов, отправляем назад клиенту превьюшку с этими координатами, кладём на карту leaflet. Гонять лишний раз geotiff туда-сюда точно не стоит.
Применительно к вашей задаче остается вначале передать на сервер пары координат для точек привязки, и запустить сам процесс привязки. Поправьте, если не прав, но сделать это можно функцией gdal_warp
Это если топорно и без MapServer, только gdal, PHP и JS

Volk
Новоприбывший
Сообщения: 3
Зарегистрирован: 25 янв 2018, 20:08
Репутация: 0
Откуда: Новочеркасск

Re: Привязка растра по точкам (как в QGIS)

Сообщение Volk » 28 янв 2018, 16:36

Да, вы правы скорее всего вы правы, надо использовать как в статье http://gis-lab.info/qa/georef-gdal.html сначала gdal_translate, затем gdal_warp, но вот только что использовать в качестве аргументов -s_srs и -t_srs? Что только не пробовал, пишет "ERROR: 1 failed to compute gcp transform. transform is not solvable" Пробовал и просто

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

gdalwarp.exe output.tif result.tif
Как я понимаю, описаные в примере +datum=Pulkovo_1942" - это какие то пресеты QGIS, а что делать, когда GDAL голая из MS4W ? Вообще, как я понял, в моём случае (да и в примере тоже) функцией gdal_translate, я связал координаты изображения с географическими координатами, поэтому мне остается всего лишь произвести преобразование растра посредством gdal_warp без преобразования системы координат, т.е. просто

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

gdalwarp.exe output.tif result.tif
, но увы и этот код выкидывает ошибку!.. Что я делаю не так?

freeExec
Гуру
Сообщения: 1195
Зарегистрирован: 23 апр 2011, 10:32
Репутация: 205
Откуда: Ульяновск

Re: Привязка растра по точкам (как в QGIS)

Сообщение freeExec » 28 янв 2018, 16:44

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

+datum=Pulkovo_1942
Это параметры proj4, а никакие не пресеты qgis.

Аватара пользователя
antonv
Активный участник
Сообщения: 229
Зарегистрирован: 29 ноя 2016, 10:44
Репутация: 114
Откуда: Санкт-Петербург

Re: Привязка растра по точкам (как в QGIS)

Сообщение antonv » 29 янв 2018, 12:22

Попробуйте всё-таки явно указать параметры -s_srs и -t_srs - они должны быть одинаковы и указывать ту систему координат, в которую пользователь хочет привязать растр. То есть если пары координат точек привязки вы указываете как "-gcp X_в_пикс_исходного_изображения Y_в_пикс_исходного_изображения Lon Lat" - то в -s_srs и -t_srs надо указать СК для Lon и Lat.
freeExec писал(а):
28 янв 2018, 16:44
Это параметры proj4, а никакие не пресеты qgis.
На гис-лабе есть статья о том, как в PROJ4 указать параметры. Они не зависят от того, установлен ли у вас QGIS, GDAL их должен их осилить.

Volk
Новоприбывший
Сообщения: 3
Зарегистрирован: 25 янв 2018, 20:08
Репутация: 0
Откуда: Новочеркасск

Re: Привязка растра по точкам (как в QGIS)

Сообщение Volk » 30 янв 2018, 16:03

Спасибо, большое! Немного разобрался, буду пробовать. Единственное, что не до конца понятно, это где будет хранится информация о привязке, если я запущу ф-ию gdal_translate для .jpeg или .png и на выходе укажу тоже .jpeg или .png ? А потом для получившегося файла (допустим это будет output.jpeg) запущу gdal_warp... откуда он узнает про те координаты, что я вводил в функции gdal_translate?..

Аватара пользователя
antonv
Активный участник
Сообщения: 229
Зарегистрирован: 29 ноя 2016, 10:44
Репутация: 114
Откуда: Санкт-Петербург

Re: Привязка растра по точкам (как в QGIS)

Сообщение antonv » 30 янв 2018, 16:33

При помощи gdalinfo можно узнать координаты углов изображения (того geotiff'а, который был привязан в нужную СК), а потом положить .jpg или .png по этим координатам куда нужно (leaflet.js, например, нужны координаты двух углов прямоугольника)

Ответить

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

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

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