문제

아래에 설명 된대로 SQL2005 DB에 다각형 구조가 있습니다.

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 Server로 이동해야합니다. 그러나 SQL 2005에는 기본 공간 기능이 없으며 추가 공간 기능 라이브러리를 사용하고 싶지 않습니다. 이 기능을 T-SQL로 포트하려면 어떻게해야합니까? :) 또는 PointInpolygon 검사를위한 다른 해결책이 있습니까?

감사

도움이 되었습니까?

해결책

SQL Server 2005를 사용하면 서버 측을 실행할 수있는 CLR에 기본 기능을 작성할 수 있습니다. MSDN 소개를 읽을 수 있습니다 SQL Server 2005에서 CLR 통합 사용. 이를 통해 기능을 SQL Server에 추가하여 기능을 구현하고 기본 속도로 실행할 수 있습니다.

다른 팁

이 페이지를 살펴보면 SQL 코드를 제공합니다.

다각형의 SQL 코드 포인트

당신은 내장 된 SQL 2008과 함께 진행하지 않았습니다. 지리 공간 유형. 나는 그것을 사용하지 않았으므로 그 이상으로 아무것도 제공 할 수 없습니다.

PointInpolygon을 커서와 함께 저장된 Proc로 다시 작성할 수 있습니다.

나는 당신의 알고리즘이 포인트 타격을 테스트하기 위해 완전히 얻지 못한다는 것을 인정해야합니다. 어쨌든, 라인의 x1/y1은 다각형을 형성하기 위해 이전 라인의 x2/y2와 같아야하기 때문에 데이터 구조는 다각형에 대해 홀수입니다. 따라서 데이터 구조를 일관성있게 보장하기 위해 단일 포인트를 저장하고 마지막과 첫 번째 포인트는 다시 연결됩니다.

포인트가 (2d) 다각형 내부에 있는지 여부를 찾기위한 알고리즘은 먼저 후보자 인 선을 필터링하고 "컷"(수평 또는 수직)을 생성하여 라인 교차점 점수 목록을 얻을 수 있습니다. 그리고 주문하십시오. 그런 다음 순위 함수를 사용하면 순위가 홀수 인 경우 다각형 내부에 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top