簡體   English   中英

SQL Server地理

[英]SQL Server Geography

有什么可能的方法來改善以下查詢:

DECLARE @radiusInMeters FLOAT = 400;
DECLARE @dgeog geography = geography::Point(given_latitude, given_longitude, 4326).STBuffer(@radiusInMeters);

select [fdx].latitude, [fdx].longitude
from [dbo].[fdx]
where @dgeog.STIntersects(geography::STGeomFromText('POINT(' + convert(varchar(20), [fdx].longitude) + ' ' + convert(varchar(20), [fdx].latitude) + ')', 4326)
                         ) = 1

kcung和Hasan BINBOGA是正確的,您需要一個空間索引。

查看查詢:@ dgeog.STIntersects(xxxx)= 1這要求[xxxx]是地理數據類型。 為了使[xxxx]成為地理數據類型,必須將STGeomFromText函數應用於行。 並且由於這是WHERE子句的唯一部分,因此該函數必須應用於所有行。

如果表fdx特別大,則意味着必須一遍又一遍地應用CLR函數。 這不是一個快速的過程(以SQL Server術語來說)。

如果可以,請嘗試以下操作:

ALTER dbo.fdx ADD Point AS (GEOGRAPHY::Point(Latitude, Longitude, 4326)) PERSISTED
GO
CREATE SPATIAL INDEX SIndex_FDX ON dbo.fdx (Point) 
USING GEOGRAPHY_GRID
WITH (
  GRIDS = (LEVEL_1 = HIGH,LEVEL_2 = HIGH,LEVEL_3 = HIGH,LEVEL_4 = HIGH), 
  CELLS_PER_OBJECT = 1
)
GO
DECLARE @Latitude DECIMAL(15,10) = 0
DECLARE @Longitude DECIMAL(15,10) = 0
DECLARE @Radius FLOAT = 400
DECLARE @g GEOGRAPHY = GEOGRAPHY::Point(@Latitude, @Longitude, 4326).STBuffer(@Radius)
SELECT * FROM dbo.fdx WHERE Point.STIntersects(@g) = 1

注意:您應將經緯度對轉換為十進制,然后再使用它們來計算地理位置列。 當您使用浮點數作為輸入時,會隱式地將浮點數轉換為小數點后再轉換為字符串,從而將坐標縮減至小數點后4位。 如果您先進行顯式轉換,那將不是問題。

另外,如果dbo.fdx中有任何空值緯度/經度,則需要在WHERE子句中對其進行過濾,因為空值會導致空間索引無法正常工作。

您可以創建空間索引: https : //msdn.microsoft.com/en-us/library/bb934196.aspx

暫無
暫無

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

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