class_docstr: A class of the plot layer object.
  
  Do not use this class explicitly.
  
  Instead, you should construct its objects with functions `geom_point()`,
  `geom_contour()`, `geom_boxplot()`, `geom_text()` etc.
class_docstr_tok: ["A","class","of","the","plot","layer","object",".","Do","not","use","this","class","explicitly",".","Instead",",","you","should","construct","its","objects","with","functions","`","geom_point","(",")","`",",","`","geom_contour","(",")","`",",","`","geom_boxplot","(",")","`",",","`","geom_text","(",")","`","etc","."]
code: def before_append(self, is_livemap):
      from .util import (
          normalize_map_join,
          is_geo_data_frame,
          auto_join_geo_names,
          geo_data_frame_to_crs,
          get_geo_data_frame_meta,
      )
      from lets_plot.geo_data_internals.utils import is_geocoder
  
      name = self.props()["geom"]
      map_join = self.props().get("map_join")
      map = self.props().get("map")
      map_data_meta = None
  
      if map_join is None and map is None:
          return
  
      map_join = normalize_map_join(map_join)
  
      if is_geocoder(map):
          if (
              is_livemap and get_global_bool(FRAGMENTS_ENABLED)
              if has_global_value(FRAGMENTS_ENABLED)
              else False
          ):
              map = map.get_geocodes()
              map_join = auto_join_geo_names(map_join, map)
              map_data_meta = {"georeference": {}}
          else:
              # Fetch proper GeoDataFrame. Further processing is the same as if map was a GDF.
              if name in ["point", "pie", "text", "livemap"]:
                  map = map.get_centroids()
              elif name in ["map", "polygon"]:
                  map = map.get_boundaries()
              elif name in ["rect"]:
                  map = map.get_limits()
              else:
                  raise ValueError(
                      "Geocoding doesn't provide geometries for geom_{}".format(
                          name
                      )
                  )
  
      if is_geo_data_frame(map):
          # map = geo_data_frame_to_crs(map, self.props().get('use_crs'))
          use_crs = self.props().get("use_crs")
          if use_crs != "provided":
              map = geo_data_frame_to_crs(map, use_crs)
          map_join = auto_join_geo_names(map_join, map)
          map_data_meta = get_geo_data_frame_meta(map)
  
      if map_join is not None:
          self.props()["map_join"] = map_join
  
      if map is not None:
          self.props()["map"] = map
  
      if map_data_meta is not None:
          self.props()["map_data_meta"] = map_data_meta
  
imports: import io
  import json
  import os
  from typing import Union
  from lets_plot._global_settings import get_global_bool, has_global_value, FRAGMENTS_ENABLED
label_desc: Use image node_id 3 for calling the LayerSpec obj's underlying member method code with example usage: obj.before_append(is_livemap) without return types