|
42 | 42 | QgsWkbTypes,
|
43 | 43 | QgsNetworkAccessManager,
|
44 | 44 | QgsLayerMetadata,
|
45 |
| - QgsNotSupportedException |
| 45 | + QgsNotSupportedException, |
| 46 | + QgsMapLayerType, |
| 47 | + QgsProviderSublayerDetails, |
| 48 | + Qgis |
46 | 49 | )
|
47 | 50 | from qgis.testing import start_app, unittest
|
48 | 51 | from qgis.utils import spatialite_connect
|
@@ -1501,6 +1504,135 @@ def testFieldDomains(self):
|
1501 | 1504 | self.assertTrue(enum_setup.config()['map'], [{'one': '1'}, {'2': '2'}])
|
1502 | 1505 | self.assertEqual(vl.editorWidgetSetup(fields.lookupField('with_enum_domain')).type(), 'ValueMap')
|
1503 | 1506 |
|
| 1507 | + def test_provider_sublayer_details(self): |
| 1508 | + """ |
| 1509 | + Test retrieving sublayer details from data provider metadata |
| 1510 | + """ |
| 1511 | + metadata = QgsProviderRegistry.instance().providerMetadata('ogr') |
| 1512 | + |
| 1513 | + # invalid uri |
| 1514 | + res = metadata.querySublayers('') |
| 1515 | + self.assertFalse(res) |
| 1516 | + |
| 1517 | + # not a vector |
| 1518 | + res = metadata.querySublayers(os.path.join(TEST_DATA_DIR, 'landsat.tif')) |
| 1519 | + self.assertFalse(res) |
| 1520 | + |
| 1521 | + # single layer vector |
| 1522 | + res = metadata.querySublayers(os.path.join(TEST_DATA_DIR, 'lines.shp')) |
| 1523 | + self.assertEqual(len(res), 1) |
| 1524 | + self.assertEqual(res[0].layerNumber(), 0) |
| 1525 | + self.assertEqual(res[0].name(), "lines") |
| 1526 | + self.assertEqual(res[0].description(), '') |
| 1527 | + self.assertEqual(res[0].uri(), TEST_DATA_DIR + "/lines.shp") |
| 1528 | + self.assertEqual(res[0].providerKey(), "ogr") |
| 1529 | + self.assertEqual(res[0].type(), QgsMapLayerType.VectorLayer) |
| 1530 | + |
| 1531 | + # make sure result is valid to load layer from |
| 1532 | + options = QgsProviderSublayerDetails.LayerOptions(QgsCoordinateTransformContext()) |
| 1533 | + vl = res[0].toLayer(options) |
| 1534 | + self.assertTrue(vl.isValid()) |
| 1535 | + |
| 1536 | + # geopackage with two vector layers |
| 1537 | + res = metadata.querySublayers(os.path.join(TEST_DATA_DIR, "mixed_layers.gpkg")) |
| 1538 | + self.assertEqual(len(res), 2) |
| 1539 | + self.assertEqual(res[0].layerNumber(), 0) |
| 1540 | + self.assertEqual(res[0].name(), "points") |
| 1541 | + self.assertEqual(res[0].description(), "") |
| 1542 | + self.assertEqual(res[0].uri(), "{}/mixed_layers.gpkg|layername=points".format(TEST_DATA_DIR)) |
| 1543 | + self.assertEqual(res[0].providerKey(), "ogr") |
| 1544 | + self.assertEqual(res[0].type(), QgsMapLayerType.VectorLayer) |
| 1545 | + self.assertEqual(res[0].featureCount(), Qgis.FeatureCountState.Uncounted) |
| 1546 | + self.assertEqual(res[0].wkbType(), QgsWkbTypes.Point) |
| 1547 | + vl = res[0].toLayer(options) |
| 1548 | + self.assertTrue(vl.isValid()) |
| 1549 | + self.assertEqual(vl.wkbType(), QgsWkbTypes.Point) |
| 1550 | + |
| 1551 | + self.assertEqual(res[1].layerNumber(), 1) |
| 1552 | + self.assertEqual(res[1].name(), "lines") |
| 1553 | + self.assertEqual(res[1].description(), "") |
| 1554 | + self.assertEqual(res[1].uri(), "{}/mixed_layers.gpkg|layername=lines".format(TEST_DATA_DIR)) |
| 1555 | + self.assertEqual(res[1].providerKey(), "ogr") |
| 1556 | + self.assertEqual(res[1].type(), QgsMapLayerType.VectorLayer) |
| 1557 | + self.assertEqual(res[1].featureCount(), Qgis.FeatureCountState.Uncounted) |
| 1558 | + self.assertEqual(res[1].wkbType(), QgsWkbTypes.MultiLineString) |
| 1559 | + vl = res[1].toLayer(options) |
| 1560 | + self.assertTrue(vl.isValid()) |
| 1561 | + self.assertEqual(vl.wkbType(), QgsWkbTypes.MultiLineString) |
| 1562 | + |
| 1563 | + # request feature count |
| 1564 | + res = metadata.querySublayers(os.path.join(TEST_DATA_DIR, "mixed_layers.gpkg"), Qgis.SublayerQueryFlag.CountFeatures) |
| 1565 | + self.assertEqual(len(res), 2) |
| 1566 | + self.assertEqual(res[0].name(), "points") |
| 1567 | + self.assertEqual(res[0].featureCount(), 0) |
| 1568 | + self.assertEqual(res[1].name(), "lines") |
| 1569 | + self.assertEqual(res[1].featureCount(), 6) |
| 1570 | + |
| 1571 | + # layer with mixed geometry types - without resolving geometry types |
| 1572 | + res = metadata.querySublayers(os.path.join(TEST_DATA_DIR, "mixed_types.TAB")) |
| 1573 | + self.assertEqual(len(res), 1) |
| 1574 | + self.assertEqual(res[0].layerNumber(), 0) |
| 1575 | + self.assertEqual(res[0].name(), "mixed_types") |
| 1576 | + self.assertEqual(res[0].description(), "") |
| 1577 | + self.assertEqual(res[0].uri(), "{}/mixed_types.TAB".format(TEST_DATA_DIR)) |
| 1578 | + self.assertEqual(res[0].providerKey(), "ogr") |
| 1579 | + self.assertEqual(res[0].type(), QgsMapLayerType.VectorLayer) |
| 1580 | + self.assertEqual(res[0].featureCount(), Qgis.FeatureCountState.Uncounted) |
| 1581 | + self.assertEqual(res[0].wkbType(), QgsWkbTypes.Unknown) |
| 1582 | + vl = res[0].toLayer(options) |
| 1583 | + self.assertTrue(vl.isValid()) |
| 1584 | + |
| 1585 | + # layer with mixed geometry types - without resolving geometry types, but with feature count |
| 1586 | + res = metadata.querySublayers(os.path.join(TEST_DATA_DIR, "mixed_types.TAB"), Qgis.SublayerQueryFlag.CountFeatures) |
| 1587 | + self.assertEqual(len(res), 1) |
| 1588 | + self.assertEqual(res[0].layerNumber(), 0) |
| 1589 | + self.assertEqual(res[0].name(), "mixed_types") |
| 1590 | + self.assertEqual(res[0].description(), "") |
| 1591 | + self.assertEqual(res[0].uri(), "{}/mixed_types.TAB".format(TEST_DATA_DIR)) |
| 1592 | + self.assertEqual(res[0].providerKey(), "ogr") |
| 1593 | + self.assertEqual(res[0].type(), QgsMapLayerType.VectorLayer) |
| 1594 | + self.assertEqual(res[0].featureCount(), 13) |
| 1595 | + self.assertEqual(res[0].wkbType(), QgsWkbTypes.Unknown) |
| 1596 | + |
| 1597 | + # layer with mixed geometry types - resolve geometry type (for OGR provider this implies also that we count features!) |
| 1598 | + res = metadata.querySublayers(os.path.join(TEST_DATA_DIR, "mixed_types.TAB"), Qgis.SublayerQueryFlag.ResolveGeometryType) |
| 1599 | + self.assertEqual(len(res), 3) |
| 1600 | + self.assertEqual(res[0].layerNumber(), 0) |
| 1601 | + self.assertEqual(res[0].name(), "mixed_types") |
| 1602 | + self.assertEqual(res[0].description(), "") |
| 1603 | + self.assertEqual(res[0].uri(), "{}/mixed_types.TAB|geometrytype=Point".format(TEST_DATA_DIR)) |
| 1604 | + self.assertEqual(res[0].providerKey(), "ogr") |
| 1605 | + self.assertEqual(res[0].type(), QgsMapLayerType.VectorLayer) |
| 1606 | + self.assertEqual(res[0].featureCount(), 4) |
| 1607 | + self.assertEqual(res[0].wkbType(), QgsWkbTypes.Point) |
| 1608 | + vl = res[0].toLayer(options) |
| 1609 | + self.assertTrue(vl.isValid()) |
| 1610 | + self.assertEqual(vl.wkbType(), QgsWkbTypes.Point) |
| 1611 | + |
| 1612 | + self.assertEqual(res[1].layerNumber(), 0) |
| 1613 | + self.assertEqual(res[1].name(), "mixed_types") |
| 1614 | + self.assertEqual(res[1].description(), "") |
| 1615 | + self.assertEqual(res[1].uri(), "{}/mixed_types.TAB|geometrytype=LineString".format(TEST_DATA_DIR)) |
| 1616 | + self.assertEqual(res[1].providerKey(), "ogr") |
| 1617 | + self.assertEqual(res[1].type(), QgsMapLayerType.VectorLayer) |
| 1618 | + self.assertEqual(res[1].featureCount(), 4) |
| 1619 | + self.assertEqual(res[1].wkbType(), QgsWkbTypes.LineString) |
| 1620 | + vl = res[1].toLayer(options) |
| 1621 | + self.assertTrue(vl.isValid()) |
| 1622 | + self.assertEqual(vl.wkbType(), QgsWkbTypes.LineString) |
| 1623 | + |
| 1624 | + self.assertEqual(res[2].layerNumber(), 0) |
| 1625 | + self.assertEqual(res[2].name(), "mixed_types") |
| 1626 | + self.assertEqual(res[2].description(), "") |
| 1627 | + self.assertEqual(res[2].uri(), "{}/mixed_types.TAB|geometrytype=Polygon".format(TEST_DATA_DIR)) |
| 1628 | + self.assertEqual(res[2].providerKey(), "ogr") |
| 1629 | + self.assertEqual(res[2].type(), QgsMapLayerType.VectorLayer) |
| 1630 | + self.assertEqual(res[2].featureCount(), 3) |
| 1631 | + self.assertEqual(res[2].wkbType(), QgsWkbTypes.Polygon) |
| 1632 | + vl = res[2].toLayer(options) |
| 1633 | + self.assertTrue(vl.isValid()) |
| 1634 | + self.assertEqual(vl.wkbType(), QgsWkbTypes.Polygon) |
| 1635 | + |
1504 | 1636 |
|
1505 | 1637 | if __name__ == '__main__':
|
1506 | 1638 | unittest.main()
|
0 commit comments