Calculate/Compare 3D-angle and rotation of two polygons

08-03-2017 03:25 PM
New Contributor

Hi everyone, I hope this forum can help me with a problem of one of my archaeology students. We conducted an experiment were we measured the spatial movement of artefacts after trampling of an area. Our data are two polygon layers (before/after trampling) in an arbitrary x,y,z coordinate system (Total Station data, can be georeferenced/projected). Each polygon is one artefact and consists of three data points. The two layers are related in that we shot in each point for every artefact before and exactly the same point again after excavation. I would like to automate the process of identifying movement of each artefact (each polygon). I would be interested in the change of 3D-angle and rotation of each artefact. I tried to do this in ArcScene, but I’m a bit lost. I’m also not sure whether ArcGIS is the best program to do this or whether there are easier solutions. Any help would be much appreciated.

0 Kudos
4 Replies
MVP Esteemed Contributor

Interesting... what form is the data in now?

If you have them in X, Y, Z for the point objects for each artifact between the two time periods, I am thinking array manipulation and analysis tools may be useful (numpy and/or scipy) and could be accessed through ArcMap or Pro to provide any capabilities that Arc*'s 3D tools don't

What have you looked in 

Pro 3d or


If you could post a sample even as text in your post it would be interesting

0 Kudos
New Contributor

Hi Dan, thanks a lot for coming back to me so quickly. In 3D analyst, I had a look at 'slope' and 'aspect' (also 'surface aspect'). I found on this forum the suggestion to use the mean value in Zonal statistics to get the average slope of my polygon. However, both of these procedures want to have a raster file, I can create a DEM/TIN/raster from my data, select area by my created polygons and then do the means, but I'm not completely sure if this is the right approach. I also had a look at Cartography tools, 'calculate main polygon angle' and then compare the two layers outside of ArcGIS (Excel), but this gives me only 2D angles and not the angle in relation to the z-value. I'm also not completely sure whether ArcGIS calculates the same main axis when the polygon is rotated (if this makes sense).

The original data is ASCII, but at the moment it is in an excel file, an example below:

B263.14931.622.33 27999.5671002.50999.718 2475999.5411002.49599.7
 28999.5581002.49599.718 2476999.5471002.51399.696
 29999.5451002.49899.716 2477999.5571002.51799.697
B272.4932.8723.8 33999.7611002.42299.719 2457999.7661002.41299.7
 34999.7481002.42399.717 2458999.7531002.4299.695
 35999.7391002.43299.719 2459999.7411002.43199.7
B284.46243.723 54999.6651002.03499.72 2276999.6811002.00599.744
 55999.6431002.03699.717 2277999.6661002.02799.744
 56999.631002.05399.718 2278999.6531002.02899.758
0 Kudos
MVP Esteemed Contributor

read the help topics on slope and aspect for rasters... they aren't the same as what you would expect as a formulation for points and conventional mathematical treatments.

I will have a look and get back to you

Can you confirm points 27, 28, 29 represent 3 observations for shell B26 at time 0, and 2475, 2476, 2477 are those same locations (albeit shifted) for the same shell at time 1?

So can the 3 points be treated as 3 separate locations or 3 observations for the same location (from which one could determine an average? like below

a0  # array a0 for 27, 28, 29, treated as 3 observations at one location

array([[ 999.567000,  1002.509000,  99.718000],
       [ 999.558000,  1002.495000,  99.718000],
       [ 999.545000,  1002.498000,  99.716000]])

np.average(a0, axis=0)
array([ 999.556667,  1002.500667,  99.717333])
0 Kudos
New Contributor

Dear Dan, my sincere apologies for the late reply, I someone didn't get a notification of your answer.

I have attached an ArcScene image of the situation. This is the situation of the artefact layer after trampling in relation to an arbitrary horizontal plane. For the angle calculation, I think we can treat the three observation as one (to get the vector of the plane created through the three measurements and calculate the angle between these two planes). I think we need to treat the three observations also as one for the rotation, but I'm not sure how we can get a consistent direction of each triangle. Can we chose two observations and then calculate a vector which runs perpendicular to the line created by the first two observations through the third observation?

0 Kudos