python en la plataforma arcgis

43
Python en la Plataforma ArcGIS Xander Bakker - Technical Advisor [email protected]

Upload: xander-bakker

Post on 05-Sep-2015

270 views

Category:

Documents


6 download

DESCRIPTION

Python en La Plataforma ArcGIS

TRANSCRIPT

  • Python en la Plataforma ArcGISXander Bakker - Technical Advisor

    [email protected]

  • 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?