Changeset 66dd87e in observatorio


Ignore:
Timestamp:
Oct 14, 2014, 5:04:52 PM (10 years ago)
Author:
Ing. Roldan Vargas <rvargas@…>
Branches:
master
Children:
1e397ea
Parents:
d9aeac8
Message:

modificación en procesos para la georeferencia de la cadena productiva proveniente de la encuesta industrial y de los datos provenientes del SIGESIC. Se agregaron instrucciones para generar registros de eventos (logs)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • procesos/apps/geocadena/views.py

    r881e9c4 r66dd87e  
    3939from divisionTerritorial import estados
    4040from models import LayerDivisionEstadal, LayerDivisionMunicipal, LayerDivisionParroquial, LayerRedi, \
    41     PoblacionEconomicaActiva, TasaDesempleo, GeoreferenciaIndicador, IndiceNacionalPreciosConsumidor
     41    MarcaCadenaProduccion, LayerCentroidePais, GeoreferenciaIndicador, ConexionCadenaProduccion
    4242
    4343import logging
     
    478478            rif = g.node_attr['label'][0:10]
    479479            ue = getUE(rif)
    480 
    481             coordxy = getCoordenadas(ue)
    482             if coordxy:
    483                 nodo.append({'lon': coordxy[0],
    484                             'lat': coordxy[1],
    485                             'icono': icono,
    486                             'uerif': rif,
    487                             'uenombre': '',
    488                             'uedetalles': 'Ciudad: %s<br>' % '',
    489                             'ueproduce': '',
    490                             'ueconsume': '',
    491                             'ueedo': ue.parroquia.municipio.entidad.nombre,
    492                             'uemun': ue.parroquia.municipio.nombre,
    493                             'ueparr': ue.parroquia.nombre,
    494                             'nivel': ''})
     480            if ue:
     481                coordxy = getCoordenadas(ue)
     482                if coordxy:
     483                    nodo.append({'lon': coordxy[0],
     484                                'lat': coordxy[1],
     485                                'icono': icono,
     486                                'uerif': rif,
     487                                'uenombre': '',
     488                                'uedetalles': 'Ciudad: %s<br>' % '',
     489                                'ueproduce': '',
     490                                'ueconsume': '',
     491                                'ueedo': ue.parroquia.municipio.entidad.nombre,
     492                                'uemun': ue.parroquia.municipio.nombre,
     493                                'ueparr': ue.parroquia.nombre,
     494                                'nivel': ''})
    495495        else:
    496             # OBTENER COORDENADAS SEGUN EL CENTROIDE DEL PAI DE ORIGEN
    497             pass
     496            # Condición que determina las coordenadas geográficas de Unidades Económicas fuera del territorio nacional
     497            if g.node_attr['label'].rfind("de origen:") > 0:
     498                pais_origen = g.node_attr['label'][g.node_attr['label'].rfind(":") + 1:].strip()
     499
     500                if LayerCentroidePais.objects.filter(pais__nombre=pais_origen):
     501                    centroide_pais = LayerCentroidePais.objects.get(pais__nombre=pais_origen)
     502                    nodo.append({
     503                        'lon': centroide_pais.lon,
     504                        'lat': centroide_pais.lat,
     505                        'icono': icono,
     506                        'uerif': '',
     507                        'uedetalles': 'Pais: %s<br>' % pais_origen,
     508                        'ueproduce': '',
     509                        'ueconsume': '',
     510                        'nivel': ''
     511                    })
    498512
    499513    return nodo
     
    522536    if grafo:
    523537        user = str(request.user)
    524         if grafo == 'encuesta':
     538        """
     539        if getNodos(user):
    525540            cadena = getNodos(user)
    526541            referencias = getReferencias(user)
    527         elif grafo == 'sigesic':
    528             cadena = get_nodos_sigesic(user)
     542        elif get_nodos_sigesic(user):
     543        """
     544        cadena = get_nodos_sigesic(user)
    529545        logger.info("Se han generado los datos necesarios para la georeferenciación de la cadena de producción "
    530546                    "consultada")
     
    572588    if capa and field:
    573589        tabla = get_model('geocadena', capa)
    574         logger.info("Petición recibida para mostrar la capa [%s]")
     590        logger.info("Petición recibida para mostrar la capa [%s]" % capa)
    575591        qs = tabla.objects.all()
    576592        if cod:
     
    587603
    588604    return HttpResponse(content_type='text/plain')
     605
     606
     607#===
     608# Vistas para la georeferencia de la cadena de producción
     609#===
     610class MarcaCadenaProduccionLayer(GeoJSONLayerView):
     611    """!
     612    Clase que gestiona los datos consultados sobre la cadena de producción
     613
     614    @author Ing. Roldan D. Vargas G. rvargas@cenditel.gob.ve
     615    @author Centro Nacional de Desarrollo e Investigación en Tecnologías Libres (CENDITEL) Nodo Mérida
     616    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
     617    @date 02-10-2014
     618    @version 1.0.1
     619    """
     620    model = MarcaCadenaProduccion
     621    properties = ("grafo_id", "nivel", "sentido", "icono", "rif", "nombre", "produce", "consume")
     622
     623    def get_queryset(self):
     624        """!
     625        Método que permite obtener el queryset de la clase para interactuar y gestionar los datos a ser mostrados
     626        @author Ing. Roldan D. Vargas G. rvargas@cenditel.gob.ve
     627        @author Centro Nacional de Desarrollo e Investigación en Tecnologías Libres (CENDITEL) nodo Mérida
     628        @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
     629        @date 02-10-2014
     630        @param self variable de tipo object con los campos de la clase
     631        @return devuelve el queryset que será mostrado por la clase en el mapa
     632        """
     633        grafo_id = self.request.GET.get('grafo', None)
     634
     635        if grafo_id:
     636            logger.info("Inicio del proceso para la georeferencia de la cadena de producción")
     637
     638            # Instrucción que elimina datos anteriormente consultados para el grafo
     639            self.model.objects.filter(grafo_id=grafo_id).delete()
     640            ConexionCadenaProduccion.objects.filter(grafo_id=grafo_id).delete()
     641
     642            logger.info("Obteniendo datos del grafo consultado [%s]" % grafo_id)
     643            try:
     644                grafo = AGraph("%s/tmp/%s.dot" % (settings.PATH, grafo_id))
     645            except Exception, e:
     646                logger.debug("Error al procesar el grafo consultado. Detalles del error: %s" % e)
     647
     648            if grafo.subgraphs():
     649                logger.info("El grafo consultado proviene de la consulta de datos del SIGESIC. Procesando...")
     650                tipo_nodo = ''
     651
     652                # Instrucción que recorre la cadena de producción para obtener los nodos a georeferenciar
     653                for g in grafo.subgraphs():
     654                    dict_cadena = {
     655                        'grafo_id': grafo_id
     656                    }
     657                    tipo_nodo = g.nodes()[0].attr['color']
     658                    # Condiciones que determinan el marcador a mostrar
     659                    if tipo_nodo == 'darkgreen':
     660                        dict_cadena['icono'] = static('geocadena/imgs/markers/mark_center.png')
     661                        dict_cadena['sentido'] = "C"
     662                    elif tipo_nodo == 'yellow':
     663                        dict_cadena['icono'] = static('geocadena/imgs/markers/mark_up.png')
     664                        dict_cadena["sentido"] = "U"
     665                    elif tipo_nodo == 'cyan':
     666                        dict_cadena['icono'] = static('geocadena/imgs/markers/mark_down.png')
     667                        dict_cadena["sentido"] = "D"
     668
     669                    # Condición que determina los datos de la Unidad Económica a Georeferenciar
     670                    if g.node_attr['label'][0] in ["J", "G", "V", "E", "P"]:
     671                        rif = g.node_attr['label'][:10]
     672                        ue = getUE(rif)
     673
     674                        if ue:
     675                            dict_cadena['rif'] = rif
     676                            try:
     677                                if ue.nombre is not None and ue.nombre != "NO INDICA":
     678                                    dict_cadena['nombre'] = ue.nombre
     679                                else:
     680                                    dict_cadena['nombre'] = ue.razon_social
     681
     682                            except AttributeError:
     683                                try:
     684                                    dict_cadena['nombre'] = ue.nombreestablecimiento
     685                                except AttributeError:
     686                                    dict_cadena['nombre'] = ue.nombre_comercial
     687
     688                            coordxy = getCoordenadas(ue)
     689                            dict_cadena['geom'] = 'POINT(%s %s)' % (str(coordxy[0]), str(coordxy[1]))
     690                        else:
     691                            # Si no es posible establecer los datos de la Unidad Económica, se procede a verificar el
     692                            # siguiente registro
     693                            continue
     694                    elif g.node_attr['label'].rfind("origen:") > 0:
     695                        pais_origen = g.node_attr['label'][g.node_attr['label'].rfind(":") + 1:].strip()
     696                        if LayerCentroidePais.objects.filter(pais__nombre=pais_origen):
     697                            centroide_pais = LayerCentroidePais.objects.get(pais__nombre=pais_origen)
     698                            dict_cadena['geom'] = centroide_pais.geom
     699                            ue_extranjera = g.node_attr['label'].strip("\\n").split("\\n")
     700                            dict_cadena['nombre'] = ue_extranjera[0]
     701                        else:
     702                            # Si no es posible establecer los datos de la Unidad Económica, se procede a verificar el
     703                            # siguiente registro
     704                            continue
     705
     706                    # Instrucción que determina la producción de cada Unidad Económica
     707                    produce = 'N/E'
     708                    if g.nodes():
     709                        produce = "<li>%s</li>"
     710                        pr = ''
     711                        for p in g.nodes():
     712                            pr += produce % p.attr['label']
     713                        dict_cadena['produce'] = "<ul>%s</ul>" % pr
     714
     715                    logger.info("Registrando datos en BD del grafo %s" % grafo_id)
     716                    self.model.objects.create(**dict_cadena)
     717
     718                # Instrucción que recorre la cadena de producción para obtener las relaciones entre los nodos a
     719                # georeferenciar
     720                fcx = lambda z: [
     721                    cx.node_attr['label'] for cx in grafo.subgraphs() if str(z) in cx.nodes()
     722                    and cx.node_attr['label'] != ''
     723                ]
     724                for con in grafo.edges():
     725                    ue_ini = fcx(con[0])[0]
     726                    ue_fin = fcx(con[1])[0]
     727                    coord_ini, coord_fin = '', ''
     728
     729                    # Condición que busca las coordenadas del punto inicial desde el cual realizar la conexión
     730                    if ue_ini[0] in ["J", "G", "V", "E", "P"]:
     731                        if getUE(ue_ini[:10]):
     732                            coord_ini = getCoordenadas(getUE(ue_ini[:10]))
     733                    elif ue_ini.rfind("origen:") > 0:
     734                        pais_origen = ue_ini[ue_ini.rfind(":") + 1:].strip()
     735                        if LayerCentroidePais.objects.filter(pais__nombre=pais_origen):
     736                            pais_ini = LayerCentroidePais.objects.get(pais__nombre=pais_origen)
     737                            coord_ini = str(pais_ini.geom).strip("POINT (").strip(")").split(" ")
     738
     739                    # Condición que busca las coordenadas del punto final hasta el cual realizar la conexión
     740                    if ue_fin[0] in ["J", "G", "V", "E", "P"]:
     741                        if getUE(ue_fin[:10]):
     742                            coord_fin = getCoordenadas(getUE(ue_fin[:10]))
     743                    elif ue_fin.rfind("origen:") > 0:
     744                        pais_origen = ue_fin[ue_fin.rfind(":") + 1:].strip()
     745                        if LayerCentroidePais.objects.filter(pais__nombre=pais_origen):
     746                            pais_fin = LayerCentroidePais.objects.get(pais__nombre=pais_origen)
     747                            coord_fin = str(pais_fin.geom).strip("POINT (").strip(")").split(" ")
     748
     749                    try:
     750                        logger.info(u"Estableciendo conexión entre las Unidades Económicas [%s] y [%s] en las "
     751                                    u"coordenadas [%s] y [%s] respectivamente" % (ue_ini, ue_fin, coord_ini, coord_fin))
     752                        conexion = "LINESTRING(%s %s, %s %s)" % (
     753                            str(coord_ini[0]), str(coord_ini[1]), str(coord_fin[0]), str(coord_fin[1])
     754                        )
     755                        conex = 'D'
     756                        if [i.nodes()[0].attr['color'] for i in grafo.subgraphs() if con[1] in i.nodes()][0] == "cyan":
     757                            conex = 'U'
     758
     759                        ConexionCadenaProduccion.objects.create(
     760                            grafo_id=grafo_id, sentido=conex,
     761                            geom=conexion, nivel=0
     762                        )
     763
     764                    except Exception, e:
     765                        logger.debug(u"No se pudo establecer la relación entre las Unidades Económicas %s y %s. "
     766                                     u"Detalles del error: %s" % (ue_ini, ue_fin, e))
     767                        continue
     768
     769            else:
     770                logger.info("El grafo consultado proviene de la consulta de datos de la Encuesta Industrial. "
     771                            "Procesando...")
     772                nodos_atras = lambda x: grafo.in_neighbors(x)
     773                if grafo.get_node(0).attr['label'][0] in ["J", "G", "V", "E", "P"]:
     774                    logger.info("Obteniendo cadena de producción del nodo [%s]"
     775                                % grafo.get_node(0).attr['label'][:10])
     776                    nodos = [n for n in grafo.nodes_iter() if n.attr['label'][0] in ["J", "G", "V", "E", "P"]]
     777
     778                    # Instrucción que obtiene los nodos de Unidades Económicas
     779                    for c in nodos:
     780                        dict_cadena = {
     781                            'grafo_id': grafo_id
     782                        }
     783
     784                        rif = grafo.get_node(c).attr['label'][0:10]
     785                        ue = getUE(rif)
     786
     787                        if ue:
     788                            coordxy = getCoordenadas(ue)
     789                            dict_cadena['geom'] = 'POINT(%s %s)' % (str(coordxy[0]), str(coordxy[1]))
     790                            conex = 'D'
     791
     792                            if grafo.get_node(c).attr['color'] == 'darkgreen':
     793                                logger.info("Estableciendo marca del nodo principal de la Unidad Económica [%s]" % rif)
     794                                dict_cadena['icono'] = static('geocadena/imgs/markers/mark_center.png')
     795                                dict_cadena['sentido'] = "C"
     796                            elif grafo.get_node(c).attr['color'] == 'yellow':
     797                                logger.info("Estableciendo marca de nodo aguas arriba para la Unidad Económica [%s]"
     798                                            % rif)
     799                                dict_cadena['icono'] = static('geocadena/imgs/markers/mark_down.png')
     800                                dict_cadena['sentido'] = conex
     801                            elif grafo.get_node(c).attr['color'] == 'dodgerblue':
     802                                logger.info("Estableciendo marca de nodo aguas abajo para la Unidad Económica [%s]"
     803                                            % rif)
     804                                dict_cadena['icono'] = static('geocadena/imgs/markers/mark_up.png')
     805                                conex = 'U'
     806                                dict_cadena['sentido'] = conex
     807
     808                            if nodos_atras(c):
     809                                for x in nodos_atras(c):
     810                                    if nodos_atras(x):
     811                                        for y in nodos_atras(x):
     812                                            ueup = getCoordenadas(getUE(grafo.get_node(y).attr['label'][:10]))
     813                                            conexion = "LINESTRING(%s %s, %s %s)" \
     814                                                       % (str(coordxy[0]), str(coordxy[1]), str(ueup[0]),
     815                                                          str(ueup[1]))
     816                                            ConexionCadenaProduccion.objects.create(
     817                                                grafo_id=grafo_id, sentido=conex,
     818                                                geom=conexion, nivel=0
     819                                            )
     820                                            logger.info("Estableciendo conexiones de nodos en las coordenadas [%s %s, "
     821                                                        "%s %s]" % (str(coordxy[0]), str(coordxy[1]), str(ueup[0]),
     822                                                                    str(ueup[1])))
     823
     824                            try:
     825                                if ue.nombre is not None:
     826                                    dict_cadena['nombre'] = ue.nombre
     827                                else:
     828                                    dict_cadena['nombre'] = ue.razon_social
     829
     830                            except AttributeError, e:
     831                                try:
     832                                    dict_cadena['nombre'] = ue.nombreestablecimiento
     833                                except AttributeError, e:
     834                                    try:
     835                                        dict_cadena['nombre'] = ue.nombre_comercial
     836                                    except AttributeError, e:
     837                                        logger.debug("Error al obtener el nombre o razón social de la Unidad Económica "
     838                                                     "[%s]. Detalles del error: %s" % (rif, e))
     839
     840                            try:
     841                                dict_cadena['estado'] = ue.parroquia.municipio.entidad.nombre
     842                                dict_cadena['municipio'] = ue.parroquia.municipio.nombre
     843                                dict_cadena['parroquia'] = ue.parroquia.nombre
     844                            except AttributeError, e:
     845                                logger.debug("No fue posible obtener información sobre el Estado, Municipio o "
     846                                             "Parroquia de la Unidad Económica [%s]. Detalles del error: %s" % (rif, e))
     847
     848                            # Datos de la producción
     849                            produce, consume = '', ''
     850                            conn = [g for g in grafo.edges() if c in g]
     851                            for cx in conn:
     852                                if cx[0] == c and not cx[1].attr['label'][0] in ['J', 'G', 'V', 'E', 'P'] \
     853                                    and cx[1].attr['label'].split("\\n")[1] != "":
     854                                    produce += "<li>%s</li>" % cx[1].attr['label'].split("\\n")[1]
     855                                elif cx[1] == c and not cx[0].attr['label'][0] in ['J', 'G', 'V', 'E', 'P'] \
     856                                    and cx[0].attr['label'].split("\\n")[1] != "":
     857                                    consume += "<li>%s</li>" % cx[0].attr['label'].split("\\n")[1]
     858
     859                            if produce != '':
     860                                logger.info("Estableciendo datos de la producción de la Unidad Económica [%s]" % rif)
     861                                dict_cadena['produce'] = "<ul style='list-style-type: circle;'>%s</ul>" % produce
     862                            if consume != '':
     863                                logger.info("Estableciendo datos de insumos requeridos para la producción de la Unidad "
     864                                            "Económica [%s]" % rif)
     865                                dict_cadena['consume'] = "<ul style='list-style-type: circle;'>%s</ul>" % consume
     866
     867                            logger.info("Registrando datos en BD del grafo %s" % grafo_id)
     868                            self.model.objects.create(**dict_cadena)
     869                else:
     870                    logger.warning("La cadena [%s] a georeferenciar no posee un nodo principal." % grafo_id)
     871                    self.model.objects.none()
     872
     873        else:
     874            logger.warning("No se puede georeferenciar la cadena de producción ya que no se ha especificado un grafo")
     875            return self.model.objects.none()
     876
     877        logger.info("Mostrando datos de la Cadena de Producción del grafo [%s]" % grafo_id)
     878
     879        return self.model.objects.filter(grafo_id=grafo_id)
     880
     881
     882class ConexionCadenaProduccionLayer(GeoJSONLayerView):
     883    """!
     884    Clase que gestiona los datos consultados sobre las conexiones de los nodos en la cadena de producción
     885
     886    @author Ing. Roldan D. Vargas G. rvargas@cenditel.gob.ve
     887    @author Centro Nacional de Desarrollo e Investigación en Tecnologías Libres (CENDITEL) Nodo Mérida
     888    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
     889    @date 13-10-2014
     890    @version 1.0.1
     891    """
     892    model = ConexionCadenaProduccion
     893    properties = ("grafo_id", "nivel", "sentido")
     894
     895    def get_queryset(self):
     896        """!
     897        Método que permite obtener el queryset de la clase para interactuar y gestionar los datos de las conexiones
     898        de los nodos de la cadena de producción a ser mostrados
     899        @author Ing. Roldan D. Vargas G. rvargas@cenditel.gob.ve
     900        @author Centro Nacional de Desarrollo e Investigación en Tecnologías Libres (CENDITEL) nodo Mérida
     901        @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
     902        @date 13-10-2014
     903        @param self variable de tipo object con los campos de la clase
     904        @return devuelve el queryset que será mostrado por la clase en el mapa
     905        """
     906        grafo_id = self.request.GET.get('grafo', None)
     907
     908        if grafo_id:
     909            return self.model.objects.filter(grafo_id=grafo_id)
     910
    589911
    590912
Note: See TracChangeset for help on using the changeset viewer.