2009-07-27 4 views
2

Я пытаюсь реализовать представленные уравнения here относительно нахождения точки на заданном перпендикулярном расстоянии от линии. К сожалению, строки, которые я получаю, не являются прямыми. Это связано с тем, что я смешиваю Lat/long с регулярными координатами x/y или я сделал что-то еще неправильно?Перпендикулярная линия в lat/long

double distPoint = 0.02; 

double latDiff = temp2.Latitude - temp.Latitude; 
double longDiff = temp2.Longitude - temp.Longitude; 
double length = Math.Sqrt(latDiff * latDiff + longDiff * longDiff); 
double uLat = latDiff/length; 
double uLong = longDiff/length; 

double newLat1 = temp2.Latitude + (distPoint/2) * uLat; 
double newLong1 = temp2.Longitude - (distPoint/2) * uLong; 

double newLat2 = temp2.Latitude - (distPoint/2) * uLat; 
double newLong2 = temp2.Longitude + (distPoint/2) * uLong; 

Изменили код сейчас и имена переменных. Тем не менее получать ошибку :-(

double dist = 0.02; 

double latDiff = secondTestPoint.Latitude - firstTestPoint.Latitude; 
double longDiff = secondTestPoint.Longitude - firstTestPoint.Longitude; 

double length = Math.Sqrt(latDiff * latDiff + longDiff * longDiff); 
double uLat = latDiff/length; 
double uLong = longDiff/length; 

double newLat1 = secondTestPoint.Latitude + (dist/2) * uLong; 
double newLong1 = secondTestPoint.Longitude - (dist/2) * uLat; 

double newLat2 = secondTestPoint.Latitude - (dist/2) * uLong; 
double newLong2 = secondTestPoint.Longitude + (dist/2) * uLat; 

Вот значение переменного:

latDiff = -0.0046187639236450195 
longDiff = -0.0058203935623168945 

length = 0.0074303405980227239 
uLat = -0.62160864131505777 
uLong = -0.78332796263279647 

newLat1 = 58.39273776863341 
newLong1 = 15.558675147558933 

newLat2 = 58.408404327886061 
newLong2 = 15.546242974732632 

UPDATE:. Я пришел к выводу, что неисправность связана с Ширами/вопросов представляется разумным, что он генерирует бы разломы думать, что широта/долгота эквивалентны квадраты, когда они на самом деле не являются. Особенно при работе с северной Европой.

+1

Изображение здесь: http://img266.imageshack.us/img266/9550/mapu.gif Более длинная строка - это перпендикулярная. – svanerik

+0

Для тех из нас, кто является визуальными типами - спасибо за изображение! –

+0

В этой заметке я думаю, что изображение может быть еще более полезно, аннотируя его, с помощью которого точки (или их значения x-y) исходят со значениями в вашем псевдокоде, поскольку я не уверен в этом из ваших имен переменных. –

ответ

0
+0

Обратите внимание, что это соотношение неточно во всех местах. – Brian

+0

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

+0

1 градус долготы около 69,13 миль на экваторе и 0 на полюсах. Это не так просто. Это уравнение верно, если вы находитесь в Хэмпшире, в Соединенном Королевстве или где-то еще в эквивалентной широте. Большинство людей - нет. –

0

В формуле вы связаны, последние 4 строки имеют последовательность умножения как:

[dy, dx, dy, dx] == [uLong, uLat, uLong, uLat]

однако вы уже использовали:

[dx, dy, dx, dy] == [uLat, uLong, uLat, uLong]

Ваши последние 4 строки должны быть такими:

double newLat1 = temp2.Latitude + (distPoint/2) * uLong; //dy appears first 
double newLong1 = temp2.Longitude - (distPoint/2) * uLat; //then dx 

double newLat2 = temp2.Latitude - (distPoint/2) * uLong; 
double newLong2 = temp2.Longitude + (distPoint/2) * uLat; 
+0

Привет, я попытался реализовать это, но это не сработало. Я разместил значения переменных в вопросе, чтобы вы могли видеть, связано ли это с этим. Спасибо! – svanerik

1

В таком небольшом масштабе разница между x/y и lat/long не актуальна. Вы сделали что-то еще неправильно; что вы должны иметь это:

double distPoint = 0.02; 

double latDiff = temp2.Latitude - temp.Latitude; 
double longDiff = temp2.Longitude - temp.Longitude; 
double length = Math.Sqrt(latDiff * latDiff + > longDiff * longDiff); 
double uLat = latDiff/length; 
double uLong = longDiff/length; 

double newLat1 = temp2.Latitude + (distPoint/2) * uLong; 
double newLong1 = temp2.Longitude - (distPoint/2) * uLat; 

double newLat2 = temp2.Latitude - (distPoint/2) * uLong; 
double newLong2 = temp2.Longitude + (distPoint/2) * uLat; 

То есть вектор (uLat, uLong) единичный вектор в направлении вашей линии, поэтому перпендикуляр единичный вектор является (uLong, -uLat) - обратите внимание, что координаты местами положение, в дополнение к одному существу отрицается.

+0

Привет, это, кажется, имеет смысл. Я попытался реализовать его, но он не работает. Числа действительно маленькие, может ли это быть причиной? Я разместил цифры выше. – svanerik

+0

«Конечный результат» вашего ответа в основном эквивалентен LFSR Consulting, но я предпочитаю ваше перпендикулярное векторное объяснение. –

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

  • Нет связанных вопросов^_^