PolyUtil.containsLocation无法按预期工作

Mak*_*ele 6 java android google-maps google-maps-android-api-2

我做了一个简单的测试:

LatLng city = new LatLng(53.121896, 18.010110);

List<LatLng> pts = new ArrayList<>();
pts.add(new LatLng(53.520790, 17.404158));
pts.add(new LatLng(53.450445, 19.209022));
pts.add(new LatLng(52.659365, 17.656366));
pts.add(new LatLng(52.525305, 19.303601));

LatLngBounds bounds = new LatLngBounds(pts.get(2), pts.get(1));

boolean contains1 = PolyUtil.containsLocation(city.latitude, city.longitude, pts, true);
System.out.println("contains1: " + contains1);

boolean contains2 = bounds.contains(city);
System.out.println("contains2: " + contains2);
Run Code Online (Sandbox Code Playgroud)

下面是它的工作原理:

  1. 我创建了一个特定的point(city),我想测试它是否在多边形内,
  2. 我宣布一个多边形为4个点并且边界为2个点(东北和西南).

输出是:

contains1: false
contains2: true
Run Code Online (Sandbox Code Playgroud)

为什么PolyUtil.containsLocation返回false?我在这里错过了什么?这很简单,你可以在谷歌地图上测试这些点.

PolyUtil是Google提供的android maps utils类: 'com.google.maps.android:android-maps-utils:0.5'

xom*_*ena 14

您应该按正确的顺序定义多边形的顶点.让我们用屏幕截图来解释,因为图片价值千言万语.目前,您有多边形的以下顶点

在此输入图像描述

如果您尝试从示例中为数组列表绘制多边形,您将看到以下多边形.

在此输入图像描述

正如您所看到的,实际上城市位于多边形之外,PolyUtil提供了正确的结果.同时,您可以使用西南和东北顶点正确定义边界,因此城市位于边界内.要解决此问题,您应该在示例中交换第3点和第4点.

LatLng city = new LatLng(53.121896, 18.010110);

List<LatLng> pts = new ArrayList<>();
pts.add(new LatLng(53.520790, 17.404158));
pts.add(new LatLng(53.450445, 19.209022));
pts.add(new LatLng(52.525305, 19.303601));
pts.add(new LatLng(52.659365, 17.656366));

bounds = new LatLngBounds(pts.get(3), pts.get(1));

boolean contains1 = PolyUtil.containsLocation(city.latitude, city.longitude, pts, true);
System.out.println("contains1: " + contains1);

boolean contains2 = bounds.contains(city);
System.out.println("contains2: " + contains2);
Run Code Online (Sandbox Code Playgroud)

您可以在https://github.com/xomena-so/so44523611找到我用于创建屏幕截图的示例项目

我希望这有帮助!