Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从地理列中搜索附近的点_Sql_Geolocation_Sql Server 2008 R2_Sqlgeography - Fatal编程技术网

Sql 从地理列中搜索附近的点

Sql 从地理列中搜索附近的点,sql,geolocation,sql-server-2008-r2,sqlgeography,Sql,Geolocation,Sql Server 2008 R2,Sqlgeography,我的表中有一个带有空间索引的地理类型列。在使用索引提高性能时,如何选择距离给定纬度/经度X米以内的前N行?当您说“使用索引时”-您的意思是什么 我(今天)刚刚开始试验SQL 2012及其地理数据类型,但以下内容可能有用-我知道您正在使用2008-R2 创建一些数据: CREATE TABLE SpatialTable ( id int IDENTITY (1,1) PRIMARY KEY, GeogCol1 geography, GeogCol2 AS GeogCol

我的表中有一个带有空间索引的地理类型列。在使用索引提高性能时,如何选择距离给定纬度/经度X米以内的前N行?

当您说“使用索引时”-您的意思是什么

我(今天)刚刚开始试验SQL 2012及其
地理数据类型,但以下内容可能有用-我知道您正在使用
2008-R2

创建一些数据:

CREATE TABLE SpatialTable 
    ( id int IDENTITY (1,1) PRIMARY KEY,
    GeogCol1 geography, 
    GeogCol2 AS GeogCol1.STAsText() );
GO

INSERT INTO SpatialTable (GeogCol1)
VALUES 
(geography::STGeomFromText('POINT(-122.360 47.656)',4326)),
(geography::STGeomFromText('POINT(-122.343 47.656)',4326)),
(geography::STGeomFromText('POINT(-122.358 47.660)',4326)),
(geography::STGeomFromText('POINT(-122.348 47.649)',4326)),
(geography::STGeomFromText('POINT(-122.348 47.658)',4326)),
(geography::STGeomFromText('POINT(-122.358 47.653)',4326))
创建索引:

CREATE SPATIAL INDEX Spatialindex ON SpatialTable ( GeogCol1 ) USING GEOGRAPHY_GRID 
WITH (
    GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVEL_4 = MEDIUM),
    CELLS_PER_OBJECT = 16, PAD_INDEX  = OFF, SORT_IN_TEMPDB = OFF,
    DROP_EXISTING = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON
)
定义兴趣点:

DECLARE @g geography;
SET @g = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326);
在距离点750m的范围内找到最近的2

SELECT TOP 2
        @g.STDistance(st.GeogCol1) AS [DistanceFromPoint (in meters)] 
    ,   st.GeogCol2
    ,   st.id
FROM    SpatialTable st WITH(INDEX(SpatialIndex))
WHERE   @g.STDistance(st.GeogCol1) <= 750
ORDER BY @g.STDistance(st.GeogCol1) ASC
SQL执行计划
表明正在使用索引,并表明返回的距离是正确的

如果这不是你需要的,请告诉我,我正在努力自学,所以任何修改都是好的

***编辑**** 我添加了一个索引表提示,以强制查询使用索引(如下所示)。该链接解释了最初可能没有使用索引,因为SQL确定不使用索引会更快。上面示例的执行计划显示使用/不使用索引的比例为97%/3%,因此在本例中,SQL Optimizer的想法是正确的


为什么使用索引时查询速度较慢似乎是许多博客文章和问题的主题。

看起来这就是它所需要的。我将检查这是否使用了我添加的空间索引。执行计划没有显示它正在使用空间索引index@Bahamut根据()我添加了一个索引提示,这很有效。谢谢Paddy,这很有效,我用谷歌地图上的实际纬度和经度验证了这一点。我唯一的问题是,这会返回两点之间的实际距离,根据我的理解,这是空中距离…正确吗?From
STDistance()返回两种地理类型之间的最短字符串。这与测地距离非常接近。普通地球模型上的STDistance()与精确测地距离的偏差不超过.25%。这避免了对测地线类型中长度和距离之间细微差异的混淆。
DistanceFromPoint (in meters) GeogCol2                 id
----------------------------- ------------------------ -----------
234.715604015178              POINT (-122.348 47.649)  4
711.760044795868              POINT (-122.358 47.653)  6