【问题标题】:Intersecting many Points with many Polygons许多点与许多多边形相交
【发布时间】:2015-06-16 02:37:47
【问题描述】:

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

最好的做法是什么?

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

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

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

为点创建表语句

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,
)

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

【问题讨论】:

  • 您的点/多边形的数据类型是什么?
  • 两者的数据类型都是 SQLGeography

标签: c# sql-server bigdata intersection sqlgeography


【解决方案1】:
Select idnearbytimeline, objectid
From dbo.manypoints as point
Join dbo.manypolygons as polygon
   On point.location.STIntersects(polygon.shape) =1

【讨论】:

  • 我对此做了一些测试,预计查询时间为 3.5 天。有没有办法让它更快?无论如何感谢您的解决方案!
  • 每个空间列上都有空间索引吗?如果没有,就像他们一样。
  • 另外,您是如何得出这个时间估算的? AFAIK,SQL Server 中没有任何内容可以为您提供查询的预计完成时间。
  • 我已经使用了您的建议,并为不同的值添加了 top X,这些值或多或少是线性的。据此,我估计了总运行时间。可能不是正确的做法。我还添加了索引提示,因为我的执行计划中没有提到它。谢谢你的回答——我帮了我很多!
【解决方案2】:

我想出了另一个解决方案。这是一个存储过程,它选择给定多边形 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

【讨论】:

    【解决方案3】:

    我建议您使用逗号分隔的字符串存储单个多边形的点。所以每个多边形只能被一个记录覆盖。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多