2010-01-03 28 views

Trả lời

37

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

Biện pháp của tôi là sử dụng 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; 
} 

Và ví dụ về sử dụng (ngay trong HelloMapView lớp):

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

Vì phần nào GIS quan tâm tôi thấy điều này rất thú vị – JaanusSiim

+5

Để khuếch đại về điều này: lý do bạn cần làm như vậy (sử dụng dịch vụ trên mạng) là gấp đôi: một, GPS không tốt ở độ cao, lỗi dọc là khoảng 150 ft ở lần, và hai, bất kỳ độ phân giải cao độ phân giải cao hợp lý thế giới là rất lớn, quá lớn để cài đặt trên điện thoại. Nếu bạn đang thực hiện việc này trên máy chủ của riêng mình như một phần của ứng dụng web hoặc GIS, bạn có thể tải xuống mô hình độ cao (từ NASA) và truy vấn trực tiếp; nhanh hơn, nhưng sử dụng rất nhiều dung lượng lưu trữ. –

+0

Andrew cảm ơn bạn đã phản hồi, thật tuyệt vời! –

21

Bạn cũng có thể sử dụng API của Google độ cao. Các tài liệu trực tuyến cho nó nằm tại địa chỉ: https://developers.google.com/maps/documentation/elevation/

Xin lưu ý những điều sau đây từ trang API trên:

Hạn sử dụng: Sử dụng Geocoding API Google là đối tượng của một giới hạn truy vấn 2.500 yêu cầu vị trí địa lý mỗi ngày. (Người dùng API Google Maps Premier có thể thực hiện tối đa 100.000 yêu cầu mỗi ngày.) Giới hạn này là được thực thi để ngăn lạm dụng và/hoặc điều chỉnh lại API mã hóa địa lý và giới hạn này có thể thay đổi trong tương lai mà không cần thông báo . Ngoài ra, , chúng tôi thực thi giới hạn tốc độ yêu cầu là ngăn việc lạm dụng dịch vụ. Nếu bạn vượt quá giới hạn 24 giờ hoặc nếu không lạm dụng dịch vụ, API mã hóa địa lý có thể tạm thời ngừng hoạt động cho bạn. Nếu bạn tiếp tục vượt quá giới hạn này, quyền truy cập của bạn vào API mã hóa địa lý có thể bị chặn . Lưu ý: API mã hóa địa lý chỉ có thể được sử dụng cùng với một bản đồ của Google ; kết quả mã hóa địa lý mà không cần hiển thị chúng trên bản đồ là bị cấm. Để biết chi tiết đầy đủ về số cho phép sử dụng, hãy tham khảo Hạn chế về giấy phép API Điều khoản dịch vụ.

Thay đổi Max Gontar's mã trên cho API Google cung cấp cho những điều sau đây, với độ cao quay trở lại được đưa ra trong chân:

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

Nếu u đang sử dụng thiết bị Android trong đó có GPS Recever sau đó là một phương pháp getAltitude() bằng cách sử dụng u đó có thể nhận được độ cao theo độ cao.

+1

Loại đối tượng nào được gán cho phương thức đó. Bạn không thể cho mọi người nửa bánh. –

+0

Đối tượng vị trí, khi sử dụng API vị trí hợp nhất của Dịch vụ của Play API –

0

Google có độ cao, những gì bạn cần là mã này

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

Bản đồ của Google có độ cao, những gì bạn cần là đặt mã này –

0

Hãy thử một trong này mà I`v xây dựng: https://algorithmia.com/algorithms/Gaploid/Elevation

đây là ví dụ cho 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

Điều quan trọng là phải phân biệt độ cao đầu tiên với độ cao.

Độ cao là khoảng cách từ điểm xuống bề mặt cục bộ; cho dù đó là đất hay nước. Đo lường này chủ yếu được sử dụng cho hàng không.

Độ cao có thể đạt được bằng cách sử dụng chức năng Location.getAltitude().

Độ cao là khoảng cách từ bề mặt địa phương đến mực nước biển; thường được sử dụng nhiều hơn, và thường được gọi nhầm là độ cao.

Với điều đó đã nói, đối với Hoa Kỳ, USGS đã cung cấp newer HTTP POST and GET queries có thể trả về giá trị XML hoặc JSON cho độ cao bằng một trong hai mét hoặc mét. Đối với độ cao trên toàn thế giới, bạn có thể sử dụng Google Elevation API.

Các vấn đề liên quan