3

約 7000 の場所の配列があり、それぞれが Android の場所マネージャーを使用して記録されました。これらの場所をロードするときに、前の場所から 1 km 以上離れているか、これを使用して精度が 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)

4

2 に答える 2

3

未解決のバグがあるようです: https://code.google.com/p/gmaps-api-issues/issues/detail?id=5313

編集

互いに 1 メートル未満の距離にある頂点をフィルタリングすると、バグが解決されるようです。今夜遅くにこれを修正するコードを書き、ここに置きます。

アップデート

このバグは Google Issue Tracker で処理されました

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

Google Play Services - 9.2.56 で修正されました。

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

于 2013-07-02T10:42:54.770 に答える