2014-10-23 4 views
0

Я создал таблицу, содержащую список всех почтовых индексов в Соединенных Штатах. Я пытаюсь запросить эту таблицу, чтобы получить список всех почтовых индексов в пределах определенного радиуса заданного почтового индекса. Я использую PostgreSQL 9.3 с расширением PostGIS.Я пытаюсь понять запрос, который я написал для PostgreSQL/PostGIS

Таблица

CREATE TABLE city 
(
    city_id serial NOT NULL, 
    region_id integer, 
    country_id integer, 
    name text NOT NULL, 
    postal_code text, 
    longitude real, 
    latitude real, 
    geom geometry(Point,4326), 
    CONSTRAINT city_id_pk PRIMARY KEY (city_id) 
    WITH (FILLFACTOR=100), 
    CONSTRAINT country_id_fk FOREIGN KEY (country_id) 
     REFERENCES country (country_id) MATCH FULL 
     ON UPDATE NO ACTION ON DELETE NO ACTION, 
    CONSTRAINT region_id_fk FOREIGN KEY (region_id) 
     REFERENCES region (region_id) MATCH FULL 
     ON UPDATE NO ACTION ON DELETE NO ACTION 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE city 
    OWNER TO personnelity092014; 


CREATE INDEX idx_city_geom 
    ON city 
    USING gist 
    (geom); 

Сотворение GeoM Колонка:

SELECT AddGeometryColumn ('public','city','geom',4326,'POINT',2); 

UPDATE city SET geom = ST_PointFromText('POINT(' || longitude || ' ' || latitude || ')', 4326); 

Запросов

SELECT z.postal_code 
    FROM city z, city z2 
    WHERE z2.postal_code = '59801' 
    AND st_expand(z2.geom, .1) && z.geom 
    AND st_distance(z.geom, z2.geom) <= .1; 

OK, большой, он дает мне почтовые индексы, которые вокруг области, поэтому я знаю, что я на правильном пути. Однако, черт возьми .1? Сначала я собирался с 10, думая, что 10 миль (да, правильно), но я получал почтовые коды на всем пути на Аляске (59801 в Монтане), поэтому я знал, что 10 не прав. Я пытаюсь понять, как я могу указать расстояние в милях.

Я искал Google и пробовал некоторые запросы, которые я нашел в своих поисках, но ни один из запросов, которые я пробовал, не работал - большинство из них дало мне почтовые индексы на Аляске. Я начинаю думать, что я, возможно, неправильно создал свой стол geom. Меня больше интересует понимание того, что я написал, вместо того, чтобы кто-то написал запрос, который «просто работает» для меня. Если бы кто-нибудь мог просветить меня, это было бы очень признательно.

ответ

0

Хорошо, поэтому я понял. Если вы будете следовать большинству руководств из поиска Google, вам будет предложено создать столбец геометрии (например, this guide). Однако при выполнении поиска по радиусу кажется, что география - это то, что вы хотите (если у вас нет степени ГИС и на самом деле не знаете, как использовать столбец geom). Фактически, документация PostGIS для ST_DWithin делает это довольно ясным:

Для геометрий: расстояние указано в единицах, определяемых пространственной системой координат геометрии. Для того, чтобы эта функция имела смысл, геометрия источника должна быть одной проекции координат, имеющей тот же SRID.

Для единиц географии в метрах и измерения по умолчанию используются use_spheroid = true (измерение вокруг сфероида WGS 84), для более быстрой проверки use_spheroid = false для измерения по сфере.

Таким образом, имея в виду и не полностью понимая «единицы, определяемые пространственной системой координат геометрий». Я сделал следующее, чтобы создать столбец География:

-- Create the geography column 
ALTER TABLE city ADD COLUMN geography geography(Point,4326); 
-- Populate it 
UPDATE city SET geography = ST_GeographyFromText('SRID=4326;POINT(' || st_x(geom) || ' ' || st_y(geom) || ')'); 

Хорошо, так что теперь, когда я делаю следующий запрос:

SELECT z.postal_code 
FROM city z, city z2 
WHERE z2.postal_code = '59801'  
    AND st_dwithin(z.geography, z2.geography, 16093); 

получить список почтовых индексов в радиусе 16093 м, или ~ 10 миль, 59801. Именно то, что я хотел.

+1

Единицы, определенные пространственной системой координат геометрий, в основном означают либо градусы, либо метры, в зависимости от географического или прогнозируемого. –

+0

используйте 'geom :: geography' для вашего шага« Заполнять его », поскольку он является прямым и преобразует другие типы геометрии. Кроме того, соглашение должно вызывать этот столбец 'geog', но нет ничего плохого в том, чтобы именовать столбец так же, как и тип, как вы это делали. –

Смежные вопросы