code: def location_scatterplot(
      locations=None,
      samples=None,
      ids=None,
      labels=None,
      sizes=None,
      classes=None,
      map_type="satellite",
      show_scale_bar=False,
      api_key=None,
      marker_size=None,
      cmap=None,
      title=None,
      ax=None,
      ax_equal=False,
      figsize=None,
      style=None,
      buttons=None,
      **kwargs,
  ):
      """Generates an interactive scatterplot of the given location coordinates
      with a map rendered in the background of the plot.
  
      Location data is specified via the ``locations`` parameter.
  
      You can attach plots generated by this method to an App session via its
      :attr:`fiftyone.core.session.Session.plots` attribute, which will
      automatically sync the session's view with the currently selected points in
      the plot. To enable this functionality, you must pass ``samples`` to this
      method.
  
      You can use the ``labels`` parameters to define a coloring for the points,
      and you can use the ``sizes`` parameter to scale the sizes of the points.
  
      Args:
          locations (None): the location data to plot. Can be any of the
              following:
  
              -   None, in which case ``samples`` must have a single
                  :class:`fiftyone.core.labels.GeoLocation` field whose ``point``
                  attribute contains location data
              -   a ``num_locations x 2`` array-like of ``(longitude, latitude)``
                  coordinates
              -   the name of a :class:`fiftyone.core.labels.GeoLocation` field
                  of ``samples`` with ``(longitude, latitude)`` coordinates in
                  its ``point`` attribute
          samples (None): the :class:`fiftyone.core.collections.SampleCollection`
              whose data is being visualized
          ids (None): an array-like of IDs corresponding to the locations. If not
              provided but ``samples`` are provided, the appropriate IDs will be
              extracted from the samples
          labels (None): data to use to color the points. Can be any of the
              following:
  
              -   the name of a sample field or ``embedded.field.name`` of
                  ``samples`` from which to extract numeric or string values
              -   a :class:`fiftyone.core.expressions.ViewExpression` defining
                  numeric or string values to compute from ``samples`` via
                  :meth:`fiftyone.core.collections.SampleCollection.values`
              -   an array-like of numeric or string values
          sizes (None): data to use to scale the sizes of the points. Can be any
              of the following:
  
              -   the name of a sample field or ``embedded.field.name`` of
                  ``samples`` from which to extract numeric values
              -   a :class:`fiftyone.core.expressions.ViewExpression` defining
                  numeric values to compute from ``samples`` via
                  :meth:`fiftyone.core.collections.SampleCollection.values`
              -   an array-like of numeric values
          classes (None): a list of classes whose points to plot. Only applicable
              when ``labels`` contains strings
          map_type ("satellite"): the map type to render. Supported values are
              ``("roadmap", "satellite", "hybrid", "terrain")``
          show_scale_bar (False): whether to render a scale bar on the plot
          api_key (None): a Google Maps API key to use
          marker_size (None): the marker size to use. If ``sizes`` are provided,
              this value is used as a reference to scale the sizes of all points
          cmap (None): a colormap recognized by ``matplotlib``
          title (None): a title for the plot
          ax (None): a matplotlib axis to plot in
          ax_equal (False): whether to set ``axis("equal")``
          figsize (None): a ``(width, height)`` for the figure, in inches
          style (None): a style to use for the plot
          buttons (None): a list of ``(label, icon_image, callback)`` tuples
              defining buttons to add to the plot
          **kwargs: optional keyword arguments for matplotlib's ``scatter()``
  
      Returns:
          one of the following
  
          -   an :class:`InteractiveCollection`, if IDs are available
          -   a matplotlib figure, otherwise
      """
      locations = parse_locations(locations, samples, ids=ids)
  
      if ax is None:
          fig = plt.figure()
          ax = fig.add_subplot(111)
      else:
          fig = ax.figure
  
      locations = _plot_map_background(
          ax, locations, api_key, map_type, show_scale_bar
      )
  
      def _onclick(event):
          for child in ax.get_children():
              if isinstance(child, mpl.image.AxesImage):
                  child.set_visible(not child.get_visible())
  
          ax.figure.canvas.draw_idle()
  
      if buttons is None:
          buttons = []
  
      map_icon = load_button_icon("map")
      buttons.append(("map", map_icon, _onclick))
  
      return scatterplot(
          locations,
          samples=samples,
          ids=ids,
          labels=labels,
          sizes=sizes,
          classes=classes,
          marker_size=marker_size,
          cmap=cmap,
          title=title,
          ax=ax,
          ax_equal=ax_equal,
          figsize=figsize,
          style=style,
          buttons=buttons,
          **kwargs,
      )
  
imports: import itertools
  import logging
  import numpy
  import matplotlib
  from matplotlib.widgets import Button, LassoSelector
  from matplotlib.path import Path
  import matplotlib.pyplot
  from mpl_toolkits.axes_grid1 import make_axes_locatable
  from mpl_toolkits.axes_grid1.inset_locator import InsetPosition
  from mpl_toolkits.mplot3d import Axes3D
  import sklearn.metrics.pairwise
  import sklearn.metrics
  import eta.core.utils
  import fiftyone.core.context
  import fiftyone.core.utils
  from .base import InteractivePlot
  from .utils import best_fit_line, load_button_icon, parse_lines_inputs, parse_locations, parse_scatter_inputs
label_desc: Use image node_id 8 for calling a global function with example usage: location_scatterplot(locations, samples, ids, labels, sizes, classes, map_type, show_scale_bar, api_key, marker_size, cmap, title, ax, ax_equal, figsize, style, buttons) and returns: scatterplot