Sie haben ein paar Probleme mit Ihrer Anfrage. Der sofortige Fehler wird durch eine nicht übereinstimmende Anzahl von Klammern im ersten Aufruf an ST_Buffer()
verursacht, aber selbst damit korrigiert wird Ihre Abfrage nicht ausgeführt werden; tatsächlich ist dieser erste Anruf eine sehr teure Methode, um die Fläche eines Kreises mit einem Radius von 500 Metern - die 785398.163 Quadratmeter genau ist - genau zu berechnen, so dass Sie diesen Anruf einfach loswerden und den Bereich einstecken können. (Ein zusätzliches Problem, das nun nicht mehr relevant ist, ist, dass Sie einen geometry
durch einen skalaren Wert von ST_Area()
zu teilen versuchten, die offensichtlich nicht möglich ist.)
Ein weiteres Problem ist, dass Sie nicht Tabelle enthalten waren lehd_map
in Ihrem FROM
Klausel; Ich habe es hier durch einen JOIN hinzugefügt.
SELECT geoid AS destination,
lehd_graph.h_geocode AS origin,
lehd_graph.S000 AS population,
785398.163/ST_Area(lehd_map.the_geom_webmercator)) AS fraction
FROM lehd
LEFT JOIN lehd_graph USING (w_geocode)
JOIN lehd_map ON ST_Intersects(lehd_map.the_geom_webmercator,
ST_Buffer(
ST_Transform(
ST_SetSRID(
ST_Point(-74.01128768920898, 40.739843698929995),
4326),
3857),
500)
);
Wenn Sie ein ungutes Gefühl über den Puffer des Punktes und den Bereich des Puffers zu trennen, dann könnte man sie in einem WAK kombinieren zu betonen, wie der Bereich mit dem gepufferten Punkt zusammenhängt:
WITH pt(geom, area) AS (
VALUES (ST_Buffer(
ST_Transform(
ST_SetSRID(
ST_Point(-74.01128768920898, 40.739843698929995), 4326), 3857), 500),
785398.163) -- 500 x 500 x pi: area of the buffer around the point
)
SELECT geoid AS destination,
lehd_graph.h_geocode AS origin,
lehd_graph.S000 AS population,
pt.area/ST_Area(lehd_map.the_geom_webmercator) AS fraction
FROM pt
JOIN lehd ON true
LEFT JOIN lehd_graph USING (w_geocode)
JOIN lehd_map ON ST_Intersects(lehd_map.the_geom_webmercator, pt.geom);
Ich kenne die Geocode API von Postgres nicht gut genug, um diese Art von Antwort zu geben, aber es sieht auf dem richtigen Weg! –