Поиск точек на растре с помощью PROJ4

Системы координат, проекции, преобразования, привязка
Ответить
Sinferno
Новоприбывший
Сообщения: 4
Зарегистрирован: 20 ноя 2020, 15:49
Репутация: 0
Откуда: Краснодарский край

Поиск точек на растре с помощью PROJ4

Сообщение Sinferno » 20 ноя 2020, 15:56

Здравствуйте все.
Сразу заявляю, что я в этой теме абсолютный ноль, поэтому прошу не ругаться .
Задача у меня такая: есть растр с данными привязки (таблица соответствия растровых точек и геокоординат), описанием геоида, проекции и тд.
Необходимо написать программу, которая загружает растр, а потом по введённым геокоординатам находит точку на растре. Решил использовать Proj4. Есть dll, которая импортирует функции pj_fwd и pj_inv. Но после двух дней непрерывных опытов и гугления ничего не получилось. Вся найденная информация касается или других задач, или гисовских программ.
Почему пишу свою программу? Растр в формате BSB. Нужно рисовать на нём определенные фигуры и знаки, вырезать и сохранять в bmp фрагменты с предварительной обработкой.
Прошу помочь и направить в нужное русло. Заранее благодарен.

trir
Гуру
Сообщения: 5271
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1013
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Поиск точек на растре с помощью PROJ4

Сообщение trir » 20 ноя 2020, 16:03


Sinferno
Новоприбывший
Сообщения: 4
Зарегистрирован: 20 ноя 2020, 15:49
Репутация: 0
Откуда: Краснодарский край

Re: Поиск точек на растре с помощью PROJ4

Сообщение Sinferno » 20 ноя 2020, 16:12

Внутри gdal, как я понимаю, работает proj4. (?) Из пушки по воробьям. К тому же, я не знаю, как подступиться и в gdal. Одна надежда, что специ подскажут, как работать в этом случае с proj4. Я в своё время реализовал меркаторскую и поликоническую на чистой математике. Но добавилось много новых и мозги уже не справляются.

gamm
Гуру
Сообщения: 4044
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1049
Ваше звание: программист
Откуда: Казань

Re: Поиск точек на растре с помощью PROJ4

Сообщение gamm » 20 ноя 2020, 16:13

Sinferno писал(а):
20 ноя 2020, 15:56
направить
Не очень понятно, в чем проблема.
1. Пересчет координат в пиксели - линейные функции (в проекции), функции получаются из привязки решением двух систем уравнений, нужно минимум 3 точки не на одной прямой.
2. Пересчет географии в проекцию - PROJ
3. Вставляем 2 в 1 => profit

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

Re: Поиск точек на растре с помощью PROJ4

Сообщение antonv » 20 ноя 2020, 16:29

Sinferno, gdal может быть и из пушки по воробьям, но неужели вы хотите поэтому написать свой собственный gdal?:)
Смотрите, есть такая штука :gdallocationinfo

Sinferno
Новоприбывший
Сообщения: 4
Зарегистрирован: 20 ноя 2020, 15:49
Репутация: 0
Откуда: Краснодарский край

Re: Поиск точек на растре с помощью PROJ4

Сообщение Sinferno » 24 ноя 2020, 14:25

Ещё раз, здравствуйте. Спасибо за ответы. Сегодня добрался к своей задаче.

to antonv: поизучал gdal в общем и gdallocationinfo. Утилита не очень подходит, т.к. ввод и вывод у неё в файлы. Внедрять её в свою прогу – будут жуткие тормоза. Писать самому gdal необходимости нет, т.к. отрисовка у меня есть своя, очень быстрая. Нужна только привязка. Поэтому склоняюсь к proj.

To gamm: Проблема, практически во всём, даже в терминологии. Точки (таблица соответствия пикселей и координат) у меня есть. Где найти указанные формулы? У меня уже в глазах рябит от этих формул. «Пересчёт географии в проекцию» - для меня тоже неясный термин. Я инициализировал proj следующей строкой:
+proj=tmerc +ellps=GRS80 + datum=WGS84, если убираю эллипс – ничего не меняется.
Потом юзаю pj_fwd из proj_.dll. Для теста передаю данные из таблицы привязок. Но не получаю значения пикселей. Возможно, это метры. Описывать все свои глупости не стану. Лучше сам послушаю что-нибудь умное.

В принципе, меня бы устроила ссылка на математику. Надо реализовать Transverse Mercator и Polar Stereographic. В идеале должен иметь следующее: X,Y= magic(long, lat); Просто Mercator я реализовал получением коэффициентов между градусными и пиксельными размерами карты. Только для широт вычислял и убавлял «меридиональные части», чтобы компенсировать неравномерность по широте. Обратная операция из пикселей в градусы – численным методом. Для Polyconic своя математика, которую я уже не понимаю, глядя на код.

gamm
Гуру
Сообщения: 4044
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1049
Ваше звание: программист
Откуда: Казань

Re: Поиск точек на растре с помощью PROJ4

Сообщение gamm » 24 ноя 2020, 17:22

Sinferno писал(а):
24 ноя 2020, 14:25
Где найти указанные формулы?
в учебнике геометрии за 9 примерно класс ...

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

Re: Поиск точек на растре с помощью PROJ4

Сообщение antonv » 24 ноя 2020, 20:07

Sinferno, на каком языке программу пишите? GDAL - это прежде всего библиотека, у которой есть API: https://gdal.org/api/. Зачем писать самому велосипед, когда можно использовать готовую либу с какими хочешь пересчётами координат?

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

Re: Поиск точек на растре с помощью PROJ4

Сообщение antonv » 25 ноя 2020, 10:57

gamm,
в учебнике геометрии за 9 примерно класс ...
Хорошая у вас школа была. У меня вот маткартография только на четвёртом курсе появилась:)

gamm
Гуру
Сообщения: 4044
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1049
Ваше звание: программист
Откуда: Казань

Re: Поиск точек на растре с помощью PROJ4

Сообщение gamm » 25 ноя 2020, 11:08

antonv писал(а):
25 ноя 2020, 10:57
Хорошая у вас школа была. У меня вот маткартография только на четвёртом курсе появилась:)
товарищу маткартография не нужна, ее PROG делает. Ему нужно повернуть декартову систему систему координат, и масштаб поменять, чтобы совместить декартову систему координат проекции с пиксельной.

Sinferno
Новоприбывший
Сообщения: 4
Зарегистрирован: 20 ноя 2020, 15:49
Репутация: 0
Откуда: Краснодарский край

Re: Поиск точек на растре с помощью PROJ4

Сообщение Sinferno » 30 ноя 2020, 13:51

Опять, здравствуйте.
Попытаюсь ответить на все вопросы и задать свои. Пишу на Delphi, gdal не хочу использовать, потому что там куча библиотек, то что нашёл, требует установки в систему(или это только копирование в системную папку?). А программа будет работать на множестве компов с системами от XP до Win10. Как оно себя поведет? Proj подходит более.
Если сетка под углом, поворачиваю. Инициализирую строкой +proj=merc +units=m +datum=WGS84. Merc – для теста, потому что уже есть свой алгоритм привязки. Могу ещё и эллипсоид указать. Из исходных данных получаю верхнюю левую точку (гео. координаты и пиксели), юниты (в данном случае метры), сколько этих юнитов в пикселе по осям (возможно, для какой-то средней широты).
Всегда перевожу градусы в радианы. Используя pj_fwd() получаю некие точки для верхней левой координаты. В терминах прочитанных материалов по конкретной библе передаю точки с суффиксом «LP» в наименовании, а получаю с «XY». Что это за значения? Предполагаю, что метры, так как меняя units получаю другие значения. Делю эти значения на величину «юнитов в пикселе» и, предположительно, получаю количество пикселей «от начала мира». Такую же операцию провожу для искомой точки. А потом получаю разность «пикселей». Но значения совсем не бьются с найденными математически, даже в пределы изображения не попадают.
К сожалению, могу уделять этой задаче часа 3-4 в день, поэтому очень надеялся на помощь знающих людей. Где-то туплю, но свою глупость всегда сложно увидеть.
Из dll ещё экспортирую pj_inv, но это просто обратная операция. Ещё есть pj_transform. Вот её прототип на паскале:
function(src,dst:PProjPJ;point_count:DWORD;point_offset:Integer; x,y,z:PDoubleArray):integer; cdecl;
PProjPJ – это указатель, который возвращает pj_init, т.е. контекст. PDoubleArray – указатель на массив в стиле СИ.

Ответить

Вернуться в «Координаты и привязка»

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

Сейчас этот форум просматривают: UlvHare и 8 гостей