class_docstr: Implements custom _get_projection method to make the coordinate
  reference system available to HoloViews plots as a projection.
code: def _get_projection(self, obj):
      # Look up custom projection in options
      isoverlay = lambda x: isinstance(x, CompositeOverlay)
      opts = self._traverse_options(
          obj,
          "plot",
          ["projection", "infer_projection"],
          [CompositeOverlay, Element],
          keyfn=isoverlay,
          defaults=False,
      )
      from_overlay = not all(
          p is None for p in opts.get(True, {}).get("projection", [])
      )
      projections = opts.get(from_overlay, {}).get("projection", [])
      infer = (
          any(opts.get(from_overlay, {}).get("infer_projection", []))
          or self.infer_projection
      )
      custom_projs = [p for p in projections if p is not None]
  
      if len(set([type(p) for p in custom_projs])) > 1:
          raise Exception(
              "An axis may only be assigned one projection type"
          )
      elif custom_projs:
          return custom_projs[0]
      if not infer:
          return self.projection
  
      # If no custom projection is supplied traverse object to get
      # the custom projections and sort by precedence
      projections = sorted(
          [
              p
              for p in obj.traverse(_get_projection, [Element])
              if p is not None and p[1] is not None
          ]
      )
      if projections:
          return projections[0][1]
      else:
          return None
  
file_path: geoviews/geoviews/plotting/plot.py
imports: import param
  import numpy
  from holoviews.core import CompositeOverlay, Element
  from ..util import project_extents
label_desc: Use image node_id 1 for calling the ProjectionPlot obj's underlying member method code with example usage: obj._get_projection(obj) and returns: self, projections, None, custom_projs