Obtenir l'altitude par la longitude et la latitude dans Android
Existe-t-il un moyen rapide et efficace d'obtenir l'altitude (altitude) par la longitude et la latitude sur la plateforme Android?
7 réponses
écran de l'application d'élévation http://img509.imageshack.us/img509/4848/elevationc.jpg
Mon approche est d'utiliser des USGS Élévation de la Requête de Service 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 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;
}
});
}
vous pouvez également utiliser L'API Google Elevation. La documentation en ligne est disponible à l'adresse suivante:: https://developers.google.com/maps/documentation/elevation /
veuillez noter ce qui suit de la page API ci-dessus:
limites D'Utilisation: Utilisation de Google L'API Geocoding est sujette à une requête limite de 2 500 demandes de géolocalisation par jour. (Utilisateur de L'API GoogleMaps Le Premier ministre peut exécuter jusqu'à 100 000 demandes par jour.) Cette limite est appliquées afin de prévenir les abus et/ou la réutilisation de L'API de géocodage, et cette limite peut être modifiée dans le avenir sans préavis. Outre, nous appliquons un taux de demande de limite prévenir l'abus du service. Si vous dépasser la limite de 24 heures ou autrement abusez du service, L'API de géocodage peut arrêter de travailler temporairement. Si vous continuez à dépasser cette limite, votre accès à L'API de géocodage peut être bloqué. Note: L'API Geocoding ne peut être utilisé en conjonction avec un Google map; résultats de géocodage sans de les afficher sur une carte interdit. Pour plus d'informations sur utilisation autorisée, consultez L'API Maps Conditions de service Restrictions de licence.
modifiant le code de Max Gontar ci-dessus pour L'API Google donne ce qui suit, avec l'élévation retourné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;
}
il est important de distinguer l'altitude de l'altitude.
L'Altitude est la distance entre un point et la surface locale, qu'il s'agisse de la terre ou de l'eau. Cette mesure est principalement utilisée pour l'aviation.
L'Altitudepeut être obtenue en utilisant l'emplacement .fonction getAltitude () .
Élévation est la distance de la surface au niveau de la mer; beaucoup plus souvent utilisé, et souvent souvent appelé à tort d'altitude.
cela dit, pour les États-Unis, USGS a fourni un POST HTTP Plus récent et obtenir des requêtes qui peuvent retourner des valeurs XML ou JSON pour l'élévation en pieds ou en mètres. Pour une élévation mondiale, vous pouvez utiliser L'API Google Elevation API .
Google maps ont l'altitude, ce que 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;
}
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());
l'idée d'utiliser L'API Google Elevation est bonne, mais l'analyse XML en utilisant des fonctions de chaîne de caractères ne l'est pas. De plus, HttpClient est déprécié maintenant, car il utilise des connexions non sécurisées.
Voir ici pour une meilleure solution: https://github.com/M66B/BackPackTrackII/blob/master/app/src/main/java/eu/faircode/backpacktrack2/GoogleElevationApi.java