问题标签 [spatial-index]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3050 浏览

grails - 如何在 Grails 中实现空间(地理位置)搜索?

我正在使用 MySql 开发 Grails 1.3.2。我需要将某些位置的经纬度存储在数据库中,然后根据用户的当前位置,我需要返回该位置特定半径内的项目。所以,我们基本上有以下要求:

  1. 在用户当前坐标的给定半径内搜索地点
  2. 提供全文搜索。我们目前正在使用可搜索的
  3. 在用户当前坐标的给定半径内进行全文搜索的组合。

我一直在研究我们在这里提供的各种选项,并想知道您对实现这一点有什么看法/建议。我们在这里有各种选择:

  1. Lucene Spatial Search ( http://wiki.apache.org/lucene-java/SpatialSearch ) 并研究如何将它与可搜索一起使用

  2. Grails Solr 插件 ( http://www.grails.org/plugin/solr )。但这不会返回域对象。

  3. Grails Stitches 插件 ( http://www.grails.org/plugin/stitches )。除了作者的网站 ( http://www.philliprhodes.com/content/stitches-30-seconds ) 上没有很多文档。

  4. MySql 空间扩展以及域类所有字段的全文索引。如果我们走这条路,那么我们根本不会使用可搜索的。

  5. Postgres/PostGIS 与 hibernate-spatial 集成 ( http://blog.mollusca.ch/2008/10/4/grails-spatial-data-postgis )

我相信这是任何与地图集成的应用程序中非常基本的要求。

所以,我真的很想知道实现这个功能的最合适的方法。

谢谢

0 投票
2 回答
10969 浏览

sql-server-2008 - 如何加快此 Sql Server 空间查询?

我有(我认为)是一个简单的 Sql Server 空间查询:

抓取存在于某个 4 边多边形内的所有美国州(即网页的 google/bing 地图的视口/边界框)

运行需要 6 秒 :(

这是执行计划....

已移除

过滤器操作的统计数据...

已移除

现在,我只是不知道如何调试这个 .. 找出我需要微调的内容等。我有任何空间索引吗?我相信是这样 ...

我是否需要提供有关GEOGRAPHY返回数据的更多信息?例如。点数等?还是我需要运行profiler并从那里提供一些统计数据?

还是我的 Cells_per_object / Grids 设置不正确(我真的不知道应该将这些值设置为什么,TBH)。

有人可以帮忙吗?请?

更新/编辑:

在下面@Bobs 的第一次回复确认空间索引没有被使用后,因为主键(聚集索引)将比具有 50 奇数行的表上的非聚集索引更快......然后我试图强制空间索引(对于shits-n-giggles):-

...猜猜是什么..查询立即运行。

怎么回事?其他人知道为什么吗?我是否需要为此发布一个查询计划,以帮助解释为什么/什么?

0 投票
0 回答
457 浏览

sql-server - SQL Server 对索引边界框外的空间数据做了什么?

我读过一篇文章说:

(x-min,y-min) 和 (x-max,y-max) 坐标确定边界框的位置和尺寸。边界框之外的空间被视为编号为 0 的单个单元格。

我认为这意味着索引“外部”的所有内容实际上都被索引在一个特殊的地方,所以如果我这样做:

where@MyShape完全在边界框之外,它应该只检查边界框之外的东西(所以它仍然使用索引)。

但后来,文章说:

只有在完全位于边界框内的对象上计算的操作才能受益于空间索引。

这似乎是相反的——如果@MyShape在边界框之外,它将进行全表扫描。

它是哪一个?

0 投票
8 回答
5806 浏览

sql-server - 为什么我在 SQL Server 中的空间搜索比 PostGIS 慢?

我正在努力将一些空间搜索功能从带有 PostGIS 的 Postgres 转移到 SQL Server,我看到一些非常糟糕的性能,即使使用索引也是如此。

我的数据大约有一百万个点,我想找出哪些点在给定的形状内,所以查询看起来像这样:

如果我选择一个相当小的形状,有时我可以得到亚秒级的时间,但如果我的形状相当大(有时是这样),我可以得到超过 5 分钟的时间。如果我在 Postgres 中运行相同的搜索,它们总是不到一秒(事实上,几乎所有搜索都在 200 毫秒以下)。

我在我的索引上尝试了几种不同的网格大小(全部为高、全部为中等、全部为低),每个对象有不同的单元格(16、64、256),无论我做什么,时间都保持相当恒定。我想尝试更多的组合,但我什至不知道该往哪个方向走。每个对象有更多单元格?较少的?一些奇怪的网格大小组合?

我查看了我的查询计划,他们总是使用索引,这根本没有帮助。我什至尝试过不使用索引,它并没有更糟。

有没有人可以就此提供任何建议?我能找到的一切都表明“我们无法就索引给你任何建议,只是尝试一切,也许一个会奏效”,但是创建索引需要 10 分钟,盲目地这样做是浪费大量时间。

编辑:我也在微软论坛上发布了这个。以下是他们要求的一些信息:

我能得到的最好的工作指数是这个:

我在使用索引时遇到了一些问题,但这是不同的。

对于这些测试,我使用 WITH(INDEX(...)) 子句对我的每个索引(测试网格大小和每个对象的单元格的各种设置)进行了测试搜索(我的原始帖子中列出的那个),并且没有任何提示。我还使用每个索引和相同的搜索形状运行 sp_help_spatial_geometry_index。上面列出的索引运行速度最快,并且在 sp_help_spatial_geometry_index 中也被列为最有效的。

运行搜索时,我得到以下统计信息:

我也尝试使用随机点作为数据(因为我无法给出我们的真实数据),但事实证明,这种搜索对于随机数据来说真的很快。这使我们相信我们的问题是网格系统如何处理我们的数据。

我们的数据是整个州的地址,因此有一些非常高密度的区域,但大多是稀疏数据。我认为问题在于网格大小的设置对两者都不起作用。网格设置为HIGH时,索引在低密度区域返回太多单元格,而网格设置为LOW时,网格在高密度区域无用(在 处MEDIUM,它还不错,但仍然不擅长)。

我能够使用索引,它只是没有帮助。每个测试都是在打开“显示实际执行计划”的情况下运行的,它总是显示索引。

0 投票
1 回答
392 浏览

postgresql - 标准 PostgreSQL 安装中是否支持空间索引?

我是 PostgreSQL 新手。

对于PostgreSQL的默认安装(没有像PostGIS这样的扩展),如果我的表中定义了地理字段,那么PostgreSQL支持什么样的索引?

我在手册中没有找到关于空间索引的任何信息。

0 投票
1 回答
819 浏览

mysql - 在 POINT(lat, long) 上提高 MySQL 性能的方法

我有一个应用程序需要查询一个带有经纬度坐标的表,这些坐标是使用 MYSQL 的 POINT 数据类型存储的。

我有一个存储函数,可以在给定 GPS 位置的给定半径内查找附近的纬度和经度。但是,我的表将包含数十万个条目,因此需要优化性能。

我编写了以下存储函数,但从可能的 800,000 多行中返回大约 9,000 行需要大约 4.01 秒。有没有更好的方法来查找附近的 GPS 坐标?

这是我存储的函数:

我对该函数的大部分灵感来自:http ://www.movable-type.co.uk/scripts/latlong-db.html

0 投票
1 回答
1305 浏览

sql-server - 未使用 SQL Server 2008 空间索引

我有一个地理类型的专栏。我创建了一个空间索引,但它没有被使用:

索引是这样创建的:

各个级别的网格密度值不是故意设置为中等。我将它们设置为什么没有区别,如果我查看估计的执行计划,则不使用索引。

[http://blogs.msdn.com/b/isaac/archive/2008/08/29/is-my-spatial-index-being-used.aspx][1]

如果我尝试向查询优化器添加提示

我收到此错误:

查询处理器无法为带有空间索引提示的查询生成查询计划。原因:空间索引不支持谓词中提供的比较器

我的数据库以 SQL Server 2008 (100) 兼容级别运行。

.

0 投票
2 回答
19363 浏览

sql - 如何在我的 SQL Server 2008 查询中指定此 SQL 索引提示?

我不确定在哪里/如何在查询中指定此 SQL 空间索引提示:-

当我运行查询时,它没有使用空间提示。是的,我使用的是最新版本的 SQL Server 2008 r2 (v 10.5.1600.1 )。

因此,为了通过强制提示来比较查询速度,我尝试了...

这行得通,但性能确实很差。我想知道它是否试图使用我的提示进行a.Id = b.Id连接(我不想使用提示)。

有什么建议么?

更新:

添加了查询计划。大部分成本是两个表之间的 JOIN。过滤器(where 子句)占据了第二个最昂贵的部分。

替代文字

0 投票
1 回答
443 浏览

perl - Perl 中的空间索引/R 树支持

有人对在 Perl 中使用 RTree 有任何好的提示吗?是一个纯粹的高性能 RTree 实现还是我可以从 GIS 项目中劫持的东西?或者使用 SQLite 的空间索引支持之类的东西会更容易吗?

干杯

0 投票
2 回答
5481 浏览

algorithm - 使用 Morton 顺序进行最近邻搜索的好处?

在模拟粒子相互作用时,我偶然发现了莫顿顺序(Z 顺序)(维基百科链接)的网格索引,它被认为可以提供有效的最近邻单元搜索。我读过的主要原因是内存中空间接近的单元的几乎顺序排序。

在第一次实现的过程中,我无法思考如何有效地实现最近邻居的算法,尤其是与基本的统一网格相比。

  1. 给定一个单元格 (x,y),获取 8 个相邻单元格索引并计算相应的 z 索引是很简单的。尽管这提供了对元素的恒定访问时间,但必须计算或在预定义的表中查找 z-index(每个轴和 OR'ing 分开)。这怎么可能更有效率?是否真的,按 A[0] -> A 1 -> A[3] -> A[4] -> ...的顺序访问数组 A 中的元素比按 A[1023 的顺序访问更有效] -> A[12] -> A[456] -> A[56] -> ...?

  2. 我期望存在一种更简单的算法来以 z 顺序查找最近的邻居。类似的东西:找到邻居的第一个单元格,迭代。但这不可能是真的,因为这只能在 2^4 大小的块内很好地工作。但是有两个问题:当单元格不在边界上时,可以很容易地确定块的第一个单元格并遍历块中的单元格,但必须检查该单元格是否是最近邻。更糟糕的是,当单元格位于边界上时,必须考虑 2^5 个单元格。我在这里想念什么?是否有一种相对简单有效的算法可以满足我的需求?

第 1 点中的问题很容易测试,但我对所描述的访问模式生成的底层指令不是很熟悉,并且真的很想了解幕后发生的事情。

在此先感谢您的任何帮助、参考等...


编辑:
感谢您澄清第 1 点!因此,通过 Z 排序,相邻单元的缓存命中率平均增加,这很有趣。有没有办法分析缓存命中/未命中率?

关于第 2 点:我应该补充一点,我了解如何为 R^d 中的点云构建莫顿有序数组,其中索引 i = f(x1, x2, ..., xd) 是从逐位隔行扫描等获得的。我试图理解的是是否有比以下天真 ansatz 更好的方法来获取最近的邻居(这里在 d=2 中,“伪代码”):