I am trying to set a time interval on a dynamic map service to only see a certain time slice of the data without success (I do not want to impose the time interval on the map). Here's some sample code:
import QtQuick 2.3 import QtQuick.Controls 1.2 import ArcGIS.Runtime 10.26 ApplicationWindow { id: appWindow width: 800 height: 600 title: "Time Interval" Map { id: mainMap anchors.fill: parent hidingNoDataTiles: false wrapAroundEnabled: true focus: true ArcGISTiledMapServiceLayer { url: "http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer" } ArcGISDynamicMapServiceLayer { url: "http://tmservices1.esri.com/arcgis/rest/services/LiveFeeds/Earthquakes/MapServer" timeInterval: myTimeExtent Component.onCompleted: { console.log("timeInterval is undefined:", timeInterval == undefined); } } onStatusChanged: { if (status === Enums.MapStatusReady) mainMap.zoomTo(usExtent); } } Envelope { id: usExtent xMax: -15000000 yMax: 2000000 xMin: -7000000 yMin: 8000000 spatialReference: SpatialReference { wkid: 102100 } } TimeExtent { id: myTimeExtent startDate: new Date(2016, 2, 26, 0, 0, 0, 0) endDate: new Date(2016, 2, 27, 0, 0, 0, 0) } }
Not only does it not set a timeInterval, the timeInterval is still undefined after the onCompleted (timeInterval == undefined resolves to true).
Any help or insight would be greatly appreciated!
Ben
Solved! Go to Solution.
Hmm, it seems like it is having issues assigning it declaratively. Try setting it in JavaScript, and see if it works. I believe I have it working with the following code:
import QtQuick 2.3 import QtQuick.Controls 1.2 import ArcGIS.Runtime 10.26 ApplicationWindow { id: appWindow width: 800 height: 600 title: "Time Interval" Map { id: mainMap anchors.fill: parent wrapAroundEnabled: true ArcGISTiledMapServiceLayer { url: "http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer" } ArcGISDynamicMapServiceLayer { id: timeAwareDynamicLayer url: "http://tmservices1.esri.com/arcgis/rest/services/LiveFeeds/Earthquakes/MapServer" onTimeIntervalChanged: { console.log("time interval changed") } onStatusChanged: { if (status === Enums.LayerStatusInitialized) { // assign a new timeInterval timeAwareDynamicLayer.timeInterval = myTimeExtent; } } } } TimeExtent { id: myTimeExtent startDate: new Date(2016, 2, 27) endDate: new Date(2016, 2, 28) } }
As a side note, I recommend using the layer status (statusChanged signal) instead of Component.onCompleted for something like this. With checking layer status, you can make sure it is initialized, whereas Component.onCompleted is built into all QML types, and will just tell you if it is default constructed basically. In this case, we want to wait until we actually know it is initialized, meaning it has gone out to the service, obtained all of the layer info, been added to the map, etc. Component.onCompleted would likely fire before all of that stuff has happened.
-Luke
Hmm, it seems like it is having issues assigning it declaratively. Try setting it in JavaScript, and see if it works. I believe I have it working with the following code:
import QtQuick 2.3 import QtQuick.Controls 1.2 import ArcGIS.Runtime 10.26 ApplicationWindow { id: appWindow width: 800 height: 600 title: "Time Interval" Map { id: mainMap anchors.fill: parent wrapAroundEnabled: true ArcGISTiledMapServiceLayer { url: "http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer" } ArcGISDynamicMapServiceLayer { id: timeAwareDynamicLayer url: "http://tmservices1.esri.com/arcgis/rest/services/LiveFeeds/Earthquakes/MapServer" onTimeIntervalChanged: { console.log("time interval changed") } onStatusChanged: { if (status === Enums.LayerStatusInitialized) { // assign a new timeInterval timeAwareDynamicLayer.timeInterval = myTimeExtent; } } } } TimeExtent { id: myTimeExtent startDate: new Date(2016, 2, 27) endDate: new Date(2016, 2, 28) } }
As a side note, I recommend using the layer status (statusChanged signal) instead of Component.onCompleted for something like this. With checking layer status, you can make sure it is initialized, whereas Component.onCompleted is built into all QML types, and will just tell you if it is default constructed basically. In this case, we want to wait until we actually know it is initialized, meaning it has gone out to the service, obtained all of the layer info, been added to the map, etc. Component.onCompleted would likely fire before all of that stuff has happened.
-Luke
Yup, that does the trick. And thanks for the tip on the layer status - that makes good sense!
Thanks!
Ben