2016-05-17 6 views
0

Ich versuche herauszufinden, wie Sie eine Abfrage erstellen, die nach Punkten innerhalb eines Polygons fragt. Mein Setup ist eine postgreSQL 9.5-Instanz mit einer installierten PostGIS 2.2.2-Erweiterung. Theoretisch ist das nicht wirklich schwierig, wie es in der PostGIS documentation gezeigt wird, aber ich bin nicht in der Lage, ein Ergebnis zu erhalten.Abfrage für räumliche Schnittmenge (Punkt - Polygone in Spalte) mit PostgreSQL und PostGIS

Ich habe die folgende Tabelle erstellt:

CREATE TABLE app_db.testTable 
(
    message_text text, 
    message_picture text, 
    message_date timestamp with time zone DEFAULT now(), 
    message_id uuid NOT NULL DEFAULT uuid_generate_v4(), 
    message_position app_db.geometry, 
    message_radius integer, 
    message_circle app_db.geometry, 
    message_userid uuid, 
    CONSTRAINT messages_pkey PRIMARY KEY (message_id) 
) 

I PostGIS mit folgendem Befehl für meine Schemen aktiviert haben:

CREATE EXTENSION postgis SCHEMA app_db; 

Und ich habe habe einige Beispiel-Datensätze in der obigen erwähnte Tabelle. So weit so gut.

Nicht Ich versuche, eine Abfrage zu erstellen, die für alle Daten fragen sollte, wo der definierte Punkt einer der Spalte in meiner Tabelle app_db gespeicherten Geometrien schneidet -> message.circle: Soweit ich Ich verstehe, dass ST_Intersects zwei Geometrien als Parameter benötigt, aber wie führe ich eine Abfrage in Bezug auf eine vollständige Spalte durch?

Antwort

2

Beachten Sie, dass normalerweise Leute postgis in public und/oder haben die installierte Schema auf dem search_path installieren, so brauchen Sie keine vollständige Pfade wie app_db.ST_Intersects zu bieten. Für die folgenden Beispiele nehme ich SET search_path TO app_db;, um es einfacher zu machen.

Um alle Punkte in message_position von einem einzelnen Polygon in message_circle zu wählen:

SELECT p.* 
FROM testTable p 
JOIN testTable c ON c.message_id='the id of the circle' 
    AND p.message_id <> c.message_id 
    AND ST_Intersects(p.message_position, c.message_circle); 

Ich bin nicht sicher, wie message_circle gemacht wurde, aber wenn es aus message_position und message_radius erstellt wurde, dann ein besserer Weg zu verwenden ST_DWithin, die eine Abstandsschwelle verwendet, anstatt eine teurere und unvollständige Geometrieanalyse.

SELECT p.* 
FROM testTable p 
JOIN testTable c ON c.message_id='the id of the circle' 
    AND p.message_id <> c.message_id 
    AND ST_DWithin(p.message_position, c.message_position, c.message_radius); 

Es kann durch die Schaffung eines GiST räumlichen Index auf message_position beschleunigt werden.

+0

Danke! Das war genau das, was ich gesucht habe! Besonders der Hinweis zur Performance ist sehr hilfreich :) – schlomm