0

基本的に、タイトルはそれをすべて言います。現在のようにデータベース内のすべてのエントリをマップにプロットするのではなく、データベースにクエリを実行して、座標がユーザーの現在の場所の周りに描かれた円内にあるエントリのみをプロットしたいのですが、できません。それを行う方法をかなり理解してください。現時点では、データベースに保存されているすべてのエントリの場所と現在の場所の周りの円とともに、ユーザーの現在の場所を地図上にプロットするコードを作成しました(下の図を参照)。以下の私の写真に基づいて、円内の3つのマーカーのみをプロットしたいと思います。

現在のコード

私のデータベースに保存されている緯度座標が円の面積内にあるかどうかを確認する方法があるかどうか誰かが知っていますか?またはそうでない場合は、誰かが同様のアイデアを使用する代替案を提案できますか?

私が考えていた別の方法は、エントリの座標を正方形/長方形の境界と簡単に比較できるように、円ではなく正方形/長方形を使用することでしたが、それがどのように実現可能かはわかりません。これらの形状は、GoogleMapsAPIではサポートされていません。また、便利なLatLngBoundsクラスに出くわしましたが、それを使用しているサンプルコードが見つかりません。どうすればこれを行うことができますか?

4

2 に答える 2

1

円の半径と中心点は固定されていると思います。

したがって、このメソッドを使用して、中心といくつかのLatLngの間の距離を取得し、条件を設定します

距離<=半径

public static String getDistance(LatLng ll_source, LatLng ll_destination,
        int unit) {


    int Radius = 6371;// radius of earth in Km

    double lat1 = ll_source.latitude;
    double lat2 = ll_destination.latitude;
    double lon1 = ll_source.longitude;
    double lon2 = ll_destination.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));
    double valueResult = Radius * c;
    double km = valueResult / 1;
    DecimalFormat newFormat = new DecimalFormat("####");
    Integer kmInDec = Integer.valueOf(newFormat.format(km));
    double meter = valueResult % 1000;
    Integer meterInDec = Integer.valueOf(newFormat.format(meter));
    DecimalFormat df = new DecimalFormat("#.#");
    return df.format(valueResult);
}
于 2013-03-11T13:29:35.760 に答える
0

わかりました。質問で参照したLatLngBoundsクラスを使用して解決策を見つけました。それが何をするか:

  1. ユーザーの現在の緯度と経度の座標の周りに新しい長方形の周囲長を作成します(この例は約1平方キロメートルです)。
  2. 次に、境界にデータベースに保存されている座標が含まれているかどうかを確認します。
  3. 含まれている場合、マーカーはマップ上にプロットされます。

    public void getNearbyMarkers(){
        LatLngBounds perimeter = new LatLngBounds(new LatLng(currentLat - 0.004,
                currentLon - 0.004), new LatLng(currentLat + 0.004, currentLon + 0.004));
    
    
        if (perimeter.contains(LatlongFromDatabase)) {
            //Plot Marker on Map
        } else {
            Toast.makeText(getApplicationContext(), "Co-ordinates not in perimeter!", 8).show();
        }
    }
    
于 2013-03-11T22:08:51.070 に答える