다각형의 SQL Server 2005 포인트
-
03-07-2019 - |
문제
아래에 설명 된대로 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 2008과 함께 진행하지 않았습니다. 지리 공간 유형. 나는 그것을 사용하지 않았으므로 그 이상으로 아무것도 제공 할 수 없습니다.
PointInpolygon을 커서와 함께 저장된 Proc로 다시 작성할 수 있습니다.
나는 당신의 알고리즘이 포인트 타격을 테스트하기 위해 완전히 얻지 못한다는 것을 인정해야합니다. 어쨌든, 라인의 x1/y1은 다각형을 형성하기 위해 이전 라인의 x2/y2와 같아야하기 때문에 데이터 구조는 다각형에 대해 홀수입니다. 따라서 데이터 구조를 일관성있게 보장하기 위해 단일 포인트를 저장하고 마지막과 첫 번째 포인트는 다시 연결됩니다.
포인트가 (2d) 다각형 내부에 있는지 여부를 찾기위한 알고리즘은 먼저 후보자 인 선을 필터링하고 "컷"(수평 또는 수직)을 생성하여 라인 교차점 점수 목록을 얻을 수 있습니다. 그리고 주문하십시오. 그런 다음 순위 함수를 사용하면 순위가 홀수 인 경우 다각형 내부에 있습니다.