Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #-------------------------------------------------------------------------------
- # Name: Calculo ruta mas optima
- # Purpose: calcula la ruta mas optima da el perfil y avisa si hay algo entre ella
- #
- # Author: FELIPE
- #
- # Created: 10/02/2016
- # Copyright: (c) FELIPE 2016
- # Licence: <your licence>
- #-------------------------------------------------------------------------------
- #importamos los modulos de arcpy, y time
- import arcpy, time, arcpy.sa
- #calculamos el tiempo que tarda en ejecutarse el script
- START=time.clock()
- #chequeamos las licencias de espatila y 3 d
- arcpy.CheckOutExtension("Spatial")
- arcpy.CheckOutExtension('3D')
- #generamos el entorno de trabajo
- arcpy.env.workspace=r"C:\Users\Felipe\Desktop\Trabajo_Master\Papelera.gdb"
- arcpy.env.overwriteOutput = True
- #tenemos los dos punos el origen y final de la ruta
- Punt1=r"C:\Users\Felipe\Desktop\Trabajo_Master\Papelera.gdb\DatosTopograficos\Punto1"
- Punt2=r"C:\Users\Felipe\Desktop\Trabajo_Master\Papelera.gdb\DatosTopograficos\Punto2"
- puntos=[Punt1,Punt2]
- coord=["SHAPE@XY"]
- list=[]
- #obtenemos la coordenadas de cada punto
- for punt in puntos:
- with arcpy.da.SearchCursor(punt,coord) as cursor:
- for row in cursor:
- #introducimos esas coordenadas en la lista list
- list.append(row[0])
- print list
- #realizamos una polilinea
- pnt= arcpy.Point()
- ary= arcpy.Array()
- for cor in list:
- pnt.X=cor [0]
- pnt.Y=cor [1]
- ary.add(pnt)
- polyline=arcpy.Polyline(ary)
- #creamos una enidad lineal
- path=r"C:\Users\Felipe\Desktop\Trabajo_Master\Papelera.gdb\geo"
- nombre="linea"
- linea=arcpy.CreateFeatureclass_management(path,nombre,"POLYLINE")
- print "puntos{0}".format(polyline.pointCount)
- in_linea=arcpy.da.InsertCursor(linea,["SHAPE@"])
- in_linea.insertRow([polyline])
- del in_linea
- Punto=r"C:\Users\Felipe\Desktop\Trabajo_Master\Papelera.gdb\geo\PUNTO"
- arcpy.FeatureToPoint_management(linea,Punto,"CENTROID")
- mask=r"C:\Users\Felipe\Desktop\Trabajo_Master\Papelera.gdb\Mask"
- #para la distancia del bufer necesitamos saber cuatno mie la linea y anadirle un margen de x metros
- leng=["SHAPE@LENGTH"]
- with arcpy.da.SearchCursor(linea,leng) as cursor:
- for row in cursor:
- #introducimos esas coordenadas en la lista list
- longi=row[0]
- #aunadimos el margen y lo metemso dentro del buffer
- distancia=(longi/2)+200
- arcpy.Buffer_analysis(Punto,mask,distancia)
- Raster=r"C:\Users\Felipe\Desktop\Trabajo_Master\Papelera.gdb\Impedancia_ruta"
- outExtractByMask=arcpy.sa.ExtractByMask(Raster,mask)
- impedancia_rast=r"C:\Users\Felipe\Desktop\Trabajo_Master\Papelera.gdb\Impedancia_rast"
- outExtractByMask.save(impedancia_rast)
- # a continuacion empezamos con el calculo de la ruta mas optima mediante path
- #Primero obtenemos el coste de distancia y el backlinc, se usa el putno 1 pues es el de origen
- Backlink=r"C:\Users\Felipe\Desktop\Trabajo_Master\Papelera.gdb\back_link"
- CostDist=r"C:\Users\Felipe\Desktop\Trabajo_Master\Papelera.gdb\CostDist"
- outCostDistance = arcpy.sa.CostDistance(Punt1,impedancia_rast,"",Backlink)
- outCostDistance.save(CostDist)
- #se pone el punto 2 ya que es el punto de destino
- Camino=r"C:\Users\Felipe\Desktop\Trabajo_Master\Papelera.gdb\Camino"
- outCostPath = arcpy.sa.CostPath(Punt2,CostDist,Backlink,"EACH_CELL")
- outCostPath.save(Camino)
- #boramos las entidades innecesarias
- arcpy.Delete_management(CostDist)
- arcpy.Delete_management(Backlink)
- arcpy.Delete_management(mask)
- arcpy.Delete_management(impedancia_rast)
- #convrtimos el raster en una entidad de linea
- Camino_vecto=r"C:\Users\Felipe\Desktop\Trabajo_Master\Papelera.gdb\geo\Camino_vecto"
- arcpy.RasterToPolyline_conversion(Camino,Camino_vecto,"ZERO","10","SIMPLIFY")
- arcpy.Delete_management(Camino)
- #obtenemo el perfil
- MDT=r"C:\Users\Felipe\Desktop\Trabajo_Master\Papelera.gdb\MDT_parque"
- Tabla_gra=r"C:\Users\Felipe\Desktop\Trabajo_Master\Papelera.gdb\Tabla_gra"
- grafico=r"C:\Users\Felipe\Desktop\Trabajo_Master\Papelera.gdb\grafico"
- arcpy.StackProfile_3d(Camino_vecto,MDT,Tabla_gra,grafico)
- out_gra=r"C:\Users\Felipe\Desktop\Trabajo_Master\grafico.png"
- arcpy.SaveGraph_management(grafico,out_gra)
- arcpy.Delete_management(Tabla_gra)
- #avisa si cruza un rio, camino o zona vallada
- Rio=r"C:\Users\Felipe\Desktop\Trabajo_Master\Papelera.gdb\DatosTopograficos\Rios"
- Rio_layer="Rio_layer"
- Valla=r"C:\Users\Felipe\Desktop\Trabajo_Master\Papelera.gdb\DatosTopograficos\Vallado"
- Valla_layer="Valla_layer"
- Camino=r"C:\Users\Felipe\Desktop\Trabajo_Master\Papelera.gdb\REDosm_1\Caminos_Vehiculos1_1"
- Camino_layer="Camino_layer"
- Camino_vecto_layer="Camino_vecto_layer"
- #con describe y seleccion por localizacionsabemso si se ha seleccionado
- #creamos las layer de las entidades queintervienen enelroceso
- arcpy.MakeFeatureLayer_management(Rio,Rio_layer)
- arcpy.MakeFeatureLayer_management(Valla,Valla_layer)
- arcpy.MakeFeatureLayer_management(Camino,Camino_layer)
- arcpy.MakeFeatureLayer_management(Camino_vecto,Camino_vecto_layer)
- arcpy.SelectLayerByLocation_management(Rio_layer,"INTERSECT",Camino_vecto_layer)
- #con describe y FIdSet el cual ns dice si exite una seleccion, y la condicion if obtenemos el resultado de las entidades pro las que cruza
- rio_des=arcpy.Describe(Rio_layer)
- rio_cruz=rio_des.FIDset
- if rio_cruz!="":
- print"Cruzas un rio"
- print rio_cruz
- arcpy.SelectLayerByLocation_management(Valla_layer,"INTERSECT",Camino_vecto_layer)
- Valla_des=arcpy.Describe(Valla_layer)
- Valla_cruz=Valla_des.FIDset
- if Valla_cruz!="":
- print"Cruzas una valla"
- print Valla_cruz
- arcpy.SelectLayerByLocation_management(Camino_layer,"INTERSECT",Camino_vecto_layer)
- Camino_des=arcpy.Describe(Camino_layer)
- Camino_cruz=Camino_des.FIDset
- if Camino_cruz!="":
- print"Cruzas un Camino"
- print Camino_cruz
- FIN=(time.clock()-START)
- print "Script compelto. Tiempo de ejecucion {} segundos".format(FIN)
Add Comment
Please, Sign In to add comment