Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Obtener altitud por longitud y latitud en Android

¿Existe una manera rápida y eficiente de obtener la altitud (elevación) por longitud y latitud en la plataforma Android?

7 Solutions collect form web for “Obtener altitud por longitud y latitud en Android”

Pantalla de la aplicación de elevación http://img509.imageshack.us/img509/4848/elevationc.jpg

Mi enfoque es utilizar USGS Elevation Query Web Service :

private double getAltitude(Double longitude, Double latitude) { double result = Double.NaN; HttpClient httpClient = new DefaultHttpClient(); HttpContext localContext = new BasicHttpContext(); String url = "http://gisdata.usgs.gov/" + "xmlwebservices2/elevation_service.asmx/" + "getElevation?X_Value=" + String.valueOf(longitude) + "&Y_Value=" + String.valueOf(latitude) + "&Elevation_Units=METERS&Source_Layer=-1&Elevation_Only=true"; HttpGet httpGet = new HttpGet(url); try { HttpResponse response = httpClient.execute(httpGet, localContext); HttpEntity entity = response.getEntity(); if (entity != null) { InputStream instream = entity.getContent(); int r = -1; StringBuffer respStr = new StringBuffer(); while ((r = instream.read()) != -1) respStr.append((char) r); String tagOpen = "<double>"; String tagClose = "</double>"; if (respStr.indexOf(tagOpen) != -1) { int start = respStr.indexOf(tagOpen) + tagOpen.length(); int end = respStr.indexOf(tagClose); String value = respStr.substring(start, end); result = Double.parseDouble(value); } instream.close(); } } catch (ClientProtocolException e) {} catch (IOException e) {} return result; } 

Y ejemplo de uso (a la derecha en la clase HelloMapView ):

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); linearLayout = (LinearLayout) findViewById(R.id.zoomview); mapView = (MapView) findViewById(R.id.mapview); mZoom = (ZoomControls) mapView.getZoomControls(); linearLayout.addView(mZoom); mapView.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == 1) { final GeoPoint p = mapView.getProjection().fromPixels( (int) event.getX(), (int) event.getY()); final StringBuilder msg = new StringBuilder(); new Thread(new Runnable() { public void run() { final double lon = p.getLongitudeE6() / 1E6; final double lat = p.getLatitudeE6() / 1E6; final double alt = getAltitude(lon, lat); msg.append("Lon: "); msg.append(lon); msg.append(" Lat: "); msg.append(lat); msg.append(" Alt: "); msg.append(alt); } }).run(); Toast.makeText(getBaseContext(), msg, Toast.LENGTH_SHORT) .show(); } return false; } }); } 

También puede usar la API de Google Elevation. La documentación en línea de la misma se encuentra en: https://developers.google.com/maps/documentation/elevation/

Tenga en cuenta lo siguiente en la página API anterior:

Límites de uso: el uso de Google Geocoding API está sujeto a un límite de consultas de 2.500 solicitudes de geolocalización por día. (El usuario de la API de Google Maps Premier puede realizar hasta 100.000 solicitudes por día). Este límite se aplica para evitar el abuso y / o la reutilización de la API de Geocoding y este límite se puede cambiar en el futuro sin previo aviso. Además, imponemos un límite de tasa de solicitud para evitar el abuso del servicio. Si excede el límite de 24 horas o si de otro modo abusa del servicio, el API de Geocodificación puede dejar de funcionar para usted temporalmente. Si continúa excediendo este límite, puede bloquear su acceso a la API de Geocoding. Nota: el API de Geocodificación sólo puede utilizarse conjuntamente con un mapa de Google; Los resultados de geocodificación sin mostrarlos en un mapa están prohibidos. Para obtener detalles completos sobre el uso permitido, consulte las Restricciones de licencia de los términos de servicio de API de Google Maps.

Al modificar el código de Max Gontar arriba para la API de Google se obtiene lo siguiente, con la elevación devuelta dada en pies:

 private double getElevationFromGoogleMaps(double longitude, double latitude) { double result = Double.NaN; HttpClient httpClient = new DefaultHttpClient(); HttpContext localContext = new BasicHttpContext(); String url = "http://maps.googleapis.com/maps/api/elevation/" + "xml?locations=" + String.valueOf(latitude) + "," + String.valueOf(longitude) + "&sensor=true"; HttpGet httpGet = new HttpGet(url); try { HttpResponse response = httpClient.execute(httpGet, localContext); HttpEntity entity = response.getEntity(); if (entity != null) { InputStream instream = entity.getContent(); int r = -1; StringBuffer respStr = new StringBuffer(); while ((r = instream.read()) != -1) respStr.append((char) r); String tagOpen = "<elevation>"; String tagClose = "</elevation>"; if (respStr.indexOf(tagOpen) != -1) { int start = respStr.indexOf(tagOpen) + tagOpen.length(); int end = respStr.indexOf(tagClose); String value = respStr.substring(start, end); result = (double)(Double.parseDouble(value)*3.2808399); // convert from meters to feet } instream.close(); } } catch (ClientProtocolException e) {} catch (IOException e) {} return result; } 

Si u está usando el dispositivo android que tiene GPS Recever entonces hay un método getAltitude () mediante el uso de que u puede obtener la altitud por elevación.

Es importante diferenciar primero la altitud de la elevación.

Altitud es la distancia desde un punto hasta la superficie local; Ya sea tierra o agua. Esta medida se utiliza principalmente para la aviación.

Altitud se puede obtener mediante la función Location.getAltitude () .

La elevación es la distancia desde la superficie local hasta el nivel del mar; Mucho más a menudo usado, ya menudo erróneamente referido como la altitud.

Dicho esto, para los EE.UU., USGS ha proporcionado una más reciente HTTP POST y GET consultas que pueden devolver valores XML o JSON para la elevación en pies o metros. Para una elevación mundial, puede utilizar la API de elevación de Google .

Los mapas de Google tienen la altitud, lo que necesitas es este código

 altitude=""; var init = function() { var elevator = new google.maps.ElevationService; map.on('mousemove', function(event) { getLocationElevation(event.latlng, elevator); document.getElementsByClassName("altitudeClass")[0].innerHTML = "Altitude: "+ getAltitude(); //console.debug(getAltitude()); }); } var getLocationElevation = function (location, elevator){ // Initiate the location request elevator.getElevationForLocations({ 'locations': [location] }, function(results, status) { if (status === google.maps.ElevationStatus.OK) { // Retrieve the first result if (results[0]) { // Open the infowindow indicating the elevation at the clicked position. setAltitude(parseFloat(results[0].elevation).toFixed(2)); } else { setAltitude('No results found'); } } else { setAltitude('Elevation service failed due to: ' + status); } }); } function setAltitude(a){ altitude = a; } function getAltitude(){ return altitude; } 

Pruebe este que he construido: https://algorithmia.com/algorithms/Gaploid/Elevation

Aquí es un ejemplo para Java:

 import com.algorithmia.*; import com.algorithmia.algo.*; String input = "{\"lat\": \"50.2111\", \"lon\": \"18.1233\"}"; AlgorithmiaClient client = Algorithmia.client("YOUR_API_KEY"); Algorithm algo = client.algo("algo://Gaploid/Elevation/0.3.0"); AlgoResponse result = algo.pipeJson(input); System.out.println(result.asJson()); 

La idea de utilizar la API de elevación de Google es buena, pero el análisis de XML utilizando funciones de cadena no lo es. Además, HttpClient está obsoleto ahora, como el uso de conexiones inseguras.

Vea aquí una solución mejor: https://github.com/M66B/BackPackTrackII/blob/master/app/src/main/java/eu/faircode/backpacktrack2/GoogleElevationApi.java

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.