(MapView и 1700 элементов наложения) .equals («Медленно») - PullRequest
7 голосов
/ 19 июля 2011

У меня есть MapView, и я наложил на него 1700 точек, каждая с одинаковым рисунком, но с разной информациейВ настоящее время я использую Itemized Overlay, чтобы добавить все оверлеи, а затем заполнить их после промысла.Это работает, но производительность медленная.Изменение уровня масштабирования и фокусировки является скачкообразным.Теперь было бы лучше использовать ArrayItemizedOverlay, так как он одинаково прорисован, или карта будет такой же медленной?

Ответы [ 3 ]

4 голосов
/ 19 июля 2011

Это не решение, а обходной путь в ожидании идеального решения.

У меня была та же проблема, и я создал несколько оверлеев.

6 оверлеев с 99 точками действительно быстрее, чем 1 оверлей с 600 точками.

(время загрузки 15 секунд против 1 секунды)

        for (int i = 0; i < 99; i++) {
            webcamCursor.moveToPosition(i);
            float lat = Float.valueOf(webcamCursor.getString(webcamCursor
                    .getColumnIndex("Lat")));
            float lon = Float.valueOf(webcamCursor.getString(webcamCursor
                    .getColumnIndex("Lon")));
            GeoPoint gp = new GeoPoint((int) (lat / 10), (int) (lon / 10));
            myOverlay1.addPoint(gp);
        }
        for (int i = 100; i < 199; i++) {
            webcamCursor.moveToPosition(i);
            float lat = Float.valueOf(webcamCursor.getString(webcamCursor
                    .getColumnIndex("Lat")));
            float lon = Float.valueOf(webcamCursor.getString(webcamCursor
                    .getColumnIndex("Lon")));
            GeoPoint gp = new GeoPoint((int) (lat / 10), (int) (lon / 10));
            myOverlay2.addPoint(gp);
        }
        for (int i = 200; i < 299; i++) {
            webcamCursor.moveToPosition(i);
            float lat = Float.valueOf(webcamCursor.getString(webcamCursor
                    .getColumnIndex("Lat")));
            float lon = Float.valueOf(webcamCursor.getString(webcamCursor
                    .getColumnIndex("Lon")));
            GeoPoint gp = new GeoPoint((int) (lat / 10), (int) (lon / 10));
            myOverlay3.addPoint(gp);
        }
        for (int i = 300; i < 399; i++) {
            webcamCursor.moveToPosition(i);
            float lat = Float.valueOf(webcamCursor.getString(webcamCursor
                    .getColumnIndex("Lat")));
            float lon = Float.valueOf(webcamCursor.getString(webcamCursor
                    .getColumnIndex("Lon")));
            GeoPoint gp = new GeoPoint((int) (lat / 10), (int) (lon / 10));
            myOverlay4.addPoint(gp);
        }
        for (int i = 400; i < 499; i++) {
            webcamCursor.moveToPosition(i);
            float lat = Float.valueOf(webcamCursor.getString(webcamCursor
                    .getColumnIndex("Lat")));
            float lon = Float.valueOf(webcamCursor.getString(webcamCursor
                    .getColumnIndex("Lon")));
            GeoPoint gp = new GeoPoint((int) (lat / 10), (int) (lon / 10));
            myOverlay5.addPoint(gp);
        }
        for (int i = 500; i < webcamCursor.getCount(); i++) {
            webcamCursor.moveToPosition(i);
            float lat = Float.valueOf(webcamCursor.getString(webcamCursor
                    .getColumnIndex("Lat")));
            float lon = Float.valueOf(webcamCursor.getString(webcamCursor
                    .getColumnIndex("Lon")));
            GeoPoint gp = new GeoPoint((int) (lat / 10), (int) (lon / 10));
            myOverlay6.addPoint(gp);
        }
        System.out.println("**TIME**" + (System.currentTimeMillis() - t));

        mMap.getOverlays().add(myOverlay1);
        mMap.getOverlays().add(myOverlay2);
        mMap.getOverlays().add(myOverlay3);
        mMap.getOverlays().add(myOverlay4);
        mMap.getOverlays().add(myOverlay5);
        mMap.getOverlays().add(myOverlay6);
0 голосов
/ 07 сентября 2011

Также кое-что, что может быть очень интересным .. http://code.google.com/p/mapview-overlay-manager/wiki/LazyLoading

Я даже не пробовал, а просто предлагал новые идеи.

Кстати, я не знаю, должен ли я редактировать свой предыдущий ответ, а не публиковать новый, так как это совсем другое дело.

0 голосов
/ 20 июля 2011

В моем случае я переопределю Overlay#draw() или MapView#draw(), чтобы проверить, попадают ли точки в видимую область карты. Проверка лучше с отсортированным массивом начальных точек. Но в первой итерации кодирования я предпочитаю использовать решение выше (Profete 162).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...