2015-07-12 1 views
1

Я реализовал некоторый код для создания некоторого кода для обработки изображения относительно небольшого местоположения, такого как плоскость для конвертирование между местоположениями на изображении, которое я сохранил, и входящей информацией Lat/Long.Геолокация, точность и аффинная трансформация: что вызывает мое неточное преобразование из точки lat/long в точку на моем изображении.

Используя формулы, предусмотренные в https://msdn.microsoft.com/en-us/library/jj635757(v=vs.85).aspx я писал эти строки кода среди других

var vector = math.matrix(
[[x1], 
[y1], 
[x2], 
[y2]]); 
var matrix = math.matrix(
[[lat1,long1,1,0] 
,[-long1,lat1,0,1] 
,[lat2,long2,1,0] 
,[-long2,lat2,0,1]]); 
var solution = math.multiply(math.inv(matrix),vector); 

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

a = parseFloat(conversiondata['A']); 
b = parseFloat(conversiondata['B']); 
c = parseFloat(conversiondata['C']); 
d = parseFloat(conversiondata['D']); 
var long = position.coords.longitude; 
var lat = position.coords.latitude; 
var x = a * lat + b * long + c; 
var y = b * lat - a * long + d; 

Значения x1, x2, y1, y2 предоставляются путем получения данных щелчка пользователя. Значения lat1, lat2, long1, long2 предоставляются пользователем в ответ на два клика на изображении карты.

При переносе x, y обратно на карту его не совсем в правильном положении, положение на карте кажется почти на противоположной стороне линии, определяемой (x1, y1) и (x2, y2) , Я пытаюсь сказать, в чем причина неточности. (Тем не менее, я предполагаю, что кажущееся отражение является совпадением)

Если кто-то может помочь мне сузить то, что может быть не так, вот что я рассмотрел (карта не достигает даже мили в любом направлении для справки).

Аффинное преобразование просто не работает. Но в соответствии с ссылкой при условии, что оно включает масштабирование, поэтому это не должно быть причиной проблемы. . Проблема с настройкой переменных - я смотрел на мой код слишком долго, чтобы увидеть это, если это так. Я теряю слишком много точности, перенося данные var в MySQL как float или на PHP как строку Я не даю достаточно точной информации из данных щелчка/lat/long ввода. - Я значительно увеличил масштаб при нажатии на карту и получаю lat/long от карт google, хотя SVG не очень точен. Хотя, глядя на данные xml, он хранит десятичные числа. Область, с которой я работаю, слишком велика, чтобы упростить, предположив, что локальная карта является плоской плоскостью

Любая помощь приветствуется, спасибо за то, что вы читаете это.

Для получения дополнительной информации я разместил данные lat/long, которые JavaScript дал мне в Google Maps, и я сравниваю точность с этим, а не с моим фактическим местоположением.

Дополнительная информация: Я нашел «ориентиры» на восточном и западном краях своего изображения и рассчитал разницу в долготе как 0,02695 с длиной изображения, по крайней мере, вдвое превышающей высоту.

Примеры значений полного пробега значений.

ориентиры

Точка 1 (х, у) = (619564)

Точка 1 (лат, длинный) = (X.099546, -Y.465179)

Точка 2 (x, y) = (1181,190)

Точка 2 (lat, long) = (X.10365341, -Y.457014)

геолокации

Прогнозируемая координат (х, у) = (975,262)

Учитывая координаты (широта, длинные) = (X.102851, -Y.459996)

Real изображение на экране радара (х, у) = (1022.7498707999475,351.02335709985346)

Реальный всплеск (приблизительная лат, длинный) = (X.101964, -Y.459340)

(Реальный всплеск лат долго является приближенным, как это в водоеме без каких-либо хороших ориентиров)

Для безопасности я взял цифры перед десятичной точкой из координат lat/long, но я могу подтвердить, что все X равны, и все Y равны

Кроме того, я играл с Латом длинных значений в инструментах разработчика Chrome, он кажется, что оси немного повернуты приблизительно 30 градусов от того, что оно должно быть

+0

Земля не является 2d система координат, это сплюснутый сфероид. –

+1

Области, которые я намереваюсь использовать для этого, очень малы, горстка городских блоков в лучшем случае. Я не считаю, что дрейф, вызванный кривизной, должен быть огромным, если кто-то не сможет дать какую-то ссылку, чтобы оценить, насколько велика дрейф – pafk

+0

Можете ли вы привести пример с образцовыми координатами? – Salman

ответ

1

После достаточных ковыряться я понял, что я заказал Lat и неправильно. На моей карте, которая не была повернута с N наверху, следующий код вводит меня всего в несколько футов, более чем объяснимо, чем отсутствие точности в результате использования пользовательского ввода и сетки пикселей.

var matrix = math.matrix(
[[long1,lat1,1,0] 
,[-lat1,long1,0,1] 
,[long2,lat2,1,0] 
,[-lat2,long2,0,1]]); 

И

var x = a * long + b * lat + c; 
var y = b * long - a * lat + d; 

Для любого другого, который заинтересован в реализации этого в качестве потенциального решения для упрощения математику их приложения Дрейф, что произошло, было меньше, чем 40 футов над картой с микросхемой диагональ 8000 футов и разница в контрольных точках около 3000 футов. Это означает, что дрейф составляет немногим более 1% расстояния от опорных точек, что включает в себя эффект человеческой ошибки.

Эта ошибка должна уменьшаться при работе на небольших картах и ​​увеличиваться по мере того, как вы работаете на больших картах.

Я проверил его снова на карте с ~ 90 градусов вращения и код задержал

Смежные вопросы