|
If I understood correctly your target the pure SQL would be something like this code in M9. This one is not altering some of your attribute that might be corrected as the surface or the densities maybe. It runs in a second on my laptop. I used "touches" instead of a minimal distance like you did, but easily changed... -- ADD INDEX ON COLUMNS OF INTEREST (GROUP BY, WHERE AND JOIN CLAUSES) ALTER TABLE [Pee Table] ( ADD INDEX [lot_x] BTREEDUP ([NO_LOT] COLLATE 'neutral') ); -- CREATE NEW TABLE WITH THE MERGED AREAS SELECT BIGAREAS.[mfd_id],[ID],[NO_LOT],[No_seq],[code_ess],[Age_simple],[DENSITE],[HAUTEUR],[ORIGINE],[An_orig],[PERTURB],[An_pertur],[volume],[ETA_ESS_PC],[lot_id],[sup_m2],[type],[Shape_Area],[Uuid_64], CASE WHEN FULLGEOM IS NULL THEN [Geom (I)] ELSE FULLGEOM END AS [Geom (I)] INTO NEWPEE FROM ( -- IDENTIFY BIGGER AREAS SELECT [PEE].*, GeomArea([Geom (I)], 0) AS GEOMAREA FROM [PEE] WHERE GeomArea([Geom (I)], 0) >= 100 ) AS BIGAREAS LEFT JOIN ( -- MERGING BIGAREA WITH ALL THE SMALLS TOUCHING SELECT BIGID, INLINE GeomUnionAreas(FIRST(BIGGEOM), GeomUnionAreas(SMALLGEOM)) AS FULLGEOM FROM ( SELECT BIGAREAS.mfd_id AS BIGID, SMALLID, BIGAREAS.[Geom (I)] AS BIGGEOM, SMALLGEOM FROM ( -- RETRIEVE COUPLES OF SMALL-BIG USING THE BIGGER TOUCHING AREA ONLY SELECT SMALLAREAS.[mfd_id] AS SMALLID, FIRST(SMALLAREAS.[Geom (I)]) AS SMALLGEOM, SPLIT ( COLLECT BIGAREAS.mfd_id, BIGAREAS.[Geom (I)] ORDER BY GEOMAREA FETCH 1) FROM ( -- IDENTIFY SMALL AREAS SELECT * FROM [PEE] WHERE GeomArea([Geom (I)], 0) < 100 ) AS SMALLAREAS INNER JOIN ( -- IDENTIFY BIGGER AREAS SELECT [PEE].*, GeomArea([Geom (I)], 0) AS GEOMAREA FROM [PEE] WHERE GeomArea([Geom (I)], 0) >= 100 ) AS BIGAREAS ON SMALLAREAS.[NO_LOT] = BIGAREAS.[NO_LOT] AND GeomTouches(SMALLAREAS.[Geom (I)], BIGAREAS.[Geom (I)],0) GROUP BY SMALLAREAS.[mfd_id] ) ) AS NEWGEOM GROUP BY BIGID ) AS NEWGEOMS ON BIGAREAS.mfd_id = BIGID ; ALTER TABLE [NEWPEE] ( ADD PROPERTY 'FieldCoordSystem.Geom (I)' 'EPSG:32198' ); CREATE DRAWING [NEWPEE Drawing] ( PROPERTY 'FieldGeom' 'Geom (I)', PROPERTY 'Table' '[NEWPEE]' );
|