Mer

Spatial Bli med for å telle poeng i polygoner i lat / lon i PostGIS?

Spatial Bli med for å telle poeng i polygoner i lat / lon i PostGIS?


Jeg har et bord, kaltkjæledyr, med lats og lng-koordinater og variabler og en tabell som ble opprettet ved å laste opp en shapefile, kaltby, med kolonnervenstre, høyre, topp, bunn, lat, lng,oggeom.

lat katte hunder -59,4 42,1 2 0 -58,1 44,3 1 1 -59,7 43,6 0 3 -59,8 42,0 2 1

Jeg lurer på hvordan jeg ville konstruere et spørsmål som vil oppsummere antall katter og hunder innenfor hver grense. Vanligvis vil jeg gjøre en romlig sammenkobling i QGIS, men datasettet mitt er for stort, og det krasjer før jeg blir med på de to.

Jeg er ganske kjent med QGIS og Postgres, men veldig ny for PostGIS. Jeg har laget et spørsmål, men mislyktes i å få svaret jeg trengte:

velg sum (pets.dogs) fra pets, city WHERE ST_Within (pets.dogs, city.geom);

Hvordan gjør jeg dette i PostGIS?


Tar som hypotese at:

  • city.geom er i EPSG: 4326
  • lat, lng i kjæledyrtabell kan også tas som EPSG: 4326
  • At du vil oppsummere antall katter og hunder som er i hver geometri i bordbyen
  • At geomene i tabellbyen ikke overlapper hverandre, eller hvis du overlapper deg, bryr du deg ikke om å telle kjæledyrene to ganger
  • byen har en pk som heter gid
  • Du er ikke interessert i punktene utenfor byens grenser

Spørringen som må bygges bør ta følgende i betraktning:

Konverter lat, lng-koordinater til postgis-geometrier i 4326

VELG ST_SetSRID (ST_MakePoint (lng, lat), 4326) FRA kjæledyr;

Du må bygge et spørsmål som summerer katter og hunder på hver geom:

VELG gid, sum (katter), sum (hunder) FRA by c, pets_with_geom p WHERE ST_Within (p.geom, c.geom) GROUP BY c.gid

For å bygge hele spørringen bruker vi en CTE

MED pets_with_geom AS (VELG katter, hunder, ST_SetSRID (ST_MakePoint (lng, lat), 4326) som geom FRA kjæledyr) VELG gid, sum (katter), sum (hunder) FRA by c, pets_with_geom p HVOR ST_Within (p.geom, c.geom) GROUP BY c.gid

Ved hjelp av disse testdataene:

OPPRETT TABELL kjæledyr (gid SERIAL PRIMARY KEY, lat double precision, lng double precision, dogs int, cats int); INNSETT I kjæledyr (lat, lng, hunder, katter) VERDIER (0,647, -0,977, 1, 1); INNSETT I kjæledyr (lat, lng, hunder, katter) VERDIER (0,673, -0,245, 4, 4); INNSETT I kjæledyr (lat, lng, hunder, katter) VERDIER (0,520, -0,789, 2, 2); OPPRETT TABELL by (gid SERIAL PRIMARY KEY, geom geometry (MULTIPOLYGON, 4326)); INSERT INTO byen (gid, geom) VERDIER (1, '0106000020E610000001000000010300000001000000050000008ACE1C2D1BE2F0BF64DF23728270E73F431C149D395AE6BF64DF23728270E73F1120C30FD548E6BFFE9B075EE536DD3F715074E668D9F0BF6294A978AE59DD3F8ACE1C2D1BE2F0BF64DF23728270E73F'); INSERT INTO byen (gid, geom) VERDIER (2, '0106000020E61000000100000001030000000100000005000000F05CB33A8C32B5BFC2C45A4F42EAE73F40B81BFB1E91B3BFA6C93BBE2E66DC3F189726EFF8BAD8BFB2EF113941B8DB3FB49E84D42F98D8BF2CD067A714B6E73FF05CB33A8C32B5BFC2C45A4F42EAE73F'); INSERT INTO byen (gid, geom) VERDIER (3, '0106000020E61000000100000001030000000100000005000000DC2985EDAD40DF3FF4C0ABDCA6FBE73F1A7EA846B208E03F42D199A36543DC3FD0B2210E8ACECC3F16E8B3530ADBDB3F200E8ACE1C2DCB3F8AB59E84D42FE83FDC2985EDAD40DF3FF4C0ABDCA6FBE73F');

Du kan få disse resultatene:

┌┌────┬┬┬┬┬──────┬┬───────idididididid│ │ sum │ │ ├├id│├id├│├──────├┤┤┤┤ 4 │ │ 1 │ 3 │ 3 │ └───── ┴ ─ ┴ ─ ─ ┴ ┴ 2 2 2 2


Se videoen: Spatial Join- Points to Polygon