簡體   English   中英

C#查找一英里內的所有經度和緯度

[英]C# find all Latitude and Longitude within a mile

給定一個經度和緯度值,是否有辦法找到指定距離內的所有經度和緯度? 我有一個lat和long值的db表,它們是路燈的位置,給定一個lat long對,我怎么能找到所有在特定距離內的那些?

我猜想從起點畫一個圓,找到包含的所有經緯度是最好的方法,但是,我沒有做到這一點的技能。 我是行業的ac#開發人員,但在整個地理編碼領域需要一些指導。

您可以使用Haversine公式(請參閱@tdammers答案)來計算表格中每個點(緯度,經度)與給定點之間的距離。 您必須遍歷整個集合才能分別評估每個點。

或者,如果您使用的是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類型下,用於SQLServer®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();

Haversine公式可為您提供兩個緯度/經度點之間的距離(以米為單位;轉換為英里很容易)。 從那里,您可能會發現相反的...

我回答這個問題有點晚了,但是幾年前我想出了一個技巧,可以對衛星視場進行基本相同的操作。

地球上有兩個點,您可以確切地知道距您位置給定距離的每個點的緯度和經度。 這些點是北極和南極。 因此,讓我們將您想要的觀點放在北極。 相距一海里的經度圓是北緯90度減去1分鍾,即北緯90 – 1/60度= 89.9833度,因為1分鍾的弧速= 1海里。

現在您有了距離極點1英里(經度為89.9833)的經度軌跡,基本上可以旋轉地球,直到所需的緯度/經度成為極點所在的位置。 此過程稱為“地圖刻度的旋轉”。 一旦您考慮了方程式,數學就很簡單了。 我把它們埋在某個地方,所以我不容易找到代碼,但是有關方程式的過程在John Snyder的書“ Map Projections:A Working Manual”中。 您可以從http://pubs.usgs.gov/pp/1395/report.pdf免費獲得pdf。 說明在第29 – 32頁。

查克·甘茨

前一段時間,我在解決一個問題,即如何沿途獲得POI。 我使用了四叉樹,這意味着將整個區域遞歸地分為單元格和子單元格。 每個POI僅屬於一個小區。 擁有這些像元后,您可以輕松地在像元級別上進行高級計算,然后僅搜索具有交集的像元。 它是更多的游戲開發技術,但也可以在這里使用。 以下是有關Wiki的一些信息:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM