android - 如何以公里为单位查找两个位置之间的距离(按纬度和经度)

标签 android google-maps gps

我正在开发一个 android 应用程序,它将跟踪当前位置的纬度和经度并存储在外部数据库中。这里我有一个纬度和经度列表。我使用自定义适配器填充它们。但是,这里我需要从一个基准纬度和基准经度到其余项目的纬度和经度的距离。这里的基准纬度和经度是由用户自己选择的。下面的列表解释如下我有

SELECTION         LAT        LONG         DISTANCE
-------------------------------------------------
  checkbox1    123.4546     456.48751      Text
  checkbox2    123.4546     456.48751      Text
  checkbox3    123.4546     456.48751      Text
  checkbox4    123.4546     456.48751      Text

如果用户选中复选框 1,那么我必须找到从复选框 1 纬度到复选框 2、复选框 3、复选框 4 纬度的距离,单位为 KILOMETERS

 public class Locations_Adapter extends BaseAdapter {
        public String distance_string;
        Context context;
        List<Locations_modle> objects;
        double distance, latitude, longitude;
        String latitude_string, longitude_string;
        double baseLat, baseLong, finalLat, finalLong;
        Location location_pointa, location_pointb;
        TextView distance_text;
        float[] results;
        int selectedPostion = -1;

        public Locations_Adapter(Context context, int resource, List<Locations_modle> objects) {
            this.context = context;
            this.objects = objects;
        }

        /**
         * Distance calculation between two lat longs
         **/
        private static double calculateDistance(double baseLat, double baseLong, double latitude, double longitude, String unit) {
            double theta = baseLong - longitude;
            double dist = Math.sin(deg2rad(baseLat)) * Math.sin(deg2rad(latitude)) + Math.cos(deg2rad(baseLat)) * Math.cos(deg2rad(longitude)) * Math.cos(deg2rad(theta));
            dist = Math.acos(dist);
            dist = rad2deg(dist);
            dist = dist * 60 * 1.1515;
            if (unit == "K") {
                dist = dist * 1.609344;
            } else if (unit == "N") {
                dist = dist * 0.8684;
            }

            return (dist);


        }

        /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
        /*::    This function converts decimal degrees to radians                        :*/
        /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
        private static double deg2rad(double deg) {
            return (deg * Math.PI / 180.0);
        }

        /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
        /*::    This function converts radians to decimal degrees                        :*/
        /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
        private static double rad2deg(double rad) {
            return (rad * 180 / Math.PI);
        }

        @Override
        public int getCount() {
            return objects.size();
        }

        @Override
        public Object getItem(int position) {
            return objects.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(final int position, View convertView, final ViewGroup parent) {

            final View locations_row = LayoutInflater.from(context).inflate(R.layout.layout_adapter_list_details, null);
            final Locations_modle location = (Locations_modle) objects.get(position);
            TextView text_cust_name = (TextView) locations_row.findViewById(R.id.txt_cust_name_heading);
            TextView latitude = (TextView) locations_row.findViewById(R.id.txt_latitude);
            latitude.setText(location.getLatitude());
            TextView longitude = (TextView) locations_row.findViewById(R.id.txt_longitude);
            distance_text = (TextView) locations_row.findViewById(R.id.txt_distance);
            longitude.setText(location.getLongitude());
            text_cust_name.setText(location.getLocationName());
            CheckBox check_locations = (CheckBox) locations_row.findViewById(R.id.check_locations);
            final Location location_point_a = new Location("Source");
            final Location location_point_b = new Location("Destination");
            location_point_a.setLatitude(Double.parseDouble(location.getLatitude()));
            location_point_a.setLongitude(Double.parseDouble(location.getLongitude()));

            if (position == selectedPostion) {
                check_locations.setChecked(true);
            } else {
                check_locations.setChecked(false);
            }
            check_locations.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if (isChecked) {
                        // selectedPostion = position;
                        latitude_string = location.getLatitude();
                        longitude_string = location.getLongitude();


                        baseLat = Double.parseDouble(latitude_string);
                        baseLong = Double.parseDouble(longitude_string);
                        for (int i = 0; i < objects.size(); i++) {

                            finalLat = Double.parseDouble(objects.get(i).getLatitude());
                            finalLong = Double.parseDouble(objects.get(i).getLongitude());

                            calculateDistance(baseLat, baseLong, finalLat, finalLong, "k");

                        }
distance_text.setText(Double.toString(calculateDistance(baseLat, baseLong, finalLat, finalLong, "k")));
                    } /*else {
                        selectedPostion = -1;

                    }
                    notifyDataSetChanged();

    */

                }
            });

            return locations_row;
        }
    }

谁能告诉我如何实现这一目标

最佳答案

你可以试试这个:

public static Double distanceBetween(LatLng point1, LatLng point2) 
{
  if (point1 == null || point2 == null) {
      return null;
  }
  else{
    return SphericalUtil.computeDistanceBetween(point1, point2);
  }
}

关于android - 如何以公里为单位查找两个位置之间的距离(按纬度和经度),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36832322/

相关文章:

java - 取景器不翻转

android - 如何为 Android 交叉编译 LTP

android - 这个方法做了什么 super.onCreateOptionMenu() 和 super.onOptionsItemSelected(item)

python - 如何表示地理位置

android - 如何在应用程序中使用蓝牙 GPS 模块?

java - Android Canvas 没有在 Path 的指向外绘制 Path

javascript - 谷歌地图 react |不会渲染,一直在加载

javascript - 如何基于 JSON 数组绘制多个多边形

iOS 使用 GPS 设备获取当前位置

android - 当 GPS 关闭时,lastKnownLocation 始终返回 null