| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- import {Injectable} from '@angular/core';
- import {GeoJSON} from 'ol/format';
- import {Geometry, Polygon} from 'ol/geom';
- import {Vector as VectorSource} from 'ol/source';
- import {getCenter} from 'ol/extent';
- import {transform} from 'ol/proj';
- import {HsEventBusService, HsMapService} from 'hslayers-ng';
- @Injectable({providedIn: 'root'})
- export class FieldService {
- fields: VectorSource<Geometry>;
- //TODO: temporarry hard-coded hack
- field1GeoJSON = {
- type: 'Polygon',
- coordinates: [
- [
- [17.008032903697003, 49.259378350222214],
- [17.012346093160815, 49.26055145480218],
- [17.01341275235608, 49.25661998865008],
- [17.01578237120672, 49.251834177355896],
- [17.01243531034079, 49.24966645404407],
- [17.009126895621744, 49.24897297823598],
- [17.003117114964958, 49.253454830509305],
- [17.008032903697003, 49.259378350222214],
- ],
- ],
- };
- //TODO: temporarry hard-coded hack
- field2GeoJSON = {
- type: 'Polygon',
- coordinates: [
- [
- [17.002437217427214, 49.25406053771264],
- [17.007010834533514, 49.25949599987935],
- [17.00652649276053, 49.26616621617807],
- [16.994875655608688, 49.25981844649525],
- [16.995730316423206, 49.257965703041684],
- [17.002437217427214, 49.25406053771264],
- ],
- ],
- };
- //TODO: temporarry hard-coded hack
- field3GeoJSON = {
- type: 'Polygon',
- coordinates: [
- [
- [16.993895078820575, 49.259216136348286],
- [16.994671522235812, 49.257860846173166],
- [17.00155277758227, 49.25349827686348],
- [16.99702124804218, 49.246825312276215],
- [16.993862809154038, 49.243797217302074],
- [16.97947178114977, 49.24513873718192],
- [16.980782403841776, 49.246567855409126],
- [16.980234692917616, 49.251993865297734],
- [16.982332050970445, 49.25428043019449],
- [16.98326065796653, 49.25618643740068],
- [16.99037376067523, 49.25783927642802],
- [16.993895078820575, 49.259216136348286],
- ],
- ],
- };
- selectableLayers = ['Farma'];
- selectedField;
- constructor(
- private hsEventBus: HsEventBusService,
- private hsMapService: HsMapService
- ) {
- this.hsEventBus.vectorQueryFeatureSelection.subscribe((data) => {
- if (
- !this.isValidGeometry(data.feature) ||
- !this.isValidLayer(data.feature)
- ) {
- return;
- }
- this.selectedField = data.feature.getGeometry() as Polygon;
- });
- //TODO: temporary hard-coded hack
- this.fields = new VectorSource({
- features: [
- new GeoJSON().readFeature(this.field1GeoJSON, {
- dataProjection: 'EPSG:4326',
- featureProjection: 'EPSG:5514',
- }),
- ],
- });
- this.fields.addFeatures([
- new GeoJSON().readFeature(this.field2GeoJSON, {
- dataProjection: 'EPSG:4326',
- featureProjection: 'EPSG:5514',
- }),
- ]);
- this.fields.addFeatures([
- new GeoJSON().readFeature(this.field3GeoJSON, {
- dataProjection: 'EPSG:4326',
- featureProjection: 'EPSG:5514',
- }),
- ]);
- }
- noFieldSelected(): boolean {
- return this.selectedField === undefined;
- }
- getCentroidOfField(field: Geometry) {
- return {
- type: 'Point',
- coordinates: transform(
- getCenter(field.getExtent()),
- 'EPSG:5514',
- 'EPSG:4326'
- ),
- };
- }
- getSelectedFieldCentroid() {
- return this.getCentroidOfField(this.selectedField);
- }
- getSelectedFieldGeoJSON() {
- return {
- type: 'Polygon',
- coordinates: this.selectedField
- .clone()
- .transform('EPSG:5514', 'EPSG:4326')
- .getCoordinates(),
- };
- }
- /**
- * Check whether selected feature geometry type is valid
- * (API expects polygon only)
- */
- isValidGeometry(feature) {
- if (!feature) {
- return false;
- }
- return feature.getGeometry().getType() == 'Polygon';
- }
- /**
- * Check whether user clicked into one of selectable layers
- */
- isValidLayer(feature) {
- const layer = this.hsMapService.getLayerForFeature(feature);
- return this.selectableLayers.includes(layer.get('title'));
- }
- }
|