Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 server 在SQL Server 2008中使用STIntersects时出现问题_Sql Server_Sql Server 2008_Geospatial - Fatal编程技术网

Sql server 在SQL Server 2008中使用STIntersects时出现问题

Sql server 在SQL Server 2008中使用STIntersects时出现问题,sql-server,sql-server-2008,geospatial,Sql Server,Sql Server 2008,Geospatial,使用这个空间查询,我试图获得与点78,22相交的所有国家信息。预期结果是“India”的信息,但此查询不返回任何行 select * from countryspatial where geom.STIntersects((geometry::STGeomFromText('POINT (78 22)', 4326)))>0; 这是表定义: CREATE TABLE [dbo].[CountrySpatial]( [ID] [int] IDENTITY(1,1) NOT NULL,

使用这个空间查询,我试图获得与点78,22相交的所有国家信息。预期结果是“India”的信息,但此查询不返回任何行

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

首先要说明的是,应该使用地理信息而不是几何信息来存储地球表面的点。存储和函数的工作方式存在差异(即使名称类似)

以下是一个工作示例:

简化表格:

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公里,以便在与找到的地理记录一起查看时显示该点(在输出中切换到Spatial选项卡)


您是否能够从国家/地区表中至少转储印度的行(如果可能的话),并显示选择该行而不是另一行。TKSSTBuffer()可以增加大量的资源使用,这只是一个脚注。如果你只需要找到接近的东西,考虑使用StistAcess(),然后检查距离。STBuffer()从一个点创建一个heptacontakaihenagon(71边多边形),从而减少了大多数算法需要考虑的点的复杂性和数量。STBuffer()和STIntersects()很方便,但是很昂贵。
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)