說我有一個城市的經緯度,我需要找出距離這個地點100英里範圍內的所有機場。我怎麼做到這一點?我的數據駐留在SQL Server中。 1張桌子有拉特和長的所有城市信息,另一張桌子有拉特和長的機場信息。SQL Server:計算Lat/Long的半徑?
1
A
回答
3
我在幾年前使用過/寫過,並且它足夠接近我所需要的。如果我沒有記錯的話,公式的一部分會考慮地球曲率,但它已經有一段時間了。我使用郵政編碼,但您可以輕鬆地適應城市 - 相同的邏輯。
ALTER PROCEDURE [dbo].[sp_StoresByZipArea] (@zip nvarchar(5), @Radius float) AS
DECLARE @LatRange float
DECLARE @LongRange float
DECLARE @LowLatitude float
DECLARE @HighLatitude float
DECLARE @LowLongitude float
DECLARE @HighLongitude float
DECLARE @istartlat float
DECLARE @istartlong float
SELECT @iStartlat=Latitude, @iStartLong=Longitude from zipcodes where [email protected]
SELECT @LatRange = @Radius/((6076/5280) * 60)
SELECT @LongRange = @Radius/(((cos((@iStartLat * 3.141592653589/180)) * 6076.)/5280.) * 60)
SELECT @LowLatitude = @istartlat - @LatRange
SELECT @HighLatitude = @istartlat + @LatRange
SELECT @LowLongitude = @istartlong - @LongRange
SELECT @HighLongitude = @istartlong + @LongRange
/** Now you can create a SQL statement which limits the recordset of cities in this manner: **/
SELECT * FROM ZipCodes
WHERE (Latitude <= @HighLatitude) AND (Latitude >= @LowLatitude) AND (Longitude >= @LowLongitude) AND (Longitude <= @HighLongitude)
4
首先...轉換城市的數據點
DECLARE @point geography;
SELECT geography::STPointFromText('POINT(' + CAST(@lat AS VARCHAR(20)) + ' ' +
CAST(@lon AS VARCHAR(20)) + ')', 4326)
其中@lat和@lon是城市問題的經度和緯度。
然後你就可以查詢該表...
SELECT [column1],[column2],[etc]
FROM [table]
WHERE @point.STBuffer(160934.4).STIntersects(geography::STPointFromText(
'POINT(' + CAST([lat] AS VARCHAR(20)) + ' ' +
CAST([lon] AS VARCHAR(20)) + ')', 4326));
,其中160934.4是米100英里數。
雖然這會很慢。如果你想做更多的空間工作,你可以添加一個持續的計算列(因爲經緯度點不會真的改變),然後使用空間索引。
ALTER TABLE [table]
ADD geo_point AS geography::STPointFromText('POINT(' + CAST([lat] AS VARCHAR(20))
+ ' ' + CAST([lon] AS VARCHAR(20)) + ')', 4326) PERSISTED;
CREATE SPATIAL INDEX spix_table_geopt
ON table(geo_point)
WITH (BOUNDING_BOX = (0, 0, 500, 200)); --you'd have to know your data
+0
其他答案也很好。我添加了這個作爲替代方法來解決這個問題,特別是在SQL Server 2008中,特別是如果你要做大量的空間工作。 – swasheck 2013-04-23 18:57:39
相關問題
- 1. CriteriaBuilder半徑計算
- 2. 曲率半徑計算
- 3. 計算GPS座標半徑
- 4. 如何計算lat long android的半徑?
- 5. 在Opera計算的邊界半徑
- 6. 如何計算MATLAB環的半徑?
- 7. 計算橢圓形的半徑
- 8. 計算某個半徑內的點數
- 9. 使用javascript計算圓的半徑
- 10. CSS3PIE邊界半徑不計算:(
- 11. 根據強度計算光量半徑
- 12. SQL Server計算列
- 13. SQL Server中的計算
- 14. 複雜的計算 - SQL Server
- 15. 計算一半
- 16. SQL Server改變計算列
- 17. SQL Server百分比計算
- 18. SQL Server 2012計算列
- 19. SQL Server和計算字段?
- 20. SQL Server:持久計算列
- 21. SQL Server 2008中 - 計算列
- 22. SQL Server參考計算列
- 23. SQL Server - 計算日期列
- 24. SQL Server:計算攤銷
- 25. 工資計算在SQL Server
- 26. SQL Server餘額計算
- 27. SQL SERVER T-SQL按組計算小計總計和總計
- 28. mysql lat lon計算顯示半徑範圍內的位置
- 29. 使用mapkit計算以米爲單位的半徑
- 30. 計算GPS座標以形成給定大小的半徑
您使用的是空間數據嗎? – swasheck 2013-04-23 18:22:12
不,他們只是存儲爲小數點 – Matt 2013-04-23 18:23:46
哪個版本的sql server? – swasheck 2013-04-23 18:29:05