docs: def _geocode(self, pq):
          """
          :arg PlaceQuery pq: PlaceQuery object to use for geocoding
          :returns: list of location Candidates
          """
          #: List of desired output fields
          #: See `ESRI docs <https://developers.arcgis.com/rest/geocode/api-reference/geocoding-geocode-addresses.htm>_` for details
          outFields = ('Loc_name',
                       # 'Shape',
                       'Score',
                       'Match_addr',  # based on address standards for the country
                       # 'Address', # returned by default
                       # 'Country' # 3-digit ISO 3166-1 code for a country. Example: Canada = "CAN"
                       # 'Admin',
                       # 'DepAdmin',
                       # 'SubAdmin',
                       # 'Locality',
                       # 'Postal',
                       # 'PostalExt',
                       'Addr_type',
                       # 'Type',
                       # 'Rank',
                       'AddNum',
                       'StPreDir',
                       'StPreType',
                       'StName',
                       'StType',
                       'StDir',
                       # 'Side',
                       # 'AddNumFrom',
                       # 'AddNumTo',
                       # 'AddBldg',
                       'City',
                       'Subregion',
                       'Region',
                       'Postal',
                       'Country',
                       # 'Ymax',
                       # 'Ymin',
                       # 'Xmin',
                       # 'Xmax',
                       # 'X',
                       # 'Y',
                       'DisplayX',
                       'DisplayY',
                       # 'LangCode',
                       # 'Status',
                       )
          outFields = ','.join(outFields)
          query = dict(f='json',  # default HTML. Other options are JSON and KMZ.
                       outFields=outFields,
                       # outSR=WKID, defaults to 4326
                       maxLocations=20,  # default 1; max is 20
                       )
  
          # Postal-code only searches work in the single-line but not multipart geocoder
          # Remember that with the default postprocessors, postcode-level results will be eliminated
          if pq.query == pq.address == '' and pq.postal != '':
              pq.query = pq.postal
  
          if pq.query == '':  # multipart
              query = dict(query,
                           Address=pq.address,  # commonly represents the house number and street name of a complete address
                           Neighborhood=pq.neighborhood,
                           City=pq.city,
                           Subregion=pq.subregion,
                           Region=pq.state,
                           Postal=pq.postal,
                           # PostalExt=
                           CountryCode=pq.country,  # full country name or ISO 3166-1 2- or 3-digit country code
                           )
          else:  # single-line
              magic_key = pq.key if hasattr(pq, 'key') else ''
              query = dict(query,
                           singleLine=pq.query,  # This can be a street address, place name, postal code, or POI.
                           sourceCountry=pq.country,  # full country name or ISO 3166-1 2- or 3-digit country code
                           )
              if magic_key:
                  query['magicKey'] = magic_key  # This is a lookup key returned from the suggest endpoint.
  
          if pq.bounded and pq.viewbox is not None:
              query = dict(query, searchExtent=pq.viewbox.to_esri_wgs_json())
  
          if self._authenticated:
              if self._token is None or self._token_expiration < datetime.utcnow():
                  expiration = timedelta(hours=2)
                  self._token = self.get_token(expiration)
                  self._token_expiration = datetime.utcnow() + expiration
  
              query['token'] = self._token
  
          if getattr(pq, 'for_storage', False):
              query['forStorage'] = 'true'
  
          endpoint = self._endpoint + '/findAddressCandidates'
          response_obj = self._get_json_obj(endpoint, query)
          returned_candidates = []  # this will be the list returned
          try:
              locations = response_obj['candidates']
              for location in locations:
                  c = Candidate()
                  attributes = location['attributes']
                  c.match_addr = attributes['Match_addr']
                  c.locator = attributes['Loc_name']
                  c.locator_type = attributes['Addr_type']
                  c.score = attributes['Score']
                  c.x = attributes['DisplayX']  # represents the actual location of the address.
                  c.y = attributes['DisplayY']
                  c.wkid = response_obj['spatialReference']['wkid']
                  c.geoservice = self.__class__.__name__
  
                  # Optional address component fields.
                  for in_key, out_key in [('City', 'match_city'), ('Subregion', 'match_subregion'),
                                          ('Region', 'match_region'), ('Postal', 'match_postal'),
                                          ('Country', 'match_country')]:
                      setattr(c, out_key, attributes.get(in_key, ''))
                  setattr(c, 'match_streetaddr', self._street_addr_from_response(attributes))
                  returned_candidates.append(c)
          except KeyError:
              pass
          return returned_candidates