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);

?>