2015-06-16 6 views
1

У меня есть две таблицы в SQLServer 2014, одна с ~ 100 М точками и одна с ~ многоугольниками ~ 2000. Каждая точка пересекается только с одним из полигонов. Задача состоит в том, чтобы назначить идентификатор пересекающегося многоугольника точке.Пересечение многих точек со многими полигонами

Какова наилучшая практика?

Я пробовал его на 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, 
) 

Обе таблицы имеют пространственный индекс на «место» и «Shape»

+0

Какие типы данных ваших точек/полигонов? – BICube

+0

Тип данных для обоих - SQLGeography – Michael

ответ

0

Я предлагаю вам хранить свои очки одиночного полигона с разделенной запятой строкой. Поэтому он может быть охвачен только одной записью для каждого многоугольника.

Можете ли вы поделиться своей структурой таблиц, лучше предложить вам лучший способ достичь своей задачи.

0

Я придумал другое решение. Это хранимая процедура, которая выбирает все точки в пределах данного идентификатора многоугольника. Затем я использую простую 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 [email protected]); 
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 
1
Select idnearbytimeline, objectid 
From dbo.manypoints as point 
Join dbo.manypolygons as polygon 
    On point.location.STIntersects(polygon.shape) =1 
+0

Я провел некоторое тестирование с этим, и ожидаемое время запроса составит 3,5 дня. Есть ли способ сделать это быстрее? Спасибо за решение в любом случае! – Michael

+0

У вас есть пространственный индекс для каждого из пространственных столбцов? Если нет, то как они. –

+0

Кроме того, как вы пришли к этой оценке времени? AFAIK, в SQL-сервере нет ничего, что даст вам приблизительное время завершения запроса. –

Смежные вопросы