sábado, 13 de julio de 2013

Cálculo de distancia entre dos coordenadas decimales y conversión de coordenada decimal a UTM

image

 

 

 

 

 

 

La clase calculoUTM tiene los métodos UtmX y UtmY para convertir coordenadas geográficas a UTM, se usa los semiejes del elipsoide Hayford y las ecuaciones de Coticchia-Surace. Por otro lado, la clase calculoDistancia tiene el método Distancia para calcular la distancia entre dos coordenadas decimales, en este caso se usa la ecuación de Harvesine.


 

 

principalUTM.java

 

public class principalUtm {

public static void main(String[] args) {

            //Coordenda decimal, casa Santa Apolonia

            double La1 = -12.003093;

            double Lo1 = -77.094313;

           

            // Coordenada decimal, punto final

            double La2 = -11.99096965;

            double Lo2 = -77.06366275;

            calculoUtm oCalculo = new calculoUtm();

            System.out.println("UtmX: "+oCalculo.UtmX(Lo1, La1));

            System.out.println("UtmY: "+oCalculo.UtmY(Lo1, La1));

            System.out.println("Distancia: "+calculoDistancia.Distancia(La1, Lo1, La2, Lo2));

      }

}

 

calculoUTM.java

 

public class calculoUtm {

 

      // Semiejes del elipsoide de Hayford

      double A = 6378388;

      double B = 6356911.946130;

 

      double E = Math.sqrt(Math.pow(A, 2) - Math.pow(B, 2)) / A;

      double E1 = Math.sqrt(Math.pow(A, 2) - Math.pow(B, 2)) / B;

      double E2 = Math.pow(E1, 2);

      double C = Math.pow(A, 2) / B;

 

      public double UtmX(double Lo1, double La1) {

            // COnversiones

            double Lat = La1 * Math.PI / 180;

            double Lon = Lo1 * Math.PI / 180;

            double Huso = Math.floor((Lo1 / 6) + 31);

            double Lamda = (Huso * 6 - 183) * Math.PI / 180;

            double dLamda = Lon - Lamda;

 

            // Calculo de parametros

            double AA = Math.cos(Lat) * Math.sin(dLamda);

            double EE = 0.5 * Math.log((1 + AA) / (1 - AA));

 

            double feUTM=0.996;

            double VV = Math.pow(Math.cos(Lat), 2);

            VV = Math.sqrt(1 + E2 * VV);

            VV = (C / VV) * feUTM; // 0.9996 factor de escala de la proyeccion UTM

            double CC = (E2 / 2) * Math.pow(EE, 2) * Math.pow(Math.cos(Lat), 2);

            //Cálculo de X

            double X = EE * VV * (1 + CC / 3) + 500000;

            return X;

 

      }

      public double UtmY(double Lo1, double La1) {

            // COnversiones

            double Lat = La1 * Math.PI / 180;

            double Lon = Lo1 * Math.PI / 180;

            double Huso = Math.floor((Lo1 / 6) + 31);

            double Lamda = (Huso * 6 - 183) * Math.PI / 180;

            double dLamda = Lon - Lamda;

 

            // Calculo de parámetros

            double AA = Math.cos(Lat) * Math.sin(dLamda);

            double EE = 0.5 * Math.log((1 + AA) / (1 - AA));

            double NN = Math.atan(Math.tan(Lat) / Math.cos(dLamda));

            NN = NN - Lat;

            double VV = Math.pow(Math.cos(Lat), 2);

            VV = Math.sqrt(1 + E2 * VV);

            double feUTM=0.996;

            VV = (C / VV) * feUTM; // 0.9996 factor de escala de la proyeccion UTM

            double CC = (E2 / 2) * Math.pow(EE, 2) * Math.pow(Math.cos(Lat), 2);

            double A1 = Math.sin(2 * Lat);

            double A2 = A1 * Math.pow(Math.cos(Lat), 2);

 

            // Otros cálculos

            double J2 = Lat + A1 / 2;

            double J4 = (3 * J2 + A2) / 4;

            double J6 = (5 * J4 + A2 * Math.pow(Math.cos(Lat), 2)) / 3;

            double alfa = ((double) 3 / 4) * E2;

            double beta = ((double) 5 / 3) * Math.pow(alfa, 2);

            double ganma = ((double) 35 / 27) * Math.pow(alfa, 3);

            double Bo = 0.9996 * C * (Lat - alfa * J2 + beta * J4 - ganma * J6);

 

            // Cálculo final de coordenadas UTM

            double Y = NN * VV * (1 + CC) + Bo;

            if (La1 < 0) {

                  Y = Y + 10000000;

            }

            return Y;

      }

}

 

 

calculoDistancia.java

public class calculoDistancia {

      public static double Distancia(double La1, double Lo1, double La2, double Lo2) {

            double Distancia = 0, Distancia1 = 0;

            double r = 6378;

 

            //Punto inicial

            La1 = La1* Math.PI / 180;

            Lo1 = Lo1 * Math.PI / 180;

 

            // Punto final

            La2 = La2 * Math.PI / 180;

            Lo2 = Lo2 * Math.PI / 180;        

            //Distancia = 6378*Math.acos(Math.sin(La1)*Math.sin(La2)+ Math.cos(La1)* Math.cos(La2)*Math.cos(Lo1 - Lo2));

            Distancia1 = Math.pow(Math.sin((Lo2 - Lo1) / 2), 2);

            Distancia1 = Math.cos(La1) * Math.cos(La2) * Distancia1;

            Distancia1 = Math.pow(Math.sin((La2 - La1) / 2), 2) + Distancia1;

            Distancia1 = Math.sqrt(Distancia1);

            Distancia1 = 2 * r * Math.asin(Distancia1);

            return Distancia1;

      }

}

sábado, 6 de julio de 2013

Uso de GPS del smathphone

Ing. Abraham Sopla
Este pequeño programa didáctico, permite capturar la Latitud usando el GPS del Smartphone. Esto es mas que suficiente para que el lector pueda capturar la Longitud, Altitud y otros datos del GPS.En este programa se usa un boton y un label, tal como se puede ver aquí: 
imagebtnCapturar = (Button)findViewById(R.id.btnCapturar);
lblLatitud = (TextView)findViewById(R.id.lblInformacion); 


 

Programa completo

package com.example.pruebalocalizacion;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
     
      private Button btnCapturar;
      private TextView lblLatitud;
     
      private LocationManager locManager;
      private LocationListener locListener;
     
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        btnCapturar = (Button)findViewById(R.id.btnCapturar);
        lblLatitud = (TextView)findViewById(R.id.lblInformacion);  
       
        btnCapturar.setOnClickListener(new OnClickListener() {
                 
                  @Override
                  public void onClick(View v) {
                        comenzarLocalizacion();
                       
                  }
            });
    }
   
    private void comenzarLocalizacion()
    {
      //Obtenemos una referencia al LocationManager
      locManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
     
      //Obtenemos la última posición conocida
      Location loc = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
     
      //Mostramos la última posición conocida
      mostrarPosicion(loc);
     
      //Nos registramos para recibir actualizaciones de la posición
      locListener = new LocationListener() {
            public void onLocationChanged(Location location) {
                  mostrarPosicion(location);
            }
            public void onProviderDisabled(String provider){
                  //lblEstado.setText("Provider OFF");
            }
            public void onProviderEnabled(String provider){
                  //lblEstado.setText("Provider ON ");
            }
            public void onStatusChanged(String provider, int status, Bundle extras){
                  Log.i("", "Provider Status: " + status);
                  //lblEstado.setText("Provider Status: " + status);
            }
      };
     
      locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30000, 0, locListener);
    }
    
    private void mostrarPosicion(Location loc) {
      if(loc != null)
      {
            lblLatitud.setText("Altitud="+String.valueOf(loc.getLatitude()));
            Log.i("", String.valueOf(loc.getLatitude() + " - " + String.valueOf(loc.getLongitude())));
      }
      else
      {
            lblLatitud.setText("Precision: (sin_datos)");
      }
    }
}

jueves, 1 de noviembre de 2012

Contador PHP si usar archivo .txt

Estuve buscando como hacer un contador sin usar un archivo .txt, no me quedó otra que armarlo por mi cuenta. Copie, pegue el archivo vista.php y controlador.php. Ejecute primero el archivo vista.php y pruebe. (Aclarando que diseño no es MVC, en este caso el archivo controlador.php haría de modelo)

vista.php

<?php

if(isset($_GET['idTurista'])){

$idTurista=$_GET['idTurista'];

}

else{

$idTurista=0;

}

?>

<p>Vista:<?php echo $idTurista?> <br />

<input type="button" value="Otra opcion" onclick="location.href='controlador.php?idTurista=<?php echo $idTurista;?>'"/>

controlador.php

<?php

$idTurista=$_GET[idTurista];

$idTurista=$idTurista+4;

header('location:vista.php?idTurista='.$idTurista);

?>

viernes, 21 de septiembre de 2012

La transparencia en las bases de datos distribuidas

Abraham Sopla

La transparencia oculta al usuario la parte del cómo están organizadas las bases de datos distribuidas en los diferentes nodos físicos en las que se encuentran, esto hace que el usuario vea a la base de datos distribuida como si fuera una sola base de datos.

anim_replicacion

figura 1. Proceso de replicación de datos. Imagen tomada de http://yaadiira.blogspot.mx/2010/11/base-de-datos.html (Yadira Vega)

 

Dentro de los principales niveles de trasparencia tenemos:

  • Transparencia de Sistemas de gestión de base de datos SGBD
  • Transparencia de transacción
  • Transparencia de concurrencia
  • Transparencia respecto a fallos

Transparencia de Sistemas de gestión de base de datos SGBD

No es necesario para el usuario saber los nombres de los fragmentos menos la ubicación de estos, como se hace la replicación los nombres en cada uno de los nodos.

  1. Transparencia de fragmentación. El usuario no sabe cómo están fragmentadas las tabla en las base de datos. El usuario no necesita especificar el nombre de los fragmentos de las tablas.
  2. Transparencia de la ubicación. Puede darse el caso de que el usuario conozca cómo se encuentran fragmentadas las tablas, pero no conoce y no es necesario que sepa la ubicación de etas.
  3. Transparencia de la replicación. El usuario no sabe que nodos que contienen los fragmentos son replicados, tampoco es necesario que lo sepa para poner en funcionamiento una aplicación.
  4. Transparencia de denominación.  Cada elemento de la base de datos distribuida debe tener un nombre igual en cada uno de los nodos en que se encuentra distribuida, eso hace que el usuario manipule los elementos como si estudiaran centralizados en una sola base de datos.

Transparencia de concurrencia

  1. Los sistemas de gestión de base de datos distribuidas brindan transparencia de concurrencia si es que las transacciones independientes son lógicas y tienen similitud con que se puedan hacer al mismo tiempo, es decir los resultados serían los mismos se hiciere de una sola vez. Esto sucede con la replicación, por ejemplo, dado que este proceso es asíncrono.

Transparencia de transacción

  1. Se garantiza que todas las transacciones mantengan la integridad y coherencia de datos de la base de datos distribuida, es decir en todos sus nodos y fragmentos. Por ejemplo se puede utilizar todos los fragmentos de una tabla – estos fragmentos pueden estar físicamente en diferentes ubicaciones – de una sola vez.
  2. Una transacción internamente está dividida en sub transacciones para ocupar cada uno de los nodos que contenga los datos que se requiere, esto no es visible para el usuario. Este, simplemente envía una sola transacción.

Transparencia respecto a fallos

  1. Garantizar la atomicidad de la transacción, es decir mostrar los resultados si es que todas las sub transacciones no tuvieron error, o parar todo el proceso y algún subproceso tuvo error. Por lo tanto SGBDD debe sincronizar todas las sub transacciones mediante la transacción global

viernes, 14 de septiembre de 2012

Tomen lo que quieran pero hagan clase

Toma del gobierno regional, toma de la DREA, toma de … Desde mi niñez siempre me llevé la peor parte de los problemas del gobierno y su sistema educativo, huelgas, aclarando que si es un derecho constitucional. Recuerdo como si fuera ayer cuando con tanta emoción ingresamos a la Universidad, al mismo tiempo que se inició una gran huelga que duró tres meses, desde ahí hasta ahora en la UNC siempre llevamos un año retrasado, nunca se pudo recuperar clase, cuando se intentó recuperar habíamos perdido la emoción. Absurdamente cuando debíamos estar en casa trabajando en el campo, pues teníamos que estar en clase. La lucha de muchos docentes es justa, pero no son todos los merecen estar bien pagados.

El problema es a quien sacrificamos “a los estudiantes no es verdad”, eso de recuperación de clase es mal cuento, es una grandísima mentira, es casi como querer recuperar el tiempo perdido, es como querer armar un cristal roto, ya no es lo mismo hacer una clase en el momento adecuado y planificado que después. Los docentes encarnan serios problemas como muchos son testigos -me consta- quizá yo mismo sea uno de ellos, quien me lo dice.

El gobierno (alcalde, presidente regional, presidente de la república) es el culpable tan igual como los docentes – al menos esos de los miércoles - y los padres de familia. Sin embargo cuando se protesta no se mide a quien realmente se afecta, en este caso los más débiles los niños. Por eso, tomen lo que quieran, si quieren agua de pozo de Yanayacu como alguien dijo por ahí, pero hagan clase y verán el apoyo de la población para convencer al gobierno que merecen estar bien pagados. Aquí cuantos trabajadores del gobierno regional estarán felices porque podrán hacer otros cachuelos o simplemente irse de vacaciones, no todos los docentes son consecuentes, entonces también tomarán la huelga como vacaciones. Por eso sugiero, tomen lo que quieran, si quieren agua, pero hagan clase.

Abraham

sábado, 8 de septiembre de 2012

Aprendiendo la aplicación de las herramientas informáticas con la aplicación

Que pasa en las aulas de informática. Cuando se desarrollan las sesiones de aprendizaje de herramientas informáticas, generalmente los docentes nos ponemos a explicar la teoría mezclando con la práctica, otras veces vamos muy rápido tal que si el alumno no puso bien la vista en un paso súper importante se perdió, no solo esa parte sino dolorosamente todo lo que viene, cada paso necesita de mayor concentración del alumno. El problema empeora cuando las aulas de computación no están adecuadas para que el alumno pueda ver el pizarrón o los gestos que hace el docente hace cuando explica, entre otras dificultades propias del aula de cómputo. Otras veces, los estudiantes tienen que escribir textos, dibujar o hacer cosas que bien las puede traer a clase ya hechas, y como sabemos no todos van a un mismo ritmo. En consecuencia consideramos importante que el alumno haga un pre entrenamiento en casa. Los alumnos deben mostrar su atención o al docente o a lo que están haciendo en la computadora y dos cosas no se puede hacer al mismo tiempo, esta es la realidad en la que nos gustaría aportar. No podemos decirle al alumno haz eso y préstame atención, esto es terriblemente absurdo, sin embargo eso es lo que siempre hacemos muchas veces los profesores.

Las herramientas informáticas como por ejemplo Hotmail, Word, Excel, visual Basic, dreamweaver, corel, autocad, Windows, IOS, Facebook, etc, son intuitivas a excepción de las de programación. El aprendizaje de una herramienta puede tener dos grandes objetivos generales, enseñar a usar la herramienta o enseñar a aplicarla. Estos dos objetivos se pueden desarrollar en dos periodos, en dos semestres, en dos tiempos diferentes, etc. aplicando este mismo método. Sin embargo, el método se pone más interesante si es que se quiere enseñar a aplicar las herramientas informáticas.

Aprendiendo en la práctica. Las cosas en el mundo real se aprenden por experiencia, otras probando repetidas veces, o por eventualidad y generalmente en el orden, primero la teoría luego la práctica. A nuestro entender, en la enseñanza de herramientas informáticas, no siempre se empieza por la teoría y luego viene la práctica, como generalmente se hace todavía en los centros de enseñanza de informática. Por ejemplo, el uso de Facebook muchos lo aprendieron por experimentación -además que esta es una herramienta muy intuitiva como muchas otras herramientas informáticas de hoy en día-, como quien dice que pasa si escribo algo y le doy compartir, vimos una foto en miniatura, hicimos un clic y se amplió, etc. El método que queremos aplicar a la enseñanza de la herramientas informáticas se resume en: primero presentando aplicaciones a los alumnos en guías (con videos, audios, imágenes, texto) cuyos pasos deben repetir en casa o al inicio de la clase al pie de la letra, luego viene una fase teórica a cargo del docente para explicar los elementos y conceptos, terminando con la fase de la aplicación que la debe hacer nuevamente el alumno. Las aplicaciones son experiencias que el alumno primero repite, luego la analiza (teoría) con el profesor y luego el mismo soluciona una situación problemática. La participación en este proceso de aprendizaje sería en el orden alumno – profesor – alumno. La guías de experiencias y/o aplicaciones las debe tener el alumno con muchos días de anterioridad.

Algunas claves previas a tener en cuenta serían, enseñar a instalar la herramienta, un tour por el entorno general de la herramienta, conceptos generales ¡los más importantes!, los que el estudiante debe saber al revés y al derecho o que siempre va utilizar desde el inicio hasta el final del periodo de aprendizaje.

Matriz de ideas del método

APLICACIÓN INICIAL

ANÁLISIS

APLICACIÓN FINAL

Este momento puede ser desarrollado por el alumno en casa. Inclusive puede motivarlo.

Se hace si o si con la participación del profesor

Esta parte puede ser desarrollada solo por el alumno, o con la ayuda del maestro en caso extremo. Lo ideal del método es que el alumno resuelva solo. Si el alumno resuelve solo, el método ha funcionado.

Videos, guías, audio en el que se indique paso a paso un caso o la resolución de un problema (puede ser un problema correspondiente a la fase de aprendizaje de una herramienta o la fase de aplicación de la herramienta) que estemos seguros que el estudiante puede resolver dado sus conocimientos previos.

Detallar el funcionamiento: entradas, proceso y salida.

Explicar al alumno las entradas, analizar el proceso del caso, explicar los resultados.

Se aplica lo aprendido en los dos momentos anteriores para resolver un problema

El alumno no resuelve nada, no inventa nada, solo repite los pasos de la guía que el profesor propone para la solución problemas.

   

Alumno 90%, profesor 10%

90% profesor, 10% alumno

Alumno 90%, profesor 10%

30 minutos

30 minutos de exposición

30 minutos para resolver un problema, esta vez si el alumno inventa o construye la solución a un problema, lo puede hacer en casa.

Caso construido por el profesor para que el alumno lo vuelva a construir

Caso Analizado para que el alumno aprenda el comportamiento de lo utilizado para construir el caso

Caso construido por el alumno

En el afán por construir, el alumno hace su propia retroalimentación libremente.

El profesor explica los nuevos conceptos que el alumno debe aprender. El alumno aprende más.

El alumno pone en práctica los nuevos conceptos aprendidos

El alumno es casi un autómata. Descubre pocas cosas solo por experiencia. O por voluntad, por necesidad.

El alumno empieza a descubrir con la ayuda del profesor y entiende.

El alumno descubre muchas más cosas por su cuenta, por experiencia y por razón (ya sabe porque los comportamientos de los elementos o conceptos que está aprendiendo).

EJEMPLO

Ponga tres botones, combos, cajas de texto, escriba el siguiente texto o código en el botón tal.

Indique como se jalan los textos, como se ponen los botones, etc.

Indique el nombre de los archivos donde hacer tal o cual cosa, esto es muy importante.

EJEMPLO

Teoría de lo que se requiere que el alumno aprenda, o el código, o el cómo poner un botón, la aplicación, etc.

EJEMPLO

Aplicaciones a problemas de calculo

Ejemplo de casos

Suma de 2 números. Pasos para realizar la suma

Teoría dela suma, partes de la suma

Suma tres números

Ponga dos cajas y un botón

Teoría de los botones y las cajas

1. Ponga tres bonotes, cinco cajas

Ponga dos cajas y un botón para realizar una suma

Teoría de cómo se comportan, propiedades, eventos, importantes de los botones para realizar una suma.

1. Ponga dos cajas y un botón para realizar una multiplicación.

2. Ponga dos cajas y dos botones en el primero se hace la división y en segundo se hace la resta.

Sumar dos numero en una hoja de cálculo

 

1. Sumar tres números en una hoja de calculo

Finalmente, se logra que los alumnos se hagan súper preguntones, surge el millón de preguntas, aprende el profesor, aprenden los alumnos, cada uno de ellos trae nuevos conocimientos.