Obtenir l'altitude par la longitude et la latitude dans Android

Existe-t-il un moyen rapide et efficace d'obtenir l'altitude (altitude) par la longitude et la latitude sur la plateforme Android?

35
demandé sur approxiblue 2010-01-03 22:30:26

7 réponses

écran de l'application d'élévation http://img509.imageshack.us/img509/4848/elevationc.jpg

Mon approche est d'utiliser des USGS Élévation de la Requête de Service Web :

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

et exemple d'utilisation (à droite dans HelloMapView classe):

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;
            }
        });
    }
37
répondu Maksym Gontar 2010-01-03 19:30:40

vous pouvez également utiliser L'API Google Elevation. La documentation en ligne est disponible à l'adresse suivante:: https://developers.google.com/maps/documentation/elevation /

veuillez noter ce qui suit de la page API ci-dessus:

limites D'Utilisation: Utilisation de Google L'API Geocoding est sujette à une requête limite de 2 500 demandes de géolocalisation par jour. (Utilisateur de L'API GoogleMaps Le Premier ministre peut exécuter jusqu'à 100 000 demandes par jour.) Cette limite est appliquées afin de prévenir les abus et/ou la réutilisation de L'API de géocodage, et cette limite peut être modifiée dans le avenir sans préavis. Outre, nous appliquons un taux de demande de limite prévenir l'abus du service. Si vous dépasser la limite de 24 heures ou autrement abusez du service, L'API de géocodage peut arrêter de travailler temporairement. Si vous continuez à dépasser cette limite, votre accès à L'API de géocodage peut être bloqué. Note: L'API Geocoding ne peut être utilisé en conjonction avec un Google map; résultats de géocodage sans de les afficher sur une carte interdit. Pour plus d'informations sur utilisation autorisée, consultez L'API Maps Conditions de service Restrictions de licence.

modifiant le code de Max Gontar ci-dessus pour L'API Google donne ce qui suit, avec l'élévation retournée indiquée en pieds:

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;
    }
23
répondu dhael 2017-05-23 12:25:13

si vous utilisez un appareil android qui a un GPS Recever, alors il y a une méthode getAltitude () en utilisant que vous pouvez obtenir l'altitude par élévation.

2
répondu 2012-11-12 04:38:43

il est important de distinguer l'altitude de l'altitude.

L'Altitude est la distance entre un point et la surface locale, qu'il s'agisse de la terre ou de l'eau. Cette mesure est principalement utilisée pour l'aviation.

L'Altitude

peut être obtenue en utilisant l'emplacement .fonction getAltitude () .

Élévation est la distance de la surface au niveau de la mer; beaucoup plus souvent utilisé, et souvent souvent appelé à tort d'altitude.

cela dit, pour les États-Unis, USGS a fourni un POST HTTP Plus récent et obtenir des requêtes qui peuvent retourner des valeurs XML ou JSON pour l'élévation en pieds ou en mètres. Pour une élévation mondiale, vous pouvez utiliser L'API Google Elevation API .

2
répondu Always Lucky 2017-06-07 21:38:55

Google maps ont l'altitude, ce que vous avez besoin est ce code

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;
}
0
répondu Frank Muñoz 2015-12-09 16:01:34

essayez celui que j'ai construit: https://algorithmia.com/algorithms/Gaploid/Elevation

voici un exemple pour 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());
0
répondu Gaploid 2016-07-30 12:36:15

l'idée d'utiliser L'API Google Elevation est bonne, mais l'analyse XML en utilisant des fonctions de chaîne de caractères ne l'est pas. De plus, HttpClient est déprécié maintenant, car il utilise des connexions non sécurisées.

Voir ici pour une meilleure solution: https://github.com/M66B/BackPackTrackII/blob/master/app/src/main/java/eu/faircode/backpacktrack2/GoogleElevationApi.java

-2
répondu M66B 2015-06-20 08:46:46