10 votos

Actualización de la base de datos de la fila con los puntos que caen dentro de los polígonos

Todos,

Tengo un PostGIS/Postgresql DB que tiene dos tablas. Uno con geometrías y el otro que representa las fronteras de los países como polígonos. Me gustaría añadir el nombre del país que cada punto se cruza con la de cada fila en mi punto de tabla. Tal vez, como una gran consulta de actualización. Creo que es posible hacerlo utilizando la recta de SQL, pero no sé por dónde empezar. Algún consejo sobre esto sería muy apreciado...

Adam

9voto

TorgoGuy Puntos 753

Otra opción, sin necesidad de la función

update points set country = t1.country from 
(
    select points.oid, countries.name as country from
    countries INNER JOIN points on st_contains(countries.wkb_geometry,points.wkb_geometry)
) t1 
where t1.oid = points.oid

Sospecho (aunque yo no lo he probado) que esto va a ser más rápido que el uso de una función anidada como en tu ejemplo.

Mi resultado de la ejecución de explicar (es de esperar que su similar). Si tienes más Seq los resultados del análisis, entonces eso es algo que, quizás, los índices no están del todo bien configurado.

Update on points  (cost=1.18..29.40 rows=121 width=129)"
  ->  Nested Loop  (cost=1.18..29.40 rows=121 width=129)"
        Join Filter: _st_contains(countries.geometry, public.points.geometry)"
        ->  Hash Join  (cost=1.18..2.37 rows=28 width=220)"
              Hash Cond: (public.points.oid = public.points.oid)"
              ->  Seq Scan on points  (cost=0.00..1.08 rows=28 width=114)"
              ->  Hash  (cost=1.08..1.08 rows=28 width=110)"
                    ->  Seq Scan on points  (cost=0.00..1.08 rows=28 width=110)"
        ->  Index Scan using "countries_Idx" on countries  (cost=0.00..0.91 rows=1 width=414)"
              Index Cond: (geometry && public.points.geometry)"

4voto

Santiago Palladino Puntos 2235

OK...me hizo un poco de hacking y se encontró que una FUNCIÓN SQL obtener de mí la mayor parte del camino. Alguien tiene alguna idea sobre cómo tomar este para el puente?

 CREATE OR REPLACE FUNCTION getcountry (
       country_geom geometry
    ) RETURNS TABLE(country text) AS $$
        SELECT b.name as country FROM  
                    geonames d, world_borders b WHERE
                    $1 && b.wkb_geometry 
                    AND intersects($1, b.wkb_geometry) ;
  $$ LANGUAGE SQL;

UPDATE geonames 
    SET country = val
    FROM (SELECT getcountry(point_geom) FROM geonames) AS val

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X