latLngIsInPolygon static method
判断坐标点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;
}