import {IGeoTransformStrategy} from './geo-transform-strategy.interface'; import {IRecord, RecordCollection} from '../record-collection'; import { IGeoJSONFeature, IFeatureCollection } from '../../utility/feature-collection.interface'; import {FeatureIdService} from '../../utility/feature-id.service'; import * as turf from 'turf'; export class OwsKmlTransformStrategy implements IGeoTransformStrategy { private coordinateRegex: RegExp = /(.*?)<\/coordinates>/; private idService: FeatureIdService = new FeatureIdService(); transform(record: IRecord, collection: RecordCollection): IFeatureCollection { const pointFeature = this.hasPointFeature(record) ? this.getPointFeature(record) : null; const polygonFeature = this.hasPolygonFeature(record) ? this.getPolygonFeature(record) : null; return _([pointFeature, polygonFeature]) .filter(_.isObject) .map(this.idService.addFeatureId) .thru(features => turf.featurecollection(features)) .value(); } private getPointFeature(record: IRecord): IGeoJSONFeature { const kml = this.findPointKml(record); const coords = this.parseCoordinates(kml); return turf.point(coords[0], record); } private getPolygonFeature(record: IRecord): IGeoJSONFeature { const kml = this.findPolygonKml(record); const coords = this.parseCoordinates(kml); return turf.polygon([coords], record); } hasPointFeature(record: IRecord): boolean { return !!(this.findPointKml(record)); } hasPolygonFeature(record: IRecord): boolean { return !!(this.findPolygonKml(record)); } private findPointKml(record: IRecord): string { return record['kml_centroid'] || record['kml_centroid_tract'] || record['kml_tract_centroid']; } private findPolygonKml(record: IRecord): string { return record['kml_polygon'] || record['kml_polygon_tract'] || record['kml_tract_polygon']; } private parseCoordinates(kml: string): number[][] { const coordString = this.coordinateRegex.exec(kml)[1]; return _.map( coordString.split(' '), coords => _.map(coords.split(','), parseFloat) ); } }