I'm an international PhD student in the field of Climate change at Humboldt University. For my research I#m using ArcGIS 10.3. I need a tool which By luck I found the source as a Phyton code on the web:
http://gis.stackexchange.com/questions/ ... -arcgis-de
I am interested in importing this in ArcGIS as a toolbox. Its a code for computing the shadow of building footprint, considering the height of the building, at a certain date and time of the year. Unfortunately and sadly I have knowledge on scripting. Therefore I was wondering if someone could help me with that, or at least to check whether this code is correct? I appreciate your help in advance.
Cheers
CoDe:
Code: Alles auswählen
import arcpy
import os
import math
def message(msg, severity=0):
# Adds a Message (in case this is run as a tool)
# and also prints the message to the screen (standard output)
#
print msg
# Split the message on \n first, so that if it's multiple lines,
# a GPMessage will be added for each line
try:
for string in msg.split('\n'):
# Add appropriate geoprocessing message
#
if severity == 0:
arcpy.AddMessage(string)
elif severity == 1:
arcpy.AddWarning(string)
elif severity == 2:
arcpy.AddError(string)
except:
pass
def main():
arcpy.env.overwriteOutput=True
# Read in parameters
inputFC = arcpy.GetParameterAsText(0)
outputFC = arcpy.GetParameterAsText(1)
heightfield = arcpy.GetParameterAsText(2) #Must be in the same units as the coordinate system!
azimuth = math.radians(float(arcpy.GetParameterAsText(3))) #Must be in degrees
altitude = math.radians(float(arcpy.GetParameterAsText(4))) #Must be in degrees
# Specify output field name for the original FID
origfidfield = "ORIG_FID"
# Get field names
desc = arcpy.Describe(inputFC)
shapefield = desc.shapeFieldName
oidfield = desc.oidFieldName
#Output
message("Creating output feature class %s ..." % outputFC)
arcpy.CreateFeatureclass_management(
os.path.dirname(outputFC),
os.path.basename(outputFC),
'POLYGON', "", "", "",
desc.spatialReference if not arcpy.env.outputCoordinateSystem else "")
arcpy.AddField_management(outputFC, origfidfield, "LONG")
inscur = arcpy.InsertCursor(outputFC)
# Compute the shadow offsets.
spread = 1/math.tan(altitude) #outside loop as it only needs calculating once
count = int(arcpy.GetCount_management(inputFC).getOutput(0))
message("Total features to process: %d" % count)
searchFields = ",".join([heightfield, oidfield, shapefield])
rows = arcpy.SearchCursor(inputFC, "", "", searchFields)
interval = int(count/10.0) # Interval for reporting progress every 10% of rows
# Create array for holding shadow polygon vertices
arr = arcpy.Array()
for r, row in enumerate(rows):
pctComplete = int(round(float(r) / float(count) * 100.0))
if r % interval == 0:
message("%d%% complete" % pctComplete)
oid = row.getValue(oidfield)
shape = row.getValue(shapefield)
height = float(row.getValue(heightfield))
# Compute the shadow offsets.
x = -height * spread * math.sin(azimuth)
y = -height * spread * math.cos(azimuth)
# Initialize a list of shadow polygons with the original shape as the first
shadowpolys = [shape]
# Compute the wall shadows and append them to the list
for part in shape:
for i,j in enumerate(range(1,part.count)):
pnt0 = part[i]
pnt1 = part[j]
if pnt0 is None or pnt1 is None:
continue # skip null points so that inner wall shadows can also be computed
# Compute the shadow offset points
pnt0offset = arcpy.Point(pnt0.X+x,pnt0.Y+y)
pnt1offset = arcpy.Point(pnt1.X+x,pnt1.Y+y)
# Construct the shadow polygon and append it to the list
[arr.add(pnt) for pnt in [pnt0,pnt1,pnt1offset,pnt0offset,pnt0]]
shadowpolys.append(arcpy.Polygon(arr))
arr.removeAll() # Clear the array so it can be reused
# Dissolve the shadow polygons
dissolved = arcpy.Dissolve_management(shadowpolys,arcpy.Geometry())[0]
# Insert the dissolved feature into the output feature class
newrow = inscur.newRow()
newrow.setValue(origfidfield, oid) # Copy the original FID value to the new feature
newrow.shape = dissolved
inscur.insertRow(newrow)
del row, newrow, shadowpolys, dissolved
del inscur, rows
if __name__ == "__main__":
main()