-
Notifications
You must be signed in to change notification settings - Fork 8
Create new plugins
In this page we create a new plugins that we use with an OpenLayers map it's a simple plugin that draw an icon on the center of the map on each move.
Create a directory named plugins
The most importent thing in a plugin is that he inherit from BaseImageryPlugin and have the @ImageryPlugin declaration
Create file called center-marker.plugins.ts and paste the following text into it:
import {BaseImageryPlugin, ImageryPlugin} from '@ansyn/imagery';
import { OpenLayersMap } from '@ansyn/ol';
@ImageryPlugin({
supported: [OpenLayersMap],
deps: []
})
export class CenterMarkerPlugins extends BaseImageryPlugin{
}we just create our plugin and tell him that he support only OpenLayer map.
let give him some logic
we need to define our icon style declare on iconStyle variable and define it in the constructor:
...
import Style from 'ol/style/Style';
import Icon from 'ol/style/Icon';
...
export class CenterMarkerPlugin extends BaseImageryPlugin {
private _iconStyle: Style;
constructor() {
super();
this._isEnabled = false;
this._iconStyle = new Style({
image: new Icon(({
anchor: [0.5, 46],
anchorXUnits: 'fraction',
anchorYUnits: 'pixels',
src: 'assets/icons/filters.svg'
}))
});
}
}we need to define the layer that draw our icon:
...
import {BaseImageryMap, BaseImageryPlugin, ImageryPlugin} from '@ansyn/imagery';
import Point from 'ol/geom/Point';
import Vector from 'ol/source/Vector';
import Feature from 'ol/Feature';
import VectorLayer from 'ol/layer/Vector';
...
export class CenterMarkerPlugin extends BaseImageryPlugin {
...
private _existingLayer;
...
private tryDrawCenter() {
const map: BaseImageryMap = this.communicator.ActiveMap;
const center = map.mapObject.getView().getCenter();
const iconFeature = new Feature({
geometry: new Point(center),
name: 'Center'
});
iconFeature.setStyle(this._iconStyle);
const vectorSource = new Vector({
features: [iconFeature]
});
this._existingLayer = new VectorLayer({source: vectorSource});
this.communicator.addLayer(this._existingLayer);
}
}we need to subscribe to an position change event that draw our layer:
...
import {BaseImageryMap, BaseImageryPlugin, ImageryMapPosition, ImageryPlugin} from '@ansyn/imagery';
...
export class CenterMarkerPlugin extends BaseImageryPlugin {
...
onInit() {
this.communicator.positionChanged.pipe(
debounceTime(500),
tap(this.tryDrawCenter.bind(this))
).subscribe();
}
...
}declare on your plugins in app.module.ts
...
ImageryModule.provide({
maps: [OpenLayersMap],
plugins: [CenterMarkerPlugins],
mapSourceProviders: [OpenLayerOSMSourceProvider]
}),
],
...If we run our app we see that we only draw the icon but it never remove,
let update our plugin to draw only one icon
add the following to your center-marker.plugins.ts file:
export class CenterMarkerPlugins extends BaseImageryPlugin {
private tryDrawCenter(){
this.tryDeleteCenter();
...
}
private tryDeleteCenter() {
if (this._existingLayer) {
this.communicator.removeLayer(this._existingLayer);
this._existingLayer = null;
}
}
}