我在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,
)
两个表都有“位置”和“形状”的空间索引
答案 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