opendatasicilia / tansignari

"T'ansignari e t'appeddiri"
http://tansignari.opendatasicilia.it
Creative Commons Attribution 4.0 International
18 stars 10 forks source link

ricerca di geometry type diverse da MULTIPOLYGON #241

Closed pigreco closed 1 year ago

pigreco commented 1 year ago

Per una verifica, sto cercando nel layer EDIFC_CR_EDF_ME_SR (~500k row), presente nel FileGDB DBGT_10K_22_V01.gdb, la presenza di GeometryType differenti da MULTIPOLYGON, quindi utilizzo questo costrutto:

ogrinfo DBGT_10K_22_V01.gdb -dialect SQLite -sql "SELECT * FROM EDIFC_CR_EDF_ME_SR WHERE ST_GeometryType(SHAPE)!='MULTIPOLYGON'"

ma ottengo uno strano risultato:

Had to open data source read-only.
INFO: Open of `DBGT_10K_22_V01.gdb'
      using driver `OpenFileGDB' successful.

Layer name: SELECT
Geometry: Multi Polygon
Feature Count: 0
Layer SRS WKT:
PROJCRS["RDN2008 / UTM zone 32N",
    BASEGEOGCRS["RDN2008",
        DATUM["Rete Dinamica Nazionale 2008",
            ELLIPSOID["GRS 1980",6378137,298.257222101,
                LENGTHUNIT["metre",1]]],
        PRIMEM["Greenwich",0,
            ANGLEUNIT["degree",0.0174532925199433]],
        ID["EPSG",6706]],
    CONVERSION["UTM zone 32N",
        METHOD["Transverse Mercator",
            ID["EPSG",9807]],
        PARAMETER["Latitude of natural origin",0,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8801]],
        PARAMETER["Longitude of natural origin",9,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8802]],
        PARAMETER["Scale factor at natural origin",0.9996,
            SCALEUNIT["unity",1],
            ID["EPSG",8805]],
        PARAMETER["False easting",500000,
            LENGTHUNIT["metre",1],
            ID["EPSG",8806]],
        PARAMETER["False northing",0,
            LENGTHUNIT["metre",1],
            ID["EPSG",8807]]],
    CS[Cartesian,2],
        AXIS["(E)",east,
            ORDER[1],
            LENGTHUNIT["metre",1]],
        AXIS["(N)",north,
            ORDER[2],
            LENGTHUNIT["metre",1]],
    USAGE[
        SCOPE["GIS."],
        AREA["Italy - onshore and offshore - west of 12°E."],
        BBOX[36.53,5.94,47.04,12]],
    ID["EPSG",7791]]
Data axis to CRS axis mapping: 1,2
Geometry Column = Shape
ClassREF: String (0.0)
SubRegID: String (0.0)
CR_EDF_POR: String (0.0)
Shape_Length: Real (0.0)
Shape_Area: Real (0.0)

intanto, leggo Layer name: SELECT e poi COUNT 0.

Ma se lancio:

ogrinfo -al DBGT_10K_22_V01.gdb EDIFC_CR_EDF_ME_SR | grep MultiSurface

ottengo 75 record.

image

DBGT_10K_22_V01.gdb (+5GB)

pigreco commented 1 year ago

Il mistero si infittisce, ho preso dallo screenshot di sopra valore dell'attributo ClassREF ed eseguito il comando:

ogrinfo DBGT_10K_22_V01.gdb -dialect SQLite -sql "SELECT * FROM EDIFC_CR_EDF_ME_SR WHERE ClassREF = 'EDIFC_600019'"

sotto l'output:

Had to open data source read-only.
INFO: Open of `DBGT_10K_22_V01.gdb'
      using driver `OpenFileGDB' successful.

Layer name: SELECT
Geometry: Multi Polygon
Feature Count: 1
Extent: (482810.544000, 4310434.362000) - (482830.544000, 4310454.362000)
Layer SRS WKT:
PROJCRS["RDN2008 / UTM zone 32N",
    BASEGEOGCRS["RDN2008",
        DATUM["Rete Dinamica Nazionale 2008",
            ELLIPSOID["GRS 1980",6378137,298.257222101,
                LENGTHUNIT["metre",1]]],
        PRIMEM["Greenwich",0,
            ANGLEUNIT["degree",0.0174532925199433]],
        ID["EPSG",6706]],
    CONVERSION["UTM zone 32N",
        METHOD["Transverse Mercator",
            ID["EPSG",9807]],
        PARAMETER["Latitude of natural origin",0,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8801]],
        PARAMETER["Longitude of natural origin",9,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8802]],
        PARAMETER["Scale factor at natural origin",0.9996,
            SCALEUNIT["unity",1],
            ID["EPSG",8805]],
        PARAMETER["False easting",500000,
            LENGTHUNIT["metre",1],
            ID["EPSG",8806]],
        PARAMETER["False northing",0,
            LENGTHUNIT["metre",1],
            ID["EPSG",8807]]],
    CS[Cartesian,2],
        AXIS["(E)",east,
            ORDER[1],
            LENGTHUNIT["metre",1]],
        AXIS["(N)",north,
            ORDER[2],
            LENGTHUNIT["metre",1]],
    USAGE[
        SCOPE["GIS."],
        AREA["Italy - onshore and offshore - west of 12°E."],
        BBOX[36.53,5.94,47.04,12]],
    ID["EPSG",7791]]
Data axis to CRS axis mapping: 1,2
Geometry Column = Shape
ClassREF: String (0.0)
SubRegID: String (0.0)
CR_EDF_POR: String (0.0)
Shape_Length: Real (0.0)
Shape_Area: Real (0.0)
OGRFeature(SELECT):0
  ClassREF (String) = EDIFC_600019
  SubRegID (String) = EDIFC_ME_SR_499558
  CR_EDF_POR (String) = 05
  Shape_Length (Real) = 62.8318530717959
  Shape_Area (Real) = 314.159265358979
  MULTISURFACE (CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING (482820.544 4310454.362,482830.544 4310444.362,482820.544 4310434.362,482810.544 4310444.362,482820.544 4310454.362))))

ultima riga, si legge MULTISURFACE

aborruso commented 1 year ago

Ma se fai il contrario e fai un select count per tutti i multipolygon che risultato hai?

pigreco commented 1 year ago

Ma se fai il contrario e fai un select count per tutti i multipolygon che risultato hai?

ogrinfo DBGT_10K_22_V01.gdb -dialect SQLite -sql "SELECT count(*) FROM EDIFC_CR_EDF_ME_SR"

---
Had to open data source read-only.
INFO: Open of `DBGT_10K_22_V01.gdb'
      using driver `OpenFileGDB' successful.

Layer name: SELECT
Geometry: None
Feature Count: 1
Layer SRS WKT:
(unknown)
count(*): Integer (0.0)
OGRFeature(SELECT):0
  count(*) (Integer) = 499630
ogrinfo DBGT_10K_22_V01.gdb -dialect SQLite -sql "SELECT count(*) FROM EDIFC_CR_EDF_ME_SR WHERE ST_GeometryType(SHAPE)='MULTIPOLYGON'"

---

Had to open data source read-only.
INFO: Open of `DBGT_10K_22_V01.gdb'
      using driver `OpenFileGDB' successful.

Layer name: SELECT
Geometry: None
Feature Count: 1
Layer SRS WKT:
(unknown)
count(*): Integer (0.0)
OGRFeature(SELECT):0
  count(*) (Integer) = 499630

nessuna differenza nel conteggio, ciò mi fa pensare che SQL spaziale non fa differenza tra MULTIPOLYGON e MULTISURFACE

pigreco commented 1 year ago

@aborruso chiudo issue?

aborruso commented 1 year ago

Totò ma non riesci a estrarre un sotto insieme di pochi layer?

5 Gb è troppo.

Se riesci, prima di inviarlo, verifica che il problema permane anche sul file più piccolo.

pigreco commented 1 year ago

@aborruso Qui un FileGDB da 150 MB con solo un layer (EDIFC_CR_EDF_ME_SR)

https://mega.nz/file/UZBV0SYa#CXdNW7qcJoRppL_wvBNLO-_bRzSg7mtBRavKPvmIv-I

ma con questo non riesco a fare nulla neanche ogrinfo -so x_Andy_only_Polygon2.gdb

aborruso commented 1 year ago

ma con questo non riesco a fare nulla neanche ogrinfo -so x_Andy_only_Polygon2.gdb

devi dare ogrinfo -so -al x_Andy_only_Polygon2.gdb EDIFC_CR_EDF_ME_SR

Che faccio su questo?

pigreco commented 1 year ago

Che faccio su questo?

nel layer ci sono circa 500k record di tipo MultiPolygon, ma secondo me ci sono 75 record di tipo Multisurface. Ma non riesco a selezionare le Multisurface usando ogr:

ogrinfo x_Andy_only_Polygon2.gdb -dialect SQLite -sql "SELECT * FROM EDIFC_CR_EDF_ME_SR WHERE ST_GeometryType(SHAPE)!='MULTIPOLYGON'"
aborruso commented 1 year ago

Ok, domani ci guardo. Oggi cena con parenti :)

aborruso commented 1 year ago

Caro @pigreco a me risultano 150 i multisurface

ogrinfo -sql "select count(*) from EDIFC_CR_EDF_ME_SR where OGR_Geometry LIKE 'MULTISURFACE'" x_Andy_only_Polygon2.gdb EDIFC_CR_EDF_ME_SR
pigreco commented 1 year ago

ottimo @aborruso image

pigreco commented 1 year ago

Caro @pigreco a me risultano 150 i multisurface

la tua query non è una query spaziale, ovvero non utilizza funzioni che analizzano la geometria, ma cercano un valore OGR_Geometry LIKE 'MULTISURFACE', giusto?

in altri termini, perché non va ST_GeometryType(SHAPE)!='MULTIPOLYGON' questa?

aborruso commented 1 year ago

in altri termini, perché non va ST_GeometryType(SHAPE)!='MULTIPOLYGON' questa?

totò non ho idea, avevo 5 minuti stamattina e volevo trovare un metodo che ti facesse arrivare all'obiettivo di filtrare.

È una query per tipo di geometria. Quel campo è un campo stringa, diviso per categorie geometriche.

pigreco commented 1 year ago

@aborruso per favore metti un link per l'attributo OGR_Geometry, non riesco a trovare una documentazione, grazie

pigreco commented 1 year ago

trovata:

https://gdal.org/user/ogr_sql_dialect.html#ogr-geometry

pigreco commented 1 year ago

Ricetta fatta e pubblicata

https://tansignari.opendatasicilia.it/ricette/bash/ricerca_geometrytype_ogrinfo/