web-dev-qa-db-fra.com

Obtenir l'altitude par longitude et latitude sous Android

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

36
Maksym Gontar

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

Mon approche consiste à utiliser service Web USGS Elevation Query 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 la classe 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;
            }
        });
    }
39
Maksym Gontar

Vous pouvez également utiliser l'API Google Elevation. La documentation en ligne correspondante se trouve à l'adresse suivante: https://developers.google.com/maps/documentation/elevation/

Veuillez noter les éléments suivants de la page API ci-dessus:

Limites d'utilisation: utilisation de Google L'API de géocodage est soumise à une requête limite de 2 500 demandes de géolocalisation par jour. (L'utilisateur de l'API Google Maps Premier peut effectuer jusqu'à 100 000 demandes Par jour.) Cette limite est fixée à appliquées pour prévenir les abus et/ou réaffectation de l'API de géocodage, et cette limite peut être changée dans le avenir sans préavis. Aditionellement, nous appliquons une limite de taux de demande à éviter les abus du service. Si vous dépasser la limite de 24 heures ou autrement abuser du service, l'API de géocodage peut cesser de travailler pour vous temporairement . Si vous continuez à dépasser cette limite, votre accès à l'API de géocodage peut être être bloqué. Remarque: l'API de géocodage ne peut être utilisé qu’avec un Google Map; résultats de géocodage sans les afficher sur une carte est interdit. Pour des détails complets sur utilisation autorisée, consultez l'API Maps Conditions d'utilisation Limites de licence.

La modification du code de Max Gontar ci-dessus pour l'API Google donne les informations suivantes, avec l'altitude renvoyé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
dhael

Il est important de différencier d'abord l'altitude de l'altitude.

L’altitude est la distance entre un point et la surface locale; que ce soit la terre ou l'eau. Cette mesure est principalement utilisée pour l'aviation.

L’altitude peut être obtenue en utilisant la fonction Location.getAltitude () .

L'élévation est la distance entre la surface locale et le niveau de la mer; beaucoup plus souvent utilisé, et souvent appelé à tort altitude.

Cela dit, pour les États-Unis, USGS a fourni une nouvelle requête HTTP POST et GET qui peut renvoyer des valeurs XML ou JSON pour une élévation en pieds ou en mètres. Pour l’élévation mondiale, vous pouvez utiliser l’API Google Elevation API .

3
Always Lucky

Si vous utilisez un appareil Android doté d'un récepteur GPS, il existe une méthode getAltitude () en utilisant cette méthode, vous pouvez obtenir l'altitude par élévation.

1
user1703603

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
Gaploid

Les cartes Google ont l'altitude, ce dont 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
Frank Muñoz