将多个点与多个多边形相交

时间:2015-06-16 02:37:47

标签: c# sql-server bigdata intersection sqlgeography

我在SQLServer 2014中有两个表,一个有~100M点,一个有~2000多边形。 每个点仅与一个多边形相交。任务是将交叉多边形的ID分配给该点。

这样做的最佳做法是什么?

我在C#中尝试过它,加载两个数据表,逐行遍历点,逐行遍历多边形以找到匹配项。

Boolean inside = (Boolean)polygon.STIntersects(point);

由于我必须分别访问每个点并多次访问每个多边形以检查交叉点,因此这很慢。任何想法都非常受欢迎!

为Points创建表语句

CREATE TABLE [dbo].[ManyPoints](
     [idNearByTimeLine] [int] IDENTITY(1,1) NOT NULL,
     [msgID] [bigint] NOT NULL,
     [userID] [bigint] NULL,
     [createdAT] [datetime2](0) NULL,
     [WGSLatitudeX] [numeric](9, 6) NULL,
     [WGSLongitudeY] [numeric](9, 6) NULL,
     [location] [geography] NULL
)

和多边形

CREATE TABLE [dbo].[ManyPolygons](
     [OBJECTID] [int] IDENTITY(1,1) NOT NULL,
     [Shape] [geography] NULL,
     [ID_0] [int] NULL,
     [ISO] [nvarchar](3) NULL,
     [NAME_0] [nvarchar](75) NULL,
     [ID_1] [int] NULL,
     [NAME_1] [nvarchar](75) NULL,
     [ID_2] [int] NULL,
     [NAME_2] [nvarchar](75) NULL,
     [ID_3] [int] NULL,
     [NAME_3] [nvarchar](75) NULL,
     [NL_NAME_3] [nvarchar](75) NULL,
     [VARNAME_3] [nvarchar](100) NULL,
     [TYPE_3] [nvarchar](50) NULL,
     [ENGTYPE_3] [nvarchar](50) NULL,
     [ORIG_FID] [int] NULL,
)

两个表都有“位置”和“形状”的空间索引

3 个答案:

答案 0 :(得分:1)

Select idnearbytimeline, objectid
From dbo.manypoints as point
Join dbo.manypolygons as polygon
   On point.location.STIntersects(polygon.shape) =1

答案 1 :(得分:0)

我建议您用逗号分隔的字符串存储单个多边形的点。因此,每个多边形只能覆盖一条记录。

你能分享你的桌面结构,建议你更好地实现你的任务。

答案 2 :(得分:0)

我提出了另一个解决方案。这是一个存储过程,它选择给定多边形ID中的所有点。然后我使用一个简单的C#程序遍历所有多边形。然而,这仍然不是最佳和痛苦的缓慢。任何可以轻松调整的调整?

USE [<<DATABASE>>]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[test] @ID INT 
AS 

SET IDENTITY_INSERT [weiboDEV].[dbo].[<<NEW TABLE>>] ON;
-- Select Points in Polygon (Geography)

DECLARE @Shape GEOGRAPHY = (select [Shape] from <<POLYGONS>> where OBJECTID=@ID);
DECLARE @SQLString2 NVARCHAR(500)= N'INSERT INTO <<NEW TABLE>>(<<YOUR COLUMNS>>) SELECT <<YOUR COLUMNS>> FROM <<POINTS>> WHERE ([location]).STWithin(@Shape) = 1;';
DECLARE @ParmDefinition NVARCHAR(500) = N'@ID INT, @Shape geography';
EXECUTE sp_executesql @SQLString2, @ParmDefinition, @ID, @Shape;

GO