2024-08-15 01:51:33 +02:00
|
|
|
import { BBox } from "../BBox"
|
2024-08-21 14:06:42 +02:00
|
|
|
import { Feature, Geometry } from "geojson"
|
|
|
|
import { DefaultPinIcon } from "../../Models/Constants"
|
2024-08-22 22:50:37 +02:00
|
|
|
import { Store } from "../UIEventSource"
|
2024-08-23 02:16:24 +02:00
|
|
|
import * as search from "../../assets/generated/layers/search.json"
|
|
|
|
import LayerConfig from "../../Models/ThemeConfig/LayerConfig"
|
|
|
|
import { LayerConfigJson } from "../../Models/ThemeConfig/Json/LayerConfigJson"
|
|
|
|
export type GeocodingCategory = "coordinate" | "city" | "house" | "street" | "locality" | "country" | "train_station" | "county" | "airport" | "shop"
|
2024-08-15 01:51:33 +02:00
|
|
|
|
|
|
|
export type GeoCodeResult = {
|
2024-08-21 14:06:42 +02:00
|
|
|
/**
|
|
|
|
* The name of the feature being displayed
|
|
|
|
*/
|
2024-08-15 01:51:33 +02:00
|
|
|
display_name: string
|
2024-08-21 14:06:42 +02:00
|
|
|
/**
|
|
|
|
* Some optional, extra information
|
|
|
|
*/
|
|
|
|
description?: string | Promise<string>,
|
2024-08-15 01:51:33 +02:00
|
|
|
feature?: Feature,
|
|
|
|
lat: number
|
|
|
|
lon: number
|
|
|
|
/**
|
|
|
|
* Format:
|
|
|
|
* [lat, lat, lon, lon]
|
|
|
|
*/
|
|
|
|
boundingbox?: number[]
|
|
|
|
osm_type?: "node" | "way" | "relation"
|
2024-08-21 14:06:42 +02:00
|
|
|
osm_id?: string,
|
|
|
|
category?: GeocodingCategory,
|
2024-08-25 02:40:56 +02:00
|
|
|
payload?: object,
|
|
|
|
source?: string
|
2024-08-15 01:51:33 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
export interface GeocodingOptions {
|
|
|
|
bbox?: BBox,
|
|
|
|
limit?: number
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export default interface GeocodingProvider {
|
|
|
|
|
|
|
|
|
|
|
|
search(query: string, options?: GeocodingOptions): Promise<GeoCodeResult[]>
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param query
|
|
|
|
* @param options
|
|
|
|
*/
|
2024-08-22 22:50:37 +02:00
|
|
|
suggest?(query: string, options?: GeocodingOptions): Store<GeoCodeResult[]>
|
2024-08-15 01:51:33 +02:00
|
|
|
}
|
|
|
|
|
2024-08-21 14:06:42 +02:00
|
|
|
export type ReverseGeocodingResult = Feature<Geometry,{
|
|
|
|
osm_id: number,
|
|
|
|
osm_type: "node" | "way" | "relation",
|
|
|
|
country: string,
|
|
|
|
city: string,
|
|
|
|
countrycode: string,
|
|
|
|
type: GeocodingCategory,
|
|
|
|
street: string
|
|
|
|
} >
|
|
|
|
|
2024-08-15 01:51:33 +02:00
|
|
|
export interface ReverseGeocodingProvider {
|
|
|
|
reverseSearch(
|
|
|
|
coordinate: { lon: number; lat: number },
|
|
|
|
zoom: number,
|
|
|
|
language?: string
|
2024-08-21 14:06:42 +02:00
|
|
|
): Promise<ReverseGeocodingResult[]> ;
|
|
|
|
}
|
|
|
|
|
|
|
|
export class GeocodingUtils {
|
|
|
|
|
2024-08-23 02:30:51 +02:00
|
|
|
public static searchLayer = GeocodingUtils.initSearchLayer()
|
|
|
|
private static initSearchLayer():LayerConfig{
|
|
|
|
if(search["id"] === undefined){
|
|
|
|
// We are resetting the layeroverview; trying to parse is useless
|
|
|
|
return undefined
|
|
|
|
}
|
|
|
|
return new LayerConfig(<LayerConfigJson> search, "search")
|
|
|
|
}
|
2024-08-23 02:16:24 +02:00
|
|
|
|
2024-08-21 14:06:42 +02:00
|
|
|
public static categoryToZoomLevel: Record<GeocodingCategory, number> = {
|
|
|
|
city: 12,
|
|
|
|
county: 10,
|
|
|
|
coordinate: 16,
|
|
|
|
country: 8,
|
|
|
|
house: 16,
|
|
|
|
locality: 14,
|
|
|
|
street: 15,
|
|
|
|
train_station: 14,
|
2024-08-23 02:16:24 +02:00
|
|
|
airport: 13,
|
|
|
|
shop:16
|
2024-08-21 14:06:42 +02:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static categoryToIcon: Record<GeocodingCategory, DefaultPinIcon> = {
|
|
|
|
city: "building_office_2",
|
|
|
|
coordinate: "globe_alt",
|
|
|
|
country: "globe_alt",
|
|
|
|
house: "house",
|
|
|
|
locality: "building_office_2",
|
|
|
|
street: "globe_alt",
|
|
|
|
train_station: "train",
|
|
|
|
county: "building_office_2",
|
2024-08-23 02:16:24 +02:00
|
|
|
airport: "airport",
|
|
|
|
shop: "building_storefront"
|
2024-08-21 14:06:42 +02:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2024-08-15 01:51:33 +02:00
|
|
|
}
|
|
|
|
|