docs: def buffer(self,
                 geometries,
                 inSR,
                 distances,
                 units,
                 outSR=None,
                 bufferSR=None,
                 unionResults=True,
                 geodesic=True
                 ):
          """
             The buffer operation is performed on a geometry service resource
             The result of this operation is buffered polygons at the
             specified distances for the input geometry array. Options are
             available to union buffers and to use geodesic distance.
  
             Inputs:
               geometries - array of geometries (structured as JSON geometry 
                            objects returned by the ArcGIS REST API).
               inSR - spatial reference of the input geometries WKID.
               outSR - spatial reference for the returned geometries.
               bufferSR - WKID or a spatial reference JSON object in 
                          which the geometries are buffered.
               distances - distances that each of the input geometries is buffered
               unit - units for calculating each buffer distance.
               unionResults - if true, all geometries buffered at a given distance 
                              are unioned into a single (possibly multipart) polygon, 
                              and the unioned geometry is placed in the output array.
               geodesic - set geodesic to true to buffer the using geodesic distance.
          """
          url = self._url + "/buffer"
          params = {
              "f" : "json",
              "inSR" : inSR,
              "geodesic" : geodesic,
              "unionResults" : unionResults
          }
          if isinstance(geometries, list) and len(geometries) > 0:
              g = geometries[0]
              if isinstance(g, Polygon):
                  params['geometries'] = {"geometryType": "esriGeometryPolygon",
                                          "geometries" : self.__geomToStringArray(geometries, "list")}
              elif isinstance(g, Point):
                  params['geometries'] = {"geometryType": "esriGeometryPoint",
                                          "geometries" : self.__geomToStringArray(geometries, "list")}
              elif isinstance(g, Polyline):
                  params['geometries'] = {"geometryType": "esriGeometryPolyline",
                                                          "geometries" : self.__geomToStringArray(geometries, "list")}
          else:
              return None
          if isinstance(distances, list):
              distances = [str(d) for d in distances]
  
              params['distances'] = ",".join(distances)
          else:
              params['distances'] = str(distances)
          params['units'] = units
          if bufferSR is not None:
              params['bufferSR'] = bufferSR
          if outSR is not None:
              params['outSR'] = outSR
          return self._get(url, param_dict=params,
                              proxy_port=self._proxy_port,
                              securityHandler=self._securityHandler,
                              proxy_url=self._proxy_url)