I have done a viewshed (ArcGIS Spatial Analyst 10.5) on a DEM raster layer, where a limited amount of observer points (5) are aiming to capture as many points as possible on this DEM surface.

The idea is that the observing points won't capture all these points. But if I wanted to optimize this and be able to see how many points is being picked up by the viewshed, how would I go about this?


To determine the percentage of the area that is visible from your observer locations, you can simply reclassify the output as a Boolean (visible=1 and not visible=0). Then get the total count of raster as a proportion of the total number of cells in your study area as per this example. If you don't have Spatial Analyst, then an alternative option would be to make one raster as described and another where visible cells are any value and everything else is NoData. Then get the counts of all cells in the study area and visible cells using the Summary Statistics tool.

However, that only gets you the percentage for one scenario, and if I have understood your question, you want to move points to optimise visibility. To determine which points to move, I'd recommend looking at the Observer Points tool. From this you can determine which point(s) are contributing the least to the total visibility and which ones have the most overlap of visibility (and are therefore a bit redundant - and thus are candidates to be moved). You could then approach the iterative nature of this in a few ways:

  1. Manually - if you are very familiar with the area, you may be able to move points based on local knowledge that informs you about accessibility, obstructions and terrain height. If a quick improvement rather than maximal optimisation is sufficient, then you could test half a dozen iterations and pick the best.
  2. Repeatedly test randomly located observers until you find the best positions, probably limiting this to n iterations (where n is large, depending on the speed of your computer and patience). I'd refine this by restricting the locations where the points can be randomly located to higher ground. You'll need to write some Python for this.
  3. Start with a logical positioning of the observers and then iterate n-times but this time, identify the point(s) contributing the least to visibility (as described above) and then moving it to higher ground within some radius of its current location - you'll need some sanity checks here to prevent the program flip-flopping the point between just two locations.
  • Thanks very much for your help. Regarding the first part of your response, could/would that involve the usage of the raster calculator? – Richard Hamlin Oct 19 '17 at 10:59
  • See reclassification – MappaGnosis Oct 19 '17 at 15:56

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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