C # найти все широту и долготу в миле - PullRequest
5 голосов
/ 15 марта 2011

Учитывая значения широты и долготы, есть ли способ найти все широты и долготы, которые находятся в пределах указанного расстояния?У меня есть таблица значений длинны и длины в ДБ, которые являются местоположениями, скажем, уличных фонарей, учитывая пару длин лат, как я могу найти все те, которые находятся на определенном расстоянии?Начальная точка и нахождение всех длинных и длинных элементов, однако, были бы наилучшим способом, у меня нет навыков, чтобы сделать это.Я по профессии разработчик ac #, но мне нужно несколько указателей во всем мире геокодирования.

Ответы [ 4 ]

3 голосов
/ 15 марта 2011

Вы можете использовать формулу Haversine (см. Ответ @tdammers), чтобы вычислить расстояние между каждой точкой (Lat, Long) в вашей таблице и данной точкой. Вам нужно будет перебрать всю коллекцию, чтобы оценить каждую точку индивидуально.

Или, если вы используете SQL Server 2008, тогда геопространственная поддержка встроена. Каждая запись будет хранить местоположение как тип географии (возможно, в дополнение к двум дискретным столбцам для хранения широты и долготы, если проще разбить эти значения), а затем вы можете создать простой запрос SQL:

DECLARE @Point geography = 'POINT(-83.12345 45.12345)' -- Note: Long Lat ordering required when using WKT

SELECT * 
FROM tblStreetLamps
WHERE location.STDistance(@point) < 1 * 1609.344  -- Note: 1 mile converted to meters

Еще одна похожая возможность - использовать типы SQL Spatial в вашем .NET-приложении. Распространяемый дистрибутив находится здесь: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=CEB4346F-657F-4D28-83F5-AAE0C5C83D52 (в Microsoft® System CLR Types для SQL Server® 2008 R2).

Затем запрос можно выполнить через LINQ. Примечание: это избавляет вас от реализации Haversine самостоятельно, в противном случае процесс запроса будет таким же.

var yourLocation = SqlGeography.Point(Latitude, Longitude, 4326);

var query = from fac in FacilityList
            let distance = SqlGeography
                          .Point(fac.Lat, fac.Lon, 4326)
                          .STDistance(yourLocation)
                          .Value
            where distance < 1 * 1609.344
            orderby distance
            select fac;

return query.Distinct().ToList();
1 голос
/ 03 декабря 2011

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

Есть две точки на земле, где вы точно знаете широту и долготу каждой точки на данном расстоянии от вашего местоположения. Это точки Северного и Южного полюсов. Итак, давайте поставим точку, которую вы хотите на Северном полюсе. Одна морская миля отсюда - это круг долгот с широтой 90 градусов минус 1 минута или 90 - 1/60 градусов = 89,9833 градуса северной широты, поскольку 1 минута дуги = 1 морская миля.

Теперь, когда у вас есть местоположение долгот в одной миле от полюса с широтой 89,9833, вы, по сути, вращаете Землю до тех пор, пока вы не достигнете желаемого значения широты / долготы. Этот процесс называется «Вращение сетки карты». Математика для этого проста, если вы немного подумали об уравнениях. Я где-то похоронил их, поэтому я не могу легко добраться до кода, однако процесс с уравнениями находится в книге Джона Снайдера «Проекции карт: рабочее руководство». Вы можете получить PDF бесплатно на http://pubs.usgs.gov/pp/1395/report.pdf. Объяснение на страницах 29 - 32.

Чак Ганц

1 голос
/ 15 марта 2011

Формула haversine дает вам расстояние (в метрах; преобразование в мили тривиально) между двумя точками широты и долготы.Оттуда вы, вероятно, можете найти обратное ...

0 голосов
/ 15 марта 2011

Некоторое время назад я решал проблему, как получить POI вдоль дороги. Я использовал квадри, то есть рекурсивно делил всю область на ячейки и подэлементы. Каждый POI принадлежит только одной ячейке. Имея эти ячейки, вы можете легко выполнять высокоуровневые вычисления на уровне ячеек и после этого искать только ячейки с пересечением. Это больше техника разработки игр, но она также может быть использована здесь. Вот что-то об этом на вики:

http://en.wikipedia.org/wiki/Quadtree

...