ArcGIS DesktopでPythonを使用して、原点からさまざまな距離のラインを作成しますか?


11

ArcGISとPython(ArcPy)を使用して、設定された距離と角度を使用して、単一のポイントからラインフィーチャを作成しようとしています。

これらの座標にポイントがあります:X = 400460.99、Y = 135836.76

このポイントから、そのポイントから15度の角度で800メートルの長いラインを作成します。

結果のエンドポイントがどうなるかわかりません。

私のデータは、メリーランド州平面南-メートルに投影されています。

回答:


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(シータ別名15度)= y / rおよびy = r * sin(15度)の場合、xおよびy変位の式を切り替える必要はありませんか?
ジギー

@Ziggyあなたの式は、北の東で測定された角度に対して正しいものではありません。東の北の角度に数式を適用しようとしています。
whuber

位置と角度が北の東にあることをどのように識別できましたか?これはこれらのコメントの範囲外かもしれませんが、基本的なトリガーの概念を学習して、このようなGISの質問に適用する場所に関するリソースの推奨事項はありますか?
ジギー

1
@Ziggy従来、地理学者は北の東の角度で角度を測定していましたが、他にも多くの方法があります。それが、私が「角度」が意味するものとそれがどのように測定されるかを確立するように注意した理由です。他の規則を使用している人は、このソリューションを適用するために通常の調整を行うだけで済みます。私はトリガーを学習するためのリソースの専門家ではありません。GISの質問に対処するのに十分すぎるほどだった高校の代数テキストからずっと前に学習しました。 とにかく多くのトリガーを知る必要はありません
whuber

13

上に構築さ@ whuberの答えあなたはPythonでこれを実装したい場合に述べたように、あなたはそのようにのような点の集合として出力を作成し、変位を計算したいです:

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.