def testFromMapSettings(self): """ test QgsRenderContext.fromMapSettings() """ ms = QgsMapSettings() ms.setOutputSize(QSize(1000, 1000)) ms.setDestinationCrs(QgsCoordinateReferenceSystem('EPSG:3111')) ms.setExtent(QgsRectangle(10000, 20000, 30000, 40000)) ms.setFlag(QgsMapSettings.Antialiasing, True) ms.setFlag(QgsMapSettings.LosslessImageRendering, True) ms.setFlag(QgsMapSettings.Render3DMap, True) ms.setZRange(QgsDoubleRange(1, 10)) ms.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysText) rc = QgsRenderContext.fromMapSettings(ms) self.assertEqual(rc.textRenderFormat(), QgsRenderContext.TextFormatAlwaysText) self.assertTrue(rc.testFlag(QgsRenderContext.Antialiasing)) self.assertTrue(rc.testFlag(QgsRenderContext.LosslessImageRendering)) self.assertTrue(rc.testFlag(QgsRenderContext.Render3DMap)) self.assertEqual(ms.zRange(), QgsDoubleRange(1, 10)) self.assertEqual(rc.symbologyReferenceScale(), -1) # should have an valid mapToPixel self.assertTrue(rc.mapToPixel().isValid()) ms.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysOutlines) ms.setZRange(QgsDoubleRange()) rc = QgsRenderContext.fromMapSettings(ms) self.assertEqual(rc.textRenderFormat(), QgsRenderContext.TextFormatAlwaysOutlines) self.assertTrue(ms.zRange().isInfinite()) self.assertEqual(rc.mapExtent(), QgsRectangle(10000, 20000, 30000, 40000)) ms.setIsTemporal(True) rc = QgsRenderContext.fromMapSettings(ms) self.assertEqual(rc.isTemporal(), True) ms.setTemporalRange(QgsDateTimeRange(QDateTime(2020, 1, 1, 0, 0), QDateTime(2010, 12, 31, 23, 59))) rc = QgsRenderContext.fromMapSettings(ms) self.assertEqual(rc.temporalRange(), QgsDateTimeRange(QDateTime(2020, 1, 1, 0, 0), QDateTime(2010, 12, 31, 23, 59))) ms.setDpiTarget(111.1) rc = QgsRenderContext.fromMapSettings(ms) self.assertEqual(rc.dpiTarget(), 111.1)
def testCopyConstructor(self): """ Test the copy constructor """ c1 = QgsRenderContext() c1.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysText) c1.setMapExtent(QgsRectangle(1, 2, 3, 4)) c1.setZRange(QgsDoubleRange(1, 10)) c1.setSymbologyReferenceScale(1000) c1.setOutputSize(QSize(100, 200)) c1.setImageFormat(QImage.Format_Alpha8) c1.setDevicePixelRatio(2) c1.setFrameRate(30) c1.setCurrentFrame(6) c2 = QgsRenderContext(c1) self.assertEqual(c2.textRenderFormat(), QgsRenderContext.TextFormatAlwaysText) self.assertEqual(c2.mapExtent(), QgsRectangle(1, 2, 3, 4)) self.assertEqual(c2.zRange(), QgsDoubleRange(1, 10)) self.assertEqual(c2.symbologyReferenceScale(), 1000) self.assertEqual(c2.outputSize(), QSize(100, 200)) self.assertEqual(c2.imageFormat(), QImage.Format_Alpha8) self.assertEqual(c2.devicePixelRatio(), 2) self.assertEqual(c2.deviceOutputSize(), QSize(200, 400)) self.assertEqual(c2.frameRate(), 30) self.assertEqual(c2.currentFrame(), 6) c1.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysOutlines) c2 = QgsRenderContext(c1) self.assertEqual(c2.textRenderFormat(), QgsRenderContext.TextFormatAlwaysOutlines) c1.setIsTemporal(True) c1.setTemporalRange( QgsDateTimeRange(QDateTime(2020, 1, 1, 0, 0), QDateTime(2010, 12, 31, 23, 59))) c2 = QgsRenderContext(c1) self.assertEqual(c2.isTemporal(), True) self.assertEqual( c2.temporalRange(), QgsDateTimeRange(QDateTime(2020, 1, 1, 0, 0), QDateTime(2010, 12, 31, 23, 59)))
def testTemporalRange(self): p = QgsProjectTimeSettings() self.assertTrue(p.temporalRange().isInfinite()) spy = QSignalSpy(p.temporalRangeChanged) r = QgsDateTimeRange(QDateTime(QDate(2020, 1, 1), QTime(8, 0, 0)), QDateTime(QDate(2020, 12, 1), QTime(8, 0, 0))) rc = QgsDateTimeRange(QDateTime(QDate(2020, 1, 1), QTime(8, 0, 0)), QDateTime(QDate(2020, 12, 1), QTime(8, 0, 0))) p.setTemporalRange(r) self.assertEqual(p.temporalRange(), r) self.assertEqual(len(spy), 1) p.setTemporalRange(rc) self.assertEqual(len(spy), 1) p.reset() self.assertEqual(len(spy), 2)
def testTemporalRangeForProject(self): p = QgsProject() r1 = QgsRasterLayer('', '', 'wms') r2 = QgsRasterLayer('', '', 'wms') r3 = QgsRasterLayer('', '', 'wms') r1.temporalProperties().setIsActive(True) r1.temporalProperties().setFixedTemporalRange(QgsDateTimeRange(QDateTime(QDate(2020, 1, 1), QTime(), Qt.UTC), QDateTime(QDate(2020, 3, 31), QTime(), Qt.UTC))) r2.temporalProperties().setIsActive(True) r2.temporalProperties().setFixedTemporalRange(QgsDateTimeRange(QDateTime(QDate(2020, 4, 1), QTime(), Qt.UTC), QDateTime(QDate(2020, 7, 31), QTime(), Qt.UTC))) r3.temporalProperties().setIsActive(True) r3.temporalProperties().setFixedTemporalRange(QgsDateTimeRange(QDateTime(QDate(2019, 1, 1), QTime(), Qt.UTC), QDateTime(QDate(2020, 2, 28), QTime(), Qt.UTC))) p.addMapLayers([r1, r2, r3]) range = QgsTemporalUtils.calculateTemporalRangeForProject(p) self.assertEqual(range.begin(), QDateTime(QDate(2019, 1, 1), QTime(), Qt.UTC)) self.assertEqual(range.end(), QDateTime(QDate(2020, 7, 31), QTime(), Qt.UTC))
def testSingleFieldMode(self): layer = QgsVectorLayer("Point?field=fldtxt:string&field=fldint:integer&field=start_field:datetime", "test", "memory") self.assertTrue(layer.isValid()) self.assertEqual(layer.fields()[2].type(), QVariant.DateTime) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) props = QgsVectorLayerTemporalProperties(enabled=False) props.setMode(QgsVectorLayerTemporalProperties.ModeFeatureDateTimeInstantFromField) props.setStartField('start_field') self.assertFalse(props.createFilterString(layer, range)) props.setIsActive(True) self.assertEqual(props.createFilterString(layer, range), '("start_field" >= make_datetime(2019,3,4,11,12,13) AND "start_field" <= make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL') range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) self.assertEqual(props.createFilterString(layer, range), '("start_field" > make_datetime(2019,3,4,11,12,13) AND "start_field" <= make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL') range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) self.assertEqual(props.createFilterString(layer, range), '("start_field" >= make_datetime(2019,3,4,11,12,13) AND "start_field" < make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL')
def testFromMapSettings(self): """ test QgsRenderContext.fromMapSettings() """ ms = QgsMapSettings() ms.setOutputSize(QSize(1000, 1000)) ms.setDestinationCrs(QgsCoordinateReferenceSystem('EPSG:3111')) ms.setExtent(QgsRectangle(10000, 20000, 30000, 40000)) ms.setFlag(QgsMapSettings.Antialiasing, True) ms.setFlag(QgsMapSettings.LosslessImageRendering, True) ms.setFlag(QgsMapSettings.Render3DMap, True) ms.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysText) rc = QgsRenderContext.fromMapSettings(ms) self.assertEqual(rc.textRenderFormat(), QgsRenderContext.TextFormatAlwaysText) self.assertTrue(rc.testFlag(QgsRenderContext.Antialiasing)) self.assertTrue(rc.testFlag(QgsRenderContext.LosslessImageRendering)) self.assertTrue(rc.testFlag(QgsRenderContext.Render3DMap)) ms.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysOutlines) rc = QgsRenderContext.fromMapSettings(ms) self.assertEqual(rc.textRenderFormat(), QgsRenderContext.TextFormatAlwaysOutlines) self.assertEqual(rc.mapExtent(), QgsRectangle(10000, 20000, 30000, 40000)) ms.setIsTemporal(True) rc = QgsRenderContext.fromMapSettings(ms) self.assertEqual(rc.isTemporal(), True) ms.setTemporalRange( QgsDateTimeRange(QDateTime(2020, 1, 1, 0, 0), QDateTime(2010, 12, 31, 23, 59))) rc = QgsRenderContext.fromMapSettings(ms) self.assertEqual( rc.temporalRange(), QgsDateTimeRange(QDateTime(2020, 1, 1, 0, 0), QDateTime(2010, 12, 31, 23, 59)))
def testUsedTemporalRangesForProject(self): p = QgsProject() r1 = QgsRasterLayer('', '', 'wms') r2 = QgsRasterLayer('', '', 'wms') r3 = QgsRasterLayer('', '', 'wms') r4 = QgsRasterLayer('', '', 'wms') r1.temporalProperties().setIsActive(True) r1.temporalProperties().setMode( QgsRasterLayerTemporalProperties.ModeTemporalRangeFromDataProvider) r1.dataProvider().temporalCapabilities().setAvailableTemporalRange( QgsDateTimeRange(QDateTime(QDate(2020, 1, 1), QTime(), Qt.UTC), QDateTime(QDate(2020, 3, 31), QTime(), Qt.UTC))) r2.temporalProperties().setIsActive(True) r2.temporalProperties().setMode( QgsRasterLayerTemporalProperties.ModeTemporalRangeFromDataProvider) r2.dataProvider().temporalCapabilities().setAllAvailableTemporalRanges( [ QgsDateTimeRange( QDateTime(QDate(2020, 4, 1), QTime(), Qt.UTC), QDateTime(QDate(2020, 7, 31), QTime(), Qt.UTC)) ]) r3.temporalProperties().setIsActive(True) r3.temporalProperties().setMode( QgsRasterLayerTemporalProperties.ModeTemporalRangeFromDataProvider) r3.dataProvider().temporalCapabilities().setAllAvailableTemporalRanges( [ QgsDateTimeRange( QDateTime(QDate(2019, 1, 1), QTime(), Qt.UTC), QDateTime(QDate(2020, 2, 28), QTime(), Qt.UTC)) ]) r4.temporalProperties().setIsActive(True) r4.temporalProperties().setMode( QgsRasterLayerTemporalProperties.ModeTemporalRangeFromDataProvider) r4.dataProvider().temporalCapabilities().setAllAvailableTemporalRanges( [ QgsDateTimeRange( QDateTime(QDate(2021, 1, 1), QTime(), Qt.UTC), QDateTime(QDate(2021, 2, 28), QTime(), Qt.UTC)) ]) p.addMapLayers([r1, r2, r3, r4]) ranges = QgsTemporalUtils.usedTemporalRangesForProject(p) self.assertEqual(ranges, [ QgsDateTimeRange(QDateTime(QDate(2019, 1, 1), QTime(), Qt.UTC), QDateTime(QDate(2020, 3, 31), QTime(), Qt.UTC)), QgsDateTimeRange(QDateTime(QDate(2020, 4, 1), QTime(), Qt.UTC), QDateTime(QDate(2020, 7, 31), QTime(), Qt.UTC)), QgsDateTimeRange(QDateTime(QDate(2021, 1, 1), QTime(), Qt.UTC), QDateTime(QDate(2021, 2, 28), QTime(), Qt.UTC)) ])
def time_range(self) -> Optional[QgsDateTimeRange]: """ Date time range of the dataset """ if self.is_temporal: # Add extra second to make last frame visible assert self.start_time is not None assert self.num_of_time_steps is not None assert self.time_step is not None return QgsDateTimeRange( self.start_time, self.start_time + (self.num_of_time_steps - 1) * self.time_step + datetime.timedelta(seconds=1), # type: ignore ) return None
def set_fixed_temporal_range(layer: QgsRasterLayer, t_range: QgsDateTimeRange) -> None: """ Set fixed temporal range for raster layer :param layer: raster layer :param t_range: fixed temporal range """ mode = QgsRasterLayerTemporalProperties.ModeFixedTemporalRange tprops: QgsRasterLayerTemporalProperties = layer.temporalProperties() tprops.setMode(mode) if t_range.begin().timeSpec() == 0 or t_range.end().timeSpec() == 0: begin = t_range.begin() end = t_range.end() begin.setTimeSpec(Qt.TimeSpec(1)) end.setTimeSpec(Qt.TimeSpec(1)) t_range = QgsDateTimeRange(begin, end) tprops.setFixedTemporalRange(t_range) tprops.setIsActive(True)
def testFixedRangeMode(self): props = QgsVectorLayerTemporalProperties(enabled=True) props.setMode(QgsVectorLayerTemporalProperties.ModeFixedTemporalRange) props.setFixedTemporalRange(QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)))) self.assertTrue(props.isVisibleInTemporalRange(QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))))) self.assertTrue(props.isVisibleInTemporalRange(QgsDateTimeRange(QDateTime(QDate(2019, 1, 4), QTime(11, 12, 13)), QDateTime(QDate(2019, 5, 6), QTime(8, 9, 10))))) self.assertTrue(props.isVisibleInTemporalRange(QgsDateTimeRange(QDateTime(QDate(2020, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2019, 9, 6), QTime(8, 9, 10))))) self.assertFalse(props.isVisibleInTemporalRange(QgsDateTimeRange(QDateTime(QDate(2120, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2121, 9, 6), QTime(8, 9, 10))))) self.assertFalse(props.isVisibleInTemporalRange(QgsDateTimeRange(QDateTime(QDate(1920, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(1921, 9, 6), QTime(8, 9, 10))))) layer = QgsVectorLayer("Point?field=fldtxt:string&field=fldint:integer&field=start_field:datetime", "test", "memory") range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) # ALWAYS must be empty for ModeFixedTemporalRange self.assertFalse(props.createFilterString(layer, range))
def updateTime(self): self.temporal.setNavigationMode( QgsTemporalNavigationObject.NavigationMode.FixedRange) if self.stationZone is not None: self.datetime = QDateTime(self.dateEdit.date(), self.timeEdit.time(), self.stationZone).toUTC() else: self.datetime = QDateTime(self.dateEdit.date(), self.timeEdit.time()).toUTC() # Note: we hack around a memory provider range bug here by offsetting the window by 1 minute self.temporal.setTemporalExtents( QgsDateTimeRange( self.datetime.addSecs(-self.TEMPORAL_HACK_SECS), self.datetime.addSecs((60 * PredictionManager.STEP_MINUTES) - self.TEMPORAL_HACK_SECS), True, False)) self.updatePlotXLine()
def testModeFromProvider(self): caps = QgsVectorDataProviderTemporalCapabilities() props = QgsVectorLayerTemporalProperties() props.setDefaultsFromDataProviderTemporalCapabilities(caps) self.assertFalse(props.isActive()) caps.setHasTemporalCapabilities(True) caps.setAvailableTemporalRange( QgsDateTimeRange(QDateTime(2006, 3, 11, 0, 13, 20), QDateTime(2017, 2, 14, 1, 33, 20))) props.setDefaultsFromDataProviderTemporalCapabilities(caps) self.assertTrue(props.isActive()) self.assertFalse(props.startField()) self.assertFalse(props.endField()) self.assertEqual( props.mode(), QgsVectorLayerTemporalProperties.ModeFixedTemporalRange) self.assertEqual(props.fixedTemporalRange().begin(), QDateTime(2006, 3, 11, 0, 13, 20)) self.assertEqual(props.fixedTemporalRange().end(), QDateTime(2017, 2, 14, 1, 33, 20)) caps.setStartField('start_field') caps.setMode(QgsVectorDataProviderTemporalCapabilities. ProviderStoresFeatureDateTimeInstantInField) props.setDefaultsFromDataProviderTemporalCapabilities(caps) self.assertTrue(props.isActive()) self.assertEqual(props.startField(), 'start_field') self.assertFalse(props.endField()) self.assertEqual( props.mode(), QgsVectorLayerTemporalProperties. ModeFeatureDateTimeInstantFromField) caps.setEndField('end_field') caps.setMode(QgsVectorDataProviderTemporalCapabilities. ProviderStoresFeatureDateTimeStartAndEndInSeparateFields) props.setDefaultsFromDataProviderTemporalCapabilities(caps) self.assertTrue(props.isActive()) self.assertEqual(props.startField(), 'start_field') self.assertEqual(props.endField(), 'end_field') self.assertEqual( props.mode(), QgsVectorLayerTemporalProperties. ModeFeatureDateTimeStartAndEndFromFields)
def testReadWrite(self): props = QgsVectorLayerTemporalProperties() props.setMode(QgsVectorLayerTemporalProperties.ModeFeatureDateTimeInstantFromField) props.setFixedTemporalRange(QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)))) props.setStartField('start') props.setEndField('end') # save to xml doc = QDomDocument("testdoc") elem = doc.createElement('test') elem = props.writeXml(elem, doc, QgsReadWriteContext()) # restore from xml props2 = QgsVectorLayerTemporalProperties() self.assertTrue(props2.readXml(elem, QgsReadWriteContext())) self.assertEqual(props2.mode(), props.mode()) self.assertEqual(props2.fixedTemporalRange(), props.fixedTemporalRange()) self.assertEqual(props2.startField(), props.startField()) self.assertEqual(props2.endField(), props.endField())
def _set_time_range(self, layer: QgsRasterLayer) -> None: """ Sets temporal settings for layer, especially start time and end time (since QGIS 3.14). Args: layer (QgsRasterLayer): Raster layer for which to set temporal settings """ time_delta = self._extract_time_delta_from_layer_name(layer.name()) timestamp_end = self._extract_timestamp_from_layername(layer.name()) timestamp_start = timestamp_end - time_delta self.out( f"Time range from {timestamp_start:%d.%m.%Y %H:%M} to {timestamp_end:%d.%m.%Y %H:%M}." ) temp_props = layer.temporalProperties() temp_props.setMode( QgsRasterLayerTemporalProperties.ModeFixedTemporalRange) temp_props.setFixedTemporalRange( QgsDateTimeRange(timestamp_start, timestamp_end)) temp_props.setIsActive(True)
def testExtent(self): e = QgsLayerMetadata.Extent() se = QgsLayerMetadata.SpatialExtent() se.extentCrs = QgsCoordinateReferenceSystem.fromEpsgId(3111) se.bounds = QgsBox3d(1, 2, 3, 4, 5, 6) e.setSpatialExtents([se]) e.setTemporalExtents([QgsDateTimeRange(QDateTime(QDate(2017, 1, 3), QTime(11, 34, 56)), QDateTime(QDate(2018, 1, 3), QTime(12, 35, 57)))]) m = QgsLayerMetadata() m.setExtent(e) extents = m.extent().spatialExtents() self.assertEqual(extents[0].extentCrs.authid(), 'EPSG:3111') self.assertEqual(extents[0].bounds.xMinimum(), 1.0) self.assertEqual(extents[0].bounds.yMinimum(), 2.0) self.assertEqual(extents[0].bounds.zMinimum(), 3.0) self.assertEqual(extents[0].bounds.xMaximum(), 4.0) self.assertEqual(extents[0].bounds.yMaximum(), 5.0) self.assertEqual(extents[0].bounds.zMaximum(), 6.0) self.assertEqual(m.extent().temporalExtents()[0].begin(), QDateTime(QDate(2017, 1, 3), QTime(11, 34, 56))) self.assertEqual(m.extent().temporalExtents()[0].end(), QDateTime(QDate(2018, 1, 3), QTime(12, 35, 57)))
def testReadWrite(self): p = QgsProjectTimeSettings() self.assertTrue(p.temporalRange().isInfinite()) doc = QDomDocument("testdoc") elem = p.writeXml(doc, QgsReadWriteContext()) p2 = QgsProjectTimeSettings() spy = QSignalSpy(p2.temporalRangeChanged) self.assertTrue(p2.readXml(elem, QgsReadWriteContext())) self.assertEqual(p2.temporalRange(), p.temporalRange()) self.assertEqual(len(spy), 0) r = QgsDateTimeRange(QDateTime(QDate(2020, 1, 1), QTime(8, 0, 0)), QDateTime(QDate(2020, 12, 1), QTime(8, 0, 0))) p.setTemporalRange(r) elem = p.writeXml(doc, QgsReadWriteContext()) p2 = QgsProjectTimeSettings() spy = QSignalSpy(p2.temporalRangeChanged) self.assertTrue(p2.readXml(elem, QgsReadWriteContext())) self.assertEqual(p2.temporalRange(), r) self.assertEqual(len(spy), 1)
def testLayerMode(self): """ Create a fully populated QgsLayerMetadata object, then set it to the widget and re-read back the generated metadata to ensure that no content is lost. """ w = QgsMetadataWidget() m = QgsLayerMetadata() m.setIdentifier('1234') m.setParentIdentifier('xyz') m.setLanguage('en-CA') m.setType('dataset') m.setTitle('roads') m.setAbstract('my roads') m.setFees('None') m.setConstraints([QgsLayerMetadata.Constraint('None', 'access')]) m.setRights(['Copyright foo 2017']) m.setLicenses(['WTFPL']) m.setHistory(['history a', 'history b']) m.setKeywords({ 'GEMET': ['kw1', 'kw2'], 'gmd:topicCategory': ['natural'], }) #m.setEncoding('utf-8') m.setCrs(QgsCoordinateReferenceSystem.fromOgcWmsCrs('EPSG:4326')) e = QgsLayerMetadata.Extent() se = QgsLayerMetadata.SpatialExtent() se.extentCrs = QgsCoordinateReferenceSystem.fromOgcWmsCrs('EPSG:4326') se.bounds = QgsBox3d(-180, -90, 0, 180, 90, 0) e.setSpatialExtents([se]) dates = [ QgsDateTimeRange( QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47)), QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47))) ] e.setTemporalExtents(dates) m.setExtent(e) c = QgsLayerMetadata.Contact() c.name = 'John Smith' c.organization = 'ACME' c.position = 'staff' c.voice = '1500 515 555' c.fax = 'xx.xxx.xxx.xxxx' c.email = '*****@*****.**' c.role = 'pointOfContact' address = QgsLayerMetadata.Address() address.type = 'postal' address.address = '123 Main Street' address.city = 'anycity' address.administrativeArea = 'anyprovince' address.postalCode = '90210' address.country = 'Canada' c.addresses = [address] m.setContacts([c]) l = QgsLayerMetadata.Link() l.name = 'geonode:roads' l.type = 'OGC:WMS' l.description = 'my GeoNode road layer' l.url = 'http://example.org/wms' l2 = QgsLayerMetadata.Link() l2.name = 'geonode:roads' l2.type = 'OGC:WFS' l2.description = 'my GeoNode road layer' l2.url = 'http://example.org/wfs' l3 = QgsLayerMetadata.Link() l3.name = 'roads' l3.type = 'WWW:LINK' l3.description = 'full dataset download' l3.url = 'http://example.org/roads.tgz' l3.format = 'ESRI Shapefile' l3.mimeType = 'application/gzip' l3.size = '283676' m.setLinks([l, l2, l3]) # set widget metadata w.setMetadata(m) self.assertEqual(w.mode(), QgsMetadataWidget.LayerMetadata) m = w.metadata() self.assertIsInstance(m, QgsLayerMetadata) self.assertEqual(m.identifier(), '1234') self.assertEqual(m.parentIdentifier(), 'xyz') self.assertEqual(m.language(), 'en-CA') self.assertEqual(m.type(), 'dataset') self.assertEqual(m.title(), 'roads') self.assertEqual(m.abstract(), 'my roads') self.assertEqual(m.fees(), 'None') self.assertEqual(m.constraints()[0].constraint, 'None') self.assertEqual(m.constraints()[0].type, 'access') self.assertEqual(m.rights(), ['Copyright foo 2017']) self.assertEqual(m.licenses(), ['WTFPL']) self.assertEqual(m.history(), ['history a', 'history b']) #self.assertEqual(m.encoding(), 'utf-8') self.assertEqual( m.keywords(), {'GEMET': ['kw1', 'kw2'], 'gmd:topicCategory': ['natural']}) self.assertEqual(m.crs().authid(), 'EPSG:4326') extent = m.extent().spatialExtents()[0] self.assertEqual(extent.extentCrs.authid(), 'EPSG:4326') self.assertEqual(extent.bounds.xMinimum(), -180.0) self.assertEqual(extent.bounds.yMinimum(), -90.0) self.assertEqual(extent.bounds.xMaximum(), 180.0) self.assertEqual(extent.bounds.yMaximum(), 90.0) self.assertEqual(m.extent().temporalExtents()[0].begin(), QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47))) self.assertTrue(m.extent().temporalExtents()[0].isInstant()) self.assertEqual(m.contacts()[0].name, 'John Smith') self.assertEqual(m.contacts()[0].organization, 'ACME') self.assertEqual(m.contacts()[0].position, 'staff') self.assertEqual(m.contacts()[0].voice, '1500 515 555') self.assertEqual(m.contacts()[0].fax, 'xx.xxx.xxx.xxxx') self.assertEqual(m.contacts()[0].email, '*****@*****.**') self.assertEqual(m.contacts()[0].role, 'pointOfContact') self.assertEqual(m.contacts()[0].addresses[0].type, 'postal') self.assertEqual(m.contacts()[0].addresses[0].address, '123 Main Street') self.assertEqual(m.contacts()[0].addresses[0].city, 'anycity') self.assertEqual(m.contacts()[0].addresses[0].administrativeArea, 'anyprovince') self.assertEqual(m.contacts()[0].addresses[0].postalCode, '90210') self.assertEqual(m.contacts()[0].addresses[0].country, 'Canada') self.assertEqual(m.links()[0].name, 'geonode:roads') self.assertEqual(m.links()[0].type, 'OGC:WMS') self.assertEqual(m.links()[0].description, 'my GeoNode road layer') self.assertEqual(m.links()[0].url, 'http://example.org/wms') self.assertEqual(m.links()[1].name, 'geonode:roads') self.assertEqual(m.links()[1].type, 'OGC:WFS') self.assertEqual(m.links()[1].description, 'my GeoNode road layer') self.assertEqual(m.links()[1].url, 'http://example.org/wfs') self.assertEqual(m.links()[2].name, 'roads') self.assertEqual(m.links()[2].type, 'WWW:LINK') self.assertEqual(m.links()[2].description, 'full dataset download') self.assertEqual(m.links()[2].url, 'http://example.org/roads.tgz') self.assertEqual(m.links()[2].format, 'ESRI Shapefile') self.assertEqual(m.links()[2].mimeType, 'application/gzip') self.assertEqual(m.links()[2].size, '283676')
def createTestMetadata(self): """ Returns a standard metadata which can be tested with checkExpectedMetadata """ m = QgsLayerMetadata() m.setIdentifier('1234') m.setParentIdentifier('xyz') m.setLanguage('en-CA') m.setType('dataset') m.setTitle('roads') m.setAbstract('my roads') m.setFees('None') m.setConstraints([QgsLayerMetadata.Constraint('None', 'access')]) m.setRights(['Copyright foo 2017']) m.setLicenses(['WTFPL']) m.setHistory(['history a', 'history b']) m.setKeywords({ 'GEMET': ['kw1', 'kw2'], 'gmd:topicCategory': ['natural'], }) m.setEncoding('utf-8') m.setCrs(QgsCoordinateReferenceSystem.fromOgcWmsCrs('EPSG:4326')) e = QgsLayerMetadata.Extent() se = QgsLayerMetadata.SpatialExtent() se.extentCrs = QgsCoordinateReferenceSystem.fromOgcWmsCrs('EPSG:4326') se.bounds = QgsBox3d(-180, -90, 0, 180, 90, 0) e.setSpatialExtents([se]) dates = [ QgsDateTimeRange(QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47)), QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47))), QgsDateTimeRange(QDateTime(QDate(2010, 12, 17), QTime(9, 30, 47)), QDateTime(QDate(2020, 12, 17), QTime(9, 30, 47))) ] e.setTemporalExtents(dates) m.setExtent(e) c = QgsLayerMetadata.Contact() c.name = 'John Smith' c.organization = 'ACME' c.position = 'staff' c.voice = '1500 515 555' c.fax = 'xx.xxx.xxx.xxxx' c.email = '*****@*****.**' c.role = 'pointOfContact' address = QgsLayerMetadata.Address() address.type = 'postal' address.address = '123 Main Street' address.city = 'anycity' address.administrativeArea = 'anyprovince' address.postalCode = '90210' address.country = 'Canada' c.addresses = [address] m.setContacts([c]) l = QgsLayerMetadata.Link() l.name = 'geonode:roads' l.type = 'OGC:WMS' l.description = 'my GeoNode road layer' l.url = 'http://example.org/wms' l2 = QgsLayerMetadata.Link() l2.name = 'geonode:roads' l2.type = 'OGC:WFS' l2.description = 'my GeoNode road layer' l2.url = 'http://example.org/wfs' l3 = QgsLayerMetadata.Link() l3.name = 'roads' l3.type = 'WWW:LINK' l3.description = 'full dataset download' l3.url = 'http://example.org/roads.tgz' l3.format = 'ESRI Shapefile' l3.mimeType = 'application/gzip' l3.size = '283676' m.setLinks([l, l2, l3]) return m
def testEquality(self): # spatial extent extent = QgsLayerMetadata.SpatialExtent() extent.extentCrs = QgsCoordinateReferenceSystem.fromEpsgId(3111) extent.bounds = QgsBox3d(5.0, 6.0, 7.0, 11.0, 13.0, 15.0) extent2 = QgsLayerMetadata.SpatialExtent() extent2.extentCrs = QgsCoordinateReferenceSystem.fromEpsgId(3111) extent2.bounds = QgsBox3d(5.0, 6.0, 7.0, 11.0, 13.0, 15.0) self.assertEqual(extent, extent2) extent2.extentCrs = QgsCoordinateReferenceSystem.fromEpsgId(3113) self.assertNotEqual(extent, extent2) extent2.extentCrs = QgsCoordinateReferenceSystem.fromEpsgId(3111) extent2.bounds = QgsBox3d(5.0, 6.0, 7.0, 11.0, 13.0, 16.0) self.assertNotEqual(extent, extent2) # extent extent = QgsLayerMetadata.Extent() extent1 = QgsLayerMetadata.SpatialExtent() extent1.extentCrs = QgsCoordinateReferenceSystem.fromEpsgId(3111) extent1.bounds = QgsBox3d(5.0, 6.0, 7.0, 11.0, 13.0, 15.0) extent2 = QgsLayerMetadata.SpatialExtent() extent2.extentCrs = QgsCoordinateReferenceSystem.fromEpsgId(3113) extent2.bounds = QgsBox3d(5.0, 6.0, 7.0, 11.0, 13.0, 16.0) extent.setSpatialExtents([extent1, extent2]) dates = [ QgsDateTimeRange(QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47)), QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47))), QgsDateTimeRange(QDateTime(QDate(2010, 12, 17), QTime(9, 30, 47)), QDateTime(QDate(2020, 12, 17), QTime(9, 30, 47))) ] extent.setTemporalExtents(dates) extent_copy = QgsLayerMetadata.Extent(extent) self.assertEqual(extent, extent_copy) extent_copy.setTemporalExtents([ QgsDateTimeRange(QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47)), QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47))), QgsDateTimeRange(QDateTime(QDate(2010, 12, 17), QTime(9, 30, 48)), QDateTime(QDate(2020, 12, 17), QTime(9, 30, 49))) ]) self.assertNotEqual(extent, extent_copy) extent_copy = QgsLayerMetadata.Extent(extent) extent3 = QgsLayerMetadata.SpatialExtent() extent3.extentCrs = QgsCoordinateReferenceSystem.fromEpsgId(3113) extent3.bounds = QgsBox3d(5.0, 6.0, 7.0, 11.0, 13.0, 19.0) extent_copy.setSpatialExtents([extent1, extent3]) self.assertNotEqual(extent, extent_copy) constraint = QgsLayerMetadata.Constraint('c', 'type1') self.assertEqual(constraint, QgsLayerMetadata.Constraint('c', 'type1')) self.assertNotEqual(constraint, QgsLayerMetadata.Constraint('c2', 'type1')) self.assertNotEqual(constraint, QgsLayerMetadata.Constraint('c', 'type2')) a = QgsLayerMetadata.Address() a.type = 'postal' a.address = '13 north rd' a.city = 'huxleys haven' a.administrativeArea = 'land of the queens' a.postalCode = '4123' a.country = 'straya!' a2 = QgsLayerMetadata.Address(a) self.assertEqual(a, a2) a2.type = 'postal2' self.assertNotEqual(a, a2) a2 = QgsLayerMetadata.Address(a) a2.address = 'address2' self.assertNotEqual(a, a2) a2 = QgsLayerMetadata.Address(a) a2.city = 'city' self.assertNotEqual(a, a2) a2 = QgsLayerMetadata.Address(a) a2.administrativeArea = 'area2' self.assertNotEqual(a, a2) a2 = QgsLayerMetadata.Address(a) a2.postalCode = 'postal2' self.assertNotEqual(a, a2) a2 = QgsLayerMetadata.Address(a) a2.country = 'country2' self.assertNotEqual(a, a2) c = QgsLayerMetadata.Contact() c.name = 'name' c.organization = 'org' c.position = 'pos' c.voice = '1500 515 555' c.fax = 'fax' c.email = 'email' c.role = 'role' a = QgsLayerMetadata.Address() a.type = 'postal' a2 = QgsLayerMetadata.Address() a2.type = 'street' c.addresses = [a, a2] c2 = QgsLayerMetadata.Contact(c) self.assertEqual(c, c2) c2.name = 'name2' self.assertNotEqual(c, c2) c2 = QgsLayerMetadata.Contact(c) c2.organization = 'org2' self.assertNotEqual(c, c2) c2 = QgsLayerMetadata.Contact(c) c2.position = 'pos2' self.assertNotEqual(c, c2) c2 = QgsLayerMetadata.Contact(c) c2.voice = 'voice2' self.assertNotEqual(c, c2) c2 = QgsLayerMetadata.Contact(c) c2.fax = 'fax2' self.assertNotEqual(c, c2) c2 = QgsLayerMetadata.Contact(c) c2.email = 'email2' self.assertNotEqual(c, c2) c2 = QgsLayerMetadata.Contact(c) c2.role = 'role2' self.assertNotEqual(c, c2) c2 = QgsLayerMetadata.Contact(c) c2.addresses = [a2] self.assertNotEqual(c, c2) # link l = QgsLayerMetadata.Link() l.name = 'name' l.type = 'type' l.description = 'desc' l.url = 'url' l.format = 'format' l.mimeType = 'mime' l.size = '112' l2 = QgsLayerMetadata.Link(l) self.assertEqual(l, l2) l2 = QgsLayerMetadata.Link(l) l2.name = 'name2' self.assertNotEqual(l, l2) l2 = QgsLayerMetadata.Link(l) l2.type = 'type2' self.assertNotEqual(l, l2) l2 = QgsLayerMetadata.Link(l) l2.description = 'desc2' self.assertNotEqual(l, l2) l2 = QgsLayerMetadata.Link(l) l2.url = 'url2' self.assertNotEqual(l, l2) l2 = QgsLayerMetadata.Link(l) l2.format = 'format2' self.assertNotEqual(l, l2) l2 = QgsLayerMetadata.Link(l) l2.mimeType = 'mime2' self.assertNotEqual(l, l2) l2 = QgsLayerMetadata.Link(l) l2.size = '113' self.assertNotEqual(l, l2)
def test_temporal_animation(self): """ Test temporal animation logic """ canvas = QgsMapCanvas() self.assertEqual(canvas.mapSettings().frameRate(), -1) self.assertEqual(canvas.mapSettings().currentFrame(), -1) controller = QgsTemporalController() canvas.setTemporalController(controller) controller.updateTemporalRange.emit( QgsDateTimeRange(QDateTime(QDate(2020, 1, 2), QTime(1, 2, 3)), QDateTime(QDate(2020, 1, 4), QTime(1, 2, 3)))) # should be no change self.assertEqual(canvas.mapSettings().frameRate(), -1) self.assertEqual(canvas.mapSettings().currentFrame(), -1) temporal_no = QgsTemporalNavigationObject() temporal_no.setTemporalExtents( QgsDateTimeRange(QDateTime(QDate(2020, 1, 2), QTime(1, 2, 3)), QDateTime(QDate(2020, 1, 4), QTime(1, 2, 3)))) temporal_no.setFrameDuration(QgsInterval(0, 0, 0, 0, 1, 0, 0)) canvas.setTemporalController(temporal_no) controller.updateTemporalRange.emit( QgsDateTimeRange(QDateTime(QDate(2020, 1, 2), QTime(1, 2, 3)), QDateTime(QDate(2020, 1, 4), QTime(1, 2, 3)))) # should be no change self.assertEqual(canvas.mapSettings().frameRate(), -1) self.assertEqual(canvas.mapSettings().currentFrame(), -1) temporal_no.setFramesPerSecond(30) temporal_no.pause() temporal_no.setCurrentFrameNumber(6) canvas.refresh() # should be no change - temporal controller is not in animation mode self.assertEqual(canvas.mapSettings().frameRate(), -1) self.assertEqual(canvas.mapSettings().currentFrame(), -1) temporal_no.setNavigationMode(QgsTemporalNavigationObject.Animated) self.assertEqual(canvas.mapSettings().frameRate(), 30) self.assertEqual(canvas.mapSettings().currentFrame(), 6) temporal_no.setCurrentFrameNumber(7) self.assertEqual(canvas.mapSettings().frameRate(), 30) self.assertEqual(canvas.mapSettings().currentFrame(), 6) # switch off animation mode temporal_no.setNavigationMode(QgsTemporalNavigationObject.FixedRange) self.assertEqual(canvas.mapSettings().frameRate(), -1) self.assertEqual(canvas.mapSettings().currentFrame(), -1) temporal_no.setNavigationMode(QgsTemporalNavigationObject.Animated) self.assertEqual(canvas.mapSettings().frameRate(), 30) self.assertEqual(canvas.mapSettings().currentFrame(), 7) temporal_no.setNavigationMode( QgsTemporalNavigationObject.NavigationOff) self.assertEqual(canvas.mapSettings().frameRate(), -1) self.assertEqual(canvas.mapSettings().currentFrame(), -1)
def testSingleFieldMode(self): layer = QgsVectorLayer( "Point?field=fldtxt:string&field=fldint:integer&field=start_field:datetime", "test", "memory") self.assertTrue(layer.isValid()) self.assertEqual(layer.fields()[2].type(), QVariant.DateTime) context = QgsVectorLayerTemporalContext() context.setLayer(layer) range = QgsDateTimeRange( QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) props = QgsVectorLayerTemporalProperties(enabled=False) props.setMode(QgsVectorLayerTemporalProperties. ModeFeatureDateTimeInstantFromField) props.setStartField('start_field') self.assertFalse(props.createFilterString(context, range)) props.setIsActive(True) self.assertEqual( props.createFilterString(context, range), '("start_field" >= make_datetime(2019,3,4,11,12,13) AND "start_field" <= make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) self.assertEqual( props.createFilterString(context, range), '("start_field" > make_datetime(2019,3,4,11,12,13) AND "start_field" <= make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) self.assertEqual( props.createFilterString(context, range), '("start_field" >= make_datetime(2019,3,4,11,12,13) AND "start_field" < make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL' ) # with fixed duration props.setFixedDuration(3) props.setDurationUnits(QgsUnitTypes.TemporalDays) range = QgsDateTimeRange( QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) self.assertEqual( props.createFilterString(context, range), '("start_field" > make_datetime(2019,3,1,11,12,13) AND "start_field" < make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) self.assertEqual( props.createFilterString(context, range), '("start_field" > make_datetime(2019,3,1,11,12,13) AND "start_field" < make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) self.assertEqual( props.createFilterString(context, range), '("start_field" > make_datetime(2019,3,1,11,12,13) AND "start_field" < make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL' ) props.setDurationUnits(QgsUnitTypes.TemporalMinutes) range = QgsDateTimeRange( QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) self.assertEqual( props.createFilterString(context, range), '("start_field" > make_datetime(2019,3,4,11,9,13) AND "start_field" < make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL' ) # accumulate mode props.setAccumulateFeatures(True) range = QgsDateTimeRange( QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) self.assertEqual( props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) self.assertEqual( props.createFilterString(context, range), '("start_field" <= make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) self.assertEqual( props.createFilterString(context, range), '("start_field" < make_datetime(2020,5,6,8,9,10)) OR "start_field" IS NULL' )
def testCombine(self): m1 = QgsLayerMetadata() m2 = QgsLayerMetadata() # should be retained m1.setIdentifier('i1') m1.combine(m2) self.assertEqual(m1.identifier(), 'i1') # should be overwritten m1.setIdentifier(None) m2.setIdentifier('i2') m1.combine(m2) self.assertEqual(m1.identifier(), 'i2') # should be overwritten m1.setIdentifier('i1') m2.setIdentifier('i2') m1.combine(m2) self.assertEqual(m1.identifier(), 'i2') m1.setParentIdentifier('pi1') m2.setParentIdentifier(None) m1.combine(m2) self.assertEqual(m1.parentIdentifier(), 'pi1') m1.setParentIdentifier(None) m2.setParentIdentifier('pi2') m1.combine(m2) self.assertEqual(m1.parentIdentifier(), 'pi2') m1.setLanguage('l1') m2.setLanguage(None) m1.combine(m2) self.assertEqual(m1.language(), 'l1') m1.setLanguage(None) m2.setLanguage('l2') m1.combine(m2) self.assertEqual(m1.language(), 'l2') m1.setType('ty1') m2.setType(None) m1.combine(m2) self.assertEqual(m1.type(), 'ty1') m1.setType(None) m2.setType('ty2') m1.combine(m2) self.assertEqual(m1.type(), 'ty2') m1.setTitle('t1') m2.setTitle(None) m1.combine(m2) self.assertEqual(m1.title(), 't1') m1.setTitle(None) m2.setTitle('t2') m1.combine(m2) self.assertEqual(m1.title(), 't2') m1.setAbstract('a1') m2.setAbstract(None) m1.combine(m2) self.assertEqual(m1.abstract(), 'a1') m1.setAbstract(None) m2.setAbstract('a2') m1.combine(m2) self.assertEqual(m1.abstract(), 'a2') m1.setHistory(['h1', 'hh1']) m2.setHistory([]) m1.combine(m2) self.assertEqual(m1.history(), ['h1', 'hh1']) m1.setHistory([]) m2.setHistory(['h2', 'hh2']) m1.combine(m2) self.assertEqual(m1.history(), ['h2', 'hh2']) m1.setKeywords({'words': ['k1', 'kk1']}) m2.setKeywords({}) m1.combine(m2) self.assertEqual(m1.keywords(), {'words': ['k1', 'kk1']}) m1.setKeywords({}) m2.setKeywords({'words': ['k2', 'kk2']}) m1.combine(m2) self.assertEqual(m1.keywords(), {'words': ['k2', 'kk2']}) m1.setContacts( [QgsLayerMetadata.Contact('c1'), QgsLayerMetadata.Contact('cc1')]) m2.setContacts([]) m1.combine(m2) self.assertEqual( m1.contacts(), [QgsLayerMetadata.Contact('c1'), QgsLayerMetadata.Contact('cc1')]) m1.setContacts([]) m2.setContacts( [QgsLayerMetadata.Contact('c2'), QgsLayerMetadata.Contact('cc2')]) m1.combine(m2) self.assertEqual( m1.contacts(), [QgsLayerMetadata.Contact('c2'), QgsLayerMetadata.Contact('cc2')]) m1.setLinks( [QgsLayerMetadata.Link('l1'), QgsLayerMetadata.Link('ll1')]) m2.setLinks([]) m1.combine(m2) self.assertEqual( m1.links(), [QgsLayerMetadata.Link('l1'), QgsLayerMetadata.Link('ll1')]) m1.setLinks([]) m2.setLinks( [QgsLayerMetadata.Link('l2'), QgsLayerMetadata.Link('ll2')]) m1.combine(m2) self.assertEqual( m1.links(), [QgsLayerMetadata.Link('l2'), QgsLayerMetadata.Link('ll2')]) m1.setFees('f1') m2.setFees(None) m1.combine(m2) self.assertEqual(m1.fees(), 'f1') m1.setFees(None) m2.setFees('f2') m1.combine(m2) self.assertEqual(m1.fees(), 'f2') m1.setConstraints([ QgsLayerMetadata.Constraint('c1'), QgsLayerMetadata.Constraint('cc1') ]) m2.setConstraints([]) m1.combine(m2) self.assertEqual(m1.constraints(), [ QgsLayerMetadata.Constraint('c1'), QgsLayerMetadata.Constraint('cc1') ]) m1.setConstraints([]) m2.setConstraints([ QgsLayerMetadata.Constraint('c2'), QgsLayerMetadata.Constraint('cc2') ]) m1.combine(m2) self.assertEqual(m1.constraints(), [ QgsLayerMetadata.Constraint('c2'), QgsLayerMetadata.Constraint('cc2') ]) m1.setRights(['r1', 'rr1']) m2.setRights([]) m1.combine(m2) self.assertEqual(m1.rights(), ['r1', 'rr1']) m1.setRights([]) m2.setRights(['r2', 'rr2']) m1.combine(m2) self.assertEqual(m1.rights(), ['r2', 'rr2']) m1.setLicenses(['li1', 'lli1']) m2.setLicenses([]) m1.combine(m2) self.assertEqual(m1.licenses(), ['li1', 'lli1']) m1.setLicenses([]) m2.setLicenses(['li2', 'lli2']) m1.combine(m2) self.assertEqual(m1.licenses(), ['li2', 'lli2']) m1.setEncoding('e1') m2.setEncoding(None) m1.combine(m2) self.assertEqual(m1.encoding(), 'e1') m1.setEncoding(None) m2.setEncoding('e2') m1.combine(m2) self.assertEqual(m1.encoding(), 'e2') m1.setCrs(QgsCoordinateReferenceSystem('EPSG:3111')) m2.setCrs(QgsCoordinateReferenceSystem()) m1.combine(m2) self.assertEqual(m1.crs().authid(), 'EPSG:3111') m1.setCrs(QgsCoordinateReferenceSystem()) m2.setCrs(QgsCoordinateReferenceSystem('EPSG:3113')) m1.combine(m2) self.assertEqual(m1.crs().authid(), 'EPSG:3113') s = QgsLayerMetadata.SpatialExtent() s.bounds = QgsBox3d(1, 2, 3, 4, 5, 6) m1.extent().setSpatialExtents([s]) m2.extent().setSpatialExtents([]) m1.combine(m2) self.assertEqual(m1.extent().spatialExtents()[0].bounds, QgsBox3d(1, 2, 3, 4, 5, 6)) s.bounds = QgsBox3d(11, 12, 13, 14, 15, 16) m1.extent().setSpatialExtents([]) m2.extent().setSpatialExtents([s]) m1.combine(m2) self.assertEqual(m1.extent().spatialExtents()[0].bounds, QgsBox3d(11, 12, 13, 14, 15, 16)) s = QgsDateTimeRange(QDateTime(2020, 1, 1, 0, 0, 0), QDateTime(2020, 2, 1, 0, 0, 0)) m1.extent().setTemporalExtents([s]) m2.extent().setTemporalExtents([]) m1.combine(m2) self.assertEqual(m1.extent().temporalExtents()[0], s) s = QgsDateTimeRange(QDateTime(2021, 1, 1, 0, 0, 0), QDateTime(2021, 2, 1, 0, 0, 0)) m1.extent().setTemporalExtents([]) m2.extent().setTemporalExtents([s]) m1.combine(m2) self.assertEqual(m1.extent().temporalExtents()[0], s)
def testStartAndDurationMode(self): layer = QgsVectorLayer( "Point?field=fldtxt:string&field=fldint:integer&field=start_field:datetime&field=duration:double", "test", "memory") self.assertTrue(layer.isValid()) self.assertEqual(layer.fields()[2].type(), QVariant.DateTime) self.assertEqual(layer.fields()[3].type(), QVariant.Double) range = QgsDateTimeRange( QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) props = QgsVectorLayerTemporalProperties(enabled=False) props.setMode(QgsVectorLayerTemporalProperties. ModeFeatureDateTimeStartAndDurationFromFields) props.setStartField('start_field') props.setDurationField('duration') props.setDurationUnits(QgsUnitTypes.TemporalMilliseconds) self.assertFalse(props.createFilterString(layer, range)) props.setIsActive(True) self.assertEqual( props.createFilterString(layer, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(0,0,0,0,0,0,"duration"/1000) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)' ) props.setDurationUnits(QgsUnitTypes.TemporalSeconds) self.assertEqual( props.createFilterString(layer, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(0,0,0,0,0,0,"duration") >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)' ) props.setDurationUnits(QgsUnitTypes.TemporalMinutes) self.assertEqual( props.createFilterString(layer, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(0,0,0,0,0,"duration",0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)' ) props.setDurationUnits(QgsUnitTypes.TemporalHours) self.assertEqual( props.createFilterString(layer, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(0,0,0,0,"duration",0,0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)' ) props.setDurationUnits(QgsUnitTypes.TemporalDays) self.assertEqual( props.createFilterString(layer, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(0,0,0,"duration",0,0,0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)' ) props.setDurationUnits(QgsUnitTypes.TemporalWeeks) self.assertEqual( props.createFilterString(layer, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(0,0,"duration",0,0,0,0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)' ) props.setDurationUnits(QgsUnitTypes.TemporalMonths) self.assertEqual( props.createFilterString(layer, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(0,"duration",0,0,0,0,0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)' ) props.setDurationUnits(QgsUnitTypes.TemporalYears) self.assertEqual( props.createFilterString(layer, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval("duration",0,0,0,0,0,0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)' ) props.setDurationUnits(QgsUnitTypes.TemporalDecades) self.assertEqual( props.createFilterString(layer, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(10 * "duration",0,0,0,0,0,0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)' ) props.setDurationUnits(QgsUnitTypes.TemporalCenturies) self.assertEqual( props.createFilterString(layer, range), '("start_field" <= make_datetime(2020,5,6,8,9,10) OR "start_field" IS NULL) AND (("start_field" + make_interval(100 * "duration",0,0,0,0,0,0) >= make_datetime(2019,3,4,11,12,13)) OR "duration" IS NULL)' )
def testExpressionMode(self): layer = QgsVectorLayer( "Point?field=fldtxt:string&field=fldint:integer&field=start_field:datetime&field=end_field:datetime", "test", "memory") self.assertTrue(layer.isValid()) self.assertEqual(layer.fields()[2].type(), QVariant.DateTime) self.assertEqual(layer.fields()[3].type(), QVariant.DateTime) range = QgsDateTimeRange( QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10))) props = QgsVectorLayerTemporalProperties(enabled=False) props.setMode(QgsVectorLayerTemporalProperties. ModeFeatureDateTimeStartAndEndFromExpressions) props.setStartExpression( 'to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')"') props.setEndExpression( 'to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')"') self.assertFalse(props.createFilterString(layer, range)) props.setIsActive(True) self.assertEqual( props.createFilterString(layer, range), '((to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") <= make_datetime(2020,5,6,8,9,10)) AND ((to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") >= make_datetime(2019,3,4,11,12,13))' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) self.assertEqual( props.createFilterString(layer, range), '((to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") <= make_datetime(2020,5,6,8,9,10)) AND ((to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") > make_datetime(2019,3,4,11,12,13))' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) self.assertEqual( props.createFilterString(layer, range), '((to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") < make_datetime(2020,5,6,8,9,10)) AND ((to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") >= make_datetime(2019,3,4,11,12,13))' ) props.setEndExpression('') self.assertEqual( props.createFilterString(layer, range), '(to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") <= make_datetime(2020,5,6,8,9,10)' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) self.assertEqual( props.createFilterString(layer, range), '(to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") < make_datetime(2020,5,6,8,9,10)' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) self.assertEqual( props.createFilterString(layer, range), '(to_datetime("my string field", \'yyyy MM dd hh::mm:ss\')") <= make_datetime(2020,5,6,8,9,10)' ) props.setStartExpression('') props.setEndExpression( 'to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')"') self.assertEqual( props.createFilterString(layer, range), '(to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") >= make_datetime(2019,3,4,11,12,13)' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False) self.assertEqual( props.createFilterString(layer, range), '(to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") > make_datetime(2019,3,4,11,12,13)' ) range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False) self.assertEqual( props.createFilterString(layer, range), '(to_datetime("my end field", \'yyyy MM dd hh::mm:ss\')") >= make_datetime(2019,3,4,11,12,13)' )