# How to calculate position in a clockwise manner?

386
3
12-01-2023 08:31 AM
Labels (3)
by
Occasional Contributor

I have data with X/Y data that plots and I'm trying to get it to look like so:

I've tried near analysis, and it gets me close but doesn't label them in a clockwise manner. Is there any geoprocessing tool or arcpy process that I'm overlooking that will accomplish this?

1 Solution

Accepted Solutions
MVP Esteemed Contributor

slow week

``````aoi  # a square
array([[  0.00,   5.00],
[  5.00,  10.00],
[ 10.00,   5.00],
[  5.00,   0.00],
[  0.00,   5.00]])

def geom_angles(a, fromNorth=False):
"""Polyline/segment angles.

Parameters
----------
a : array-like
A Geo array or a list of arrays representing the polyline shapes.
"""
out = []
dxy = a[1:] - a[:-1]
ang = np.degrees(np.arctan2(dxy[:, 1], dxy[:, 0]))
if fromNorth:
ang = np.mod((450.0 - ang), 360.)
return ang

geom_angles(aoi, fromNorth=False)  # -- option 1
array([ 45.00, -45.00, -135.00,  135.00])

geom_angles(aoi, fromNorth=True)  # -- option 2
array([ 45.00,  135.00,  225.00,  315.00])

cent = np.mean(aoi[:-1])  # -- now from the center of the points
vals = aoi - cent  # -- angles from the center

vals
array([[ -5.00,   0.00],
[  0.00,   5.00],
[  5.00,   0.00],
[  0.00,  -5.00],
[ -5.00,   0.00]])

geom_angles(vals, fromNorth=False)
array([ 45.00, -45.00, -135.00,  135.00])

geom_angles(vals, fromNorth=True)
array([ 45.00,  135.00,  225.00,  315.00])``````

... sort of retired...
3 Replies
Esri Esteemed Contributor

You can write your own, but I doubt there's any general purpose tool for this.

The atan2 function takes dy & dx parameters, but that's counter-clockwise from 3-o'clock,
so you'd need to reverse the sign and rotate.

- V

MVP Esteemed Contributor

slow week

``````aoi  # a square
array([[  0.00,   5.00],
[  5.00,  10.00],
[ 10.00,   5.00],
[  5.00,   0.00],
[  0.00,   5.00]])

def geom_angles(a, fromNorth=False):
"""Polyline/segment angles.

Parameters
----------
a : array-like
A Geo array or a list of arrays representing the polyline shapes.
"""
out = []
dxy = a[1:] - a[:-1]
ang = np.degrees(np.arctan2(dxy[:, 1], dxy[:, 0]))
if fromNorth:
ang = np.mod((450.0 - ang), 360.)
return ang

geom_angles(aoi, fromNorth=False)  # -- option 1
array([ 45.00, -45.00, -135.00,  135.00])

geom_angles(aoi, fromNorth=True)  # -- option 2
array([ 45.00,  135.00,  225.00,  315.00])

cent = np.mean(aoi[:-1])  # -- now from the center of the points
vals = aoi - cent  # -- angles from the center

vals
array([[ -5.00,   0.00],
[  0.00,   5.00],
[  5.00,   0.00],
[  0.00,  -5.00],
[ -5.00,   0.00]])

geom_angles(vals, fromNorth=False)
array([ 45.00, -45.00, -135.00,  135.00])

geom_angles(vals, fromNorth=True)
array([ 45.00,  135.00,  225.00,  315.00])``````

... sort of retired...
by
Occasional Contributor

Thanks Dan!