sql-server - 在 SQL Server 2008 中使用 STIntersects 的问题

标签 sql-server sql-server-2008 geospatial

使用此空间查询,我试图获取与 78,22 点相交的所有国家/地区信息。预期结果是“印度”的信息,但此查询未返回任何行。

select * from countryspatial
where
geom.STIntersects((geometry::STGeomFromText('POINT (78 22)', 4326)))>0;

这是表定义:
CREATE TABLE [dbo].[CountrySpatial](
 [ID] [int] IDENTITY(1,1) NOT NULL,
 [ObjectID] [bigint] NULL,
 [FIPS_CNTRY] [nvarchar](255) NULL,
 [GMI_CNTRY] [nvarchar](255) NULL,
 [ISO_2DIGIT] [nvarchar](255) NULL,
 [ISO_3DIGIT] [nvarchar](255) NULL,
 [ISO_NUM] [int] NULL,
 [CNTRY_NAME] [nvarchar](255) NULL,
 [LONG_NAME] [nvarchar](255) NULL,
 [ISOSHRTNAM] [nvarchar](255) NULL,
 [UNSHRTNAM] [nvarchar](255) NULL,
 [LOCSHRTNAM] [nvarchar](255) NULL,
 [LOCLNGNAM] [nvarchar](255) NULL,
 [STATUS] [nvarchar](255) NULL,
 [POP2005] [bigint] NULL,
 [SQKM] [float] NULL,
 [SQMI] [float] NULL,
 [COLORMAP] [smallint] NULL,
 [geom] [geometry] NULL,
PRIMARY KEY CLUSTERED 
(
 [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[CountrySpatial]  WITH CHECK ADD  CONSTRAINT [enforce_srid_geometry_CountrySpatial] CHECK  (([geom].[STSrid]=(0)))
GO

ALTER TABLE [dbo].[CountrySpatial] CHECK CONSTRAINT [enforce_srid_geometry_CountrySpatial]
GO

最佳答案

首先要评论的是,地球表面的点应该使用 Geography 而不是 Geometry 来存储。存储和函数的工作方式存在差异(即使名称相似)

这是一个工作示例:

简化表:

CREATE TABLE CountrySpatial(
 ID int IDENTITY(1,1) NOT NULL PRIMARY KEY,
 geog geography NULL)
GO

在印度周围插入类似钻石的东西
INSERT INTO CountrySpatial(geog)
VALUES (geography::STGeomFromText('POLYGON((' +
 '77.22702 28.67613, ' + -- new delhi (top)
 '72.566071 23.059516, ' + -- ahmedabad (left)
 '77.593689 13.005227, ' + -- bengaluru (bottom)
 '88.374023 22.614011, ' + -- kolkata (right)
 '77.22702 28.67613))', 4326));

找到匹配项。它与所寻求的点是联合的。 STBuffer 将点增加到 100 公里半径,以便在与找到的地理记录一起查看时显示(切换到输出中的空间选项卡)
select geog
from countryspatial
where geog.STIntersects(geography::STGeomFromText('POINT (78 22)', 4326))>0
union all
select geography::STGeomFromText('POINT (78 22)', 4326).STBuffer(100000)

关于sql-server - 在 SQL Server 2008 中使用 STIntersects 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4772829/

相关文章:

sql-server - 为什么我无法在 SSMS 中删除(编辑)具有 xml 值的行?

SQL 日期逻辑子句

sql-server - 您可以在 sql server 准备好的语句中参数化排序顺序吗?

sql-server - tsql:存储过程和行锁

sql-server - VS 2013 SqlServer 项目 : [dbo]. [MYVIEW] 对对象 [master].[dbo].[spt_values] 的引用未解决

sql - 在 SQL 表条目中使用通配符

sql - SQL Server表中缺少记录

database - 我的数据库中需要空间索引吗?

MySQL - 从数据库中查找半径内的点

sqlite - 基于纬度/经度查询附近兴趣点的 SQL 查询 - SQLite