As a relative newbie to GIS, I'm quite sure there will be a way to do this in GIS (probably most efficiently by writing a python script!) but (to me anyway) this is a fairly complex thing to do and I have no idea where to start. I know I am going to have to learn python and I'm happy to do this if it's going to allow me to achieve what I need. Here's what I'm trying to achieve (and this is not a one off, it will be a regular process, so if I can spend a bit more time at the beginning to automate as much of this as possible so much the better):

I have a shapefile of points, which are viewpoints in a particular area.

I then have multiple shapefiles (could be up to 50+) with other sets of points in each file (proposed development points,) each of which I want to buffer at (potentially different) distances (stored in the attribute table for each points file) to show different potential development extent for each.

What I'd then like to get out of GIS (I think using terrain / viewsheds info,) are the bearings from each point in the viewpoints shapefile, to the visible extents (left to right, i.e. 270-276 degrees) of EACH of my 50+ shapefile buffer files (note, not each point within each shapefile, just furthest left and furthest right from each viewpoint if possible?) The bearings would need to tangent the outer edges of the outermost buffers to show full potential extents, rather than just to the points themselves.

Also, to make matters even more complicated, I only want to give bearings of what can actually be seen? So if the furthest left point in one particular file is outwith the viewshed for that shapefile (I would need to run viewsheds for each of my 50+ files,) then the visibility bearings wouldn't include this, they would just go from the points that can be seen.

Finally, I'd need GIS to give me distances from each viewpoint to the nearest point of each development, so that would be the nearest point in each of my 50+ development shapefiles.

I have ArcGIS 10 with 3D Analyst extension.

Can anyone help? Does anyone have ANY idea if this is something that is realistic to achieve in GIS, or any tips in terms of how I can do this?

[EDIT]: Ok, so I realise that this is a complicated procedure, (though I'm pleased it seems to be doable!) so I'm splitting it into indivudual tasks, some I know how to do and some I'm sticking, but I think some of the sticking points are individual queries, so any additional questions while I work this out, I will link below...

Obtaining bearings to polygon extents in ArcGIS?

I'll also add some diagrams and further breakdowns as requested.

  • 3
    Would you perhaps be able to include a diagram of the first thing you are trying to achieve and then reduce your text to where you are stuck doing that? When that is resolved any subsequent blocking points will be easier to research/ask separately.
    – PolyGeo
    Jun 5, 2014 at 13:27
  • I would try this in model builder first before diving too far into python if you're new to py. resources.arcgis.com/en/help/main/10.1/index.html#/…
    – GISHuman
    Jun 5, 2014 at 13:28
  • 2
    Even before ModelBuilder (which I would probably skip using Copy As Python Snippet) I think you should start by running the tools you think you may need manually from their tool dialogs to see what parameters may be useful to you.
    – PolyGeo
    Jun 5, 2014 at 13:40
  • 1
    Thanks very much for these pointers - I'm not familiar with model builder or copy as python snippet, but after a quick look at both online agree they are very useful starting points! I will go through each step and create a model-builder style diagram of what I'm trying to do and where the sticking points are, and edit question accordingly! Think I might be trying to run before I can walk in my GIS excitement...
    – lisagravy
    Jun 5, 2014 at 14:03
  • 2
    This is certainly something that can be done and doesn't sound terribly complicated, but along the lines of what PolyGeo has said I think your question as written is too broad for us to really address in one place with the SE format. The answer to this question might be steps of an overall process (and there are at least a couple of different approaches), but each step would probably be a different question. And then turning it into a model or script is yet another process. One significant factor is going to be your source data (resolution of terrain) and extent of study.
    – Chris W
    Jun 5, 2014 at 19:36

2 Answers 2


Fast process outline, with no tool links and some steps may need to be further broken down and any or all of it run as an iterative process in a model (or submodels):

  1. Generate viewshed polygons of all your viewing points.
  2. Generate development area polygon - concave hull your point clusters (not as simple as it sounds), buffer the points, possibly multi-ring buffer using your distance attributes mentioned - without seeing what the data looks like there's no way to suggest a particular point to polygon method.
  3. Intersect your viewsheds and development area polys to determine visible areas
  4. Determine lines from viewpoints to outer (and possibly inner) edges of visible area polys - your linked question. Note that you could have the same development area generate two visible polys if there is an obstructing hill in the middle.
  5. Get the bearings of those lines.

This can be completed without any Python.

This paper http://www.sciencedirect.com/science/article/pii/S0198971509000805 lays out the ArcGIS methodology in an almost step-by-step manner on how to achieve just what you require. Check Research Gate for a free late draft of this paper if your library does not subscribe to CEUS or you do not want to drop $40.

Combined with this spec sheet on viewsheds in ArcGIS http://resources.arcgis.com/en/help/main/10.1/index.html#//009z000000v8000000 you should be good to go.

Stop back if you have questions as you work.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.