我的问题是如何有效地存储某个半径内的先前位置(由准确度确定)。
getLatitude()
和getLongitude()
会返回double
个坐标,而getAccuracy()
会返回一个米的浮点数。
我不知道我是否可以找到米到坐标的转换,但我的问题实际上是开发一种可以提供快速查找和操作的数据结构。
我想到的第一件事就是使用类似trie的东西,其中每个数字也保持准确性,但是它使用了大量的内存。我将这些信息存储在用户的设备中。所以这不是一个好方法。
我想的更多一点,我能想到的只是我可以创建动态的小坐标平面。例如,在纬度100.242312,经度50.53412处激活应用程序,并且在每次移动之后,更改的位数确定坐标平面的大小。无论如何,即使这个听起来也过于复杂且难以实现。
我的问题是,是否有针对此问题提供的API?如果没有任何简单的方法解决这个问题?
答案 0 :(得分:1)
我不太关注你想做什么。
如果您只想在移动一定距离后存储位置,则只需存储最后一个位置即可进行比较。然后,稍后,当当前位置和存储位置之间的距离超过距离阈值时,您将替换存储的位置。
以下是一些显示这个想法的代码:
public class DistanceFixedImpl extends AbstractStrategyImpl {
private static String TAG = "DistanceFixed";
protected int distance;
protected Location lastLocation;
public DistanceFixedImpl(Context context) {
super(context);
distance = PreferencesData.getInt(context,
DistanceBasedFixedDistance.STATE_DISTANCE, 30);
}
/**
* This is just to enable DistanceAccelerometer, which extends this class, to change what is sent to server
*
* @param TAG
*/
protected void setTAG(String TAG) {
DistanceFixedImpl.TAG = TAG;
}
public void setLocationStrategyListener(
LocationStrategyUpdateListener strategyUpdateListener) {
this.strategyListener = strategyUpdateListener;
}
public void setDistance(int distance) {
PreferencesData.saveInt(context,
DistanceBasedFixedDistance.STATE_DISTANCE, distance);
this.distance = distance;
}
@Override
public void startStrategy() {
startUsingGPS();
strategyListener.strategyMessageCallback("Awaiting GPS first-fix");
}
@Override
public void stopStrategy() {
stopUsingGPS();
super.stopStrategy();
}
@Override
public void onFirsFixChanged(boolean hasGPSfix) {
strategyListener.strategyMessageCallback("Received a first-fix change to: " + hasGPSfix);
}
private Integer[] outputPercentages = new Integer[]{25,50,75,100};
private int outputPercentIndex;
@Override
public void onLocationChanged(Location location) {
incrementLocationChangesOnDevice();
// ignore any incomming locations as long as first fix is not set
if (!hasFirstFix())
return;
if (lastLocation == null) {
/**---------------------------------------------------------------------------------------------- *
* No location to compare against yet, so we just save it as two is needed to calculate distance *
* -----------------------------------------------------------------------------------------------*/
lastLocation = location;
sendLocationToServer(location, TAG);
} else {
float distanceMoved = lastLocation.distanceTo(location);
int outputDistancePercent = outputPercentages[outputPercentIndex];
if ((distanceMoved/distance)*100 >= outputDistancePercent) {
outputPercentIndex = (outputPercentIndex+1) % 4;
strategyListener.strategyMessageCallback("Moved: " + outputDistancePercent + "% of " + distance + " meters");
}
if (distanceMoved > distance) {
// threshold exceeded - send location to server
strategyListener.strategyMessageCallback("SEND: " + distanceMoved
+ " meters");
sendLocationToServer(location, TAG);
lastLocation = location;
}
}
}
}
以上代码是我为Pervasive Positioning课程制作的项目的一部分。
如果这是您想要实现的,那么我可以提供项目源代码的链接。