Changeset 66dd87e in observatorio
- Timestamp:
- Oct 14, 2014, 5:04:52 PM (10 years ago)
- Branches:
- master
- Children:
- 1e397ea
- Parents:
- d9aeac8
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
procesos/apps/geocadena/views.py
r881e9c4 r66dd87e 39 39 from divisionTerritorial import estados 40 40 from models import LayerDivisionEstadal, LayerDivisionMunicipal, LayerDivisionParroquial, LayerRedi, \ 41 PoblacionEconomicaActiva, TasaDesempleo, GeoreferenciaIndicador, IndiceNacionalPreciosConsumidor41 MarcaCadenaProduccion, LayerCentroidePais, GeoreferenciaIndicador, ConexionCadenaProduccion 42 42 43 43 import logging … … 478 478 rif = g.node_attr['label'][0:10] 479 479 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': ''}) 495 495 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 }) 498 512 499 513 return nodo … … 522 536 if grafo: 523 537 user = str(request.user) 524 if grafo == 'encuesta': 538 """ 539 if getNodos(user): 525 540 cadena = getNodos(user) 526 541 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) 529 545 logger.info("Se han generado los datos necesarios para la georeferenciación de la cadena de producción " 530 546 "consultada") … … 572 588 if capa and field: 573 589 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) 575 591 qs = tabla.objects.all() 576 592 if cod: … … 587 603 588 604 return HttpResponse(content_type='text/plain') 605 606 607 #=== 608 # Vistas para la georeferencia de la cadena de producción 609 #=== 610 class 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 882 class 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 589 911 590 912
Note: See TracChangeset
for help on using the changeset viewer.