latLngIsInPolygon static method

bool latLngIsInPolygon(
  1. LatLng latLng,
  2. List<LatLng> latLngList
)

判断坐标点latLng是否在多边形latLngList

Implementation

static bool latLngIsInPolygon(LatLng latLng, List<LatLng> latLngList) {
  if (latLngList.length < 3) {
    return false;
  }

  // 复制一份多边形顶点,避免修改调用方传入的列表
  final List<LatLng> polygon = List<LatLng>.of(latLngList);
  if (polygon.first != polygon.last) {
    polygon.add(polygon.first);
  }

  bool isInside = false;
  int count = 0;
  final double linePoint1x = latLng.longitude;
  final double linePoint1y = latLng.latitude;
  const double linePoint2x = 180;
  final double linePoint2y = latLng.latitude;

  for (int i = 0; i < polygon.length - 1; i++) {
    final double cx1 = polygon[i].longitude;
    final double cy1 = polygon[i].latitude;
    final double cx2 = polygon[i + 1].longitude;
    final double cy2 = polygon[i + 1].latitude;
    if (_isPointOnLine(linePoint1x, linePoint1y, cx1, cy1, cx2, cy2)) {
      return true;
    }
    if ((cy2 - cy1).abs() < ESP) {
      continue;
    }

    if (_isPointOnLine(
        cx1, cy1, linePoint1x, linePoint1y, linePoint2x, linePoint2y)) {
      if (cy1 > cy2) {
        count++;
      }
    } else if (_isPointOnLine(
        cx2, cy2, linePoint1x, linePoint1y, linePoint2x, linePoint2y)) {
      if (cy2 > cy1) {
        count++;
      }
    } else if (_isIntersect(cx1, cy1, cx2, cy2, linePoint1x, linePoint1y,
        linePoint2x, linePoint2y)) {
      count++;
    }
  }
  if (count % POINT_ELEMENT_SIZE != 0) {
    isInside = true;
  }

  return isInside;
}