我做了一个简单的测试:

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

下面是它的工作原理:
  • 我创建了一个特定点(city),我想测试该点是否在多边形
  • 我声明了一个多边形为4个点,边界为2个点(东北
    和西南)。

  • 输出为:
    contains1: false
    contains2: true
    

    为什么PolyUtil.containsLocation返回false?我在这里想念什么?这很简单,您可以在Google map 上测试这些点。

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

    最佳答案

    您应该以正确的顺序定义多边形的顶点。让我们用屏幕截图来解释,因为图片值(value)一千个单词。当前,您具有以下多边形的顶点

    java - PolyUtil.containsLocation不能按预期工作-LMLPHP

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

    java - PolyUtil.containsLocation不能按预期工作-LMLPHP

    如您所见,确实城市在多边形之外,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上找到我用来创建屏幕截图的示例项目。

    我希望这有帮助!

    10-07 19:26