code: public function contains(Coordinate $point): bool
      {
          $numberOfPoints = $this->getNumberOfPoints();
          $polygonLats    = $this->getLats();
          $polygonLngs    = $this->getLngs();
  
          $polygonContainsPoint = false;
  
          for ($node = 0, $altNode = ($numberOfPoints - 1); $node < $numberOfPoints; $altNode = $node ++) {
              if (($polygonLngs[$node] > $point->getLng() !== ($polygonLngs[$altNode] > $point->getLng()))
                  && ($point->getLat() < ($polygonLats[$altNode] - $polygonLats[$node])
                                         * ($point->getLng() - $polygonLngs[$node])
                                         / ($polygonLngs[$altNode] - $polygonLngs[$node])
                                         + $polygonLats[$node]
                  )
              ) {
                  $polygonContainsPoint = ! $polygonContainsPoint;
              }
          }
  
          return $polygonContainsPoint;
      }
docs: Determine if given point is contained inside the polygon. Uses the PNPOLY
  algorithm by W. Randolph Franklin. Therfore some edge cases may not give the
  expected results, e. g. if the point resides on the polygon boundary.
  
  @see http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
  
  For special cases this calculation leads to wrong results:
  
  - if the polygons spans over the longitude boundaries at 180/-180 degrees
  
  @param Coordinate $point
  
  @return bool