This is not a a duplicate of the "Count Points in Polygon with Postgis", since in the ST_Contains(geometry geomA, geometry geomB), this case has two geometries (start_geom and end_geom) in geomB, while the other question is about only one geometry.
Input polygon table us_county:
Column | Type | Modifiers
----------+-----------------------------+--------------------------------
gid | integer | not null default nextval('us_county_gid_seq'::regclass)
statefp | character varying(2) | |
geoid | character varying(5) |
name | character varying(100) |
geom | geometry(MultiPolygon,4269) |
Input point table trips:
Column | Type | Modifiers
--------------+----------------------+-----------------------------------
id | integer |
gid | integer | not null default nextval('trips_gid_seq'::regclass)
start_geom | geometry(Point,4326) |
end_geom | geometry(Point,4326) |
I want to use to check if a polygon in us_county could contain both start_geom and end_geom of a trip points.
I've tried the following queries:
1. this query returns an empty result, which is not right
select us_county.name, count(trips.gid)
from trips, us_county
where st_contains(us_county.geom, trips.start_geom) and
st_contains(us_county.geom, trips.end_geom)
group by us_county.name;
2. a second thought is to use ST_Collect() function:
select us_county.name, count(trips.gid)
from trips, us_county
where st_contains(ST_Transform(us_county.geom, 4326),
ST_Collect(trips.start_geom, trips.end_geom))
Group by us_county.name;
But this turns out to be very slow, for 3k polygon and 50k points, the query run over 40min.