@Oihoo

Координаты (широта и долгота) в x и y?

Фотография с коптера DJI на которую надо по имеющимся координатам из shp файла ортофотоплана Agisoft (широта и долгота) нанести точки.
Как перевести координаты точек shp файла на рисунок, т.е. в пиксели.
Начало координат рисунка вверху слева.
Точность не очень важна.
Имеются координаты (широта и долгота) углов фотографии.
Пробовал этот ответ https://qna.habr.com/q/10182
Если размер карты небольшой и кривизной земной поверхности можно пренебречь, то самый простой способ следующий:
Допустим рисунок имеет разрешение (Xmax, Ymax).
Координаты левого верхнего угла картинки (X1, Y1) и правого нижнего (X2, Y2).
Тогда произвольная точка с географическими координатами (A, B) при условии X1 < A < X2 && Y1 < B < Y2 получит пиксельные координаты:
Xcoord = Xmax * (A — X1) / (X2 — X1)
Ycoord = Ymax * (B — Y1) / (Y2 — Y1)


Не выходит. Подскажите, пожалуйста, как высчитать сколько в одном пикселе градусов. Как конвертировать эти координаты в пиксели?
Координаты углов из shp файла: [(476652.7945247746, 6566922.919989299), (476654.48236965627, 6566875.218355113), (476623.434047003, 6566873.49427293), (476620.33097108954, 6566921.535926155)]
Размер фотографии: width = 5472, height = 3648
  • Вопрос задан
  • 564 просмотра
Решения вопроса 1
@Oihoo Автор вопроса
Прикрепляю Файл shp
Коптер Phantom 4 pro, съемку проводим своими силами.

Перевод пикселей (X,Y) в координаты выполняю так, и это работает для меня (ссылка на источник):
imageWidth = 1920 
imageHeight = 1080

import numpy as np

def geoToList(latlon):
  return np.array((latlon['lat'], latlon['lng']))
  
def listToGeo(latlon):
  return {'lat': latlon[0], 'lng': latlon[1] }
  
def getGeoCoordinates(A, B, C, D, X, Y):    
  A, B, C, D = list(map(geoToList, [A, B, C, D]))    
  vBC = (C - B) / imageHeight    
  vAD = (D - A) / imageHeight    
  latlonPixel1 = vBC * (imageHeight - Y) + B    
  latlonPixel2 = vAD * (imageHeight - Y) + A    
  vM = (latlonPixel2 - latlonPixel1) / imageWidth    
  M = vM * X + latlonPixel1    
  return listToGeo(M)


Мне же нужно из координат получить пиксели.
Суть состоит в том, что бы показать на фото перекрытие фотографий, на которых проводилась работа.
Screenshot_1

Я нашел хороший пример для решения моей задачи (ссылка на источник).
top_left_raw = GPS_COORD
bottom_right_raw = GPS_COORD
maprect = [0,0,400,500] # Picture of map's width and height

def translate(pos):
    #rot = (pos[1], pos[0]*-1)
    #reflect = (rot[0], rot[1]*-1)
    #return reflect
    return (pos[1], pos[0])

def gps_to_coord(pos):
    pos1 = translate((pos[0]-top_left_raw[0], pos[1]-top_left_raw[1]))
    pos2 = translate((bottom_right_raw[0] - top_left_raw[0], bottom_right_raw[1] - top_left_raw[1]))
    x = (maprect[2]*pos1[0]) / pos2[0]
    y = (maprect[3]*pos1[1]) / pos2[1]
    return (x,y)

gps_to_coord(GPS_COORD)


Вот чего я добивался
Спасибо Всем! Задачка решена.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
hint000
@hint000
у админа три руки
Не выходит
Вышло бы только в случае ориентированного по сторонам света прямоугольника (т.е. верх строго на север, низ строго на юг, право строго на восток, лево строго на запад).

Если размер карты небольшой и кривизной земной поверхности можно пренебречь,
...то можно использовать аффинное преобразование.
https://www.google.com/search?q=аффинные+преобразо...
Также можете посмотреть более сложный метод.

Я писал такой алгоритм, вернее код на C++, но это было примерно 20 лет назад. На досуге попробую поискать в залежах хлама на дисках, но пока ничего не обещаю, так что возможно, вы разберётесь и напишете быстрее, чем я найду. :)
Ответ написан
@timer5000
Файл shp приложите посмотреть.

У Вас кажется промышленный коптер.
Кто съемку вел? Вы или нанимали?
Обработка там должна быть программная в координатах и на подложках.

Тут попробуйте вопрос задать
https://geodesist.ru/forums/dji.203/

https://geodesist.ru/threads/nastrojka-rtk-na-phan...

https://topodrone.ru/downloads/

1 что вы делаете? Цель работ какая?
2 где происходила съемка? На публичной карте место покажите кадастровый квартал или район?
3 с shp файлами можно работать в автокаде или в мапинфо.
4 вы через python пытаетесь заменить платные программные продукты?

Повторюсь. Цель полетов какая конкретно? Что снимали? Что искали?

Все наоборот стремятся из картинки получить координаты с максимальной точностью до сантиметров.

А у вас координаты есть.

Берите координаты привязывайте их на местность (на картинку или подложку) и по координатам измеряйте пиксели.

Цель полетов какая конкретно? Что снимали? Что искали?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы