繁体   English   中英

查找附近的地方android java

[英]Find nearby places android java

我有一个存储在数据库中的经度和纬度列表。 现在,我正在尝试开发一种从当前位置查找附近位置的功能。 就是说,我必须从数据库中搜索所有的经度和纬度,然后查看将显示我区域内的哪些地点。

Location.distanceBetween(lat1,lon1,  lat2,lon2, result);

要查找从一个二维点到另一个二维点的距离,可以使用Haversine公式(无需调用任何API函数)。

// All measurements are in meters
var rad = function(x) {
  return x * Math.PI / 180;
};

var getDistance = function(coord1, coord2) {
  // This is the Earth's radius
  var earthRad = 6378137; 
  var dLat = rad(coord2.lat() - coord1.lat());
  var dLong = rad(coord2.lng() - coord1.lng());
  var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.cos(rad(coord1.lat())) * Math.cos(rad(coord2.lat())) *
    Math.sin(dLong / 2) * Math.sin(dLong / 2);
  var b = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  var distance = earthRad * b;

  // Returns distance from coord1 to coord2 in meters
  return distance;
};

您的问题有点广泛,因此这可能不是最佳解决方案。 如果您要不断更新当前位置,则必须实施“树排序”算法或其他优化性能的方法,而不是每次更新都要检查数据库中的距离。

您可以使用Location对象。 distanceBetween或distanceTo方法将为您提供两点之间的“乌鸦飞翔”距离。 在这里,您可以过滤结果并仅显示想要的地方。

这是我用的

  public void nearBy() { 
        if (map.getMyLocation() != null) {//check if my location was found
            db = new MyDatabase(MainActivity.context);
            Cursor medecin = db.lireMedecin();//read values from database
            map.clear();//clearing the map
            while (medecin.getPosition() < medecin.getCount()) { //cheking if this doctor is nearby...
                String Lat1 = medecin.getString(5);//doctor's latitude
                String Lon1 = medecin.getString(6);//doctor's longitude
                LatLng me = new LatLng(map.getMyLocation().getLatitude(), map.getMyLocation().getLongitude());//my location
                LatLng med = new LatLng(Double.parseDouble(Lat1), Double.parseDouble(Lon1));//doctor location
                if (CalDist(me, med) < 6) {//if distance is < 6km add marker to the map
                    map.addMarker(new MarkerOptions().position(med).title(medecin.getString(1) + " " + medecin.getString(2))
                            .snippet(medecin.getString(4)).icon(BitmapDescriptorFactory
                                    .fromResource(Icone(medecin.getString(7).charAt(0))))); //showing the doctor on the map 
                }
                medecin.moveToNext();//next doctor
            }
        } else
            Toast.makeText(context, "Gps signal not valid", Toast.LENGTH_SHORT).show();//can't find my position
    }

计算距离:

 public static double CalDist(LatLng StartP, LatLng EndP) {
        int Radius = 6371;//­radius of earth in Km 
        double lat1 = StartP.latitude ;
        double lat2 = EndP.latitude ;
        double lon1 = StartP.longitude ;
        double lon2 = EndP.longitude ;
        double dLat = Math.toRadians(lat2 - lat1);
        double dLon = Math.toRadians(lon2 - lon1);
        double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
                   Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
                   Math.sin(dLon / 2) * Math.sin(dLon / 2);
        double c = 2 * Math.asin(Math.sqrt(a));
        return Radius * c;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM