在Android中获取经度和纬度的高度

在Android平台上有经度和纬度的高度(高程)吗?

海拔应用程序屏幕http://img509.imageshack.us/img509/4848/elevationc.jpg

我的方法是使用USGS海拔查询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; } 

以及使用示例(在HelloMapView类中):

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

您也可以使用Google Elevation API。 在线文档位于: https : //developers.google.com/maps/documentation/elevation/

请从以上API页面注意以下事项:

使用限制:使用Google地理编码API每天的查询限制为2500个地理位置请求。 (Google Maps API Premier的用户每天最多可以执行100,000个请求)。此限制的执行可防止滥用和/或重新调整地理编码API,并且此限制可能会在未来的情况下进行更改,恕不另行通知。 此外,我们强制执行请求速率限制以防止滥用服务。 如果您超过24小时限制或以其他方式滥用该服务,地理编码API可能暂时停止为您工作。 如果您继续超出此限制,则可能会阻止您访问地理编码API。 请注意:地理编码API只能与Google地图一起使用; 禁止在地图上显示地理编码结果。 有关允许使用的完整详情,请参阅Maps API服务条款许可限制。

上面为Google API更改Max Gontar的代码给出了以下内容,用英尺表示返回的高程:

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

如果你使用的是具有GPS接收器的Android设备,那么有一个方法getAltitude()使用你可以通过海拔获得高度。

首先要从高程区分高度。

高度是从一点到地方表面的距离; 无论是土地还是水。 这个测量主要用于航空。

使用Location.getAltitude()函数可以获得高度。

海拔是从当地表面到海平面的距离; 更经常使用,并经常被错误地称为高度。

就这样说,对美国来说,USGS提供了一个更新的HTTP POST和GET查询 ,可以返回XML或JSON值来以英尺或米为单位来提升。 对于全球范围的高程,您可以使用Google Elevation API 。

谷歌地图有高度,你需要的是这个代码

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

试试这个我build立的: https ://algorithmia.com/algorithms/Gaploid/Elevation

这里是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()); 

使用Google Elevation API的想法很好,但是使用string函数parsingXML不是。 此外,HttpClient现在已被弃用,因为使用不安全的连接。

在这里看到更好的解决scheme: https : //github.com/M66B/BackPackTrackII/blob/master/app/src/main/java/eu/faircode/backpacktrack2/GoogleElevationApi.java