miércoles, 17 de julio de 2013

Aplicación móvil para una tienda en cambio

Ing. Abraham  Sopla Maslucán

Lima – Perú

Problema

Se requiere usar un web service para crear una aplicación móvil para Android que  permita calcular el valor de un monto de dinero dado en cierto tipo de moneda a otro tipo de moneda.

 

Solución

La solución nos exige el un servicio web, para que los valores de cambio sean totalmente actualizados en el momento que se desea hacer el cambio. Por eso usaremos la información de  la siguiente ruta: http://www.webservicex.net/ws/WSDetails.aspx?CATID=2&WSID=10, se subrayan los parámetros que se usaran en la aplicación.  

clip_image002[4]

 

Al invocar el servicio se recibe, en este caso específico, el tipo de cambio de un dólar en soles.

<double xmlns="http://www.webserviceX.NET/">2.7645</double>

 

Creación del proyecto

Crear un nuevo proyecto con las especificaciones de la siguiente tabla, use el SDK 3.0 como mínimo:

Application Name

Cambio

Project Name

Cambio

Package Name

com.soplaingenieros.cambio

 

Una actividad en blanco con las siguientes especificaciones:

Activity Name

MainActivity

Layout Name

activity_main

Navigation Type

none

 

Actividad

activity_main.xml

En el layout de la actividad 1 (activity_actividad1) agregue los widgets para construir la siguiente interfaz:

clip_image004[4]

Nombre los controles: La estructura de la Outline y los nombres de los controles es la siguiente:

clip_image006[4]

Librerías adicionales

·         Ksoap2

Agregando el permiso para usuarios de internet

Esto se realiza en el Android Manifest

clip_image008[4]

Programación

MainActivity.java

package com.soplaingenieros.cambio;

import org.ksoap2.SoapEnvelope;

import org.ksoap2.serialization.PropertyInfo;

import org.ksoap2.serialization.SoapObject;

import org.ksoap2.serialization.SoapPrimitive;

import org.ksoap2.serialization.SoapSerializationEnvelope;

import org.ksoap2.transport.HttpTransportSE;

 

import android.os.Bundle;

import android.os.StrictMode;

import android.app.Activity;

import android.view.Menu;

import android.view.View;

import android.widget.EditText;

import android.widget.TextView;

import android.widget.Toast;

 

public class MainActivity extends Activity {

      private static final String SOAP_ACTION = "http://www.webserviceX.NET/ConversionRate";

      private static final String NAME_SPACE = "http://www.webserviceX.NET/";

      private static final String URL = "http://www.webservicex.net/CurrencyConvertor.asmx";

      private static final String METHOD_NAME = "ConversionRate";

     

      // Controles

      private EditText etImporte;

      private EditText etDe;

      private EditText etA;

      private TextView tvResultado;

 

      @Override

      protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(R.layout.activity_main);

            // Si se trata de Android versión 3 o superior

            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()

                        .permitAll().build();

            StrictMode.setThreadPolicy(policy);

            // Controles

            etImporte = (EditText) findViewById(R.id.ccEtImporte);

            etDe = (EditText) findViewById(R.id.ccEtDe);

            etA = (EditText) findViewById(R.id.ccEtA);

 

      }

 

      public void onClickConsultar(View view) {

            try {

                  // Datos

 

                  // String cant = etImporte.getText().toString();

                  String de = etDe.getText().toString();

                  String a = etA.getText().toString();

                  // Objeto SOAP

                  SoapObject request = new SoapObject(NAME_SPACE, METHOD_NAME);

 

                  // Propiedad DE

                  PropertyInfo propDe = new PropertyInfo();

                  propDe.setName("FromCurrency");

                  propDe.setValue(de);

                  request.addProperty(propDe);

                  // Propiedad A

                  PropertyInfo propA = new PropertyInfo();

                  propA.setName("ToCurrency");

                  propA.setValue(a);

                  request.addProperty(propA);

                  // Ejecución

                  SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(

                             SoapEnvelope.VER11);

                  envelope.dotNet = true;

                  envelope.setOutputSoapObject(request);

                  HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

                  androidHttpTransport.call(SOAP_ACTION, envelope);

                  SoapPrimitive response = (SoapPrimitive) envelope.getResponse();

 

                  // Obtener respuesta

 

                  Double importe = Double.valueOf(etImporte.getText().toString());

                  Double resultado = Double.valueOf(response.toString()) * importe;

                  tvResultado = (TextView) findViewById(R.id.ccTvRespuesta);

                  tvResultado.setText(String.valueOf(resultado));

 

            } catch (Exception e) {

                  e.printStackTrace();

                  Toast.makeText(getApplicationContext(), e.getMessage(),

                             Toast.LENGTH_LONG).show();

            }

      }

}

 

Pruebas y resultados

En este caso se hacen dos pruebas de la aplicación, primero, pasamos 56800 dólares americanos a soles, siendo el resultado 156681.6. En el segundo caso, pasamos 38890 soles a euros. Convierta usted 270 dólares americanos a euros. Aquí te mostramos algunas tipos de monedas con las que podría probar en la aplicación móvil, use las letras en mayúsculas antes del símbolo “-”, por ejemplo PEN, EUR, XPT.

XPF-Pacific Franc
PKR-Pakistani Rupee
XPD-Palladium Ounces
PAB-Panama Balboa
PGK-Papua New Guinea Kina
PYG-Paraguayan Guarani
PEN-Peruvian Nuevo Sol
PHP-Philippine Peso
XPT-Platinum Ounces

 

clip_image010[4]clip_image012[4]

martes, 16 de julio de 2013

Aplicación móvil Android para calcular áreas y medir distancias.

imageDescripción de la aplicación

El GPS del celular nos permite capturar las coordenadas geográficas en grados decimales. Con esto podemos hacer muchísimas aplicaciones de múltiples usos orientadas al turismo, industria e ingeniería. Por ejemplo, algo que ayude a medir las distancias entre puntos, calcular áreas, trabajar con altitudes. La funcionalidad del GPS en los smartphones es muy usada hoy en día, para simular la realidad aumentada en aplicaciones móviles. En este proyecto, se desarrolla una aplicación móvil para colectar puntos geográficos en una base de datos SQlite, para el cálculo de las distancias se tiene en cuenta la fórmula de Harveshine. Usamos los semiejes del elipsoide Hayford y las ecuaciones de Coticchia-Surace para convertir los coordenados decimales a UTM, con ello calculamos las áreas dado una serie de puntos capturados por el smartphone.

 

1373995678366

Funcionalidades de la aplicación

· Convierte una coordenada decimal capturada por el GPS del Smartphone a UTM

· Calcula la distancia entre dos puntos capturados por el celular

· Calcula el área dado n puntos (lógicamente, n>=3)

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;

      }

}