2016-06-18 15 views
1

地図フラグメントに追加するファイルが約12MB(約12MB)です。私はアンドロイドマップユーティリティライブラリを使って地図上にレンダリングしています。レイヤーがメインのUIスレッドに追加されなければならないので、マップをバックグラウンドスレッドに移動することはできません。何か方法はありますかこの時間にアプリを応答し続けるには?またはGeojosnファイルを使用するための代替手段アンドロイドマップ上のGeoJsonレイヤー

addLayer()メソッドをUIスレッドとその動作に移動しました。私はいくつかの問題に遭遇しました。ここにコードがあります。

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

ファイルを小さなビットに分割する可能性はありますか?あなたは本当にあなたがメインのトレードで輸入をしなければなりませんか? UIスレッドで呼び出されるaddLayer()メソッドはありませんか? – m02ph3u5

+0

ありがとう@ m02ph3u5、私はaddLayer()UIスレッドとその作業に移動した、私はこれの後いくつかの問題が発生しました。私は質問を更新しています。見てください。 – rtk

+0

githubeでこのサンプルコードを試してくださいhttps://github.com/hiepxuan2008/GoogleMapDirectionSimple/ –

答えて

0

私は同様の問題に直面しています。現在、私のアプローチは、より大きいgeojsonファイルを小さなチャンクに分割し、複数の非同期タスク(並列処理)を呼び出してロードすることです。これは、1つのファイルの読み込みと比較して、パフォーマンスを向上させるために行われました。しかし、私はまだ最適化技術を探しています。ここで確認できます(Show large geojson file in android google maps

関連する問題