2010-01-03 18 views

risposta

37

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

Il mio approccio è quello di utilizzare 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; 
} 

E esempio di utilizzo (a destra nella 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; 
      } 
     }); 
    } 
+0

Come GIS interessato trovo questo molto interessante – JaanusSiim

+5

Per amplificare su questo: il motivo per cui è necessario fare qualcosa del genere (usare un servizio in rete) è duplice: uno, il GPS non è molto bravo in altitudine, gli errori verticali sono di circa 150 piedi, a volte, e due, qualsiasi modello di elevazione mondiale ad alta risoluzione è enorme, troppo grande per essere installato sul telefono. Se lo facevi sul tuo server come parte di un'app Web o GIS, puoi invece scaricare il modello di elevazione (dalla NASA) e interrogarlo direttamente; più veloce, ma utilizza molta memoria. –

+0

Andrew grazie per il tuo feedback, è fantastico! –

21

È inoltre possibile utilizzare l'API di Google Elevation. La documentazione in linea per questo si trova in: https://developers.google.com/maps/documentation/elevation/

Si prega di notare quanto segue dalla pagina di API di cui sopra:

Limiti di utilizzo: l'uso di Google Geocoding API è soggetto a un limite di query di 2.500 richieste di geolocalizzazione al giorno. (Utente di Google Maps API Premier può eseguire fino a 100.000 richieste al giorno). Questo limite è forzata per prevenire gli abusi e/o riutilizzo delle API Geocoding, e tale limite può essere cambiato nel futuro senza preavviso . Inoltre, applichiamo un limite di velocità di richiesta a per prevenire l'abuso del servizio. Se superi il limite di 24 ore o altrimenti il ​​numero abusa del servizio, l'API di geocoding potrebbe smettere di funzionare temporaneamente. Se si continua a superare questo limite, l'accesso all'API di geocoding può essere bloccato . Nota: l'API Geocoding può essere utilizzata solo in combinazione con una mappa Google ; i risultati di geocodifica senza visualizzati su una mappa sono proibiti . Per i dettagli completi sull'uso consentito di , consultare le limitazioni delle licenze dei Termini di servizio dell'API di Google Maps .

Alterare Max Gontar's codice di cui sopra per l'API di Google ha pronunciato la seguente, con l'elevazione tornato data in piedi:

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

Se u si utilizza dispositivo Android che ha GPS recever poi c'è un metodo getAltitude() utilizzando che è possibile ottenere l'altitudine per elevazione.

+1

A quale tipo di oggetto è assegnato quel metodo. Non puoi semplicemente dare alla gente metà della torta. –

+0

Oggetto posizione, quando si utilizza l'API di posizione fusa di Play Services –

0

Google hanno l'altitudine, che cosa avete bisogno è questo codice

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

Le mappe di Google hanno l'altitudine, ciò di cui si ha bisogno è inserire questo codice –

0

Provate questo che I`v ​​costruzione: https://algorithmia.com/algorithms/Gaploid/Elevation

ecco l'esempio per 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

È importante innanzitutto distinguere l'altitudine dall'elevazione.

L'altitudine è la distanza da un punto in giù alla superficie locale; che si tratti di terra o acqua. Questa misura è utilizzata principalmente per l'aviazione.

L'altitudine può essere ottenuta utilizzando la funzione Location.getAltitude().

L'altezza è la distanza dalla superficie locale al livello del mare; molto più spesso usato, e spesso erroneamente definito altitudine.

Detto ciò, per gli Stati Uniti, USGS ha fornito un valore newer HTTP POST and GET queries che può restituire valori XML o JSON per l'elevazione in piedi o metri. Per l'elevazione mondiale, è possibile utilizzare lo Google Elevation API.

Problemi correlati