Có cách nào nhanh chóng và hiệu quả để đạt được độ cao (độ cao) theo kinh độ và vĩ độ trên nền tảng Android không?Nhận độ cao theo kinh độ và vĩ độ trong Android
Trả lời
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;
}
});
}
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;
}
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.
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. –
Đố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 –
Ý tưởng sử dụng API nâng cao của Google là tốt, nhưng phân tích cú pháp XML bằng các hàm chuỗi không phải là. Ngoài ra, HttpClient không còn được dùng nữa, như sử dụng các kết nối không an toàn.
Xem ở đây cho một giải pháp tốt hơn: bản đồ https://github.com/M66B/BackPackTrackII/blob/master/app/src/main/java/eu/faircode/backpacktrack2/GoogleElevationApi.java
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;
}
Bản đồ của Google có độ cao, những gì bạn cần là đặt mã này –
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());
Đ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.
- 1. Vĩ độ/Kinh độ và mét
- 2. MKMapView Vĩ độ và Kinh độ Tọa độ
- 3. tìm kiếm bán kính theo vĩ độ/kinh độ
- 4. tăng hình học + WGS84, vĩ độ và kinh độ, nhưng không phải độ cao?
- 5. Truy vấn trong kinh độ và vĩ độ trong MySQL
- 6. Nhận Kinh độ Vĩ độ từ một địa chỉ C#
- 7. Truy vấn kinh độ vĩ độ PostgreSQL
- 8. Tìm kinh độ và vĩ độ gần nhất trong mảng?
- 9. Vĩ độ và Kinh độ dựa trên Mã Zip
- 10. KDTree cho kinh độ/vĩ độ
- 11. Vĩ độ/Kinh độ Khoảng cách
- 12. Hướng đông về kinh độ vĩ độ
- 13. Có thể thay đổi kinh độ và vĩ độ không?
- 14. điểm giữa giữa hai vĩ độ và kinh độ
- 15. Thiết lập bảng vĩ độ và kinh độ của MySQL
- 16. Phân tích vĩ độ và kinh độ với Ruby
- 17. Loại dữ liệu nào cho vĩ độ và kinh độ?
- 18. Chuyển đổi vĩ độ và kinh độ thành UTM
- 19. có Múi giờ sử dụng vĩ độ và kinh độ?
- 20. Cách xác thực vĩ độ và kinh độ
- 21. Vĩ độ và kinh độ có thể tìm mã zip?
- 22. Tìm các vĩ độ và kinh độ gần nhất
- 23. String để CLLocation vĩ độ và kinh độ
- 24. tìm vĩ độ và kinh độ bằng khoảng cách
- 25. Vĩ độ kinh độ ở định dạng sai DDDMM.MMMM 2832.3396N
- 26. nhận vĩ độ & kinh độ theo địa chỉ được cung cấp cho tờ rơi
- 27. Tìm tập vĩ độ và kinh độ sử dụng vĩ độ, kinh độ và hướng hiện tại của người dùng đang xem một đối tượng
- 28. Tạo đối tượng Vị trí trong Android với các giá trị vĩ độ và kinh độ
- 29. Hướng giữa 2 điểm Vĩ độ/Kinh độ trong C#
- 30. Bản đồ nhiệt từ vĩ độ & kinh độ
Vì phần nào GIS quan tâm tôi thấy điều này rất thú vị – JaanusSiim
Để 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ữ. –
Andrew cảm ơn bạn đã phản hồi, thật tuyệt vời! –