Vairāk

OpenStreetMap datu meklēšana palēninās PostGIS

OpenStreetMap datu meklēšana palēninās PostGIS


Esmu importējis OpenStreetMap datus (Eiropa) PostgreSQL 9.1 datu bāzē, izmantojot osm2pgsql, un filtrējis visu, kas paredzēts administratīvajām zonām. Man ir GIST indekss daudzstūra (ceļa) kolonnai. Manā planētas_osm_poligona tabulā ir aptuveni 250 000 rindu.

Es vēlos meklēt, lai atrastu visas administratīvās jomas, kurās atrodas koordinātu kopa. Pašlaik es izmantoju SQL

SELECT osm_id, admin_level, border, name FROM planet_osm_polygon  WHERE ST_Contains (ST_Transform (way, 4326),  ST_GeomFromText ('POINT (val1 val2)', 4326)) ORDER BY admin_level;

Bet vaicājums ir pārāk lēns. Kā es varu optimizēt vaicājumu un/vai datu struktūru?

Dažas lietas, ko esmu apsvēris, ir šādas:

  • Ievietojiet lielākus apgabalus (valstis) citā tabulā un savienojiet tos ar galveno tabulu ar ārējām atslēgām.
  • Mainiet daudzstūra datu tipu no ģeometrijas uz ģeogrāfiju (bet tad man ir jāpārvērš visi uzmeklējumi, jo tie ir atzīmes?).
  • Vienkāršojiet daudzstūrus, izmantojot ST_SimplifyPreserveTopology ().
  • Ja iespējams, pārvietojiet rādītāju uz ātrāku disku vai atmiņu.

Lēnā vaicājuma daļa, iespējams, irST_Contains (ST_Transform (way, 4326),…), postgres ir jāpārveido visi veidi tabulā, lai izpildītu šo vaicājumu. Ir divas iespējas, kā to novērst:

Ja jūsu datubāzes galvenais mērķis ir šāda veida vaicājums, varētu būt efektīvāk atkārtoti importēt un saglabāt ģeometriju kā EPSG: 4326, nevis ESPG: 900913, kas pēc noklusējuma ir osm2pgsql.

Vienkāršāka iespēja ir pārrakstīt vaicājumu, lai pārveidotu vaicājuma ģeometriju, nevis visas ģeometrijas datu bāzē:

SELECT osm_id, admin_level, border, name FROM planet_osm_polygon WHERE ST_Contains (way, ST_Transform (ST_GeomFromText ('POINT (val1 val2)', 4326), 900013)) ORDER BY admin_level;

Skatīties video: How to get Openstreetmap data in shapefile type