2017-10-11 25 views
0

J'ai une application Google Maps dont j'ai besoin pour télécharger différents plans d'étage. Jusqu'à présent, je suis d'ajouter l'image floorplan à la carte en utilisant un objet de superposition au sol comme ceci:Ajouter manuellement un plan d'étage à Google Maps avec Android Studio

LatLngBounds bounds = new LatLngBounds(new LatLng(floorplan.get_swlat(), floorplan.get_swlng()), 
new LatLng(floorplan.get_nelat(), floorplan.get_nelng())); 

GroundOverlayOptions overlayOptions = new GroundOverlayOptions() 
        .image(BitmapDescriptorFactory.fromBitmap(floorplan.get_floorplanimage())).positionFromBounds(bounds); 

mMap.addGroundOverlay(overlayOptions); 

Cela ajoute floorplan à la carte, mais le problème est qu'il est seulement orienté nord-sud, donc il a gagné Ne travaillez pas pour des bâtiments qui ne sont pas parfaitement assis comme ça. Alors je me demandais s'il y avait un moyen d'y entrer et de le placer manuellement (et d'utiliser les doigts pour faire pivoter et mettre à l'échelle l'image) là où j'en avais besoin. Quelqu'un sait où commencer?

Répondre

0

J'ai pris du temps mais j'ai finalement trouvé quelque chose. Au lieu d'ajouter la superposition en utilisant les deux coins j'utilise le centre/lon et la largeur et la hauteur. J'ajoute la superposition comme suit.

mOverlayOptions = new GroundOverlayOptions() 
      .image(BitmapDescriptorFactory.fromBitmap(floorplan.get_floorplanimage())) 
      .position(new LatLng(floorplan.get_clat(), floorplan.get_clng()), (float) floorplan.get_width(), (float) floorplan.get_height()) 
      .bearing((float) floorplan.get_bearing()) 
      .transparency(mOpacity); 
mOverlay = mMap.addGroundOverlay(mOverlayOptions); 

donc vous devez donner les valeurs initiales à begin.Then je floorplan deux marqueurs, ajouté un situé au centre de la superposition (même latitude/longitude) et un autre situé le long du centre du bord droit de la superposition (mSizeMarker). Assurez-vous qu'ils sont draggable. J'ai dû faire des calculs pour savoir où placer l'un sur le bon côté.

mCenterMarker = mMap.addMarker(new MarkerOptions().position(new LatLng(floorplan.get_clat(), floorplan.get_clng()))); 

Double new_longitude = floorplan.get_clng() + (floorplan.get_width()/2/(6371000)) * (180/3.14159265)/Math.cos(floorplan.get_clat() * 3.14159265/180); 
mSizeMarker = mMap.addMarker(new MarkerOptions().position(new LatLng(floorplan.get_clat(), new_longitude))); 

mCenterMarker.setDraggable(true); 
mSizeMarker.setDraggable(true); 

Tout ce qui reste est d'ajouter un OnMarkerDragListener:

mMap.setOnMarkerDragListener(new GoogleMap.OnMarkerDragListener() { 
     @Override 
     public void onMarkerDragStart(Marker marker) { 
      } 
     } 

     @Override 
     public void onMarkerDrag(Marker marker) { 
      if (marker.equals(mCenterMarker)) { 
       mOverlay.remove(); 
       mOverlayOptions.position(marker.getPosition(), mOverlay.getWidth(), mOverlay.getHeight()); 
       mOverlay = mMap.addGroundOverlay(mOverlayOptions); 
       mSizeMarker.setPosition(new LatLng(marker.getPosition().latitude, marker.getPosition().longitude + (mOverlay.getWidth()/2/(6371000)) * (180/3.14159265)/Math.cos(marker.getPosition().latitude * 3.14159265/180))); 
      } 
      if (marker.equals(mSizeMarker)) { 
       marker.setPosition(new LatLng(mCenterMarker.getPosition().latitude, marker.getPosition().longitude)); 
       double newWidth = ((marker.getPosition().longitude - mCenterMarker.getPosition().longitude)/((180/3.14159265)/Math.cos(mCenterMarker.getPosition().latitude * 3.14159265/180))) * 6371000 * 2; 
       mOverlay.remove(); 
       mOverlayOptions.position(mCenterMarker.getPosition(), (float) newWidth); 
       mOverlay = mMap.addGroundOverlay(mOverlayOptions); 
      } 
     } 

     @Override 
     public void onMarkerDragEnd(Marker marker) { 
      if (marker.equals(mSizeMarker)) { 
       marker.setPosition(new LatLng(mCenterMarker.getPosition().latitude, marker.getPosition().longitude)); 
      } 
     } 
    }); 

Utilisez le marqueur du milieu pour glisser où vous voulez que le plan de masse à se trouver, et celui sur le droit de modifier la largeur (la la hauteur sera automatiquement mise à jour en conséquence).

Ensuite, lorsque l'image est positionnée correctement, il suffit d'avoir un bouton de sauvegarde quelque part qui met à jour où le plan de masse est stocké avec la position, la largeur et la hauteur de mOverlay. Il serait possible d'ajouter un autre marqueur pour ajuster manuellement le relèvement, mais c'est plus de maths que je dois faire maintenant. Je vais juste continuer à l'ajuster quand je l'ai mis à l'origine. J'espère que cela aidera tous ceux qui viennent avec ce problème, je sais que cette solution fonctionne très bien pour moi jusqu'ici.