Я новичок в PostgreSQL / PostGIS. Я оцениваю это, чтобы решить простой алгоритм: Попробуйте найти все точки в радиусе (метрах) . Вот мой стол:
=> \d+ theuser;
Table "public.theuser"
Column | Type | Modifiers | Storage | Description
----------+------------------------+-----------+----------+-------------
id | bigint | not null | plain |
point | geometry | | main |
Indexes:
"theuser_pkey" PRIMARY KEY, btree (id)
"point_index" gist (point)
Referenced by:
...
Has OIDs: no
Я добавляю индекс гистограммы в столбец point
, я не знаю, правильный ли это дизайн.
Все «точки» вставлены с SRID=4326
.
Кажется, есть 2 способа получить очки поблизости:
ST_Distance , ST_Distance_Sphere .
Возьмите 2 , например:
select * from theuser where
ST_distance_sphere(point , ST_GeomFromText('POINT(120.9982 24.788)',4326)) < 100;
Интересно, какой алгоритм использует "point_index
"? Если есть миллионы очков, оба могут выполнить очень быстро?
Еще один вопрос, как я могу запросить SRID ячейки (я искал, не найдя ответа)?
Все, что я могу сделать, это с помощью hibernate-space-postgis, получить «com.vividsolutions.jts.geom.Point
» и получить SRID из возвращенной точки. Как мне сделать запрос в SQL? Спасибо.
Окружающая среда:
=> select version();
version
-----------------------------------------------------------------------------------------------------------
PostgreSQL 8.4.9 on i486-pc-linux-gnu, compiled by GCC gcc-4.4.real (Ubuntu 4.4.3-4ubuntu5) 4.4.3, 32-bit
=> SELECT postgis_lib_version();
postgis_lib_version
---------------------
1.4.0
---- обновлено ----
Спасибо @filiprem, я попробовал это:
=> explain select * from theuser where
ST_distance_sphere(point , ST_GeomFromText('POINT(120.9982 24.788)',4326)) < 100;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------
Seq Scan on theuser (cost=0.00..1.15 rows=3 width=2644)
Filter: (st_distance_sphere(point, '0101000020E610000080B74082E23F5E407D3F355EBAC93840'::geometry) < 100::double precision)
(2 rows)
Как узнать, использует ли он "point_index" gist (point)
? Выживет ли он при поиске большого объема данных?