/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.cooliris.media; public class LocationMediaFilter extends MediaFilter { private double mRadius; private double mCenterLat; private double mCenterLon; public static final int EARTH_RADIUS_METERS = 6378137; public static final int LAT_MIN = -90; public static final int LAT_MAX = 90; public static final int LON_MIN = -180; public static final int LON_MAX = 180; LocationMediaFilter(double centerLatitude, double centerLongitude, double thresholdRadius) { mCenterLat = centerLatitude; mCenterLon = centerLongitude; mRadius = thresholdRadius; } LocationMediaFilter(double latitude1, double longitude1, double latitude2, double longitude2) { mCenterLat = centerLat(latitude1, latitude2); mCenterLon = centerLon(longitude1, longitude2); mRadius = distanceBetween(latitude1, longitude1, latitude2, longitude2); } public static final double centerLat(double lat1, double lat2) { return (centerOfAngles(lat1, lat2, LAT_MAX)); } public static final double centerLon(double lon1, double lon2) { return (centerOfAngles(lon1, lon2, LON_MAX)); } private static final double centerOfAngles(double ang1, double ang2, int wrapAroundThreshold) { boolean wrapAround = false; if (Math.abs(ang1 - ang2) > wrapAroundThreshold) { wrapAround = true; } double center = (ang1 + ang2) * 0.5; if (wrapAround) { center += wrapAroundThreshold; center %= wrapAroundThreshold; } return center; } public static double distanceBetween(double lat1, double lon1, double lat2, double lon2) { 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.atan2(Math.sqrt(a), Math.sqrt(1 - a)); return EARTH_RADIUS_METERS * c; } public static final double toKm(double meter) { return meter / 1000; } public static final double toMile(double meter) { return meter / 1609; } @Override public boolean pass(MediaItem item) { double radius = distanceBetween(mCenterLat, mCenterLon, item.mLatitude, item.mLongitude); if (radius <= mRadius) { return true; } return false; } }