diff --git a/owslib/iso.py b/owslib/iso.py index c4a916676..d3522d418 100644 --- a/owslib/iso.py +++ b/owslib/iso.py @@ -962,7 +962,7 @@ def __init__(self, fcd=None): self.featurecatalogues = [] for i in fcd.findall(util.nspath_eval('gmd:featureCatalogueCitation', namespaces)): - val = i.attrib['uuidref'] + val = i.attrib.get('uuidref') val = util.testXMLValue(val, attrib=True) if val is not None: self.featurecatalogues.append(val) diff --git a/tests/resources/csw_geobretagne_mdmetadata.xml b/tests/resources/csw_geobretagne_mdmetadata.xml new file mode 100644 index 000000000..bb17eeb90 --- /dev/null +++ b/tests/resources/csw_geobretagne_mdmetadata.xml @@ -0,0 +1,760 @@ + + + + 955c3e47-411e-4969-b61b-3556d1b9f879 + + + fre + + + + + + + + + + + + Jeu de données + + + + + DIRECTION GENERALE DES FINANCES PUBLIQUES BUREAU GF-3A + + + + + + + bureau.gf3a@dgfip.finances.gouv.fr + + + + + + + + + + + + 2018-07-30T14:19:40 + + + ISO 19115 + + + 1.0 + + + + + + + + + + + + + + RGF93 / CC48 (EPSG:3948) + + + EPSG + + + 7.4 + + + + + + + + + + + RGF93 / CC50 (EPSG:3950) + + + EPSG + + + 7.4 + + + + + + + + + + + RGF93 / Lambert-93 (EPSG:2154) + + + EPSG + + + 7.4 + + + + + + + + + + + Cadastre 2018 en Bretagne + + + + + 2018-09-01 + + + + + + + + + + https://geobretagne.fr/geonetwork/apps/georchestra/?uuid=363e3a8e-d0ce-497d-87a9-2a2d58d82772 + + + + + + + Le plan du cadastre est un document administratif qui propose l’unique plan parcellaire à grande échelle couvrant le territoire national. +Le plan du cadastre d’une commune est découpé en sections, elles-mêmes pouvant être découpées en subdivisions de sections, communément appelées « feuilles de plan ». +- La section cadastrale est une portion du territoire communal dont le périmètre est généralement constitué par des limites présentant un caractère relativement stable sur le terrain (route, chemins, cours d’eau…). +- La parcelle est l’unité cadastrale de base. C’est un terrain d’un seul tenant situé dans un même lieudit et appartenant à un même propriétaire. +- Le plan du cadastre au format vecteur est issu majoritairement de numérisation du plan cadastral papier ou raster réalisée dans le cadre de conventions avec les collectivités territoriales. Dans une moindre mesure, il a été confectionné directement au format numérique dans le cadre de la production de plans cadastraux neufs (procédure du remaniement prévue par la loi n° 78-645 du 18 juillet 1974) ou d’aménagements fonciers agricoles et forestiers (communément désignés sous le terme « remembrements »). +Les plans cadastraux au format vecteur en France métropolitaine sont actuellement géoréférencés dans le système légal (RGF93) à l’aide des projections « coniques conformes 9 zones ». Le géoréférencement des plans vecteur a pu être obtenu : +- lors de leur confection (cas des plans cadastraux très récents) ; +- après transformation de leurs coordonnées exprimées dans la projection Lambert zones ; +- lors de leur vectorisation (cas des plans non initialement géoréférencés) + + + Le but premier du plan cadastral est d'identifier, de localiser et représenter la propriété foncière, ainsi que de servir à l'assise de la fiscalité locale des propriétés non bâties. Par suite, l’article 110 de la loi n° 2009-526 du 12 mai 2009, abrogé et recodifié par l'Ordonnance n° 2010-1232 du 21 octobre 2010 à l'article L127-10 -I du Code de l'environnement dispose qu'en matière de découpage parcellaire et de représentation du bâti, le plan cadastral est la donnée de référence. + + + + + + + + DIRECTION GENERALE DES FINANCES PUBLIQUES + + + DGFIP Bretagne + + + + + + + bureau.gf3a@dgfip.finances.gouv.fr + + + + + Logo + + + + + + + + + + + + + + + + + DIRECTION GENERALE DES FINANCES PUBLIQUES / bureau GF-3A + + + DGFIP Bretagne + + + + + + + + + + + + + + + France + + + + + + + + + + + bâtiments + + + adresses + + + parcelles cadastrales + + + hydrographie + + + réseaux de transport + + + unités administratives + + + référentiels de coordonnées + + + + + + + + + + bâtis + + + sections + + + parcelles + + + cadastre + + + cadastrale + + + + + + + + + + référentiels : cadastre + + + + + + + + GéoBretagne v 2.0 + + + + + 2014-01-13 + + + + + + + + + + geonetwork.thesaurus.external.theme.geobretagne + + + + + + + + + + + Parcelles cadastrales + + + + + + + + INSPIRE themes + + + + + 2008-06-01 + + + + + + + + + + geonetwork.thesaurus.external.theme.inspire-theme + + + + + + + + + + + cadastre + + + bâtiment + + + + + + + + GEMET + + + + + 2012-07-20 + + + + + + + + + + geonetwork.thesaurus.external.theme.gemet + + + + + + + + + + + le plan cadastral décrit les limites apparentes de la propriété. + + + « En dépit des efforts et diligences mis en oeuvre pour en vérifier la fiabilité, le partenaire fournisseur n’est pas en mesure de garantir l’exactitude, la mise à jour, l’intégrité, l’exhaustivité des données et en particulier que les données sont exemptes d'erreurs, notamment de localisation, d’identification ou d’actualisation ou d’imprécisions. Les données ne sont pas fournies en vue d'une utilisation particulière et aucune garantie quant à leur aptitude à un usage particulier n'est apportée par le partenaire fournisseur. En conséquence, les utilisateurs utilisent les données sous leur responsabilité pleine et entière, à leurs risques et périls, sans recours possible contre le partenaire fournisseur dont la responsabilité ne saurait être engagée du fait d’un dommage résultant directement ou indirectement de l’utilisation de ces données. En particulier, il appartient aux utilisateurs d’apprécier, sous leur seule responsabilité : o l'opportunité d'utiliser les données ; o la compatibilité des fichiers avec leurs systèmes informatiques ; o l’adéquation des données à leurs besoins ; o qu’ils disposent de la compétence suffisante pour utiliser les données ; o l’opportunité d’utiliser la documentation ou les outils d’analyse fournis ou préconisés, en relation avec l’utilisation des données, le cas échéant. Le fournisseur partenaire n’est en aucune façon responsable des éléments extérieurs aux données et notamment des outils d’analyse, matériels, logiciels, réseaux..., utilisés pour consulter et/ou traiter les données, même s’il a préconisé ces éléments. L’utilisateur veille à vérifier que l’actualité des informations mises à disposition est compatible avec l’usage qu’il en fait. » + + + + + + + + + Usage libre sous réserve des mentions obligatoires sur tout document de diffusion : "Source : DGFIP" + + + + + + + + + + + + 500 + + + + + + + fre + + + + + + planningCadastre + + + + + Bretagne + + + + + -5.23515625 + + + -1.1921875 + + + 46.755859375 + + + 49.30468750000001 + + + + + + + + + + + ISO 3166 alpha 3 + + + + + 2019-02-19 + + + + + + + + + + FXX + + + + + + + + + La légende du plan cadastral est consultable sur: http://www.cadastre.gouv.fr/scpc/pdf/legendes/FR_fr/Legende%20du%20plan%20sur%20internet.pdf + + + + + + + false + + + + + + + + + + DXF + + + 12.0 + + + DXF-PCI + + + + + + + AUTODESK + + + + + + + + + + + + + + EDIGEO + + + 1.0 + + + NF Z 52-000 + + + + + + + AFNOR + + + + + + + + + + + + + + Jpeg + + + (ISO/IEC 10918-4:1999) + + + + + + + ISO organisation internationale de normalisation + + + + + + + + + + + + + + gif + + + 89a + + + + + + + CompuServe + + + + + + + + + + + + + + + + DIRECTION GENERALE DES FINANCES PUBLIQUES + + + + + + + bureau.gf3a@dgfip.finances.gouv.fr + + + + + + + + + + + + + + cas courant 9.5€/feuille pour les commandes volumineuses voir prochainement conditions sur site + + + + + + + + + + + http://www.cadastre.gouv.fr + + + WWW:LINK-1.0-http--link + + + SCPC + + + Service de consultation du plan cadastral + + + + + + + + + + + http://www.impots.gouv.fr/portal/dgi/public/popup;jsessionid=YEKIOSL2VA1SFQFIEIQCFFA?pageId=collectivites&espId=3&typePage=cpr02&docOid=documentstandard_6522&temNvlPopUp=true + + + WWW:LINK-1.0-http--related + + + SCPC + + + Lien officiel de description des données + + + + + + + + + + + + + + + + + + + + + + + + INSPIRE Data Specification on Cadastral Parcels - Guidelines v 3.0.1 + + + + + 2010-11-30 + + + + + + + + + + 1.2 + + + INSPIRE + + + + + + + Ressource concernée par INSPIRE +Degré de conformité de la ressource par rapport aux spécifications visées d'Inspire Conforme + + + false + + + + + + + + + Les plans cadastraux au format vecteur gérés et exportés par les services de la DGFiP ont été confectionnées à partir de levers terrain. Selon les feuilles de plan, les conditions de vectorisation et de géoréférencement sont diverses. Ces informations sont disponibles sur les fiches de chacune des communes. + +Les plans cadastraux sont de plusieurs types : + +- plans dits « mis à jour » : ce sont des plans cadastraux mis à jour à partir de la trame des plans cadastraux napoléoniens. Ce ne sont pas des plans réguliers. Ces feuilles de plan sont identifiables par leur section à lettre unique (par exemple « section A »). Les échelles des feuilles de plan peuvent être variables et sont principalement aux échelles suivantes : 1/1250, 1/2500 et 1/5000 ; + +- plans dits « réguliers » : ce sont des plans qui ont été confectionnés lors de la rénovation du cadastre sans reprendre la trame des plans napoléoniens. Parmi ces plans, l’on distingue deux catégories : + +- les plans dits « renouvelés » : ce sont des plans qui n’ont pas fait l’objet lors de leur confection d’une délimitation contradictoire des propriétés sur le terrain ; + +- les plans « refaits » qui ont quant à eux fait l’objet d’une délimitation contradictoire des propriétés ; + +Lorsque le plan cadastral n’est plus en mesure de répondre aux besoins (notamment en raison de son échelle ou de son imprécision éventuelle), il peut être refait selon la procédure du « remaniement » prévue par la loi n° 78-645 du 18 juillet 1974. + +Les plans cadastraux résultant d’opérations d’aménagements fonciers sont appelés « plans remembrés ». + +L’identifiant d’une feuille de plan est de la forme : « DDCCCPPPSSNN » où : + +- « DD » est le numéro du département ; + +- « CCC » le code INSEE de la commune ; + +- « PPP » le préfixe de section. Par défaut ce préfixe est égale à « 000 » sauf dans les cas suivants : + +- en cas d’absorption de commune, ce préfixe a pour valeur le code INSEE de la commune absorbée ; + +- en cas de communes à arrondissements, ce préfixe contient le code de l’arrondissement (pour Paris de 101 à 120, pour Lyon de 381 à 389, pour Marseille de 201 à 216, dans le cas de la ville de Toulouse il s’agit du code de quartier prenant les valeurs de 801 à 846) + +- « SS » est la désignation de la section « cadastrale » (en cas de lettre de section unique, la lettre de section est précédée du chiffre « 0 » par exemple « section 0A ») ; + +- « NN » est le numéro de la feuille (« 01 » par défaut) + + + + + + + + + + + + + + DGFiP Bureau GF-3A + + + + + + + + + + diff --git a/tests/test_iso_parsing.py b/tests/test_iso_parsing.py new file mode 100644 index 000000000..228d80151 --- /dev/null +++ b/tests/test_iso_parsing.py @@ -0,0 +1,547 @@ +import io + +from owslib import util +from owslib.etree import etree +from owslib.iso import ( + MD_Metadata, +) +from owslib.namespaces import Namespaces + + +def get_md_resource(file_path): + """Read the file and parse into an XML tree. + + Parameters + ---------- + file_path : str + Path of the file to read. + + Returns + ------- + etree.ElementTree + XML tree of the resource on disk. + + """ + namespaces = Namespaces().get_namespaces(keys=('gmd', 'gmi')) + + with io.open(file_path, mode='r', encoding='utf-8') as f: + data = f.read().encode('utf-8') + data = etree.fromstring(data) + mdelem = data.find('.//' + util.nspath_eval( + 'gmd:MD_Metadata', namespaces)) or data.find( + './/' + util.nspath_eval('gmi:MI_Metadata', namespaces)) + + if mdelem is None and data.tag == '{http://www.isotc211.org/2005/gmd}MD_Metadata': + mdelem = data + + return mdelem + + +def assert_list(var, length): + """Assert a given variable is a list with given size. + + Parameters + ---------- + var : variable + Variable to test (i.e. should be a list). + length : int + The length/size of the list. + + """ + assert type(var) is list + assert len(var) == length + + +def test_md_parsing_dov(): + """Test the parsing of a metadatarecord from DOV + + GetRecordById response available in + tests/resources/csw_dov_getrecordbyid.xml + + """ + md_resource = get_md_resource('tests/resources/csw_dov_getrecordbyid.xml') + md = MD_Metadata(md_resource) + + assert type(md) is MD_Metadata + + assert md.identifier == '6c39d716-aecc-4fbc-bac8-4f05a49a78d5' + assert md.dataseturi is None + assert md.parentidentifier is None + + assert md.language is None + assert md.languagecode == 'dut' + + assert md.charset == 'utf8' + assert md.datestamp == '2018-02-21T16:14:24' + + assert md.hierarchy == 'dataset' + + assert_list(md.contact, 1) + + contact = md.contact[0] + assert contact.organization == 'Vlaamse overheid - Vlaamse ' \ + 'MilieuMaatschappij - Afdeling ' \ + 'Operationeel Waterbeheer' + assert contact.address == 'Koning Albert II-laan 20 bus 16' + assert contact.city == 'Brussel' + assert contact.postcode == '1000' + assert contact.country == 'België' + assert contact.email == 'info@vmm.be' + assert contact.onlineresource.url == 'https://www.vmm.be' + assert contact.role == 'pointOfContact' + + assert md.stdname == 'ISO 19115/2003/Cor.1:2006' + assert md.stdver == 'GDI-Vlaanderen Best Practices - versie 1.0' + + assert md.referencesystem.code == '31370' + assert md.referencesystem.codeSpace == 'EPSG' + + assert_list(md.identificationinfo, 1) + + iden = md.identificationinfo[0] + assert iden.title == 'Grondwatermeetnetten' + assert iden.alternatetitle == 'Grondwatermeetnetten beschikbaar op DOV' + + assert_list(iden.date, 2) + assert iden.date[0].date == '2002-05-22' + assert iden.date[0].type == 'creation' + assert iden.date[1].date == '2002-05-22' + assert iden.date[1].type == 'publication' + + assert_list(iden.uricode, 1) + assert iden.uricode[0] == 'A64F073B-9FBE-91DD-36FDE7462BBAFA61' + + assert_list(iden.uricodespace, 1) + assert iden.uricodespace[0] == 'DOV-be' + + assert_list(iden.uselimitation, 3) + assert "Zie 'Overige beperkingen'" in iden.uselimitation + assert "Bij het gebruik van de informatie die DOV aanbiedt, dient steeds " \ + "volgende standaardreferentie gebruikt te worden: Databank " \ + "Ondergrond Vlaanderen - (vermelding van de beheerder en de " \ + "specifieke geraadpleegde gegevens) - Geraadpleegd op dd/mm/jjjj, " \ + "op https://www.dov.vlaanderen.be" in iden.uselimitation + assert "Volgende aansprakelijkheidsbepalingen gelden: " \ + "https://www.dov.vlaanderen.be/page/disclaimer" in iden.uselimitation + + assert_list(iden.uselimitation_url, 0) + + assert_list(iden.accessconstraints, 1) + assert iden.accessconstraints[0] == 'otherRestrictions' + + assert_list(iden.classification, 0) + + assert_list(iden.otherconstraints, 1) + assert iden.otherconstraints[ + 0] == "Data beschikbaar voor hergebruik volgens de " \ + "Modellicentie Gratis Hergebruik. Toelichting " \ + "beschikbaar op " \ + "https://www.dov.vlaanderen.be/page/gebruiksvoorwaarden-dov-services" + + assert_list(iden.securityconstraints, 0) + + assert_list(iden.useconstraints, 0) + + assert_list(iden.denominators, 1) + assert iden.denominators[0] == '10000' + + assert_list(iden.distance, 0) + assert_list(iden.uom, 0) + + assert_list(iden.resourcelanguage, 1) + assert iden.resourcelanguage[0] == 'dut' + + assert_list(iden.creator, 0) + assert_list(iden.publisher, 0) + assert_list(iden.contributor, 0) + + assert iden.edition is None + + assert iden.abstract.startswith("In de Databank Ondergrond Vlaanderen " + "zijn verschillende grondwatermeetnetten " + "opgenomen.") + + assert iden.purpose.startswith( + "Het doel van de meetnetten is inzicht krijgen in de kwaliteit en " + "kwantiteit van de watervoerende lagen in de ondergrond van " + "Vlaanderen. Algemeen kan gesteld worden dat de grondwatermeetnetten " + "een belangrijk beleidsinstrument vormen") + + assert iden.status == 'onGoing' + + assert_list(iden.contact, 2) + + assert iden.contact[0].organization == 'Vlaamse overheid - Vlaamse MilieuMaatschappij - Afdeling Operationeel Waterbeheer' + assert iden.contact[0].address == 'Koning Albert II-laan 20 bus 16' + assert iden.contact[0].city == 'Brussel' + assert iden.contact[0].postcode == '1000' + assert iden.contact[0].country == 'België' + assert iden.contact[0].email == 'info@vmm.be' + assert iden.contact[0].onlineresource.url == 'https://www.vmm.be' + assert iden.contact[0].role == 'pointOfContact' + + assert iden.contact[1].organization == 'Databank Ondergrond Vlaanderen (' \ + 'DOV)' + assert iden.contact[1].address == 'Technologiepark Gebouw 905' + assert iden.contact[1].city == 'Zwijnaarde' + assert iden.contact[1].postcode == '9052' + assert iden.contact[1].country == 'België' + assert iden.contact[1].email == 'dov@vlaanderen.be' + assert iden.contact[1].onlineresource.url == \ + 'https://www.dov.vlaanderen.be' + assert iden.contact[1].role == 'distributor' + + assert_list(iden.spatialrepresentationtype, 1) + assert iden.spatialrepresentationtype[0] == 'vector' + + assert_list(iden.keywords, 5) + + assert type(iden.keywords[0]) is dict + assert iden.keywords[0]['type'] == '' + assert iden.keywords[0]['thesaurus']['title'] == "GEMET - INSPIRE thema's, versie 1.0" + assert iden.keywords[0]['thesaurus']['date'] == '2008-06-01' + assert iden.keywords[0]['thesaurus']['datetype'] is None + assert_list(iden.keywords[0]['keywords'], 1) + assert iden.keywords[0]['keywords'] == ['Geologie'] + + assert type(iden.keywords[1]) is dict + assert iden.keywords[1]['type'] == '' + assert iden.keywords[1]['thesaurus'][ + 'title'] == "GEMET - Concepten, versie 2.4" + assert iden.keywords[1]['thesaurus']['date'] == '2010-01-13' + assert iden.keywords[1]['thesaurus']['datetype'] is None + assert_list(iden.keywords[1]['keywords'], 2) + assert iden.keywords[1]['keywords'] == ['grondwater', 'meetnet(werk)'] + + assert type(iden.keywords[2]) is dict + assert iden.keywords[2]['type'] == '' + assert iden.keywords[2]['thesaurus'][ + 'title'] == "Vlaamse regio's" + assert iden.keywords[2]['thesaurus']['date'] == '2013-09-25' + assert iden.keywords[2]['thesaurus']['datetype'] is None + assert_list(iden.keywords[2]['keywords'], 1) + assert iden.keywords[2]['keywords'] == ['Vlaams Gewest'] + + assert type(iden.keywords[3]) is dict + assert iden.keywords[3]['type'] is None + assert iden.keywords[3]['thesaurus'][ + 'title'] == "GDI-Vlaanderen Trefwoorden" + assert iden.keywords[3]['thesaurus']['date'] == '2014-02-26' + assert iden.keywords[3]['thesaurus']['datetype'] is None + assert_list(iden.keywords[3]['keywords'], 7) + assert iden.keywords[3]['keywords'] == [ + 'Toegevoegd GDI-Vl', 'Herbruikbaar', 'Vlaamse Open data', + 'Kosteloos', 'Lijst M&R INSPIRE', 'Metadata INSPIRE-conform', + 'Metadata GDI-Vl-conform'] + + assert type(iden.keywords[4]) is dict + assert iden.keywords[4]['type'] is None + assert iden.keywords[4]['thesaurus']['title'] == "DOV" + assert iden.keywords[4]['thesaurus']['date'] == '2010-12-01' + assert iden.keywords[4]['thesaurus']['datetype'] is None + assert_list(iden.keywords[4]['keywords'], 7) + assert iden.keywords[4]['keywords'] == [ + 'Ondergrond', 'DOV', 'Vlaanderen', 'monitoring', 'meetnetten', + 'Kaderrichtlijn Water', 'Decreet Integraal waterbeleid'] + + assert_list(iden.keywords2, 5) + assert iden.keywords2[0].type == '' + assert iden.keywords2[0].thesaurus[ + 'title'] == "GEMET - INSPIRE thema's, versie 1.0" + assert iden.keywords2[0].thesaurus['date'] == '2008-06-01' + assert iden.keywords2[0].thesaurus['datetype'] == 'publication' + assert_list(iden.keywords2[0].keywords, 1) + assert iden.keywords2[0].keywords == ['Geologie'] + + assert iden.keywords2[1].type == '' + assert iden.keywords2[1].thesaurus[ + 'title'] == "GEMET - Concepten, versie 2.4" + assert iden.keywords2[1].thesaurus['date'] == '2010-01-13' + assert iden.keywords2[1].thesaurus['datetype'] == 'publication' + assert_list(iden.keywords2[1].keywords, 2) + assert iden.keywords2[1].keywords == ['grondwater', 'meetnet(werk)'] + + assert iden.keywords2[2].type == '' + assert iden.keywords2[2].thesaurus[ + 'title'] == "Vlaamse regio's" + assert iden.keywords2[2].thesaurus['date'] == '2013-09-25' + assert iden.keywords2[2].thesaurus['datetype'] == 'publication' + assert_list(iden.keywords2[2].keywords, 1) + assert iden.keywords2[2].keywords == ['Vlaams Gewest'] + + assert iden.keywords2[3].type is None + assert iden.keywords2[3].thesaurus[ + 'title'] == "GDI-Vlaanderen Trefwoorden" + assert iden.keywords2[3].thesaurus['date'] == '2014-02-26' + assert iden.keywords2[3].thesaurus['datetype'] == 'publication' + assert_list(iden.keywords2[3].keywords, 7) + assert iden.keywords2[3].keywords == [ + 'Toegevoegd GDI-Vl', 'Herbruikbaar', 'Vlaamse Open data', + 'Kosteloos', 'Lijst M&R INSPIRE', 'Metadata INSPIRE-conform', + 'Metadata GDI-Vl-conform'] + + assert iden.keywords2[4].type is None + assert iden.keywords2[4].thesaurus['title'] == "DOV" + assert iden.keywords2[4].thesaurus['date'] == '2010-12-01' + assert iden.keywords2[4].thesaurus['datetype'] == 'publication' + assert_list(iden.keywords2[4].keywords, 7) + assert iden.keywords2[4].keywords == [ + 'Ondergrond', 'DOV', 'Vlaanderen', 'monitoring', 'meetnetten', + 'Kaderrichtlijn Water', 'Decreet Integraal waterbeleid'] + + assert_list(iden.topiccategory, 1) + assert iden.topiccategory[0] == 'geoscientificInformation' + + assert iden.supplementalinformation == \ + "https://www.dov.vlaanderen.be/page/grondwatermeetnet" + + assert_list(md.contentinfo, 1) + ci = md.contentinfo[0] + + assert ci.compliancecode is None + assert_list(ci.language, 0) + assert ci.includedwithdataset == True + assert_list(ci.featuretypenames, 0) + + assert_list(ci.featurecatalogues, 1) + assert ci.featurecatalogues[0] == 'b142965f-b2aa-429e-86ff-a7cb0e065d48' + + +def test_md_parsing_geobretagne(): + """Test the parsing of a metadatarecord from GéoBretagne + + MD_Metadata record available in + tests/resources/csw_geobretagne_mdmetadata.xml + + """ + md_resource = get_md_resource( + 'tests/resources/csw_geobretagne_mdmetadata.xml') + md = MD_Metadata(md_resource) + + assert type(md) is MD_Metadata + + assert md.identifier == '955c3e47-411e-4969-b61b-3556d1b9f879' + assert md.dataseturi is None + assert md.parentidentifier is None + + assert md.language == 'fre' + assert md.languagecode is None + + assert md.charset == 'utf8' + assert md.datestamp == '2018-07-30T14:19:40' + + assert md.hierarchy == 'dataset' + + assert_list(md.contact, 1) + + contact = md.contact[0] + assert contact.organization == 'DIRECTION GENERALE DES FINANCES ' \ + 'PUBLIQUES BUREAU GF-3A' + assert contact.address is None + assert contact.city is None + assert contact.postcode is None + assert contact.country is None + assert contact.email == 'bureau.gf3a@dgfip.finances.gouv.fr' + assert contact.onlineresource is None + assert contact.role == 'pointOfContact' + + assert md.stdname == 'ISO 19115' + assert md.stdver == '1.0' + + assert md.referencesystem.code == 'RGF93 / CC48 (EPSG:3948)' + assert md.referencesystem.codeSpace == 'EPSG' + + assert_list(md.identificationinfo, 1) + + iden = md.identificationinfo[0] + assert iden.title == 'Cadastre 2018 en Bretagne' + assert iden.alternatetitle is None + + assert_list(iden.date, 1) + assert iden.date[0].date == '2018-09-01' + assert iden.date[0].type == 'revision' + + assert_list(iden.uricode, 0) + assert_list(iden.uricodespace, 0) + + assert_list(iden.uselimitation, 2) + assert "le plan cadastral décrit les limites apparentes de la " \ + "propriété." in iden.uselimitation + + assert_list(iden.uselimitation_url, 0) + + assert_list(iden.accessconstraints, 1) + assert iden.accessconstraints[0] == 'otherRestrictions' + + assert_list(iden.classification, 0) + + assert_list(iden.otherconstraints, 1) + assert iden.otherconstraints[ + 0] == 'Usage libre sous réserve des mentions obligatoires sur ' \ + 'tout document de diffusion : "Source : DGFIP"' + + assert_list(iden.securityconstraints, 0) + + assert_list(iden.useconstraints, 1) + assert iden.useconstraints[0] == 'copyright' + + assert_list(iden.denominators, 1) + assert iden.denominators[0] == '500' + + assert_list(iden.distance, 0) + assert_list(iden.uom, 0) + + assert_list(iden.resourcelanguage, 0) + + assert_list(iden.creator, 0) + assert_list(iden.publisher, 0) + assert_list(iden.contributor, 0) + + assert iden.edition is None + + assert iden.abstract.startswith( + "Le plan du cadastre est un document administratif qui propose " + "l’unique plan parcellaire à grande échelle couvrant le territoire " + "national.") + + assert iden.purpose.startswith( + "Le but premier du plan cadastral est d'identifier, de localiser et " + "représenter la propriété foncière, ainsi que de servir à l'assise de " + "la fiscalité locale des propriétés non bâties.") + + assert iden.status == 'completed' + + assert_list(iden.contact, 1) + + assert iden.contact[0].organization == 'DGFIP Bretagne' + assert iden.contact[0].name == 'DIRECTION GENERALE DES FINANCES PUBLIQUES' + assert iden.contact[0].address is None + assert iden.contact[0].city is None + assert iden.contact[0].postcode is None + assert iden.contact[0].country is None + assert iden.contact[0].email == 'bureau.gf3a@dgfip.finances.gouv.fr' + assert iden.contact[0].onlineresource is None + assert iden.contact[0].role == 'pointOfContact' + + assert_list(iden.spatialrepresentationtype, 1) + assert iden.spatialrepresentationtype[0] == 'vector' + + assert_list(iden.keywords, 7) + + assert type(iden.keywords[0]) is dict + assert iden.keywords[0]['type'] == 'place' + assert iden.keywords[0]['thesaurus']['title'] is None + assert iden.keywords[0]['thesaurus']['date'] is None + assert iden.keywords[0]['thesaurus']['datetype'] is None + assert_list(iden.keywords[0]['keywords'], 1) + assert iden.keywords[0]['keywords'] == ['France'] + + assert type(iden.keywords[1]) is dict + assert iden.keywords[1]['type'] is None + assert iden.keywords[1]['thesaurus']['title'] is None + assert iden.keywords[1]['thesaurus']['date'] is None + assert iden.keywords[1]['thesaurus']['datetype'] is None + assert_list(iden.keywords[1]['keywords'], 0) + + assert type(iden.keywords[2]) is dict + assert iden.keywords[2]['type'] == 'theme' + assert iden.keywords[2]['thesaurus']['title'] is None + assert iden.keywords[2]['thesaurus']['date'] is None + assert iden.keywords[2]['thesaurus']['datetype'] is None + assert_list(iden.keywords[2]['keywords'], 7) + assert iden.keywords[2]['keywords'] == [ + 'bâtiments', 'adresses', 'parcelles cadastrales', 'hydrographie', + 'réseaux de transport', 'unités administratives', + 'référentiels de coordonnées'] + + assert type(iden.keywords[3]) is dict + assert iden.keywords[3]['type'] == 'theme' + assert iden.keywords[3]['thesaurus']['title'] is None + assert iden.keywords[3]['thesaurus']['date'] is None + assert iden.keywords[3]['thesaurus']['datetype'] is None + assert_list(iden.keywords[3]['keywords'], 5) + assert iden.keywords[3]['keywords'] == [ + 'bâtis', 'sections', 'parcelles', 'cadastre', 'cadastrale'] + + assert type(iden.keywords[4]) is dict + assert iden.keywords[4]['type'] == 'theme' + assert iden.keywords[4]['thesaurus']['title'] == "GéoBretagne v 2.0" + assert iden.keywords[4]['thesaurus']['date'] == '2014-01-13' + assert iden.keywords[4]['thesaurus']['datetype'] is None + assert_list(iden.keywords[4]['keywords'], 1) + assert iden.keywords[4]['keywords'] == ['référentiels : cadastre'] + + assert type(iden.keywords[5]) is dict + assert iden.keywords[5]['type'] == 'theme' + assert iden.keywords[5]['thesaurus']['title'] == "INSPIRE themes" + assert iden.keywords[5]['thesaurus']['date'] == '2008-06-01' + assert iden.keywords[5]['thesaurus']['datetype'] is None + assert_list(iden.keywords[5]['keywords'], 1) + assert iden.keywords[5]['keywords'] == ['Parcelles cadastrales'] + + assert type(iden.keywords[6]) is dict + assert iden.keywords[6]['type'] == 'theme' + assert iden.keywords[6]['thesaurus']['title'] == "GEMET" + assert iden.keywords[6]['thesaurus']['date'] == '2012-07-20' + assert iden.keywords[6]['thesaurus']['datetype'] is None + assert_list(iden.keywords[6]['keywords'], 2) + assert iden.keywords[6]['keywords'] == ['cadastre', 'bâtiment'] + + assert_list(iden.keywords2, 6) + + assert iden.keywords2[0].type == 'place' + assert iden.keywords2[0].thesaurus is None + assert_list(iden.keywords2[0].keywords, 1) + assert iden.keywords2[0].keywords == ['France'] + + assert iden.keywords2[1].type == 'theme' + assert iden.keywords2[1].thesaurus is None + assert_list(iden.keywords2[1].keywords, 7) + assert iden.keywords2[1].keywords == [ + 'bâtiments', 'adresses', 'parcelles cadastrales', 'hydrographie', + 'réseaux de transport', 'unités administratives', + 'référentiels de coordonnées'] + + assert iden.keywords2[2].type == 'theme' + assert iden.keywords2[2].thesaurus is None + assert_list(iden.keywords2[2].keywords, 5) + assert iden.keywords2[2].keywords == [ + 'bâtis', 'sections', 'parcelles', 'cadastre', 'cadastrale'] + + assert iden.keywords2[3].type == 'theme' + assert iden.keywords2[3].thesaurus['title'] == "GéoBretagne v 2.0" + assert iden.keywords2[3].thesaurus['date'] == '2014-01-13' + assert iden.keywords2[3].thesaurus['datetype'] == 'publication' + assert_list(iden.keywords2[3].keywords, 1) + assert iden.keywords2[3].keywords == ['référentiels : cadastre'] + + assert iden.keywords2[4].type == 'theme' + assert iden.keywords2[4].thesaurus['title'] == "INSPIRE themes" + assert iden.keywords2[4].thesaurus['date'] == '2008-06-01' + assert iden.keywords2[4].thesaurus['datetype'] == 'publication' + assert_list(iden.keywords2[4].keywords, 1) + assert iden.keywords2[4].keywords == ['Parcelles cadastrales'] + + assert iden.keywords2[5].type == 'theme' + assert iden.keywords2[5].thesaurus['title'] == "GEMET" + assert iden.keywords2[5].thesaurus['date'] == '2012-07-20' + assert iden.keywords2[5].thesaurus['datetype'] == 'publication' + assert_list(iden.keywords2[5].keywords, 2) + assert iden.keywords2[5].keywords == ['cadastre', 'bâtiment'] + + assert_list(iden.topiccategory, 1) + assert iden.topiccategory[0] == 'planningCadastre' + + assert iden.supplementalinformation == \ + "La légende du plan cadastral est consultable sur: " \ + "http://www.cadastre.gouv.fr/scpc/pdf/legendes/FR_fr/Legende%20du" \ + "%20plan%20sur%20internet.pdf" + + assert_list(md.contentinfo, 1) + ci = md.contentinfo[0] + + assert ci.compliancecode is None + assert_list(ci.language, 0) + assert ci.includedwithdataset == False + assert_list(ci.featuretypenames, 0) + assert_list(ci.featurecatalogues, 0) \ No newline at end of file