草庐IT

Android Maps API v2 画圈

coder 2023-06-09 原文

使用以下代码绘制圆圈(取自 Google Play 服务“ map ”示例):

    PolylineOptions options = new PolylineOptions();
    int radius = 5; //What is that?
    int numPoints = 100;
    double phase = 2 * Math.PI / numPoints;
    for (int i = 0; i <= numPoints; i++) {
        options.add(new LatLng(SYDNEY.latitude + radius * Math.sin(i * phase),
                SYDNEY.longitude + radius * Math.cos(i * phase)));
    }
    int color = Color.RED;
    mMap.addPolyline(options
            .color(color)
            .width(2));

这是在世界不同地区绘制的:

如你所见,圆圈并不是真正的圆圈,甚至第二个基本上都是椭圆。

我猜想圆的“抗锯齿”取决于 int numPoints 变量中的点数。

  1. 示例代码中的 int radius = 5 变量是什么?我的意思是它是什么衡量标准?
  2. 主要问题是用给定半径绘制漂亮圆圈的正确方法是什么?类似于我们在 api v1 中使用 canvas.drawCircle()
  3. 的东西

更新--------

好的,在提高数学后我能够画出“正确”的圆圈:

private void addCircle(LatLng latLng, double radius)
    {
        double R = 6371d; // earth's mean radius in km
        double d = radius/R; //radius given in km
        double lat1 = Math.toRadians(latLng.latitude);
        double lon1 = Math.toRadians(latLng.longitude);         
        PolylineOptions options = new PolylineOptions();
        for (int x = 0; x <= 360; x++)
        {                      
            double brng = Math.toRadians(x);
            double latitudeRad = Math.asin(Math.sin(lat1)*Math.cos(d) + Math.cos(lat1)*Math.sin(d)*Math.cos(brng));
            double longitudeRad = (lon1 + Math.atan2(Math.sin(brng)*Math.sin(d)*Math.cos(lat1), Math.cos(d)-Math.sin(lat1)*Math.sin(latitudeRad)));             
            options.add(new LatLng(Math.toDegrees(latitudeRad), Math.toDegrees(longitudeRad)));
        }           
        mMap.addPolyline(options.color(Color.BLACK).width(2));          
    }

但是我猜圆圈的抗锯齿有点无法控制,并且在一些缩放级别上,圆圈可能会变得丑陋:

最佳答案

Google 制作的 map v2 很简单。下面的代码 fragment 演示了绘制标记和圆圈以及一起更新它们的位置。

private Circle mCircle;
private Marker mMarker;
private GoogleMap mGoogleMap;

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

    mGoogleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.mapFragment)).getMap();
    mGoogleMap.setMyLocationEnabled(true);
    mGoogleMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() {
        @Override
        public void onMyLocationChange(Location location) {
            LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
            if(mCircle == null || mMarker == null){
                drawMarkerWithCircle(latLng);
            }else{
                updateMarkerWithCircle(latLng);
            }
        }
    });
}

private void updateMarkerWithCircle(LatLng position) {
    mCircle.setCenter(position);
    mMarker.setPosition(position);
}

private void drawMarkerWithCircle(LatLng position){
    double radiusInMeters = 100.0;
    int strokeColor = 0xffff0000; //red outline
    int shadeColor = 0x44ff0000; //opaque red fill

    CircleOptions circleOptions = new CircleOptions().center(position).radius(radiusInMeters).fillColor(shadeColor).strokeColor(strokeColor).strokeWidth(8);
    mCircle = mGoogleMap.addCircle(circleOptions);

    MarkerOptions markerOptions = new MarkerOptions().position(position);
    mMarker = mGoogleMap.addMarker(markerOptions);
}

关于Android Maps API v2 画圈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13991301/

有关Android Maps API v2 画圈的更多相关文章

  1. android - 使用 Android Camera2 API 进行人脸检测和画圈 - 2

    目前我正在尝试将Camera2.Face转换为实际View的矩形,以便在Camera2API检测到的面部上绘制圆圈。我可以通过以下代码将人脸数量及其数据获取到回调中:privateCameraCaptureSession.CaptureCallbackmCaptureCallback=newCameraCaptureSession.CaptureCallback(){privatevoidprocess(CaptureResultresult){Integermode=result.get(CaptureResult.STATISTICS_FACE_DETECT_MODE);Face[

  2. Android在文本周围画圈 - 2

    我有一个textView,其中包含一个字符(所有单个数字,数字0-9)。我想在数字周围画一个圆圈或一个正方形。我看到一个线程提到使用9-patch来围绕它设置样式,但我不确定如何做到这一点(或者它是否是最好的方法)。我怎样才能在数字周围有一个圆圈?谢谢 最佳答案 只需要像这样创建一个圆形可绘制对象并将这个drawable设置为你的TextView背景。 关于Android在文本周围画圈,我们在StackOverflow上找到一个类似的问题: https://s

  3. Android在文本周围画圈 - 2

    我有一个textView,其中包含一个字符(所有单个数字,数字0-9)。我想在数字周围画一个圆圈或一个正方形。我看到一个线程提到使用9-patch来围绕它设置样式,但我不确定如何做到这一点(或者它是否是最好的方法)。我怎样才能在数字周围有一个圆圈?谢谢 最佳答案 只需要像这样创建一个圆形可绘制对象并将这个drawable设置为你的TextView背景。 关于Android在文本周围画圈,我们在StackOverflow上找到一个类似的问题: https://s

  4. Android Maps API v2 画圈 - 2

    使用以下代码绘制圆圈(取自GooglePlay服务“map”示例):PolylineOptionsoptions=newPolylineOptions();intradius=5;//Whatisthat?intnumPoints=100;doublephase=2*Math.PI/numPoints;for(inti=0;i这是在世界不同地区绘制的:如你所见,圆圈并不是真正的圆圈,甚至第二个基本上都是椭圆。我猜想圆的“抗锯齿”取决于intnumPoints变量中的点数。示例代码中的intradius=5变量是什么?我的意思是它是什么衡量标准?主要问题是用米给定半径绘制漂亮圆圈的正确方

  5. Android Maps API v2 画圈 - 2

    使用以下代码绘制圆圈(取自GooglePlay服务“map”示例):PolylineOptionsoptions=newPolylineOptions();intradius=5;//Whatisthat?intnumPoints=100;doublephase=2*Math.PI/numPoints;for(inti=0;i这是在世界不同地区绘制的:如你所见,圆圈并不是真正的圆圈,甚至第二个基本上都是椭圆。我猜想圆的“抗锯齿”取决于intnumPoints变量中的点数。示例代码中的intradius=5变量是什么?我的意思是它是什么衡量标准?主要问题是用米给定半径绘制漂亮圆圈的正确方

随机推荐