Esiste un modo rapido ed efficiente per ottenere l'altitudine (elevazione) in base alla longitudine e alla latitudine sulla piattaforma Android?Ottieni l'altitudine per longitudine e latitudine in Android
risposta
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;
}
});
}
È 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;
}
Se u si utilizza dispositivo Android che ha GPS recever poi c'è un metodo getAltitude() utilizzando che è possibile ottenere l'altitudine per elevazione.
A quale tipo di oggetto è assegnato quel metodo. Non puoi semplicemente dare alla gente metà della torta. –
Oggetto posizione, quando si utilizza l'API di posizione fusa di Play Services –
L'idea di utilizzare l'API di Google Elevation è buona, ma l'analisi dell'XML mediante le funzioni stringa non lo è. Inoltre, HttpClient è ora deprecato poiché utilizza connessioni non sicure.
Vedi qui per una soluzione migliore: mappe https://github.com/M66B/BackPackTrackII/blob/master/app/src/main/java/eu/faircode/backpacktrack2/GoogleElevationApi.java
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;
}
Le mappe di Google hanno l'altitudine, ciò di cui si ha bisogno è inserire questo codice –
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());
È 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.
- 1. Ottenere latitudine e longitudine dall'indirizzo in android
- 2. Latitudine/Longitudine e metri
- 3. Ottieni latitudine longitudine da un indirizzo C#
- 4. per latitudine/longitudine
- 5. Ottieni il fuso orario PHP tra Latitudine e Longitudine?
- 6. Ottieni latitudine e longitudine automaticamente usando php, API
- 7. Ottieni latitudine e longitudine dal nome dell'indirizzo specificato. NON Geocoder
- 8. Ottieni latitudine e longitudine sull'evento click dalla mappa di Google
- 9. Ottenere latitudine e longitudine da oggetto LatLng in Android
- 10. Come ottenere Latitudine e Longitudine del dispositivo mobile in Android?
- 11. Widget latitudine/longitudine per pointfield?
- 12. ottenere latitudine e longitudine utilizzando codice postale
- 13. Ottieni risultati da mysql in base alla latitudine longitudine
- 14. Ottieni direzione (bussola) con due punti di latitudine/longitudine
- 15. trasformano longitudine latitudine in metri
- 16. Android ottenere latitudine e longitudine restituisce sempre 0.0
- 17. C# - Ottieni paese da latitudine/longitudine senza API
- 18. Latitudine e longitudine basate sul codice postale
- 19. Impostazione tabella latitudine e longitudine di MySQL
- 20. Ottenere longitudine e latitudine simili dal database
- 21. Stringa a latitudine e longitudine CL
- 22. MKCoordinateSpanMake: perché specificare longitudine e latitudine delta?
- 23. ritrovamento latitudine e longitudine utilizzando la distanza
- 24. Città per posizione GPS Latitudine/Longitudine
- 25. API GoogleMaps -indirizzo per coordinate (latitudine, longitudine)
- 26. Nord est verso latitudine longitudine
- 27. ottenere latitudine e longitudine come indicato per l'opuscolo
- 28. Come convertire latitudine o longitudine in metri?
- 29. Quale tipo di dati per latitudine e longitudine?
- 30. Converti latitudine/longitudine in gradi/radianti?
Come GIS interessato trovo questo molto interessante – JaanusSiim
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. –
Andrew grazie per il tuo feedback, è fantastico! –