qwc2 2025.9.24 → 2025.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,7 +4,7 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
4
4
  *
5
5
  * This source code is licensed under the BSD-style license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
- */import React from"react";import{connect}from"react-redux";import dateParser,{Format}from"any-date-parser";import dayjs from"dayjs";import utc from"dayjs/plugin/utc";import isEmpty from"lodash.isempty";import isEqual from"lodash.isequal";import ol from"openlayers";import PropTypes from"prop-types";import{createSelector}from"reselect";import{v1 as uuidv1}from"uuid";import{setLayerDimensions,addLayerFeatures,refreshLayer,removeLayer,LayerRole}from"../actions/layers";import{setCurrentTask,setCurrentTaskBlocked}from"../actions/task";import Icon from"../components/Icon";import ResizeableWindow from"../components/ResizeableWindow";import FixedTimeline from"../components/timeline/FixedTimeline";import InfiniteTimeline from"../components/timeline/InfiniteTimeline";import TimelineFeaturesSlider from"../components/timeline/TimelineFeaturesSlider";import ButtonBar from"../components/widgets/ButtonBar";import NumberInput from"../components/widgets/NumberInput";import ToggleSwitch from"../components/widgets/ToggleSwitch";import IdentifyUtils from"../utils/IdentifyUtils";import LayerUtils from"../utils/LayerUtils";import LocaleUtils from"../utils/LocaleUtils";import VectorLayerUtils from"../utils/VectorLayerUtils";import markerIcon from"../utils/img/marker-icon.png";import"./style/TimeManager.css";dayjs.extend(utc);var DateUnitLabels={"ms":LocaleUtils.trmsg("timemanager.unit.milliseconds"),"s":LocaleUtils.trmsg("timemanager.unit.seconds"),"m":LocaleUtils.trmsg("timemanager.unit.minutes"),"h":LocaleUtils.trmsg("timemanager.unit.hours"),"d":LocaleUtils.trmsg("timemanager.unit.days"),"M":LocaleUtils.trmsg("timemanager.unit.months"),"y":LocaleUtils.trmsg("timemanager.unit.years"),"10y":LocaleUtils.trmsg("timemanager.unit.decade"),"100y":LocaleUtils.trmsg("timemanager.unit.century")};var qgisDateFormat=new Format({// $dateExpr $hour $minute $second $millisecond $zone $offset
7
+ */import React from"react";import{connect}from"react-redux";import dateParser,{Format}from"any-date-parser";import dayjs from"dayjs";import utc from"dayjs/plugin/utc";import isEmpty from"lodash.isempty";import isEqual from"lodash.isequal";import ol from"openlayers";import PropTypes from"prop-types";import{createSelector}from"reselect";import{v4 as uuidv4}from"uuid";import{setLayerDimensions,addLayerFeatures,refreshLayer,removeLayer,LayerRole}from"../actions/layers";import{setCurrentTask,setCurrentTaskBlocked}from"../actions/task";import Icon from"../components/Icon";import ResizeableWindow from"../components/ResizeableWindow";import FixedTimeline from"../components/timeline/FixedTimeline";import InfiniteTimeline from"../components/timeline/InfiniteTimeline";import TimelineFeaturesSlider from"../components/timeline/TimelineFeaturesSlider";import ButtonBar from"../components/widgets/ButtonBar";import NumberInput from"../components/widgets/NumberInput";import ToggleSwitch from"../components/widgets/ToggleSwitch";import IdentifyUtils from"../utils/IdentifyUtils";import LayerUtils from"../utils/LayerUtils";import LocaleUtils from"../utils/LocaleUtils";import VectorLayerUtils from"../utils/VectorLayerUtils";import markerIcon from"../utils/img/marker-icon.png";import"./style/TimeManager.css";dayjs.extend(utc);var DateUnitLabels={"ms":LocaleUtils.trmsg("timemanager.unit.milliseconds"),"s":LocaleUtils.trmsg("timemanager.unit.seconds"),"m":LocaleUtils.trmsg("timemanager.unit.minutes"),"h":LocaleUtils.trmsg("timemanager.unit.hours"),"d":LocaleUtils.trmsg("timemanager.unit.days"),"M":LocaleUtils.trmsg("timemanager.unit.months"),"y":LocaleUtils.trmsg("timemanager.unit.years"),"10y":LocaleUtils.trmsg("timemanager.unit.decade"),"100y":LocaleUtils.trmsg("timemanager.unit.century")};var qgisDateFormat=new Format({// $dateExpr $hour $minute $second $millisecond $zone $offset
8
8
  matcher:/^(.*?)[\s,-]*([01]\d|2[0-3]):([0-5]\d)(?::([0-5]\d|60)(?:[.,](\d{9}|\d{6}|\d{1,3}))?)?[\s,-]*\(?(UTC)?[\s,-]*([+-]0\d?:?(?:[0-5]\d)?)?[\s,-]*\)?$/i,// eslint-disable-next-line
9
9
  handler:function handler(_ref){var _ref2=_slicedToArray(_ref,8),match=_ref2[0],dateExpr=_ref2[1],hour=_ref2[2],minute=_ref2[3],second=_ref2[4],millisecond=_ref2[5],zone=_ref2[6],offset=_ref2[7];var result={};if(dateExpr){result=this.parser.attempt(dateExpr);if(result.invalid){return result}}result.hour=hour;result.minute=minute;if(second){result.second=second}if(millisecond&&millisecond.length>3){result.millisecond=millisecond.slice(0,3)}else if(millisecond){result.millisecond=millisecond}if(offset){result.offset=offset}return result}});dateParser.addFormat(qgisDateFormat);// QGIS server does not return any feature that does not have "enddate" set.
10
10
  // To workaround this limitation, a placeholder date is used to make features
@@ -15,7 +15,7 @@ handler:function handler(_ref){var _ref2=_slicedToArray(_ref,8),match=_ref2[0],d
15
15
  var DUMMY_END_DATE=new Date("9999-01-01 00:00:00");/**
16
16
  * Allows controling the time dimension of temporal WMS layers.
17
17
  */var TimeManager=/*#__PURE__*/function(_React$Component){function TimeManager(props){var _this;_classCallCheck(this,TimeManager);_this=_callSuper(this,TimeManager,[props]);_defineProperty(_this,"renderBody",function(){var timeButtons=[{key:"rewind",tooltip:LocaleUtils.tr("timemanager.rewind"),icon:"nav-start"},{key:"now",tooltip:LocaleUtils.tr("timemanager.now"),icon:"today"},{key:"prev",tooltip:LocaleUtils.tr("timemanager.stepback"),icon:"nav-left"},{key:"playrev",tooltip:LocaleUtils.tr("timemanager.playrev"),icon:"triangle-left",disabled:_this.state.animationActive},{key:"stop",tooltip:LocaleUtils.tr("timemanager.stop"),icon:"square",disabled:!_this.state.animationActive},{key:"play",tooltip:LocaleUtils.tr("timemanager.play"),icon:"triangle-right",disabled:_this.state.animationActive},{key:"next",tooltip:LocaleUtils.tr("timemanager.stepfwd"),icon:"nav-right"},{key:"loop",tooltip:LocaleUtils.tr("timemanager.loop"),icon:"refresh",pressed:_this.state.animationLoop}];var markerConfiguration=_objectSpread(_objectSpread({},TimeManager.defaultProps.markerConfiguration),_this.props.markerConfiguration);var options=/*#__PURE__*/React.createElement("div",{className:"time-manager-options"},/*#__PURE__*/React.createElement("table",null,/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("timemanager.stepsize"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{max:100,min:1,mobile:true,onChange:function onChange(value){return _this.setState({stepSize:value})},value:_this.state.stepSize})),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.setState({stepSizeUnit:ev.target.value})},value:_this.state.stepSizeUnit},_this.props.stepUnits.map(function(unit){return/*#__PURE__*/React.createElement("option",{key:unit,value:unit},LocaleUtils.tr(DateUnitLabels[unit]))})))),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("timemanager.animationinterval"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{max:10,min:1,mobile:true,onChange:function onChange(value){return _this.setState({animationInterval:value})},value:_this.state.animationInterval})),/*#__PURE__*/React.createElement("td",null,"\xA0",LocaleUtils.tr("timemanager.unit.seconds"))),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("timemanager.timeline"),":"),/*#__PURE__*/React.createElement("td",{colSpan:"2"},/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.setState({timelineMode:ev.target.value})},value:_this.state.timelineMode},/*#__PURE__*/React.createElement("option",{value:"fixed"},LocaleUtils.tr("timemanager.timeline_fixed")),/*#__PURE__*/React.createElement("option",{value:"infinite"},LocaleUtils.tr("timemanager.timeline_infinite"))))),_this.state.timelineDisplay!=="hidden"?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("timemanager.timelinedisplay"),":"),/*#__PURE__*/React.createElement("td",{colSpan:"2"},/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.setState({timelineDisplay:ev.target.value})},value:_this.state.timelineDisplay},/*#__PURE__*/React.createElement("option",{value:"minimal"},LocaleUtils.tr("timemanager.displayminimal")),/*#__PURE__*/React.createElement("option",{value:"features"},LocaleUtils.tr("timemanager.displayfeatures")),/*#__PURE__*/React.createElement("option",{value:"layers"},LocaleUtils.tr("timemanager.displaylayers"))))):null)));var timeSpan=_this.state.endTime!==null?_this.state.endTime.diff(_this.state.startTime):dayjs().diff(_this.state.startTime);var Timeline=_this.state.timelineMode==="infinite"?InfiniteTimeline:FixedTimeline;var filterActive=!isEmpty(_this.props.filter.filterParams)||!!_this.props.filter.filterGeom;var startdate=_this.state.timeData.values.length>0?_this.state.timeData.values[0].hour(0).minute(0).second(0):null;var enddate=_this.state.timeData.values.length>0?_this.state.timeData.values[_this.state.timeData.values.length-1].hour(23).minute(59).second(59):null;if(startdate&&_this.props.filter.timeRange&&dayjs(_this.props.filter.timeRange.tstart)>startdate){startdate=dayjs(_this.props.filter.timeRange.tstart)}if(enddate&&_this.props.filter.timeRange&&dayjs(_this.props.filter.timeRange.tend)<enddate){enddate=dayjs(_this.props.filter.timeRange.tend)}return/*#__PURE__*/React.createElement("div",{className:"time-manager-body",role:"body"},/*#__PURE__*/React.createElement("div",{className:"time-manager-toolbar"},/*#__PURE__*/React.createElement("div",{className:"time-manager-toolbar-controls"},/*#__PURE__*/React.createElement("span",{className:"time-manager-toolbar-block"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("timemanager.toggle")),/*#__PURE__*/React.createElement(ToggleSwitch,{active:_this.state.timeEnabled,onChange:_this.toggleTimeEnabled})),/*#__PURE__*/React.createElement(ButtonBar,{buttons:timeButtons,disabled:!_this.state.timeEnabled,onClick:_this.animationButtonClicked}),_this.props.markerConfiguration.markersAvailable?/*#__PURE__*/React.createElement("span",{className:"time-manager-toolbar-block"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("timemanager.markers"),": \xA0"),/*#__PURE__*/React.createElement(ToggleSwitch,{active:_this.state.markersEnabled,onChange:function onChange(value){return _this.setState({markersEnabled:value})},readOnly:!_this.state.markersCanBeEnabled})):null),/*#__PURE__*/React.createElement("div",{className:"time-manager-options-menubutton"},/*#__PURE__*/React.createElement("button",{className:"button"+(_this.state.settingsPopup?" pressed":""),onClick:function onClick(){return _this.setState(function(state){return{settingsPopup:!state.settingsPopup}})}},/*#__PURE__*/React.createElement(Icon,{icon:"cog"})),_this.state.settingsPopup?options:null)),filterActive?/*#__PURE__*/React.createElement("div",{className:"time-manager-filter-warning"},/*#__PURE__*/React.createElement(Icon,{icon:"warning"})," ",LocaleUtils.tr("timemanager.filterwarning")," ",/*#__PURE__*/React.createElement("button",{className:"button",onClick:function onClick(){return _this.props.setCurrentTask("MapFilter")},type:"button"},LocaleUtils.tr("timemanager.edit"))):null,/*#__PURE__*/React.createElement("div",{className:"time-manager-timeline"},/*#__PURE__*/React.createElement(Timeline,{currentTimestamp:_this.state.currentTimestamp,dataEndTime:enddate,dataStartTime:startdate,dateFormat:_this.props.dateFormat,dialogWidth:_this.state.dialogWidth,endTime:_this.state.endTime,setEndTime:_this.setEndTime,setMarkersCanBeEnabled:function setMarkersCanBeEnabled(value){return _this.setState({markersCanBeEnabled:value,markersEnabled:false})},setStartTime:_this.setStartTime,startTime:_this.state.startTime,timeSpan:timeSpan},function(computePixelFromTime,computeTimeFromPixel){return/*#__PURE__*/React.createElement(TimelineFeaturesSlider,{computePixelFromTime:computePixelFromTime,computeTimeFromPixel:computeTimeFromPixel,currentTimestamp:_this.state.currentTimestamp,cursorFormat:_this.props.cursorFormat,dateFormat:_this.props.dateFormat,displayMode:_this.state.timelineDisplay,endTime:_this.state.endTime,markerConfiguration:markerConfiguration,markersEnabled:_this.state.markersEnabled,startTime:_this.state.startTime,stepSizeUnit:_this.state.stepSizeUnit,timeEnabled:_this.state.timeEnabled,timeFeatures:_this.state.timeFeatures,timestampChanged:function timestampChanged(timestamp){return _this.setState({currentTimestamp:timestamp})}})})))});_defineProperty(_this,"dialogGeomChanged",function(geom){_this.setState({dialogWidth:geom.docked?document.body.offsetWidth:geom.width})});_defineProperty(_this,"toggleTimeEnabled",function(enabled){clearInterval(_this.animationTimer);clearTimeout(_this.updateMapMarkersTimeout);_this.animationTimer=null;_this.updateMapMarkersTimeout=null;_this.setState(function(state){return{timeEnabled:enabled,currentTimestamp:+state.startTime,animationActive:false,timeMarkers:null}})});_defineProperty(_this,"animationButtonClicked",function(action){_this.stopAnimation();if(action==="rewind"){_this.setState(function(state){return{currentTimestamp:+state.startTime,animationActive:false}})}else if(action==="now"){_this.setState({currentTimestamp:+dayjs(),animationActive:false})}else if(action==="prev"){var newday=_this.step(-1);_this.setState(function(state){return{currentTimestamp:+Math.max(newday,state.startTime)}})}else if(action==="next"){var _newday=_this.step(+1);_this.setState(function(state){return{currentTimestamp:+Math.min(_newday,state.endTime)}})}else if(action==="stop"){/* Already stopped above, pass */}else if(action==="play"){var curday=dayjs(_this.state.currentTimestamp);var lastday=_this.state.endTime;if(curday>=lastday){_this.setState(function(state){return{currentTimestamp:+state.startTime}})}_this.animationTimer=setInterval(function(){_this.advanceAnimation(+1)},1000*_this.state.animationInterval);_this.setState({animationActive:true})}else if(action==="playrev"){var _curday=dayjs(_this.state.currentTimestamp);var firstday=_this.state.startTime;if(_curday<=firstday){_this.setState(function(state){return{currentTimestamp:+state.endTime}})}_this.animationTimer=setInterval(function(){_this.advanceAnimation(-1)},1000*_this.state.animationInterval);_this.setState({animationActive:true})}else if(action==="loop"){_this.setState(function(state){return{animationLoop:!state.animationLoop}})}});_defineProperty(_this,"advanceAnimation",function(stepdir){var newday=_this.step(stepdir);var firstday=_this.state.startTime;var lastday=_this.state.endTime;if(newday>lastday){if(stepdir>0&&_this.state.animationLoop){_this.setState(function(state){return{currentTimestamp:+state.startTime}})}else{_this.setState({currentTimestamp:+lastday,animationActive:false});clearInterval(_this.animationTimer);_this.animationTimer=null}}else if(newday<firstday){if(stepdir<0&&_this.state.animationLoop){_this.setState(function(state){return{currentTimestamp:+state.endTime}})}else{_this.setState({currentTimestamp:+firstday,animationActive:false});clearInterval(_this.animationTimer);_this.animationTimer=null}}else{_this.setState({currentTimestamp:+newday})}});_defineProperty(_this,"stopAnimation",function(){if(_this.state.animationActive){clearInterval(_this.animationTimer);_this.animationTimer=null;_this.setState({animationActive:false})}});_defineProperty(_this,"onClose",function(){_this.toggleTimeEnabled(false);_this.setState({visible:false});_this.props.removeLayer("timemarkers")});_defineProperty(_this,"step",function(direction){var day=dayjs(_this.state.currentTimestamp);var num=parseInt(_this.state.stepSizeUnit.slice(0,-1),10)||1;var newday=day.add(direction*_this.state.stepSize*num,_this.state.stepSizeUnit.slice(-1));if(_this.state.stepSizeUnit.endsWith("m")){return newday.second(0)}else if(_this.state.stepSizeUnit.endsWith("h")){return newday.second(0).minute(0)}else if(_this.state.stepSizeUnit.endsWith("d")){return newday.second(0).minute(0).hour(0)}else if(_this.state.stepSizeUnit.endsWith("M")){return newday.second(0).minute(0).hour(0).date(1)}else if(_this.state.stepSizeUnit.endsWith("y")){return newday.second(0).minute(0).hour(0).date(1).month(0)}return newday});_defineProperty(_this,"updateLayerTimeDimensions",function(timeData,currentTimestamp){var currentTime=_this.state.timeEnabled?new Date(currentTimestamp).toISOString():undefined;timeData.layers.forEach(function(layer){var dimensions=timeData.layerDimensions[layer.id].reduce(function(res,dimension){res[dimension.toUpperCase()]=currentTime;return res},_objectSpread({},layer.dimensionValues||{}));_this.props.setLayerDimensions(layer.id,dimensions)})});_defineProperty(_this,"setStartTime",function(value){var date=(value?dayjs.utc(value):_this.state.timeData.values[0]).hour(0).minute(0).second(0);if(_this.props.filter.timeRange&&_this.props.filter.timeRange.tstart>date){date=_this.props.filter.timeRange.tstart}if(date<_this.state.endTime){_this.setState({startTime:date})}if(dayjs(_this.state.currentTimestamp)<date){_this.setState({currentTimestamp:+date})}});_defineProperty(_this,"setEndTime",function(value){var date=(value?dayjs.utc(value):_this.state.timeData.values[_this.state.timeData.values.length-1]).hour(23).minute(59).second(59);if(_this.props.filter.timeRange&&_this.props.filter.timeRange.tend<date){date=_this.props.filter.timeRange.tstart}if(date>_this.state.startTime){_this.setState({endTime:date});if(dayjs(_this.state.currentTimestamp)>date){_this.setState({currentTimestamp:+date})}}});_defineProperty(_this,"updateTimeFeatures",function(timeData){// Query all features in extent
18
- var xmin=_this.props.map.bbox.bounds[0];var ymin=_this.props.map.bbox.bounds[1];var xmax=_this.props.map.bbox.bounds[2];var ymax=_this.props.map.bbox.bounds[3];var filterGeom=VectorLayerUtils.geoJSONGeomToWkt({type:"Polygon",coordinates:[[[xmin,ymin],[xmax,ymin],[xmax,ymax],[xmin,ymax],[xmin,ymin]]]});var pending=0;var reqUUID=uuidv1();timeData.layers.forEach(function(layer){var sublayerattrs=timeData.attributes[layer.id];var queryLayers=Object.keys(sublayerattrs).join(",");var options={GEOMCENTROID:true,with_htmlcontent:false,feature_count:_this.state.featureCount};var request=IdentifyUtils.buildFilterRequest(layer,queryLayers,filterGeom,_this.props.map,options);IdentifyUtils.sendRequest(request,function(response){if(_this.state.timeFeatures&&_this.state.timeFeatures.reqUUID===reqUUID&&response){var layerFeatures=IdentifyUtils.parseXmlResponse(response,_this.props.map.projection,layer);_this.setState(function(state){return{timeFeatures:{features:_objectSpread(_objectSpread({},state.timeFeatures.features),Object.entries(layerFeatures).reduce(function(res,_ref3){var _ref4=_slicedToArray(_ref3,2),layername=_ref4[0],features=_ref4[1];return _objectSpread(_objectSpread({},res),{},_defineProperty({},layername,features.map(function(feature){var startdate=dateParser.fromString(feature.properties[sublayerattrs[feature.layername][0]]);var enddate=dateParser.fromString(feature.properties[sublayerattrs[feature.layername][1]]);if(enddate&&!enddate.invalid&&enddate.getFullYear()===DUMMY_END_DATE.getFullYear()){enddate=null}return _objectSpread(_objectSpread({},feature),{},{id:feature.layername+"::"+feature.id,properties:_objectSpread(_objectSpread({},feature.properties),{},{__startdate:dayjs.utc(startdate),__enddate:dayjs.utc(enddate)})})})))},{})),attributes:_objectSpread(_objectSpread({},state.timeFeatures.attributes),Object.entries(layerFeatures).reduce(function(res,_ref5){var _ref6=_slicedToArray(_ref5,2),layername=_ref6[0],features=_ref6[1];return _objectSpread(_objectSpread({},res),{},_defineProperty({},layername,Object.keys((features[0]||{properties:{}}).properties)))},{})),pendingRequests:state.timeFeatures.pendingRequests-1}}})}else{_this.setState(function(state){return{timeFeatures:_objectSpread(_objectSpread({},state.timeFeatures),{},{pendingRequests:state.timeFeatures.pendingRequests-1})}})}});++pending});_this.setState({timeFeatures:{features:{},attributes:{},pendingRequests:pending,reqUUID:reqUUID}})});_defineProperty(_this,"markerStyle",function(feature){var style=[];var currentTime=dayjs(_this.state.currentTimestamp);var featprops=feature.getProperties();if(_this.state.timeEnabled&&(featprops.__startdate>currentTime||featprops.__enddate<currentTime)){return style}var offset=_this.props.markerConfiguration.markerOffset;if(_this.props.markerConfiguration.markerPins){style.push(new ol.style.Style({image:new ol.style.Icon({anchor:[0.5,1],anchorXUnits:"fraction",anchorYUnits:"fraction",displacement:offset,src:markerIcon})}))}if(featprops.__startdate.isValid()&&featprops.__enddate.isValid()){var deltaT=_this.state.endTime.diff(_this.state.startTime);var markerStartTime=dayjs(Math.max(_this.state.startTime,featprops.__startdate));var markerEndTime=dayjs(Math.min(_this.state.endTime,featprops.__enddate));var markerMidTime=0.5*(markerStartTime+markerEndTime);var gradBarMaxWidth=192;var gradBarHeight=16;var gradBarWidth=gradBarMaxWidth*markerEndTime.diff(markerStartTime)/deltaT;var canvas=document.createElement("canvas");var context=canvas.getContext("2d");var gradient=context.createLinearGradient(-gradBarWidth*(markerMidTime-_this.state.startTime)/(markerMidTime-markerStartTime),0,gradBarWidth*(_this.state.endTime-markerMidTime)/(markerEndTime-markerMidTime),0);var nStops=_this.props.markerConfiguration.gradient.length;_this.props.markerConfiguration.gradient.forEach(function(stop,idx){gradient.addColorStop(idx/(nStops-1),stop)});style.push(new ol.style.Style({image:new ol.style.RegularShape({fill:new ol.style.Fill({color:gradient}),stroke:new ol.style.Stroke({color:"black",width:1}),points:4,radius:gradBarWidth/Math.SQRT2,radius2:gradBarWidth,angle:0,scale:[1,1/gradBarWidth*gradBarHeight],displacement:[offset[0],offset[1]*gradBarHeight/gradBarWidth-gradBarHeight]})}))}return style});_this.animationTimer=null;_this.updateMapMarkersTimeout=null;TimeManager.defaultState.stepSize=props.defaultStepSize;TimeManager.defaultState.stepSizeUnit=props.defaultStepUnit;TimeManager.defaultState.timelineDisplay=props.defaultTimelineDisplay;TimeManager.defaultState.timeEnabled=props.defaultEnabled;if(!props.stepUnits.includes(TimeManager.defaultState.stepSizeUnit)){TimeManager.defaultState.stepSizeUnit=props.stepUnits[0]}TimeManager.defaultState.animationInterval=props.defaultAnimationInterval;TimeManager.defaultState.featureCount=props.defaultFeatureCount;TimeManager.defaultState.timelineMode=props.defaultTimelineMode;TimeManager.defaultState.timelineDisplay=props.defaultTimelineDisplay;_this.state=_objectSpread(_objectSpread({},_this.state),TimeManager.defaultState);return _this}_inherits(TimeManager,_React$Component);return _createClass(TimeManager,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){var _this2=this;var activated=!prevProps.active&&this.props.active;if(activated){this.setState({visible:true});// Clear task immediately after showing, visibility is controlled by internal state
18
+ var xmin=_this.props.map.bbox.bounds[0];var ymin=_this.props.map.bbox.bounds[1];var xmax=_this.props.map.bbox.bounds[2];var ymax=_this.props.map.bbox.bounds[3];var filterGeom=VectorLayerUtils.geoJSONGeomToWkt({type:"Polygon",coordinates:[[[xmin,ymin],[xmax,ymin],[xmax,ymax],[xmin,ymax],[xmin,ymin]]]});var pending=0;var reqUUID=uuidv4();timeData.layers.forEach(function(layer){var sublayerattrs=timeData.attributes[layer.id];var queryLayers=Object.keys(sublayerattrs).join(",");var options={GEOMCENTROID:true,with_htmlcontent:false,feature_count:_this.state.featureCount};var request=IdentifyUtils.buildFilterRequest(layer,queryLayers,filterGeom,_this.props.map,options);IdentifyUtils.sendRequest(request,function(response){if(_this.state.timeFeatures&&_this.state.timeFeatures.reqUUID===reqUUID&&response){var layerFeatures=IdentifyUtils.parseXmlResponse(response,_this.props.map.projection,layer);_this.setState(function(state){return{timeFeatures:{features:_objectSpread(_objectSpread({},state.timeFeatures.features),Object.entries(layerFeatures).reduce(function(res,_ref3){var _ref4=_slicedToArray(_ref3,2),layername=_ref4[0],features=_ref4[1];return _objectSpread(_objectSpread({},res),{},_defineProperty({},layername,features.map(function(feature){var startdate=dateParser.fromString(feature.properties[sublayerattrs[feature.layername][0]]);var enddate=dateParser.fromString(feature.properties[sublayerattrs[feature.layername][1]]);if(enddate&&!enddate.invalid&&enddate.getFullYear()===DUMMY_END_DATE.getFullYear()){enddate=null}return _objectSpread(_objectSpread({},feature),{},{id:feature.layername+"::"+feature.id,properties:_objectSpread(_objectSpread({},feature.properties),{},{__startdate:dayjs.utc(startdate),__enddate:dayjs.utc(enddate)})})})))},{})),attributes:_objectSpread(_objectSpread({},state.timeFeatures.attributes),Object.entries(layerFeatures).reduce(function(res,_ref5){var _ref6=_slicedToArray(_ref5,2),layername=_ref6[0],features=_ref6[1];return _objectSpread(_objectSpread({},res),{},_defineProperty({},layername,Object.keys((features[0]||{properties:{}}).properties)))},{})),pendingRequests:state.timeFeatures.pendingRequests-1}}})}else{_this.setState(function(state){return{timeFeatures:_objectSpread(_objectSpread({},state.timeFeatures),{},{pendingRequests:state.timeFeatures.pendingRequests-1})}})}});++pending});_this.setState({timeFeatures:{features:{},attributes:{},pendingRequests:pending,reqUUID:reqUUID}})});_defineProperty(_this,"markerStyle",function(feature){var style=[];var currentTime=dayjs(_this.state.currentTimestamp);var featprops=feature.getProperties();if(_this.state.timeEnabled&&(featprops.__startdate>currentTime||featprops.__enddate<currentTime)){return style}var offset=_this.props.markerConfiguration.markerOffset;if(_this.props.markerConfiguration.markerPins){style.push(new ol.style.Style({image:new ol.style.Icon({anchor:[0.5,1],anchorXUnits:"fraction",anchorYUnits:"fraction",displacement:offset,src:markerIcon})}))}if(featprops.__startdate.isValid()&&featprops.__enddate.isValid()){var deltaT=_this.state.endTime.diff(_this.state.startTime);var markerStartTime=dayjs(Math.max(_this.state.startTime,featprops.__startdate));var markerEndTime=dayjs(Math.min(_this.state.endTime,featprops.__enddate));var markerMidTime=0.5*(markerStartTime+markerEndTime);var gradBarMaxWidth=192;var gradBarHeight=16;var gradBarWidth=gradBarMaxWidth*markerEndTime.diff(markerStartTime)/deltaT;var canvas=document.createElement("canvas");var context=canvas.getContext("2d");var gradient=context.createLinearGradient(-gradBarWidth*(markerMidTime-_this.state.startTime)/(markerMidTime-markerStartTime),0,gradBarWidth*(_this.state.endTime-markerMidTime)/(markerEndTime-markerMidTime),0);var nStops=_this.props.markerConfiguration.gradient.length;_this.props.markerConfiguration.gradient.forEach(function(stop,idx){gradient.addColorStop(idx/(nStops-1),stop)});style.push(new ol.style.Style({image:new ol.style.RegularShape({fill:new ol.style.Fill({color:gradient}),stroke:new ol.style.Stroke({color:"black",width:1}),points:4,radius:gradBarWidth/Math.SQRT2,radius2:gradBarWidth,angle:0,scale:[1,1/gradBarWidth*gradBarHeight],displacement:[offset[0],offset[1]*gradBarHeight/gradBarWidth-gradBarHeight]})}))}return style});_this.animationTimer=null;_this.updateMapMarkersTimeout=null;TimeManager.defaultState.stepSize=props.defaultStepSize;TimeManager.defaultState.stepSizeUnit=props.defaultStepUnit;TimeManager.defaultState.timelineDisplay=props.defaultTimelineDisplay;TimeManager.defaultState.timeEnabled=props.defaultEnabled;if(!props.stepUnits.includes(TimeManager.defaultState.stepSizeUnit)){TimeManager.defaultState.stepSizeUnit=props.stepUnits[0]}TimeManager.defaultState.animationInterval=props.defaultAnimationInterval;TimeManager.defaultState.featureCount=props.defaultFeatureCount;TimeManager.defaultState.timelineMode=props.defaultTimelineMode;TimeManager.defaultState.timelineDisplay=props.defaultTimelineDisplay;_this.state=_objectSpread(_objectSpread({},_this.state),TimeManager.defaultState);return _this}_inherits(TimeManager,_React$Component);return _createClass(TimeManager,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){var _this2=this;var activated=!prevProps.active&&this.props.active;if(activated){this.setState({visible:true});// Clear task immediately after showing, visibility is controlled by internal state
19
19
  this.props.setCurrentTask(null)}if(!this.state.visible&&prevState.visible){this.updateLayerTimeDimensions(this.state.timeData,this.state.currentTimestamp);this.setState(TimeManager.defaultState);return}if(!activated&&!this.state.visible){return}if(this.props.theme!==prevProps.theme){this.setState({currentTimestamp:null})}if(activated||!isEqual(this.props.layerVisibilities,prevProps.layerVisibilities)){this.stopAnimation();var timeData={layerDimensions:{},values:new Set,attributes:{},layers:[]};this.props.layers.forEach(function(layer){if(layer.type==="wms"){var layertimeData=LayerUtils.getTimeDimensionValues(layer);if(layertimeData.names.size>0){timeData.layerDimensions[layer.id]=_toConsumableArray(layertimeData.names);layertimeData.values.forEach(function(x){return timeData.values.add(x)});timeData.attributes[layer.id]=_objectSpread(_objectSpread({},timeData.attributes[layer.id]),layertimeData.attributes);// Filter time dimension from layer - object cache in updateTimeFeatures below should query all objects regardless of time
20
20
  var layerNoTimeDims=_objectSpread({},layer);var layerDimsUC=timeData.layerDimensions[layer.id].map(function(name){return name.toUpperCase()});layerNoTimeDims.dimensionValues=Object.entries(layerNoTimeDims.dimensionValues||{}).reduce(function(res,_ref7){var _ref8=_slicedToArray(_ref7,2),key=_ref8[0],value=_ref8[1];if(layerDimsUC.includes(key)){return res}else{return _objectSpread(_objectSpread({},res),{},_defineProperty({},key,value))}},{});timeData.layers.push(layerNoTimeDims)}}});timeData.values=_toConsumableArray(timeData.values).sort().map(function(d){return dayjs.utc(d)});var startdate=timeData.values.length>0?timeData.values[0].hour(0).minute(0).second(0):null;var enddate=timeData.values.length>0?timeData.values[timeData.values.length-1].hour(23).minute(59).second(59):null;if(startdate&&this.props.filter.timeRange&&dayjs(this.props.filter.timeRange.tstart)>startdate){startdate=dayjs(this.props.filter.timeRange.tstart)}if(enddate&&this.props.filter.timeRange&&dayjs(this.props.filter.timeRange.tend)<enddate){enddate=dayjs(this.props.filter.timeRange.tend)}this.setState(function(state){var _state$currentTimesta;return{timeData:timeData,currentTimestamp:(_state$currentTimesta=state.currentTimestamp)!==null&&_state$currentTimesta!==void 0?_state$currentTimesta:timeData.values.length>0?+timeData.values[0]:null,startTime:startdate,endTime:enddate&&enddate.year()!==DUMMY_END_DATE.getFullYear()?enddate:null}});this.updateTimeFeatures(timeData)}else{if(this.state.currentTimestamp!==prevState.currentTimestamp||this.state.timeEnabled!==prevState.timeEnabled){this.updateLayerTimeDimensions(this.state.timeData,this.state.currentTimestamp)}if(this.state.visible&&this.props.map.bbox!==prevProps.map.bbox){this.updateTimeFeatures(this.state.timeData)}}if(this.props.filter.timeRange!==prevProps.filter.timeRange){this.setState(function(state){var startdate=state.timeData.values.length>0?state.timeData.values[0].hour(0).minute(0).second(0):null;var enddate=state.timeData.values.length>0?state.timeData.values[state.timeData.values.length-1].hour(23).minute(59).second(59):null;if(startdate&&_this2.props.filter.timeRange&&dayjs(_this2.props.filter.timeRange.tstart)>startdate){startdate=dayjs(_this2.props.filter.timeRange.tstart)}if(enddate&&_this2.props.filter.timeRange&&dayjs(_this2.props.filter.timeRange.tend)<enddate){enddate=dayjs(_this2.props.filter.timeRange.tend)}return{startTime:startdate,endTime:enddate&&enddate.year()!==DUMMY_END_DATE.getFullYear()?enddate:null}})}if(this.state.animationActive&&this.state.animationInterval!==prevState.animationInterval){this.stopAnimation()}if(!this.state.markersEnabled&&prevState.markersEnabled){this.props.removeLayer("timemarkers")}else if(this.state.markersEnabled&&this.state.timeFeatures){if(this.state.markersEnabled!==prevState.markersEnabled||this.state.timeFeatures!==prevState.timeFeatures){var layer={id:"timemarkers",role:LayerRole.MARKER,styleFunction:this.markerStyle,rev:+new Date};var features=Object.values(this.state.timeFeatures.features).flat();this.props.addLayerFeatures(layer,features,true)}else if(this.state.currentTimestamp!==prevState.currentTimestamp||this.state.timeEnabled!==prevState.timeEnabled){this.props.refreshLayer(function(layer){return layer.id==="timemarkers"})}}}},{key:"render",value:function render(){if(!this.state.visible){return null}var timeValues=this.state.timeData.values;var body=null;if(timeValues.length<2){body=/*#__PURE__*/React.createElement("div",{role:"body"},/*#__PURE__*/React.createElement("div",{className:"time-manager-notemporaldata"},LocaleUtils.tr("timemanager.notemporaldata")))}else{body=this.renderBody(timeValues)}return/*#__PURE__*/React.createElement(ResizeableWindow,{dockable:"bottom",icon:"clock",initialHeight:this.props.geometry.initialHeight,initialWidth:this.props.geometry.initialWidth,initialX:this.props.geometry.initialX,initialY:this.props.geometry.initialY,initiallyDocked:this.props.geometry.initiallyDocked,onClose:this.onClose,onGeometryChanged:this.dialogGeomChanged,scrollable:true,splitScreenWhenDocked:true,title:LocaleUtils.tr("timemanager.title")},body)}}])}(React.Component);_defineProperty(TimeManager,"propTypes",{active:PropTypes.bool,addLayerFeatures:PropTypes.func,/** The format of the time cursor label. Either `date`, `time` or `datetime`. */cursorFormat:PropTypes.string,/** The date format in the time controls, i.e. YYYY-MM-DD. */dateFormat:PropTypes.string,/** The default interval for the temporal animation, in seconds. */defaultAnimationInterval:PropTypes.number,/** Default for TimeManager enabled when loading application. `true` or `false` */defaultEnabled:PropTypes.bool,/** The default number of features that will be requested. */defaultFeatureCount:PropTypes.number,/** The default step size for the temporal animation, in step units. */defaultStepSize:PropTypes.number,/** The default step unit for the temporal animation, one of `ms`, `s`, `m`, `d`, `M`, `y`, `10y`, `100y` */defaultStepUnit:PropTypes.string,/** The default timeline display mode. One of `hidden`, `minimal`, `features`, `layers`. */defaultTimelineDisplay:PropTypes.string,/** The default timeline mode. One of `fixed`, `infinite`. */defaultTimelineMode:PropTypes.string,filter:PropTypes.object,/** Default window geometry with size, position and docking status. Positive position values (including '0') are related to top (InitialY) and left (InitialX), negative values (including '-0') to bottom (InitialY) and right (InitialX). */geometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool}),layerVisibilities:PropTypes.object,layers:PropTypes.array,map:PropTypes.object,/** The feature marker configuration. */markerConfiguration:PropTypes.shape({markersAvailable:PropTypes.bool,gradient:PropTypes.arrayOf(PropTypes.string),markerOffset:PropTypes.array,markerPins:PropTypes.bool}),refreshLayer:PropTypes.func,removeLayer:PropTypes.func,setCurrentTask:PropTypes.func,setLayerDimensions:PropTypes.func,/** The available temporal animation step units. */stepUnits:PropTypes.arrayOf(PropTypes.string),theme:PropTypes.object});_defineProperty(TimeManager,"defaultProps",{cursorFormat:"datetime",dateFormat:"YYYY-MM-DD[\n]HH:mm:ss",defaultAnimationInterval:1,defaultEnabled:false,defaultStepSize:1,defaultStepUnit:"d",defaultFeatureCount:100,defaultTimelineMode:"fixed",markerConfiguration:{markersAvailable:true,gradient:["#f7af7d","#eacc6e","#fef89a","#c5e09b","#a3d29c","#7cc096","#79c8c5","#34afce"],markerOffset:[0,0],markerPins:true},featureTimelineAvailable:true,stepUnits:["s","m","h","d","M","y"],geometry:{initialWidth:800,initialHeight:320,initiallyDocked:true}});_defineProperty(TimeManager,"defaultState",{timeEnabled:false,startTime:null,endTime:null,currentTimestamp:null,animationActive:false,animationLoop:false,animationInterval:1,stepSize:1,stepSizeUnit:"d",// 1 day
21
21
  dialogWidth:0,markersEnabled:false,markersCanBeEnabled:true,timelineDisplay:"layers",featureCount:100,timelineMode:"continuous",timeData:{layerDimensions:{},values:[],attributes:{},layers:[]},timeFeatures:null,settingsPopup:false,visible:false,geometry:{initialWidth:900,initialHeight:320,initialX:null,initialY:null,initiallyDocked:false}});var layerVisiblitiesSelector=createSelector([function(state){return state.layers.flat}],function(layers){return layers.filter(function(layer){return layer.type==="wms"}).reduce(function(res,layer){return _objectSpread(_objectSpread({},res),{},_defineProperty({},layer.id,LayerUtils.computeLayerVisibility(layer)))},{})});var selector=createSelector([function(state){return state},layerVisiblitiesSelector],function(state,layerVisibilities){return{active:state.task.id==="TimeManager",layers:state.layers.flat,filter:state.layers.filter,layerVisibilities:layerVisibilities,map:state.map,theme:state.theme.current}});export default connect(selector,{addLayerFeatures:addLayerFeatures,refreshLayer:refreshLayer,removeLayer:removeLayer,setLayerDimensions:setLayerDimensions,setCurrentTask:setCurrentTask,setCurrentTaskBlocked:setCurrentTaskBlocked})(TimeManager);
@@ -4,8 +4,8 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
4
4
  *
5
5
  * This source code is licensed under the BSD-style license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
- */import React from"react";import{Line}from"react-chartjs-2";import{connect}from"react-redux";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{v1 as uuidv1}from"uuid";import{LayerRole}from"../actions/layers";import{setCurrentTask}from"../actions/task";import Icon from"../components/Icon";import ResizeableWindow from"../components/ResizeableWindow";import ButtonBar from"../components/widgets/ButtonBar";import NumberInput from"../components/widgets/NumberInput";import TextInput from"../components/widgets/TextInput";import IdentifyUtils from"../utils/IdentifyUtils";import LayerUtils from"../utils/LayerUtils";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import"./style/ValueTool.css";/**
7
+ */import React from"react";import{Line}from"react-chartjs-2";import{connect}from"react-redux";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{v4 as uuidv4}from"uuid";import{LayerRole}from"../actions/layers";import{setCurrentTask}from"../actions/task";import Icon from"../components/Icon";import ResizeableWindow from"../components/ResizeableWindow";import ButtonBar from"../components/widgets/ButtonBar";import NumberInput from"../components/widgets/NumberInput";import TextInput from"../components/widgets/TextInput";import IdentifyUtils from"../utils/IdentifyUtils";import LayerUtils from"../utils/LayerUtils";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import"./style/ValueTool.css";/**
8
8
  * Displays raster band values of active raster layers at the hovered mouse position,
9
9
  * queried via GetFeatureInfo.
10
- */var ValueTool=/*#__PURE__*/function(_React$Component){function ValueTool(props){var _this;_classCallCheck(this,ValueTool);_this=_callSuper(this,ValueTool,[props]);_defineProperty(_this,"renderTableTab",function(){if(isEmpty(_this.state.values)){return/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement("i",null,LocaleUtils.tr("valuetool.nodata")))}return/*#__PURE__*/React.createElement("table",{className:"valuetool-table"},/*#__PURE__*/React.createElement("tbody",null,Object.entries(_this.state.values).map(function(_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],data=_ref2[1];var bandvals=Object.entries(data.values);if(_this.state.selectedBands[key]){var activeBands=_this.state.selectedBands[key].split(",").map(function(x){return parseInt(x.trim(),10)-1});bandvals=bandvals.filter(function(_,i){return activeBands.includes(i)})}return[/*#__PURE__*/React.createElement("tr",{key:key},/*#__PURE__*/React.createElement("th",{colSpan:"2"},data.layertitle)),bandvals.map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),bandname=_ref4[0],bandval=_ref4[1];return/*#__PURE__*/React.createElement("tr",{key:key+"_"+bandname},/*#__PURE__*/React.createElement("td",null,bandname),/*#__PURE__*/React.createElement("td",null,bandval))})]})))});_defineProperty(_this,"renderGraphTab",function(){var values=Object.values(_this.state.values).map(function(x){return Object.values(x.values)}).flat().filter(function(x){return x});var data={labels:values.map(function(_,i){return String(i)}),datasets:[{data:values,borderColor:"rgb(255,0,0)",borderWidth:2}]};var yAxisConfig={};if(_this.state.graphMinY){yAxisConfig.min=_this.state.graphMinY}if(_this.state.graphMaxY){yAxisConfig.max=_this.state.graphMaxY}var options={responsive:true,maintainAspectRatio:false,animation:{duration:0},scales:{y:yAxisConfig}};return/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("div",{className:"valuetool-chart-options"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("valuetool.ymin"),": "),/*#__PURE__*/React.createElement(NumberInput,{onChange:function onChange(value){return _this.setState({graphMinY:value})},value:_this.state.graphMinY}),/*#__PURE__*/React.createElement("span",{style:{marginLeft:"0.5em"}}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("valuetool.ymax"),": "),/*#__PURE__*/React.createElement(NumberInput,{onChange:function onChange(value){return _this.setState({graphMaxY:value})},value:_this.state.graphMaxY})),/*#__PURE__*/React.createElement("div",{className:"valuetool-chart-container"},/*#__PURE__*/React.createElement(Line,{data:data,options:options})))});_defineProperty(_this,"renderOptionsTab",function(){var options=_this.state.showLayers==="selected"||_this.state.showBands==="selected"?[/*#__PURE__*/React.createElement("hr",{key:"sep"}),/*#__PURE__*/React.createElement("div",{key:"label"},LocaleUtils.tr("valuetool.selectlayersbands")),/*#__PURE__*/React.createElement("table",{className:"valuetool-table-selection",key:"table"},/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("th",null,LocaleUtils.tr("valuetool.layer")),_this.state.showBands==="selected"?/*#__PURE__*/React.createElement("th",null,LocaleUtils.tr("valuetool.bands")):null),_this.props.layers.map(function(layer){var sublayers=LayerUtils.getSublayerNames(layer,true,function(sublayer){return sublayer.geometryType===null});return sublayers.map(function(sublayer){var key=layer.url+"#"+sublayer;return/*#__PURE__*/React.createElement("tr",{key:key},/*#__PURE__*/React.createElement("td",null,_this.state.showLayers==="selected"?/*#__PURE__*/React.createElement(Icon,{icon:_this.state.selectedLayers.includes(key)?"checked":"unchecked",onClick:function onClick(){return _this.toggleSelectedLayer(key)}}):null,sublayer),_this.state.showBands==="selected"?/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(TextInput,{onChange:function onChange(value){return _this.setLayerBands(key,value)},placeholder:LocaleUtils.tr("valuetool.all"),value:_this.state.selectedBands[key]||""})):null)})})))]:null;return/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("table",{className:"valuetool-table-options"},/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("valuetool.showlayers"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.setState({showLayers:ev.target.value})},value:_this.state.showLayers},/*#__PURE__*/React.createElement("option",{value:"visible"},LocaleUtils.tr("valuetool.visiblelayers")),/*#__PURE__*/React.createElement("option",{value:"all"},LocaleUtils.tr("valuetool.alllayers")),/*#__PURE__*/React.createElement("option",{value:"selected"},LocaleUtils.tr("valuetool.selectedlayers"))))),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("valuetool.showbands"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.setState({showBands:ev.target.value})},value:_this.state.showBands},/*#__PURE__*/React.createElement("option",{value:"all"},LocaleUtils.tr("valuetool.allbands")),/*#__PURE__*/React.createElement("option",{value:"selected"},LocaleUtils.tr("valuetool.selectedbands"))))))),options)});_defineProperty(_this,"toggleSelectedLayer",function(key){_this.setState(function(state){return{selectedLayers:state.selectedLayers.includes(key)?state.selectedLayers.filter(function(x){return x!==key}):[].concat(_toConsumableArray(state.selectedLayers),[key])}})});_defineProperty(_this,"setLayerBands",function(key,bands){_this.setState(function(state){return{selectedBands:_objectSpread(_objectSpread({},state.selectedBands),{},_defineProperty({},key,_toConsumableArray(new Set(bands.split(",").map(function(x){return parseInt(x.trim(),10)||0}).sort().filter(function(x){return x}))).join(", ")))}})});_defineProperty(_this,"onWindowClose",function(){_this.props.setCurrentTask(null)});_defineProperty(_this,"scheduleQueryValues",function(ev){var coordinate=ev.coordinate;clearTimeout(_this.queryTimeout);_this.queryTimeout=setTimeout(function(){return _this.queryValues(coordinate)},100)});_defineProperty(_this,"queryValues",function(coordinate){var options={info_format:"text/xml",feature_count:5,with_geometry:false,with_htmlcontent:false};var reqId=uuidv1();_this.reqId=reqId;var newValues={};_this.props.layers.forEach(function(layer){var layerActive=null;if(_this.state.showLayers==="all"){layerActive=function layerActive(){return true}}else if(_this.state.showLayers==="selected"){layerActive=function layerActive(sublayer){return _this.state.selectedLayers.includes(layer.url+"#"+sublayer.name)}}else if(_this.state.showLayers==="visible"){layerActive=function layerActive(sublayer){return sublayer.visibility}}var queryLayers=LayerUtils.getSublayerNames(layer,true,function(sublayer){return layerActive(sublayer)&&sublayer.geometryType===null});if(isEmpty(queryLayers)){return}// Preserve previous result rows, but with empty values, to prevent "flickering"
10
+ */var ValueTool=/*#__PURE__*/function(_React$Component){function ValueTool(props){var _this;_classCallCheck(this,ValueTool);_this=_callSuper(this,ValueTool,[props]);_defineProperty(_this,"renderTableTab",function(){if(isEmpty(_this.state.values)){return/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement("i",null,LocaleUtils.tr("valuetool.nodata")))}return/*#__PURE__*/React.createElement("table",{className:"valuetool-table"},/*#__PURE__*/React.createElement("tbody",null,Object.entries(_this.state.values).map(function(_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],data=_ref2[1];var bandvals=Object.entries(data.values);if(_this.state.selectedBands[key]){var activeBands=_this.state.selectedBands[key].split(",").map(function(x){return parseInt(x.trim(),10)-1});bandvals=bandvals.filter(function(_,i){return activeBands.includes(i)})}return[/*#__PURE__*/React.createElement("tr",{key:key},/*#__PURE__*/React.createElement("th",{colSpan:"2"},data.layertitle)),bandvals.map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),bandname=_ref4[0],bandval=_ref4[1];return/*#__PURE__*/React.createElement("tr",{key:key+"_"+bandname},/*#__PURE__*/React.createElement("td",null,bandname),/*#__PURE__*/React.createElement("td",null,bandval))})]})))});_defineProperty(_this,"renderGraphTab",function(){var values=Object.values(_this.state.values).map(function(x){return Object.values(x.values)}).flat().filter(function(x){return x});var data={labels:values.map(function(_,i){return String(i)}),datasets:[{data:values,borderColor:"rgb(255,0,0)",borderWidth:2}]};var yAxisConfig={};if(_this.state.graphMinY){yAxisConfig.min=_this.state.graphMinY}if(_this.state.graphMaxY){yAxisConfig.max=_this.state.graphMaxY}var options={responsive:true,maintainAspectRatio:false,animation:{duration:0},scales:{y:yAxisConfig}};return/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("div",{className:"valuetool-chart-options"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("valuetool.ymin"),": "),/*#__PURE__*/React.createElement(NumberInput,{onChange:function onChange(value){return _this.setState({graphMinY:value})},value:_this.state.graphMinY}),/*#__PURE__*/React.createElement("span",{style:{marginLeft:"0.5em"}}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("valuetool.ymax"),": "),/*#__PURE__*/React.createElement(NumberInput,{onChange:function onChange(value){return _this.setState({graphMaxY:value})},value:_this.state.graphMaxY})),/*#__PURE__*/React.createElement("div",{className:"valuetool-chart-container"},/*#__PURE__*/React.createElement(Line,{data:data,options:options})))});_defineProperty(_this,"renderOptionsTab",function(){var options=_this.state.showLayers==="selected"||_this.state.showBands==="selected"?[/*#__PURE__*/React.createElement("hr",{key:"sep"}),/*#__PURE__*/React.createElement("div",{key:"label"},LocaleUtils.tr("valuetool.selectlayersbands")),/*#__PURE__*/React.createElement("table",{className:"valuetool-table-selection",key:"table"},/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("th",null,LocaleUtils.tr("valuetool.layer")),_this.state.showBands==="selected"?/*#__PURE__*/React.createElement("th",null,LocaleUtils.tr("valuetool.bands")):null),_this.props.layers.map(function(layer){var sublayers=LayerUtils.getSublayerNames(layer,true,function(sublayer){return sublayer.geometryType===null});return sublayers.map(function(sublayer){var key=layer.url+"#"+sublayer;return/*#__PURE__*/React.createElement("tr",{key:key},/*#__PURE__*/React.createElement("td",null,_this.state.showLayers==="selected"?/*#__PURE__*/React.createElement(Icon,{icon:_this.state.selectedLayers.includes(key)?"checked":"unchecked",onClick:function onClick(){return _this.toggleSelectedLayer(key)}}):null,sublayer),_this.state.showBands==="selected"?/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(TextInput,{onChange:function onChange(value){return _this.setLayerBands(key,value)},placeholder:LocaleUtils.tr("valuetool.all"),value:_this.state.selectedBands[key]||""})):null)})})))]:null;return/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("table",{className:"valuetool-table-options"},/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("valuetool.showlayers"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.setState({showLayers:ev.target.value})},value:_this.state.showLayers},/*#__PURE__*/React.createElement("option",{value:"visible"},LocaleUtils.tr("valuetool.visiblelayers")),/*#__PURE__*/React.createElement("option",{value:"all"},LocaleUtils.tr("valuetool.alllayers")),/*#__PURE__*/React.createElement("option",{value:"selected"},LocaleUtils.tr("valuetool.selectedlayers"))))),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("valuetool.showbands"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.setState({showBands:ev.target.value})},value:_this.state.showBands},/*#__PURE__*/React.createElement("option",{value:"all"},LocaleUtils.tr("valuetool.allbands")),/*#__PURE__*/React.createElement("option",{value:"selected"},LocaleUtils.tr("valuetool.selectedbands"))))))),options)});_defineProperty(_this,"toggleSelectedLayer",function(key){_this.setState(function(state){return{selectedLayers:state.selectedLayers.includes(key)?state.selectedLayers.filter(function(x){return x!==key}):[].concat(_toConsumableArray(state.selectedLayers),[key])}})});_defineProperty(_this,"setLayerBands",function(key,bands){_this.setState(function(state){return{selectedBands:_objectSpread(_objectSpread({},state.selectedBands),{},_defineProperty({},key,_toConsumableArray(new Set(bands.split(",").map(function(x){return parseInt(x.trim(),10)||0}).sort().filter(function(x){return x}))).join(", ")))}})});_defineProperty(_this,"onWindowClose",function(){_this.props.setCurrentTask(null)});_defineProperty(_this,"scheduleQueryValues",function(ev){var coordinate=ev.coordinate;clearTimeout(_this.queryTimeout);_this.queryTimeout=setTimeout(function(){return _this.queryValues(coordinate)},100)});_defineProperty(_this,"queryValues",function(coordinate){var options={info_format:"text/xml",feature_count:5,with_geometry:false,with_htmlcontent:false};var reqId=uuidv4();_this.reqId=reqId;var newValues={};_this.props.layers.forEach(function(layer){var layerActive=null;if(_this.state.showLayers==="all"){layerActive=function layerActive(){return true}}else if(_this.state.showLayers==="selected"){layerActive=function layerActive(sublayer){return _this.state.selectedLayers.includes(layer.url+"#"+sublayer.name)}}else if(_this.state.showLayers==="visible"){layerActive=function layerActive(sublayer){return sublayer.visibility}}var queryLayers=LayerUtils.getSublayerNames(layer,true,function(sublayer){return layerActive(sublayer)&&sublayer.geometryType===null});if(isEmpty(queryLayers)){return}// Preserve previous result rows, but with empty values, to prevent "flickering"
11
11
  queryLayers.forEach(function(sublayername){var key=layer.url+"#"+sublayername;if(_this.state.values[key]){newValues[key]=_objectSpread(_objectSpread({},_this.state.values[key]),{},{values:Object.fromEntries(Object.keys(_this.state.values[key].values).map(function(k){return[k,""]}))})}});var request=IdentifyUtils.buildRequest(layer,queryLayers.join(","),coordinate,_this.props.map,options);IdentifyUtils.sendRequest(request,function(response){if(_this.reqId===reqId){var result=IdentifyUtils.parseXmlResponse(response||"",_this.props.map.projection,layer);_this.setState(function(state){return{values:_objectSpread(_objectSpread({},state.values),Object.entries(result).reduce(function(res,_ref5){var _ref6=_slicedToArray(_ref5,2),sublayername=_ref6[0],features=_ref6[1];var key=layer.url+"#"+sublayername;res[key]={layertitle:features[0].layertitle,values:features[0].properties};return res},{}))}})}})});_this.setState({values:newValues})});_this.queryTimeout=null;_this.reqId=null;_this.state=ValueTool.defaultState;return _this}_inherits(ValueTool,_React$Component);return _createClass(ValueTool,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(this.props.enabled&&!prevProps.enabled){MapUtils.getHook(MapUtils.ADD_POINTER_MOVE_LISTENER)(this.scheduleQueryValues)}else if(!this.props.enabled&&prevProps.enabled){MapUtils.getHook(MapUtils.REMOVE_POINTER_MOVE_LISTENER)(this.scheduleQueryValues);clearTimeout(this.queryTimeout);this.queryTimeout=null;this.setState(ValueTool.defaultState)}}},{key:"render",value:function render(){var _this2=this;if(!this.props.enabled){return null}var buttons=[{key:"Table",label:LocaleUtils.tr("valuetool.table")},{key:"Graph",label:LocaleUtils.tr("valuetool.graph")},{key:"Options",label:LocaleUtils.tr("valuetool.options")}];var tab=null;if(this.state.activeTab==="Table"){tab=this.renderTableTab()}else if(this.state.activeTab==="Graph"){tab=this.renderGraphTab()}else if(this.state.activeTab==="Options"){tab=this.renderOptionsTab()}return/*#__PURE__*/React.createElement(ResizeableWindow,{dockable:this.props.geometry.side,icon:"info-sign",initialHeight:this.props.geometry.initialHeight,initialWidth:this.props.geometry.initialWidth,initialX:this.props.geometry.initialX,initialY:this.props.geometry.initialY,initiallyDocked:this.props.geometry.initiallyDocked,onClose:this.onWindowClose,title:LocaleUtils.tr("valuetool.title")},/*#__PURE__*/React.createElement("div",{className:"valuetool-body",role:"body"},/*#__PURE__*/React.createElement(ButtonBar,{active:this.state.activeTab,buttons:buttons,onClick:function onClick(key){return _this2.setState({activeTab:key})}}),tab))}}])}(React.Component);_defineProperty(ValueTool,"propTypes",{/** The number of decimal places to display for elevation values. */enabled:PropTypes.bool,/** Default window geometry with size, position and docking status. Positive position values (including '0') are related to top (InitialY) and left (InitialX), negative values (including '-0') to bottom (InitialY) and right (InitialX). */geometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool,side:PropTypes.string}),layers:PropTypes.array,map:PropTypes.object,setCurrentTask:PropTypes.func});_defineProperty(ValueTool,"defaultProps",{geometry:{initialWidth:240,initialHeight:320,initialX:0,initialY:0,initiallyDocked:false,side:"left"}});_defineProperty(ValueTool,"defaultState",{activeTab:"Table",showLayers:"visible",showBands:"all",selectedLayers:[],selectedBands:{},values:{},graphMinY:null,graphMaxY:null});export default connect(function(state){return{enabled:state.task.id==="ValueTool",layers:state.layers.flat.filter(function(layer){return(layer.role===LayerRole.THEME||layer.role===LayerRole.USERLAYER)&&(layer.infoFormats||[]).includes("text/xml")}),map:state.map}},{setCurrentTask:setCurrentTask})(ValueTool);
@@ -4,7 +4,7 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
4
4
  *
5
5
  * This source code is licensed under the BSD-style license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
- */import React from"react";import{connect}from"react-redux";import isEmpty from"lodash.isempty";import ol from"openlayers";import PropTypes from"prop-types";import{v1 as uuidv1}from"uuid";import{LayerRole}from"../../actions/layers";import{setSnappingConfig}from"../../actions/map";import Icon from"../../components/Icon";import Spinner from"../../components/widgets/Spinner";import IdentifyUtils from"../../utils/IdentifyUtils";import LocaleUtils from"../../utils/LocaleUtils";import MapUtils from"../../utils/MapUtils";import VectorLayerUtils from"../../utils/VectorLayerUtils";import SnapInteraction from"./SnapInteraction";import"./style/SnappingSupport.css";/**
7
+ */import React from"react";import{connect}from"react-redux";import isEmpty from"lodash.isempty";import ol from"openlayers";import PropTypes from"prop-types";import{v4 as uuidv4}from"uuid";import{LayerRole}from"../../actions/layers";import{setSnappingConfig}from"../../actions/map";import Icon from"../../components/Icon";import Spinner from"../../components/widgets/Spinner";import IdentifyUtils from"../../utils/IdentifyUtils";import LocaleUtils from"../../utils/LocaleUtils";import MapUtils from"../../utils/MapUtils";import VectorLayerUtils from"../../utils/VectorLayerUtils";import SnapInteraction from"./SnapInteraction";import"./style/SnappingSupport.css";/**
8
8
  * Snapping support for the map component.
9
9
  */var SnappingSupport=/*#__PURE__*/function(_React$Component){function SnappingSupport(props){var _this;_classCallCheck(this,SnappingSupport);_this=_callSuper(this,SnappingSupport,[props]);_defineProperty(_this,"state",{reqId:null,// FeatureInfo request ID
10
10
  invalid:true,// Whether the feature cache needs to be rebuilt
@@ -18,6 +18,6 @@ var added=false;if(_this.props.mapObj.snapping.enabled){for(var i=0;i<interactio
18
18
  var scale=MapUtils.computeForZoom(_this.props.mapObj.scales,_this.props.mapObj.zoom);var snapLayers=(snappingConfig.snaplayers||[]).reduce(function(res,cur){if(cur.min!==undefined&&cur.min!==null&&scale<cur.min){// Below scale range
19
19
  return res}if(cur.max!==undefined&&cur.max!==null&&scale>=cur.max){// Above scale range
20
20
  return res}return[].concat(_toConsumableArray(res),[cur.name])},[]);// Gather local snap layers
21
- var snapToWfs=scale<snappingConfig.wfsMaxScale;var localLayers=[];_this.props.layers.forEach(function(layer){if(layer.role===LayerRole.USERLAYER&&(layer.type==="vector"||layer.type==="wfs"&&snapToWfs)){var olLayer=_this.props.map.getLayers().getArray().find(function(l){return l.get("id")===layer.id});if(olLayer&&olLayer.getSource()&&olLayer.getSource().getFeaturesInExtent){localLayers.push(olLayer)}}});_this.setState({reqId:null,havesnaplayers:!isEmpty(snapLayers)||!isEmpty(localLayers)});if(!_this.snapInteraction.getMap()||!_this.snapInteraction.getActive()){return}if(snapLayers.length===0){_this.addLocalSnapFeatures(localLayers);return}var xmin=_this.props.mapObj.bbox.bounds[0];var ymin=_this.props.mapObj.bbox.bounds[1];var xmax=_this.props.mapObj.bbox.bounds[2];var ymax=_this.props.mapObj.bbox.bounds[3];var filterGeom=VectorLayerUtils.geoJSONGeomToWkt({type:"Polygon",coordinates:[[[xmin,ymin],[xmax,ymin],[xmax,ymax],[xmin,ymax],[xmin,ymin]]]});var options={LAYERATTRIBS:JSON.stringify(snapLayers.reduce(function(res,key){return _objectSpread(_objectSpread({},res),{},_defineProperty({},key,[]))},{})),with_htmlcontent:false,with_bbox:false,feature_count:snappingConfig.featureCount||500};var request=IdentifyUtils.buildFilterRequest(themeLayer,snapLayers.join(","),filterGeom,_this.props.mapObj,options);var reqId=uuidv1();_this.setState({reqId:reqId});IdentifyUtils.sendRequest(request,function(response){if(_this.state.reqId!==reqId){return}if(response){var result=IdentifyUtils.parseXmlResponse(response,_this.props.mapObj.projection,themeLayer);var features=Object.values(result).reduce(function(res,cur){return[].concat(_toConsumableArray(res),_toConsumableArray(cur))},[]);var format=new ol.format.GeoJSON;var olFeatures=format.readFeatures({type:"FeatureCollection",features:features.map(function(feature){return _objectSpread(_objectSpread({},feature),{},{id:uuidv1()})})});_this.source.addFeatures(olFeatures);// Add features from local layers
21
+ var snapToWfs=scale<snappingConfig.wfsMaxScale;var localLayers=[];_this.props.layers.forEach(function(layer){if(layer.role===LayerRole.USERLAYER&&(layer.type==="vector"||layer.type==="wfs"&&snapToWfs)){var olLayer=_this.props.map.getLayers().getArray().find(function(l){return l.get("id")===layer.id});if(olLayer&&olLayer.getSource()&&olLayer.getSource().getFeaturesInExtent){localLayers.push(olLayer)}}});_this.setState({reqId:null,havesnaplayers:!isEmpty(snapLayers)||!isEmpty(localLayers)});if(!_this.snapInteraction.getMap()||!_this.snapInteraction.getActive()){return}if(snapLayers.length===0){_this.addLocalSnapFeatures(localLayers);return}var xmin=_this.props.mapObj.bbox.bounds[0];var ymin=_this.props.mapObj.bbox.bounds[1];var xmax=_this.props.mapObj.bbox.bounds[2];var ymax=_this.props.mapObj.bbox.bounds[3];var filterGeom=VectorLayerUtils.geoJSONGeomToWkt({type:"Polygon",coordinates:[[[xmin,ymin],[xmax,ymin],[xmax,ymax],[xmin,ymax],[xmin,ymin]]]});var options={LAYERATTRIBS:JSON.stringify(snapLayers.reduce(function(res,key){return _objectSpread(_objectSpread({},res),{},_defineProperty({},key,[]))},{})),with_htmlcontent:false,with_bbox:false,feature_count:snappingConfig.featureCount||500};var request=IdentifyUtils.buildFilterRequest(themeLayer,snapLayers.join(","),filterGeom,_this.props.mapObj,options);var reqId=uuidv4();_this.setState({reqId:reqId});IdentifyUtils.sendRequest(request,function(response){if(_this.state.reqId!==reqId){return}if(response){var result=IdentifyUtils.parseXmlResponse(response,_this.props.mapObj.projection,themeLayer);var features=Object.values(result).reduce(function(res,cur){return[].concat(_toConsumableArray(res),_toConsumableArray(cur))},[]);var format=new ol.format.GeoJSON;var olFeatures=format.readFeatures({type:"FeatureCollection",features:features.map(function(feature){return _objectSpread(_objectSpread({},feature),{},{id:uuidv4()})})});_this.source.addFeatures(olFeatures);// Add features from local layers
22
22
  _this.addLocalSnapFeatures(localLayers);_this.setState({invalid:false,reqId:null,havesnaplayers:true})}else{_this.setState({reqId:null})}})});_defineProperty(_this,"addLocalSnapFeatures",function(localLayers){var extent=_this.props.mapObj.bbox.bounds;var projection=ol.proj.get(_this.props.mapObj.projection);localLayers.forEach(function(olLayer){var olFeatures=olLayer.getSource().getFeaturesInExtent(extent,projection);_this.source.addFeatures(olFeatures)})});_this.source=new ol.source.Vector;_this.snapInteraction=new SnapInteraction({source:_this.source,edge:_this.snapToEdge(props.mapObj.snapping),vertex:_this.snapToVertex(props.mapObj.snapping)});_this.snapInteraction.setActive(_this.props.mapObj.snapping.active);_this.inEventHandler=false;props.map.getInteractions().on("add",_this.handleInteractionAdded);props.map.getInteractions().on("remove",_this.handleInteractionRemoved);MapUtils.registerHook(MapUtils.GET_SNAPPED_COORDINATES_FROM_PIXEL_HOOK,function(pixel){var coo=props.map.getCoordinateFromPixel(pixel);var snapResult=_this.snapInteraction.snapTo(pixel,coo,props.map);return snapResult?props.map.getCoordinateFromPixel(snapResult.vertexPixel):coo});return _this}_inherits(SnappingSupport,_React$Component);return _createClass(SnappingSupport,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){var _this2=this;if(this.state.drawing&&(this.props.mapObj.bbox!==prevProps.mapObj.bbox||this.props.theme!==prevProps.theme)){this.setState({invalid:true});this.refreshFeatureCache(true)}else if(this.state.drawing&&this.props.layers!==prevProps.layers){var layersChanged=this.props.layers.find(function(layer){if(layer.role===LayerRole.THEME){var prev=prevProps.layers.find(function(prevLayer){return layer.id===prevLayer.id});return!prev||layer.rev!==prev.rev}else if(layer.role===LayerRole.USERLAYER&&layer.type==="vector"){var _prev=prevProps.layers.find(function(prevLayer){return layer.id===prevLayer.id});return!_prev||_prev.features!==layer.features}return false});if(layersChanged){this.setState({invalid:true});// Delay to avoid refreshing the cache before QGIS Server can pick up the new feature
23
23
  setTimeout(function(){_this2.refreshFeatureCache(true)},1500)}}if(this.props.mapObj.snapping.active!==prevProps.mapObj.snapping.active||this.state.drawing!==prevState.drawing){this.snapInteraction.setActive(this.props.mapObj.snapping.active!==false);this.snapInteraction.setSnapEdge(this.snapToEdge(this.props.mapObj.snapping));this.snapInteraction.setSnapVertex(this.snapToVertex(this.props.mapObj.snapping));if(this.props.mapObj.snapping.active){this.refreshFeatureCache()}}}},{key:"render",value:function render(){var _this3=this;if(!this.state.drawing||!this.props.mapObj.snapping.enabled){return null}var disabled=!this.state.havesnaplayers||this.props.mapObj.snapping.active===false;var toolbarClass=disabled?"snapping-toolbar-inactive":"";var snapEdge=this.snapToEdge(this.props.mapObj.snapping);var snapVertex=this.snapToVertex(this.props.mapObj.snapping);return/*#__PURE__*/React.createElement("div",{className:"snapping-toolbar-container"},/*#__PURE__*/React.createElement("div",{className:toolbarClass},this.state.reqId!==null?/*#__PURE__*/React.createElement(Spinner,null):/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement("button",{className:"button"+(snapVertex?" pressed":""),onClick:function onClick(){return _this3.toggleSnap("vertex")},title:LocaleUtils.tr("snapping.vertex")},/*#__PURE__*/React.createElement(Icon,{icon:"snap_vertex",size:"large"})),/*#__PURE__*/React.createElement("button",{className:"button"+(snapEdge?" pressed":""),onClick:function onClick(){return _this3.toggleSnap("edge")},title:LocaleUtils.tr("snapping.edge")},/*#__PURE__*/React.createElement(Icon,{icon:"snap_edge",size:"large"}))),"\xA0",this.state.reqId?LocaleUtils.tr("snapping.loading"):LocaleUtils.tr("snapping.snappingenabled")))}}])}(React.Component);_defineProperty(SnappingSupport,"propTypes",{layers:PropTypes.array,map:PropTypes.object,mapObj:PropTypes.object,setSnappingConfig:PropTypes.func,task:PropTypes.string,theme:PropTypes.object});export default connect(function(state){return{layers:state.layers.flat,mapObj:state.map,task:state.task.id,theme:state.theme.current}},{setSnappingConfig:setSnappingConfig})(SnappingSupport);
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * This source code is licensed under the BSD-style license found in the
7
7
  * LICENSE file in the root directory of this source tree.
8
- */function _toConsumableArray(r){return _arrayWithoutHoles(r)||_iterableToArray(r)||_unsupportedIterableToArray(r)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _iterableToArray(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function _arrayWithoutHoles(r){if(Array.isArray(r))return _arrayLikeToArray(r)}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))})}return e}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}function _createForOfIteratorHelper(r,e){var t="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(!t){if(Array.isArray(r)||(t=_unsupportedIterableToArray(r))||e&&r&&"number"==typeof r.length){t&&(r=t);var _n=0,F=function F(){};return{s:F,n:function n(){return _n>=r.length?{done:!0}:{done:!1,value:r[_n++]}},e:function e(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function s(){t=t.call(r)},n:function n(){var r=t.next();return a=r.done,r},e:function e(r){u=!0,o=r},f:function f(){try{a||null==t["return"]||t["return"]()}finally{if(u)throw o}}}}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}var urlUtil=require("url");var axios=require("axios");var XMLParser=require("fast-xml-parser").XMLParser;var fs=require("fs");var path=require("path");var objectPath=require("object-path");var isEmpty=require("lodash.isempty");var uuidv1=require("uuid").v1;var os=require("os");var dns=require("dns");var _dns$promises=dns.promises,lookup=_dns$promises.lookup,lookupService=_dns$promises.lookupService;var hostFqdn="";var themesConfigPath=process.env.QWC2_THEMES_CONFIG||"static/themesConfig.json";var usedThemeIds=[];var autogenExternalLayers=[];function uniqueThemeId(themeName){if(!themeName){return uuidv1()}if(usedThemeIds.includes(themeName)){var i=1;for(;usedThemeIds.includes(themeName+i);++i);usedThemeIds.push(themeName+i);return themeName+i}else{usedThemeIds.push(themeName);return themeName}}// load thumbnail from file or GetMap
8
+ */function _toConsumableArray(r){return _arrayWithoutHoles(r)||_iterableToArray(r)||_unsupportedIterableToArray(r)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _iterableToArray(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function _arrayWithoutHoles(r){if(Array.isArray(r))return _arrayLikeToArray(r)}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))})}return e}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}function _createForOfIteratorHelper(r,e){var t="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(!t){if(Array.isArray(r)||(t=_unsupportedIterableToArray(r))||e&&r&&"number"==typeof r.length){t&&(r=t);var _n=0,F=function F(){};return{s:F,n:function n(){return _n>=r.length?{done:!0}:{done:!1,value:r[_n++]}},e:function e(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function s(){t=t.call(r)},n:function n(){var r=t.next();return a=r.done,r},e:function e(r){u=!0,o=r},f:function f(){try{a||null==t["return"]||t["return"]()}finally{if(u)throw o}}}}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}var urlUtil=require("url");var axios=require("axios");var XMLParser=require("fast-xml-parser").XMLParser;var fs=require("fs");var path=require("path");var objectPath=require("object-path");var isEmpty=require("lodash.isempty");var uuidv4=require("uuid").v1;var os=require("os");var dns=require("dns");var _dns$promises=dns.promises,lookup=_dns$promises.lookup,lookupService=_dns$promises.lookupService;var hostFqdn="";var themesConfigPath=process.env.QWC2_THEMES_CONFIG||"static/themesConfig.json";var usedThemeIds=[];var autogenExternalLayers=[];function uniqueThemeId(themeName){if(!themeName){return uuidv4()}if(usedThemeIds.includes(themeName)){var i=1;for(;usedThemeIds.includes(themeName+i);++i);usedThemeIds.push(themeName+i);return themeName+i}else{usedThemeIds.push(themeName);return themeName}}// load thumbnail from file or GetMap
9
9
  function getThumbnail(configItem,resultItem,layers,crs,extent,resolve,proxy){if(configItem.thumbnail!==undefined){// check if thumbnail can be read
10
10
  if(fs.existsSync("./static/assets/img/mapthumbs/"+configItem.thumbnail)){resultItem.thumbnail="img/mapthumbs/"+configItem.thumbnail;// finish task
11
11
  resolve(true);return}}/* eslint-disable-next-line */console.error("Using WMS GetMap to generate thumbnail for "+configItem.url);// WMS GetMap request
@@ -5,7 +5,7 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
5
5
  *
6
6
  * This source code is licensed under the BSD-style license found in the
7
7
  * LICENSE file in the root directory of this source tree.
8
- */import ol from"openlayers";import Proj4js from"proj4";import ConfigUtils from"./ConfigUtils";import LocaleUtils from"./LocaleUtils";var crsLabels={"EPSG:4326":"WGS 84","EPSG:3857":"WGS 84 / Pseudo Mercator"};var CoordinatesUtils={setCrsLabels:function setCrsLabels(labels){Object.assign(crsLabels,labels)},getAvailableCRS:function getAvailableCRS(){var crsList={};for(var a in Proj4js.defs){if(Object.prototype.hasOwnProperty.call(Proj4js.defs,a)){crsList[a]={label:crsLabels[a]||a}}}return crsList},getUnits:function getUnits(projection){var proj=ol.proj.get(projection);return proj.getUnits()||"degrees"},getPrecision:function getPrecision(projection){var _precisions$projectio;var precisions=ConfigUtils.getConfigProp("projections").reduce(function(res,entry){var _entry$precision;return _objectSpread(_objectSpread({},res),{},_defineProperty({},entry.code,(_entry$precision=entry.precision)!==null&&_entry$precision!==void 0?_entry$precision:0))},{});return(_precisions$projectio=precisions[projection])!==null&&_precisions$projectio!==void 0?_precisions$projectio:CoordinatesUtils.getUnits(projection)==="degrees"?4:0},getProjectionConfig:function getProjectionConfig(projection){var _config$projection;var config=ConfigUtils.getConfigProp("projections").reduce(function(res,entry){var _entry$format,_entry$addDirection,_entry$swapLonLat;res[entry.code]={format:(_entry$format=entry.format)!==null&&_entry$format!==void 0?_entry$format:"decimal",addDirection:(_entry$addDirection=entry.addDirection)!==null&&_entry$addDirection!==void 0?_entry$addDirection:"none",swapLonLat:(_entry$swapLonLat=entry.swapLonLat)!==null&&_entry$swapLonLat!==void 0?_entry$swapLonLat:false};return res},{});return(_config$projection=config[projection])!==null&&_config$projection!==void 0?_config$projection:{format:"decimal",addDirection:"none",swapLonLat:false}},getAxisOrder:function getAxisOrder(projection){var axis=ol.proj.get(projection).getAxisOrientation();return axis||"enu"},reproject:function reproject(point,source,dest){if(source===dest){return _toConsumableArray(point)}if(source&&dest){var transformed=null;try{transformed=ol.proj.transform(point,source,dest)}catch(e){transformed=[0,0]}return transformed}return null},/**
8
+ */import ol from"openlayers";import Proj4js from"proj4";import ConfigUtils from"./ConfigUtils";import LocaleUtils from"./LocaleUtils";var crsLabels={"EPSG:4326":"WGS 84","EPSG:3857":"WGS 84 / Pseudo Mercator"};var commonEsriWktLookup={"EPSG:4326":"GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]]","EPSG:3857":"PROJCS[\"WGS_1984_Web_Mercator_Auxiliary_Sphere\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Mercator_Auxiliary_Sphere\"],PARAMETER[\"False_Easting\",0.0],PARAMETER[\"False_Northing\",0.0],PARAMETER[\"Central_Meridian\",0.0],PARAMETER[\"Standard_Parallel_1\",0.0],PARAMETER[\"Auxiliary_Sphere_Type\",0.0],UNIT[\"Meter\",1.0]]"};var CoordinatesUtils={setCrsLabels:function setCrsLabels(labels){Object.assign(crsLabels,labels)},getAvailableCRS:function getAvailableCRS(){var crsList={};for(var a in Proj4js.defs){if(Object.prototype.hasOwnProperty.call(Proj4js.defs,a)){crsList[a]={label:crsLabels[a]||a}}}return crsList},getUnits:function getUnits(projection){var proj=ol.proj.get(projection);return proj.getUnits()||"degrees"},getPrecision:function getPrecision(projection){var _precisions$projectio;var precisions=ConfigUtils.getConfigProp("projections").reduce(function(res,entry){var _entry$precision;return _objectSpread(_objectSpread({},res),{},_defineProperty({},entry.code,(_entry$precision=entry.precision)!==null&&_entry$precision!==void 0?_entry$precision:0))},{});return(_precisions$projectio=precisions[projection])!==null&&_precisions$projectio!==void 0?_precisions$projectio:CoordinatesUtils.getUnits(projection)==="degrees"?4:0},getProjectionConfig:function getProjectionConfig(projection){var _config$projection;var config=ConfigUtils.getConfigProp("projections").reduce(function(res,entry){var _entry$format,_entry$addDirection,_entry$swapLonLat;res[entry.code]={format:(_entry$format=entry.format)!==null&&_entry$format!==void 0?_entry$format:"decimal",addDirection:(_entry$addDirection=entry.addDirection)!==null&&_entry$addDirection!==void 0?_entry$addDirection:"none",swapLonLat:(_entry$swapLonLat=entry.swapLonLat)!==null&&_entry$swapLonLat!==void 0?_entry$swapLonLat:false};return res},{});return(_config$projection=config[projection])!==null&&_config$projection!==void 0?_config$projection:{format:"decimal",addDirection:"none",swapLonLat:false}},getAxisOrder:function getAxisOrder(projection){var axis=ol.proj.get(projection).getAxisOrientation();return axis||"enu"},reproject:function reproject(point,source,dest){if(source===dest){return _toConsumableArray(point)}if(source&&dest){var transformed=null;try{transformed=ol.proj.transform(point,source,dest)}catch(e){transformed=[0,0]}return transformed}return null},/**
9
9
  * Reprojects a bounding box.
10
10
  *
11
11
  * @param bbox {array} [minx, miny, maxx, maxy]
@@ -26,4 +26,4 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
26
26
  * @param extent {array} [minx, miny, maxx, maxy]
27
27
  *
28
28
  * @return {bool}
29
- */isValidExtent:function isValidExtent(extent){return extent.length===4&&!(extent.indexOf(Infinity)!==-1||extent.indexOf(-Infinity)!==-1||extent.indexOf(NaN)!==-1||extent[0]>=extent[2]||extent[1]>=extent[3])},fromOgcUrnCrs:function fromOgcUrnCrs(crsStr){if(crsStr.endsWith(":CRS84")){return"EPSG:4326"}var parts=crsStr.split(":");return"EPSG:"+parts.slice(-1)},toOgcUrnCrs:function toOgcUrnCrs(crsStr){var parts=crsStr.split(":");return"urn:ogc:def:crs:"+parts[0]+"::"+parts[1]},getFormattedCoordinate:function getFormattedCoordinate(coo,srcCrs){var _options$decimals;var dstCrs=arguments.length>2&&arguments[2]!==undefined?arguments[2]:null;var options=arguments.length>3&&arguments[3]!==undefined?arguments[3]:{};var units=CoordinatesUtils.getUnits(dstCrs!==null&&dstCrs!==void 0?dstCrs:srcCrs);var decimals=(_options$decimals=options.decimals)!==null&&_options$decimals!==void 0?_options$decimals:CoordinatesUtils.getPrecision(dstCrs!==null&&dstCrs!==void 0?dstCrs:srcCrs);var _ref=function(){var config=CoordinatesUtils.getProjectionConfig(dstCrs!==null&&dstCrs!==void 0?dstCrs:srcCrs);return{format:units!=="degrees"?"decimal":config.format,addDirection:config.addDirection,swapLonLat:config.swapLonLat}}(),format=_ref.format,addDirection=_ref.addDirection,swapLonLat=_ref.swapLonLat;if(srcCrs&&dstCrs&&srcCrs!==dstCrs){coo=CoordinatesUtils.reproject(coo,srcCrs,dstCrs)}if(swapLonLat){coo=[coo[1],coo[0]]}var toDMS=function toDMS(coord){var deg=Math.floor(Math.abs(coord));var minFull=(Math.abs(coord)-deg)*60;var min=Math.floor(minFull);var sec=((minFull-min)*60).toFixed(decimals);return"".concat(deg,"\xB0 ").concat(min,"' ").concat(sec,"\"")};var toDM=function toDM(coord){var deg=Math.floor(Math.abs(coord));var min=((Math.abs(coord)-deg)*60).toFixed(decimals);return"".concat(deg,"\xB0 ").concat(min,"'")};var formatCoordinate=function formatCoordinate(value,isLat){var direction="";if(addDirection!=="none"){if(isLat){direction=value>=0?"N":"S"}else{direction=value>=0?"E":"W"}}var formatted;switch(format){case"dms":formatted=toDMS(value,decimals);break;case"dm":formatted=toDM(value,decimals);break;default:formatted=LocaleUtils.toLocaleFixed(Math.abs(value),decimals)}if(addDirection==="prefix"){return"".concat(direction).concat(formatted)}else if(addDirection==="suffix"){return"".concat(formatted).concat(direction)}return formatted};return coo.map(function(coord,idx){return formatCoordinate(coord,swapLonLat?idx===0:idx===1)}).join(", ")}};export default CoordinatesUtils;
29
+ */isValidExtent:function isValidExtent(extent){return extent.length===4&&!(extent.indexOf(Infinity)!==-1||extent.indexOf(-Infinity)!==-1||extent.indexOf(NaN)!==-1||extent[0]>=extent[2]||extent[1]>=extent[3])},fromOgcUrnCrs:function fromOgcUrnCrs(crsStr){if(crsStr.endsWith(":CRS84")){return"EPSG:4326"}var parts=crsStr.split(":");return"EPSG:"+parts.slice(-1)},toOgcUrnCrs:function toOgcUrnCrs(crsStr){var parts=crsStr.split(":");return"urn:ogc:def:crs:"+parts[0]+"::"+parts[1]},getEsriWktFromCrs:function getEsriWktFromCrs(crsStr){var epsgCode=crsStr.startsWith("EPSG:")?crsStr:CoordinatesUtils.fromOgcUrnCrs(crsStr);var projections=ConfigUtils.getConfigProp("projections")||[];var configProjection=projections.find(function(proj){return proj.code===epsgCode});if(configProjection&&configProjection.esriWkt){return configProjection.esriWkt}if(commonEsriWktLookup[epsgCode]){return commonEsriWktLookup[epsgCode]}console.warn("No ESRI WKT definition found for ".concat(epsgCode,". Shapefile export may not include projection information. Consider adding an 'esriWkt' property to the projection in config.json."));return null},getFormattedCoordinate:function getFormattedCoordinate(coo,srcCrs){var _options$decimals;var dstCrs=arguments.length>2&&arguments[2]!==undefined?arguments[2]:null;var options=arguments.length>3&&arguments[3]!==undefined?arguments[3]:{};var units=CoordinatesUtils.getUnits(dstCrs!==null&&dstCrs!==void 0?dstCrs:srcCrs);var decimals=(_options$decimals=options.decimals)!==null&&_options$decimals!==void 0?_options$decimals:CoordinatesUtils.getPrecision(dstCrs!==null&&dstCrs!==void 0?dstCrs:srcCrs);var _ref=function(){var config=CoordinatesUtils.getProjectionConfig(dstCrs!==null&&dstCrs!==void 0?dstCrs:srcCrs);return{format:units!=="degrees"?"decimal":config.format,addDirection:config.addDirection,swapLonLat:config.swapLonLat}}(),format=_ref.format,addDirection=_ref.addDirection,swapLonLat=_ref.swapLonLat;if(srcCrs&&dstCrs&&srcCrs!==dstCrs){coo=CoordinatesUtils.reproject(coo,srcCrs,dstCrs)}if(swapLonLat){coo=[coo[1],coo[0]]}var toDMS=function toDMS(coord){var deg=Math.floor(Math.abs(coord));var minFull=(Math.abs(coord)-deg)*60;var min=Math.floor(minFull);var sec=((minFull-min)*60).toFixed(decimals);return"".concat(deg,"\xB0 ").concat(min,"' ").concat(sec,"\"")};var toDM=function toDM(coord){var deg=Math.floor(Math.abs(coord));var min=((Math.abs(coord)-deg)*60).toFixed(decimals);return"".concat(deg,"\xB0 ").concat(min,"'")};var formatCoordinate=function formatCoordinate(value,isLat){var direction="";if(addDirection!=="none"){if(isLat){direction=value>=0?"N":"S"}else{direction=value>=0?"E":"W"}}var formatted;switch(format){case"dms":formatted=toDMS(value,decimals);break;case"dm":formatted=toDM(value,decimals);break;default:formatted=LocaleUtils.toLocaleFixed(Math.abs(value),decimals)}if(addDirection==="prefix"){return"".concat(direction).concat(formatted)}else if(addDirection==="suffix"){return"".concat(formatted).concat(direction)}return formatted};return coo.map(function(coord,idx){return formatCoordinate(coord,swapLonLat?idx===0:idx===1)}).join(", ")}};export default CoordinatesUtils;
@@ -4,9 +4,9 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
4
4
  *
5
5
  * This source code is licensed under the BSD-style license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
- */import axios from"axios";import geojsonBbox from"geojson-bounding-box";import isEmpty from"lodash.isempty";import ol from"openlayers";import url from"url";import{v1 as uuidv1}from"uuid";import{LayerRole}from"../actions/layers";import ConfigUtils from"../utils/ConfigUtils";import CoordinatesUtils from"../utils/CoordinatesUtils";import LayerUtils from"../utils/LayerUtils";import MapUtils from"../utils/MapUtils";import VectorLayerUtils from"./VectorLayerUtils";function identifyRequestParams(layer,queryLayers,projection,params){var _layer$format;var format="text/plain";var infoFormats=layer.infoFormats||[];if(infoFormats.includes("text/xml")&&(layer.serverType==="qgis"||infoFormats.length===1)){format="text/xml"}else if(infoFormats.includes("application/geojson")){format="application/geojson"}else if(infoFormats.includes("application/geo+json")){format="application/geo+json"}else if(infoFormats.includes("application/json")){format="application/json"}else if(infoFormats.includes("text/xml;subtype=gml/3.2.1")){format="text/xml;subtype=gml/3.2.1"}else if(infoFormats.includes("text/xml;subtype=gml/3.2.0")){format="text/xml;subtype=gml/3.2.0"}else if(infoFormats.includes("text/xml;subtype=gml/3.2")){format="text/xml;subtype=gml/3.2"}else if(infoFormats.includes("text/xml;subtype=gml/3.1.1")){format="text/xml;subtype=gml/3.1.1"}else if(infoFormats.includes("text/xml;subtype=gml/3.1.0")){format="text/xml;subtype=gml/3.1.0"}else if(infoFormats.includes("text/xml;subtype=gml/3.1")){format="text/xml;subtype=gml/3.1"}else if(infoFormats.includes("text/xml;subtype=gml/3.0")){format="text/xml;subtype=gml/3.0"}else if(infoFormats.includes("text/html")){format="text/html"}else if(infoFormats.includes("application/vnd.ogc.gml")){format="application/vnd.ogc.gml"}var styles=(layer.params.STYLES||"").split(",");var styleMap=layer.params.LAYERS.split(",").reduce(function(res,lyr,idx){var _styles$idx;return _objectSpread(_objectSpread({},res),{},_defineProperty({},lyr,(_styles$idx=styles[idx])!==null&&_styles$idx!==void 0?_styles$idx:""))});var queryStyles=queryLayers.split(",").map(function(lyr){var _styleMap$lyr;return(_styleMap$lyr=styleMap[lyr])!==null&&_styleMap$lyr!==void 0?_styleMap$lyr:""}).join(",");return{url:layer.featureInfoUrl.split("?")[0],params:_objectSpread(_objectSpread(_objectSpread({},url.parse(layer.featureInfoUrl,true).query),{},{service:"WMS",version:layer.version,request:"GetFeatureInfo",id:layer.id,layers:queryLayers,query_layers:queryLayers,styles:queryStyles,srs:projection,crs:projection,format:(_layer$format=layer.format)!==null&&_layer$format!==void 0?_layer$format:"image/png",info_format:format,with_geometry:true,with_maptip:false},layer.dimensionValues),params)}}var IdentifyUtils={getQueryLayers:function getQueryLayers(maplayers,map){var queryableLayers=maplayers.filter(function(l){// All non-background WMS layers with a non-empty queryLayers list
7
+ */import axios from"axios";import geojsonBbox from"geojson-bounding-box";import isEmpty from"lodash.isempty";import ol from"openlayers";import url from"url";import{v4 as uuidv4}from"uuid";import{LayerRole}from"../actions/layers";import ConfigUtils from"../utils/ConfigUtils";import CoordinatesUtils from"../utils/CoordinatesUtils";import LayerUtils from"../utils/LayerUtils";import MapUtils from"../utils/MapUtils";import VectorLayerUtils from"./VectorLayerUtils";function identifyRequestParams(layer,queryLayers,projection,params){var _layer$format;var format="text/plain";var infoFormats=layer.infoFormats||[];if(infoFormats.includes("text/xml")&&(layer.serverType==="qgis"||infoFormats.length===1)){format="text/xml"}else if(infoFormats.includes("application/geojson")){format="application/geojson"}else if(infoFormats.includes("application/geo+json")){format="application/geo+json"}else if(infoFormats.includes("application/json")){format="application/json"}else if(infoFormats.includes("text/xml;subtype=gml/3.2.1")){format="text/xml;subtype=gml/3.2.1"}else if(infoFormats.includes("text/xml;subtype=gml/3.2.0")){format="text/xml;subtype=gml/3.2.0"}else if(infoFormats.includes("text/xml;subtype=gml/3.2")){format="text/xml;subtype=gml/3.2"}else if(infoFormats.includes("text/xml;subtype=gml/3.1.1")){format="text/xml;subtype=gml/3.1.1"}else if(infoFormats.includes("text/xml;subtype=gml/3.1.0")){format="text/xml;subtype=gml/3.1.0"}else if(infoFormats.includes("text/xml;subtype=gml/3.1")){format="text/xml;subtype=gml/3.1"}else if(infoFormats.includes("text/xml;subtype=gml/3.0")){format="text/xml;subtype=gml/3.0"}else if(infoFormats.includes("text/html")){format="text/html"}else if(infoFormats.includes("application/vnd.ogc.gml")){format="application/vnd.ogc.gml"}var styles=(layer.params.STYLES||"").split(",");var styleMap=layer.params.LAYERS.split(",").reduce(function(res,lyr,idx){var _styles$idx;return _objectSpread(_objectSpread({},res),{},_defineProperty({},lyr,(_styles$idx=styles[idx])!==null&&_styles$idx!==void 0?_styles$idx:""))});var queryStyles=queryLayers.split(",").map(function(lyr){var _styleMap$lyr;return(_styleMap$lyr=styleMap[lyr])!==null&&_styleMap$lyr!==void 0?_styleMap$lyr:""}).join(",");return{url:layer.featureInfoUrl.split("?")[0],params:_objectSpread(_objectSpread(_objectSpread({},url.parse(layer.featureInfoUrl,true).query),{},{service:"WMS",version:layer.version,request:"GetFeatureInfo",id:layer.id,layers:queryLayers,query_layers:queryLayers,styles:queryStyles,srs:projection,crs:projection,format:(_layer$format=layer.format)!==null&&_layer$format!==void 0?_layer$format:"image/png",info_format:format,with_geometry:true,with_maptip:false},layer.dimensionValues),params)}}var IdentifyUtils={getQueryLayers:function getQueryLayers(maplayers,map){var queryableLayers=maplayers.filter(function(l){// All non-background WMS layers with a non-empty queryLayers list
8
8
  return l.visibility&&l.type==="wms"&&l.role!==LayerRole.BACKGROUND&&(l.queryLayers||[]).length>0});var mapScale=MapUtils.computeForZoom(map.scales,map.zoom);var result=[];queryableLayers.forEach(function(layer){var layers=[];var queryLayers=layer.queryLayers;for(var i=0;i<queryLayers.length;++i){if(layer.externalLayerMap&&layer.externalLayerMap[queryLayers[i]]){var sublayer=LayerUtils.searchSubLayer(layer,"name",queryLayers[i]);var sublayerVisible=LayerUtils.layerScaleInRange(sublayer,mapScale);if(!isEmpty(layer.externalLayerMap[queryLayers[i]].queryLayers)&&sublayerVisible){layers.push(layer.externalLayerMap[queryLayers[i]])}}else if(layers.length>0&&layers[layers.length-1].id===layer.id){layers[layers.length-1].queryLayers.push(queryLayers[i])}else{layers.push(_objectSpread(_objectSpread({},layer),{},{queryLayers:[queryLayers[i]]}))}}result=result.concat(layers)});return result},buildRequest:function buildRequest(layer,queryLayers,center,map){var _layer$params$FILTER;var options=arguments.length>4&&arguments[4]!==undefined?arguments[4]:{};var size=[101,101];var resolution=MapUtils.computeForZoom(map.resolutions,map.zoom);var dx=0.5*resolution*size[0];var dy=0.5*resolution*size[1];var version=layer.version;var bbox=[center[0]-dx,center[1]-dy,center[0]+dx,center[1]+dy];if(CoordinatesUtils.getAxisOrder(map.projection).substr(0,2)==="ne"&&version==="1.3.0"){bbox=[center[1]-dx,center[0]-dy,center[1]+dx,center[0]+dy]}var params=_objectSpread({height:size[0],width:size[1],feature_count:100,x:Math.round(size[0]*0.5),y:Math.round(size[1]*0.5),i:Math.round(size[0]*0.5),j:Math.round(size[1]*0.5),bbox:bbox.join(","),filter:(_layer$params$FILTER=layer.params.FILTER)!==null&&_layer$params$FILTER!==void 0?_layer$params$FILTER:""},options);return identifyRequestParams(layer,queryLayers,map.projection,params)},buildFilterRequest:function buildFilterRequest(layer,queryLayers,filterGeom,map){var options=arguments.length>4&&arguments[4]!==undefined?arguments[4]:{};var params=_objectSpread({feature_count:100,FILTER_GEOM:filterGeom},options);return identifyRequestParams(layer,queryLayers,map.projection,params)},sendRequest:function sendRequest(request,responseHandler){var urlParts=url.parse(request.url,true);urlParts.query=_objectSpread(_objectSpread({},urlParts.query),request.params);delete urlParts.search;var requestUrl=url.format(urlParts);var maxUrlLength=ConfigUtils.getConfigProp("wmsMaxGetUrlLength",null,2048);if(requestUrl.length>maxUrlLength){// Switch to POST if url is too long
9
9
  var reqUrlParts=requestUrl.split("?");var options={headers:{"content-type":"application/x-www-form-urlencoded"}};axios.post(reqUrlParts[0],reqUrlParts[1],options).then(function(postResp){responseHandler(postResp.data)})["catch"](function(){axios.get(request.url,{params:request.params}).then(function(getResp){responseHandler(getResp.data)})["catch"](function(){responseHandler(null)})})}else{axios.get(request.url,{params:request.params}).then(function(getResp){responseHandler(getResp.data)})["catch"](function(){responseHandler(null)})}},parseResponse:function parseResponse(response,layer,format,clickPoint,projection,featureInfoReturnsLayerName){var decimals=CoordinatesUtils.getPrecision(projection);var posstr=clickPoint?clickPoint[0].toFixed(decimals)+", "+clickPoint[1].toFixed(decimals):"";var results={};if(["application/json","application/geojson","application/geo+json","GeoJSON"].includes(format)){results=IdentifyUtils.parseGeoJSONResponse(response,projection,layer)}else if(format==="text/xml"){results=IdentifyUtils.parseXmlResponse(response,projection,layer,posstr,featureInfoReturnsLayerName)}else if(format==="application/vnd.ogc.gml"){results=IdentifyUtils.parseGmlResponse(response,projection,layer,posstr)}else if(format.startsWith("text/xml;subtype=gml/3.1")||format.startsWith("text/xml;subtype=gml/3.0")){results=IdentifyUtils.parseGml3Response(response,projection,layer)}else if(format.startsWith("text/xml;subtype=gml/3.2")){results=IdentifyUtils.parseGml32Response(response,projection,layer)}else if(format==="text/plain"){results[layer.name]=[{type:"text",text:response,id:posstr,layername:layer.name,layertitle:layer.title}]}else if(format==="text/html"){results[layer.name]=[{type:"html",text:response,id:posstr,layername:layer.name,layertitle:layer.title}]}// Add clickPos, bounding box, displayname and layer name / title
10
10
  for(var _i=0,_Object$keys=Object.keys(results);_i<_Object$keys.length;_i++){var layername=_Object$keys[_i];var _iterator=_createForOfIteratorHelper(results[layername]),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var _item$layertitle;var item=_step.value;if(item.type==="Feature"&&!item.bbox&&item.geometry){item.crs=projection;item.bbox=geojsonBbox(item)}item.clickPos=clickPoint;item.displayname=IdentifyUtils.determineDisplayName(layer,layername,item);item.layertitle=(_item$layertitle=item.layertitle)!==null&&_item$layertitle!==void 0?_item$layertitle:layername}}catch(err){_iterator.e(err)}finally{_iterator.f()}}return results},determineDisplayName:function determineDisplayName(layer,layername,item){var properties=item.properties||{};if(item.displayfield){if(properties[item.displayfield]&&properties[item.displayfield][0]!=="<"){return properties[item.displayfield]}}var sublayer=LayerUtils.searchSubLayer(layer,"name",layername);if(sublayer&&sublayer.displayField){if(properties[sublayer.displayField]&&properties[sublayer.displayField][0]!=="<"){return properties[sublayer.displayField]}}return properties.name||properties.Name||properties.NAME||item.id},parseXmlFeature:function parseXmlFeature(feature,geometrycrs,id,featurereport,displayfield,layername,layertitle,layerinfo,translations){var featureResult={};featureResult.type="Feature";featureResult.id=id;featureResult.featurereport=featurereport;featureResult.displayfield=displayfield;featureResult.layername=layername;featureResult.layertitle=layertitle;featureResult.layerinfo=layerinfo;var bboxes=feature.getElementsByTagName("BoundingBox");if(bboxes.length>0){var bbox=bboxes[0];var crs=bbox.attributes.CRS?bbox.attributes.CRS.value:bbox.attributes.SRS.value;featureResult.bbox=[parseFloat(bbox.attributes.minx.value),parseFloat(bbox.attributes.miny.value),parseFloat(bbox.attributes.maxx.value),parseFloat(bbox.attributes.maxy.value)];featureResult.crs=crs}featureResult.properties={};var attrmapping={};var attributes=feature.getElementsByTagName("Attribute");for(var i=0;i<attributes.length;++i){var attribute=attributes[i];if(attribute.attributes.name.value==="geometry"){var wkt=attribute.attributes.value.value;var geoJsonFeature=VectorLayerUtils.wktToGeoJSON(wkt,geometrycrs,featureResult.crs);if(geoJsonFeature){featureResult.geometry=geoJsonFeature.geometry}}else{var _translations$layers$,_translations$layers;var attrname=(_translations$layers$=translations===null||translations===void 0||(_translations$layers=translations.layers)===null||_translations$layers===void 0||(_translations$layers=_translations$layers[layername])===null||_translations$layers===void 0||(_translations$layers=_translations$layers.fields)===null||_translations$layers===void 0?void 0:_translations$layers[attribute.attributes.name.value])!==null&&_translations$layers$!==void 0?_translations$layers$:attribute.attributes.name.value;featureResult.properties[attrname]=attribute.attributes.value.value;if(attribute.attributes.attrname){attrmapping[attrname]=attribute.attributes.attrname.value}}}var htmlContent=feature.getElementsByTagName("HtmlContent");if(htmlContent.length>0){featureResult.properties.htmlContent=htmlContent[0].textContent;featureResult.properties.htmlContentInline=htmlContent[0].getAttribute("inline")==="1"||htmlContent[0].getAttribute("inline")==="true"}if(!isEmpty(attrmapping)){featureResult.attribnames=attrmapping}return featureResult},parseXmlResponse:function parseXmlResponse(response,geometrycrs,layer){var _doc$firstChild,_doc$firstChild$getEl,_this=this;var posstr=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var featureInfoReturnsLayerName=arguments.length>4&&arguments[4]!==undefined?arguments[4]:false;var mapLayers=arguments.length>5&&arguments[5]!==undefined?arguments[5]:null;var parser=new DOMParser;var doc=parser.parseFromString(response,"text/xml");var layersEl=[].slice.call(((_doc$firstChild=doc.firstChild)===null||_doc$firstChild===void 0||(_doc$firstChild$getEl=_doc$firstChild.getElementsByTagName)===null||_doc$firstChild$getEl===void 0?void 0:_doc$firstChild$getEl.call(_doc$firstChild,"Layer"))||[]);var result={};var idcounter=0;var _iterator2=_createForOfIteratorHelper(layersEl),_step2;try{var _loop=function _loop(){var layerEl=_step2.value;var featurereport=layerEl.attributes.featurereport?layerEl.attributes.featurereport.value:null;var displayfield=layerEl.attributes.displayfield?layerEl.attributes.displayfield.value:null;var layername="";var layertitle="";if(layerEl.attributes.layername){var _layer$translations$l,_layer$translations;layername=layerEl.attributes.layername.value;layertitle=(_layer$translations$l=(_layer$translations=layer.translations)===null||_layer$translations===void 0||(_layer$translations=_layer$translations.layertree)===null||_layer$translations===void 0?void 0:_layer$translations[layername])!==null&&_layer$translations$l!==void 0?_layer$translations$l:layerEl.attributes.name.value}else if(featureInfoReturnsLayerName){var _LayerUtils$searchSub,_LayerUtils$searchSub2;layername=layerEl.attributes.name.value;layertitle=(_LayerUtils$searchSub=(_LayerUtils$searchSub2=LayerUtils.searchSubLayer(layer,"name",layername))===null||_LayerUtils$searchSub2===void 0?void 0:_LayerUtils$searchSub2.title)!==null&&_LayerUtils$searchSub!==void 0?_LayerUtils$searchSub:layername}else{var _LayerUtils$searchSub3,_LayerUtils$searchSub4;layertitle=layerEl.attributes.name.value;layername=(_LayerUtils$searchSub3=(_LayerUtils$searchSub4=LayerUtils.searchSubLayer(layer,"title",layertitle))===null||_LayerUtils$searchSub4===void 0?void 0:_LayerUtils$searchSub4.name)!==null&&_LayerUtils$searchSub3!==void 0?_LayerUtils$searchSub3:layertitle}var layerinfo=layerEl.attributes.layerinfo?layerEl.attributes.layerinfo.value:null;var features=[].slice.call(layerEl.getElementsByTagName("Feature"));if(features.length>0){result[layername]=features.map(function(feature){return _this.parseXmlFeature(feature,geometrycrs,feature.attributes.id.value,featurereport,displayfield,layername,layertitle,layerinfo,layer.translations)})}else{var attributes=[].slice.call(layerEl.getElementsByTagName("Attribute"));if(attributes.length>0){var id=posstr||""+idcounter++;result[layername]=[_this.parseXmlFeature(layerEl,geometrycrs,id,featurereport,displayfield,layername,layertitle,layerinfo)]}}};for(_iterator2.s();!(_step2=_iterator2.n()).done;){_loop()}}catch(err){_iterator2.e(err)}finally{_iterator2.f()}return result},parseGeoJSONResponse:function parseGeoJSONResponse(response,geometrycrs,layer){var result={};(response.features||[]).map(function(feature){// Deduce layer name as far as possible from feature id
11
- var id=feature.id||(feature.properties||{}).OBJECTID||uuidv1();if(result[layer.name]===undefined){result[layer.name]=[]}var geometry=feature.geometry;if(geometry&&response.crs){var _response$crs$propert,_response$crs$propert2;// Reproject geometry only if there is crs information in GetFeatureInfo response
11
+ var id=feature.id||(feature.properties||{}).OBJECTID||uuidv4();if(result[layer.name]===undefined){result[layer.name]=[]}var geometry=feature.geometry;if(geometry&&response.crs){var _response$crs$propert,_response$crs$propert2;// Reproject geometry only if there is crs information in GetFeatureInfo response
12
12
  geometry=VectorLayerUtils.reprojectGeometry(geometry,(_response$crs$propert=(_response$crs$propert2=response.crs.properties)===null||_response$crs$propert2===void 0?void 0:_response$crs$propert2.name)!==null&&_response$crs$propert!==void 0?_response$crs$propert:"EPSG:4326",geometrycrs)}result[layer.name].push(_objectSpread(_objectSpread({},feature),{},{id:id,geometry:geometry,layername:layer.name,layertitle:layer.title}))});return result},parseGmlResponse:function parseGmlResponse(response,geometrycrs,layer,posstr){var parser=new DOMParser;var doc=parser.parseFromString(response,"text/xml");var result={};var msGMLOutput=doc.getElementsByTagName("msGMLOutput")[0];if(msGMLOutput){var count=0;var _iterator3=_createForOfIteratorHelper([].slice.call(msGMLOutput.children)),_step3;try{for(_iterator3.s();!(_step3=_iterator3.n()).done;){var layerEl=_step3.value;var layerName=layerEl.nodeName.replace(/_layer$/,"");var featureName=layerName+"_feature";result[layerName]=[];var _iterator4=_createForOfIteratorHelper([].slice.call(layerEl.getElementsByTagName(featureName))),_step4;try{for(_iterator4.s();!(_step4=_iterator4.n()).done;){var featureEl=_step4.value;var context=[{featureType:featureName}];var feature=new ol.format.GeoJSON().writeFeatureObject(new ol.format.GML2().readFeatureElement(featureEl,context));feature.id=count++;feature.layername=layer.name;feature.layertitle=layer.title;delete feature.properties.boundedBy;result[layerName].push(feature)}}catch(err){_iterator4.e(err)}finally{_iterator4.f()}}}catch(err){_iterator3.e(err)}finally{_iterator3.f()}}else{result[layer.name]=[{type:"text",text:response,id:posstr}]}return result},parseGml3Response:function parseGml3Response(response,geometrycrs,layer){var _fmtGeoJson$writeFeat,_fmtGeoJson$writeFeat2;var fmtGml3=new ol.format.GML3;var fmtGeoJson=new ol.format.GeoJSON;return _defineProperty({},layer.name,(_fmtGeoJson$writeFeat=(_fmtGeoJson$writeFeat2=fmtGeoJson.writeFeaturesObject(fmtGml3.readFeatures(response)))===null||_fmtGeoJson$writeFeat2===void 0?void 0:_fmtGeoJson$writeFeat2.features)!==null&&_fmtGeoJson$writeFeat!==void 0?_fmtGeoJson$writeFeat:[])},parseGml32Response:function parseGml32Response(response,geometrycrs,layer){var _fmtGeoJson$writeFeat3,_fmtGeoJson$writeFeat4;var fmtGml32=new ol.format.GML32;var fmtGeoJson=new ol.format.GeoJSON;return _defineProperty({},layer.name,(_fmtGeoJson$writeFeat3=(_fmtGeoJson$writeFeat4=fmtGeoJson.writeFeaturesObject(fmtGml32.readFeatures(response)))===null||_fmtGeoJson$writeFeat4===void 0?void 0:_fmtGeoJson$writeFeat4.features)!==null&&_fmtGeoJson$writeFeat3!==void 0?_fmtGeoJson$writeFeat3:[])}};export default IdentifyUtils;
@@ -54,4 +54,4 @@ params.LAYERS.push("wfs:".concat(layer.url,"#").concat(layer.name));params.OPACI
54
54
  var printBgLayerName=printBackgroundLayer;if(Array.isArray(printBackgroundLayer)){printBgLayerName=null;for(var i=0;i<printBackgroundLayer.length;++i){printBgLayerName=printBackgroundLayer[i].name;if(printScale<=printBackgroundLayer[i].maxScale){break}}}if(printBgLayerName){var match=null;if((match=printBgLayerName.match(/^(\w+):(.*)#([^#]+)$/))&&match[1]==="wms"){if(printExternalLayers){var _backgroundLayer$opac;var layer={type:"wms",params:{LAYERS:match[3],OPACITIES:String((_backgroundLayer$opac=backgroundLayer.opacity)!==null&&_backgroundLayer$opac!==void 0?_backgroundLayer$opac:255),STYLES:""},url:match[2]};LayerUtils.addExternalLayerPrintParams(layer,params,printCrs,counterRef)}}else{var _backgroundLayer$opac2;params.LAYERS.push(printBgLayerName);params.OPACITIES.push(String((_backgroundLayer$opac2=backgroundLayer.opacity)!==null&&_backgroundLayer$opac2!==void 0?_backgroundLayer$opac2:255));params.COLORS.push("");params.STYLES.push("")}}}else if(printExternalLayers){// Inject client-side wms as external layer for print
55
55
  var items=backgroundLayer.type==="group"?backgroundLayer.items:[backgroundLayer];items.slice(0).reverse().forEach(function(layer){if(LayerUtils.layerScaleInRange(layer,printScale)){LayerUtils.addExternalLayerPrintParams(layer,params,printCrs,counterRef)}})}}params.LAYERS=params.LAYERS.reverse().join(",");params.OPACITIES=params.OPACITIES.reverse().join(",");params.COLORS=params.COLORS.reverse().join(",");params.STYLES=params.STYLES.reverse().join(",");return params},getTimeDimensionValues:function getTimeDimensionValues(layer){var result={names:new Set,values:new Set,attributes:{}};if(layer.visibility){(layer.dimensions||[]).forEach(function(dimension){if(dimension.units==="ISO8601"&&dimension.value){result.names.add(dimension.name);dimension.value.split(/,\s+/).filter(function(x){return x}).forEach(function(x){return result.values.add(x)});result.attributes[layer.name]=[dimension.fieldName,dimension.endFieldName]}})}(layer.sublayers||[]).forEach(function(sublayer){var sublayerResult=LayerUtils.getTimeDimensionValues(sublayer);sublayerResult.names.forEach(function(x){return result.names.add(x)});sublayerResult.values.forEach(function(x){return result.values.add(x)});result.attributes=_objectSpread(_objectSpread({},result.attributes),sublayerResult.attributes)});return result},getAttribution:function getAttribution(layer,map){var showThemeAttributionOnly=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var transformedMapBBoxes=arguments.length>3&&arguments[3]!==undefined?arguments[3]:{};if(layer.visibility===false||showThemeAttributionOnly&&layer.role!==LayerRole.THEME){return{}}var mapScale=MapUtils.computeForZoom(map.scales,map.zoom);if(!LayerUtils.layerScaleInRange(layer,mapScale)){return{}}if(layer.bbox&&layer.bbox.bounds){var layerCrs=layer.bbox.crs||map.projection;if(!transformedMapBBoxes[layerCrs]){transformedMapBBoxes[layerCrs]=CoordinatesUtils.reprojectBbox(map.bbox.bounds,map.projection,layerCrs)}var mapbbox=transformedMapBBoxes[layerCrs];var laybbox=layer.bbox.bounds;if(mapbbox[0]>laybbox[2]||mapbbox[2]<laybbox[0]||mapbbox[1]>laybbox[3]||mapbbox[3]<laybbox[1]){// Extents don't overlap
56
56
  return{}}}var copyrights={};if(layer.sublayers){Object.assign(copyrights,layer.sublayers.reduce(function(res,sublayer){return _objectSpread(_objectSpread({},res),LayerUtils.getAttribution(sublayer,map,false,transformedMapBBoxes))},{}))}else if(layer.type==="group"&&layer.items){Object.assign(copyrights,layer.items.reduce(function(res,sublayer){return _objectSpread(_objectSpread({},res),LayerUtils.getAttribution(sublayer,map,false,transformedMapBBoxes))},{}))}if(layer.attribution&&layer.attribution.Title){var key=layer.attribution.OnlineResource||layer.attribution.Title;copyrights[key]={title:layer.attribution.OnlineResource?layer.attribution.Title:null,layers:[].concat(_toConsumableArray((copyrights[key]||{}).layers||[]),[layer])}}return copyrights},recomputeLayerBBox:function recomputeLayerBBox(layer){if(isEmpty(layer.sublayers)){return layer}var bounds=null;var newlayer=_objectSpread({},layer);newlayer.sublayers=newlayer.sublayers.map(function(sublayer){sublayer=LayerUtils.recomputeLayerBBox(sublayer);if(!bounds&&sublayer.bbox&&sublayer.bbox.bounds){bounds=CoordinatesUtils.reprojectBbox(sublayer.bbox.bounds,sublayer.bbox.crs,"EPSG:4326")}else if(bounds&&sublayer.bbox&&sublayer.bbox.bounds){var sublayerbounds=CoordinatesUtils.reprojectBbox(sublayer.bbox.bounds,sublayer.bbox.crs,"EPSG:4326");bounds=[Math.min(bounds[0],sublayerbounds[0]),Math.min(bounds[1],sublayerbounds[1]),Math.max(bounds[2],sublayerbounds[2]),Math.max(bounds[3],sublayerbounds[3])]}return sublayer});if(bounds){newlayer.bbox={bounds:bounds,crs:"EPSG:4326"}}return newlayer},propagateLayerProperty:function propagateLayerProperty(newlayer,property,value){var path=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;Object.assign(newlayer,_defineProperty({},property,value));// Don't propagate visibility for mutually exclusive groups
57
- if(newlayer.sublayers&&!(property==="visibility"&&newlayer.mutuallyExclusive)){newlayer.sublayers=newlayer.sublayers.map(function(sublayer,idx){if(path===null||!isEmpty(path)&&path[0]===idx){var newsublayer=_objectSpread({},sublayer);LayerUtils.propagateLayerProperty(newsublayer,property,value,path?path.slice(1):null);return newsublayer}else{return sublayer}})}},getLayerRefreshInterval:function getLayerRefreshInterval(layer){var _layer$refreshInterva;var refreshInterval=(_layer$refreshInterva=layer.refreshInterval)!==null&&_layer$refreshInterva!==void 0?_layer$refreshInterva:0;(layer.sublayers||[]).forEach(function(sublayer){var sublayerRefreshInterval=LayerUtils.getLayerRefreshInterval(sublayer);if(sublayerRefreshInterval>0){refreshInterval=refreshInterval>0?Math.min(refreshInterval,sublayerRefreshInterval):sublayerRefreshInterval}});return refreshInterval},collectFeatureReports:function collectFeatureReports(layers){if(!ConfigUtils.getConfigProp("documentServiceUrl")){return{}}var reports={};var _collectLayerReports=function collectLayerReports(toplayer,layer){if(layer.sublayers){var _iterator21=_createForOfIteratorHelper(layer.sublayers),_step21;try{for(_iterator21.s();!(_step21=_iterator21.n()).done;){var sublayer=_step21.value;reports=_objectSpread(_objectSpread({},reports),_collectLayerReports(toplayer,sublayer))}}catch(err){_iterator21.e(err)}finally{_iterator21.f()}}else if(layer.featureReport){var key=toplayer.url+"#"+layer.name;if(Array.isArray(layer.featureReport)){reports[key]=layer.featureReport}else{reports[key]=[{title:layer.title,template:layer.featureReport}]}}return reports};layers.forEach(function(layer){if(layer.role===LayerRole.THEME||layer.role===LayerRole.USERLAYER){_collectLayerReports(layer,layer)}});return reports},computeVisbilityPreset:function computeVisbilityPreset(layer){var result={};if(layer.sublayers){layer.sublayers.forEach(function(sublayer){return Object.assign(result,LayerUtils.computeVisbilityPreset(sublayer))})}else if(layer.visibility){result[layer.name]=layer.style}return result},getActiveVisibilityPreset:function getActiveVisibilityPreset(layers,presets){if(isEmpty(presets)){return null}var result={};layers.forEach(function(layer){if(layer.role===LayerRole.THEME){Object.assign(result,LayerUtils.computeVisbilityPreset(layer))}});for(var _i4=0,_Object$entries=Object.entries(presets);_i4<_Object$entries.length;_i4++){var _Object$entries$_i=_slicedToArray(_Object$entries[_i4],2),name=_Object$entries$_i[0],preset=_Object$entries$_i[1];if(isEqual(preset,result)){return name}}return null},applyVisibilityPreset:function applyVisibilityPreset(layer,preset){var newLayer=_objectSpread({},layer);if(newLayer.sublayers){var haveVisibileSublayer=false;newLayer.sublayers=newLayer.sublayers.map(function(sublayer){var newSublayer=LayerUtils.applyVisibilityPreset(sublayer,preset);haveVisibileSublayer||(haveVisibileSublayer=newSublayer.visibility===true);return newSublayer});newLayer.visibility=haveVisibileSublayer;if(newLayer.name in preset){newLayer.visibility=true}}else if(newLayer.name in preset){newLayer.visibility=true;newLayer.style=preset[newLayer.name]}else{newLayer.visibility=false}return newLayer},applyTranslations:function applyTranslations(layer,translations){var _translations$layertr,_translations$layertr2,_layer$sublayers,_layer$sublayers$map;return _objectSpread(_objectSpread({},layer),{},{title:(_translations$layertr=translations===null||translations===void 0||(_translations$layertr2=translations.layertree)===null||_translations$layertr2===void 0?void 0:_translations$layertr2[layer.name])!==null&&_translations$layertr!==void 0?_translations$layertr:layer.title,sublayers:(_layer$sublayers=layer.sublayers)===null||_layer$sublayers===void 0||(_layer$sublayers$map=_layer$sublayers.map)===null||_layer$sublayers$map===void 0?void 0:_layer$sublayers$map.call(_layer$sublayers,function(sublayer){return LayerUtils.applyTranslations(sublayer,translations)})})}};export default LayerUtils;
57
+ if(newlayer.sublayers&&!(property==="visibility"&&newlayer.mutuallyExclusive)){newlayer.sublayers=newlayer.sublayers.map(function(sublayer,idx){if(path===null||!isEmpty(path)&&path[0]===idx){var newsublayer=_objectSpread({},sublayer);LayerUtils.propagateLayerProperty(newsublayer,property,value,path?path.slice(1):null);return newsublayer}else{return sublayer}})}},getLayerRefreshInterval:function getLayerRefreshInterval(layer){var _layer$refreshInterva;var refreshInterval=(_layer$refreshInterva=layer.refreshInterval)!==null&&_layer$refreshInterva!==void 0?_layer$refreshInterva:0;(layer.sublayers||[]).forEach(function(sublayer){var sublayerRefreshInterval=LayerUtils.getLayerRefreshInterval(sublayer);if(sublayerRefreshInterval>0){refreshInterval=refreshInterval>0?Math.min(refreshInterval,sublayerRefreshInterval):sublayerRefreshInterval}});return refreshInterval},collectFeatureReports:function collectFeatureReports(layers){if(!ConfigUtils.getConfigProp("documentServiceUrl")){return{}}var reports={};var _collectLayerReports=function collectLayerReports(toplayer,layer){if(layer.sublayers){var _iterator21=_createForOfIteratorHelper(layer.sublayers),_step21;try{for(_iterator21.s();!(_step21=_iterator21.n()).done;){var sublayer=_step21.value;reports=_objectSpread(_objectSpread({},reports),_collectLayerReports(toplayer,sublayer))}}catch(err){_iterator21.e(err)}finally{_iterator21.f()}}else if(layer.featureReport){var key=toplayer.url+"#"+layer.name;if(Array.isArray(layer.featureReport)){reports[key]=layer.featureReport}else{reports[key]=[{title:layer.title,template:layer.featureReport}]}}return reports};layers.forEach(function(layer){if(layer.role===LayerRole.THEME||layer.role===LayerRole.USERLAYER){_collectLayerReports(layer,layer)}});return reports},computeVisbilityPreset:function computeVisbilityPreset(layer){var result={};if(layer.sublayers){layer.sublayers.forEach(function(sublayer){return Object.assign(result,LayerUtils.computeVisbilityPreset(sublayer))});if(layer.visibility&&!layer.url){result[layer.name]=""}}else if(layer.visibility){result[layer.name]=layer.style}return result},getActiveVisibilityPreset:function getActiveVisibilityPreset(layers,presets){if(isEmpty(presets)){return null}var result={};layers.forEach(function(layer){if(layer.role===LayerRole.THEME){Object.assign(result,LayerUtils.computeVisbilityPreset(layer))}});for(var _i4=0,_Object$entries=Object.entries(presets);_i4<_Object$entries.length;_i4++){var _Object$entries$_i=_slicedToArray(_Object$entries[_i4],2),name=_Object$entries$_i[0],preset=_Object$entries$_i[1];if(isEqual(preset,result)){return name}}return null},applyVisibilityPreset:function applyVisibilityPreset(layer,preset){var newLayer=_objectSpread({},layer);if(newLayer.sublayers){var haveVisibileSublayer=false;newLayer.sublayers=newLayer.sublayers.map(function(sublayer){var newSublayer=LayerUtils.applyVisibilityPreset(sublayer,preset);haveVisibileSublayer||(haveVisibileSublayer=newSublayer.visibility===true);return newSublayer});newLayer.visibility=haveVisibileSublayer;if(newLayer.name in preset){newLayer.visibility=true}}else if(newLayer.name in preset){newLayer.visibility=true;newLayer.style=preset[newLayer.name]}else{newLayer.visibility=false}return newLayer},applyTranslations:function applyTranslations(layer,translations){var _translations$layertr,_translations$layertr2,_layer$sublayers,_layer$sublayers$map;return _objectSpread(_objectSpread({},layer),{},{title:(_translations$layertr=translations===null||translations===void 0||(_translations$layertr2=translations.layertree)===null||_translations$layertr2===void 0?void 0:_translations$layertr2[layer.name])!==null&&_translations$layertr!==void 0?_translations$layertr:layer.title,sublayers:(_layer$sublayers=layer.sublayers)===null||_layer$sublayers===void 0||(_layer$sublayers$map=_layer$sublayers.map)===null||_layer$sublayers$map===void 0?void 0:_layer$sublayers$map.call(_layer$sublayers,function(sublayer){return LayerUtils.applyTranslations(sublayer,translations)})})}};export default LayerUtils;
@@ -4,9 +4,9 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
4
4
  *
5
5
  * This source code is licensed under the BSD-style license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
- */import axios from"axios";import{v1 as uuidv1}from"uuid";import ConfigUtils from"./ConfigUtils";import LocaleUtils from"./LocaleUtils";import VectorLayerUtils from"./VectorLayerUtils";var ValhallaSession={reqId:null,pending:0,result:null,clear:function clear(){ValhallaSession.reqId=null;ValhallaSession.pending=0;ValhallaSession.result=null}};function decodeShape(str){var precision=arguments.length>1&&arguments[1]!==undefined?arguments[1]:null;var index=0;var lat=0;var lng=0;var coordinates=[];var shift=0;var result=0;var _byte=null;var latitudeChange;var longitudeChange;var factor=Math.pow(10,precision||6);// Coordinates have variable length when encoded, so just keep
7
+ */import axios from"axios";import{v4 as uuidv4}from"uuid";import ConfigUtils from"./ConfigUtils";import LocaleUtils from"./LocaleUtils";import VectorLayerUtils from"./VectorLayerUtils";var ValhallaSession={reqId:null,pending:0,result:null,clear:function clear(){ValhallaSession.reqId=null;ValhallaSession.pending=0;ValhallaSession.result=null}};function decodeShape(str){var precision=arguments.length>1&&arguments[1]!==undefined?arguments[1]:null;var index=0;var lat=0;var lng=0;var coordinates=[];var shift=0;var result=0;var _byte=null;var latitudeChange;var longitudeChange;var factor=Math.pow(10,precision||6);// Coordinates have variable length when encoded, so just keep
8
8
  // track of whether we've hit the end of the string. In each
9
9
  // loop iteration, a single coordinate is decoded.
10
10
  while(index<str.length){// Reset shift, result, and byte
11
11
  _byte=null;shift=0;result=0;do{_byte=str.charCodeAt(index++)-63;result|=(_byte&31)<<shift;shift+=5}while(_byte>=32);latitudeChange=result&1?~(result>>1):result>>1;shift=result=0;do{_byte=str.charCodeAt(index++)-63;result|=(_byte&31)<<shift;shift+=5}while(_byte>=32);longitudeChange=result&1?~(result>>1):result>>1;lat+=latitudeChange;lng+=longitudeChange;coordinates.push([lng/factor,lat/factor])}return coordinates}function getValhallaParams(costing,locations,options,extraOptions){var costingOptions={};if(costing==="auto"){costingOptions.auto={top_speed:options.maxSpeed,shortest:options.method==="shortest",use_ferry:options.useFerries?1:0,use_tolls:options.useTollways?1:0,use_highways:options.useHighways?1:0}}else if(costing==="heavyvehicle"){costing="truck";costingOptions.truck={top_speed:options.maxSpeed,shortest:options.method==="shortest",use_ferry:options.useFerries?1:0,use_tolls:options.useTollways?1:0,use_highways:options.useHighways?1:0}}else if(costing==="transit"){costing="multimodal";var timepointMap={now:0,leaveat:1,arriveat:2};extraOptions.date_time={value:options.time.slice(0,16),type:timepointMap[options.timepoint]}}else if(costing==="bicycle"){costingOptions.bicycle={cycling_speed:options.maxSpeed,shortest:options.method==="shortest",use_ferry:options.useFerries?1:0}}else if(costing==="pedestrian"){costingOptions.pedestrian={walking_speed:options.maxSpeed,shortest:options.method==="shortest",use_ferry:options.useFerries?1:0}}var payload=_objectSpread({costing:costing,costing_options:costingOptions,exclude_polygons:options.exclude_polygons||[],locations:locations.map(function(loc){return{lon:loc[0],lat:loc[1]}}),directions_options:{units:"kilometers",language:LocaleUtils.lang()}},extraOptions);return{json:JSON.stringify(payload)}}function computeRoute(costing,locations,options,callback){var extraOptions={id:"valhalla_directions"};var params=getValhallaParams(costing,locations,options,extraOptions);var serviceUrl=ConfigUtils.getConfigProp("routingServiceUrl").replace(/\/$/,"");var endpoint=options.optimized_route?"optimized_route":"route";axios.get(serviceUrl+"/"+endpoint,{params:params}).then(function(response){if(!response.data||!response.data.trip){callback(false,{errorMsgId:LocaleUtils.trmsg("routing.computefailed")});return}var trip=response.data.trip;if(trip.status!==0){callback(false,response.data.trip.status_message)}// https://valhalla.github.io/valhalla/api/turn-by-turn/api-reference/
12
- var travelTypeMap={car:{icon:"routing-car",color:[0,0,255,1]},tractor_trailer:{icon:"routing-truck",color:[0,0,255,1]},foot:{icon:"routing-walking",color:[127,127,255,1]},road:{icon:"routing-bicycle",color:[0,127,0,1]},tram:{icon:"routing-tram",color:[255,0,0,1]},metro:{icon:"routing-tram",color:[255,0,0,1]},rail:{icon:"routing-train",color:[255,0,0,1]},bus:{icon:"routing-bus",color:[255,0,0,1]},ferry:{icon:"routing-ship",color:[0,0,200,1]},cable_car:{icon:"routing-cablecar",color:[255,0,0,1]},gondola:{icon:"routing-cablecar",color:[255,0,0,1]},funicular:{icon:"routing-cablecar",color:[255,0,0,1]}};var result={legs:trip.legs.map(function(leg){return{coordinates:decodeShape(leg.shape),time:leg.summary.time,length:leg.summary.length*1000,maneuvers:leg.maneuvers.map(function(entry){return{instruction:entry.instruction,post_instruction:entry.verbal_post_transition_instruction,geom_indices:[entry.begin_shape_index,entry.end_shape_index],icon:(travelTypeMap[entry.travel_type]||{}).icon||"routing",color:(travelTypeMap[entry.travel_type]||{}).color||"#0000FF",time:entry.time,length:entry.length*1000}})}}),locations:trip.locations.map(function(location){return{lat:location.lat,lon:location.lon,orig_idx:location.original_index}}),summary:{bounds:[trip.summary.min_lon,trip.summary.min_lat,trip.summary.max_lon,trip.summary.max_lat],time:trip.summary.time,length:trip.summary.length*1000}};callback(true,result)})["catch"](function(e){var error=((e.response||{}).data||{}).error;var data={};if(error){data.error=error}else{data.errorMsgId=LocaleUtils.trmsg("routing.computefailed")}callback(false,data)})}function computeIsochrone(costing,locations,contourOptions,options,callback){var extraOptions={contours:contourOptions.intervals.map(function(entry){return _defineProperty({},contourOptions.mode,entry)}),id:"valhalla_isochrone"};var serviceUrl=ConfigUtils.getConfigProp("routingServiceUrl").replace(/\/$/,"");var reqId=uuidv1();ValhallaSession.reqId=reqId;ValhallaSession.pending=locations.length;locations.forEach(function(location){var params=getValhallaParams(costing,[location],options,extraOptions);axios.get(serviceUrl+"/isochrone",{params:params}).then(function(response){if(reqId!==ValhallaSession.reqId){return}if(!response.data||!response.data.features){ValhallaSession.clear();callback(false,{errorMsgId:LocaleUtils.trmsg("routing.computefailed")});return}ValhallaSession.pending-=1;if(!ValhallaSession.result){ValhallaSession.result=response.data}else{var _ValhallaSession$resu;(_ValhallaSession$resu=ValhallaSession.result.features).push.apply(_ValhallaSession$resu,_toConsumableArray(response.data.features))}if(ValhallaSession.pending===0){var areas=ValhallaSession.result.features.map(function(feature){return feature.geometry.coordinates});callback(true,{areas:areas,bounds:VectorLayerUtils.computeFeatureBBox(ValhallaSession.result)});ValhallaSession.clear()}})["catch"](function(e){ValhallaSession.clear();var error=((e.response||{}).data||{}).error;var data={};if(error){data.error=error}else{data.errorMsgId=LocaleUtils.trmsg("routing.computefailed")}callback(false,data)})})}export default{computeRoute:computeRoute,computeIsochrone:computeIsochrone};
12
+ var travelTypeMap={car:{icon:"routing-car",color:[0,0,255,1]},tractor_trailer:{icon:"routing-truck",color:[0,0,255,1]},foot:{icon:"routing-walking",color:[127,127,255,1]},road:{icon:"routing-bicycle",color:[0,127,0,1]},tram:{icon:"routing-tram",color:[255,0,0,1]},metro:{icon:"routing-tram",color:[255,0,0,1]},rail:{icon:"routing-train",color:[255,0,0,1]},bus:{icon:"routing-bus",color:[255,0,0,1]},ferry:{icon:"routing-ship",color:[0,0,200,1]},cable_car:{icon:"routing-cablecar",color:[255,0,0,1]},gondola:{icon:"routing-cablecar",color:[255,0,0,1]},funicular:{icon:"routing-cablecar",color:[255,0,0,1]}};var result={legs:trip.legs.map(function(leg){return{coordinates:decodeShape(leg.shape),time:leg.summary.time,length:leg.summary.length*1000,maneuvers:leg.maneuvers.map(function(entry){return{instruction:entry.instruction,post_instruction:entry.verbal_post_transition_instruction,geom_indices:[entry.begin_shape_index,entry.end_shape_index],icon:(travelTypeMap[entry.travel_type]||{}).icon||"routing",color:(travelTypeMap[entry.travel_type]||{}).color||"#0000FF",time:entry.time,length:entry.length*1000}})}}),locations:trip.locations.map(function(location){return{lat:location.lat,lon:location.lon,orig_idx:location.original_index}}),summary:{bounds:[trip.summary.min_lon,trip.summary.min_lat,trip.summary.max_lon,trip.summary.max_lat],time:trip.summary.time,length:trip.summary.length*1000}};callback(true,result)})["catch"](function(e){var error=((e.response||{}).data||{}).error;var data={};if(error){data.error=error}else{data.errorMsgId=LocaleUtils.trmsg("routing.computefailed")}callback(false,data)})}function computeIsochrone(costing,locations,contourOptions,options,callback){var extraOptions={contours:contourOptions.intervals.map(function(entry){return _defineProperty({},contourOptions.mode,entry)}),id:"valhalla_isochrone"};var serviceUrl=ConfigUtils.getConfigProp("routingServiceUrl").replace(/\/$/,"");var reqId=uuidv4();ValhallaSession.reqId=reqId;ValhallaSession.pending=locations.length;locations.forEach(function(location){var params=getValhallaParams(costing,[location],options,extraOptions);axios.get(serviceUrl+"/isochrone",{params:params}).then(function(response){if(reqId!==ValhallaSession.reqId){return}if(!response.data||!response.data.features){ValhallaSession.clear();callback(false,{errorMsgId:LocaleUtils.trmsg("routing.computefailed")});return}ValhallaSession.pending-=1;if(!ValhallaSession.result){ValhallaSession.result=response.data}else{var _ValhallaSession$resu;(_ValhallaSession$resu=ValhallaSession.result.features).push.apply(_ValhallaSession$resu,_toConsumableArray(response.data.features))}if(ValhallaSession.pending===0){var areas=ValhallaSession.result.features.map(function(feature){return feature.geometry.coordinates});callback(true,{areas:areas,bounds:VectorLayerUtils.computeFeatureBBox(ValhallaSession.result)});ValhallaSession.clear()}})["catch"](function(e){ValhallaSession.clear();var error=((e.response||{}).data||{}).error;var data={};if(error){data.error=error}else{data.errorMsgId=LocaleUtils.trmsg("routing.computefailed")}callback(false,data)})})}export default{computeRoute:computeRoute,computeIsochrone:computeIsochrone};
@@ -4,7 +4,7 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
4
4
  *
5
5
  * This source code is licensed under the BSD-style license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
- */import geojsonBbox from"geojson-bounding-box";import isEmpty from"lodash.isempty";import{getDefaultImageStyle}from"ol/format/KML";import ol from"openlayers";import simplepolygon from"simplepolygon";import svgpath from"svgpath";import{v1 as uuidv1}from"uuid";import ConfigUtils from"../utils/ConfigUtils";import CoordinatesUtils from"../utils/CoordinatesUtils";import{END_MARKERS,computeFeatureStyle}from"../utils/FeatureStyles";var VectorLayerUtils={createPrintHighlighParams:function createPrintHighlighParams(layers,printCrs,printScale){var dpi=arguments.length>3&&arguments[3]!==undefined?arguments[3]:96;var scaleFactor=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;var qgisServerVersion=ConfigUtils.getConfigProp("qgisServerVersion",null,3);var params={geoms:[],styles:[],labels:[],labelFillColors:[],labelOutlineColors:[],labelOutlineSizes:[],labelRotations:[],labelSizes:[],labelDist:[]};var ensureHex=null;if(qgisServerVersion>=3){ensureHex=function ensureHex(rgb){return!Array.isArray(rgb)?rgb:"#"+[255-(rgb.length>3?rgb[3]:1)*255].concat(_toConsumableArray(rgb.slice(0,3))).map(function(v){return Math.round(v).toString(16).padStart(2,"0")}).join("")}}else{ensureHex=function ensureHex(rgb){return!Array.isArray(rgb)?rgb:"#"+(16777216+(rgb[2]|rgb[1]<<8|rgb[0]<<16)).toString(16).slice(1)}}var _iterator=_createForOfIteratorHelper(layers.slice(0).reverse()),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var layer=_step.value;if(layer.type!=="vector"||(layer.features||[]).length===0||layer.visibility===false||layer.skipPrint===true){continue}var features=layer.features.map(function(feature){var _feature$geometry;if((_feature$geometry=feature.geometry)!==null&&_feature$geometry!==void 0&&_feature$geometry.coordinates){feature=_objectSpread(_objectSpread({},feature),{},{geometry:_objectSpread(_objectSpread({},feature.geometry),{},{coordinates:VectorLayerUtils.removeDuplicateNodes(feature.geometry.coordinates)})})}return VectorLayerUtils.simplifyFeature(feature)}).flat();var _iterator2=_createForOfIteratorHelper(features),_step2;try{for(_iterator2.s();!(_step2=_iterator2.n()).done;){var feature=_step2.value;if(!VectorLayerUtils.validateGeometry(feature.geometry)){continue}var styleOptions=computeFeatureStyle(layer,feature);var properties=feature.properties||{};var geometry=VectorLayerUtils.reprojectGeometry(feature.geometry,feature.crs||printCrs,printCrs);if(feature.geometry.type==="LineString"){// Generate arrow heads
7
+ */import geojsonBbox from"geojson-bounding-box";import isEmpty from"lodash.isempty";import{getDefaultImageStyle}from"ol/format/KML";import ol from"openlayers";import simplepolygon from"simplepolygon";import svgpath from"svgpath";import{v4 as uuidv4}from"uuid";import ConfigUtils from"../utils/ConfigUtils";import CoordinatesUtils from"../utils/CoordinatesUtils";import{END_MARKERS,computeFeatureStyle}from"../utils/FeatureStyles";var VectorLayerUtils={createPrintHighlighParams:function createPrintHighlighParams(layers,printCrs,printScale){var dpi=arguments.length>3&&arguments[3]!==undefined?arguments[3]:96;var scaleFactor=arguments.length>4&&arguments[4]!==undefined?arguments[4]:1;var qgisServerVersion=ConfigUtils.getConfigProp("qgisServerVersion",null,3);var params={geoms:[],styles:[],labels:[],labelFillColors:[],labelOutlineColors:[],labelOutlineSizes:[],labelRotations:[],labelSizes:[],labelDist:[]};var ensureHex=null;if(qgisServerVersion>=3){ensureHex=function ensureHex(rgb){return!Array.isArray(rgb)?rgb:"#"+[255-(rgb.length>3?rgb[3]:1)*255].concat(_toConsumableArray(rgb.slice(0,3))).map(function(v){return Math.round(v).toString(16).padStart(2,"0")}).join("")}}else{ensureHex=function ensureHex(rgb){return!Array.isArray(rgb)?rgb:"#"+(16777216+(rgb[2]|rgb[1]<<8|rgb[0]<<16)).toString(16).slice(1)}}var _iterator=_createForOfIteratorHelper(layers.slice(0).reverse()),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var layer=_step.value;if(layer.type!=="vector"||(layer.features||[]).length===0||layer.visibility===false||layer.skipPrint===true){continue}var features=layer.features.map(function(feature){var _feature$geometry;if((_feature$geometry=feature.geometry)!==null&&_feature$geometry!==void 0&&_feature$geometry.coordinates){feature=_objectSpread(_objectSpread({},feature),{},{geometry:_objectSpread(_objectSpread({},feature.geometry),{},{coordinates:VectorLayerUtils.removeDuplicateNodes(feature.geometry.coordinates)})})}return VectorLayerUtils.simplifyFeature(feature)}).flat();var _iterator2=_createForOfIteratorHelper(features),_step2;try{for(_iterator2.s();!(_step2=_iterator2.n()).done;){var feature=_step2.value;if(!VectorLayerUtils.validateGeometry(feature.geometry)){continue}var styleOptions=computeFeatureStyle(layer,feature);var properties=feature.properties||{};var geometry=VectorLayerUtils.reprojectGeometry(feature.geometry,feature.crs||printCrs,printCrs);if(feature.geometry.type==="LineString"){// Generate arrow heads
8
8
  if(styleOptions.headmarker){VectorLayerUtils.generateMarkerGeometry(params,styleOptions.headmarker,false,feature,layer,dpi,printScale,printCrs,scaleFactor)}if(styleOptions.tailmarker){VectorLayerUtils.generateMarkerGeometry(params,styleOptions.tailmarker,true,feature,layer,dpi,printScale,printCrs,scaleFactor)}}if(feature.geometry.type==="LineString"&&!isEmpty(properties.segment_labels)){// Split line into single segments and label them individually
9
9
  var coords=geometry.coordinates;for(var i=0;i<coords.length-1;++i){var segment={type:"LineString",coordinates:[coords[i],coords[i+1]]};params.styles.push(VectorLayerUtils.createSld(segment.type,feature.styleName,styleOptions,layer.opacity,dpi,scaleFactor));params.labels.push(properties.segment_labels[i]||" ");params.geoms.push(VectorLayerUtils.geoJSONGeomToWkt(segment));params.labelFillColors.push(ensureHex(styleOptions.textFill));params.labelOutlineColors.push(ensureHex(styleOptions.textStroke));params.labelOutlineSizes.push(scaleFactor);params.labelSizes.push(Math.round(10*scaleFactor));params.labelDist.push("-5");params.labelRotations.push("0")}}else{params.styles.push(VectorLayerUtils.createSld(geometry.type,feature.styleName,styleOptions,layer.opacity,dpi,scaleFactor));params.labels.push(properties.label||" ");if(feature.styleName==="text"){// Make point a tiny square, so that QGIS server centers the text inside the polygon when labelling
10
10
  var x=geometry.coordinates[0];var y=geometry.coordinates[1];geometry={type:"Polygon",coordinates:[[[x-0.01,y-0.01],[x+0.01,y-0.01],[x+0.01,y+0.01],[x-0.01,y+0.01],[x-0.01,y-0.01]]]};params.geoms.push(VectorLayerUtils.geoJSONGeomToWkt(geometry));params.labelFillColors.push(ensureHex(styleOptions.fillColor));params.labelOutlineColors.push(ensureHex(styleOptions.strokeColor));params.labelOutlineSizes.push(scaleFactor*styleOptions.strokeWidth*0.5);params.labelSizes.push(Math.round(10*styleOptions.strokeWidth*scaleFactor));params.labelDist.push("5");params.labelRotations.push(((properties.rotation||0)/Math.PI*180).toFixed(0))}else{params.geoms.push(VectorLayerUtils.geoJSONGeomToWkt(geometry));params.labelFillColors.push(ensureHex(styleOptions.textFill));params.labelOutlineColors.push(ensureHex(styleOptions.textStroke));params.labelOutlineSizes.push(scaleFactor);params.labelSizes.push(Math.round(10*scaleFactor));params.labelDist.push("-5");params.labelRotations.push("0")}}}}catch(err){_iterator2.e(err)}finally{_iterator2.f()}}}catch(err){_iterator.e(err)}finally{_iterator.f()}return params},removeDuplicateNodes:function removeDuplicateNodes(coordinates){if(Array.isArray(coordinates[0][0])){return coordinates.map(VectorLayerUtils.removeDuplicateNodes)}else if(Array.isArray(coordinates[0])){return coordinates.filter(function(item,pos,arr){return pos===0||item[0]!==arr[pos-1][0]||item[1]!==arr[pos-1][1]})}else{return coordinates}},simplifyFeature:function simplifyFeature(feature){if(!feature.geometry){return feature}else if(feature.geometry.type==="MultiPolygon"){return feature.geometry.coordinates.map(function(part){return VectorLayerUtils.simplifyFeature(_objectSpread(_objectSpread({},feature),{},{geometry:{type:"Polygon",coordinates:part}}))}).flat()}else if(feature.geometry.type==="Polygon"){return simplepolygon(feature).features.map(function(feat,idx,features){if(feat.properties.parent>=0){features[feat.properties.parent].geometry.coordinates.push(feat.geometry.coordinates[0]);return null}return feat}).filter(function(x){return x}).map(function(feat){return _objectSpread(_objectSpread({},feature),{},{geometry:feat.geometry})})}else{return feature}},validateGeometry:function validateGeometry(geometry){if(!geometry){return false}if(geometry.type==="GeometryCollection"){return geometry.geometries.every(VectorLayerUtils.validateGeometry)}if(geometry.type==="Point"){return!isEmpty(geometry.coordinates)}var minLength=geometry.type.endsWith("LineString")?2:3;var _isDegenerate=function isDegenerate(coordinates){if(Array.isArray(coordinates[0][0])){return coordinates.map(_isDegenerate).find(function(entry){return entry===false})}else{return coordinates.length<minLength}};return!_isDegenerate(geometry.coordinates)},createSld:function createSld(geometrytype,styleName,styleOptions,layerOpacity){var dpi=arguments.length>4&&arguments[4]!==undefined?arguments[4]:96;var scaleFactor=arguments.length>5&&arguments[5]!==undefined?arguments[5]:1;var opts={};var dpiScale=dpi/96*scaleFactor;// Special cases
@@ -14,7 +14,7 @@ opts=styleOptions}var ensureHex=function ensureHex(rgb){return!Array.isArray(rgb
14
14
  var path="";var width=0;var height=0;try{var parser=new DOMParser;var svgSrc=atob(marker.src.slice(26));var svgDoc=parser.parseFromString(svgSrc,"text/xml");width=parseInt(svgDoc.getElementsByTagName("svg")[0].getAttribute("width"),10);height=parseInt(svgDoc.getElementsByTagName("svg")[0].getAttribute("height"),10);path=svgDoc.getElementsByTagName("path")[0].getAttribute("d")}catch(e){/* eslint-disable-next-line */console.warn("Could not parse path for marker "+markername);return}// [ Same as in FeatureStyles.js ] [ pixel to map units ]
15
15
  var markerScaleFactor=0.125*(1+feature.styleOptions.strokeWidth)/dpi*0.0254*mapScale*scaleFactor;var origin=feature.geometry.coordinates[tail?feature.geometry.coordinates.length-1:0];var p2=feature.geometry.coordinates[tail?feature.geometry.coordinates.length-2:1];var coordinates=[];var angle=0.5*Math.PI+Math.atan2(origin[0]-p2[0],origin[1]-p2[1]);var alpha=marker.baserotation/180*Math.PI+angle;var cosa=Math.cos(alpha);var sina=Math.sin(alpha);svgpath(path).iterate(function(segment,index,x,y){// Skip move instructions
16
16
  if(["m","M"].includes(segment[0])){return}var dx=(x-marker.anchor[0]*width)*markerScaleFactor;var dy=(y-marker.anchor[1]*height)*markerScaleFactor;var rx=cosa*dx+sina*dy;var ry=-sina*dx+cosa*dy;coordinates.push([origin[0]+rx,origin[1]+ry])});// Closing coordinate
17
- coordinates.push(coordinates[0]);var geometry={type:"Polygon",coordinates:[coordinates]};var styleOptions={strokeWidth:1,strokeDash:[],strokeColor:feature.styleOptions.strokeColor,fillColor:feature.styleOptions.strokeColor};params.styles.push(VectorLayerUtils.createSld(geometry.type,"default",styleOptions,layer.opacity,dpi,scaleFactor));params.geoms.push(VectorLayerUtils.geoJSONGeomToWkt(geometry));params.labels.push(" ");params.labelFillColors.push("#FFF");params.labelOutlineColors.push("#FFF");params.labelOutlineSizes.push(scaleFactor);params.labelSizes.push(Math.round(10*scaleFactor));params.labelDist.push("0")},reprojectGeometry:function reprojectGeometry(geometry,srccrs,dstcrs){if(srccrs===dstcrs||!srccrs||!dstcrs){return geometry}if(geometry.type==="Point"){var wgscoo=CoordinatesUtils.reproject(geometry.coordinates,srccrs,dstcrs);return{type:geometry.type,coordinates:wgscoo}}else if(geometry.type==="LineString"||geometry.type==="MultiPoint"){return{type:geometry.type,coordinates:geometry.coordinates.map(function(tuple){return CoordinatesUtils.reproject(tuple,srccrs,dstcrs)})}}else if(geometry.type==="Polygon"||geometry.type==="MultiLineString"){return{type:geometry.type,coordinates:geometry.coordinates.map(function(ring){return ring.map(function(tuple){return CoordinatesUtils.reproject(tuple,srccrs,dstcrs)})})}}else if(geometry.type==="MultiPolygon"){return{type:geometry.type,coordinates:geometry.coordinates.map(function(part){return part.map(function(ring){return ring.map(function(tuple){return CoordinatesUtils.reproject(tuple,srccrs,dstcrs)})})})}}else{return geometry}},reprojectFeature:function reprojectFeature(feature,srccrs,dstcrs){if(srccrs===dstcrs||!srccrs||!dstcrs){return feature}if(feature.features){return _objectSpread(_objectSpread({},feature),{},{features:feature.features.map(function(f){return VectorLayerUtils.reprojectFeature(srccrs,dstcrs)})})}else{return _objectSpread(_objectSpread({},feature),{},{geometry:VectorLayerUtils.reprojectGeometry(feature.geometry,srccrs,dstcrs)})}},wktToGeoJSON:function wktToGeoJSON(wkt,srccrs,dstcrs){var id=arguments.length>3&&arguments[3]!==undefined?arguments[3]:uuidv1();wkt=wkt.replace(/Point(\w+)/i,"Point $1").replace(/LineString(\w+)/i,"LineString $1").replace(/Polygon(\w+)/i,"Polygon $1").replace(/MultiSurface(\w*)/i,"GeometryCollection $1");try{var feature=new ol.format.WKT().readFeature(wkt,{dataProjection:srccrs,featureProjection:dstcrs});var featureObj=new ol.format.GeoJSON().writeFeatureObject(feature);featureObj.id=id;return featureObj}catch(e){/* eslint-disable-next-line */console.warn("Failed to parse geometry: "+wkt);return null}},geoJSONGeomToWkt:function geoJSONGeomToWkt(gj){var precision=arguments.length>1&&arguments[1]!==undefined?arguments[1]:undefined;if(precision===undefined){precision=ConfigUtils.getConfigProp("wmsWktPrecision",null,4)}if(gj.type==="Feature"){gj=gj.geometry}var wrapParens=function wrapParens(s){return"("+s+")"};var pairWKT=function pairWKT(c){return c.map(function(x){return x.toFixed(precision)}).join(" ")};var ringWKT=function ringWKT(r){return r.map(pairWKT).join(", ")};var ringsWKT=function ringsWKT(r){return r.map(ringWKT).map(wrapParens).join(", ")};var multiRingsWKT=function multiRingsWKT(r){return r.map(ringsWKT).map(wrapParens).join(", ")};switch(gj.type){case"Point":return"POINT ("+pairWKT(gj.coordinates)+")";case"LineString":return"LINESTRING ("+ringWKT(gj.coordinates)+")";case"Polygon":return"POLYGON ("+ringsWKT(gj.coordinates)+")";case"MultiPoint":return"MULTIPOINT ("+ringWKT(gj.coordinates)+")";case"MultiPolygon":return"MULTIPOLYGON ("+multiRingsWKT(gj.coordinates)+")";case"MultiLineString":return"MULTILINESTRING ("+ringsWKT(gj.coordinates)+")";case"GeometryCollection":return"GEOMETRYCOLLECTION ("+gj.geometries.map(function(x){return VectorLayerUtils.geoJSONGeomToWkt(x,precision)}).join(", ")+")";default:throw new Error("Invalid geometry object")}},kmlToGeoJSON:function kmlToGeoJSON(kml){var kmlFormat=new ol.format.KML({defaultStyle:[new ol.style.Style]});var geojsonFormat=new ol.format.GeoJSON;var features=[];var _iterator3=_createForOfIteratorHelper(kmlFormat.readFeatures(kml)),_step3;try{for(_iterator3.s();!(_step3=_iterator3.n()).done;){var _feature$geometry2;var olFeature=_step3.value;var style=olFeature.getStyleFunction()(olFeature);style=style[0]||style;var styleOptions={strokeColor:style.getStroke()?style.getStroke().getColor():[0,0,0,1],strokeWidth:style.getStroke()?style.getStroke().getWidth():1,strokeDash:style.getStroke()?style.getStroke().getLineDash():[],fillColor:style.getFill()?style.getFill().getColor():[255,255,255,1],textFill:style.getText()&&style.getText().getFill()?style.getText().getFill().getColor():[0,0,0,1],textStroke:style.getText()&&style.getText().getStroke()?style.getText().getStroke().getColor():[255,255,255,1]};if(style.getImage()&&style.getImage()!==getDefaultImageStyle()&&style.getImage().getSrc()){// FIXME: Uses private members of ol.style.Icon, style.getImage().getAnchor() returns null because style.getImage.getSize() is null because the the image is not yet loaded
18
- var anchor=style.getImage().anchor_||[0.5,0.5];var anchorOrigin=(style.getImage().anchorOrigin_||"").split("-");if(anchorOrigin.includes("right")){anchor[0]=1-anchor[0]}if(anchorOrigin.includes("bottom")){anchor[1]=1-anchor[1]}styleOptions.iconSrc=style.getImage().getSrc();styleOptions.iconAnchor=anchor}var feature=geojsonFormat.writeFeatureObject(olFeature);Object.assign(feature,{styleName:styleOptions.iconSrc&&((_feature$geometry2=feature.geometry)===null||_feature$geometry2===void 0?void 0:_feature$geometry2.type)==="Point"?"marker":"default",styleOptions:styleOptions,id:uuidv1(),crs:"EPSG:4326",properties:{}});var properties=olFeature.getProperties();var excludedProperties=["visibility",olFeature.getGeometryName()];for(var _i=0,_Object$keys=Object.keys(properties);_i<_Object$keys.length;_i++){var key=_Object$keys[_i];if(!excludedProperties.includes(key)){feature.properties[key]=properties[key]}}if(properties.name&&feature.styleName==="marker"){feature.properties.label=properties.name}features.push(feature)}}catch(err){_iterator3.e(err)}finally{_iterator3.f()}return features},convert3dto2d:function convert3dto2d(entry){if(!Array.isArray(entry)){return entry}else if(entry.length>=3&&!Array.isArray(entry[0])){return[entry[0],entry[1]]}else if(Array.isArray(entry[0])){return entry.map(VectorLayerUtils.convert3dto2d)}return entry},computeFeaturesBBox:function computeFeaturesBBox(features){var featureCrs=new Set;features.forEach(function(feature){if(feature.crs){featureCrs.add(feature.crs)}});var bboxCrs=featureCrs.size===1?_toConsumableArray(featureCrs.keys())[0]:"EPSG:4326";var bounds=geojsonBbox({type:"FeatureCollection",features:features.filter(function(feature){return feature.geometry}).map(function(feature){return _objectSpread(_objectSpread({},feature),{},{geometry:feature.crs?VectorLayerUtils.reprojectGeometry(feature.geometry,feature.crs,bboxCrs):feature.geometry})})});// Discard z component
17
+ coordinates.push(coordinates[0]);var geometry={type:"Polygon",coordinates:[coordinates]};var styleOptions={strokeWidth:1,strokeDash:[],strokeColor:feature.styleOptions.strokeColor,fillColor:feature.styleOptions.strokeColor};params.styles.push(VectorLayerUtils.createSld(geometry.type,"default",styleOptions,layer.opacity,dpi,scaleFactor));params.geoms.push(VectorLayerUtils.geoJSONGeomToWkt(geometry));params.labels.push(" ");params.labelFillColors.push("#FFF");params.labelOutlineColors.push("#FFF");params.labelOutlineSizes.push(scaleFactor);params.labelSizes.push(Math.round(10*scaleFactor));params.labelDist.push("0")},reprojectGeometry:function reprojectGeometry(geometry,srccrs,dstcrs){if(srccrs===dstcrs||!srccrs||!dstcrs){return geometry}if(geometry.type==="Point"){var wgscoo=CoordinatesUtils.reproject(geometry.coordinates,srccrs,dstcrs);return{type:geometry.type,coordinates:wgscoo}}else if(geometry.type==="LineString"||geometry.type==="MultiPoint"){return{type:geometry.type,coordinates:geometry.coordinates.map(function(tuple){return CoordinatesUtils.reproject(tuple,srccrs,dstcrs)})}}else if(geometry.type==="Polygon"||geometry.type==="MultiLineString"){return{type:geometry.type,coordinates:geometry.coordinates.map(function(ring){return ring.map(function(tuple){return CoordinatesUtils.reproject(tuple,srccrs,dstcrs)})})}}else if(geometry.type==="MultiPolygon"){return{type:geometry.type,coordinates:geometry.coordinates.map(function(part){return part.map(function(ring){return ring.map(function(tuple){return CoordinatesUtils.reproject(tuple,srccrs,dstcrs)})})})}}else{return geometry}},reprojectFeature:function reprojectFeature(feature,srccrs,dstcrs){if(srccrs===dstcrs||!srccrs||!dstcrs){return feature}if(feature.features){return _objectSpread(_objectSpread({},feature),{},{features:feature.features.map(function(f){return VectorLayerUtils.reprojectFeature(srccrs,dstcrs)})})}else{return _objectSpread(_objectSpread({},feature),{},{geometry:VectorLayerUtils.reprojectGeometry(feature.geometry,srccrs,dstcrs)})}},wktToGeoJSON:function wktToGeoJSON(wkt,srccrs,dstcrs){var id=arguments.length>3&&arguments[3]!==undefined?arguments[3]:uuidv4();wkt=wkt.replace(/Point(\w+)/i,"Point $1").replace(/LineString(\w+)/i,"LineString $1").replace(/Polygon(\w+)/i,"Polygon $1").replace(/MultiSurface(\w*)/i,"GeometryCollection $1");try{var feature=new ol.format.WKT().readFeature(wkt,{dataProjection:srccrs,featureProjection:dstcrs});var featureObj=new ol.format.GeoJSON().writeFeatureObject(feature);featureObj.id=id;return featureObj}catch(e){/* eslint-disable-next-line */console.warn("Failed to parse geometry: "+wkt);return null}},geoJSONGeomToWkt:function geoJSONGeomToWkt(gj){var precision=arguments.length>1&&arguments[1]!==undefined?arguments[1]:undefined;if(precision===undefined){precision=ConfigUtils.getConfigProp("wmsWktPrecision",null,4)}if(gj.type==="Feature"){gj=gj.geometry}var wrapParens=function wrapParens(s){return"("+s+")"};var pairWKT=function pairWKT(c){return c.map(function(x){return x.toFixed(precision)}).join(" ")};var ringWKT=function ringWKT(r){return r.map(pairWKT).join(", ")};var ringsWKT=function ringsWKT(r){return r.map(ringWKT).map(wrapParens).join(", ")};var multiRingsWKT=function multiRingsWKT(r){return r.map(ringsWKT).map(wrapParens).join(", ")};switch(gj.type){case"Point":return"POINT ("+pairWKT(gj.coordinates)+")";case"LineString":return"LINESTRING ("+ringWKT(gj.coordinates)+")";case"Polygon":return"POLYGON ("+ringsWKT(gj.coordinates)+")";case"MultiPoint":return"MULTIPOINT ("+ringWKT(gj.coordinates)+")";case"MultiPolygon":return"MULTIPOLYGON ("+multiRingsWKT(gj.coordinates)+")";case"MultiLineString":return"MULTILINESTRING ("+ringsWKT(gj.coordinates)+")";case"GeometryCollection":return"GEOMETRYCOLLECTION ("+gj.geometries.map(function(x){return VectorLayerUtils.geoJSONGeomToWkt(x,precision)}).join(", ")+")";default:throw new Error("Invalid geometry object")}},kmlToGeoJSON:function kmlToGeoJSON(kml){var kmlFormat=new ol.format.KML({defaultStyle:[new ol.style.Style]});var geojsonFormat=new ol.format.GeoJSON;var features=[];var _iterator3=_createForOfIteratorHelper(kmlFormat.readFeatures(kml)),_step3;try{for(_iterator3.s();!(_step3=_iterator3.n()).done;){var _feature$geometry2;var olFeature=_step3.value;var style=olFeature.getStyleFunction()(olFeature);style=style[0]||style;var styleOptions={strokeColor:style.getStroke()?style.getStroke().getColor():[0,0,0,1],strokeWidth:style.getStroke()?style.getStroke().getWidth():1,strokeDash:style.getStroke()?style.getStroke().getLineDash():[],fillColor:style.getFill()?style.getFill().getColor():[255,255,255,1],textFill:style.getText()&&style.getText().getFill()?style.getText().getFill().getColor():[0,0,0,1],textStroke:style.getText()&&style.getText().getStroke()?style.getText().getStroke().getColor():[255,255,255,1]};if(style.getImage()&&style.getImage()!==getDefaultImageStyle()&&style.getImage().getSrc()){// FIXME: Uses private members of ol.style.Icon, style.getImage().getAnchor() returns null because style.getImage.getSize() is null because the the image is not yet loaded
18
+ var anchor=style.getImage().anchor_||[0.5,0.5];var anchorOrigin=(style.getImage().anchorOrigin_||"").split("-");if(anchorOrigin.includes("right")){anchor[0]=1-anchor[0]}if(anchorOrigin.includes("bottom")){anchor[1]=1-anchor[1]}styleOptions.iconSrc=style.getImage().getSrc();styleOptions.iconAnchor=anchor}var feature=geojsonFormat.writeFeatureObject(olFeature);Object.assign(feature,{styleName:styleOptions.iconSrc&&((_feature$geometry2=feature.geometry)===null||_feature$geometry2===void 0?void 0:_feature$geometry2.type)==="Point"?"marker":"default",styleOptions:styleOptions,id:uuidv4(),crs:"EPSG:4326",properties:{}});var properties=olFeature.getProperties();var excludedProperties=["visibility",olFeature.getGeometryName()];for(var _i=0,_Object$keys=Object.keys(properties);_i<_Object$keys.length;_i++){var key=_Object$keys[_i];if(!excludedProperties.includes(key)){feature.properties[key]=properties[key]}}if(properties.name&&feature.styleName==="marker"){feature.properties.label=properties.name}features.push(feature)}}catch(err){_iterator3.e(err)}finally{_iterator3.f()}return features},convert3dto2d:function convert3dto2d(entry){if(!Array.isArray(entry)){return entry}else if(entry.length>=3&&!Array.isArray(entry[0])){return[entry[0],entry[1]]}else if(Array.isArray(entry[0])){return entry.map(VectorLayerUtils.convert3dto2d)}return entry},computeFeaturesBBox:function computeFeaturesBBox(features){var featureCrs=new Set;features.forEach(function(feature){if(feature.crs){featureCrs.add(feature.crs)}});var bboxCrs=featureCrs.size===1?_toConsumableArray(featureCrs.keys())[0]:"EPSG:4326";var bounds=geojsonBbox({type:"FeatureCollection",features:features.filter(function(feature){return feature.geometry}).map(function(feature){return _objectSpread(_objectSpread({},feature),{},{geometry:feature.crs?VectorLayerUtils.reprojectGeometry(feature.geometry,feature.crs,bboxCrs):feature.geometry})})});// Discard z component
19
19
  if(bounds.length===6){bounds=[bounds[0],bounds[1],bounds[3],bounds[4]]}return{crs:bboxCrs,bounds:bounds}},computeFeatureBBox:function computeFeatureBBox(feature){var bounds=geojsonBbox(feature);// Discard z component
20
20
  if(bounds.length===6){bounds=[bounds[0],bounds[1],bounds[3],bounds[4]]}return bounds},getFeatureCenter:function getFeatureCenter(feature){var geojson=new ol.format.GeoJSON().readFeature(feature);var geometry=geojson.getGeometry();var type=geometry.getType();var center=null;switch(type){case"Polygon":center=geometry.getInteriorPoint().getCoordinates();break;case"MultiPolygon":center=geometry.getInteriorPoints().getClosestPoint(ol.extent.getCenter(geometry.getExtent()));break;case"Point":center=geometry.getCoordinates();break;case"MultiPoint":center=geometry.getClosestPoint(ol.extent.getCenter(geometry.getExtent()));break;case"LineString":center=geometry.getCoordinateAt(0.5);break;case"MultiLineString":center=geometry.getClosestPoint(ol.extent.getCenter(geometry.getExtent()));break;case"Circle":center=geometry.getCenter();break;default:break}return center}};export default VectorLayerUtils;