Как создать радиус на карте Google и проверить, находится ли маркер, извлекаемый из базы данных, внутри круга (Android) - PullRequest
0 голосов
/ 30 августа 2018

Я хотел бы знать, как создать радиус в моем текущем местоположении с диапазоном 800 метров. А также как я могу проверить, находится ли маркер, который я выбрал из базы данных, внутри моего круга.

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Я нашел этот фрагмент кода о том, как добавить радиус в стеке потока.

//radius in meters
    Circle circle = mMap.addCircle(new CircleOptions().center(new LatLng(latitude, longitude)).radius(800).strokeColor(Color.RED));
    circle.setVisible(true);

И на мой вопрос о том, как проверить, находится ли маркер, извлекаемый из базы данных, в радиусе, я использую

Location.distanceBetween () Google Maps | Рассчитать расстояние между двумя местоположениями (учебники по Android)

А потом я добавил оператор if

if (result[0] >= 450 && result[0] <= 800) {
   Toast.makeText(this, "distance: "+ result[0] + "\nBus is inside radius", Toast.LENGTH_SHORT).show();
}
0 голосов
/ 31 августа 2018

Для такой задачи у меня есть статический вспомогательный класс. Вот код, который я использую для создания круга:

public static CircleOptions setMapCircleMeters(LatLng latLng, float meters){
    CircleOptions options = null;
    try {
        options = new CircleOptions();

        options.center(latLng);
        options.radius(meters);
        options.fillColor(Color.argb(70, 80, 80, 80));
        options.strokeWidth(2.0f);
    }
    catch (Exception ex){
        Log.e(TAG, "  CircleOptions --- " + ex.getMessage());
    }
    return options;
}

Вы можете легко изменить атрибуты fillColor или strokeWidth в соответствии с вашими потребностями.

Теперь, чтобы узнать, находится ли место на расстоянии, которое вы хотите проверить:

public static boolean isInRangeMeters(LatLng pt1, LatLng pt2, double meters){
    boolean inRange = false;
    try{
        double distance = getDistanceMeters(pt1, pt2);

        inRange = (distance <= meters);
    }
    catch (Exception ex){
        Log.e("ERROR", ex.getMessage());
    }
    return inRange;
}

public static double getDistanceMeters(LatLng pt1, LatLng pt2){
    double distance = 0d;
    try{
        double theta = pt1.longitude - pt2.longitude;
        double dist = Math.sin(Math.toRadians(pt1.latitude)) * Math.sin(Math.toRadians(pt2.latitude))
                    + Math.cos(Math.toRadians(pt1.latitude)) * Math.cos(Math.toRadians(pt2.latitude)) 
                    * Math.cos(Math.toRadians(theta));

        dist = Math.acos(dist);
        dist = Math.toDegrees(dist);
        distance = dist * 60 * 1853.1596;
    }
    catch (Exception ex){
        Log.e("ERROR", ex.getMessage());
    }
    return distance;
}
...