2016-06-18 5 views
1

У меня есть огромный файл GeoJson (около 12 МБ), который будет добавлен к фрагменту карты. Я использую библиотеку утилиты для карт Android, чтобы отобразить ее на карте. Это займет около 5-10 секунд, чтобы показать слой на карте, в течение которого приложение перестает отвечать. Поскольку слой должен быть добавлен в основной поток пользовательского интерфейса, я не могу переместить его в фоновый поток. Есть ли способ сохранить приложение в течение этого времени? или Любые альтернативы использованию файла Geojosn?GeoJson layer on android maps

Я переместил метод addLayer() в поток пользовательского интерфейса и его работу. Я столкнулся с несколькими проблемами. Вот код.

ThreatMap.java

public class ThreatMap extends AppCompatActivity implements OnMapReadyCallback { 

    private static final String TAG = "ThreatMap"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.threat_map); 

     Toolbar toolbar = (Toolbar) findViewById(R.id.app_bar_threat_map); 
     TextView title = (TextView) findViewById(R.id.main_title); 
     title.setText(R.string.actionbar_threat_map); 
     setSupportActionBar(toolbar); 

     getSupportActionBar().setHomeButtonEnabled(true); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setDisplayShowTitleEnabled(false); 


     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 

    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 

     ThreatMapRenderingTask task = new ThreatMapRenderingTask(); 
     task.execute(googleMap); 
    } 


    private class ThreatMapRenderingTask extends AsyncTask<GoogleMap, Void, GeoJsonLayer> { 

     ProgressDialog progressDialog; 

     public ThreatMapRenderingTask() { 
      progressDialog = new ProgressDialog(ThreatMap.this); 
     } 

     @Override 
     protected void onPreExecute() { 

      progressDialog.setMessage("Loading Threat Map"); 
      progressDialog.show(); 
     } 


     @Override 
     protected GeoJsonLayer doInBackground(GoogleMap... googleMap) { 

      GoogleMap gMap = googleMap[0]; 
      GeoJsonLayer layer = null ; 

      PolygonOptions first = new PolygonOptions(); 
      try { 
       layer = new GeoJsonLayer(gMap, R.raw.threatmap, getApplicationContext()); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      return layer; 
     } 

     @Override 
     protected void onPostExecute(GeoJsonLayer layer) { 

      layer.addLayerToMap(); 

      for (GeoJsonFeature feature : layer.getFeatures()) { 
       if (feature.hasProperty("EX_BOX_ID")) { 
        String state = feature.getProperty("STATE_PROV"); 
        int ex_box_id = Integer.parseInt(feature.getProperty("EX_BOX_ID")); 
        String pb_box_id = feature.getProperty("PB_BOX_ID"); 


        if (ex_box_id < 25) { 
         GeoJsonPolygonStyle polygonStyleRed = new GeoJsonPolygonStyle(); 
         polygonStyleRed.setFillColor(Color.RED); 
         feature.setPolygonStyle(polygonStyleRed); 
        } else if (ex_box_id < 50 && ex_box_id > 25) { 
         GeoJsonPolygonStyle polygonStyleYellow = new GeoJsonPolygonStyle(); 
         polygonStyleYellow.setFillColor(Color.YELLOW); 
         feature.setPolygonStyle(polygonStyleYellow); 
        } else { 
         GeoJsonPolygonStyle polygonStyleGreen = new GeoJsonPolygonStyle(); 
         polygonStyleGreen.setFillColor(Color.GREEN); 
         feature.setPolygonStyle(polygonStyleGreen); 
        } 
       } 
      } 

      if (progressDialog.isShowing()) { 
       progressDialog.dismiss(); 
      } 

     } 
    } 
} 

threat_map_fragment.xml

<fragment 
    android:id="@+id/map" 
    android:name="com.google.android.gms.maps.SupportMapFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".ThreatMap" 
    map:cameraTargetLat="78.00" 
    map:cameraTargetLng="16.00" 
    map:cameraZoom="3" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:map="http://schemas.android.com/apk/res-auto" /> 

threat_map.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <include 
     android:id="@+id/app_bar_threat_map" 
     layout="@layout/appbar" /> 
    <include 
     android:id="@+id/map" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     layout="@layout/threat_map_fragment" 
     android:layout_below="@id/app_bar_threat_map"/> 

</LinearLayout> 

У меня есть пара проблем.

  1. Фрагмент карты не приближается к местоположению по умолчанию, определенному в XML-файле.

  2. Я использовал метод GeoJsonPolygonStyle и добавил цвет к полигонам на слое. Цвет не отображается на всех уровнях масштабирования. Мне нужно увеличить масштаб, чтобы увидеть цвет для некоторых полигонов. В чем причина этого и есть ли какая-нибудь работа?

+0

Есть ли шанс разделить файл на более мелкие биты? Вы уверены, что должны делать импорт на основной треск? Разве нет метода 'addLayer()', который должен быть вызван в потоке пользовательского интерфейса? – m02ph3u5

+0

thanks @ m02ph3u5, я переместил addLayer() в поток пользовательского интерфейса и его работу, после этого я столкнулся с несколькими проблемами. Я обновляю вопрос, пожалуйста, посмотрите. – rtk

+0

попробуйте этот пример кода на githube https://github.com/hiepxuan2008/GoogleMapDirectionSimple/ –

ответ

0

Я столкнулся с аналогичной проблемой. В настоящее время мой подход делит большой файл geojson на мелкие куски и загружает их, вызывая несколько задач async (параллельная обработка). Это привело к повышению производительности по сравнению с загрузкой одного файла. Но все же я ищу оптимизирующие методы. Вы можете проверить здесь (Show large geojson file in android google maps)

Смежные вопросы