I am working on a wind farm proposal. I have the positions of 70 proposed turbines. I also have the positions of 80 houses within 20km of the proposed turbines. I created a viewshed for the 70 turbines, and was able to determine which parts of the surrounding landscape would be able to see at least one turbine. The viewshed has also told me how many turbines are visible from each pixel in the raster. Based on the position of the house, I have determined how many turbines are visible from each house.

But now I'd like to take it a step further. I would like to determine which specific turbines are visible from each house.

I have two ideas, both of which involve a lot of labor. (1) Create a viewshed for each house individually. Record the specific turbines visible from each house. This will involve creating 80 individual viewsheds - too many. (2) Use the "Create line of site tool" between each house and each turbine. This will involve 80 x 70 = 5600 individual calculations - too many.

There must be a quicker way to do this. I have ArcGIS 10.0 with 3D analyst activated.

  • Creating 80x70 long-sections is nothing extraordinary. It's enough to compare slope between ends and slope and check if it is the largest
    – FelixIP
    Apr 20, 2016 at 9:39

2 Answers 2


You can achieve this without timely computations of viewshed.


Add geometry attributes and id’s to both houses (70 total) and towers (40 total): enter image description here Spatially join towers to nodes (one to many, massive search radius) and concatenate their names into field FROMTO: enter image description here

  • Convert first couple of XY into points
  • Convert second couple of XY into points and merged with first.
  • Apply points to line tool using FROMTO as line id.
  • Interpolate Shapes into 3D

Add field VISIBLE to 3D shapes table and populate it using field calculator expression:

def isVisible(shp,human,tower):
 part=shp.getPart(0); n=len(part)
 pS=part.getObject(0); pE=part.getObject(n-1);pStart=arcpy.PointGeometry(pS)
 for i in xrange(1,n-1):
  if slope>SLOPE:return 0
 return 1


isVisible( !Shape!,2,10)

It returns 1 if tower is visible from the house, 0 otherwise (Note: I assumed height of observer = 2 m, tower height = 10 m)

‘Visible’ lines for a couple of houses shown here:

enter image description here


If you do not have any Python or ModelBuilder Skills, now is a good time to learn because this is a great problem to solve with Python or ModelBuilder Iterators. Your labor will be worth the effort since you will end up with a reusable tool. Those wind farm folks change those tower location often!
With looping, you will only need set the path to the towers, the houses, and the surface model once- execute your tool and wait. A recommended workflow might be.... Select turbine 1, calculate the viewshed for that turbine, use Add Surface Information (3d Analyst Tool) to determine which houses can see that turbine, populate the attribute table in the house layer, Select tower 2...repeat.

For each of the 70 loops you could add a new attribute to the houses data with the name of the turbine and populate that with a 1(true) or 0 (false), or with Python you could create a new line feature from the house to the visible turbine for a cool map.

If you have little to no ModelBuilder skill you could still create the workflow in ModelBuilder, select turbine 1 in ArcMap, execute the tool, then select turbine 2. That is only 70 times around and not too bad.


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.