it-swarm.com.de

Holen Sie sich die Höhe nach Längen- und Breitengraden in Android

Gibt es eine schnelle und effiziente Möglichkeit, Höhe (Höhe) nach Länge und Breite auf der Android-Plattform zu ermitteln?

36
Maksym Gontar

Bildschirm für die Elevationsansicht http://img509.imageshack.us/img509/4848/elevationc.jpg

Mein Ansatz ist die Verwendung von 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;
}

Und ein Anwendungsbeispiel (rechts in HelloMapView class): 

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

Sie können auch die Google Elevation-API verwenden. Die Online-Dokumentation dazu finden Sie unter: https://developers.google.com/maps/documentation/elevation/

Bitte beachten Sie folgendes von der obigen API-Seite:

Nutzungsgrenzen: Verwendung von Google Geocoding-API unterliegt einer Abfrage Limit von 2.500 Geolocation-Anfragen pro Tag. (Nutzer der Google Maps-API Premier können pro Tag bis zu 100.000 -Anfragen durchführen.) Dieses Limit ist erzwungen, um Missbrauch und/oder .__ zu verhindern. Wiederverwendung der Geocoding-API und Dieses Limit kann in .__ geändert werden. Zukunft ohne Vorankündigung. Zusätzlich, wir setzen eine Anforderungsratenbegrenzung auf Missbrauch des Dienstes verhindern. Wenn du Überschreiten der 24-Stunden-Grenze oder anderweitig Missbrauchen Sie den Dienst, die Geokodierungs-API kann vorübergehend nicht mehr für Sie arbeiten . Wenn Sie dieses Limit weiterhin überschreiten, wird Ihr Zugriff auf die Geocoding-API kann blockiert werden. Hinweis: Die Geokodierungs-API darf nur in Verbindung mit einem .__ verwendet werden. Google Karte; Geocodierungsergebnisse ohne Sie werden auf einer Karte angezeigt verboten. Für vollständige Details zu zulässige Verwendung finden Sie in der Google Maps API. Bedingungen für Servicelizenzbeschränkungen.

Wenn Sie den Max Gontar's - Code oben für die Google-API ändern, erhalten Sie Folgendes, wobei die zurückgegebene Höhe in Fuß angegeben wird:

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

Es ist wichtig, zuerst die Höhe von der Höhe zu unterscheiden.

Höhe ist die Entfernung von einem Punkt zur lokalen Oberfläche; Sei es Land oder Wasser. Diese Messung wird hauptsächlich für die Luftfahrt verwendet.

Die Höhe kann mit der Funktion Location.getAltitude () ermittelt werden.

Höhe ist die Entfernung von der lokalen Oberfläche zum Meeresspiegel; viel häufiger verwendet und oft fälschlicherweise als Höhe bezeichnet.

Mit diesen Angaben hat USGS für die USA ein neueres HTTP POST und GET-Abfragen bereitgestellt, die XML- oder JSON-Werte für die Höhe in Fuß oder Metern zurückgeben können. Für eine weltweite Erhöhung können Sie die Google Elevation API verwenden.

3
Always Lucky

Wenn Sie ein Android-Gerät mit GPS-Empfänger verwenden, gibt es eine Methode getAltitude () . Dadurch können Sie die Höhe anhand der Höhe ermitteln.

1
user1703603

Versuchen Sie es mit diesem, den ich gebaut habe: https://algorithmia.com/algorithms/Gaploid/Elevation

hier ist ein Beispiel für 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

Google Maps haben die Höhe, was Sie brauchen, ist dieser 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