2017-01-24 4 views
2

Я enter image description hereКак повернуть многоугольник с заданным углом в карте Google Android

Я работаю на приложении, где я должен нарисовать несколько многоугольников фиксированных размеров по щелчку позволяет рассмотреть, например, 10 х 25, так что я архивировал успешно теперь мне нужно повернуть выбранный многоугольник под заданным углом (пусть считать от 0 до 360), когда я нажимаю кнопку +, полигон должен вращаться в правильном направлении с добавлением 1 градусного угла, аналогично нажав на кнопку, нужно вращать многоугольник в левом направлении есть идея, как этого добиться?

добавление некоторого кода для рассмотрения.

public void drawPolygonWithGivenDimention(LatLng latLng,float width,float height,float innerDistance,boolean forUpdate,int id) 
{ 
    model = new ModelMarker(); 

    model.setId(id); 

    // Paras Outer Polygon 
    Location clickedPoint = new Location("clicked"); 
    clickedPoint.setLatitude(latLng.latitude); 
    clickedPoint.setLongitude(latLng.longitude); 

    LatLng latLng0 = new LatLng(clickedPoint.getLatitude(), clickedPoint.getLongitude()); 
    pointList.add(latLng0); 

    Location loc1 = locationForAngle(0.0f, clickedPoint, width); 
    LatLng latLng1 = new LatLng(loc1.getLatitude(), loc1.getLongitude()); 
    pointList.add(latLng1); 

    Location loc2 = locationForAngle(90.0f, loc1, height); 
    LatLng latLng2 = new LatLng(loc2.getLatitude(), loc2.getLongitude()); 
    pointList.add(latLng2); 

    Location loc3 = locationForAngle(180.0f, loc2, width); 
    LatLng latLng3 = new LatLng(loc3.getLatitude(), loc3.getLongitude()); 
    pointList.add(latLng3); 

    model.setPointList(pointList); 


    // Paras Inner Polygon 
    Location locPeri = locationForAngle(0.0f,clickedPoint,innerDistance);//Change\ 
    locPeri = locationForAngle(90.0f ,locPeri,innerDistance); 

    LatLng latLng10 = new LatLng(locPeri.getLatitude(), locPeri.getLongitude()); 
    pointListInner.add(latLng10); 

    Location loc11 = locationForAngle(0.0f, locPeri, width-innerDistance*2); 
    LatLng latLng11 = new LatLng(loc11.getLatitude(), loc11.getLongitude()); 
    pointListInner.add(latLng11); 

    Location loc12 = locationForAngle(90.0f, loc11, height-innerDistance*2); 
    LatLng latLng12 = new LatLng(loc12.getLatitude(), loc12.getLongitude()); 
    pointListInner.add(latLng12); 

    Location loc13 = locationForAngle(180.0f, loc12, width-innerDistance*2); 
    LatLng latLng13 = new LatLng(loc13.getLatitude(), loc13.getLongitude()); 
    pointListInner.add(latLng13); 
    model.setPointListInner(pointListInner); 

    drawOuterPolygon(forUpdate); 
} 


private void drawOuterPolygon(boolean forUpdate) 
{ 
    try 
    { 
     pointList = model.getPointList(); 
     Polygon poligone; 
     PolygonOptions polygoneOptions = new PolygonOptions(); 
     polygoneOptions.addAll(pointList); 
     polygoneOptions.strokeWidth(2); 
     polygoneOptions.strokeColor(Color.BLACK); 

     polygoneOptions.fillColor(drawColor); 

     poligone = googleMap.addPolygon(polygoneOptions); 
     poligone.setClickable(true); 
     if(forUpdate) 
      polygons.set(selectedMarkerPosition,poligone); 
     else 
      polygons.add(poligone); 


     model.setPolygon(poligone); 
     model.setPolygons(polygons); 

     drawInnerPolygon(forUpdate); 
     //getCenterPoint(); 

    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

public Location locationForAngle(float angle,Location center,float distances) 
{ 
    //in Yard 6975174.98 radius of earth 
    double distanceRadians = distances/6967410.0; // Yards 
    //6,371 = Earth's radius in km 
    double bearingRadians = deg2rad(angle); 
    double fromLatRadians = deg2rad(center.getLatitude()); 
    double fromLonRadians = deg2rad(center.getLongitude()); 
    double toLatRadians = Math.asin(Math.sin(fromLatRadians) * Math.cos(distanceRadians)+ Math.cos(fromLatRadians) * Math.sin(distanceRadians) * Math.cos(bearingRadians)); 
    double toLonRadians = fromLonRadians + Math.atan2(Math.sin(bearingRadians) * Math.sin(distanceRadians) * Math.cos(fromLatRadians), Math.cos(distanceRadians)- Math.sin(fromLatRadians) * Math.sin(toLatRadians)); 
    // adjust toLonRadians to be in the range -180 to +180... 
    toLonRadians = Math.IEEEremainder((toLonRadians + 3*M_PI), ((2*M_PI)) - M_PI); 
    Location result = new Location(""); 
    result.setLatitude(rad2deg(toLatRadians)); 
    result.setLongitude(rad2deg(toLonRadians)); 
    return result; 
} 

double M_PI = 3.14159265358979323846264338327950288; 

public double deg2rad(double degrees) 
{ 
    return (degrees * (M_PI/180)); 
} 
public double rad2deg(double radians) 
{ 
    return (radians * (180/M_PI)); 
} 

ответ

2

Если все маркеры имеют одинаковый размер и цвет (или там не так много различных маркеров), кажется, самые простой способ заключается в использовании Marker.setRotation() метода:

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback { 

    private static final LatLng MAP_CENTER = new LatLng(22.3038715,70.8009047); 

    private GoogleMap mGoogleMap; 
    private MapFragment mMapFragment; 

    private Button mButtonMinus; 
    private Button mButtonPlus; 

    private Marker mMarker; 

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

     mButtonMinus = (Button) findViewById(R.id.button_minus); 
     mButtonMinus.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       mMarker.setRotation(mMarker.getRotation() - 1); 
      } 
     }); 

     mButtonPlus = (Button) findViewById(R.id.button_plus); 
     mButtonPlus.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       mMarker.setRotation(mMarker.getRotation() + 1); 
      } 
     }); 

     mMapFragment = (MapFragment) getFragmentManager() 
       .findFragmentById(R.id.map_fragment); 
     mMapFragment.getMapAsync(this); 
    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mGoogleMap = googleMap; 

     mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(MAP_CENTER, 16)); 

     mMarker = mGoogleMap.addMarker(new MarkerOptions() 
       .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_marker_rot)) 
       .position(MAP_CENTER) 
       .alpha(0.75f) 
       .anchor(0.5f, 0.5f) 
       .rotation(0)); 
    } 

} 

где R.drawable.ic_marker_rot является Северо-ориентированным значком маркеров:

Marker icon

и activity_main.xml является:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="<your_package>.MainActivity"> 

    <fragment 
     android:id="@+id/map_fragment" 
     android:name="com.google.android.gms.maps.MapFragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

    <LinearLayout 
     android:id="@+id/buttons_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:orientation="horizontal"> 

     <Button 
      android:id="@+id/button_minus" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="-"/> 

     <Button 
      android:id="@+id/button_plus" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="+"/> 

    </LinearLayout> 

</RelativeLayout> 

В результате у вас есть что-то вроде этого:

Example of rotated marker

Если у вас есть несколько маркеров, нужно управлять им (добавить в список на создание, определить выбранный markerr и т.д.)

в другом случае (вам действительно нужно сделать каждый маркер) Самым простым способом для преобразования LatLng COORDS в экране: координаты

Projection projection = mGoogleMap.getProjection(); 
Point screenPosition = projection.toScreenLocation(mMarker.getPosition()); 

, чем применить поворот на Point (например, как в this ответа Entreco), чем конвертировать повернутую экрану COORDS (каждую точку прямоугольника) обратно в LatLng:

mGoogleMap.getProjection().fromScreenLocation(screenPosition); 

и нарисуйте прямоугольник, как вы уже рисовать.

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