ArcPy를 사용하여 다각형의 각면의 방향을 계산 하시겠습니까?


9

태양 노출을 계산할 수 있도록 다각형에서 각 선의 방향을 조사하고 싶습니다. 각 다각형은 건물을 나타내며 관련 높이가 있습니다. 현재는 오리엔테이션을 고려하고 나중에 음영 문제를 고려할 것입니다.

내가 생각한 한 가지 접근법은 다각형을 선으로 나누고 각 선의 방향을 계산하는 것이었지만 어려움은 그 선의 바깥면을 식별해야한다는 것입니다. 대부분의 다각형은 직선이있는 단순한 4면 그림이지만, 그렇지 않은 경우가 적습니다 (단지 고려하고 싶지만 아직 해결하지 않아도되는 문제).

나는 파이썬에 익숙하고 스크립트 에서이 모든 것을 할 계획이었습니다.


1
이 질문에 대한 답변을 도와 주세요
Sean

@Sean-감사합니다. 일반적으로 도움이됩니다. 이 작업을 수행하는 데 사용할 수있는 특정 ArcGIS 명령에 익숙하지 않습니다. 또한 다각형에서 선의 내부 / 외부면을 아는 문제도 여전히 남아 있습니다.
djq

당신이 '방향'이라고 말할 때, 당신은 나를 위해 충분히 잘 정의하지 않았습니다. 예를 들어 완벽한 육각형의 방향은 무엇입니까?
Dan S.

@ Dan S. 방금 다각형에 각 선의 방향을 포함하도록 대답을 편집했습니다.
djq

미안 응답자-어제 현상금을 제대로 할당하지 못했습니다.
djq

답변:


6

대다수 방향을 원한다면 위의 @Mapperz 답변을 확인하십시오.

그렇지 않으면, 다각형 선 도구 사용하여 다각형을 선 으로 나눌 수 있습니다. 왼쪽 및 오른쪽 FID 필드를 추가합니다. 외부 다각형이없는 경우 필드는 -1입니다. 건물이 인접하거나 겹치는 경우 약간의 혼란이 발생할 수 있습니다.

여기에서 모든 정점에서 선을 분할 한 다음 ( COGO 선으로 분할 사용 ) 각 선의 각도를 계산할 수 있습니다 (잠재적으로 COGO 속성 업데이트 ).

북쪽에서 각도 필드를 계산했다고 가정하면 left_FID가 -1 인 경우 화면이 정확하고 right_FID가 -1 일 때 화면을 얻으려면 180 °를 더하면됩니다. 그런 다음 집계 할 수있는 원래 FID를 기반으로 길이 등을 기준으로 대다수 측면을 얻습니다.

Polygon to line 도구는 스크립팅이 가능합니다. (알고있는 한) COGO 도구는 사용할 수 없으므로 직접 작성해야합니다.

도움이 되었기를 바랍니다!


2
뻔뻔한 플러그 및 주석 : 먼저 정보 라이센스가없는 경우 code.google.com/p/boundary-generator 는 Polygon to Line 도구와 거의 동일합니다. 둘째-전체 다각형의 일반적인 방향을 보는 것보다 훨씬 더 많은 정보를 제공합니다. .
Dan S.


5

방향 찾기

스크립트 내에서 다각형은 순환 적으로 정렬 된 벡터 튜플 (v [0], v 1 , ... , v [m-1], v [m] = v [0]). 각 벡터는 정점의 좌표를 제공합니다 (두 개의 연속 정점이 일치하지 않음). 이것에서 다른 사람들이 지적했듯이 법선 벡터 (즉, 가장자리 방향에 수직 인 벡터)를 얻는 것이 간단합니다.

n [i] = t (v [i + 1]-v [i]).

"t"연산은 벡터를 시계 반대 방향으로 90도 회전 시킵니다 .

t ((x, y)) = (y, -x).

이 법선 벡터의 방향 만 중요하므로 단위 길이를 갖도록 크기를 다시 조정하십시오. 해당 가장자리의 길이입니다). 이제부터 이것이 완료되었다고 가정 해 봅시다. 결과 단위 법선 벡터의 구성 요소를 다음과 같이 씁니다.

n [i] = (u [i], v [i]), i = 0, 1, ..., m-1.

내부에서 외부로 차별

언급했듯이, 이것은 방향성 모호성을 남깁니다. 우리는 n [i] 또는 -n [i]를 사용해야합니까? 어느 쪽이 바깥 쪽을 가리 킵니까? 이 질문은 발견에 해당 정도가우스지도 . 이를 계산하려면 고리 주위를 이동할 때 법선 방향이 바뀌는 각도를 합산해야합니다. 법선 벡터는 단위 길이를 가지기 때문에 두 연속 에지 사이의 각도의 코사인은

Cos (q_i) = n [i]입니다. n [i + 1] = u [i] * u [i + 1] + v [i] * v [i + 1], i = 0, 1, ..., m-1.

(n [m] = n [0]을 정의하십시오.)

두 개의 연속 에지 사이의 각도의 사인은

Sin (q_i) = n [i]입니다. t (n [i + 1]) = u [i] * v [i + 1]-v [i] * u [i + 1].

(이 계산에는 지금까지 합계, 차이 및 곱만 필요합니다.) 주역 탄젠트 함수 (ATan2)를 이러한 (코사인, 사인) 쌍에 적용하면 각도 q_i가 -180에서 180도 사이가됩니다. i = 0, 1, ..., n-1에 대해 이러한 각도를 합하면 링의 전체 곡률이 생성되며 (최대 부동 소수점 오차) 360 도의 배수 여야합니다. 자체 교차하지 않는 닫힌 고리의 경우 +360 또는 -360입니다. 첫 번째 경우 차수는 1이고 두 번째 경우 차수는 -1입니다. 외부 링의 각도가 +1이고 내부 링의 각도가 -1이면 법선은 모두 바깥쪽으로 향합니다. 이 규칙에 따라 필요에 따라 고리별로 고리 방향을 조정하십시오. 즉, 어떤 고리의 정도가 필요한 것과 반대이면, 그 고리에 대한 모든 법선을 부정하십시오. 이제 일사량 계산을 진행할 수 있습니다.


매우 포괄적 인 답변에 감사드립니다. '스크립트 내에서 다각형을 링 세트로 사용할 수 있습니다'라고 말할 때 다각형을 어떻게 사용할 수 있습니까? 일부 파이썬 스크립팅에 익숙하지만 다각형을 이런 식으로 해석하는 방법을 모르겠습니다. 나는 이것을 천천히 읽고 이해하려고 노력하고 있지만, 설명의 일부를 의사 코드로 번역 할 수는 없습니다.
djq

이 답변에 대한 몇 가지 참고 사항 : 일반적인 GIS API는 항상 다각형 바깥 쪽을 시계 반대 방향으로 IIRC로 표시합니다. 즉, 내부에서 외부를 구별하는 멋진 작업을 수행 할 필요가 없습니다. 외부 링에서 시계 방향 회전을 사용하십시오. 구멍에 시계 반대 방향으로. Celenius에 대한 설명 : '고리 세트'비트는 ArcGIS의 파이썬을 포함한 대부분의 API를 사용하여 다각형을 구성 선분으로 분해하는 방법입니다. 고리는 닫힌 곡선입니다. 다각형은 섬과 구멍을 지원할 수 있으므로 여러 개의 고리를 가질 수 있습니다.
Dan S.

@DAN 나는 GIS가 그와 같은 일관된 표현을 유지 한 경우 였으면 좋겠다. 수년에 걸쳐 ESRI 소프트웨어는 음과 양의 방향의 다각형 사이에서 앞뒤로 변동하여 방향이 정해지지 않았습니다. 이 시점에서 나는 그들의 현재 접근 방식에 관한 문서화 된 진술조차 신뢰할 수 없다고 확신한다 : 나는 신중할 것이다. 링의 모든 모서리를 이미 처리 한 후에는 방향을 확인하는 데 비용이 거의 들지 않습니다.
whuber

.. 글쎄, 나는 그 작은 IIRC 면책 조항을 고맙게 생각했습니다. ;) 더 이상 ESRI 스택에서 지오메트리 수준의 작업을 더 이상하는 것은 아닙니다.
Dan S.

@ Dan S.-파이썬에서 어떻게 프로그래밍 할 수 있는지에 대해서는 여전히 불분명합니다. 이에 대한 지침이 있습니까?
djq

1

도움?


그것은 당신이 파는 흥미로운 종이입니다. 그러나, 태양 노출 계산과 관련하여 기술 된 방법 중 어느 것도 (계산이 대략적인 근사치가 아닌 경우에는 계산되지 않습니다).
whuber

1

/ * 아마도 도움이 될 것이다 :

방위각-pi / 2는 RHR 다각형 측면의 바깥 쪽 방향입니다.

다음은 PostGIS 예제입니다. 마지막 명령문을 사용하여 bldg117862 테이블을 만들 수 있습니다. SRID는 EPSG 2271 (PA StatePlane North Feet)이며 형상은 다중 다각형입니다. ArcGIS 10에서 시각화하려면 bldg117862 테이블을 생성 한 후 쿼리 / 서브 쿼리를 쿼리 레이어 연결에 붙여 붙여 postgis에 연결하십시오. * /

-=== 질문의 시작 ===

/ * Outer query는 바깥 쪽 직교의 방향을 제공하고 변의 중간 점에서 변의 길이와 같은 길이의 바깥 쪽 직교 선을 만듭니다.

지배적 인 방향은 길이를 기준으로 내림차순으로 길이의 합이됩니다. * /

line_id를 side_id, length, degree (orthoaz)를 방향으로 선택, st_makeline (st_setsrid (st_line_interpolate_point (geom, .5), 2271), st_setsrid (st_makepoint (st_x (st_line_interpolate_point (geom, .5)) + (길이 * (sin ( orthoaz))), st_y (st_line_interpolate_point (geom, .5)) + (길이 * (cos (orthoaz)))), 2271))에서 geom으로

다음 외부 부질의는 측면 점 쌍으로부터 선을 만들고, 각 세그먼트에 대해 바깥 쪽 직교의 방위각 (orthoaz)을 계산합니다.

(SELECT bldg2009gid, line_id, st_length (st_makeline (startpoint, endpoint)) :: numeric (10,2) as length, azimuth (startpoint, endpoint), azimuth (startpoint, endpoint)-pi () / 2는 orthoaz, st_makeline ( 시작점, 종료점)

/ * 가장 안쪽의 하위 쿼리-generate_series ()를 사용하여 건물 다각형을 측면의 시작점 / 끝점 쌍으로 분해-주 1-오른쪽 규칙을 강제로 모든 다각형 측면의 공통 방향을 확인합니다. 주 2-예는 다각형에 대해 다각형을 사용 제거 가능 * /

(SELECT generate_series (1, npoints (exteriorring (geometryn (st_forceRHR (geom), 1)))-1) line_id, bldg2009gid로 지정, pointn (exteriorring (geometryn (st_forceRHR (geom), 1)), generate_series (1, npoints (exteriorring (geometryn (st_forceRHR (geom), 1)))-1)) 시작점으로, pointn (exteriorring (geometryn (st_forceRHR (geom), 1)), generate_series (2, npoints (exteriorring (geometryn (st_forceRHR (geomn) ), 1))))) 끝점으로 bldg117862)에서 t1) t2

-=== QUERY의 끝 ===

-bldg117862 테이블 작성 / 삽입 명령문

STANDARD_CONFORMING_STRINGS을 (를) ON으로 설정하십시오. DropGeometryColumn ( '', 'bldg117862', 'geom') 선택; DROP TABLE "bldg117862"; 시작; CREATE TABLE "bldg117862"(gid serial PRIMARY KEY, "motherpin"varchar (14), "taxpin"varchar (14), "status"varchar (15), "area"숫자, "prev_area"숫자, "pct_change"숫자, "picture"varchar (133), "mappage"varchar (6), "sref_gid"int4, "e_address"varchar (19), "a_address"varchar (19), "perim"숫자, "card"int4, "a_addnum" int4, "e_street"varchar (50), "a_street"varchar (50), "e_hsnum"varchar (10)); SELECT AddGeometryColumn ( '', 'bldg117862', 'geom', '2271', 'MULTIPOLYGON', 2); 0106000020DF080000010000000103000020DF080000010000000B0000008C721D6C98AC34415E2C5BB9D3E32541AE56DE17BEAC34410613E5A0A0E325411AB6C794AEAC3441BA392FE372E32541C89C38429DAC3441643857628AE325418C299A9095AC3441F66C29B573E32541983F02087EAC34413080AA9F93E325419BAC3C0A86AC3441AC1F3B3DABE32541803A40B974AC3441E8CF3DB9C2E325413E3758C186AC3441D0AAB0E7F7E325410AAAA5429BAC3441BA971217DCE325418C721D6C98AC34415E2C5BB9D3E32541 '); gist ( "geom"gist_geometry_ops)를 사용하여 색인 "bldg117862_geom_gist"ON "bldg117862"작성; 종료;


0

선분의 방향이 다각형에서 일정하다고 가정하면 각 선분에 수직 인 벡터의 방위 (제목)를 계산할 수 있습니다. 나는 지금 코드를 강타 할 시간이 없지만 수학이 필요하다면 쉽게 제공 할 수 있습니다 :-)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.