@googlemaps/google-maps-services-js
Version:
Node.js client library for Google Maps API Web Services
136 lines (126 loc) • 6.4 kB
text/typescript
/**
* Copyright 2020 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { AddressType, Language, LatLng, RequestParams } from "../common";
import { AxiosInstance, AxiosRequestConfig, AxiosResponse } from "axios";
import { GeocodeResult, ResponseData, AddressDescriptor } from "../common";
import { latLngToString, enableAddressDescriptorToString, serializer } from "../serialize";
import { defaultAxiosInstance } from "../client";
/**
* If both `result_type` and `location_type` filters are present then the API returns only those results that match both the
* `result_type` and the `location_type` values. If none of the filter values are acceptable, the API returns `ZERO_RESULTS`.
*/
export enum ReverseGeocodingLocationType {
/** returns only the addresses for which Google has location information accurate down to street address precision. */
ROOFTOP = "ROOFTOP",
/**
* returns only the addresses that reflect an approximation (usually on a road) interpolated between two precise points
* (such as intersections). An interpolated range generally indicates that rooftop geocodes are unavailable for a street address.
*/
RANGE_INTERPOLATED = "RANGE_INTERPOLATED",
/** returns only geometric centers of a location such as a polyline (for example, a street) or polygon (region). */
GEOMETRIC_CENTER = "GEOMETRIC_CENTER",
/** returns only the addresses that are characterized as approximate. */
APPROXIMATE = "APPROXIMATE",
}
export interface ReverseGeocodeRequest extends Partial<AxiosRequestConfig> {
params: {
/** The latitude and longitude values specifying the location for which you wish to obtain the closest, human-readable address. */
latlng?: LatLng;
/**
* The place ID of the place for which you wish to obtain the human-readable address.
* The place ID is a unique identifier that can be used with other Google APIs.
* For example, you can use the `placeID` returned by the Roads API to get the address for a snapped point.
* The place ID may only be specified if the request includes an API key or a Google Maps APIs Premium Plan client ID.
*/
place_id?: string;
/**
* The language in which to return results.
* - Google often updates the supported languages, so this list may not be exhaustive.
* - If `language` is not supplied, the geocoder attempts to use the preferred language as specified in the
* `Accept-Language` header, or the native language of the domain from which the request is sent.
* - The geocoder does its best to provide a street address that is readable for both the user and locals.
* To achieve that goal, it returns street addresses in the local language, transliterated to a script readable by the user
* if necessary, observing the preferred language. All other addresses are returned in the preferred language.
* Address components are all returned in the same language, which is chosen from the first component.
* - If a name is not available in the preferred language, the geocoder uses the closest match.
*/
language?: Language;
/**
* A filter of one or more address types, separated by a pipe (`|`).
* If the parameter contains multiple address types, the API returns all addresses that match any of the types.
* A note about processing: The `result_type` parameter does not restrict the search to the specified address type(s).
* Rather, the `result_type` acts as a post-search filter: the API fetches all results for the specified `latlng`,
* then discards those results that do not match the specified address type(s).
* Note: This parameter is available only for requests that include an API key or a client ID.
*/
result_type?: AddressType[];
/**
* A filter of one or more location types, separated by a pipe (`|`).
* If the parameter contains multiple location types, the API returns all addresses that match any of the types.
* A note about processing: The `location_type` parameter does not restrict the search to the specified location type(s).
* Rather, the `location_type` acts as a post-search filter: the API fetches all results for the specified `latlng`,
* then discards those results that do not match the specified location type(s).
* Note: This parameter is available only for requests that include an API key or a client ID.
*/
location_type?: ReverseGeocodingLocationType[];
/**
* Determines whether the address descriptor is returned in the response.
*/
enable_address_descriptor?: boolean;
} & RequestParams;
}
export interface ReverseGeocodeResponseData extends ResponseData {
/**
* contains an array of geocoded address information and geometry information.
*
* Generally, only one entry in the `"results"` array is returned for address lookups,though the geocoder may return several results
* when address queries are ambiguous.
*/
results: GeocodeResult[];
/**
* The Address Descriptor for the target.
*/
address_descriptor: AddressDescriptor;
}
export interface ReverseGeocodeResponse extends AxiosResponse {
data: ReverseGeocodeResponseData;
}
export const defaultUrl = "https://maps.googleapis.com/maps/api/geocode/json";
export const defaultParamsSerializer = serializer(
{
latlng: latLngToString,
enable_address_descriptor: enableAddressDescriptorToString
},
defaultUrl
);
export function reverseGeocode(
{
params,
method = "get",
url = defaultUrl,
paramsSerializer = defaultParamsSerializer,
...config
}: ReverseGeocodeRequest,
axiosInstance: AxiosInstance = defaultAxiosInstance
): Promise<ReverseGeocodeResponse> {
return axiosInstance({
params,
method,
url,
paramsSerializer,
...config,
}) as Promise<ReverseGeocodeResponse>;
}