Add OsmFeature type

This commit is contained in:
pietervdvn 2022-07-13 17:56:10 +02:00
parent 284951f5f7
commit 24f090c92f
7 changed files with 26 additions and 20 deletions

View file

@ -8,7 +8,7 @@ import {BBox} from "../BBox";
import Constants from "../../Models/Constants"; import Constants from "../../Models/Constants";
import SimpleFeatureSource from "../FeatureSource/Sources/SimpleFeatureSource"; import SimpleFeatureSource from "../FeatureSource/Sources/SimpleFeatureSource";
export interface GeoLocationPointProperties { export interface GeoLocationPointProperties {
id: "gps", id: "gps",
"user:location": "yes", "user:location": "yes",
"date": string, "date": string,

View file

@ -24,6 +24,7 @@ import FullNodeDatabaseSource from "./TiledFeatureSource/FullNodeDatabaseSource"
import MapState from "../State/MapState"; import MapState from "../State/MapState";
import {ElementStorage} from "../ElementStorage"; import {ElementStorage} from "../ElementStorage";
import {Feature, Geometry} from "@turf/turf"; import {Feature, Geometry} from "@turf/turf";
import {OsmFeature} from "../../Models/OsmFeature";
/** /**
@ -338,15 +339,19 @@ export default class FeaturePipeline {
} }
public GetAllFeaturesWithin(bbox: BBox): Feature<Geometry, {id: string}>[][] { public GetAllFeaturesWithin(bbox: BBox): OsmFeature[][] {
const self = this const self = this
const tiles = [] const tiles: OsmFeature[][] = []
Array.from(this.perLayerHierarchy.keys()) Array.from(this.perLayerHierarchy.keys())
.forEach(key => tiles.push(...self.GetFeaturesWithin(key, bbox))) .forEach(key => {
const fetched : OsmFeature[][] = self.GetFeaturesWithin(key, bbox)
tiles.push(...fetched);
})
return tiles; return tiles;
} }
public GetAllFeaturesAndMetaWithin(bbox: BBox, layerIdWhitelist?: Set<string>): {features: any[], layer: string}[] { public GetAllFeaturesAndMetaWithin(bbox: BBox, layerIdWhitelist?: Set<string>):
{features: OsmFeature[], layer: string}[] {
const self = this const self = this
const tiles :{features: any[], layer: string}[]= [] const tiles :{features: any[], layer: string}[]= []
Array.from(this.perLayerHierarchy.keys()) Array.from(this.perLayerHierarchy.keys())
@ -362,7 +367,11 @@ export default class FeaturePipeline {
return tiles; return tiles;
} }
public GetFeaturesWithin(layerId: string, bbox: BBox): any[][] { /**
* Gets all the tiles which overlap with the given BBOX.
* This might imply that extra features might be shown
*/
public GetFeaturesWithin(layerId: string, bbox: BBox): OsmFeature[][] {
if (layerId === "*") { if (layerId === "*") {
return this.GetAllFeaturesWithin(bbox) return this.GetAllFeaturesWithin(bbox)
} }

View file

@ -1,9 +1,11 @@
import {Store, UIEventSource} from "../UIEventSource"; import {Store, UIEventSource} from "../UIEventSource";
import FilteredLayer from "../../Models/FilteredLayer"; import FilteredLayer from "../../Models/FilteredLayer";
import {BBox} from "../BBox"; import {BBox} from "../BBox";
import {Feature, Geometry} from "@turf/turf";
import {OsmFeature} from "../../Models/OsmFeature";
export default interface FeatureSource { export default interface FeatureSource {
features: Store<{ feature: any, freshness: Date }[]>; features: Store<{ feature: OsmFeature, freshness: Date }[]>;
/** /**
* Mainly used for debuging * Mainly used for debuging
*/ */
@ -28,12 +30,3 @@ export interface FeatureSourceForLayer extends FeatureSource {
export interface IndexedFeatureSource extends FeatureSource { export interface IndexedFeatureSource extends FeatureSource {
readonly containedIds: Store<Set<string>> readonly containedIds: Store<Set<string>>
} }
/**
* A feature source which has some extra data about it's state
*/
export interface FeatureSourceState {
readonly sufficientlyZoomed: Store<boolean>;
readonly runningQuery: Store<boolean>;
readonly timeout: Store<number>;
}

View file

@ -13,7 +13,7 @@ export default interface TileHierarchy<T extends FeatureSource & Tiled> {
export class TileHierarchyTools { export class TileHierarchyTools {
public static getTiles<T extends FeatureSource & Tiled>(hierarchy: TileHierarchy<T>, bbox: BBox): T[] { public static getTiles<T extends FeatureSource & Tiled>(hierarchy: TileHierarchy<T>, bbox: BBox): T[] {
const result = [] const result: T[] = []
hierarchy.loadedTiles.forEach((tile) => { hierarchy.loadedTiles.forEach((tile) => {
if (tile.bbox.overlapsWith(bbox)) { if (tile.bbox.overlapsWith(bbox)) {
result.push(tile) result.push(tile)

View file

@ -3,7 +3,7 @@ import {BBox} from "./BBox";
import togpx from "togpx" import togpx from "togpx"
import Constants from "../Models/Constants"; import Constants from "../Models/Constants";
import LayerConfig from "../Models/ThemeConfig/LayerConfig"; import LayerConfig from "../Models/ThemeConfig/LayerConfig";
import {booleanWithin, Coord, Feature, Geometry, MultiPolygon, Polygon, Properties} from "@turf/turf"; import {AllGeoJSON, booleanWithin, Coord, Feature, Geometry, MultiPolygon, Polygon, Properties} from "@turf/turf";
export class GeoOperations { export class GeoOperations {
@ -29,7 +29,7 @@ export class GeoOperations {
* Returns [lon,lat] coordinates * Returns [lon,lat] coordinates
* @param feature * @param feature
*/ */
static centerpointCoordinates(feature: any): [number, number] { static centerpointCoordinates(feature: AllGeoJSON): [number, number] {
return <[number, number]>turf.center(feature).geometry.coordinates; return <[number, number]>turf.center(feature).geometry.coordinates;
} }

View file

@ -159,7 +159,7 @@ export class Changes {
const recentLocationPoints = locations.map(ff => ff.feature) const recentLocationPoints = locations.map(ff => ff.feature)
.filter(feat => feat.geometry.type === "Point") .filter(feat => feat.geometry.type === "Point")
.filter(feat => { .filter(feat => {
const visitTime = new Date((<GeoLocationPointProperties>feat.properties).date) const visitTime = new Date((<GeoLocationPointProperties><any>feat.properties).date)
// In seconds // In seconds
const diff = (now.getTime() - visitTime.getTime()) / 1000 const diff = (now.getTime() - visitTime.getTime()) / 1000
return diff < Constants.nearbyVisitTime; return diff < Constants.nearbyVisitTime;

4
Models/OsmFeature.ts Normal file
View file

@ -0,0 +1,4 @@
import {Feature, Geometry} from "@turf/turf";
export type OsmTags = Record<string, string> & {id: string}
export type OsmFeature = Feature<Geometry, OsmTags>