大家好我有一个问题:如何在postgis数据库中插入一个带有Ne_latitude,NE_longitude,SW_latitude,SW_longitude的框(矩形),并在顶部构建一个INDEX来检索不同框之间的交集?
提前致谢
我试图利用空间索引.我有一个ips表和一个ip块范围的ip2geo表.我正在尝试从ip2geo表为每个ip分配Geo ID
尝试使用列值进行选择时,不会使用空间索引.
EXPLAIN
SELECT *,
( SELECT locid FROM `ipblocks` i
WHERE MBRCONTAINS(i.ippolygon,
POINTFROMWKB(POINT(h.`ip`, 0))) ) AS locaid
FROM `ips` h LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY h ALL NULL NULL NULL NULL 33279 2 DEPENDENT
SUBQUERY i ALL ipblock_spatialidx NULL NULL NULL 4977388 Using where
在过滤器中使用常量时,将使用索引.
EXPLAIN SELECT *,(SELECT locid FROM `ipblocks` i WHERE
MBRCONTAINS(i.ippolygon, POINTFROMWKB(POINT(3223394542, 0))) ) AS
locaid FROM `ips` h LIMIT 1;
id select_type table type possible_keys …Run Code Online (Sandbox Code Playgroud) 根据他们的文档,空间对象可以是以下内容
POINT(0 0)
LINESTRING(0 0,1 1,1 2)
POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))
MULTIPOINT(0 0,1 2)
MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4))
MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))
GEOMETRYCOLLECTION(POINT(2 3),LINESTRING(2 3,3 4))
Run Code Online (Sandbox Code Playgroud)
但是,没有圆形类型,我可以只存储一个点及其半径.并且具有相同的功能,当我查询该点是否存在于该圈时,我可以获得该圈的边界框.
postgis geospatial spatial-query spatial-index postgresql-9.3
我正在尝试从postgres迁移到sql-server(windows)。但是我不知道ms-sql语法,文档也对我不利。我有一个表“地理编码”,以十进制格式存储纬度和经度数据。我有一个迁移,可以使用postgis索引经纬度较长的数据
create index index_on_geocodes_location ON geocodes using gist (st_geographyfromtext(((('POINT('::text || longitude) || ' '::text) || latitude) || ')'::text))
Run Code Online (Sandbox Code Playgroud)
我很难为sql-server生成等效查询。根据文档,如果列数据类型是地理,则非常容易,但是由于我已经有一个具有十进制数据类型的现有数据库,因此无济于事。
PS:我正在使用Rails迁移来执行查询
我有+ 10k点(纬度,经度),我正在构建一个应用程序,向您显示距离用户位置最近的k点.
我认为这是一个非常普遍的问题,我不想重新发明轮子.我正在学习四叉树.这似乎是解决这个空间问题的好方法.
我正在使用这些工具:
构建Quadtree并不难:http://donar.umiacs.umd.edu/quadtree/points/pointquad.html但是一旦我创建了树并将其保存到db(MySQL或MongoDb),我如何运行查询?
我需要运行这样的查询:
这样做的标准和常用方法是什么?
编辑1:
我已经将+ 10k点加载到MongoDB(地理空间索引)中,乍一看它运行正常.无论如何我发现PostGis:
PostGIS是PostgreSQL对象 - 关系数据库系统的扩展,它允许GIS(地理信息系统)对象存储在数据库中.
所以我想我会试试PostGis.
我也找到了SimpleGeo.您可以在云中存储点/位置,然后通过API查询它们:https://simplegeo.com/docs/tutorials/python#how-do-radial-nearby-query
我正在使用postgresql版本:"在x86_64-unknown-linux-gnu上的PostgreSQL 9.3.1,由gcc(GCC)4.6.3 20120306(Red Hat 4.6.3-2)编译,64位"
我创建了2个表A和B,其中点和多边形作为数据类型.现在我想知道点是否在多边形内部.为此,我试图使用ST_Intersect(A.point_LatLong,B.polygon_abc); 我的查询是:
SELECT A.id
FROM A, B
WHERE A.name = 'callifornia'
AND ST_Intersect(A.point_LatLong , B.polygon_abc);
Run Code Online (Sandbox Code Playgroud)
在这里point_latLong,并polygon_abc在具有表A和B的数据类型点和多边形列名
但是这个查询给出了一个错误:
错误:函数st_intersect(point,polygon)不存在第
3行:WHERE city.city_name ='callifornia'和ST_intersect(city.c ...
提示:没有函数匹配给定的名称和参数类型.您可能需要添加
显式类型演员.
我怎么解决这个问题?我甚至无法在postgresql中使用任何其他空间方法,如st_contains()等,如果您有任何解决方案,请告诉我.
我有一个表'floating_options',我想在列'area_geo'上创建一个空间索引(这是一个sdo_geometry列,当我从floating_options中选择*时,有两行数据按预期显示).
我使用了以下代码,但我收到以下错误.我会非常感谢任何帮助!谢谢!
CREATE INDEX area_idx ON floating_options(area_geo)
INDEXTYPE IS MDSYS.SPATIAL_INDEX;
Error report -
SQL Error: ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-13203: failed to read USER_SDO_GEOM_METADATA view
ORA-13203: failed to read USER_SDO_GEOM_METADATA view
ORA-06512: at "MDSYS.SDO_INDEX_METHOD_10I", line 10
29855. 00000 - "error occurred in the execution of ODCIINDEXCREATE routine"
*Cause: Failed to successfully execute the ODCIIndexCreate routine.
*Action: Check to see if the routine has been coded correctly.
Run Code Online (Sandbox Code Playgroud) 我不是 Postgres/GIS 主题的专家,并且我对大型几何数据库(超过 2000 万条记录)有疑问。首先,我的设置如下所示:
mmt=# select version();
-[ RECORD 1 ]-------------------------------------------------------------------------------------------------------------
version | PostgreSQL 13.2 (Debian 13.2-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
mmt=# select PostGIS_Version();
-[ RECORD 1 ]---+--------------------------------------
postgis_version | 3.1 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
Run Code Online (Sandbox Code Playgroud)
我正在查询的表包含以下列:
mmt=# \d titles
Table "public.titles"
Column | Type | Collation | Nullable | Default
----------------------+--------------------------+-----------+----------+-----------------------------------------
ogc_fid | integer | | not null | nextval('titles_ogc_fid_seq'::regclass)
wkb_geometry | bytea | | |
timestamp | timestamp with time zone | | | …Run Code Online (Sandbox Code Playgroud) 我在一张表上设置了一个空间索引,其中有130万条记录都是地理编码的.这些值存储在地理数据类型列中.我遇到的问题是,当我查询具有空间索引的列时,实际上仍然很慢.例如,在一英里内找到所有帐户大约需要20秒.
以下是运行缓慢的查询示例:
DECLARE @g Geography;
SET @g = (select ci.Geocode from CustomerInformation ci where ci.CIOI = 372658)
DECLARE @region geography = @g.STBuffer(1609.344)
Select top 100 ci.Geocode.STDistance(@g), ci.CIOI
from CustomerInformation ci
where ci.Geocode.Filter(@region) = 1
order by ci.Geocode.STDistance(@g) asc
Run Code Online (Sandbox Code Playgroud)
这是我的创建索引语句:
CREATE SPATIAL INDEX [IX_CI_Geocode] ON [dbo].[CustomerInformation]
(
[Geocode]
)USING GEOGRAPHY_GRID
WITH (
GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = LOW,LEVEL_3 = LOW,LEVEL_4 = LOW),
CELLS_PER_OBJECT = 128, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO
Run Code Online (Sandbox Code Playgroud)
数据是单个州的一部分中的每个房屋.因此,在一英里范围内,我预计会有1000分或更多.我正确索引这个吗?任何帮助都会很棒.
另一个慢查询示例:
DECLARE …Run Code Online (Sandbox Code Playgroud) 根据pgAdmin 4 4.21 文档 \xc2\xbb 创建或修改表 \xc2\xbb
\n\n\n选择gin创建GIN索引。GIN 索引可以提高管理二维几何数据类型和最近邻搜索时的性能
\n
如果我们打算使用最近邻搜索,我们应该为几何列创建一个 Gin 索引,我就是这样做的!
\n然而,在定义 Gin 索引时,它要求操作符类,并且有两个选项(jsonb_path_obs和gin_int_ops),但它们都不适用于几何类型。
有人可以告诉我如何在几何类型列上创建 Gin 索引吗?
\nPS 几何我的意思是 PostGIS\ 的几何列类型
\n我正在尝试执行 Postgres 查询:
SELECT a.a_geom
FROM a
WHERE
ST_within(a.a_geom::geometry,ST_GeomFromText('Polygon((1,1),(4,1),(4,4),(4,1))'));
Run Code Online (Sandbox Code Playgroud)
但是这个查询给出了错误:
错误:解析错误 - 无效的几何
SQL 状态:XX000
提示:“多边形((1,1”<--解析几何中位置 12 处的错误)
spatial-index ×11
geospatial ×8
postgis ×5
postgresql ×4
sql ×4
indexing ×1
mysql ×1
oracle ×1
pgadmin-4 ×1
python ×1
spatial ×1
sql-server ×1
t-sql ×1