FarmMapsLib/projects/common-map/src/fm-map/components/aol/item-layers/item-layers.component.ts

529 lines
20 KiB
TypeScript
Raw Normal View History

2020-11-02 20:00:13 +00:00
import { Component, Host, Input, Output, EventEmitter,OnDestroy, OnInit, OnChanges, SimpleChanges, forwardRef } from '@angular/core';
import { LayerGroupComponent, MapComponent } from 'ngx-openlayers';
2020-03-03 09:54:57 +00:00
import { ItemService,IItem,AppConfig } from '@farmmaps/common';
2020-11-02 20:00:13 +00:00
import { IItemLayer, ITemporalItemLayer} from '../../../models/item.layer';
import { ILayerData} from '../../../models/layer.data';
2021-03-15 15:26:05 +00:00
import { IRenderoutputTiles,IRenderoutputImage,IGradientstop,ILayer,IHistogram,IColor} from '../../../models/color.map';
import {Extent} from 'ol/extent';
import Projection from 'ol/proj/Projection';
import * as proj from 'ol/proj';
import * as loadingstrategy from 'ol/loadingstrategy';
import * as style from 'ol/style';
import {Tile,Layer,Image} from 'ol/layer';
2021-10-05 11:46:10 +00:00
import {XYZ,ImageStatic,OSM,BingMaps,TileWMS,TileArcGISRest,TileJSON,Source} from 'ol/source';
import {Vector as VectorSource} from 'ol/source';
import { Vector as VectorLayer } from 'ol/layer';
2022-12-21 06:45:00 +00:00
import { VectorImage as VectorImageLayer } from 'ol/layer';
import VectorTileSource from 'ol/source/VectorTile';
import VectorTileLayer from 'ol/layer/VectorTile';
import {GeoJSON,MVT} from 'ol/format';
2021-10-05 11:46:10 +00:00
import { Geometry } from 'ol/geom';
2022-09-27 17:58:08 +00:00
import BaseLayer from 'ol/layer/Base';
@Component({
selector: 'fm-map-item-layers',
template: `<ng-content></ng-content>`,
providers: [
{ provide: LayerGroupComponent, useExisting: forwardRef(() => ItemLayersComponent) }
]
})
2020-11-02 20:00:13 +00:00
export class ItemLayersComponent extends LayerGroupComponent implements OnChanges, OnInit,OnDestroy {
@Input() itemLayers: IItemLayer[];
@Input() itemLayer: IItemLayer;
2021-01-26 16:47:17 +00:00
@Output() onFeatureSelected: EventEmitter<any> = new EventEmitter<any>();
@Output() onFeatureHover: EventEmitter<any> = new EventEmitter<any>();
2022-09-27 17:58:08 +00:00
@Output() onPrerender: EventEmitter<any> = new EventEmitter<any>();
private _apiEndPoint: string;
2023-03-06 13:04:14 +00:00
private initialized = false;
2020-11-02 20:00:13 +00:00
private mapEventHandlerInstalled = false;
2022-09-27 17:58:08 +00:00
private topLayerPrerenderEventhandlerInstalled = false;
2020-11-02 20:00:13 +00:00
private selectedFeatures = {};
2021-10-05 11:46:10 +00:00
private selectionLayer:Layer<Source> = null;
2020-11-02 20:00:13 +00:00
2021-01-26 08:12:37 +00:00
constructor(private itemService: ItemService, private map: MapComponent, public appConfig: AppConfig) {
super(map);
this._apiEndPoint = appConfig.getConfig("apiEndPoint");
}
private styleCache = {}
componentToHex(c) {
2023-03-06 13:04:14 +00:00
const hex = c.toString(16);
return hex.length == 1 ? "0" + hex : hex;
}
rgbaToHex(r, g, b,a) {
return "#" + this.componentToHex(r) + this.componentToHex(g) + this.componentToHex(b) + this.componentToHex(a);
}
2021-03-15 15:26:05 +00:00
getColorFromGradient(layer: ILayer, value: number): IColor {
2023-03-06 13:04:14 +00:00
const gradient: IGradientstop[] = layer.renderer.colorMap.gradient;
const histogram: IHistogram = layer.renderer.band.histogram;
const index = (value - histogram.min) / histogram.max;
let min = gradient[0];
let max = gradient[gradient.length - 1];
for (let n = 0; n < gradient.length; n++) {
const s = gradient[n];
if (s.relativestop <= index && min.relativestop < s.relativestop && n < gradient.length - 1) min = s;
if (s.relativestop >= index && max.relativestop > s.relativestop && n > 0) max = s;
}
2023-03-06 13:04:14 +00:00
const i = index - min.relativestop;
const size = max.relativestop - min.relativestop;
const alpha = Math.round(min.color.alpha + ((max.color.alpha - min.color.alpha) * i / size));
const red = Math.round(min.color.red + ((max.color.red - min.color.red) * i / size));
const green = Math.round(min.color.green + ((max.color.green - min.color.green) * i / size));
const blue = Math.round(min.color.blue + ((max.color.blue - min.color.blue) * i / size));
2021-03-15 15:26:05 +00:00
return { alpha: alpha, red: red, green: green, blue: blue };
}
getColorForValue(layer: ILayer, value: number): IColor {
2023-03-06 13:04:14 +00:00
let color: IColor = { alpha:0,red:0,green:0,blue:0};
2021-03-20 19:07:31 +00:00
if(layer.renderer.colorMap.entries.length>0) {
2021-03-20 19:29:27 +00:00
color=layer.renderer.colorMap.noValue;
2021-03-20 19:07:31 +00:00
}
2021-03-15 15:26:05 +00:00
layer.renderer.colorMap.entries.forEach((entry) => {
if(entry.value==value) {
color =entry.color;
return;
}
});
return color;
}
getColor(item: IItem, layer: ILayer, feature): style.Style {
2023-03-06 13:04:14 +00:00
const value = layer.indexKey ? feature.get(layer.indexKey) : feature.get(layer.name);
const key = item.code + "_" + value;
2021-03-15 15:26:05 +00:00
if (!this.styleCache[key]) {
2023-03-06 13:04:14 +00:00
let color: IColor;
2021-03-15 15:26:05 +00:00
if(layer.renderer.colorMap.colormapType == "manual") {
color = this.getColorForValue(layer, value);
} else {
color = this.getColorFromGradient(layer, value);
}
this.styleCache[key] = new style.Style(
{
image: new style.Circle({
fill: new style.Fill({
color: this.rgbaToHex(color.red, color.green, color.blue, color.alpha)
}),
radius: 3
}),
fill: new style.Fill({
2021-03-15 15:26:05 +00:00
color: this.rgbaToHex(color.red, color.green, color.blue, color.alpha)
}),
2021-03-15 15:26:05 +00:00
stroke: new style.Stroke({
color: this.rgbaToHex(color.red, color.green, color.blue, 255),
width: 1.25
}),
});
2020-09-16 11:38:06 +00:00
}
return this.styleCache[key];
}
2021-10-05 11:46:10 +00:00
createGeotiffLayer(item:IItem,itemLayer:IItemLayer):Layer<Source> {
2023-03-06 13:04:14 +00:00
let layerIndex = -1;
let layer: Layer<Source> = null;
2020-02-27 15:28:10 +00:00
layerIndex = itemLayer.layerIndex != -1 ? itemLayer.layerIndex : item.data.layers[0].index;
2023-03-06 13:04:14 +00:00
const source = new XYZ({ maxZoom: 19, minZoom: 1, url: `${this._apiEndPoint}/api/v1/items/${item.code}/tiles/${layerIndex}/{z}/{x}/{y}.png?v=${Date.parse(item.updated)}` });
2020-02-27 15:28:10 +00:00
layer = new Tile({ source: source });
2023-03-06 13:04:14 +00:00
const data = item.data;
const l = (data && data.layers && data.layers.length > 0) ? data.layers[0] : null;
2020-02-27 15:28:10 +00:00
if (l && l.rendering && l.rendering.renderoutputType == "Tiles") {
2023-03-06 13:04:14 +00:00
const rt = l.rendering as IRenderoutputTiles;
const source = new XYZ({crossOrigin: 'use-credentials', maxZoom: rt.maxzoom, minZoom: rt.minzoom, url: `${this._apiEndPoint}/api/v1/items/${item.code}/tiles/${layerIndex}/{z}/{x}/{y}.png?v=${Date.parse(item.updated)}` });
layer = new Tile({ source: source });
2020-02-27 15:28:10 +00:00
}
if (l && l.rendering && l.rendering.renderoutputType == "Image") {
2023-03-06 13:04:14 +00:00
const ri = l.rendering as IRenderoutputImage;
const source = new ImageStatic({ imageExtent:ri.extent,projection:'EPSG:3857', crossOrigin: 'use-credentials', url: `${this._apiEndPoint}/api/v1/items/${item.code}/mapimage/${layerIndex}?v=${Date.parse(item.updated)}` });
2020-02-27 15:28:10 +00:00
layer = new Image({ source: source });
}
return layer;
}
2021-10-05 11:46:10 +00:00
createShapeLayer(item:IItem,itemLayer:IItemLayer):Layer<Source> {
2023-03-06 13:04:14 +00:00
let layerIndex = -1;
let layer: Layer<Source> = null;
2020-02-27 15:28:10 +00:00
layerIndex = itemLayer.layerIndex != -1 ? itemLayer.layerIndex : item.data.layers[0].index;
2023-03-06 13:04:14 +00:00
const data = item.data;
const l:ILayer = (data && data.layers && data.layers.length > 0) ? data.layers[layerIndex] : null;
2020-02-27 15:28:10 +00:00
if (l && l.rendering && l.rendering.renderoutputType == "VectorTiles") {
2020-09-16 08:34:04 +00:00
var rt = l.rendering as IRenderoutputTiles;
2020-02-27 15:28:10 +00:00
layer = new VectorTileLayer({
declutter: true,
source: new VectorTileSource({
maxZoom: rt.maxzoom,
minZoom: rt.minzoom,
2021-01-22 11:26:14 +00:00
format: new MVT(),
2020-07-07 07:24:45 +00:00
url: `${this._apiEndPoint}/api/v1/items/${item.code}/vectortiles/{z}/{x}/{y}.pbf?v=${Date.parse(item.updated)}`
2020-02-27 15:28:10 +00:00
}),
style: (feature) => {
2021-03-15 15:26:05 +00:00
return this.getColor(item,l, feature);
2020-02-27 15:28:10 +00:00
}
})
} else if (l && l.rendering && l.rendering.renderoutputType == "Tiles") {
var rt = l.rendering as IRenderoutputTiles;
layer = new Tile({
source: new XYZ({
maxZoom: rt.maxzoom,
minZoom: rt.minzoom,
2020-07-07 07:24:45 +00:00
url: `${this._apiEndPoint}/api/v1/items/${item.code}/vectortiles/image_tiles/${layerIndex}/{z}/{x}/{y}.png?v=${Date.parse(item.updated)}`
})
2020-02-27 15:28:10 +00:00
});
} else {
2023-03-06 13:04:14 +00:00
const __this = this;
const format = new GeoJSON();
const source = new VectorSource({
2020-02-27 15:28:10 +00:00
strategy: loadingstrategy.bbox,
loader: function (extent: Extent, resolution: number, projection: Projection) {
2023-03-06 13:04:14 +00:00
const source = this as VectorSource<Geometry>;
2020-02-27 15:28:10 +00:00
__this.itemService.getItemFeatures(item.code, extent, projection.getCode(), layerIndex).subscribe(function (data) {
2023-03-06 13:04:14 +00:00
const features = format.readFeatures(data);
for (const f of features) {
2020-02-27 15:28:10 +00:00
if (f.get("code")) {
f.setId(f.get("code"));
}
2020-02-27 15:28:10 +00:00
}
source.addFeatures(features);
});
}
});
2022-12-21 06:45:00 +00:00
layer = new VectorImageLayer({
declutter: true,
2020-02-27 15:28:10 +00:00
source: source,
style: (feature) => {
2023-03-06 13:04:14 +00:00
const key =feature.get("code") + "_" + feature.get("color");
2020-02-27 15:28:10 +00:00
if (!this.styleCache[key]) {
2023-03-06 13:04:14 +00:00
const color = feature.get("color");
2020-02-27 15:28:10 +00:00
this.styleCache[key] = new style.Style(
{
fill: new style.Fill({
color: color
}),
stroke: new style.Stroke({
color: color,
width: 1.25
}),
image: new style.Circle({
fill: new style.Fill({
color: color
}),
stroke: new style.Stroke({
color: color,
width: 1.25
}),
2020-02-27 15:28:10 +00:00
radius: 5
}),
}
)
}
2020-02-27 15:28:10 +00:00
return this.styleCache[key];
}
2020-02-27 15:28:10 +00:00
});
}
2020-09-16 18:09:52 +00:00
if(l.minzoom) {
2020-12-18 19:16:22 +00:00
layer.setMinZoom(l.minzoom);
2020-09-16 18:09:52 +00:00
}
if(l.maxzoom) {
layer.setMaxZoom(l.maxzoom);
}
2020-02-27 15:28:10 +00:00
return layer;
}
2021-10-05 11:46:10 +00:00
createSelectionLayer(itemLayer:IItemLayer):Layer<Source> {
2023-03-06 13:04:14 +00:00
let layerIndex = -1;
const layer: Layer<Source> = null;
2020-11-03 19:21:18 +00:00
layerIndex = itemLayer.layerIndex != -1 ? itemLayer.layerIndex : itemLayer.item.data.layers[0].index;
2023-03-06 13:04:14 +00:00
const data = itemLayer.item.data;
const l:ILayer = (data && data.layers && data.layers.length > 0) ? data.layers[layerIndex] : null;
2020-11-03 19:21:18 +00:00
if (l && l.rendering && l.rendering.renderoutputType == "VectorTiles") {
return new VectorTileLayer({
renderMode: 'vector',
2021-10-05 11:46:10 +00:00
source: (itemLayer.layer as VectorTileLayer).getSource(),
2020-11-03 19:21:18 +00:00
style: (feature) => {
if (feature.getId() in this.selectedFeatures) {
return new style.Style(
2020-12-18 19:16:22 +00:00
{
2020-11-03 19:21:18 +00:00
stroke: new style.Stroke({
color: 'red',
2020-12-18 19:16:22 +00:00
width: 2
2020-11-03 19:21:18 +00:00
})
}
);
}
},
minZoom: itemLayer.layer.getMinZoom(),
maxZoom: itemLayer.layer.getMaxZoom()
});
}
return null;
}
2021-10-05 11:46:10 +00:00
createExternalLayer(item:IItem,itemLayer:IItemLayer):Layer<Source> {
2023-03-06 13:04:14 +00:00
const data = item.data as ILayerData;
let layer: Layer<Source> = null;
2020-02-27 15:28:10 +00:00
switch (data.interfaceType) {
case 'OSM': {
2023-03-06 13:04:14 +00:00
const source = new OSM();
2020-02-27 15:28:10 +00:00
layer = new Tile({ source: source });
break;
}
case 'BingMaps': {
2023-03-06 13:04:14 +00:00
const source = new BingMaps(data.options);
2020-02-27 15:28:10 +00:00
layer = new Tile({ source: source });
break;
}
case 'TileWMS': {
2023-03-06 13:04:14 +00:00
const source = new TileWMS(data.options);
2020-02-27 15:28:10 +00:00
layer = new Tile({ source: source });
2020-09-09 07:47:32 +00:00
break;
}
case 'TileJSON': {
2023-03-06 13:04:14 +00:00
const source = new TileJSON(data.options);
2020-09-09 07:47:32 +00:00
layer = new Tile({ source: source });
2020-02-27 15:28:10 +00:00
break;
}
case 'TileArcGISRest': {
2023-03-06 13:04:14 +00:00
const source = new TileArcGISRest(data.options);
2020-02-27 15:28:10 +00:00
layer = new Tile({ source: source });
break;
}
2020-07-30 07:33:32 +00:00
case 'VectorWFSJson': {
2023-03-06 13:04:14 +00:00
const source = new VectorSource({
2020-07-30 07:33:32 +00:00
format: new GeoJSON(),
url: function (extent) {
return (
data.options.url + '&srsname=' + data.projection +
'&bbox=' +
extent.join(',') +
',EPSG:3857'
);
},
strategy: loadingstrategy.bbox,
});
layer = new VectorLayer({ source: source });
break;
}
2020-02-27 15:28:10 +00:00
default: {
break;
}
}
2020-02-27 15:28:10 +00:00
return layer;
}
2021-10-05 11:46:10 +00:00
createLayer(itemLayer: IItemLayer): Layer<Source> {
2023-03-06 13:04:14 +00:00
let layer: Layer<Source> = null;
const layerIndex = -1;
2020-02-27 15:28:10 +00:00
if (itemLayer.item.itemType == 'vnd.farmmaps.itemtype.geotiff.processed') {
layer = this.createGeotiffLayer(itemLayer.item,itemLayer);
} else if (itemLayer.item.itemType == 'vnd.farmmaps.itemtype.shape.processed') {
layer = this.createShapeLayer(itemLayer.item,itemLayer);
} else if (itemLayer.item.itemType == 'vnd.farmmaps.itemtype.layer') {
layer = this.createExternalLayer(itemLayer.item,itemLayer);
}
if (layer) {
2023-03-06 13:04:14 +00:00
const geometry = new GeoJSON().readGeometry(itemLayer.item.geometry);
const extent = geometry ? proj.transformExtent(geometry.getExtent(), 'EPSG:4326', 'EPSG:3857') : null;
if (extent) layer.setExtent(extent);
}
return layer;
}
ngOnInit() {
super.ngOnInit();
2020-10-05 09:08:36 +00:00
if(this.itemLayers) {
this.updateLayers(this.itemLayers);
} else if(this.itemLayer) {
2021-01-26 16:47:17 +00:00
if(this.getItemlayer(this.itemLayer).item.itemType == 'vnd.farmmaps.itemtype.shape.processed') {
2021-01-26 15:47:08 +00:00
this.installMapEventHandler();
}
2020-10-05 09:08:36 +00:00
this.updateLayers([this.itemLayer])
} else {
this.updateLayers([]);
}
this.initialized=true;
}
2020-11-02 20:00:13 +00:00
installMapEventHandler() {
if(!this.mapEventHandlerInstalled) {
this.map.instance.on(['click', 'pointermove'],this.mapEventHandler);
this.mapEventHandlerInstalled=true;
}
}
unInstallMapEventHandler() {
if(this.mapEventHandlerInstalled) {
this.map.instance.un(['click', 'pointermove'],this.mapEventHandler);
this.mapEventHandlerInstalled=false;
}
}
2022-09-28 10:01:59 +00:00
installTopLayerPrerenderEventhandler(olLayer : Layer<Source>) {
if(!this.topLayerPrerenderEventhandlerInstalled && this.onPrerender.observers.length > 0 && olLayer) {
2022-09-27 17:58:08 +00:00
if(this.instance.getVisible()) {
2022-09-28 10:01:59 +00:00
olLayer.on('prerender',this.topLayerPrerenderEventhandler);
olLayer.on('postrender',this.topLayerPostrenderEventhandler);
this.topLayerPrerenderEventhandlerInstalled = true;
2022-09-27 17:58:08 +00:00
}
}
}
unInstallTopLayerPrerenderEventhandler() {
if(this.topLayerPrerenderEventhandlerInstalled && this.onPrerender.observers.length > 0 )
{
if(this.instance.getVisible()) {
2023-03-06 13:04:14 +00:00
const olLayers = this.instance.getLayers().getArray().forEach((l:any) => {
2022-09-28 10:01:59 +00:00
l.un('prerender',this.topLayerPrerenderEventhandler);
l.un('postrender',this.topLayerPostrenderEventhandler);
});
this.topLayerPrerenderEventhandlerInstalled = false;
2022-09-27 17:58:08 +00:00
}
}
}
2021-10-05 11:46:10 +00:00
addOrUpdateOlLayer(itemLayer:IItemLayer,index:number):Layer<Source> {
2020-03-02 12:48:10 +00:00
if(!itemLayer) return null;
2023-03-06 13:04:14 +00:00
const olLayers = this.instance.getLayers();
let layer = itemLayer.layer;
const olIndex = olLayers.getArray().indexOf(layer);
2020-02-29 10:56:19 +00:00
if (olIndex < 0) {
// New layer: we add it to the map
layer = this.createLayer(itemLayer);
if (layer) {
olLayers.insertAt(index, layer);
}
} else if (index !== olIndex) {
// layer has moved inside the layers list
olLayers.removeAt(olIndex);
olLayers.insertAt(index, layer);
}
2020-03-02 07:55:11 +00:00
if(layer) {
itemLayer.layer = layer;
layer.setOpacity(itemLayer.opacity);
layer.setVisible(itemLayer.visible);
}
2020-02-29 10:56:19 +00:00
return layer;
}
2022-09-28 10:01:59 +00:00
updateLayers(itemLayers: IItemLayer[] | IItemLayer) {
2022-09-27 17:58:08 +00:00
this.unInstallTopLayerPrerenderEventhandler();
2022-09-28 10:01:59 +00:00
let dataLayer = false;
2023-03-06 13:04:14 +00:00
let ils:IItemLayer[] = [];
2022-09-28 10:01:59 +00:00
if(Array.isArray(itemLayers)) {
ils = itemLayers;
} else {
dataLayer=true;
ils=[itemLayers];
}
2023-03-06 13:04:14 +00:00
const newLayers: Layer<Source>[] = [];
2022-09-28 10:01:59 +00:00
if (ils) {
ils.forEach((itemLayer, index) => {
2020-03-02 07:55:11 +00:00
if(itemLayer.item.itemType == 'vnd.farmmaps.itemtype.temporal') {
2023-03-06 13:04:14 +00:00
const il = itemLayer as ITemporalItemLayer;
const previousLayer = this.addOrUpdateOlLayer(il.previousItemLayer,newLayers.length);
2020-03-02 07:55:11 +00:00
if(previousLayer) newLayers.push(previousLayer);
2023-03-06 13:04:14 +00:00
const selectedLayer = this.addOrUpdateOlLayer(il.selectedItemLayer,newLayers.length);
2020-03-02 07:55:11 +00:00
if(selectedLayer) newLayers.push(selectedLayer);
2023-03-06 13:04:14 +00:00
const nextLayer = this.addOrUpdateOlLayer(il.nextItemLayer,newLayers.length);
2020-03-02 12:48:10 +00:00
if(nextLayer) newLayers.push(nextLayer);
2022-09-28 10:01:59 +00:00
this.installTopLayerPrerenderEventhandler(selectedLayer);
2020-03-02 07:55:11 +00:00
} else {
2023-03-06 13:04:14 +00:00
const layer = this.addOrUpdateOlLayer(itemLayer,newLayers.length);
2022-09-28 10:01:59 +00:00
if(layer) newLayers.push(layer);
this.installTopLayerPrerenderEventhandler(layer);
2020-03-02 07:55:11 +00:00
}
});
// Remove the layers that have disapeared from childrenLayers
2023-03-06 13:04:14 +00:00
const olLayers = this.instance.getLayers();
2020-03-02 12:48:10 +00:00
while(olLayers.getLength() > newLayers.length) {
olLayers.removeAt(newLayers.length);
}
2020-11-03 19:21:18 +00:00
this.selectionLayer=null;
2022-09-28 10:01:59 +00:00
if(this.mapEventHandlerInstalled && ils.length==1 && this.getItemlayer(itemLayers[0]).item.itemType == 'vnd.farmmaps.itemtype.shape.processed') {
2021-01-26 16:47:17 +00:00
this.selectionLayer = this.createSelectionLayer(this.getItemlayer(itemLayers[0]));
2021-02-02 13:45:33 +00:00
if(this.selectionLayer) olLayers.push(this.selectionLayer)
2020-11-03 19:21:18 +00:00
}
2020-02-19 09:53:14 +00:00
}
2022-09-27 17:58:08 +00:00
}
topLayerPrerenderEventhandler = (event) => {
this.onPrerender.emit(event);
}
2022-09-27 17:58:08 +00:00
topLayerPostrenderEventhandler = (event) => {
const ctx = event.context;
ctx.restore();
}
2020-11-02 20:00:13 +00:00
mapEventHandler = (event) => {
2021-01-23 17:30:29 +00:00
// select only when having observers
2021-01-26 16:48:11 +00:00
if(event.type === 'click' && !this.onFeatureSelected.observers.length) return;
2022-09-27 17:58:08 +00:00
if(event.type === 'pointermove' && !this.onFeatureHover.observers.length) return;
2023-03-06 13:04:14 +00:00
const itemLayer= this.getItemlayer(this.itemLayer);
2021-01-26 16:47:17 +00:00
if(itemLayer && itemLayer.layer) {
2020-12-18 19:16:22 +00:00
this.selectedFeatures = {};
2021-01-26 16:47:17 +00:00
if(itemLayer.layer ) {
2023-03-06 13:04:14 +00:00
const minZoom = itemLayer.layer.getMinZoom();
const currentZoom = this.map.instance.getView().getZoom();
2021-01-23 17:30:29 +00:00
if(currentZoom>minZoom) {
2021-01-26 16:47:17 +00:00
itemLayer.layer.getFeatures(event.pixel).then((features) => {
2021-01-23 17:30:29 +00:00
if(!features.length) {
this.onFeatureHover.emit(null);
return;
}
2023-03-06 13:04:14 +00:00
const fid = features[0].getId();
const feature = features[0];
2021-01-23 17:30:29 +00:00
if(event.type === 'pointermove') {
this.selectedFeatures[fid] = features[0];
2021-01-26 16:47:17 +00:00
this.onFeatureHover.emit({ "feature": feature,"itemCode":itemLayer.item.code });
2021-01-23 17:30:29 +00:00
} else {
2021-01-26 16:47:17 +00:00
this.onFeatureSelected.emit({ "feature": feature,"itemCode":itemLayer.item.code });
2021-01-23 17:30:29 +00:00
}
})
if(this.selectionLayer) this.selectionLayer.changed();
}
}
2020-11-02 20:00:13 +00:00
}
}
2021-01-26 16:47:17 +00:00
getItemlayer(itemLayer:IItemLayer):IItemLayer {
if((itemLayer as ITemporalItemLayer).selectedItemLayer) return (itemLayer as ITemporalItemLayer).selectedItemLayer;
return itemLayer;
}
ngOnChanges(changes: SimpleChanges) {
2020-10-05 09:08:36 +00:00
if (this.instance && this.initialized) {
if (changes['itemLayers']) {
2023-03-06 13:04:14 +00:00
const itemLayers = changes['itemLayers'].currentValue as IItemLayer[];
this.updateLayers(itemLayers);
}
2020-11-02 20:00:13 +00:00
if (changes['itemLayer']) {
2023-03-06 13:04:14 +00:00
const itemLayer = changes['itemLayer'].currentValue as IItemLayer;
2020-11-02 20:00:13 +00:00
this.itemLayer = itemLayer
if(itemLayer) {
2021-01-26 16:47:17 +00:00
if(this.getItemlayer(this.itemLayer).item.itemType == 'vnd.farmmaps.itemtype.shape.processed') {
2020-11-02 20:00:13 +00:00
this.installMapEventHandler();
}
this.updateLayers([itemLayer]);
} else {
2020-11-02 20:00:13 +00:00
this.unInstallMapEventHandler();
2020-11-03 19:21:18 +00:00
this.updateLayers([]);
}
}
}
}
2020-11-02 20:00:13 +00:00
ngOnDestroy() {
this.unInstallMapEventHandler();
2021-01-26 15:47:08 +00:00
super.ngOnDestroy();
2020-11-02 20:00:13 +00:00
}
}