Tworzenie linii o różnej odległości od punktu początkowego przy użyciu Pythona w ArcGIS Desktop?

11

Próbuję utworzyć element linii z jednego punktu, używając ustalonej odległości i kąta za pomocą ArcGIS i Python (ArcPy).

Mam punkt na tych współrzędnych: X = 400460,99, Y = 135836.76

Od tego momentu chcę utworzyć linię o długości 800 metrów pod kątem 15 stopni od tego punktu.

Nie wiem, jaki będzie wynikowy punkt końcowy.

Moje dane są wyświetlane w Maryland State Plane South - Meters.

J Graham
źródło

Odpowiedzi:

13

Oczywiście punkt końcowy jest przesunięty od początku o 800 metrów. Przemieszczenie w kierunku współrzędnej x jest proporcjonalne do sinusa kąta (na wschód od północy), a przemieszczenie w kierunku współrzędnej y jest proporcjonalne do cosinusa kąta.

Zatem z sin (15 stopni) = sin (0,261799) = 0,258819 i cos (15 stopni) = 0,965926 otrzymujemy

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

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

Dlatego współrzędne punktu końcowego wynoszą (400460,99 + 207,055, 135836.76 + 772,741) = (400668,05, 136609,49).

Whuber
źródło
Jestem trochę zmieszany. jeśli sin (theta aka 15 stopni) = y / r oraz y = r * sin (15 stopni) czy nie należy zmieniać wzorów dla przesunięć xiy?
ziggy
@Ziggy Twoje formuły nie są poprawne dla kąta mierzonego na wschód od północy. Próbujesz zastosować formuły dla kąta na północ od wschodu.
whuber
jak udało ci się rozpoznać, że położenie i kąt znajdują się na wschód od północy? może to być poza zakresem tych komentarzy, ale czy masz jakieś zalecenia dotyczące zasobów, gdzie można się uczyć i stosować podstawowe koncepcje wyzwalaczy do pytań GIS, takich jak to?
ziggy
1
@Ziggy Konwencjonalnie geografowie mierzą kąty w stopniach na wschód od północy, ale istnieje wiele innych sposobów. Dlatego starałem się ustalić, co rozumiem przez „kąt” i jak jest mierzony. Osoby stosujące inne konwencje potrzebują jedynie zwykłych zmian, aby zastosować to rozwiązanie. Nie jestem ekspertem od zasobów do nauki trig: Dowiedziałem się tego dawno temu z tekstu algebry w szkole średniej, który był więcej niż wystarczający, aby odpowiedzieć na wszelkie pytania GIS. Zresztą i tak nie musisz wiedzieć dużo .
whuber
13

Opierając się na odpowiedzi @ whuber , jeśli chcesz zaimplementować to w Pythonie, obliczysz przesunięcie zgodnie z opisem , a następnie utworzysz wynik jako zbiór takich punktów:

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
scw
źródło