From 323e2498fa21dfee2c04adca04464c7f346fbad2 Mon Sep 17 00:00:00 2001 From: AbelPau <92721356+AbelPau@users.noreply.github.com> Date: Wed, 24 Apr 2024 22:15:24 +0200 Subject: [PATCH] MiraMonVector fixes (2) tests improvements (+10) (#9744) **Fixes** - Delete of unused function (MMInitHeader) - Use of CPLError() in some explicit return errors **Test improvements** - last_version added in -lco Version - more corrupted files tested - unexisting coordinates or unexpected polygon construction tested datefield added in tests code simplification - multipolygon Z added in tests - multigeometry added in tests - ANSI DBFEncoding test added --- .../CorruptedFiles/BadCycle/SimplePolFile.arc | Bin 0 -> 536 bytes .../CorruptedFiles/BadCycle/SimplePolFile.nod | Bin 0 -> 92 bytes .../CorruptedFiles/BadCycle/SimplePolFile.pol | Bin 0 -> 349 bytes .../BadCycle/SimplePolFileA.dbf | Bin 0 -> 511 bytes .../BadCycle/SimplePolFileA.rel | 89 +++++++ .../BadCycle/SimplePolFileN.dbf | Bin 0 -> 261 bytes .../BadCycle/SimplePolFileN.rel | 64 +++++ .../BadCycle/SimplePolFileP.dbf | Bin 0 -> 729 bytes .../BadCycle/SimplePolFileP.rel | 93 +++++++ .../CorruptedCoordinates.arc | Bin 0 -> 240 bytes .../CorruptedCoordinates.nod | Bin 0 -> 92 bytes .../CorruptedCoordinates.pol | Bin 0 -> 349 bytes .../CorruptedCoordinatesA.dbf | Bin 0 -> 511 bytes .../CorruptedCoordinatesA.rel | 89 +++++++ .../CorruptedCoordinatesN.dbf | Bin 0 -> 261 bytes .../CorruptedCoordinatesN.rel | 64 +++++ .../CorruptedCoordinatesP.dbf | Bin 0 -> 729 bytes .../CorruptedCoordinatesP.rel | 93 +++++++ .../CorruptedCoordinatesPoint.pnt | Bin 0 -> 60 bytes .../CorruptedCoordinatesPointT.dbf | Bin 0 -> 254 bytes .../CorruptedCoordinatesPointT.rel | 58 ++++ .../CorruptedPolygon/Multipolygons.arc | Bin 0 -> 1168 bytes .../CorruptedPolygon/Multipolygons.nod | Bin 0 -> 112 bytes .../CorruptedPolygon/Multipolygons.pol | Bin 0 -> 256 bytes .../CorruptedPolygon/MultipolygonsA.dbf | Bin 0 -> 733 bytes .../CorruptedPolygon/MultipolygonsA.rel | 92 +++++++ .../CorruptedPolygon/MultipolygonsN.dbf | Bin 0 -> 305 bytes .../CorruptedPolygon/MultipolygonsN.rel | 68 +++++ .../CorruptedPolygon/MultipolygonsP.dbf | Bin 0 -> 1055 bytes .../CorruptedPolygon/MultipolygonsP.rel | 108 ++++++++ .../CorruptedFiles/NoArcRel/SimpleArcFile.arc | Bin 0 -> 592 bytes .../CorruptedFiles/NoArcRel/SimpleArcFile.nod | Bin 0 -> 172 bytes .../NoArcRel/SimpleArcFileA.dbf | Bin 0 -> 789 bytes .../NoArcRel/SimpleArcFileN.dbf | Bin 0 -> 481 bytes .../NoArcRel/SimpleArcFileN.rel | 64 +++++ .../CorruptedFiles/NoNode/SimpleArcFile.arc | Bin 0 -> 592 bytes .../CorruptedFiles/NoNode/SimpleArcFileA.dbf | Bin 0 -> 789 bytes .../CorruptedFiles/NoNode/SimpleArcFileA.rel | 102 +++++++ .../CorruptedFiles/NoNode/SimpleArcFileN.dbf | Bin 0 -> 481 bytes .../CorruptedFiles/NoNode/SimpleArcFileN.rel | 64 +++++ .../CorruptedFiles/NoPolRel/SimplePolFile.arc | Bin 0 -> 536 bytes .../CorruptedFiles/NoPolRel/SimplePolFile.nod | Bin 0 -> 92 bytes .../CorruptedFiles/NoPolRel/SimplePolFile.pol | Bin 0 -> 349 bytes .../NoPolRel/SimplePolFileA.dbf | Bin 0 -> 511 bytes .../NoPolRel/SimplePolFileA.rel | 89 +++++++ .../NoPolRel/SimplePolFileN.dbf | Bin 0 -> 261 bytes .../NoPolRel/SimplePolFileN.rel | 64 +++++ .../NoPolRel/SimplePolFileP.dbf | Bin 0 -> 729 bytes autotest/ogr/ogr_miramon_vector.py | 252 +++++++++++++----- ogr/ogrsf_frmts/miramon/mm_wrlayr.c | 74 ----- ogr/ogrsf_frmts/miramon/mm_wrlayr.h | 1 - ogr/ogrsf_frmts/miramon/ogrmiramonlayer.cpp | 20 +- 52 files changed, 1393 insertions(+), 155 deletions(-) create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/BadCycle/SimplePolFile.arc create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/BadCycle/SimplePolFile.nod create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/BadCycle/SimplePolFile.pol create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/BadCycle/SimplePolFileA.dbf create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/BadCycle/SimplePolFileA.rel create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/BadCycle/SimplePolFileN.dbf create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/BadCycle/SimplePolFileN.rel create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/BadCycle/SimplePolFileP.dbf create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/BadCycle/SimplePolFileP.rel create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinates.arc create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinates.nod create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinates.pol create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinatesA.dbf create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinatesA.rel create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinatesN.dbf create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinatesN.rel create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinatesP.dbf create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinatesP.rel create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinatesPoint.pnt create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinatesPointT.dbf create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinatesPointT.rel create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/CorruptedPolygon/Multipolygons.arc create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/CorruptedPolygon/Multipolygons.nod create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/CorruptedPolygon/Multipolygons.pol create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/CorruptedPolygon/MultipolygonsA.dbf create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/CorruptedPolygon/MultipolygonsA.rel create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/CorruptedPolygon/MultipolygonsN.dbf create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/CorruptedPolygon/MultipolygonsN.rel create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/CorruptedPolygon/MultipolygonsP.dbf create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/CorruptedPolygon/MultipolygonsP.rel create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/NoArcRel/SimpleArcFile.arc create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/NoArcRel/SimpleArcFile.nod create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/NoArcRel/SimpleArcFileA.dbf create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/NoArcRel/SimpleArcFileN.dbf create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/NoArcRel/SimpleArcFileN.rel create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/NoNode/SimpleArcFile.arc create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/NoNode/SimpleArcFileA.dbf create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/NoNode/SimpleArcFileA.rel create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/NoNode/SimpleArcFileN.dbf create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/NoNode/SimpleArcFileN.rel create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/NoPolRel/SimplePolFile.arc create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/NoPolRel/SimplePolFile.nod create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/NoPolRel/SimplePolFile.pol create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/NoPolRel/SimplePolFileA.dbf create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/NoPolRel/SimplePolFileA.rel create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/NoPolRel/SimplePolFileN.dbf create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/NoPolRel/SimplePolFileN.rel create mode 100644 autotest/ogr/data/miramon/CorruptedFiles/NoPolRel/SimplePolFileP.dbf diff --git a/autotest/ogr/data/miramon/CorruptedFiles/BadCycle/SimplePolFile.arc b/autotest/ogr/data/miramon/CorruptedFiles/BadCycle/SimplePolFile.arc new file mode 100644 index 0000000000000000000000000000000000000000..431d702a3a3540257dfdffce360f123848d1eeb8 GIT binary patch literal 536 zcmZ<^a#k?ZGi2E98#`I@Yl*|Y+{;szD@=CS(bD|peQJe+oy>ifmSbHG%nT3!Qx`GM zUGJG~heHqB*RaOxb#QfTKxH?eYC%-nGFH!W^(hYSdv8Sre(Qvr|LB0;fx_u^4xaNr zCY1GcIdA~gS}-y&01+6weNBkr>znA{yGPA9OQp%dR8&BU|5*pzT}L-DR<}-Rasb)4 z1E`4!NQ1DHuuoUCOREFSoy(sY)!yRmaHu{}u-Mq85$;Zy`;T~ST9YW-=1{=1XUjX6 z7Px;txb6*opjzRu;BL<4DeCnY=C!#Uo5sIk0^I$V@=Mw{p7%H?Xf64*P_-TIU%uVd zKAU`+9d=kPniM47=K%Bfnxh;csREN6-p-uN_CLD;9xj3#+rAovwmOK1@3PEPnB>6k zX|B$DufqY|zE6uM1zmpvG#46Auy6`G`>G`2PoqP}O}kqSbK4wX;RFjmfwL6`*4t|x X(gN6zt#oa7FnhbkkNsGM1G;$t@$uhR literal 0 HcmV?d00001 diff --git a/autotest/ogr/data/miramon/CorruptedFiles/BadCycle/SimplePolFile.nod b/autotest/ogr/data/miramon/CorruptedFiles/BadCycle/SimplePolFile.nod new file mode 100644 index 0000000000000000000000000000000000000000..e5d310c3c0cee2ef29d314c8b4e269060b4f902e GIT binary patch literal 92 zcmebCcTq6ZGi2E98#`I@Yl%af+p%f<8zwmHXlZ`)KDENZbNifmSbHGEDQ+12xKxL zxD3odHX;2;${9RB2A~0${)l<*de3Y-9D3NkhBaQVgWC_%0>dEvZOd3a%hjhiG>W+N z7MK2ZaNm0?D)3t;-2IOZ=p87WUgzLB|6@W~UzY<+FNh8R5^i4;V)*(dIxIVRca6>b zuMWO@)Qq!KnjB0;1*G_&b-?|9bQ5EB>y#!G{SiR@Qo=r6(JrkHr@l^&Y`%Ke0Tc!x Nzz(ti2$(?u1OVn#qZAzevYYmk6ns|Kkt_dLW-d{ z!~QjI`;h9qJjcfU^T(+BZEnkfbdsCeeBBtkuqsrj)2F$q}WWOg2r+Fm~qrI@1e@R5?;CuU6bhEl`u`oUw{m p9#Kr@>{?Boj2&irAr)1#w=wGkH(Fa?5mv&O{Cf>5J&C literal 0 HcmV?d00001 diff --git a/autotest/ogr/data/miramon/CorruptedFiles/BadCycle/SimplePolFileP.rel b/autotest/ogr/data/miramon/CorruptedFiles/BadCycle/SimplePolFileP.rel new file mode 100644 index 000000000000..46823207aee6 --- /dev/null +++ b/autotest/ogr/data/miramon/CorruptedFiles/BadCycle/SimplePolFileP.rel @@ -0,0 +1,93 @@ +[VERSIO] +VersMetaDades=5 +SubVersMetaDades=0 +Vers=4 +SubVers=3 + +[METADADES] +language=cat +MDIdiom=cat +dateStamp=20230628 16204988+0200 +characterSet=006 +nOrganismes=1 +FileIdentifier=00691677-6d15-40f8-9d62-e8df34876e80_SimplePolFileP + +[METADADES:ORGANISME_1] +role=009 +IndividualName=Abel Pau +PositionName=Tècnic SIG +OrganisationName=Students and educational institutions + +[IDENTIFICATION] +code= +codeSpace= +DatasetTitle=Simple Pol File + +[OVERVIEW:ASPECTES_TECNICS] +ArcSource=NoExistPolFile.arc + +[QUALITY:LINEAGE:PROCESS1] +nOrganismes=1 +history=C:\MiraMon\MM64.exe +date=20230628 16204988+0200 + +[QUALITY:LINEAGE:PROCESS1:ORGANISME_1] +IndividualName=Abel Pau +PositionName=Tècnic SIG +OrganisationName=Students and educational institutions + +[QUALITY:LINEAGE] +processes=1 + +[EXTENT] +toler_env=0 +MinX=335.318744053333 +MaxX=1224.16365366323 +MinY=390.371075166458 +MaxY=856.814462416696 + +[OVERVIEW] +CreationDate=20230628 16204986+0200 + +[TAULA_PRINCIPAL] +IdGrafic=ID_GRAFIC +TipusRelacio=RELACIO_1_N_DICC + +[TAULA_PRINCIPAL:ID_GRAFIC] +descriptor=Identificador Gràfic intern +visible=0 +TractamentVariable=Ordinal + +[TAULA_PRINCIPAL:N_VERTEXS] +descriptor=Nombre de vèrtexs +visible=0 +MostrarUnitats=0 + +[TAULA_PRINCIPAL:PERIMETRE] +descriptor=Perímetre del polígon + +[TAULA_PRINCIPAL:AREA] +descriptor=Àrea del polígon + +[TAULA_PRINCIPAL:N_ARCS] +descriptor=Nombre d'arcs +visible=0 +MostrarUnitats=0 + +[TAULA_PRINCIPAL:N_POLIG] +descriptor=Nombre de polígons elementals +visible=0 +MostrarUnitats=0 + +[GEOMETRIA_I_TOPOLOGIA] +NomCampNVertexs=N_VERTEXS +NomCampPerimetre=PERIMETRE +NomCampArea=AREA +NomCampNArcs=N_ARCS +NomCampNPoligons=N_POLIG + +[TAULA_PRINCIPAL:ATT1] +descriptor=atribute1 + +[TAULA_PRINCIPAL:ATT2] +descriptor=atribute2 diff --git a/autotest/ogr/data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinates.arc b/autotest/ogr/data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinates.arc new file mode 100644 index 0000000000000000000000000000000000000000..78bba69d09d68746c4e00b37593f167cd42bf888 GIT binary patch literal 240 zcmZ<^a#k?ZGi2E98#`I@Yl*|Y+{;szD@=CS(bD|peQJe+oy>ifmSbHG%nT3!Qx`GM zUGJG~heHqB*RaOxb#QfTKxH?eYC%-nGFH!W^(hYSdv8Sre(Qvr|LB0;fx_u^4xaNr zCY1GcIdA~gS}-y&01+6weNBkr>znA{yGPA9OQp%dR8&BU|5*pzT}L-DR<}-Rasb)4 m1E`4!NQ1DHuuoUCOREFSoy(sY)!yRmaHu{}u-Mq8(E$KrXj9Vw literal 0 HcmV?d00001 diff --git a/autotest/ogr/data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinates.nod b/autotest/ogr/data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinates.nod new file mode 100644 index 0000000000000000000000000000000000000000..e5d310c3c0cee2ef29d314c8b4e269060b4f902e GIT binary patch literal 92 zcmebCcTq6ZGi2E98#`I@Yl%af+p%f<8zwmHXlZ`)KDENZbNifmSbHGEDQ+12xKxL zxD3odHX;2;${9RB2A~0${)l<*de3Y-9D3NkhBaQVgWC_%0>dEvZOd3a%hjhiG>W+N z7MK2ZaNm0?D)3t;-2IOZ=p87WUgzLB|6@W~UzY<+FNh8R5^i4;V)*(dIxIVRca6>b zuMWO@)Qq!KnjB0;1*G_&b-?|9bQ5EB>y#!G{SiR@Qo=r6(JrkHr@l^&Y`%Ke0Tc!x Nzz(ti2$(?u1OVn#qZAzevYYmk6ns|Kkt_dLW-d{ z!~QjI`;h9qJjcfU^T(+BZEnkfbdsCeeBBtkuqsrj)2F$q}WWOg2r+Fm~qrI@1e@R5?;CuU6bhEl`u`oUw{m p9#Kr@>{?Boj2&irAr)1#w=wGkH(Fa?5mv&O{Cf>5J&C literal 0 HcmV?d00001 diff --git a/autotest/ogr/data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinatesP.rel b/autotest/ogr/data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinatesP.rel new file mode 100644 index 000000000000..aa7c1d652d5b --- /dev/null +++ b/autotest/ogr/data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinatesP.rel @@ -0,0 +1,93 @@ +[VERSIO] +VersMetaDades=5 +SubVersMetaDades=0 +Vers=4 +SubVers=3 + +[METADADES] +language=cat +MDIdiom=cat +dateStamp=20230628 16204988+0200 +characterSet=006 +nOrganismes=1 +FileIdentifier=00691677-6d15-40f8-9d62-e8df34876e80_CorruptedCoordinatesP + +[METADADES:ORGANISME_1] +role=009 +IndividualName=Abel Pau +PositionName=Tècnic SIG +OrganisationName=Students and educational institutions + +[IDENTIFICATION] +code= +codeSpace= +DatasetTitle=Corrupted coordinates + +[OVERVIEW:ASPECTES_TECNICS] +ArcSource=CorruptedCoordinates.arc + +[QUALITY:LINEAGE:PROCESS1] +nOrganismes=1 +history=C:\MiraMon\MM64.exe +date=20230628 16204988+0200 + +[QUALITY:LINEAGE:PROCESS1:ORGANISME_1] +IndividualName=Abel Pau +PositionName=Tècnic SIG +OrganisationName=Students and educational institutions + +[QUALITY:LINEAGE] +processes=1 + +[EXTENT] +toler_env=0 +MinX=335.318744053333 +MaxX=1224.16365366323 +MinY=390.371075166458 +MaxY=856.814462416696 + +[OVERVIEW] +CreationDate=20230628 16204986+0200 + +[TAULA_PRINCIPAL] +IdGrafic=ID_GRAFIC +TipusRelacio=RELACIO_1_N_DICC + +[TAULA_PRINCIPAL:ID_GRAFIC] +descriptor=Identificador Gràfic intern +visible=0 +TractamentVariable=Ordinal + +[TAULA_PRINCIPAL:N_VERTEXS] +descriptor=Nombre de vèrtexs +visible=0 +MostrarUnitats=0 + +[TAULA_PRINCIPAL:PERIMETRE] +descriptor=Perímetre del polígon + +[TAULA_PRINCIPAL:AREA] +descriptor=Àrea del polígon + +[TAULA_PRINCIPAL:N_ARCS] +descriptor=Nombre d'arcs +visible=0 +MostrarUnitats=0 + +[TAULA_PRINCIPAL:N_POLIG] +descriptor=Nombre de polígons elementals +visible=0 +MostrarUnitats=0 + +[GEOMETRIA_I_TOPOLOGIA] +NomCampNVertexs=N_VERTEXS +NomCampPerimetre=PERIMETRE +NomCampArea=AREA +NomCampNArcs=N_ARCS +NomCampNPoligons=N_POLIG + +[TAULA_PRINCIPAL:ATT1] +descriptor=atribute1 + +[TAULA_PRINCIPAL:ATT2] +descriptor=atribute2 diff --git a/autotest/ogr/data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinatesPoint.pnt b/autotest/ogr/data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinatesPoint.pnt new file mode 100644 index 0000000000000000000000000000000000000000..eb2da160ad09cfc23cca3dedc1c012870a17f325 GIT binary patch literal 60 zcmWIW3sErCGh|xgZgJZrwbbG8>DU&wDNPQ!6DphwW7{02T$9KvY3p)eW`KbECRt0K Ib2os+0gG=Hf&c&j literal 0 HcmV?d00001 diff --git a/autotest/ogr/data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinatesPointT.dbf b/autotest/ogr/data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinatesPointT.dbf new file mode 100644 index 0000000000000000000000000000000000000000..57527da74671340fbf8db0f3f2debbbfe2da2835 GIT binary patch literal 254 zcmbPG%_hstz`)SMpavw-fCvMFr%SwhkfWQYGXsMkNR|stiDO8JAyf#c1PXXy3UZKRc{3^fgsr6K-EQRei%_x5QTrIsP;Fj_g(!c3(^3n~<&&{0rJ zlcdxrDq9e022w^L{>TE+j6|2Aq-97gC6W5J`}z#~qp`=w<=yk{z2}@u_AtND;7|vB zVrGuPpoXN*_`W_xJPc-E9B%X?5Hh>Bzi&_rjxzlHFHb3^xjFD;@e}pHG^2!g7`St_ zVrGuQxo)3AO+JIxk><*o5dz;PPHxqmpx`X#n&mQ?4Qe|XbsrL@G_H`x!h9=(1n|7D zp|*BJfa+5o&#fU0J}E}peXE%r2diW<5o$j>TMg5WB?|bMKAvL;0PxqhIS(Hs&{Orr zVAxGysl%_X)F--xGPiE0=F<`O4scO^3-iIOJa?lik)LUoKSAq5gPIYI`R|-c0;HP|JDL zB452)#CK~U?ecVt%RJ}J%p`qp1Z6iB3KZ}?Ch7fTF{QC^lptP3U^cj7sL_q$eJOzj zCsl&wC&74uaD6E9TR>6gH~hYo!n@NkR+WyxJ==WA6t+cYmAS7asDB1Uon8X0&&w@$ z_n`RRVZi#U=|6hlJQM;v%{pT~ueXjNK9a|x&rE3@;o*w}>&Gnn?T`O5lO~K^O9brm z`Y`Ozl|rQ3uj$k%2B9|Jr%`~Zn^{IVlYF|ezTKD60@hPA)a$%}{s?Et$HQgc%13+K ze47O*9e8Ca(=o}{_I}HG{8*6uoqeR{e!>|63Kjy7X^NP%4`UG#J1lyh|5tr`zncl- z`w8mZ2k74>g7cLE&i9DGrG{tYWhH?AZQ${C;Qk`g9$|d~w{|&qS#v?!C){hUS1y5K Z<&d~9T+b^!-bYZc9wP1IpFLdJ?{D_0)eisw literal 0 HcmV?d00001 diff --git a/autotest/ogr/data/miramon/CorruptedFiles/CorruptedPolygon/Multipolygons.nod b/autotest/ogr/data/miramon/CorruptedFiles/CorruptedPolygon/Multipolygons.nod new file mode 100644 index 0000000000000000000000000000000000000000..76dd01f956adec07460d8ad34b585716a5d6f32c GIT binary patch literal 112 zcmebCcTq6ZGh`I+7M?jX(!rtQglvIrm#f2p4W8dLmN+_057}jGZ0+p8!T=XT}{kDJ4lxQW*nOE@|hybC^i=8B6069WP;LYc@k zj7`WK7NA~`Ss?lX5Kq(Mh@Qvb>o6hapYt!yumhy%e}SZbzLfr5l}VuvY(Oyvc93h> VLDn!agZMxIc0UtX2rLN`2LLMYI{N?s literal 0 HcmV?d00001 diff --git a/autotest/ogr/data/miramon/CorruptedFiles/CorruptedPolygon/MultipolygonsA.dbf b/autotest/ogr/data/miramon/CorruptedFiles/CorruptedPolygon/MultipolygonsA.dbf new file mode 100644 index 0000000000000000000000000000000000000000..74d23798fe8a8ca5b1e2b5be1bbee04ebc74bd9e GIT binary patch literal 733 zcmZ{g!3x4K42A=WH!q_1K0(Qnrfx@ZQwCCDig??L2tKQC;wHMTBlb}Ket+^e?d&mM z%>m#A&u*WrH9%dq$7Xk^_W+@HHWa5UDLIH`xj}z&#!*|EcL^= ztlB!%Lw{<+$3OJ8KHt)43l&Iy44t!rm=i_l2n$BC%p74fNYzs59<|6;?f3>Wu`B84K)^^nZ*e3wsIxOPU zY!*{(x>a}nc?4munpSeJJ8qwJC(7k!TKfxl?mlA>^>Xgs-bL+(ksAh47Hxc=(xop4 z%*h*=0!JleRBjduVayd{At?mmOlC+hfpMy_aH13jHK^bO*_B(lK z1YxgI>U2S3>52BCl87pIDG2{)fAR79{_+OX$zBl3xR9C3y@m1IZ-`K bP5#|JjV8PZ_H*2cEW%{pe)>At&mVpO?$UnN literal 0 HcmV?d00001 diff --git a/autotest/ogr/data/miramon/CorruptedFiles/CorruptedPolygon/MultipolygonsP.rel b/autotest/ogr/data/miramon/CorruptedFiles/CorruptedPolygon/MultipolygonsP.rel new file mode 100644 index 000000000000..4336a8b250d1 --- /dev/null +++ b/autotest/ogr/data/miramon/CorruptedFiles/CorruptedPolygon/MultipolygonsP.rel @@ -0,0 +1,108 @@ +[VERSIO] +VersMetaDades=5 +SubVersMetaDades=0 +Vers=4 +SubVers=3 + +[METADADES] +language=cat +MDIdiom=cat +dateStamp=20240418 15565753+0200 +characterSet=006 +nOrganismes=1 +FileIdentifier=1a33d20b-d84d-4f3c-8bb8-02e773d488ed_MultipolygonsP + +[METADADES:ORGANISME_1] +role=009 +IndividualName=Abel Pau +PositionName=Tècnic en SIG +OrganisationName=CREAF + +[IDENTIFICATION] +code=1a33d20b-d84d-4f3c-8bb8-02e773d488ed_MultipolygonsP +codeSpace= +DatasetTitle=Multipolygons + +[OVERVIEW:ASPECTES_TECNICS] +ArcSource=Multipolygons.arc + +[EXTENT] +toler_env=0 +MinX=27.399999937575 +MaxX=44.099999937575 +MinY=34.192500062925 +MaxY=41.662500062925 + +[TAULA_PRINCIPAL] +IdGrafic=ID_GRAFIC +TipusRelacio=RELACIO_1_N_DICC + +[TAULA_PRINCIPAL:ID_GRAFIC] +visible=0 +MostrarUnitats=0 +descriptor=Identificador Gràfic intern + +[TAULA_PRINCIPAL:N_VERTEXS] +visible=0 +MostrarUnitats=0 +descriptor=Nombre de vèrtexs + +[TAULA_PRINCIPAL:PERIMETRE] +visible=0 +descriptor=Perímetre del polígon (projecció) + +[TAULA_PRINCIPAL:PERIMETREE] +unitats=m +descriptor=Perímetre del polígon (el·lipsoide) + +[TAULA_PRINCIPAL:AREA] +visible=0 +descriptor=Àrea del polígon (projecció) + +[TAULA_PRINCIPAL:AREAE] +unitats=m² +descriptor=Àrea del polígon (el·lipsoide) + +[TAULA_PRINCIPAL:N_ARCS] +visible=0 +MostrarUnitats=0 +descriptor=Nombre d'arcs + +[TAULA_PRINCIPAL:N_POLIG] +visible=0 +MostrarUnitats=0 +descriptor=Nombre de polígons elementals + +[TAULA_PRINCIPAL:NUMBER] +unitats= + +[TAULA_PRINCIPAL:INT64] +unitats= + +[TAULA_PRINCIPAL:DOUBLE] +unitats= + +[QUALITY:LINEAGE:PROCESS1] +nOrganismes=1 +history=C:\MiraMon\MM64.exe +date=20240418 15565753+0200 + +[QUALITY:LINEAGE:PROCESS1:ORGANISME_1] +IndividualName=Abel Pau +PositionName=Tècnic en SIG +OrganisationName=CREAF + +[QUALITY:LINEAGE] +processes=1 + +[OVERVIEW] +CreationDate=20240418 15565750+0200 + +[GEOMETRIA_I_TOPOLOGIA] +NomCampNVertexs=N_VERTEXS +NomCampPerimetre=PERIMETRE +NomCampPerimetreEllipsoidal=PERIMETREE +NomCampArea=AREA +NomCampAreaEllipsoidal=AREAE +NomCampNArcs=N_ARCS +NomCampNPoligons=N_POLIG diff --git a/autotest/ogr/data/miramon/CorruptedFiles/NoArcRel/SimpleArcFile.arc b/autotest/ogr/data/miramon/CorruptedFiles/NoArcRel/SimpleArcFile.arc new file mode 100644 index 0000000000000000000000000000000000000000..a5084dcc5b725485e9d8e3cb5f8cc69f76680ef6 GIT binary patch literal 592 zcmZ<^a#k?ZGh|3gDSH?GwbVht)#A2E>Qo1pplciC)G{4HUnXja$@e<2FhBshI=MM7 zn*v{o3DlhZSolylTJJosOwH@x? zwUq|e-@PX|z|_OS4;C(`o8wHluXQ+t@lBnwYgx6!%GnZ)t8|(j$`&5{FZ8X#!7ySu z^J9?~hm4C7c_nRG4wl@~hkM_3!NVs=^oZj(_X!S{+y!?t9It_gl_Y*K->)rU#B;<3r}xpb^rhvLhHEz literal 0 HcmV?d00001 diff --git a/autotest/ogr/data/miramon/CorruptedFiles/NoArcRel/SimpleArcFile.nod b/autotest/ogr/data/miramon/CorruptedFiles/NoArcRel/SimpleArcFile.nod new file mode 100644 index 0000000000000000000000000000000000000000..2b3fa6ee1e50370394723c3eb9280a167191edf6 GIT binary patch literal 172 zcmebCcTq6ZGh|3gDSH?GwbVht)#A2E>Qsj?zNu4oEvt42eVM2wCg1D8!2kh_49pA# pKqiQ;fYJ?6x&um2fYLLd^a3co0!X6+MyLRcW`gozG&7VBq5*xM6Pf@3 literal 0 HcmV?d00001 diff --git a/autotest/ogr/data/miramon/CorruptedFiles/NoArcRel/SimpleArcFileA.dbf b/autotest/ogr/data/miramon/CorruptedFiles/NoArcRel/SimpleArcFileA.dbf new file mode 100644 index 0000000000000000000000000000000000000000..3f8b628456601b93fa883c7a1b3f869e88524409 GIT binary patch literal 789 zcmb7;O%8%E5Jrb+SZUnoz9%5Gr3IGAUr0}6G=x<}r$`SZTvZ?!7Br0Lsrzq=fu>MZXnRn2~> zVf4kI?e8aTOLfce1|0NdI(pAEkNz|XeIAKz`LQo1pplciC)G{4HUnXja$@e<2FhBshI=MM7 zn*v{o3DlhZSolylTJJosOwH@x? zwUq|e-@PX|z|_OS4;C(`o8wHluXQ+t@lBnwYgx6!%GnZ)t8|(j$`&5{FZ8X#!7ySu z^J9?~hm4C7c_nRG4wl@~hkM_3!NVs=^oZj(_X!S{+y!?t9It_gl_Y*K->)rU#B;<3r}xpb^rhvLhHEz literal 0 HcmV?d00001 diff --git a/autotest/ogr/data/miramon/CorruptedFiles/NoNode/SimpleArcFileA.dbf b/autotest/ogr/data/miramon/CorruptedFiles/NoNode/SimpleArcFileA.dbf new file mode 100644 index 0000000000000000000000000000000000000000..3f8b628456601b93fa883c7a1b3f869e88524409 GIT binary patch literal 789 zcmb7;O%8%E5Jrb+SZUnoz9%5Gr3IGAUr0}6G=x<}r$`SZTvZ?!7Br0Lsrzq=fu>MZXnRn2~> zVf4kI?e8aTOLfce1|0NdI(pAEkNz|XeIAKz`LifmSbHG%nT3!Qx`GM zUGJG~heHqB*RaOxb#QfTKxH?eYC%-nGFH!W^(hYSdv8Sre(Qvr|LB0;fx_u^4xaNr zCY1GcIdA~gS}-y&01+6weNBkr>znA{yGPA9OQp%dR8&BU|5*pzT}L-DR<}-Rasb)4 z1E`4!NQ1DHuuoUCOREFSoy(sY)!yRmaHu{}u-Mq85$;Zy`;T~ST9YW-=1{=1XUjX6 z7Px;txb6*opjzRu;BL<4DeCnY=C!#Uo5sIk0^I$V@=Mw{p7%H?Xf64*P_-TIU%uVd zKAU`+9d=kPniM47=K%Bfnxh;csREN6-p-uN_CLD;9xj3#+rAovwmOK1@3PEPnB>6k zX|B$DufqY|zE6uM1zmpvG#46Auy6`G`>G`2PoqP}O}kqSbK4wX;RFjmfwL6`*4t|x X(gN6zt#oa7FnhbkkNsGM1G;$t@$uhR literal 0 HcmV?d00001 diff --git a/autotest/ogr/data/miramon/CorruptedFiles/NoPolRel/SimplePolFile.nod b/autotest/ogr/data/miramon/CorruptedFiles/NoPolRel/SimplePolFile.nod new file mode 100644 index 0000000000000000000000000000000000000000..e5d310c3c0cee2ef29d314c8b4e269060b4f902e GIT binary patch literal 92 zcmebCcTq6ZGi2E98#`I@Yl%af+p%f<8zwmHXlZ`)KDENZbNifmSbHGEDQ+12xKxL zxD3odHX;2;${9RB2A~0${)l<*de3Y-9D3NkhBaQVgWC_%0>dEvZOd3a%hjhiG>W+N z7MK2ZaNm0?D)3t;-2IOZ=p87WUgzLB|6@W~UzY<+FNh8R5^i4;V)*(dIxIVRca6>b zuMWO@)Qq!KnjB0;1*G_&b-?|9bQ5EB>y#!G{SiR@Qo=r6(JrkHr@l^&Y`%Ke0Tc!x Nzz(ti2$(?u1OVn#qZAzevYYmk6ns|Kkt_dLW-d{ z!~QjI`;h9qJjcfU^T(+BZEnkfbdsCeeBBtkuqsrj)2F$q}WWOg2r+Fm~qrI@1e@R5?;CuU6bhEl`u`oUw{m p9#Kr@>{?Boj2&irAr)1#w=wGkH(Fa?5mv&O{Cf>5J&C literal 0 HcmV?d00001 diff --git a/autotest/ogr/ogr_miramon_vector.py b/autotest/ogr/ogr_miramon_vector.py index d58a52573002..19562018b21c 100644 --- a/autotest/ogr/ogr_miramon_vector.py +++ b/autotest/ogr/ogr_miramon_vector.py @@ -102,43 +102,24 @@ def test_ogr_miramon_write_simple_point_EmptyVersion(tmp_vsimem): check_simple_point(ds) -def test_ogr_miramon_write_simple_point_V11(tmp_vsimem): - - out_filename = str(tmp_vsimem / "out.pnt") - gdal.VectorTranslate( - out_filename, - "data/miramon/Points/SimplePoints/SimplePointsFile.pnt", - format="MiraMonVector", - options="-lco Version=V1.1", - ) - ds = gdal.OpenEx(out_filename, gdal.OF_VECTOR) - check_simple_point(ds) - - -def test_ogr_miramon_write_simple_point_V20(tmp_vsimem): - - out_filename = str(tmp_vsimem / "out.pnt") - gdal.VectorTranslate( - out_filename, - "data/miramon/Points/SimplePoints/SimplePointsFile.pnt", - format="MiraMonVector", - options="-lco Version=V2.0", - ) - - ds = gdal.OpenEx(out_filename, gdal.OF_VECTOR) - check_simple_point(ds) - - -def test_ogr_miramon_write_simple_point_last_version(tmp_vsimem): +@pytest.mark.parametrize( + "version", + [ + "V1.1", + "V2.0", + "last_version", + "VX.0", + ], +) +def test_ogr_miramon_write_simple_point_V11(tmp_vsimem, version): out_filename = str(tmp_vsimem / "out.pnt") gdal.VectorTranslate( out_filename, "data/miramon/Points/SimplePoints/SimplePointsFile.pnt", format="MiraMonVector", - options="-lco Version=last_version", + options="-lco Version=" + version, ) - ds = gdal.OpenEx(out_filename, gdal.OF_VECTOR) check_simple_point(ds) @@ -865,6 +846,10 @@ def test_ogr_miramon_OpenLanguageArc(Language, expected_description): "Error reading the format in the DBF file", ), ("data/miramon/CorruptedFiles/NoREL/NoREL.pnt", "rel must exist."), + ("data/miramon/CorruptedFiles/NoNode/SimpleArcFile.arc", "Cannot open file"), + ("data/miramon/CorruptedFiles/NoArcRel/SimpleArcFile.arc", "rel must exist"), + ("data/miramon/CorruptedFiles/NoPolRel/SimplePolFile.pol", "rel must exist"), + ("data/miramon/CorruptedFiles/BadCycle/SimplePolFile.pol", "Cannot open file"), ], ) def test_ogr_miramon_corrupted_files(name, message): @@ -875,6 +860,46 @@ def test_ogr_miramon_corrupted_files(name, message): ) +############################################################################### +# features test: unexisting coordinates, unexpected polygon construction + + +@pytest.mark.parametrize( + "name,message", + [ + ( + "data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinatesPoint.pnt", + "Wrong file format", + ), + ( + "data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinates.arc", + "Wrong file format", + ), + ( + "data/miramon/CorruptedFiles/CorruptedCoordinates/CorruptedCoordinates.pol", + "Wrong file format", + ), + ( + "data/miramon/CorruptedFiles/CorruptedPolygon/Multipolygons.pol", + "Wrong polygon format", + ), + ], +) +def test_ogr_miramon_corrupted_features_point(name, message): + + ds = gdal.OpenEx( + name, + gdal.OF_VECTOR, + ) + assert ds is not None, "Failed to get dataset" + lyr = ds.GetLayer(0) + + assert lyr is not None, "Failed to get layer" + with pytest.raises(Exception, match=message): + for f in lyr: + pass + + ############################################################################### # multiregister test @@ -931,6 +956,7 @@ def create_common_attributes(lyr): lyr.CreateField(ogr.FieldDefn("intlistfield", ogr.OFTIntegerList)) lyr.CreateField(ogr.FieldDefn("int64listfield", ogr.OFTInteger64List)) lyr.CreateField(ogr.FieldDefn("doulistfield", ogr.OFTRealList)) + lyr.CreateField(ogr.FieldDefn("datefield", ogr.OFTDate)) def assign_common_attributes(f): @@ -942,6 +968,7 @@ def assign_common_attributes(f): f["intlistfield"] = [123456789] f["int64listfield"] = [12345678912345678] f["doulistfield"] = [1.5, 4.2] + f["datefield"] = "2024/04/24" def check_common_attributes(f): @@ -953,6 +980,16 @@ def check_common_attributes(f): assert f["intlistfield"] == [123456789] assert f["int64listfield"] == [12345678912345678] assert f["doulistfield"] == [1.5, 4.2] + assert f["datefield"] == "2024/04/24" + + +def open_ds_lyr_0_feature_0(layername): + ds = ogr.Open(layername) + assert ds is not None, "Failed to get dataset" + lyr = ds.GetLayer(0) + assert lyr is not None, "Failed to get layer" + f = lyr.GetNextFeature() + return ds, lyr, f def test_ogr_miramon_write_basic_polygon(tmp_path): @@ -972,11 +1009,7 @@ def test_ogr_miramon_write_basic_polygon(tmp_path): ds = None layername = filename + "/test.pol" - ds = ogr.Open(layername) - assert ds is not None, "Failed to get dataset" - lyr = ds.GetLayer(0) - assert lyr is not None, "Failed to get layer" - f = lyr.GetNextFeature() + ds, lyr, f = open_ds_lyr_0_feature_0(layername) assert f["ID_GRAFIC"] == [1, 1] assert f["N_VERTEXS"] == [4, 4] @@ -1011,11 +1044,7 @@ def test_ogr_miramon_write_basic_multipolygon(tmp_path): ds = None layername = filename + "/test.pol" - ds = ogr.Open(layername) - assert ds is not None, "Failed to get dataset" - lyr = ds.GetLayer(0) - assert lyr is not None, "Failed to get layer" - f = lyr.GetNextFeature() + ds, lyr, f = open_ds_lyr_0_feature_0(layername) assert f["ID_GRAFIC"] == [1, 1] assert f["N_VERTEXS"] == [20, 20] @@ -1031,6 +1060,44 @@ def test_ogr_miramon_write_basic_multipolygon(tmp_path): ds = None +def test_ogr_miramon_write_basic_multipolygon_3d(tmp_path): + + filename = str(tmp_path / "DataSetMULTIPOL3d") + ds = ogr.GetDriverByName("MiramonVector").CreateDataSource(filename) + srs = osr.SpatialReference() + srs.ImportFromEPSG(32631) + lyr = ds.CreateLayer("test", srs=srs, geom_type=ogr.wkbUnknown) + create_common_attributes(lyr) + f = ogr.Feature(lyr.GetLayerDefn()) + assign_common_attributes(f) + + f.SetGeometry( + ogr.CreateGeometryFromWkt( + "MULTIPOLYGON Z (((0 0 3,0 5 3,5 5 4,5 0 5,0 0 3), (1 1 6,2 1 3,2 2 9.2,1 2 3.14,1 1 6), (3 3 1,4 3 12,4 4 21,3 4 2,3 3 1)),((5 6 2,5 7 2,6 7 3,6 6 3,5 6 2)))" + ) + ) + + lyr.CreateFeature(f) + f = None + ds = None + + layername = filename + "/test.pol" + ds, lyr, f = open_ds_lyr_0_feature_0(layername) + + assert f["ID_GRAFIC"] == [1, 1] + assert f["N_VERTEXS"] == [20, 20] + assert f["PERIMETRE"] == [32, 32] + assert f["AREA"] == [24, 24] + assert f["N_ARCS"] == [4, 4] + assert f["N_POLIG"] == [4, 4] + check_common_attributes(f) + assert ( + f.GetGeometryRef().ExportToIsoWkt() + == "MULTIPOLYGON Z (((0 0 3,0 5 3,5 5 4,5 0 5,0 0 3),(1 1 6,2 1 3,2 2 9.2,1 2 3.14,1 1 6),(3 3 1,4 3 12,4 4 21,3 4 2,3 3 1)),((5 6 2,5 7 2,6 7 3,6 6 3,5 6 2)))" + ) + ds = None + + def test_ogr_miramon_write_basic_linestring(tmp_path): filename = str(tmp_path / "DataSetLINESTRING") @@ -1048,11 +1115,7 @@ def test_ogr_miramon_write_basic_linestring(tmp_path): ds = None layername = filename + "/test.arc" - ds = ogr.Open(layername) - assert ds is not None, "Failed to get dataset" - lyr = ds.GetLayer(0) - assert lyr is not None, "Failed to get layer" - f = lyr.GetNextFeature() + ds, lyr, f = open_ds_lyr_0_feature_0(layername) assert f["ID_GRAFIC"] == [0, 0] assert f["N_VERTEXS"] == [3, 3] @@ -1081,11 +1144,7 @@ def test_ogr_miramon_write_basic_linestringZ(tmp_path): ds = None layername = filename + "/test.arc" - ds = ogr.Open(layername) - assert ds is not None, "Failed to get dataset" - lyr = ds.GetLayer(0) - assert lyr is not None, "Failed to get layer" - f = lyr.GetNextFeature() + ds, lyr, f = open_ds_lyr_0_feature_0(layername) assert f["ID_GRAFIC"] == [0, 0] assert f["N_VERTEXS"] == [3, 3] @@ -1116,11 +1175,7 @@ def test_ogr_miramon_write_basic_multilinestring(tmp_path): ds = None layername = filename + "/test.arc" - ds = ogr.Open(layername) - assert ds is not None, "Failed to get dataset" - lyr = ds.GetLayer(0) - assert lyr is not None, "Failed to get layer" - f = lyr.GetNextFeature() + ds, lyr, f = open_ds_lyr_0_feature_0(layername) assert f["ID_GRAFIC"] == [0, 0] assert f["N_VERTEXS"] == [3, 3] @@ -1143,13 +1198,20 @@ def test_ogr_miramon_write_basic_multilinestring(tmp_path): ds = None -def test_ogr_miramon_write_basic_point(tmp_path): +@pytest.mark.parametrize( + "DBFEncoding", + [ + "UTF8", + "ANSI", + ], +) +def test_ogr_miramon_write_basic_point(tmp_path, DBFEncoding): filename = str(tmp_path / "DataSetPOINT") ds = ogr.GetDriverByName("MiramonVector").CreateDataSource(filename) srs = osr.SpatialReference() srs.ImportFromEPSG(32631) - options = ["DBFEncoding=UTF8"] + options = ["DBFEncoding=" + DBFEncoding] lyr = ds.CreateLayer("test", srs=srs, geom_type=ogr.wkbUnknown, options=options) create_common_attributes(lyr) f = ogr.Feature(lyr.GetLayerDefn()) @@ -1165,11 +1227,7 @@ def test_ogr_miramon_write_basic_point(tmp_path): ds = None layername = filename + "/test.pnt" - ds = ogr.Open(layername) - assert ds is not None, "Failed to get dataset" - lyr = ds.GetLayer(0) - assert lyr is not None, "Failed to get layer" - f = lyr.GetNextFeature() + ds, lyr, f = open_ds_lyr_0_feature_0(layername) assert f["ID_GRAFIC"] == [0, 0] check_common_attributes(f) @@ -1205,11 +1263,7 @@ def test_ogr_miramon_write_basic_pointZ(tmp_path): ds = None layername = filename + "/test.pnt" - ds = ogr.Open(layername) - assert ds is not None, "Failed to get dataset" - lyr = ds.GetLayer(0) - assert lyr is not None, "Failed to get layer" - f = lyr.GetNextFeature() + ds, lyr, f = open_ds_lyr_0_feature_0(layername) assert f["ID_GRAFIC"] == [0, 0] check_common_attributes(f) @@ -1242,11 +1296,7 @@ def test_ogr_miramon_write_basic_multipoint(tmp_path): ds = None layername = filename + "/test.pnt" - ds = ogr.Open(layername) - assert ds is not None, "Failed to get dataset" - lyr = ds.GetLayer(0) - assert lyr is not None, "Failed to get layer" - f = lyr.GetNextFeature() + ds, lyr, f = open_ds_lyr_0_feature_0(layername) assert f["ID_GRAFIC"] == [0, 0] check_common_attributes(f) @@ -1259,3 +1309,61 @@ def test_ogr_miramon_write_basic_multipoint(tmp_path): assert f.GetGeometryRef().ExportToIsoWkt() == "POINT (1 0)" ds = None + + +def test_ogr_miramon_write_basic_multigeometry(tmp_path): + + filename = str(tmp_path / "DataSetMULTIGEOM") + ds = ogr.GetDriverByName("MiramonVector").CreateDataSource(filename) + srs = osr.SpatialReference() + srs.ImportFromEPSG(32631) + lyr = ds.CreateLayer("test", srs=srs, geom_type=ogr.wkbUnknown) + create_common_attributes(lyr) + f = ogr.Feature(lyr.GetLayerDefn()) + assign_common_attributes(f) + + f.SetGeometry(ogr.CreateGeometryFromWkt("POINT (0 0)")) + lyr.CreateFeature(f) + + f.SetGeometry(ogr.CreateGeometryFromWkt("LINESTRING (0 0,0 1,1 1)")) + lyr.CreateFeature(f) + + f.SetGeometry( + ogr.CreateGeometryFromWkt( + "MULTIPOLYGON (((0 0,0 5,5 5,5 0,0 0), (1 1,2 1,2 2,1 2,1 1), (3 3,4 3,4 4,3 4,3 3)),((5 6,5 7,6 7,6 6,5 6)))" + ) + ) + lyr.CreateFeature(f) + + f = None + ds = None + + layername = filename + "/test.pnt" + ds, lyr, f = open_ds_lyr_0_feature_0(layername) + + assert f["ID_GRAFIC"] == [0, 0] + check_common_attributes(f) + assert f.GetGeometryRef().ExportToIsoWkt() == "POINT (0 0)" + + ds = None + + layername = filename + "/test.arc" + ds, lyr, f = open_ds_lyr_0_feature_0(layername) + + assert f["ID_GRAFIC"] == [0, 0] + check_common_attributes(f) + assert f.GetGeometryRef().ExportToIsoWkt() == "LINESTRING (0 0,0 1,1 1)" + + ds = None + + layername = filename + "/test.pol" + ds, lyr, f = open_ds_lyr_0_feature_0(layername) + + assert f["ID_GRAFIC"] == [1, 1] + check_common_attributes(f) + assert ( + f.GetGeometryRef().ExportToIsoWkt() + == "MULTIPOLYGON (((0 0,0 5,5 5,5 0,0 0),(1 1,2 1,2 2,1 2,1 1),(3 3,4 3,4 4,3 4,3 3)),((5 6,5 7,6 7,6 6,5 6)))" + ) + + ds = None diff --git a/ogr/ogrsf_frmts/miramon/mm_wrlayr.c b/ogr/ogrsf_frmts/miramon/mm_wrlayr.c index adf5c5d295f7..816df6bcb580 100644 --- a/ogr/ogrsf_frmts/miramon/mm_wrlayr.c +++ b/ogr/ogrsf_frmts/miramon/mm_wrlayr.c @@ -369,80 +369,6 @@ static int MMWriteHeader(FILE_TYPE *pF, struct MM_TH *pMMHeader) return 0; } -void MMInitHeader(struct MM_TH *pMMHeader, int layerType, int nVersion) -{ - memset(pMMHeader, 0, sizeof(*pMMHeader)); - switch (nVersion) - { - case MM_32BITS_VERSION: - pMMHeader->aLayerVersion[0] = '0'; - pMMHeader->aLayerVersion[1] = '1'; - pMMHeader->aLayerSubVersion = '1'; - break; - case MM_64BITS_VERSION: - case MM_LAST_VERSION: - default: - pMMHeader->aLayerVersion[0] = '0'; - pMMHeader->aLayerVersion[1] = '2'; - pMMHeader->aLayerSubVersion = '0'; - break; - } - switch (layerType) - { - case MM_LayerType_Point: - pMMHeader->aFileType[0] = 'P'; - pMMHeader->aFileType[1] = 'N'; - pMMHeader->aFileType[2] = 'T'; - break; - case MM_LayerType_Point3d: - pMMHeader->aFileType[0] = 'P'; - pMMHeader->aFileType[1] = 'N'; - pMMHeader->aFileType[2] = 'T'; - pMMHeader->bIs3d = 1; - break; - case MM_LayerType_Arc: - pMMHeader->aFileType[0] = 'A'; - pMMHeader->aFileType[1] = 'R'; - pMMHeader->aFileType[2] = 'C'; - break; - case MM_LayerType_Arc3d: - pMMHeader->aFileType[0] = 'A'; - pMMHeader->aFileType[1] = 'R'; - pMMHeader->aFileType[2] = 'C'; - pMMHeader->bIs3d = 1; - break; - case MM_LayerType_Pol: - pMMHeader->aFileType[0] = 'P'; - pMMHeader->aFileType[1] = 'O'; - pMMHeader->aFileType[2] = 'L'; - break; - case MM_LayerType_Pol3d: - pMMHeader->aFileType[0] = 'P'; - pMMHeader->aFileType[1] = 'O'; - pMMHeader->aFileType[2] = 'L'; - pMMHeader->bIs3d = 1; - break; - default: - break; - } - pMMHeader->nElemCount = 0; - pMMHeader->hBB.dfMinX = MM_UNDEFINED_STATISTICAL_VALUE; - pMMHeader->hBB.dfMaxX = -MM_UNDEFINED_STATISTICAL_VALUE; - pMMHeader->hBB.dfMinY = MM_UNDEFINED_STATISTICAL_VALUE; - pMMHeader->hBB.dfMaxY = -MM_UNDEFINED_STATISTICAL_VALUE; - - pMMHeader->Flag = MM_CREATED_USING_MIRAMON; // Created from MiraMon - if (pMMHeader->bIs3d) - pMMHeader->Flag |= MM_LAYER_3D_INFO; // 3D - - if (pMMHeader->bIsMultipolygon) - pMMHeader->Flag |= MM_LAYER_MULTIPOLYGON; // Multipolygon. - - if (pMMHeader->aFileType[0] == 'P' && pMMHeader->aFileType[1] == 'O' && - pMMHeader->aFileType[2] == 'L') - pMMHeader->Flag |= MM_BIT_5_ON; // Explicital polygons -} - int MMWriteEmptyHeader(FILE_TYPE *pF, int layerType, int nVersion) { struct MM_TH pMMHeader; diff --git a/ogr/ogrsf_frmts/miramon/mm_wrlayr.h b/ogr/ogrsf_frmts/miramon/mm_wrlayr.h index a1d7bbea6307..c9c87e8ad765 100644 --- a/ogr/ogrsf_frmts/miramon/mm_wrlayr.h +++ b/ogr/ogrsf_frmts/miramon/mm_wrlayr.h @@ -125,7 +125,6 @@ int MMInitLayerByType(struct MiraMonVectLayerInfo *hMiraMonLayer); int MMDestroyLayer(struct MiraMonVectLayerInfo *hMiraMonLayer); int MMCloseLayer(struct MiraMonVectLayerInfo *hMiraMonLayer); int MMReadHeader(FILE_TYPE *pF, struct MM_TH *pMMHeader); -void MMInitHeader(struct MM_TH *pMMHeader, int layerType, int nVersion); int MMWriteEmptyHeader(FILE_TYPE *pF, int layerType, int nVersion); int MMReadAHArcSection(struct MiraMonVectLayerInfo *hMiraMonLayer); int MMReadPHPolygonSection(struct MiraMonVectLayerInfo *hMiraMonLayer); diff --git a/ogr/ogrsf_frmts/miramon/ogrmiramonlayer.cpp b/ogr/ogrsf_frmts/miramon/ogrmiramonlayer.cpp index 503e3633860a..82edbc707c68 100644 --- a/ogr/ogrsf_frmts/miramon/ogrmiramonlayer.cpp +++ b/ogr/ogrsf_frmts/miramon/ogrmiramonlayer.cpp @@ -788,6 +788,7 @@ OGRFeature *OGRMiraMonLayer::GetFeature(GIntBig nFeatureId) // Get X,Y (z). MiraMon has no multipoints if (MMGetGeoFeatureFromVector(phMiraMonLayer, nIElem)) { + CPLError(CE_Failure, CPLE_AppDefined, "Wrong file format."); delete poGeom; return nullptr; } @@ -806,6 +807,7 @@ OGRFeature *OGRMiraMonLayer::GetFeature(GIntBig nFeatureId) // Get X,Y (Z) n times MiraMon has no multilines if (MMGetGeoFeatureFromVector(phMiraMonLayer, nIElem)) { + CPLError(CE_Failure, CPLE_AppDefined, "Wrong file format."); delete poGeom; return nullptr; } @@ -843,17 +845,18 @@ OGRFeature *OGRMiraMonLayer::GetFeature(GIntBig nFeatureId) // Get X,Y (Z) n times MiraMon has no multilines if (MMGetGeoFeatureFromVector(phMiraMonLayer, nIElem)) { + CPLError(CE_Failure, CPLE_AppDefined, + "Wrong file format."); delete poGeom; return nullptr; } nIVrtAcum = 0; - if (!phMiraMonLayer->bIsPolygon && - !(phMiraMonLayer->ReadFeature.flag_VFG[0] & + if (!(phMiraMonLayer->ReadFeature.flag_VFG[0] & MM_EXTERIOR_ARC_SIDE)) { CPLError(CE_Failure, CPLE_NoWriteAccess, - "\nWrong polygon format."); + "Wrong polygon format."); delete poGeom; return nullptr; } @@ -917,6 +920,8 @@ OGRFeature *OGRMiraMonLayer::GetFeature(GIntBig nFeatureId) // Get X,Y (Z) n times because MiraMon has no multilinetrings if (MMGetGeoFeatureFromVector(phMiraMonLayer, nIElem)) { + CPLError(CE_Failure, CPLE_AppDefined, + "Wrong file format."); delete poGeom; return nullptr; } @@ -929,7 +934,7 @@ OGRFeature *OGRMiraMonLayer::GetFeature(GIntBig nFeatureId) MM_EXTERIOR_ARC_SIDE)) { CPLError(CE_Failure, CPLE_AssertionFailed, - "\nWrong polygon format."); + "Wrong polygon format."); delete poGeom; return nullptr; } @@ -1484,9 +1489,8 @@ OGRErr OGRMiraMonLayer::MMProcessMultiGeometry(OGRGeometryH hGeom, if (poGeom == nullptr) { - CPLError( - CE_Failure, CPLE_AppDefined, - "\nFeatures without geometry not supported by MiraMon writer."); + CPLError(CE_Failure, CPLE_AppDefined, + "Features without geometry not supported by MiraMon writer."); return LOG_ACTION(OGRERR_FAILURE); } @@ -2590,7 +2594,7 @@ OGRErr OGRMiraMonLayer::CreateField(const OGRFieldDefn *poField, int bApproxOK) if (!bApproxOK) { CPLError(CE_Failure, CPLE_AppDefined, - "\nField %s is of an unsupported type: %s.", + "Field %s is of an unsupported type: %s.", poField->GetNameRef(), poField->GetFieldTypeName(poField->GetType())); return OGRERR_FAILURE;