2010-01-03 16 views

Antwort

37

elevation app screen http://img509.imageshack.us/img509/4848/elevationc.jpg

Mein Ansatz ist USGS Elevation Query Web Service zu verwenden:

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 Anwendungsbeispiel (rechts in HelloMapView Klasse):

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; 
      } 
     }); 
    } 
+0

Als etwas GIS interessiert finde ich das sehr interessant – JaanusSiim

+5

Um dies zu verstärken: der Grund, warum Sie so etwas tun müssen (verwenden Sie einen Dienst im Netzwerk) ist zweifach: Erstens, das GPS ist nicht sehr gut in der Höhe, vertikale Fehler sind manchmal ungefähr 150 Fuß, und zwei, irgendein angemessenes hochauflösendes Welthöhenmodell ist enorm, viel zu groß, um auf dem Telefon zu installieren. Wenn Sie dies auf Ihrem eigenen Server als Teil einer Web-App oder eines GIS tun, können Sie stattdessen das Höhenmodell (von der NASA) herunterladen und direkt abfragen. schneller, benötigt aber viel Speicherplatz. –

+0

Andrew danke für dein Feedback, es ist großartig! –

21

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

Bitte beachten Sie folgendes aus der obigen API Seite:

Nutzungsbegrenzung: Die Verwendung des Google Geocoding API unterliegt eine Abfrage Grenze von 2.500 Geolocation-Anfragen pro Tag. (Benutzer von Google Maps API Premier pro Tag auf 100.000 Anfragen ausführen kann bis.) Diese Grenze ist Missbrauch zu verhindern durchgesetzt und/oder Umwidmung des Geocoding API und diese Grenze in der Zukunft ohne vorherige Ankündigung geändert werden kann, . Darüber hinaus erzwingen wir ein Anforderungsratenlimit auf Missbrauch des Dienstes zu verhindern. Wenn Sie die 24-Stunden-Grenze überschreiten oder andernfalls den Dienst missbrauchen, funktioniert die Geocoding API möglicherweise vorübergehend nicht mehr für Sie. Wenn Sie dieses Limit weiterhin überschreiten, kann Ihr Zugriff auf die Geocodierungs-API blockiert werden. Hinweis: Die Geocodierungs-API darf nur in Verbindung mit einer Google-Karte verwendet werden. Geocoding Ergebnisse ohne Anzeige auf einer Karte ist verboten. Umfassende Informationen zu erlaubter Nutzung finden Sie in der Google Maps API Nutzungsbedingungen für Lizenzeinschränkungen.

Max Gontar's Code oben für die Google API Ändern gibt die folgende, mit den zurückgegebenen Erhebung in den Füßen gegeben:

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

Wenn u Android-Gerät verwenden, die GPS recever hat dann gibt es ein Verfahren getAltitude() mit dem Sie die Höhe durch die Höhe erhalten können.

+1

Welchem ​​Objekttyp ist diese Methode zugewiesen? Du kannst den Leuten nicht einfach die Hälfte des Kuchens geben. –

+0

Location-Objekt, wenn Sie die fusionierte Standort-API von Play Services verwenden –

0

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

Google Maps haben die Höhe, was Sie brauchen, ist diesen Code –

0

versuchen diese, die I`v ​​gebaut: https://algorithmia.com/algorithms/Gaploid/Elevation

Hier 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()); 
1

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; ob das Land oder Wasser sei. 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 diesem gesagt, für die USA hat USGS eine newer HTTP POST and GET queries zur Verfügung gestellt, die XML oder JSON-Werte für die Höhe in Fuß oder Meter zurückgeben kann. Für eine weltweite Erhöhung könnten Sie die Google Elevation API verwenden.

Verwandte Themen