2017-10-11 245 views
0

我有一个谷歌地图应用程序,我需要能够上传不同的平面图。到目前为止,我使用的是地面覆盖物这样添加展位图图像地图:使用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); 

这增加的布局图的地图,但问题是,它是唯一面向南北,所以它赢得不适合那些不完全坐在那里的建筑物。所以我想知道是否有办法进入并手动放置它(并使用手指旋转和缩放图像)在我需要的位置。任何人都知道从哪里开始?

回答

0

花了一些时间,但我终于想出了一些东西。我不使用两个角来添加覆盖图,而是使用中心经纬度以及宽度和高度。我添加覆盖如下。

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); 

所以你必须给布局规划初始值begin.Then我添加了两个标志,一个位于覆盖中心(同纬度/经度),另一种沿右侧边缘的中心位于覆盖图(mSizeMarker)。确保它们是可拖动的。我不得不做一些数学弄清楚在何处放置在右边缘的一个。

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); 

所有剩下的就是添加一个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)); 
      } 
     } 
    }); 

使用中间的标记拖到你想要的布局图被定位,而一个,就可以改变宽度的右侧(高度会自动更新)。

然后,当图像被正确地定位,只是有一个保存按钮的地方,其中所述布图规划存储与位置,宽度和mOverlay的高度的更新。可以添加另一个标记来手动调整方位,但这比我现在需要做的更多的数学。当我最初设置它时,我会继续调整它。希望这可以帮助别人谁沿着这问题就来了,我知道这个解决方案是对我工作的伟大至今。