ArcGIS Desktop에서 Python을 사용하여 원점에서 다양한 거리의 선을 생성합니까?


11

ArcGIS와 Python (ArcPy)을 사용하여 설정된 거리와 각도를 사용하여 단일 점에서 선 피쳐를 만들려고합니다.

이 좌표에 포인트가 있습니다 : X = 400460.99, Y = 135836.76

이 시점에서 그 지점에서 15도 각도로 800 미터 길이의 선을 만들고 싶습니다.

결과 엔드 포인트가 무엇인지 알 수 없습니다.

내 데이터는 Maryland State Plane South-Meters에 투영됩니다.

답변:


13

물론 종점은 800 미터만큼 원점에서 변위됩니다. x 좌표 방향의 변위는 각도의 사인 (북동쪽)에 비례하고 y 좌표 방향의 변위는 각도의 코사인에 비례합니다.

따라서 sin (15도) = sin (0.261799) = 0.258819 및 cos (15도) = 0.965926에서 다음을 얻습니다.

x-displacement = 800 sin(15 degrees) = 800 * 0.258819 = 207.055 

y-displacement = 800 cos(15 degrees) = 800* 0.965926 = 772.741.

따라서 종점 좌표는 (400460.99 + 207.055, 135836.76 + 772.741) = (400668.05, 136609.49)입니다.


약간 혼란 스러워요. sin (theta aka 15도) = y / r 및 y = r * sin (15도)이 x와 y 변위에 대한 공식이 바뀌지 않아야 하는가?
ziggy

@Ziggy 수식은 북쪽에서 동쪽으로 측정 된 각도에 대한 올바른 수식이 아닙니다. 동쪽에서 북쪽으로 각도에 대한 공식을 적용하려고합니다.
whuber

위치와 각도가 북쪽의 동쪽임을 어떻게 알 수 있었습니까? 이것은 이러한 의견의 범위를 벗어난 것일 수도 있지만, 이와 같은 GIS 질문에 기본 삼각 개념을 배우고 적용 할 수있는 리소스 권장 사항이 있습니까?
ziggy

1
@Ziggy 일반적으로 지리학자들은 북쪽에서 동쪽으로 각도를 측정하지만 다른 많은 방법이 있습니다. 그렇기 때문에 "각도"의 의미와 측정 방법을 확인하기 위해주의를 기울였습니다. 다른 규칙을 사용하는 사람들은이 솔루션을 적용하기 위해 일반적인 조정 만하면됩니다. 나는 삼각법 학습을위한 리소스에 대한 전문가가 아닙니다. 어쨌든 많은 삼각법을 알 필요가 없습니다 .
whuber

13

바탕 @ whuber의 대답 파이썬에서이를 구현하기를 원한다면, 당신이 언급 한 바와 같이 변위 계산하는 것입니다 것은, 다음 점의 컬렉션으로 출력을 만들과 같이 :

import arcpy
from math import radians, sin, cos

origin_x, origin_y = (400460.99, 135836.7)
distance = 800
angle = 15 # in degrees

# calculate offsets with light trig
(disp_x, disp_y) = (distance * sin(radians(angle)),\
                    distance * cos(radians(angle)))
(end_x, end_y) = (origin_x + disp_x, origin_y + disp_y)

output = "offset-line.shp"
arcpy.CreateFeatureClass_management("c:\workspace", output, "Polyline")
cur = arcpy.InsertCursor(output)
lineArray = arcpy.Array()

# start point
start = arcpy.Point()
(start.ID, start.X, start.Y) = (1, origin_x, origin_y)
lineArray.add(start)

# end point
end = arcpy.Point()
(end.ID, end.X, end.Y) = (2, end_x, end_y)
lineArray.add(end)

# write our fancy feature to the shapefile
feat = cur.newRow()
feat.shape = lineArray
cur.insertRow(feat)

# yes, this shouldn't really be necessary...
lineArray.removeAll()
del cur
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.