Generar áreas de servicio (Network Analyst)
Resumen
Crea una capa de análisis de red de área de servicio, establece las propiedades de análisis y resuelve el análisis. Esta herramienta es ideal para establecer un servicio de geoprocesamiento de área de servicio en la web. Un área de servicio de red es una región que abarca todas las calles a las que se puede acceder dentro de una distancia determinada o el tiempo de viaje desde una o más instalaciones.
Las áreas de servicio comúnmente se utilizan para visualizar y medir la accesibilidad. Por ejemplo, un polígono de tiempo de recorrido de tres minutos alrededor de una tienda de comestibles puede determinar cuáles residentes son capaces de llegar a la tienda en el transcurso de tres minutos y, por lo tanto, es más probable que compren allí.
Las herramientas Generar áreas de servicio y Crear la capa de área de servicio son similares, pero están diseñadas para diferentes propósitos. Utilice Generar áreas de servicio si está configurando un servicio de geoprocesamiento; va a simplificar el proceso de instalación. De lo contrario, utilice Crear la capa de área de servicio. Además, utilice Crear la capa de área de servicio si necesita generar líneas de área de servicio; Generar áreas de servicio no proporcionará la opción para generar líneas.
Para crear un área de servicio del servicio de geoprocesamiento utilizando Generar áreas de servicio, solo necesita crear una herramienta, y puede publicar la herramienta directamente como un servicio. En cambio, debe crear un modelo con Crear la capa de área de servicio, conectarla debidamente a diversas herramientas, y publicar el modelo para crear un área de servicio para el servicio de geoprocesamiento. Consulte Ejemplo de servicio de geoprocesamiento: polígonos de tiempo de recorrido para obtener información sobre cómo configurar un servicio de polígonos de tiempo de recorrido utilizando los datos del tutorial. Otra opción para considerar son los servicios de Problema de generación de áreas de servicio de ArcGIS Online. Es un servicio que se ejecuta como herramienta de geoprocesamiento dentro de ArcMap, está accesible desde otras aplicaciones e incluye datos de carreteras de alta calidad de una parte importante del mundo.
Uso
El cuadro de diálogo de la herramienta agrupa los diversos parámetros opcionales en las siguientes seis categorías para hacer que sea más fácil administrarlos:
- Análisis avanzado
- Barreras
- Dataset de red
- Ubicaciones de red
- Generación de polígonos
- Capacidades de servicio
Obtener más información sobre la salida de Generar áreas de servicio
Sintaxis
Parámetro | Explicación | Tipo de datos |
Facilities |
Las instalaciones alrededor de las cuales se generan áreas de servicio. El conjunto de entidades para las instalaciones tiene tres atributos: ObjectID: Campo ID administrado por el sistema. Forma: Campo de geometría que indica la ubicación geográfica del objeto de análisis de red. Name: El nombre de la instalación. Si el campo del nombre está vacío, en blanco o nulo, en el momento de resolución se genera automáticamente un nombre. | Feature Set |
Break_Values |
Especifica el tamaño y el número de polígonos de área de servicio a generar para cada instalación. El valor de Unidades de corte determina las unidades. Cuando se ejecuta la herramienta Generar áreas de servicio, se produce una interacción significativa entre los parámetros siguientes: Valores de corte, Unidades de corte y Atributo de tiempo o Atributo de distancia. Juntos, los Valores de corte y las Unidades de corte definen en qué medida o cuánto tiempo se debe extender el área de servicio alrededor de la instalación o instalaciones. Los parámetros del Atributo de tiempo y del Atributo de distancia definen respectivamente un atributo de coste de red. Sin embargo, solo se usa uno de estos dos atributos de coste, y el que el solucionador decide utilizar corresponde al valor de Unidades de corte; es decir, cuando se especifica un valor de Unidad de corte basado en el tiempo, como segundos o minutos, la herramienta soluciona usando el atributo de coste definido en el parámetro Atributo de tiempo. Cuando se especifica un valor de Unidad de corte basado en la distancia, como kilómetros o millas, utiliza el atributo de coste definido en el parámetro Atributo de distancia. Se pueden establecer varios cortes de polígonos para crear áreas de servicio concéntricas por instalación. Por ejemplo, para encontrar áreas de servicio de 2, 3 y 5 millas para cada instalación, introduzca "2 3 5", separando los valores con un espacio. Establezca Unidades de corte en millas, y asegúrese de haber seleccionado un atributo de red basado en la distancia para el parámetro Atributo de distancia. | String |
Break_Units |
Las unidades para el parámetro de Valores de corte.
La herramienta Generar áreas de servicio selecciona si utiliza el atributo de coste de red especificado en el parámetro de Atributo de tiempo o Atributo de distancia, dependiendo de que las unidades especificadas aquí se basen en el tiempo o en la distancia. La herramienta realiza la conversión de unidades necesaria cuando el valor de Unidades de corte difiere de las unidades del atributo de coste de distancia o de tiempo correspondiente. | String |
Network_Dataset |
El dataset de red en el que se realizará el análisis. La mayoría de las veces los datasets de red representan redes de calles pero también pueden representar otras redes de transporte. El dataset de red debe tener al menos un atributo de coste basado en el tiempo y uno basado en la distancia. | Network Dataset Layer |
Service_Areas |
El espacio de trabajo de salida y el nombre de las entidades de salida. Este espacio de trabajo ya debe existir. El espacio de trabajo de salida predeterminado es in_memory. | Feature Class |
Travel_Direction (Opcional) |
Elija si la dirección de recorrido que se utiliza para generar los polígonos de área de servicio es acercándose o alejándose de las instalaciones.
La dirección de viaje puede cambiar la forma de los polígonos porque las impedancias en lados opuestos de una calle pueden diferir o pueden existir calles de una sola vía. La dirección que debería elegir depende de la naturaleza de su análisis del área de servicio. El área de servicio de una tienda de entrega de pizzas, por ejemplo, se debe crear alejándose de la instalación, mientras que el área de servicio de un hospital se debe crear acercándose a la instalación, ya que el tiempo crítico de viaje de un paciente se concentra en su viaje hacia el hospital. | String |
Time_of_Day (Opcional) |
La hora de salida o de llegada a las instalaciones. La interpretación de este valor depende de que el viaje sea hacia las instalaciones o desde ellas.
El dataset de red debe incluir datos de tráfico para que parámetro tenga efecto. Repetidamente solucionar el mismo análisis, pero utilizando diferentes valores de Hora del día, le permite ver cómo alcanza cambios una instalación con el transcurso del tiempo. Por ejemplo, el área de servicio de cinco minutos alrededor de una estación de bomberos podría comenzar con gran volumen en las primeras horas de la mañana, disminuir en la hora pico, aumentar en las últimas horas de la mañana y así sucesivamente durante el día. | Date |
UTurn_Policy (Opcional) |
Política de giro en U en los cruces. Permitir giros en U implica que el solucionador puede dar la vuelta en un cruce y regresar por la misma calle. Debido a que los cruces representan intersecciones de calles y callejones sin salida, los diferentes vehículos pueden ser capaces de dar la vuelta en algunos cruces, pero no en otros. Ello depende de que el cruce sea una intersección o un callejón sin salida. Para acomodar, el parámetro de la política del giro en U se especifica implícitamente por la cantidad de bordes que se conectan en el cruce, que se conoce como valencia de cruce. Los valores aceptables para este parámetro se enumeran a continuación; cada uno seguido de una descripción de su significado en términos de valencia de cruce.
Sugerencia: Si necesita una política más definida respecto a la política de giros en U, considere agregar un evaluador de retraso de giro global con un atributo de coste de red, o ajustar su configuración si existe, y prestar especial atención a la configuración de los giros de 180 grados. Asimismo, examine la configuración de la propiedad CurbApproach de las ubicaciones de la red. | String |
Point_Barriers (Opcional) | Especifica las barreras de punto, que se dividen en dos tipos: barreras de restricción y de punto de coste agregado. Restringen temporalmente el trazado poligonal en toda la red o agregan impedancia a puntos de la red. Las barreras de punto se definen mediante un conjunto de entidades, y los valores de atributo que especifica para las entidades de punto determinan si son barreras de restricción o de coste agregado. Los campos en la tabla de atributos se muestran y describen a continuación. ObjectID: Campo ID administrado por el sistema. Forma: Campo de geometría que indica la ubicación geográfica del objeto de análisis de red. Nombre: El nombre de la barrera. BarrierType: Especifica si la barrera restringe completamente el viaje o agrega coste cuando se viaja a través de ella. Existen dos opciones:
Utilice el valor 0 para Restricción y 2 para Coste agregado. AdditionalCost: AdditionalCost indica cuánta impedancia se agrega cuando un área de servicio atraviesa la barrera. La unidad para este valor de campo es la misma que las especificadas para las Unidades de corte. | Feature Set |
Line_Barriers (Opcional) |
Especifica las barreras de línea, que restringen temporalmente el trazado poligonal en ellos. Las barreras de línea se definen mediante un conjunto de entidades. Los campos en la tabla de atributos se muestran y describen a continuación. ObjectID: Campo ID administrado por el sistema. Forma: Campo de geometría que indica la ubicación geográfica del objeto de análisis de red. Nombre: El nombre de la barrera. | Feature Set |
Polygon_Barriers (Opcional) | Especifica las barreras de polígono, que se dividen en dos tipos: barreras de restricción y barreras de polígono de coste escalado. Restringen temporalmente el trazado poligonal o la impedancia de escala en las partes de la red que cubren. Las barreras de polígono se definen mediante un conjunto de entidades, y los valores de atributo que especifica para las entidades de polígono determinan si son barreras de restricción o de coste de escala. Los campos en la tabla de atributos se muestran y describen a continuación. ObjectID: Campo ID administrado por el sistema. Forma: Campo de geometría que indica la ubicación geográfica del objeto de análisis de red. Nombre: El nombre de la barrera. BarrierType: Especifica si la barrera restringe completamente el viaje o escala el coste de viajar a través de ella. Existen dos opciones:
Utilice el valor 0 para Restricción y 1 para Coste en escala. ScaledCostFactor: ScaledCostFactor indica por cuánto se multiplica la impedancia cuando un área de servicio atraviesa la barrera. | Feature Set |
Time_Attribute (Opcional) |
Define el atributo de coste de red que se debe utilizar cuando el valor Unidades de corte sea una unidad de tiempo. La herramienta realiza la conversión necesaria de unidades de tiempo cuando el valor de Unidades de corte difiere de las unidades del atributo de coste definido aquí. Es decir, las unidades de tiempo de los cortes y del atributo de coste de red no tienen que ser las mismas. | String |
Time_Attribute_Units (Opcional) |
Las unidades del atributo de coste de red especificado por el parámetro Atributo de tiempo. Este es un parámetro de información que no se puede cambiar sin editar directamente el dataset de red. Tampoco es necesario cambiarlos porque las conversiones de unidades entre las unidades del valor de corte y del atributo de coste son manipuladas por usted. | String |
Distance_Attribute (Opcional) | Define el atributo de coste de red a utilizar cuando el valor de las Unidades de corte es una unidad de distancia. La herramienta realiza la conversión necesaria de unidades de distancia cuando el valor de Unidades de corte difiere de las unidades del atributo de coste definido aquí. Es decir, las unidades de distancia de los cortes y del atributo de coste de red no tienen que ser las mismas. | String |
Distance_Attribute_Units (Opcional) |
Las unidades del atributo de coste de red especificado por el parámetro Atributo de distancia. Este es un parámetro de información que no se puede cambiar sin editar directamente el dataset de red. Tampoco es necesario cambiarlos porque las conversiones de unidades entre las unidades del valor de corte y del atributo de coste son manipuladas por usted. | String |
Use_Hierarchy_in_Analysis (Opcional) |
El parámetro no se utiliza si no se definen atributos de jerarquía en el dataset de red utilizado para realizar el análisis. En tales casos, utilice "#" como el valor de parámetro. | Boolean |
Restrictions (Opcional) |
Indica cuales atributos de restricción de red se respetan en el momento de la resolución. | String |
Attribute_Parameter_Values (Opcional) |
Especifica los valores de parámetro de atributos de red que tienen parámetros. El conjunto de registros tiene dos columnas que trabajan juntas para identificar parámetros de forma única y otra columna que especifica el valor del parámetro. El conjunto de registros de valores de parámetro tiene atributos asociados. Los campos en la tabla de atributos se enumeran y describen a continuación. ObjectID: Campo ID administrado por el sistema. AttributeName: El nombre del atributo de red cuyo parámetro de atributos se establece por la fila de tabla. ParameterName: El nombre del parámetro de atributos cuyo valor se establece por la fila de tabla. (Los parámetros de tipo Objeto no se pueden actualizar utilizando la herramienta). ParameterValue: El valor que desea para el parámetro de atributos. Si no se especifica el valor, el valor de los parámetros de atributos se establecerá en Nulo. | Record Set |
Maximum_Snap_Tolerance (Opcional) |
La máxima tolerancia de alineación es la distancia más lejana que busca el Network Analyst al ubicar o reubicar un punto en la red. La búsqueda busca bordes o cruces adecuados y alinea el punto con el más cercano. Si no se encuentra una ubicación adecuada dentro de la máxima tolerancia de alineación, el objeto se marca como no ubicado. | Linear unit |
Exclude_Restricted_Portions_of_the_Network (Opcional) |
| Boolean |
Feature_Locator_WHERE_Clause (Opcional) |
Una expresión SQL utilizada para seleccionar un subconjunto de entidades de origen que limita los elementos de red en que se pueden ubicar las instalaciones. La sintaxis para este parámetro consta de dos partes: la primera es el nombre de la clase de entidad de origen (seguido de un espacio) y la segunda es la expresión SQL. Al escribir una expresión SQL para dos o más clases de entidad de origen, sepárelas con un punto y coma. Para garantizar que las instalaciones no se encuentran en autopistas de acceso limitado, por ejemplo, se debe escribir una expresión SQL como la siguiente para excluir esas entidades de origen: "Streets" "FUNC_CLASS not in('1', '2')". Tenga en cuenta que durante la carga las barreras ignoran la cláusula WHERE del localizador de entidad. | String |
Polygons_for_Multiple_Facilities (Opcional) |
Elija cómo se generan los polígonos de área de servicio cuando varias instalaciones están presentes en el análisis.
| String |
Polygon_Overlap_Type (Opcional) |
Especifica la opción para crear polígonos de área de servicio concéntricos como discos o anillos. Esta opción se puede aplicar solo cuando se especifican varios valores de corte para las instalaciones.
| String |
Detailed_Polygons (Opcional) | Especifica la opción para crear polígonos detallados o generalizados.
| Boolean |
Polygon_Trim_Distance (Opcional) |
Especifica la distancia dentro de la que se acortarán los polígonos del área de servicio. Esto es útil cuando los datos son muy escasos y usted no desea que el área de servicios cubra grandes áreas en las que no hay entidades. Ningún valor o un valor de 0 para este parámetro especifica que no se deben recortar los polígonos de área de servicio. El valor de parámetro se ignora cuando se utiliza jerarquía. | Linear unit |
Polygon_Simplification_Tolerance (Opcional) |
Especifique cuánto desea simplificar la geometría del polígono. La simplificación mantiene los puntos críticos de un polígono para definir su forma esencial y quita el resto de los puntos. La distancia de simplificación que especifique será el desplazamiento máximo admisible que puede apartarse el polígono simplificado del polígono original. La simplificación de un polígono reduce el número de vértices y tiende a reducir los tiempos de dibujo. | Linear unit |
Maximum_Facilities (Opcional) |
Limita la cantidad de instalaciones que se puede agregar al análisis del área de servicio. Este parámetro le ayuda a regir la cantidad de procesamiento que se produce al resolver. Por ejemplo, puede asignar un valor bajo para este parámetro para la versión gratuita del servicio que están creando y utilizar un valor más alto para la versión de suscripción de pago. Un valor nulo indica que no hay ningún límite. | Long |
Maximum_Number_of_Breaks (Opcional) |
Limita la cantidad de cortes que se puede agregar al análisis del área de servicio. Este parámetro le ayuda a regir la cantidad de procesamiento que se produce al resolver. Por ejemplo, puede asignar un valor bajo para este parámetro para la versión gratuita del servicio que están creando y utilizar un valor más alto para la versión de suscripción de pago. Un valor nulo indica que no hay ningún límite. | Long |
Maximum_Features_Affected_by_Point_Barriers (Opcional) | Restringe el número de entidades pueden ser afectadas por las barreras de punto. Este parámetro le ayuda a regir la cantidad de procesamiento que se produce al resolver. Por ejemplo, puede asignar un valor bajo para este parámetro para la versión gratuita del servicio que están creando y utilizar un valor más alto para la versión de suscripción de pago. Un valor nulo indica que no hay ningún límite. | Long |
Maximum_Features_Affected_by_Line_Barriers (Opcional) |
Restringe el número de entidades pueden ser afectadas por las barreras de línea. Este parámetro le ayuda a regir la cantidad de procesamiento que se produce al resolver. Por ejemplo, puede asignar un valor bajo para este parámetro para la versión gratuita del servicio que están creando y utilizar un valor más alto para la versión de suscripción de pago. Un valor nulo indica que no hay ningún límite. | Long |
Maximum_Features_Affected_by_Polygon_Barriers (Opcional) |
Restringe el número de entidades pueden ser afectadas por las barreras de polígono. Este parámetro le ayuda a regir la cantidad de procesamiento que se produce al resolver. Por ejemplo, puede asignar un valor bajo para este parámetro para la versión gratuita del servicio que están creando y utilizar un valor más alto para la versión de suscripción de pago. Un valor nulo indica que no hay ningún límite. | Long |
Maximum_Break_Time_Value (Opcional) |
Limita el tamaño del valor del parámetro Valor de corte al resolver las áreas de servicio basadas en el tiempo. Este parámetro le ayuda a regir la cantidad de procesamiento que se produce al resolver. Por ejemplo, puede asignar un valor bajo para este parámetro para la versión gratuita del servicio que están creando y utilizar un valor más alto para la versión de suscripción de pago. Un valor nulo indica que no hay ningún límite. | Double |
Maximum_Break_Distance_Value (Opcional) | Limita el tamaño del valor del parámetro Valor de corte al resolver las áreas de servicio basadas en la distancia. Este parámetro le ayuda a regir la cantidad de procesamiento que se produce al resolver. Por ejemplo, puede asignar un valor bajo para este parámetro para la versión gratuita del servicio que están creando y utilizar un valor más alto para la versión de suscripción de pago. Un valor nulo indica que no hay ningún límite. | Double |
Force_Hierarchy_beyond_Break_Time_Value (Opcional) |
Especifica el valor de corte después del cual el solucionador forzará la jerarquía, incluso cuando no se haya habilitado al resolver las áreas de servicios basadas en el tiempo La solución de áreas de servicio para valores de corte alto al utilizar la jerarquía de la red tiende a incurrir en mucho menos procesamiento que la solución de las mismas áreas de servicio sin utilizar la jerarquía. Este parámetro le ayuda a regir la cantidad de procesamiento que se produce al resolver. Un valor nulo indica que la jerarquía nunca será aplicada y el valor del parámetro Utilizar jerarquía en el análisis siempre se respeta. Si el dataset de red de entrada no admite jerarquía, especificar un valor para este parámetro ocasionará un error. En este caso se debe utilizar un valor nulo. | Double |
Force_Hierarchy_beyond_Break_Distance_Value (Opcional) |
Especifica el valor de corte después de que el solucionador obliga a la jerarquía incluso cuando no se haya habilitado la jerarquía al resolver las áreas de servicios basadas en la distancia. La solución de áreas de servicio para valores de corte alto al utilizar la jerarquía de la red tiende a incurrir en mucho menos procesamiento que la solución de las mismas áreas de servicio sin utilizar la jerarquía. Este parámetro le ayuda a regir la cantidad de procesamiento que se produce al resolver. Un valor nulo indica que la jerarquía nunca será aplicada y el valor del parámetro Utilizar jerarquía en el análisis siempre se respeta. Si el dataset de red de entrada no admite jerarquía, especificar un valor para este parámetro ocasionará un error. En este caso se debe utilizar un valor nulo. | Double |
Save_Output_Network_Analysis_Layer (Opcional) |
En cualquiera de los casos, se devuelve una clase de entidad con polígonos de área de servicio. Sin embargo, un administrador del servidor puede elegir que la salida sea también una capa de análisis de red de salida para que el programa de instalación y los resultados de la herramienta puedan ser depurados utilizando los controles Network Analyst en el entorno de ArcGIS for Desktop. Esto puede hacer que el proceso de depuración sea mucho más fácil. En ArcGIS for Desktop, la ubicación de salida predeterminada para la capa de análisis de red está en la carpeta temporal. Puede determinar la ubicación de la carpeta temporal mediante la evaluación del valor de entorno de geoprocesamiento arcpy.env.scratchFolder. La capa de análisis de red de salida se almacena como un archivo LYR cuyo nombre comienza con _ags_gpna y está seguido por un GUID alfanumérico. | Boolean |
Time_Zone_for_Time_of_Day (Opcional) | Especifica la zona o las zonas horarias del parámetro Hora del día.
Con independencia de cómo se establezca la Zona horaria para hora del día, todas las instalaciones debe estar en la misma zona horaria cuando Hora del día tenga un valor no nulo y Polígonos para varias instalaciones esté configurado para crear polígonos combinados o no superpuestos. | String |
Ejemplo de código
Ejecutar la herramienta utilizando los parámetros requeridos de la ventana de Python.
import arcpy
facilities = arcpy.FeatureSet()
facilities.load("FireStations")
arcpy.na.GenerateServiceAreas(facilities, "1 2 3", "Minutes", "Streets_ND",
"in_memory\\FireStationServiceAreas")
La siguiente secuencia de comandos independiente de Python muestra cómo se puede utilizar GenerateServiceAreas para determinar el alcance de la tienda con el tiempo. Muestra cómo generar un área de servicio de cinco minutos alrededor de la ubicación de una tienda en diferentes momentos de un día. Tales análisis pueden ser útiles, por ejemplo en el caso de una tienda de pizzas, para ver cómo cambia el área a la que se puede llegar en cinco minutos desde la tienda tomando como base las condiciones actuales de tráfico.
# Name: GenerateServiceAreas_Workflow.py
# Description: Generate a 5 minute service area around a store location at
# different times in a day. Such analysis can be useful, for example
# for a pizza store, to see how the area that can be reached within
# 5 minutes from the store changes based on the current traffic
# conditions.
# Requirements: Network Analyst Extension
#Import system modules
import arcpy
from arcpy import env
import datetime
try:
#Check out the Network Analyst extension license
arcpy.CheckOutExtension("Network")
#Set environment settings
env.workspace = "C:/data/SanFrancisco.gdb"
env.overwriteOutput = True
#Set local variables
inNetworkDataset = "Transportation/Streets_ND"
impedanceAttribute = "TravelTime"
breakValues = "5"
breakUnits = "Minutes"
inFacilities = "Analysis/ExistingStore"
outGeodatabase = "C:/data/output/ServiceAreaOutput.gdb"
serviceArea = "in_memory\\ServiceAreas"
dateFieldName = "StartTime"
nameField = "Name"
#use today at 8 AM as the start time and then increment it by one hour
startTime = datetime.datetime(1899,12,30,8,0,0)
#Create a new feature set with same schema as Facilities parameter in
#Generate Service Areas tool. Load the feature from the ExistingStore
#feature class in the feature set
facilities = arcpy.GetParameterValue("GenerateServiceAreas_na",0)
facilities.load(inFacilities)
#Create an empty feature class with same spatial reference as the
#network dataset and a Date field called StartTime and a text field called Name
outServiceAreas = arcpy.management.CreateFeatureclass(outGeodatabase, "ServiceAreas",
"POLYGON","","","",
inNetworkDataset).getOutput(0)
arcpy.management.AddField(outServiceAreas, dateFieldName, "DATE")
arcpy.management.AddField(outServiceAreas, nameField, "TEXT")
#Open an insert cursor on the feature class to add new polygons
cursor = arcpy.da.InsertCursor(outServiceAreas, ("SHAPE@", nameField,
dateFieldName))
#Geneate a 5 minute service area around the store at every one hour interval
#from 8 AM to 8 PM. Copy the output service area to a new feature class
for i in range(1,14):
timeFormat = startTime.time().strftime("%I %p")
print "Generating {0} {1} service area at {2}".format(breakValues,breakUnits,
timeFormat)
arcpy.na.GenerateServiceAreas(facilities,breakValues,breakUnits,
inNetworkDataset, serviceArea, "TRAVEL_FROM",
startTime, Time_Attribute=impedanceAttribute)
#Get the shape from the output service area so that it can be inserted
#in the feature class
with arcpy.da.SearchCursor(serviceArea,("SHAPE@", nameField)) as inputRows:
row = inputRows.next()
cursor.insertRow((row[0],row[1],startTime))
startTime = startTime + datetime.timedelta(seconds=3600)
del cursor
print "Script completed successfully"
except Exception as e:
# If an error occurred, print line number and error message
import traceback, sys
tb = sys.exc_info()[2]
print "An error occured on line %i" % tb.tb_lineno
print str(e)