在Android中使用精确度标记GPS坐标

时间:2013-12-29 19:06:57

标签: java android gps location coordinates

我的问题是如何有效地存储某个半径内的先前位置(由准确度确定)。

getLatitude()getLongitude()会返回double个坐标,而getAccuracy()会返回一个米的浮点数。

我不知道我是否可以找到米到坐标的转换,但我的问题实际上是开发一种可以提供快速查找和操作的数据结构。

我想到的第一件事就是使用类似trie的东西,其中每个数字也保持准确性,但是它使用了大量的内存。我将这些信息存储在用户的设备中。所以这不是一个好方法。

我想的更多一点,我能想到的只是我可以创建动态的小坐标平面。例如,在纬度100.242312,经度50.53412处激活应用程序,并且在每次移动之后,更改的位数确定坐标平面的大小。无论如何,即使这个听起来也过于复杂且难以实现。

我的问题是,是否有针对此问题提供的API?如果没有任何简单的方法解决这个问题?

1 个答案:

答案 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课程制作的项目的一部分。

如果这是您想要实现的,那么我可以提供项目源代码的链接。