universal-geocoder
Version:
Universal geocoding abstraction server-side and client-side with multiple built-in providers
122 lines (98 loc) • 3.32 kB
text/typescript
import { GeocodeQuery, GeocodeQueryObject } from "query";
type Shape = "geojson" | "kml" | "svg" | "text";
export interface NominatimGeocodeQueryObject extends GeocodeQueryObject {
readonly countryCodes?: string[];
readonly excludePlaceIds?: number[];
readonly bounded?: boolean;
readonly dedupe?: boolean;
readonly shape?: Shape;
readonly shapeThreshold?: number;
}
export default class NominatimGeocodeQuery extends GeocodeQuery {
private readonly countryCodes?: string[];
private readonly excludePlaceIds?: number[];
private readonly bounded?: boolean;
private readonly dedupe?: boolean;
private readonly shape?: Shape;
private readonly shapeThreshold?: number;
protected constructor({
countryCodes,
excludePlaceIds,
bounded,
bounds,
dedupe,
shape,
shapeThreshold,
...geocodeQueryObject
}: NominatimGeocodeQueryObject) {
super({ bounds, ...geocodeQueryObject });
this.countryCodes = countryCodes;
this.excludePlaceIds = excludePlaceIds;
if (bounded && !bounds) {
throw new Error(
'The "bounded" parameter can only be used with the "bounds" parameter.'
);
}
this.bounded = bounded;
this.dedupe = dedupe;
if (shape && !["geojson", "kml", "svg", "text"].includes(shape)) {
throw new Error(
'The "shape" parameter can only have the following values: "geojson", "kml", "svg", "text".'
);
}
this.shape = shape;
this.shapeThreshold = shapeThreshold;
}
public static create(
object: NominatimGeocodeQueryObject
): NominatimGeocodeQuery {
return new this(object);
}
public toObject(): NominatimGeocodeQueryObject {
return {
...super.toObject(),
countryCodes: this.countryCodes,
excludePlaceIds: this.excludePlaceIds,
bounded: this.bounded,
dedupe: this.dedupe,
shape: this.shape,
shapeThreshold: this.shapeThreshold,
};
}
public withCountryCodes(countryCodes: string[]): NominatimGeocodeQuery {
return new NominatimGeocodeQuery({ ...this.toObject(), countryCodes });
}
public getCountryCodes(): undefined | string[] {
return this.countryCodes;
}
public withExcludePlaceIds(excludePlaceIds: number[]): NominatimGeocodeQuery {
return new NominatimGeocodeQuery({ ...this.toObject(), excludePlaceIds });
}
public getExcludePlaceIds(): undefined | number[] {
return this.excludePlaceIds;
}
public withBounded(bounded: boolean): NominatimGeocodeQuery {
return new NominatimGeocodeQuery({ ...this.toObject(), bounded });
}
public getBounded(): undefined | boolean {
return this.bounded;
}
public withDedupe(dedupe: boolean): NominatimGeocodeQuery {
return new NominatimGeocodeQuery({ ...this.toObject(), dedupe });
}
public getDedupe(): undefined | boolean {
return this.dedupe;
}
public withShape(shape: Shape): NominatimGeocodeQuery {
return new NominatimGeocodeQuery({ ...this.toObject(), shape });
}
public getShape(): undefined | Shape {
return this.shape;
}
public withShapeThreshold(shapeThreshold: number): NominatimGeocodeQuery {
return new NominatimGeocodeQuery({ ...this.toObject(), shapeThreshold });
}
public getShapeThreshold(): undefined | number {
return this.shapeThreshold;
}
}