SQL 2008
我有两张桌子。一个表(A)具有大约4000个具有lat lng的位置。另一个表(B)具有800个位置,具有lat lng。
我需要表B中的每个lat lng以及15 Km半径内的所有相应的lat lng。
我使用的是sql 2008,对于地理查询来说非常新。
答案 0 :(得分:0)
/*
Assuming Your tables are like so
*/
IF OBJECT_ID('#xLocation1') IS NOT NULL
DROP TABLE #xLocation1
CREATE TABLE #xLocation1 (
Id INT IDENTITY(1,1) CONSTRAINT PK_Location_1 PRIMARY KEY--Reqire this for Geog Spatial Index
,LocationId INT
,Latitude FLOAT NULL
,Longitude FLOAT NULL
,Radius INT NULL
,GeogPoint GEOGRAPHY NULL
)
IF OBJECT_ID('#xLocation2') IS NOT NULL
DROP TABLE #xLocation2
CREATE TABLE #xLocation2 (
Id INT IDENTITY(1,1) CONSTRAINT PK_Location_2 PRIMARY KEY--Reqire this for Geog Spatial Index
,LocationId INT
,Latitude FLOAT NULL
,Longitude FLOAT NULL
,Radius INT NULL
,GeogPoint GEOGRAPHY NULL
)
DECLARE @Radius INT = 15 --KM
/*
Create GEOGRAPHY POINT datatypes
*/
UPDATE #xLocation1
SET
GeogPoint = GEOGRAPHY::STGeomFromText('POINT(' + CAST(ISNULL(Longitude,'') AS VARCHAR(20)) + ' ' + CAST(ISNULL(Latitude,'') AS VARCHAR(20)) + ')', 4326)
UPDATE #xLocation2
SET
GeogPoint = GEOGRAPHY::STGeomFromText('POINT(' + CAST(ISNULL(Longitude,'') AS VARCHAR(20)) + ' ' + CAST(ISNULL(Latitude,'') AS VARCHAR(20)) + ')', 4326)
/*
CREATE SPATIAL INDEXes
*/
CREATE SPATIAL INDEX [SDX_Location1_GeogPoint_x1] ON #xLocation1 ( [GeogPoint] )
USING GEOGRAPHY_GRID
WITH
( GRIDS=(LEVEL_1 = HIGH,LEVEL_2 = HIGH,LEVEL_3 = HIGH,LEVEL_4 = HIGH)
, CELLS_PER_OBJECT = 64
, PAD_INDEX = OFF
, SORT_IN_TEMPDB = OFF
, DROP_EXISTING = OFF
, ALLOW_ROW_LOCKS = ON
, ALLOW_PAGE_LOCKS = ON
)
CREATE SPATIAL INDEX [SDX_Location2_GeogPoint_x2] ON #xLocation2 ( [GeogPoint] )
USING GEOGRAPHY_GRID
WITH
( GRIDS=(LEVEL_1 = HIGH,LEVEL_2 = HIGH,LEVEL_3 = HIGH,LEVEL_4 = HIGH)
, CELLS_PER_OBJECT = 64
, PAD_INDEX = OFF
, SORT_IN_TEMPDB = OFF
, DROP_EXISTING = OFF
, ALLOW_ROW_LOCKS = ON
, ALLOW_PAGE_LOCKS = ON
)
/*
Find where locations from each table are within @Radius of each other
*/
SELECT *
FROM
#xLocation1 X
INNER JOIN
#xLocation2 P ON X.GeogPoint.STDistance(P.GeogPoint) <= @Radius