OSDN Git Service

android-2.1_r1 snapshot
[android-x86/packages-apps-Gallery2.git] / src / com / cooliris / media / LocationMediaFilter.java
1 package com.cooliris.media;
2
3 public class LocationMediaFilter extends MediaFilter {
4     private double mRadius;
5     private double mCenterLat;
6     private double mCenterLon;
7     public static final int EARTH_RADIUS_METERS = 6378137;
8     public static final int LAT_MIN = -90;
9     public static final int LAT_MAX = 90;
10     public static final int LON_MIN = -180;
11     public static final int LON_MAX = 180;
12
13     LocationMediaFilter(double centerLatitude, double centerLongitude, double thresholdRadius) {
14         mCenterLat = centerLatitude;
15         mCenterLon = centerLongitude;
16         mRadius = thresholdRadius;
17     }
18
19     LocationMediaFilter(double latitude1, double longitude1, double latitude2, double longitude2) {
20         mCenterLat = centerLat(latitude1, latitude2);
21         mCenterLon = centerLon(longitude1, longitude2);
22         mRadius = distanceBetween(latitude1, longitude1, latitude2, longitude2);
23     }
24
25     public static final double centerLat(double lat1, double lat2) {
26         return (centerOfAngles(lat1, lat2, LAT_MAX));
27     }
28
29     public static final double centerLon(double lon1, double lon2) {
30         return (centerOfAngles(lon1, lon2, LON_MAX));
31     }
32
33     private static final double centerOfAngles(double ang1, double ang2, int wrapAroundThreshold) {
34         boolean wrapAround = false;
35         if (Math.abs(ang1 - ang2) > wrapAroundThreshold) {
36             wrapAround = true;
37         }
38         double center = (ang1 + ang2) * 0.5;
39         if (wrapAround) {
40             center += wrapAroundThreshold;
41             center %= wrapAroundThreshold;
42         }
43         return center;
44     }
45
46     public static double distanceBetween(double lat1, double lon1, double lat2, double lon2) {
47         double dLat = Math.toRadians(lat2 - lat1);
48         double dLon = Math.toRadians(lon2 - lon1);
49         double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2))
50                 * Math.sin(dLon / 2) * Math.sin(dLon / 2);
51         double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
52         return EARTH_RADIUS_METERS * c;
53     }
54
55     public static final double toKm(double meter) {
56         return meter / 1000;
57     }
58
59     public static final double toMile(double meter) {
60         return meter / 1609;
61     }
62
63     @Override
64     public boolean pass(MediaItem item) {
65         double radius = distanceBetween(mCenterLat, mCenterLon, item.mLatitude, item.mLongitude);
66         if (radius <= mRadius) {
67             return true;
68         }
69         return false;
70     }
71 }