Vous créez une ligne à distance variable du point d'origine à l'aide de Python dans ArcGIS Desktop?

11

J'essaie de créer une entité linéaire à partir d'un point unique, en utilisant une distance et un angle définis à l'aide d'ArcGIS et de Python (ArcPy).

J'ai un point à ces coordonnées: X = 400460.99, Y = 135836.76

À partir de ce point, je veux créer une ligne longue de 800 mètres à un angle de 15 degrés à partir de ce point.

Je ne sais pas quel sera le résultat final.

Mes données sont projetées dans le Maryland State Plane South - Meters.

J Graham
la source

Réponses:

13

Le point final est déplacé de l'origine de 800 mètres, bien sûr. Le déplacement dans la direction de la coordonnée x est proportionnel au sinus de l'angle (est du nord) et le déplacement dans la direction de la coordonnée y est proportionnel au cosinus de l'angle.

Ainsi, à partir de sin (15 degrés) = sin (0,261799) = 0,258819 et cos (15 degrés) = 0,965926, nous obtenons

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

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

Par conséquent, les coordonnées du point final sont (400460,99 + 207,055, 135836,76 + 772,741) = (400668,05, 136609,49).

whuber
la source
Je suis un peu confus. si sin (thêta aka 15 degrés) = y / r et y = r * sin (15 degrés), les formules des déplacements x et y ne devraient-elles pas être changées?
ziggy
@Ziggy Vos formules ne sont pas les bonnes pour un angle mesuré à l'est du nord. Vous essayez d'appliquer des formules pour un angle au nord-est.
whuber
comment avez-vous pu discerner que l'emplacement et l'angle sont à l'est du nord? cela pourrait être en dehors de la portée de ces commentaires, mais avez-vous des recommandations de ressources sur où apprendre et appliquer les concepts de base des trigs aux questions SIG comme celle-ci?
ziggy
1
@Ziggy Classiquement, les géographes mesurent les angles en degrés à l'est du nord, mais il existe de nombreuses autres façons. C'est pourquoi j'ai pris soin d'établir ce que j'entendais par «angle» et comment il est mesuré. Les personnes utilisant d'autres conventions n'ont qu'à effectuer les ajustements habituels pour appliquer cette solution. Je ne suis pas un expert des ressources pour l'apprentissage trig: je l'ai appris il y a longtemps à partir d'un texte d'algèbre de lycée, qui était plus que suffisant pour répondre à toutes les questions SIG. Vous n'avez pas besoin de savoir beaucoup de trig de toute façon .
whuber
13

En vous basant sur la réponse de @ whuber , si vous vouliez implémenter cela en Python, vous calculeriez le déplacement comme indiqué, puis créeriez une sortie comme une collection de points comme ceci:

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
la source