Вам нужно больше информации, чем просто одна широта / долгота, чтобы сделать это.
На данном этапе в предоставленной вами информации отсутствуют две вещи:
- Какую площадь покрывает ваше изображение (в широте / долготе)? Исходя из того, что вы предоставили, я не знаю, показывает ли изображение область шириной метр или километр.
- к какой точке вашего изображения относится ваша опорная координата (-37.803134, 145.132377)? Это один из углов? Посередине где-то?
Я также собираюсь предположить, что ваше изображение выровнено на север / юг - например, оно не имеет севера, указывающего на верхний левый угол. Это может усложнить ситуацию.
Самый простой подход - точно определить, какие координаты широта / долгота соответствуют пикселю (0, 0) и пикселю (1017, 915). Затем вы можете вычислить пиксель, соответствующий данной координате широты / долготы, через интерполяция .
Чтобы кратко описать этот процесс, представьте, что ваш (-37.803134, 145.132377) широта / долгота соответствует вашему (0, 0) пикселю, и что вы обнаружили, что ваш (1017, 915) пиксель соответствует широте / длинный (-37,798917, 145,138535). Предполагая обычное соглашение с пикселем (0, 0) в левом нижнем углу, это означает, что север в изображении вверх.
Затем, если вас интересуют координаты цели (-37.801465, 145.134984), вы можете определить соответствующее количество пикселей на изображении следующим образом:
pixelY = ((targetLat - minLat) / (maxLat - minLat)) * (maxYPixel - minYPixel)
= ((-37.801465 - -37.803134) / (-37.798917 - -37.803134)) * (915 - 0)
= 362.138
То есть соответствующий пиксель находится на расстоянии 362 пикселя от нижней части изображения. Затем вы можете сделать то же самое для горизонтального размещения пикселей, но вместо этого использовать долготы и X пикселей.
Деталь ((targetLat - minLat) / (maxLat - minLat))
определяет, как далеко вы находитесь между двумя опорными координатами, и дает 0, чтобы указать, что вы находитесь на первой, 1, чтобы обозначить вторую, и цифры между ними, чтобы указать места между ними. Так, например, было бы выведено 0,25, чтобы указать, что вы находитесь на 25% пути на север между двумя опорными координатами. Последний бит преобразует это в эквивалентные пиксели.
НТН!
РЕДАКТИРОВАТЬ Хорошо, основываясь на вашем комментарии, я могу быть немного более конкретным. Учитывая, что вы, кажется, используете верхний левый угол в качестве основной контрольной точки, я буду использовать следующие определения:
minLat = -37.803134
maxLat = -37.806232
MAP_HEIGHT = 916
Тогда, если мы используем примерную координату (-37.804465, 145.134984), координата Y соответствующего пикселя относительно верхнего левого угла будет равна:
pixelY = ((targetLat - minLat) / (maxLat - minLat)) * (MAP_HEIGHT - 1)
= ((-37.804465 - -37.803134) / (-37.806232 - -37.803134)) * 915
= 393.11
Следовательно, соответствующий пиксель находится сверху вниз на 393 пикселя. Я позволю вам разработать горизонтальный эквивалент для себя - это в основном то же самое. ПРИМЕЧАНИЕ * * -1
с MAP_HEIGHT
потому, что если вы начинаете с нуля, максимальное число пикселей будет 915, а не 916.
РЕДАКТИРОВАТЬ: Я хотел бы воспользоваться возможностью, чтобы указать, что это приблизительное. В действительности не существует простой линейной связи между координатами широты и долготы и другими формами декартовых координат по ряду причин, включая проекции, которые используются при создании карт, и тот факт, что Земля не является идеальной сферой. В небольших областях это приближение достаточно близко, чтобы не иметь существенных различий, но в более крупных масштабах расхождения могут стать очевидными. В зависимости от ваших потребностей, YMMV. (Мое спасибо Урайу, чей ответ ниже напомнил мне, что это так).