Python en la Plataforma ArcGISXander Bakker - Technical Advisor
Contenido
Que es Python?
Por que Python?
El rol de Python en la Plataforma ArcGIS
Ejemplos de uso en EPM
Como empezar con Python?
Recursos de ayuda
GeoNet
Inmersin profunda
Qu es Python?
Que es Python?
Python es un lenguaje de programacin con orientacin a objetos
Porque Python?
Por que Python?
En PyPI hay una coleccin de ms de 56.000 paquetes
Es un lenguaje que permite pegar ambientes tanto comerciales como de fuente abierta
Python es fuente abierta, puede hacer con ella lo que quiere
Python es fcil de aprender
Python es EL idioma de SIG
Por que Python?
http://cacm.acm.org/blogs/blog-cacm/176450-python-is-now-the-most-popular-introductory-teaching-language-at-top-us-universities/fulltext
En julio 2014, Python fue el lenguaje de programacin ms popular para ensear la introduccin a ciencias de computacin en los mejores universidades de los Estados Unidos.
Ms especficamente, 8 de las 10 mejores y 27 de los 39 mejores universidades ensean Python en los cursos introductorios.
Quienes estn usando Python actualmente?
Python en la Plataforma ArcGIS
Python en la Plataforma ArcGIS Desktop Web Device
ServerOnline Content
and Services
ArcGIS Online
Portal
A prueba de futuro
ArcGIS for Desktop
ArcGIS Pro
8.0 9.0 10.0 10.3
1.0
Ejemplos de uso en
Agilizar el trabajo con cajas de herramientas
if first_point != None:lst_pnt.append(first_point)
if len(lst_pnt) > 2:# crear polgono anterior y escribir a fcpolygon = arcpy.Polygon(arcpy.Array(lst_pnt), sr)curs.insertRow((polygon, nombre, ))
lst_pnt = []nombre = line.strip()bln_start = Truearcpy.AddMessage("Procesando polgono: '{0}'".format(nombre))
Empoderando grupos de usuarios con servicios de geo-procesamiento
Creando geometras especficas
def createSector(pnt_from, pnt_to, length, angle, sr):# determinar el bearing con base en las 2 puntosbearing = getBearing2Points(pnt_from, pnt_to)start = bearing - (angle / 2)end = bearing + (angle / 2)pnt = arcpy.PointGeometry(pnt_from, sr)circle = pnt.buffer(length)arrPnts = arcpy.Array()arrPnts.add(pnt_from)for bearing in range(int(start), int(end) + 1):
arrPnts.add(createPointAtAngleWithBearing(pnt_from, bearing, length))return arcpy.Polygon(arrPnts, sr)
def getBearing2Points(pnt1, pnt2):return math.degrees(math.atan2(pnt1.Y - pnt2.Y, pnt1.X - pnt2.X))
def createPointAtAngleWithBearing(pnt, angle, distance):angle = math.radians(angle)dist_x, dist_y = (distance * math.cos(angle), distance * math.sin(angle))return arcpy.Point(pnt.X + dist_x, pnt.Y + dist_y)
Minimum Spanning Tree
http://www.arcgis.com/home/item.html?id=6ce9db93533345e49350d30a07fc913a
Haciendo anlisis espacial con la facilidad de cambiar parmetros
Manejar la base de datos centralizada
lst_amb = ["DLLO 9.x", "TEST 9.x", "PROD 9.x", "DLLO 10.x", "TEST 10.x", "PROD 10.x"]
dct_conn = {"DLLO 9.x":r"C:\Users\xbakker\AppData\Roaming\ESRI\Desktop10.3\ArcCatalog\DLLO 9.x.sde","TEST 9.x": r"C:\Users\xbakker\AppData\Roaming\ESRI\Desktop10.3\ArcCatalog\TEST 9.x.sde","PROD 9.x": r"C:\Users\xbakker\AppData\Roaming\ESRI\Desktop10.3\ArcCatalog\PROD 9.x.sde","DLLO 10.x": r"C:\Users\xbakker\AppData\Roaming\ESRI\Desktop10.3\ArcCatalog\DLLO 10.x.sde","TEST 10.x": r"C:\Users\xbakker\AppData\Roaming\ESRI\Desktop10.3\ArcCatalog\TEST 10.x.sde","PROD 10.x": r"C:\Users\xbakker\AppData\Roaming\ESRI\Desktop10.3\ArcCatalog\PROD 10.x.sde"}
for amb in lst_amb:arcpy.env.workspace = dct_conn[amb]lst_ds = arcpy.ListDatasets()lst_ds.append("")for ds in lst_ds:
lst_fc = arcpy.ListFeatureClasses(feature_dataset=ds)for fc in lst_fc:
desc = arcpy.Describe(fc)feats = int(arcpy.GetCount_management(fc).getOutput(0))fc_geom = desc.shapeTypesr_name = desc.spatialReference.name...
Analizar el uso de servicios web
with open(logfile, 'r') as f:for msg in f:
lst_msg = msg.split(' ')for m in lst_msg:
if ">Extent:" in m:b = m.replace('>Extent:','')b = b.replace(';','')lst_b = b.split(',')xmin, ymin = lst_b[0], lst_b[1]xmax, ymax = lst_b[2], lst_b[3]xcc = (float(xmin) + float(xmax)) / 2.0ycc = (float(ymin) + float(ymax)) / 2.0polygon = createPolygonFromExtent(float(xmin), float(ymin),
float(xmax), float(ymax))
Analizar el uso de servicios web
dct_geom = {}dct_oid = {}cnt = 0with arcpy.da.SearchCursor(fc_in, ("SHAPE@JSON", "OID@")) as curs:
for row in curs:cnt += 1if cnt % 10000 == 0:
print Leyendo feature: {0}".format(cnt)txt_json = str(row[0])oid = row[1]if txt_json in dct_geom:
dct_geom[txt_json] += 1else:
dct_geom[txt_json] = 1dct_oid[txt_json] = oid
Analizar el uso de servicios web
# create output fcpath, name = os.path.split(fc_out)arcpy.CreateFeatureclass_management(path, name, "POLYGON", fc_in, "DISABLED", "DISABLED", sr)arcpy.AddField_management(fc_out, fldname, "LONG")
with arcpy.da.InsertCursor(fc_out, ("SHAPE@", fldname)) as curs:cnt = 0for txt_json, hits in dct_geom.items():
cnt += 1if cnt % 250 == 0:
print "Processing feature: {0}".format(cnt)
where = "OBJECTID = {0}".format(dct_oid[txt_json])polygon = arcpy.da.SearchCursor(fc_in, ("SHAPE@",), where).next()[0]curs.insertRow((polygon, hits,))
Monitorear el uso de las licencias de ArcGIS
lmparams='lmstat -f %s -c %i@%s' % (feature, port, server)stdin,stdout,stderr = os.popen3(lmexe + ' ' + lmparams)stdout = stdout.read()stderr = stderr.read()
pattern = re.compile(r'Total of \d+ license[s]* avail', re.IGNORECASE)avail = re.findall(pattern,stdout)
if not avail:pattern = re.compile(r'Total of \d+ license[s]* issued', re.IGNORECASE)avail = re.findall(pattern,stdout)
if not avail:raise Exception, '='*10+'\nSTDOUT:\n'+stdout+'='*10+'\nSTDERR:\n'+stderr
avail = int(avail[0].split(' ')[2])
Como empezar?
Cursos y libros de Python y ArcPy
Ventana de resultados
Ventana de Python
ArcGIS for Desktop
ArcGIS Pro
Recursos de ayuda
Ayuda en lnea
http://desktop.arcgis.com/en/desktop/latest/analyze/arcpy/what-is-arcpy-.htm
http://pro.arcgis.com/en/pro-app/arcpy/main/arcgis-pro-arcpy-reference.htm
http://resources.arcgis.com/en/help/main/10.2/index.html#/What_is_ArcPy/000v000000v7000000/
https://arcpy.wordpress.com/
https://esri.github.io/#Python
http://arcscripts.arcgis.com/
> 100.000 usuarios registrados~ 20.000 usuarios activos (ltimos 30 das)> 23.000 tems de contenido
Lugares ms visitados (ltimos 30 das)1) GIS (715.000)2) ArcGIS API for JavaScript (465.000)3) Managing Data (430.000)4) Python (400.000)
https://geonet.esri.com/docs/DOC-1927
dct = {r[0]: r[1] for r in arcpy.da.SearchCursor(fc, (fld_oid, fld_valores)) if r[1] > unvalor}
Visualizar migracin
https://geonet.esri.com/thread/120482
Calcular un buffer incluyendo
superficie
https://geonet.esri.com/thread/116656
...h1 = lst[2]h_dif = abs(h1-h0)dist3D = math.sqrt((h_dif**2) + (pixsize**2))slope = h_dif * 100.0 / pixsizedistcum += dist3D lst[3] = slopelst[4] = distcumdct_vals[val_id] = lsth0 = h1 if distcum
Puntos aleatorios dentro polgono con distancia mnima
https://geonet.esri.com/thread/127248
def add_random_point(in_points, all_points, polygon, min_dist):"""Randomly disperse points inside a polygon.Parameters:
in_points: list points in current polygonall_points: list points in all polygonspolygon: arcpy.Polygon() geometrymin_dist: minimum distance between all points
"""pnt = get_random_point_inside_polygon(polygon)cnt = 0bln_ok = Truechk_points = all_pointschk_points.extend(in_points)while get_min_distance(chk_points, pnt) < min_dist:
cnt += 1pnt = get_random_point_inside_polygon(polygon)if cnt > 250:
bln_ok = Falsebreak
if bln_ok:in_points.append(pnt)
return in_points, bln_ok
Presentaciones DevSummit
https://4326.us/scipy
Python: Trabajar con Datos CientficosShaun Walbridge y Kevin Butler
https://4326.us/scipy
Ejemplo de SciPy
import scipy.stats.morestats
ras = "data/aspect_raster.tif"r = arcpy.RasterToNumPyArray(ras)
morestats.circmean(r)morestats.circstd(r)morestats.circvar(r)
https://github.com/Esri/raster-functions/wiki/PythonRasterFunction
Python Raster Functions
Aplicar funciones raster sobre la marcha en memoria.
Hay ms de 50 funciones estndar (pendientes, aspectos, clip, modelo de sombras, NDVI, )
Preguntas?
Top Related