Questions tagged «spatial-index»

在数据库中,一种用于基于数据表的空间列优化对数据的访问的机制。

2
在Postgis中获得类似于ArcGIS的速度
我已经使用3/4年的Postgis 2.0了,虽然我真的很喜欢使用它,但是查询处理时间过长,使得它基本上无法用于我的用例。 我倾向于对通常具有成千上万个多面体的市政数据集进行繁重的地理处理。这些多面体的形状有时会非常不规则,每个多面体的范围从4点到78,000点不等。 例如,当我将一个包含329,152个多边形的宗地数据集与包含525个多边形的管辖权数据集相交时,我得到了以下消耗总时间的统计信息: ArcGIS 10.0 (on same host with windows 7 OS): 3 minutes Postgis:56 minutes (not including geometry pre-processing queries) 换句话说,在Postgis中进行此相交所需的时间比在ArcGIS中多1500%,这是我更简单的查询之一! 据说ArcGIS运行速度更快的原因之一是由于索引更好。一些程序员最近弄清楚了这些索引是如何工作的,我想知道是否有人知道如何在Postgis中构建这些索引(或构建可以模拟索引的表)。也许这可以解决Postgis中的大多数速度问题。我只能希望一定有办法,尤其是因为ArcGIS只能使用4 GB的RAM,而我的postgis服务器最多可以使用4倍的内存! 当然,postgis运行缓慢的原因有很多,因此,我将提供系统规格的详细版本: Machine: Dell XPS 8300 Processor: i7-2600 CPU @ 3.40 GHz 3.40 GHz Memory: Total Memory 16.0 GB (10.0 GB on virtual machine) Platform: Ubuntu …

3
如何加快对栅格数据库的查询?
我在postgresql / postgis中有一个带有以下列的栅格数据库: (ID,rast,data_of_data)。 “ rast”是具有WKT格式的栅格文件的列。以下示例查询用于查找WGS84系统(30.424,-1.66)中某个点的DN值(对于2002-01-09): SELECT st_value(rast,(st_GeomFromText('POINT(30.424 -1.66)', 4326))) as val FROM my_table WHERE date_of_data='2002-01-09' 是否有一种方法(例如空间索引)来加快此类查询的速度?

3
在SQL Server 2008上的7000万点云上优化最近邻居查询
我在SQL Server 2008 R2 Express数据库中有大约7500万条记录。每个都是对应某个值的纬度。该表具有“地理位置”列。我正在尝试为给定的经度(点)找到一个最近的邻居。我已经有一个具有空间索引的查询。但是根据记录在数据库中的位置(例如第一季度或最后一个季度),查询可能需要3到30秒才能找到最近的邻居。我认为可以通过优化查询或空间索引来优化此方法,以得到更快的结果。现在,使用默认设置应用了一些空间索引。这是我的表和查询的样子。 CREATE TABLE lidar( [id] [bigint] IDENTITY(1,1) NOT NULL, [POINTID] [int] NOT NULL, [GRID_CODE] [numeric](17, 8) NULL, [geom] [geography] NULL, CONSTRAINT [PK_lidar_1] PRIMARY KEY CLUSTERED ([id] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) …

1
sql server空间索引性能
我有一张桌子,上面有大约200万条记录。我使用边界框以外的默认值创建一个空间索引。我一直注意到,有些查询非常快,有些则非常慢。确定因素出现在查询中使用的多边形的大小。 在较大的搜索区域,使用WITH(INDEX(SIX_FT5))会大大降低查询速度(从0秒降低到15+秒)。在较小的搜索区域中,情况恰恰相反。 这是我正在测试的一些查询: 快速: SELECT TOP(1000) * FROM [FT5] WHERE (shape.STIntersects(geometry::STGeomFromText('POLYGON ((-133462.805381701 -668610.241000959, 2934415.68824241 -668610.241000959, 2934415.68824241 2200521.65831815, -133462.805381701 2200521.65831815, -133462.805381701 -668610.241000959))', 2264)) = 1) 慢: SELECT TOP(1000) * FROM [FT5] WITH(INDEX(SIX_FT5)) WHERE (shape.STIntersects(geometry::STGeomFromText('POLYGON ((-133462.805381701 -668610.241000959, 2934415.68824241 -668610.241000959, 2934415.68824241 2200521.65831815, -133462.805381701 2200521.65831815, -133462.805381701 -668610.241000959))', 2264)) = 1) 有人知道这是怎么回事吗?

1
访问存储Postgis空间索引的内部数据结构(PostGres GiST)
我很好奇Postgis中空间GiST索引的内部数据结构和存储机制。在Oracle中,我曾经喜欢展示SDO索引是如何“仅仅是另一张表”,以及级别是索引的属性,以及索引几何的bbox如何存储为blob(可以提取)。Postgis如何存储索引,在哪里? 系统表http://www.postgresql.org/docs/8.3/static/catalogs.html可用于标识索引,但是我不知道如何访问实际存储(如果它们确实是表)

3
了解RTree使用空间索引的情况?
我在理解RTree的空间索引使用方面遇到麻烦。 示例:我有300个缓冲点,我需要用多边形shapefile知道每个缓冲区的相交区域。多边形shapefile具有> 20,000个多边形。建议我使用空间索引来加快此过程。 所以...如果我为多边形shapefile创建空间索引,它会以某种方式“附加”到文件,还是会独立存在?也就是说,创建完之后,我可以在多边形文件上运行交集函数并获得更快的结果吗?交叉点会“看到”有空间索引并且知道该怎么做吗?还是我需要在索引上运行它,然后通过FID或类似的方法将那些结果关联回我的原始多边形文件? RTree文档对我没有太大帮助(可能是因为我只是在学习编程)。它们显示了如何通过读取手动创建的点,然后针对其他手动创建的点查询索引来创建索引,这些其他点返回包含在窗口中的ID。说得通。但是,他们没有解释这与索引将来自的原始文件之间的关系。 我认为它必须是这样的: 从我的多边形shapefile中为每个多边形要素拉出bbox,并将其放置在空间索引中,为其提供一个与shapefile中的id相同的ID。 查询该索引以获取相交的ID。 然后,仅对通过查询索引确定的原始shapefile中的要素重新运行交集(不知道我将如何做最后一部分)。 我有正确的主意吗?我有什么想念的吗? 现在,我正在尝试使此代码在仅包含一个点要素的一个点shapefile和一个包含> 20,000个面要素的多边形shapefile上工作。 我正在使用Fiona导入shapefile,使用RTree添加空间索引,并尝试使用Shapely进行交点。 我的测试代码如下: #point shapefile representing location of desired focal statistic traps = fiona.open('single_pt_speed_test.shp', 'r') #polygon shapefile representing land cover of interest gl = MultiPolygon([shape(pol['geometry']) for pol in fiona.open('class3_aa.shp', 'r')]) #search area areaKM2 = 20 #create empty spatial index …

3
在MySQL中使用空间索引时性能不佳
重新建议在Stack Overflow上提出的一个问题,这是一个更好的论坛。 我正在尝试进行一些实验,以推动不是地理空间但非常适合的数据集,并且发现结果有些令人不安。数据集是基因组数据,例如人类基因组,其中我们有一个DNA区域,其中诸如基因之类的元素占据特定的起始和终止坐标(我们的X轴)。我们有多个占据Y轴的DNA(染色体)区域。目标是带回沿单个Y坐标与两个X坐标相交的所有项目,例如LineString(START 1,END 2)。 该理论听起来很合理,所以我将其推入了现有的基于MySQL的基因组项目中,并提出了一个表结构,如下所示: CREATE TABLE `spatial_feature` ( `spatial_feature_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `external_id` int(10) unsigned NOT NULL, `external_type` int(3) unsigned NOT NULL, `location` geometry NOT NULL, PRIMARY KEY (`spatial_feature_id`), SPATIAL KEY `sf_location_idx` (`location`) ) ENGINE=MyISAM; external_id表示我们已编码到该表中的实体的标识符并对其进行编码external_type。一切看起来都很不错,我输入了一些初步的数据(30,000行),这些数据似乎运行良好。当它增加到超过300万行标记时,MySQL拒绝使用空间索引,并且在强制使用空间索引时速度较慢(40秒与使用全表扫描的5秒相比)。当添加更多数据时,该索引开始使用,但性能损失仍然存在。强制关闭索引可使查询降低到8秒。我正在使用的查询看起来像: select count(*) from spatial_feature where MBRIntersects(GeomFromText('LineString(7420023 1, 7420023 1)'), location); …

5
加快OpenStreetMap PostGIS查询
我使用渗透模式将荷兰的OpenStreetMap数据加载到PostGIS数据库(PostgreSQL 8.3 / PostGIS 1.3.3)中。这意味着所有标签都存储在hstore字段中。除了渗透在几何字段上创建的GIST索引之外,我还在标签字段上创建了另一个GIST索引。 尝试同时使用空间约束和标签字段约束进行查询时,我发现它比我想要的要慢。这样的查询: SELECT n.geom,n.tags,n.tstamp,u.name FROM nodes AS n INNER JOIN users AS u ON n.user_id = u.id WHERE tags->'man_made'='surveillance' AND ST_Within(geom, ST_GeomFromText('POLYGON((4.0 52.0,5.0 52.0,5.0 53.0,4.0 53.0,4.0 52.0))',4326)); 需要22秒才能返回78条记录。 该表中有大约5300万条记录。 有没有办法大大加快这一步?我听说hstore在PostgreSQL 9中的实现明显更好,升级是否有帮助?

2
ST_Distance不使用索引进行空间查询
即使对于最简单的查询,我也无法在PostgreSQL 9.3.5上运行PostGIS 2.1来使用空间索引。在整个数据集为800万点(人口数电网从这里)。该表创建为 CREATE TABLE points ( population DOUBLE PRECISION NOT NULL, location GEOGRAPHY(4326, POINT) NOT NULL ) CREATE INDEX points_gix ON points USING GIST(location); 查询很简单 SELECT SUM(population) FROM points WHERE ST_Distance( location, ST_GeographyFromText('SRID=4326; POINT(0 0)') ) < 1000 PostgreSQL总是使用Seq扫描,我尝试了10000点的子集-仍然是Seq扫描。有任何想法吗?

1
在QGIS API中保存空间索引?
我正在尝试使用Qgis API为某些shapefile创建空间索引。我已按照内森·伍德罗(Nathan Woodrow)博客(https://nathanw.net/2013/01/04/using-a-qgis-spatial-index-to-speed-up-your-code/)中所述的步骤进行操作,并且效果很好: layer = QgsVectorLayer(path, name, 'ogr') idx = QgsSpatialIndex() all_features = layer.getFeatures() map(idx.insertFeature, all_features) 我的问题是我没有任何结果文件(.qix?.sbn?.sbx?) 如何保存该空间索引,以便Shapefile的未来用户可以从中受益?

4
如何有效访问QgsSpatialIndex返回的功能?
该PyQGIS食谱介绍如何设置空间索引,但只说明了它的用法的一半: 创建空间索引—以下代码创建一个空索引 index = QgsSpatialIndex() 向索引添加功能-索引接受QgsFeature对象,并将其添加到内部数据结构中。您可以手动创建对象,也可以使用上一个调用提供程序的nextFeature()的对象。 index.insertFeature(feat) 一旦空间索引中填充了一些值,就可以进行一些查询 # returns array of feature IDs of five nearest features nearest = index.nearestNeighbor(QgsPoint(25.4, 12.7), 5) 获取属于返回的特征ID的实际特征的最有效步骤是什么?

3
在整个架构的PostGIS中创建空间索引
我已经使用SPIT(QGIS插件)将许多shapefile加载到了PostGIS数据库中。这些图层在加载时没有创建空间索引。我想知道是否有一种方法可以为架构中的每个层创建一个空间索引,而无需为每个层编写查询。我不是一名优秀的PostGIS脚本编写者,因此将不胜感激。 谢谢
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.