Changeset 30d690f in observatorio
- Timestamp:
- Aug 28, 2014, 10:00:12 AM (10 years ago)
- Branches:
- master
- Children:
- 41e9805
- Parents:
- a030475
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
procesos/apps/geocadena/views.py
ra42c5ad r30d690f 11 11 12 12 ## Muestra el autor del script cuando es invocado 13 from django.http import HttpResponse 13 from __future__ import division 14 14 15 15 16 __author__ = 'Ing. Roldan D. Vargas G. (rvargas@cenditel.gob.ve)' … … 17 18 __doc__ = "Instrucciones a utilizar para las vistas del Sistema de Información Geográfico" 18 19 20 from django.http import HttpResponse 19 21 from django.shortcuts import render_to_response 20 22 from django.contrib.auth.decorators import login_required 21 23 from django.template.context import RequestContext 22 24 from django.conf import settings 25 from django.db.models import Sum 23 26 from django.db.models.loading import get_model 24 27 from pygraphviz import AGraph 25 28 from djgeojson.serializers import Serializer as GeoJSONSerializer 26 29 from djgeojson.views import GeoJSONLayerView 30 from operator import itemgetter 31 32 from sigesic.produccion.models import Produccion_precios_r, Consumo_precios_r 27 33 from sigesic.unidadecon.identifica.models import Unidad_Economica 34 from sigesic.unidadecon.nodosprodu.models import Personal_Ocupado 28 35 from productores.models import Productor 29 36 from cadenas.models import Directorio2005, Encuesta 30 37 from divisionTerritorial import estados 31 from models import LayerDivisionEstadal, LayerDivisionMunicipal, LayerDivisionParroquial, LayerRedi, RelacionRediEntidad 38 from models import LayerDivisionEstadal, LayerDivisionMunicipal, LayerDivisionParroquial, LayerRedi, \ 39 PoblacionEconomicaActiva, TasaDesempleo, GeoreferenciaIndicador, IndiceNacionalPreciosConsumidor 32 40 33 41 … … 284 292 'ueparr': parroquia, 285 293 'nivel': nivel}) 286 except Exception , e:294 except Exception: 287 295 pass 288 296 … … 403 411 'capa': str(rif_ini) + " - " + str(rif_fin), 404 412 }) 405 except Exception , e:413 except Exception: 406 414 pass 407 415 … … 430 438 @login_required() 431 439 def 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 """ 432 450 capa = request.GET.get('capa', None) 433 451 field = request.GET.get('field', None) … … 451 469 # Geográfico 452 470 #=== 453 @login_required() 454 def indicador_estadistico(request): 471 def indicadores_estadisticos(dic): 455 472 """! 456 Permite validar y mostrar los datos sobre los indicadores estadísticos a georeferenciar457 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 458 475 @author Ing. Roldan D. Vargas G. rvargas@cenditel.gob.ve 459 476 @author Centro Nacional de Desarrollo e Investigación en Tecnologías Libres (CENDITEL) nodo Mérida 460 477 @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 467 481 """ 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 519 class 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.