docs: def line_intersects_itself(lons, lats, closed_shape=False):
      """
      Return ``True`` if line of points intersects itself.
      Line with the last point repeating the first one considered
      intersecting itself.
  
      The line is defined by lists (or numpy arrays) of points'
      longitudes and latitudes (depth is not taken into account).
  
      :param closed_shape:
          If ``True`` the line will be checked twice: first time with
          its original shape and second time with the points sequence
          being shifted by one point (the last point becomes first,
          the first turns second and so on). This is useful for
          checking that the sequence of points defines a valid
          :class:`~openquake.hazardlib.geo.polygon.Polygon`.
      """
      assert len(lons) == len(lats)
  
      if len(lons) <= 3:
          # line can not intersect itself unless there are
          # at least four points
          return False
  
      west, east, north, south = get_spherical_bounding_box(lons, lats)
      proj = OrthographicProjection(west, east, north, south)
  
      xx, yy = proj(lons, lats)
      if not shapely.geometry.LineString(list(zip(xx, yy))).is_simple:
          return True
  
      if closed_shape:
          xx, yy = proj(numpy.roll(lons, 1), numpy.roll(lats, 1))
          if not shapely.geometry.LineString(list(zip(xx, yy))).is_simple:
              return True
  
      return False