3

我有一个大约 7000 个位置的数组,每个位置都是使用 android 上的位置管理器记录的,当加载这些位置时,我会过滤掉任何距离上一个位置超过 1 公里或精度高于 50 的位置:

if (c.moveToFirst())
do {
    lat = c.getString(0);
    lng = c.getString(1);
    ac = c.getString(2);
    alt = c.getString(3);
    if (l1 != null) {
        l2 = new Location("MAP");
        l2.setLatitude(Double.parseDouble(lat));
        l2.setLongitude(Double.parseDouble(lng));
        l2.setAltitude(Double.parseDouble(alt));
        l2.setAccuracy(Float.parseFloat(ac));
        if (l1.distanceTo(l2) < 1000
                && l2.getAccuracy() < 51) {
            opts.add(new LatLng(Double.parseDouble(lat),
                    Double.parseDouble(lng)));
            list.add(l2);
            l1 = l2;
        }
    } else {
        l1 = new Location("MAP");
        l1.setLatitude(Double.parseDouble(lat));
        l1.setLongitude(Double.parseDouble(lng));
        l1.setAccuracy(Float.parseFloat(ac));
        l1.setAltitude(Double.parseDouble(alt));
        if (l1.getAccuracy() > 50)
            l1 = null;
    }

} while (c.moveToNext());

这样就消除了这些随机线的可能性,假设它应该正常工作。

当它正常工作时,它应该像这样出现:

在此处输入图像描述

但是,当我放大一点或四处走动时,有时我会得到这些随机线:

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

我添加这样的行:

Location[] locations = Arrays.copyOfRange(mLocations, a, b);

if (mStartLine != null)
    mStartLine.remove();
if (mMiddleLine != null)
    mMiddleLine.remove();
if (mEndLine != null)
    mEndLine.remove();
if (mMarker != null) {
    mMarker.remove();
    mMarker = null;
}
PolylineOptions so = new PolylineOptions();
PolylineOptions mo = new PolylineOptions();
PolylineOptions eo = new PolylineOptions();

so.color(Color.GREEN);
eo.color(Color.GREEN);
mo.color(Color.BLACK);

if (locations.length < 2) {
    if (locations.length == 0)
        return;
    // Add just a dot instead.
    MarkerOptions m = new MarkerOptions();
    m.position(new LatLng(locations[0].getLatitude(), locations[0]
            .getLongitude()));
    mMarker = mMap.addMarker(m);
    return;
}
so.add(new LatLng(locations[0].getLatitude(), locations[0].getLongitude()));
so.add(new LatLng(locations[1].getLatitude(), locations[1].getLongitude()));
mStartLine = mMap.addPolyline(so);
for(int i = 1; i < (locations.length - 1); i++){
    mo.add(new LatLng(locations[i].getLatitude(), locations[i].getLongitude()));
}
mMiddleLine = mMap.addPolyline(mo);
eo.add(new LatLng(locations[locations.length - 2].getLatitude(), locations[locations.length - 2].getLongitude()));
eo.add(new LatLng(locations[locations.length - 1].getLatitude(), locations[locations.length - 1].getLongitude()));
mEndLine = mMap.addPolyline(eo);

底部的栏是一个选择器,仅显示该位置范围(因为当您显示类似 7000 个位置时,它会变得非常疯狂,您会得到StackOverflowError's)

4

2 回答 2

3

似乎存在一个错误:https ://code.google.com/p/gmaps-api-issues/issues/detail?id=5313

编辑

如果您过滤彼此之间距离小于 1 米的顶点,则该错误已解决。今晚晚些时候我会写一些代码来解决这个问题并将它放在这里。

更新

此错误已在 Google 问题跟踪器中处理

https://issuetracker.google.com/issues/35821816

它已在 Google Play 服务中修复 - 9.2.56

https://developers.google.com/maps/documentation/android-api/releases#june_27_2016

于 2013-07-02T10:42:54.770 回答
0

这是一种为我们解决此问题的方法。不一定是理想的解决方案,但它确实有效。在某些缩放级别下,您可能会看到一条折线超出其应有的位置(如上图所示)。如果您不断更改缩放级别,扩展将消失然后重新出现。每当两个坐标完全相同时,都会发生这种情况。例如

假设您有 3 个坐标 A、B、C。公共汽车从 A 出发去 B,然后公共汽车掉头来到 C。如果 A 和 C 是完全相同的坐标,你会看到这个折线延伸问题。

经过几次接近后,我们决定将 C 点的纬度偏移 0.00001。这解决了我们所有的问题。

于 2013-08-02T21:13:22.727 回答