Вопрос

У меня есть многоугольная структура в базе данных sql2005, как описано ниже.

CREATE TABLE [dbo].[Polygons](
    [PolygonID] [int] IDENTITY(1,1) NOT NULL,
    [PolygonName] [varchar](255) NOT NULL,
    [PolygonColor] [varchar](7) NOT NULL,
    [PolygonRuleID] [int] NOT NULL)

CREATE TABLE [dbo].[Polylines](
    [LineID] [int] IDENTITY(1,1) NOT NULL,
    [LineX1] [float] NOT NULL,
    [LineY1] [float] NOT NULL,
    [LineX2] [float] NOT NULL,
    [LineY2] [float] NOT NULL,
    [PolygonID] [int] NOT NULL
)

Теперь я извлекаю целые строки в приложение и помещаю все в функцию тестирования попадания.

public static bool PointInPolygon(float pointX, float pointY, PolylineCollection polygon)
        {
            int nvert = polygon.Count();
            int i, j = 0;
            bool c = false;
            for (i = 0, j = nvert - 1; i < nvert; j = i++)
            {
                if (((polygon[i].LineY1 > pointY) != (polygon[j].LineY1 > pointY)) &&
                 (pointX < (polygon[j].LineX1 - polygon[i].LineX1) * (pointY - polygon[i].LineY1) / (polygon[j].LineY1 - polygon[i].LineY1) + polygon[i].LineX1))
                    c = !c;
            }
            return c;
        }

Но мне нужно переместить эту функцию на сервер sql.Но в Sql 2005 нет встроенных пространственных функций, и я не хочу использовать какие-либо дополнительные библиотеки пространственных функций.Как я могу перенести эту функцию в T-SQL?:) Или у кого-нибудь есть другое решение для проверки PointInPolygon?

Спасибо

Это было полезно?

Решение

SQL Server 2005 позволяет писать собственные функции для CLR, которые могут выполняться на стороне сервера.Вы можете прочитать введение MSDN Использование интеграции CLR в SQL Server 2005.Это должно позволить вам реализовать вашу функцию как дополнение к серверу sql и работать на собственной скорости.

Другие советы

Вы можете посмотреть эту страницу, она предоставляет код SQL:

Точка кода SQL в многоугольнике

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

Вы можете переписать PointInPolygon как хранимую процедуру с курсором.

Я должен признать, что я не полностью понимаю ваш алгоритм для проверки попадания в точку.В любом случае структура данных для многоугольника нечетная, поскольку X1/Y1 линии должны быть равны X2/Y2 предыдущей строки, чтобы сформировать многоугольник.Поэтому я бы хранил отдельные точки только для того, чтобы структура данных была гарантированно согласованной, а последняя и первая точка снова были связаны между собой.

Что касается алгоритма определения того, находится ли точка внутри (2D) многоугольника или нет, я бы сначала отфильтровал линии, которые являются кандидатами, и создал «разрез» (горизонтальный или вертикальный), чтобы получить список точек пересечения линий. и заказать их.Затем, используя функцию ранга, он находится внутри многоугольника, если ранг нечетный, если четный, мы находимся вне многоугольника (или в «дыре»).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top