2013-02-01 3 views
1

J'ai une application de test que je dessine un polygone en utilisant google maps API.Google maps API v2 Android, ne dessine pas de polygone en mode hors connexion

Le problème est que, quand je n'ai pas de cache de cartes (nouvelle application installée) le Polygone ne dessine pas. Ce n'est pas un problème de ne pas avoir les cartes chargées, mais j'ai besoin des polygones dessinés dans mon écran. Y a-t-il un moyen de le faire?

Sry pour mon mauvais anglais

Heres le code que j'ai:

package ngvl.testegmaps_v2; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.math.BigDecimal; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Random; 

import ngvl.testegmaps_v2.VO.GeoPosicionamento; 
import ngvl.testegmaps_v2.VO.Layer; 
import ngvl.testegmaps_v2.VO.Secao; 
import ngvl.testegmaps_v2.VO.Talhao; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.Toast; 

import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.GoogleMap.OnMapClickListener; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.Polygon; 
import com.google.android.gms.maps.model.PolygonOptions; 
import com.google.gson.Gson; 
import com.google.gson.reflect.TypeToken; 

public class MainActivity extends FragmentActivity { 

    private List<Secao> secoes; 
    private List<Polygon> poligonos = new ArrayList<Polygon>(); 

    private HashMap<String,Object[]> informacoes = new HashMap<String,Object[]>(); 

    private GoogleMap map; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     SupportMapFragment fragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map); 

     map = fragment.getMap(); 

     map.getUiSettings().setRotateGesturesEnabled(false); 

     // Setting a click event handler for the map 

     LatLng latLng = new LatLng(-20.9957152, -47.3241304); 
     // map.addMarker(new 
     // MarkerOptions().position(latLng).icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher)).title("Av. Paulista").snippet("São Paulo")); 

     configuraPosicao(map, latLng); 

     Button button = (Button)findViewById(R.id.button1); 
     // Register the onClick listener with the implementation above 
     button.setOnClickListener(mCorkyListener); 

    } 

    private void configuraPosicao(GoogleMap map, LatLng latLng) { 

     /* 
     * 3D map.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15)); 
     * map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); 
     * 
     * CameraPosition cameraPosition = new CameraPosition.Builder() 
     * .target(latLng) .zoom(17) .bearing(90) .tilt(45) .build(); 
     * 
     * map.animateCamera(CameraUpdateFactory.newCameraPosition(
     * cameraPosition)); 
     */ 
     map.setMapType(GoogleMap.MAP_TYPE_NONE); 
     // map.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 17.0f)); 
     map.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15)); 

     try { 

      String json = readFileAsString("geo.json"); 

      Gson gson = new Gson(); 
      this.secoes = gson.fromJson(json, new TypeToken<List<Secao>>() { 
      }.getType()); 
      json = null; 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     escrevePoligons(map); 

    } 

    private String readFileAsString(String fileName) throws IOException { 
     InputStream is = getAssets().open(fileName); 
     if (is != null) { 
      StringBuilder sb = new StringBuilder(); 
      String line; 

      try { 
       BufferedReader reader = new BufferedReader(
         new InputStreamReader(is, "UTF-8")); 
       while ((line = reader.readLine()) != null) { 
        sb.append(line).append("\n"); 
       } 
      } finally { 
       is.close(); 
      } 
      return sb.toString(); 
     } else { 
      return ""; 
     } 
    } 

    private void escrevePoligons(GoogleMap map) { 

     float stroke = (float) 1.5; 

     for (Secao secao : secoes) { 
      for (Talhao talhao : secao.getTalhoes()) { 
       for (Layer layer : talhao.getLayers()) { 

        // PolygonOptions rectOptions = new PolygonOptions(); 
        List<LatLng> latlngs = new ArrayList<LatLng>(); 

        for (GeoPosicionamento geoPosicionamento : layer.getGeoPosicionamentos()) { 

         latlngs.add(new LatLng(geoPosicionamento.getLatitude() 
           .setScale(7, BigDecimal.ROUND_HALF_EVEN) 
           .doubleValue(), geoPosicionamento 
           .getLongitude() 
           .setScale(7, BigDecimal.ROUND_HALF_EVEN) 
           .doubleValue())); 
        } 

        int color = 0x1F00FF00; 
        int color2 = 0x5F000000; 

        PolygonOptions polygonOptions = new PolygonOptions() 
                 .fillColor(color).addAll(latlngs) 
                 .strokeColor(color2).strokeWidth(stroke); 

        Polygon p = map.addPolygon(polygonOptions); 

        poligonos.add(p); 

        informacoes.put(p.getId(), new Object[]{ secao, talhao , layer }); 

        //System.out.println(polygonOptions.getPoints()); 

        polygonOptions = null; 
        latlngs = null; 
       } 
      } 
     } 
     this.secoes = null; 

     // String mUrl = 
     // "https://khms0.google.com.br/kh/v=124&src=app&z={z}&x={x}&y={y}"; 
     // MyUrlTileProvider mTileProvider = new MyUrlTileProvider(256, 256, 
     // mUrl); 
     // mTileProvider.tilesRange(); 
     // map.addTileOverlay(new 
     // TileOverlayOptions().tileProvider(mTileProvider).zIndex(-1f)); 

     //String mUrl = "http://a.tile.openstreetmap.org/{z}/{x}/{y}.png"; 
     //MyUrlTileProvider mTileProvider = new MyUrlTileProvider(256, 256, mUrl); 
     //map.addTileOverlay(new TileOverlayOptions().tileProvider(mTileProvider).zIndex(-1f)); 

     map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(-20.9957152, -47.3241304), 14)); 

     // TileProvider tileProvider = TileProviderFactory.getTileProvider(); 
     // map.addTileOverlay(new 
     // TileOverlayOptions().tileProvider(tileProvider)); 
     // map.moveCamera(CameraUpdateFactory.newLatLngZoom(new 
     // LatLng(-20.9957152, -47.3241304), 15)); 

     map.setOnMapClickListener(new OnMapClickListener() 
     { 
      public void onMapClick(LatLng point) 
      { 
       Polygon p = isPointInPolygon(point); 

       if(p != null){ 

        p.setFillColor(getRandomColor()); 

        Object[] clicado = informacoes.get(p.getId()); 

        Secao secao_clicada = (Secao) clicado[0]; 
        Talhao talhao_clicada = (Talhao) clicado[1]; 
        Layer layer_clicada = (Layer) clicado[2]; 

        //System.out.println(secao_clicada);      
        //System.out.println(talhao_clicada); 
        //System.out.println(layer_clicada); 
        //System.out.println("======================="); 

        StringBuilder texto = new StringBuilder(); 
        texto.append("Seção: " + secao_clicada.getDesc() + "\n"); 
        texto.append("Talhão: " + talhao_clicada.getTalhao() + "\n"); 
        texto.append("Variedade: " + talhao_clicada.getVariedade() + " - " + talhao_clicada.getDescVariedade() + "\n"); 
        texto.append("Layer: " + layer_clicada.getSequencia() + "\n"); 

        //Toast.makeText(MainActivity.this, texto , Toast.LENGTH_LONG).show(); 

        addMarker(point,texto); 

       }//else 
        //Toast.makeText(MainActivity.this,"Clicou fora da Área de um Poligono", Toast.LENGTH_LONG).show(); 
      }  
     }); 

    } 

    public void addMarker(LatLng point, StringBuilder texto) { 

     /*map.addMarker(new MarkerOptions().position(point).icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher)) 
             .title("Caracteristicas: ") 
             .snippet(texto); 
             */ 
     Toast.makeText(MainActivity.this, texto , Toast.LENGTH_LONG).show(); 

    } 

    private Polygon isPointInPolygon(LatLng tap) { 


     for(Polygon p : poligonos){ 
      int intersectCount = 0; 
      List<LatLng> vertices = p.getPoints(); 

      for(int j=0; j<vertices.size()-1; j++) { 
       if(rayCastIntersect(tap, vertices.get(j), vertices.get(j+1))) { 
        intersectCount++; 
       } 
      } 

      if(((intersectCount % 2) == 1)){ 
       return p; 
      } 

     } 

     return null;// odd = inside, even = outside; 
    } 

    private boolean rayCastIntersect(LatLng tap, LatLng vertA, LatLng vertB) { 

     double aY = vertA.latitude; 
      double bY = vertB.latitude; 
      double aX = vertA.longitude; 
      double bX = vertB.longitude; 
      double pY = tap.latitude; 
      double pX = tap.longitude; 

      if ((aY>pY && bY>pY) || (aY<pY && bY<pY) || (aX<pX && bX<pX)) { 
       return false; // a and b can't both be above or below pt.y, and a or b must be east of pt.x 
      } 

      double m = (aY-bY)/(aX-bX);    // Rise over run 
      double bee = (-aX) * m + aY;    // y = mx + b 
      double x = (pY - bee)/m;     // algebra is neat! 

      return x > pX; 
    } 

    private OnClickListener mCorkyListener = new OnClickListener() { 
     public void onClick(View v) { 
      // do something when the button is clicked 

      map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(-20.9957152, -47.3241304), 14)); 

     } 
    }; 

    public int getRandomColor() { 
     int color; 
     Random rnd = new Random(); 
     color = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), 
       rnd.nextInt(256)); 
     return color; 
    } 

} 

Réglage du type de carte à MAP_TYPE_NONE comme exemple ci-dessus ne résout pas le problème

Répondre

1

Je cette situation qui a marqué résolu par en utilisant Maps Forge Open Source API Si quelqu'un a fait avec Google Maps Api s'il vous plaît partager et je voudrais changer la réponse.

La réponse que je trouve est que son impossible à rendre ou accéder à quoi que ce soit sans rendre la première carte (en ligne ou via le cache)

1

Ceci est en fait un bug de Google Maps Api v2 pour Android.

Il est référencé ici: https://code.google.com/p/gmaps-api-issues/issues/detail?id=5017

étoiles si vous voulez accélérer le correctif de bug!

+0

bon travail mais, j'ai déjà utilisé une alternative open source, merci – fredcrs

+0

Merci. Dans mon cas, je voudrais éviter de réécrire mon application pour la 3ème fois. A écrit une fois avec API1, a dû réécrire le plus pour API2, maintenant je tiens à y rester. J'espère qu'ils vont le réparer assez vite ... –