Клуб API Карт

Вычисление расстояний по пиксельным координатам

Пост в архиве.

Доброго времени суток!

 Не могу найти информацию - существует ли линейная зависимость между пиксельными координатами? Если да, то какая?

Есть две точки с известными пиксельными координатами в масштабе 18 возможно ли вычислить между ними расстояние используя операции сложения, умножения и извлечения корня?

 

 

13 комментариев

Нашёл решение. Если расстояние в метрах умножить на 1,53 - получим расстояние в пикселах в масштабе 17. Цифра получена эмпирически. Буду благодарен, если кто-то подскажет теоретическое значение коэффициента.

Алексей Беляев
28 января 2016, 05:55
Полагаю, что этот коэфф. зависит от широты места, поэтому ваше значение актуально для того мста, где вы экспериментировали

Вообще изображение в тайле является снимком местности, которое получено со спутника с фиксированой разрешающей способностью. Соответственно размер точки не зависит от части земного шара. Кроме того линейка масштаба на карте не зависит от широты и долготы.

 

Как раз таки геокоординаты не имеют линейного преобразования в метры.

Алексей Беляев
28 января 2016, 05:55
Максим, сделайте эксперимент - откройте Яндекс карты, заметьте значение масштаба на линейке внизу и походите вдоль меридиана. Заметьте изменение цифр масштаба.
Что касается тайлов - Яндекс публикует не сырые снимки с фикс. разреш. способностью, а обработанные, приведенные к единому виду и масштабу.
Что касается линейности - в исходном посте вы упоминали корень, что теоретически дает вам возможность уйти из линейных преобразований

Да действительно, при одном и том же масштабе отображения в районе северного ледовитого океана масштаб на линейке изменяется скачкообразно в 2 раза, при этом какого-либо стыка на картинках не видно. Зато по территории России проблем я не заметил. Расстояние между москвой и екб - вполне поддаётся пиксельной оценке.

И москва - владивосток в пикселях тоже вычисляется нормально....

Sergey Konstantinov
28 января 2016, 05:55

Во-первых, вам какое расстояние надо - кратчайшее или "по прямой"? Это разные вещи.

Если вас устраивает "по прямой", то в пиксельных координатах более-менее похожее на правду расстояние будет получаться для объектов с одинаковой широтой.

Кратчайшее расстояние посчитать без привлечения сферической тригонометрии нельзя даже для городов, лежащих на одной широте.

Не важно. Мне надо найти объекты в радиусе от определенной точки. Это всё достаточно условно. И измеряется восновном в радиусе 100-10000 метров.

Точки хранятся в базе SQL - их десятки тысяч. Провести над ними тригонометрическую операцию темболее внутри SQL запроса представляется невозможным. А с простым умножением выборка проходит очень быстро.

 

А вообще разве декартовы координаты (частным случаем которыхх являются пиксельные) введены в систему разве не для подобного упрощения расчётов??

 

Sergey Konstantinov
28 января 2016, 05:55

Дело в том, что преобразование географические координаты декартовые не сохраняет расстояние; в меркаторовской проекции карта тянется к полюсам.

Т.о. круг на экране монитора будет представлять собой какую-то кривую на глобусе и наоборот.

А чем вас не устраивает вариант "выбрать все точки в радиусе меньше 1000 пикселей", если вам не важна точность на больших расстояниях?

Заказчику необходимы метры. Представляете себе отчёт маркетолога: "продажи в зоне 1000 пикселей от центра города составляют..." )))

Sergey Konstantinov
28 января 2016, 05:55

Ну, если очень приближённо, то плотность пикселы/метр вычисляется примерно так:

256 * 2^^17 / (40075016 * cos(lat))

256 * 2^^17 = 2^^25 - ширина "мира" в пикселах

40075016 - длина экватора в метрах. На широте lat длина параллели равна 40075016 * cos(lat)

Широта здесь в радианах. Косинус база считать умеет?

Да, умеет. Попробую как это получится. Хотя на десятках тысяч записей такой запрос будет выполняться существенно долбше умножения (

Sergey Konstantinov
28 января 2016, 05:55

Проще всего перевести в геокоординаты и посчитать расстояние в них.