Ближайшая пространственная позиция от широты и долготы - PullRequest
1 голос
/ 17 мая 2011

У меня есть приложение, которое использует инфраструктуру DotSpatial для подключения к USB GPS на моем ноутбуке. Я, по сути, использую его, когда выезжаю на место, чтобы узнать, где я нахожусь.

Приложение также включает карту ShapeFile в качестве фона, чтобы я знал, где я нахожусь.

Что у меня есть:

  • У меня есть база данных, в которой каждая дорога разделена на 5 м с указанием местоположения по широте и длине дороги и названия дороги. (Таким образом, Col 1 = UniqueID, Col 2 = Расстояние до места в м (т. Е. 0, 5, 10 ...), Col 3 = название дороги, Col 4 = Lat, Col 5 = Long)
  • База данных SQLite, и у меня есть база, созданная в Access.
  • Полная структура DotSpatial

Что мне нужно сделать, это следующее:

  • Определите на основе моего текущего значения широты / долготы (которое я получаю от приемника GPS и части программного обеспечения GPS.NET), какое расстояние ближайшего местоположения в м от местоположений широты и долготы в базе данных.

Если есть другие предложения, пожалуйста, дайте мне знать.

P.S приложение должно быть переносимым, поэтому не нужно возиться с SQL Server или PostgrSQL с posGIS и т. Д.

Ответы [ 2 ]

3 голосов
/ 17 мая 2011

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

Большинство GPS-приемников работают в WGS84, и при условии, что вы можете использовать библиотеку, такую ​​как Proj4 ( .NET wrapper ), чтобы преобразовать как текущую позицию, так иположение дороги в метрах (проецируемые координаты; либо в проекции WGS84, либо в локальной системе координат, основанной на вашем географическом положении. Зоны UTM могут работать достаточно хорошо, или OSGB, если вы находитесь в Великобритании).

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

Если вам нужна дополнительная помощь в части ГИС, рассмотрите возможность посещения GIS.SE

После того, как вы определите свои местоположения вметров, найдите расстояние между ними:

double distanceX = currentXmetres - roadXmetres;
double distanceY = currentYmetres - roadYmetres;

double Distance = Math.Abs( Math.Sqrt( (distanceX * distanceX) + (distanceY * distanceY) ) );

Теперь вы можете запросить в вашей базе данных значение Distance и найти ближайшее местоположение:

SELECT * FROM table
ORDER BY ABS(Distance - Col 2)
LIMIT 1

Примечание: я не знаюфактическое имя вашей таблицы или столбцов, поэтому замените «table» и «Col 2» соответственно.

0 голосов
/ 17 мая 2011

Вам нужен элемент в вашей таблице, где расстояние (Пифагор) до вашей точки является самым близким.

select top 1 * from mytable
order by ( (table.lon - lon) * (table.lon - lon) + (table.lat - lat) * (table.lat - lat) )

Lon & Lat: положение, в котором вы находитесь. Пропуск sqrt тоже немного ускорит процесс.

...