Changeset 30d690f in observatorio


Ignore:
Timestamp:
Aug 28, 2014, 10:00:12 AM (10 years ago)
Author:
Ing. Roldan Vargas <rvargas@…>
Branches:
master
Children:
41e9805
Parents:
a030475
Message:

se agrega clase de vista genérica para la consulta de indicadores estadísticos, de igual forma se agrega función que permite establecer la densidad de la capa de acuerdo a los datos a mostrar en cada una de ellas sobre los indicadores estadísticos

File:
1 edited

Legend:

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

    ra42c5ad r30d690f  
    1111
    1212## Muestra el autor del script cuando es invocado
    13 from django.http import HttpResponse
     13from __future__ import division
     14
    1415
    1516__author__ = 'Ing. Roldan D. Vargas G. (rvargas@cenditel.gob.ve)'
     
    1718__doc__ = "Instrucciones a utilizar para las vistas del Sistema de Información Geográfico"
    1819
     20from django.http import HttpResponse
    1921from django.shortcuts import render_to_response
    2022from django.contrib.auth.decorators import login_required
    2123from django.template.context import RequestContext
    2224from django.conf import settings
     25from django.db.models import Sum
    2326from django.db.models.loading import get_model
    2427from pygraphviz import AGraph
    2528from djgeojson.serializers import Serializer as GeoJSONSerializer
    26 
     29from djgeojson.views import GeoJSONLayerView
     30from operator import itemgetter
     31
     32from sigesic.produccion.models import Produccion_precios_r, Consumo_precios_r
    2733from sigesic.unidadecon.identifica.models import Unidad_Economica
     34from sigesic.unidadecon.nodosprodu.models import Personal_Ocupado
    2835from productores.models import Productor
    2936from cadenas.models import Directorio2005, Encuesta
    3037from divisionTerritorial import estados
    31 from models import LayerDivisionEstadal, LayerDivisionMunicipal, LayerDivisionParroquial, LayerRedi, RelacionRediEntidad
     38from models import LayerDivisionEstadal, LayerDivisionMunicipal, LayerDivisionParroquial, LayerRedi, \
     39    PoblacionEconomicaActiva, TasaDesempleo, GeoreferenciaIndicador, IndiceNacionalPreciosConsumidor
    3240
    3341
     
    284292                                   'ueparr': parroquia,
    285293                                   'nivel': nivel})
    286     except Exception, e:
     294    except Exception:
    287295        pass
    288296
     
    403411                            'capa': str(rif_ini) + " - " + str(rif_fin),
    404412                        })
    405         except Exception, e:
     413        except Exception:
    406414            pass
    407415
     
    430438@login_required()
    431439def json(request):
     440    """!
     441    Función que permite mostrar capas superpuestas en formato GeoJSON
     442    @author Ing. Roldan D. Vargas G. rvargas@cenditel.gob.ve
     443    @author Centro Nacional de Desarrollo e Investigación en Tecnologías Libres (CENDITEL) nodo Mérida
     444    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
     445    @date 01-08-2014
     446    @pre Requiere auntenticación del usuario y el registro de la capa a ser mostrada
     447    @param request  Variable de tipo JSON que contiene los datos de petición al servidor
     448    @return la capa a mostrar en formato GeoJSON
     449    """
    432450    capa = request.GET.get('capa', None)
    433451    field = request.GET.get('field', None)
     
    451469# Geográfico
    452470#===
    453 @login_required()
    454 def indicador_estadistico(request):
     471def indicadores_estadisticos(dic):
    455472    """!
    456     Permite validar y mostrar los datos sobre los indicadores estadísticos a georeferenciar
    457 
     473    Función que permite crear las capas a mostrar para los indicadores estadísticos, así como la asignación de los
     474    colores de acuerdo a la densidad de los resultados obtenidos por cada región consultada
    458475    @author Ing. Roldan D. Vargas G. rvargas@cenditel.gob.ve
    459476    @author Centro Nacional de Desarrollo e Investigación en Tecnologías Libres (CENDITEL) nodo Mérida
    460477    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
    461     @date 19-08-2014
    462     @pre Requiere auntenticación del usuario e información registrada en el SIGESIC, así como información estadística
    463         suministrada por el Instituto Nacional de Estadística INE
    464     @param request  Variable de tipo JSON que contiene los datos de petición al servidor
    465     @return Información relacionada sobre el indicador estadístico consultado para la representación geográfica del
    466         mismo
     478    @date 27-08-2014
     479    @pre Requiere una lista de diccionarios con los datos obtenidos del indicador consultado
     480    @param dic variable de tipo lista que contiene los diccionarios con los datos a mostrar en la capa
    467481    """
    468     indicador = request.GET.get('indicador', None)
    469     anho = request.GET.get('anho', None)
    470     semestre = request.GET.get('semestre', None)
    471     actividad_ciiu = request.GET.get('actividad_ciiu', None)
    472     area_cobertura = request.GET.get('area_cobertura', None)
    473 
    474     if indicador and anho and semestre and area_cobertura:
    475         field, qs = "", []  # Inicializacion de variables
    476 
    477         if area_cobertura == "p":
    478             qs = LayerDivisionParroquial.objects.all()
    479         elif area_cobertura == "m":
    480             qs = LayerDivisionMunicipal.objects.all()
    481         elif area_cobertura == "e":
    482             qs = LayerDivisionEstadal.objects.all()
    483         elif area_cobertura == "r":
    484             qs = LayerRedi.objects.all()
    485 
    486         if indicador == "1" and actividad_ciiu and actividad_ciiu.__len__() <= 4:
    487             ## Condición que evalúa si se desea consulta el indicador correspondiente al número de empleos generados
    488             # por las empresas registradas en el SIGESIC según la actividad económica indicada
    489             empresas = Unidad_Economica.objects.filter(actividad_ciiu__ciiu=actividad_ciiu)
    490             if area_cobertura == "e":
    491                 qs = qs.filter(cod_estado__in=[emp.parroquia.municipio.entidad.codigo for emp in empresas])
    492             elif area_cobertura == "r":
    493                 qs = qs.filter(relacionredientidad__entidad__in=[emp.parroquia.municipio.entidad.codigo
    494                                                                  for emp in empresas]).distinct("geom")
    495             else:
    496                 qs = qs.none()
    497         elif indicador == "2":
    498             ## Condición que evalúa si se desea consulta el indicador correspondiente a la proporción del número de
    499             # empleos generados por las empresas registradas en el SIGESIC, respecto al número de empleos registrados
    500             #  por las empresas a nivel nacional
    501             empresas = Unidad_Economica.objects.all()
    502         elif indicador == "3":
    503             ## Condición que evalúa si se desea consulta el indicador correspondiente a la población económicamente
    504             # activa según datos estadísticos del Instituto Nacional de Estadística (INE)
    505             pass
    506         elif indicador == "4":
    507             ## Condición que evalúa si se desea consulta el indicador correspondiente a la tasa de desempleo según
    508             # datos estadísticos del Instituto Nacional de Estadística (INE)
    509             pass
    510         elif indicador == "5":
    511             ## Condición que evalúa si se desea consulta el indicador correspondiente al índice de especialización de
    512             #  las empresas registradas en el SIGESIC
    513             pass
    514         elif indicador == "6":
    515             ## Condición que evalúa si se desea consulta el indicador correspondiente a la proporción de la
    516             # producción en cada región, respecto al total registrado en el SIGESIC
    517             pass
    518         elif indicador == "7":
    519             ## Condición que evalúa si se desea consulta el indicador correspondiente al consumo intermedio
    520             # necesarios para la producción de bienes finales
    521             pass
    522         elif indicador == "8":
    523             ## Condición que evalúa si se desea consulta el indicador correspondiente al índice nacional de precios
    524             # al consumidor de las principales ciudades del pais según datos estadísticos del Instituto Nacional de
    525             # Estadística (INE)
    526             pass
    527         elif indicador == "9":
    528             ## Condición que evalúa si se desea consulta el indicador correspondiente a la proporción de bienes
    529             # intermedios importados requeridos para la producción de las empresas registradas en el SIGESIC
    530             pass
    531         else:
    532             return HttpResponse(content_type='text/plain')
    533 
    534         return HttpResponse(str(GeoJSONSerializer().serialize(qs, use_natural_keys=True,
    535                                                               properties={'field_name': field})),
    536                             content_type="text/plain")
    537 
    538 
    539     return HttpResponse(content_type='text/plain')
     482    GeoreferenciaIndicador.objects.all().delete()
     483    densidad = {
     484        "0-1": "#FFFFFF",
     485        "1-5": "#FFFFE5",
     486        "5-10": "#FFF7BB",
     487        "10-20": "#FEE390",
     488        "20-30": "#FEC34E",
     489        "30-50": "#FE9828",
     490        "50-70": "#EC6F13",
     491        "70-80": "#CC4B02",
     492        "80-90": "#983304",
     493        "90-100": "#652406"
     494    }
     495
     496    if dic:
     497        lista_asc = sorted(dic, key=itemgetter('result'))
     498        mayor = lista_asc[-1]
     499
     500        index = 0
     501        for d in dic:
     502            # valor por defecto del color de la capa a mostrar en caso de no poderse calcular su densidad
     503            capa_fill = "#FFCC66"
     504            if d['result'] > 0:
     505                # variable que calcula el porcentaje del elemento obtenido para determinar la densidad de la capa a mostrar
     506                color = (d['result'] * 100) / mayor['result']
     507                for fillColor in densidad:
     508                    val = fillColor.split("-")
     509                    if int(val[0]) <= color <= int(val[1]):
     510                        capa_fill = densidad[fillColor]
     511            elif d['result'] == 0:
     512                capa_fill = densidad['0-1']
     513
     514            GeoreferenciaIndicador.objects.create(gid=str(index), label=d['label'], datos=d['result'], densidad=capa_fill,
     515                                                  geom=d['geom'])
     516            index += 1
     517
     518
     519class IndicadorLayer(GeoJSONLayerView):
     520    """!
     521    Clase que gestiona los datos consultados sobre los indicadores estadísticos a ser mostrados en el Sistema de
     522    Información Geográfico (SIG)
     523
     524    @author Ing. Roldan D. Vargas G. rvargas@cenditel.gob.ve
     525    @author Centro Nacional de Desarrollo e Investigación en Tecnologías Libres (CENDITEL) Nodo Mérida
     526    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
     527    @date 15-08-2014
     528    @version 1.0.1
     529    """
     530
     531    #precision = 4
     532    #simplify = 0.5
     533    properties = ("datos", "label", "densidad")
     534
     535    def get_queryset(self):
     536        indicador = self.request.GET.get('indicador', None)
     537        capa = self.request.GET.get('area_cobertura', None)
     538        ciiu = self.request.GET.get('actividad_ciiu', None)
     539        anho = self.request.GET.get('anho', None)
     540        semestre = self.request.GET.get('semestre', None)
     541        campo = ""
     542
     543        if capa:
     544
     545            if capa == "p":
     546                self.model = LayerDivisionParroquial.objects.all().order_by("cod_parroquia")
     547                campo = 'cod_parroquia'
     548            elif capa == "e":
     549                self.model = LayerDivisionEstadal.objects.all().order_by("cod_estado")
     550                campo = 'cod_estado'
     551            elif capa == "m":
     552                self.model = LayerDivisionMunicipal.objects.all().order_by("id_municipio")
     553                campo = 'id_municipio'
     554            elif capa == "r":
     555                self.model = LayerRedi.objects.all()
     556                campo = "redientidad__entidad__cod_estado"
     557
     558        if indicador:
     559            try:
     560
     561                if indicador == "1" and ciiu and ciiu.__len__() <= 4:
     562
     563                    cobertura = {
     564                        'e': 'ue_rif__parroquia__municipio__entidad',
     565                        'r': ''
     566                    }
     567
     568                    po = Personal_Ocupado.objects.filter(ue_rif__actividad_ciiu__ciiu=ciiu, activo=True).values(
     569                        cobertura[capa], 'administrativo', 'operativo'
     570                    )
     571
     572                    eg = []
     573                    for c in self.model:
     574                        empleos_generados = 0
     575                        for ind in po:
     576                            if ind[cobertura[capa]] == getattr(c, campo):
     577                                empleos_generados += ind['administrativo'] + ind['operativo']
     578
     579                        if empleos_generados > 0:
     580                            eg.append({
     581                                'result': empleos_generados,
     582                                'label': "Empleos Generados: %s" % empleos_generados,
     583                                'geom': c.geom
     584                            })
     585
     586                    indicadores_estadisticos(eg)
     587
     588                elif indicador == "2":
     589                    cobertura = {
     590                        'm': 'ue_rif__parroquia__municipio',
     591                        'e': 'ue_rif__parroquia__municipio__entidad',
     592                        'r': ''
     593                    }
     594
     595                    po = Personal_Ocupado.objects.filter(activo=True)
     596                    em = po.values(cobertura[capa], 'administrativo', 'operativo')
     597                    sub_total = po.aggregate(total_adm=Sum('administrativo'), total_op=Sum('operativo'))
     598                    total_empleos = sub_total['total_adm'] + sub_total['total_op']
     599
     600                    peg = []
     601
     602                    for c in self.model:
     603                        proporcion_empleos = 0
     604                        for ind in em:
     605                            if ind[cobertura[capa]] == getattr(c, campo):
     606                                proporcion_empleos += ind['administrativo'] + ind['operativo']
     607
     608                        if proporcion_empleos > 0:
     609                            proporcion_empleos = (proporcion_empleos / total_empleos) * 100
     610
     611                        peg.append({
     612                            'result': proporcion_empleos,
     613                            'label': "%s %%" % float("{0:.2f}".format(proporcion_empleos)),
     614                            'geom': c.geom
     615                        })
     616
     617                    indicadores_estadisticos(peg)
     618
     619                elif indicador == "3":
     620                    pea = []
     621                    for c in self.model:
     622                        if PoblacionEconomicaActiva.objects.filter(anho=anho, semestre=semestre,
     623                                                                   estado__cod_estado=c.cod_estado):
     624                            pob_eco_act = PoblacionEconomicaActiva.objects.get(anho=anho, semestre=semestre,
     625                                                                               estado__cod_estado=c.cod_estado)
     626                            sum_ocu_des = pob_eco_act.poblacion_ocupada + pob_eco_act.poblacion_desocupada
     627                            pea.append({
     628                                'result': sum_ocu_des,
     629                                'label': "%s %s" % (pob_eco_act.poblacion_ocupada, pob_eco_act.poblacion_desocupada),
     630                                'geom': c.geom
     631                            })
     632
     633                    indicadores_estadisticos(pea)
     634
     635                elif indicador == "4":
     636                    td = []
     637                    for c in self.model:
     638                        if TasaDesempleo.objects.filter(anho=anho, semestre=semestre, estado__cod_estado=c.cod_estado):
     639                            tasa_desempleo = TasaDesempleo.objects.get(anho=anho, semestre=semestre,
     640                                                                       estado__cod_estado=c.cod_estado)
     641                            td.append({
     642                                'result': tasa_desempleo.porcentaje,
     643                                'label': "%s %%" % tasa_desempleo.porcentaje,
     644                                'geom': c.geom
     645                            })
     646
     647                    indicadores_estadisticos(td)
     648
     649                elif indicador == "5":
     650                    po = Personal_Ocupado.objects.filter(activo=True)
     651                    po_ciiu_nac = po.filter(ue_rif__actividad_ciiu__ciiu=ciiu).aggregate(
     652                        adm=Sum('administrativo'), ope=Sum('operativo')
     653                    )
     654                    po_nac = po.aggregate(adm=Sum('administrativo'), ope=Sum('operativo'))
     655                    total_nac = (po_ciiu_nac['adm'] + po_ciiu_nac['ope']) / (po_nac['adm'] + po_nac['ope'])
     656
     657                    ie = []
     658                    for c in self.model:
     659                        cobertura = {
     660                            'e': {
     661                                'filtro': {'ue_rif__parroquia__municipio__entidad': getattr(c, campo)}
     662                            },
     663                            'r': ''
     664                        }
     665
     666                        if po.filter(ue_rif__actividad_ciiu__ciiu=ciiu, **cobertura[capa]['filtro']) and \
     667                            po.filter(**cobertura[capa]['filtro']):
     668
     669                            po_ciiu = po.filter(
     670                                ue_rif__actividad_ciiu__ciiu=ciiu, **cobertura[capa]['filtro']
     671                            ).aggregate(adm=Sum('administrativo'), ope=Sum('operativo'))
     672
     673                            po_region = po.filter(
     674                                **cobertura[capa]['filtro']
     675                            ).aggregate(adm=Sum('administrativo'), ope=Sum('operativo'))
     676
     677                            total_reg = (po_ciiu['adm'] + po_ciiu['ope']) / (po_region['adm'] + po_region['ope'])
     678
     679                            indice = total_reg / total_nac
     680
     681                            ie.append({
     682                                'result': indice,
     683                                'label': "%s" % indice,
     684                                'geom': c.geom
     685                            })
     686
     687                    indicadores_estadisticos(ie)
     688
     689                elif indicador == "6":
     690                    cobertura = {
     691                        'p': 'producto_id__planta_id__parroquia',
     692                        'm': 'producto_id__planta_id__parroquia__municipio',
     693                        'e': 'producto_id__planta_id__parroquia__municipio__entidad',
     694                        'r': ''
     695                    }
     696
     697                    total_produccion = Produccion_precios_r.objects.filter(anho__year=anho).aggregate(
     698                        produccion_total=Sum('precio_venta')
     699                    )
     700
     701                    pp = []
     702
     703                    for c in self.model:
     704                        filtro = {cobertura[capa]: getattr(c, campo)}
     705                        if Produccion_precios_r.objects.filter(anho__year=anho, **filtro):
     706                            pxz = Produccion_precios_r.objects.filter(anho__year=anho, **filtro).aggregate(
     707                                produccion_x_zona=Sum('precio_venta')
     708                            )
     709
     710                            proporcion_produccion = (pxz['produccion_x_zona'] / total_produccion['produccion_total']) * 100
     711
     712                            pp.append({
     713                                'result': proporcion_produccion,
     714                                'label': "%s %%" % float("{0:.2f}".format(proporcion_produccion)),
     715                                'geom': c.geom
     716                            })
     717
     718                    indicadores_estadisticos(pp)
     719
     720                elif indicador == "7":
     721                    cobertura = {
     722                        'p': 'insumo_id__planta_id__parroquia',
     723                        'm': 'insumo_id__planta_id__parroquia__municipio',
     724                        'e': 'insumo_id__planta_id__parroquia__municipio__entidad',
     725                        'r': ''
     726                    }
     727
     728                    ci = []
     729
     730                    for c in self.model:
     731                        filtro = {cobertura[capa]: getattr(c, campo)}
     732                        if Consumo_precios_r.objects.filter(anho__year=anho, cant_comp_nac__gt=0, **filtro):
     733                            consumo_precios = Consumo_precios_r.objects.filter(
     734                                anho__year=anho, cant_comp_nac__gt=0, **filtro
     735                            ).aggregate(
     736                                cantidad=Sum('cant_comp_nac'), precio=Sum('prec_adq_nac')
     737                            )
     738
     739                            consumo_intermedio = consumo_precios['cantidad'] * consumo_precios['precio']
     740
     741                            ci.append({
     742                                'result': consumo_intermedio,
     743                                'label': "%s Bs." % float("{0:.40f}".format(consumo_intermedio)),
     744                                'geom': c.geom
     745                            })
     746
     747                    indicadores_estadisticos(ci)
     748
     749                elif indicador == "8":
     750                    cobertura = {
     751                        'e': 'estado__cod_estado',
     752                        'r': ''
     753                    }
     754
     755                    inpc = []
     756
     757                    for c in self.model:
     758                        filtro = {cobertura[capa]: getattr(c, campo)}
     759                        if IndiceNacionalPreciosConsumidor.objects.filter(anho=anho, semestre=semestre, **filtro):
     760                            indice_precios = IndiceNacionalPreciosConsumidor.objects.get(anho=anho, semestre=semestre,
     761                                                                                         **filtro)
     762
     763                            label = "%s %%" % indice_precios.porcentaje
     764                            if indice_precios.otros:
     765                                label = "otros\n%s" % label
     766
     767                            inpc.append({
     768                                'result': indice_precios.porcentaje,
     769                                'label': label,
     770                                'geom': c.geom
     771                            })
     772
     773                    indicadores_estadisticos(inpc)
     774
     775                elif indicador == "9":
     776                    cobertura = {
     777                        'p': 'insumo_id__planta_id__parroquia',
     778                        'm': 'insumo_id__planta_id__parroquia__municipio',
     779                        'e': 'insumo_id__planta_id__parroquia__municipio__entidad',
     780                        'r': ''
     781                    }
     782
     783                    total_produccion_importada = Consumo_precios_r.objects.filter(
     784                        anho__year=anho, cant_comp_imp__gt=0
     785                    ).aggregate(
     786                        total=Sum('cost_adq')
     787                    )
     788
     789                    pbii = []
     790
     791                    for c in self.model:
     792                        filtro = {cobertura[capa]: getattr(c, campo)}
     793                        if Consumo_precios_r.objects.filter(anho__year=anho, cant_comp_imp__gt=0, **filtro):
     794                            bii = Consumo_precios_r.objects.filter(
     795                                anho__year=anho, cant_comp_imp__gt=0, **filtro
     796                            ).aggregate(
     797                                precio=Sum('cost_adq')
     798                            )
     799
     800                            bienes_intermedios_importados = (bii['precio'] / total_produccion_importada['total']) * 100
     801
     802                            pbii.append({
     803                                'result': bienes_intermedios_importados,
     804                                'label': "%s %%" % float("{0:.2f}".format(bienes_intermedios_importados)),
     805                                'geom': c.geom
     806                            })
     807
     808                    indicadores_estadisticos(pbii)
     809
     810                qs = GeoreferenciaIndicador.objects.all()
     811
     812                return qs
     813            except Exception, e:
     814                print e
     815
     816        return self.model.objects.none()
Note: See TracChangeset for help on using the changeset viewer.