我手里拿着服务器中几个地方的纬度和经度值。这些纬度和经度值从服务器发送并在android移动设备上成功接收。现在我需要获取我的Android手机的当前位置并计算到我当前位置的最近位置并在谷歌地图上标记它。我知道如何在谷歌地图上标记一个地方,但我不知道如何使用纬度和经度计算从当前位置到其他位置的距离,并找到距离我的位置最短的距离。此外,我不知道如何使用编码从Android设备获取我当前的位置。我听说可以通过两种方式找到位置,例如1)使用最后已知位置和2)使用onlocation更改。使用上次已知位置方法的当前位置不适合我的应用程序。所以我需要使用onlocation更改当前的纬度和经度。如果它不可用,则从纬度和经度获取位置坐标。
这是我在我的应用中打开谷歌地图并使用纬度和经度标记地点的代码。
public class Map extends Activity {
private GoogleMap googleMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
try {
// Loading map
initilizeMap();
} catch (Exception e) {
e.printStackTrace();
}
double latitude =9.887262 ;
double longitude = 76.731675;
// create marker
MarkerOptions marker = new MarkerOptions().position(new LatLng(latitude, longitude)).title("Hello Maps ");
// adding marker
googleMap.addMarker(marker);
CameraPosition cameraPosition = new CameraPosition.Builder().target(
new LatLng(latitude, longitude)).zoom(12).build();
googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
}
private void initilizeMap() {
if (googleMap == null) {
googleMap = ((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();
// check if map is created successfully or not
if (googleMap == null) {
Toast.makeText(getApplicationContext(),
"Sorry! unable to create maps", Toast.LENGTH_SHORT)
.show();
}
}
}
@Override
protected void onResume() {
super.onResume();
initilizeMap();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.map, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
这是它的布局文件..
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<fragment
android:id="@+id/map"
android:name="com.google.android.gms.maps.MapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
答案 0 :(得分:1)
使用以下方法计算距离
private double distance(double lat1, double lon1, double lat2, double lon2) {
double theta = lon1 - lon2;
double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
dist = Math.acos(dist);
dist = rad2deg(dist);
dist = dist * 60 * 1.1515;
return (dist);
}
private double deg2rad(double deg) {
return (deg * Math.PI / 180.0);
}
private double rad2deg(double rad) {
return (rad * 180.0 / Math.PI);
}
答案 1 :(得分:1)
为了计算从一个点到另一个点的距离,有各种算法可用,但这些算法的作用是,它们只是计算两点之间的直线距离。如果你想真正获得各点之间的实际路径长度,最好使用Google Directions API。
您可以使用HttpURLConnection
查询Google服务器以获取JSON,其中包含有关距离以及两点之间路线的所有详细信息。您可以使用以下方法解析JSON:
public class DistanceCalculator {
private String dist;
public String getDistance(String data) {
try {
JSONObject json = new JSONObject(data);
System.out.println("\n\nParsed JSON: " + json);
JSONArray routes = json.getJSONArray("routes");
System.out.println("\n\n\tRoutes Array: " + routes);
for (int i = 0; i < routes.length(); i++) {
JSONObject route = routes.getJSONObject(i);
System.out.println("\n\n\tRoute " + i + ": " + route);
JSONArray legs = route.getJSONArray("legs");
System.out.println("\n\n\t\tLegs Array: " + legs);
for (int k = 0; k < legs.length(); k++) {
JSONObject leg = legs.getJSONObject(k);
System.out.println("\n\n\t\t\tLeg " + k + ": " + leg);
JSONObject distance = leg.getJSONObject("distance");
dist = distance.getString("text");
System.out.println("\n\n\t\t\tDistance: " + dist);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return dist;
}
}
获取JSON对象后,您可以使用其中的数据在地图上绘制路线。网上有可用的算法,您可以使用它来实现此目的。这是一个很好的例子:http://javapapers.com/android/draw-path-on-google-maps-android-api/