使用Polygon在整个地图上绘制一个矩形

戴维

我一直试图在Android Studio中在整个地图上(在地图活动中)绘制一个矩形,我需要从地图的一部分到另一部分的赤道区域的划界。(在一个大矩形中)但是每当我放置该矩形的坐标时,它都会沿相反方向移动,因此它会向后移动,并从太平洋到中国,澳大利亚再返回一个小正方形。

另外,有什么想法可以使按钮在地图上呈现一个国家的形状吗?

package com.example.android.coffeeknowledge;

import android.content.res.Resources;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.util.Log;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MapStyleOptions;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.Polygon;
import com.google.android.gms.maps.model.PolygonOptions;
import com.google.android.gms.maps.model.PolylineOptions;

public class coffeeMap extends FragmentActivity implements OnMapReadyCallback {

private GoogleMap mMap;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_coffee_map);
    // Obtain the SupportMapFragment and get notified when the map is ready to be used.
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
}

/**
 * Manipulates the map once available.
 * This callback is triggered when the map is ready to be used.
 * This is where we can add markers or lines, add listeners or move the camera. In this case,
 * we just add a marker near Sydney, Australia.
 * If Google Play services is not installed on the device, the user will be prompted to install
 * it inside the SupportMapFragment. This method will only be triggered once the user has
 * installed Google Play services and returned to the app.
 */
private static final LatLng cameraZoom = new LatLng(37.35, -122.0);
@Override
public void onMapReady(GoogleMap googleMap) {
    try{
        boolean success = googleMap.setMapStyle(
            MapStyleOptions.loadRawResourceStyle(this, R.raw.mapstyle));
            if(!success){
                Log.e("coffeeMap","Style parsing failed.");
            }

        }catch(Resources.NotFoundException e){
        Log.e("coffeeMap", "Can`t find style.Error: " , e);
    }

    mMap = googleMap;
   // Instantiates a new Polygon object and adds points to define a rectangle
    PolygonOptions rectOptions = new PolygonOptions()
            .fillColor(R.color.white)
            .add(new LatLng(24.376368, 101.181309),
                    new LatLng(-28.912738, 103.818027),
                    new LatLng(-26.841671, -117.944509),
                    new LatLng(27.616242, -122.020003),
                    new LatLng(24.376368, 101.181309));
            // Get back the mutable Polygon
    Polygon polygon = mMap.addPolygon(rectOptions);
    // Add a marker in Sydney and move the camera
    //mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(cameraZoom, 13));
    LatLng sydney = new LatLng(35.175321, -107.619365);
    mMap.addMarker(new MarkerOptions().position(sydney).title("Marker"));
 }
 }

图片

谢谢。

安迪

考虑到测地线路径或矩形投影,地图api始终会选择2个点之间的最短路径。您的示例中感兴趣的细分为:

new LatLng(-28.912738, 103.818027),   // A
new LatLng(-26.841671, -117.944509),  // B

new LatLng(27.616242, -122.020003),   // C
new LatLng(24.376368, 101.181309))    // D

这两个线段将穿过反子午线(并且不会反过来),因为这是这两点之间的最短路径。(这始终是需要的。)

因此,要在您的示例中克服这一问题,只需在线段(AB和CD)中添加一个中间的中点(假定非大地测量或矩形投影),以迫使其“朝另一方向走”。以AB为例:

new LatLng(-28.912738, 103.818027),
new LatLng(-27.877204, -7.0),        // approximate midpoint in desired direction (M)
new LatLng(-26.841671, -117.944509),

因此,距AB(假设测地线)的原始距离为12830 km。强制中间点为:AM 10320km和MB 10460km。这些距离计算仅用于说明该点(双关目标)。

相同的方法适用于CD。


因此,在图片中,您的OP视图使用:

PolygonOptions rectOptions = new PolygonOptions()
    .fillColor(R.color.colorPrimary)
            .add(new LatLng(24.376368, 101.181309),
                 new LatLng(-28.912738, 103.818027),
                 new LatLng(-26.841671, -117.944509),
                 new LatLng(27.616242, -122.020003),
                 new LatLng(24.376368, 101.181309));

显示为:

在此处输入图片说明

并具有2个中间点:

    PolygonOptions rectOptions = new PolygonOptions()
            .fillColor(R.color.colorPrimary)
            .add(new LatLng(24.376368, 101.181309),
                    new LatLng(-28.912738, 103.818027),
                    new LatLng(-27.877204, -7.0),
                    new LatLng(-26.841671, -117.944509),
                    new LatLng(27.616242, -122.020003),
                    new LatLng( 25.9, -7.0),
                    new LatLng(24.376368, 101.181309));

显示为:

在此处输入图片说明

只是为了好玩,并强调中点确定取决于投影,以下是使用测地线的同一多边形:

在此处输入图片说明

再过一天,要找到跨越大于pi弧度的弧的2个点的球面中点是一个问题...

一个方便在线的工具,需要更多考虑:https : //www.movable-type.co.uk/scripts/latlong.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用iText在PDF文档中绘制一个矩形

在屏幕中央绘制一个矩形

在同一个HTML页面Google地图上使用initMap和initAutocomplete

在地图上获取下一个值?

如何绘制一个半圆的矩形?

使用最大/最小坐标在地图上绘制矩形边界框

如何在pygame中的另一个矩形的中心绘制一个矩形?

画家在另一个矩形内绘制RoundedRect

ReactJS从地图上唯一选择一个元素

在pyqtgraph中绘制一个矩形

如何在ggplot中的地图上绘制等宽的矩形

如何使用另一个位图作为蒙版在位图上绘制?

将多个矩形绘制到一个JPanel

启动页面时,在区域图上的特定位置绘制一个矩形

仅从我的阵列在地图上显示一个图钉

尝试使用JPanel绘制一个简单的矩形,但没有任何显示

画布仅在地图上绘制循环的最后一个元素

QT5:使用drawPixMap()在另一个矩形的顶部绘制矩形

使用jQuery在SVG地图上仅选择一个区域

在地图上绘制新圆之前先删除上一个圆

如何从地图上清除上一个圆圈

如何使用数据框中的不同列在一个图上绘制多个图?

使用 Core Graphics 在 UIImageView 上绘制一个矩形

无法获得地图上绘制矩形的边界

在地图上的一个点周围绘制缓冲区 - RS SF

试图绘制一个矩形(位图)

如何在地图上绘制多个圆形和矩形?

我必须在地图上实现一个矩形和多边形。将矩形分成网格,删除所有不属于多边形的网格

在地图上绘制 df - 两个图而不是一个