PolyUtil.containsLocation 没有按预期工作

PolyUtil.containsLocation doesn't work as expected

我做了一个简单的测试:

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

工作原理如下:

  1. 我创建了一个特定点 (city),我想测试它是否在多边形内,
  2. 我将多边形声明为 4 个点,边界为 2 个点(东北 和西南)。

输出为:

contains1: false
contains2: true

为什么 PolyUtil.containsLocation returns 错误?我在这里错过了什么?这很简单,你可以在 google 地图上测试这些点。

PolyUtil 是 class 来自 android 地图的实用工具,由 Google 提供:'com.google.maps.android:android-maps-utils:0.5'

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

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

如您所见,城市确实在多边形之外,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);

您可以在 https://github.com/xomena-so/so44523611

找到我用来创建屏幕截图的示例项目

希望对您有所帮助!