first commit
This commit is contained in:
commit
62506c830a
1207 changed files with 40706 additions and 0 deletions
260
src/app/models.ts
Normal file
260
src/app/models.ts
Normal file
|
@ -0,0 +1,260 @@
|
|||
import { Feature } from 'maplibre-gl'
|
||||
|
||||
import length from '@turf/length'
|
||||
|
||||
export class FeatureTarget {
|
||||
constructor(
|
||||
public feature: Feature,
|
||||
public distance: number,
|
||||
public direction?: number,
|
||||
) {}
|
||||
}
|
||||
|
||||
export interface TreeBucket {
|
||||
[id: string]: number
|
||||
}
|
||||
|
||||
export class Trail {
|
||||
constructor(
|
||||
public id: number,
|
||||
public name: string,
|
||||
public description: string,
|
||||
public feature: GeoJSON.Feature,
|
||||
public trees: Trees,
|
||||
public photo?: string,
|
||||
) {}
|
||||
|
||||
get length(): number {
|
||||
return length(<any>this.feature, {units: 'meters'})
|
||||
}
|
||||
|
||||
get mapRouteArgs(): Object {
|
||||
return { queryParams: { 'show': `trail:id:${this.id}`}}
|
||||
}
|
||||
|
||||
get treeList(): Tree[] {
|
||||
return Object.values(this.trees)
|
||||
}
|
||||
|
||||
getTreeBucket(): TreeBucket {
|
||||
const counts = {};
|
||||
let plantekeys = this.treeList.map(t => t.plantekeyId)
|
||||
plantekeys.forEach((x) => {
|
||||
counts[x] = (counts[x] || 0) + 1;
|
||||
})
|
||||
return counts
|
||||
}
|
||||
|
||||
getPhotoUrl(): string {
|
||||
return `/attachment/trail/${this.id}/${this.photo}`
|
||||
}
|
||||
}
|
||||
|
||||
export class Trails {
|
||||
[id: string]: Trail
|
||||
}
|
||||
|
||||
export class PlantsTrails {
|
||||
[plantId: string]: Trails
|
||||
}
|
||||
|
||||
export class Tree {
|
||||
constructor(
|
||||
public id: string, // UUID
|
||||
public feature: GeoJSON.Feature,
|
||||
public plantekeyId?: string,
|
||||
public photo?: string,
|
||||
public data?: Object,
|
||||
public height?: string,
|
||||
public comments?: string,
|
||||
public plant?: Plant,
|
||||
public trails: Trail[] = [],
|
||||
) {}
|
||||
|
||||
getPhotoUrl(): (string | void) {
|
||||
if (this.photo) {
|
||||
if (this.photo.startsWith('data:image')) {
|
||||
return this.photo
|
||||
}
|
||||
else {
|
||||
return `/attachment/tree/${this.id}/${this.photo}`
|
||||
}
|
||||
}
|
||||
else {
|
||||
return this.plant.get_thumbnail_url()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export interface Trees {
|
||||
[id: string]: Tree
|
||||
}
|
||||
|
||||
export class TreeTrails {
|
||||
[treeId: string]: Trails
|
||||
}
|
||||
|
||||
export class TreeTrail {
|
||||
constructor(
|
||||
public tree_id: string,
|
||||
public trail_id: number,
|
||||
) {}
|
||||
}
|
||||
|
||||
export class Poi {
|
||||
constructor(
|
||||
public id: number,
|
||||
public feature: GeoJSON.Feature,
|
||||
public name?: string,
|
||||
public type?: string,
|
||||
public description?: string,
|
||||
public photo?: string,
|
||||
public data?: Object,
|
||||
) {}
|
||||
|
||||
getPhotoUrl(): string {
|
||||
return `/attachment/poi/${this.id}/${this.photo}`
|
||||
}
|
||||
}
|
||||
|
||||
export class Pois {
|
||||
[id: string]: Poi
|
||||
}
|
||||
|
||||
export class Zone {
|
||||
constructor(
|
||||
public id: number,
|
||||
public geojson: GeoJSON.Feature,
|
||||
public name?: string,
|
||||
public type?: string,
|
||||
public description?: string,
|
||||
public photo?: string,
|
||||
public data?: Object,
|
||||
) {}
|
||||
|
||||
getPhotoUrl(): string {
|
||||
return `/attachment/zone/${this.id}/${this.photo}`
|
||||
}
|
||||
}
|
||||
|
||||
export class Zones {
|
||||
[id: string]: Zone
|
||||
}
|
||||
|
||||
export class Style {
|
||||
constructor(
|
||||
public layer: string,
|
||||
public paint?: Object,
|
||||
public layout?: Object,
|
||||
) {}
|
||||
}
|
||||
|
||||
export class Styles {
|
||||
[layer: string]: Style
|
||||
}
|
||||
|
||||
export class Plant {
|
||||
constructor(
|
||||
public ID: string,
|
||||
public id: string,
|
||||
public english: string,
|
||||
public family: string,
|
||||
public hindi: string,
|
||||
public img: string,
|
||||
public name: string,
|
||||
public spiritual: string,
|
||||
public tamil: string,
|
||||
public type: string,
|
||||
public description: string,
|
||||
public habit: string,
|
||||
public landscape: string,
|
||||
public uses: string,
|
||||
public planting: string,
|
||||
public propagation: string,
|
||||
public element: string,
|
||||
public woody: string,
|
||||
public latex: string,
|
||||
public leaf_style: string,
|
||||
public leaf_type: string,
|
||||
public leaf_arrangement: string,
|
||||
public leaf_aroma: string,
|
||||
public leaf_length: string,
|
||||
public leaf_width: string,
|
||||
public flower_color: string,
|
||||
public flower_aroma: string,
|
||||
public flower_size: string,
|
||||
public fruit_color: string,
|
||||
public fruit_size: string,
|
||||
public fruit_type: string,
|
||||
public thorny: string,
|
||||
public images: string[],
|
||||
public symbol: string,
|
||||
) {}
|
||||
|
||||
get_thumbnail_url() {
|
||||
return '/attachment/plantekey/thumb/' + this.img
|
||||
}
|
||||
|
||||
isMatch(searchText: string) {
|
||||
searchText = searchText.toLowerCase()
|
||||
return (
|
||||
this.id.indexOf(searchText) != -1 ||
|
||||
this.name.indexOf(searchText) != -1 ||
|
||||
(this.english && this.english.toLowerCase().indexOf(searchText) != -1)
|
||||
)
|
||||
}
|
||||
|
||||
getFriendlyName(): string {
|
||||
if (this.english) {
|
||||
return `${this.name} (${this.english})`
|
||||
}
|
||||
else if (this.spiritual) {
|
||||
return `${this.name} (${this.spiritual})`
|
||||
}
|
||||
else {
|
||||
return this.name
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export class Plants {
|
||||
[id: string]: Plant
|
||||
}
|
||||
|
||||
export class All {
|
||||
constructor(
|
||||
public trees: Trees = {},
|
||||
public trails: Trails = {},
|
||||
public tree_trails: TreeTrail[] = [],
|
||||
public plants: Plants = {},
|
||||
public pois: Pois = {},
|
||||
public zones: Zones = {},
|
||||
public styles: Styles = {},
|
||||
) {}
|
||||
}
|
||||
|
||||
export class Role {
|
||||
constructor(
|
||||
public name: String,
|
||||
) {}
|
||||
}
|
||||
|
||||
export class User {
|
||||
constructor(
|
||||
public username: String,
|
||||
public roles: Role[],
|
||||
public full_name?: String,
|
||||
public email?: String,
|
||||
) {}
|
||||
}
|
||||
/*
|
||||
let layer: LayerSpecification = <LayerSpecification>{
|
||||
id: layerDef.store,
|
||||
type: layerDef.type,
|
||||
source: <GeoJSONSourceSpecification>{
|
||||
type: "geojson",
|
||||
data: data
|
||||
},
|
||||
attribution: resp.style.attribution
|
||||
}
|
||||
*/
|
Loading…
Add table
Add a link
Reference in a new issue