gpt4 book ai didi

android - 使用 Polygon 在整个 map 上绘制一个矩形

转载 作者:行者123 更新时间:2023-11-29 18:46:40 25 4
gpt4 key购买 nike

我一直在尝试在 Android Studio 的整个 map 上(在 map Activity 中)绘制一个矩形,我需要从 map 的一部分到另一部分的赤道区域的定界。 (在一个大矩形中)但是每次我输入矩形的坐标时,它都会以相反的方式移动,所以它向后移动并形成一个从太平洋到中国、澳大利亚再返回的小正方形。

此外,知道如何让按钮在 map 上显示国家/地区的形状吗?

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

images

谢谢。

最佳答案

考虑到测地线路径或矩形投影, map api 将始终选择两点之间的最短路线。您的示例中感兴趣的部分是:

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

这两条线段将穿过反子午线(而不是相反),因为那是这两点之间的最短路径。 (这始终是所希望的。)

因此,为了在您的示例中克服这个问题,只需在线段(A-B 和 C-D)中添加一个中间中点(假设为非测地线或矩形投影)以强制它“向另一条路”移动。以 A-B 为例:

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

所以 A-B 的原始距离(假设测地线)是 12830 公里。而强制中间点是:A-M 10320km和M-B 10460km。这些距离计算只是为了证明这一点(双关语)。

同样的方法适用于 C-D。


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

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

显示为:

enter image description here

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

显示为:

enter image description here

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

enter image description here

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

方便的在线工具以供更多考虑:https://www.movable-type.co.uk/scripts/latlong.html .

关于android - 使用 Polygon 在整个 map 上绘制一个矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51632312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com