问题标签 [spatial-query]

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 投票
3 回答
14448 浏览

sql-server-2008 - 选择具有大多边形的良好 SQL Server 2008 空间索引

我正在尝试为我正在处理的数据集选择一个体面的 SQL Server 2008 空间索引设置,这很有趣。

数据集是多边形,代表整个地球的轮廓。表中有 106,000 行,多边形存储在几何字段中。

我遇到的问题是许多多边形覆盖了地球的很大一部分。这似乎很难获得将消除主过滤器中的许多行的空间索引。例如,查看以下查询:

这是查询与表中仅两个多边形相交的区域。无论我选择哪种空间索引设置组合,Filter() 总是返回大约 60,000 行。

用 STIntersects() 替换 Filter() 当然只返回我想要的两个多边形,但当然需要更长的时间(Filter() 是 6 秒,STIntersects() 是 12 秒)。

谁能给我任何提示,说明是否存在可能改进 60,000 行的空间索引设置,或者我的数据集是否与 SQL Server 的空间索引不匹配?

更多信息:

按照建议,我在全球使用 4x4 网格将多边形拆分。我看不到使用 QGIS 的方法,所以我编写了自己的查询来做到这一点。首先我定义了 16 个边界框,第一个看起来像这样:

然后我使用每个边界框来选择和截断与该框相交的多边形:

我显然对 4x4 网格中的所有 16 个边界框都这样做了。最终结果是我有一个大约 107,000 行的新表(这证实了我实际上并没有很多巨大的多边形)。

我添加了一个空间索引,每个对象有 1024 个单元格,每个级别的单元格为低、低、低、低。

然而,非常奇怪的是,这个带有分割多边形的新表的性能仍然与旧表相同。执行上面列出的 .Filter仍会返回约 60,000 行。我真的完全不明白这一点,显然我不明白空间索引是如何工作的。

矛盾的是,虽然 .Filter() 仍然返回约 60,000 行,但它提高了性能。.Filter() 现在需要大约 2 秒而不是 6 秒,.STIntersects() 现在需要 6 秒而不是 12 秒。

此处要求是索引的 SQL 示例:

尽管请记住,我已经为每个对象的网格和单元格尝试了一系列不同的设置,每次都得到相同的结果。

以下是运行 sp_help_spatial_geometry_index 的结果,这是在我的拆分数据集上,其中没有单个多边形占据地球的 1/16 以上:

Base_Table_Rows 215138 Bounding_Box_xmin -90 Bounding_Box_ymin -180 Bounding_Box_xmax 90 Bounding_Box_ymax 180 Grid_Size_Level_1 64 Grid_Size_Level_2 64 Grid_Size_Level_3 64 Grid_Size_Level_4 64 CELLS_PER_OBJECT 16个Total_Primary_Index_Rows 378650个Total_Primary_Index_Pages 1129 Average_Number_Of_Index_Rows_Per_Base_Row 1 Total_Number_Of_ObjectCells_In_Level0_For_QuerySample 1 Total_Number_Of_ObjectCells_In_Level0_In_Index 60956 Total_Number_Of_ObjectCells_In_Level1_In_Index 361 Total_Number_Of_ObjectCells_In_Level2_In_Index 2935 Total_Number_Of_ObjectCells_In_Level3_In_Index 32420 Total_Number_Of_ObjectCells_In_Level4_In_Index 281978 Total_Number_Of_Interior_ObjectCells_In_Level2_In_Index 1 Total_Number_Of_Interior_ObjectCells_In_Level3_In_Index 49 Total_Number_Of_Interior_ObjectCells_In_Level4_In_Index4236 Total_Number_Of_Intersecting_ObjectCells_In_Level1_In_Index 29 Total_Number_Of_Intersecting_ObjectCells_In_Level2_In_Index 1294 Total_Number_Of_Intersecting_ObjectCells_In_Level3_In_Index 29680 Total_Number_Of_Intersecting_ObjectCells_In_Level4_In_Index 251517 Total_Number_Of_Border_ObjectCells_In_Level0_For_QuerySample 1 Total_Number_Of_Border_ObjectCells_In_Level0_In_Index 60956 Total_Number_Of_Border_ObjectCells_In_Level1_In_Index 332 Total_Number_Of_Border_ObjectCells_In_Level2_In_Index 1640 Total_Number_Of_Border_ObjectCells_In_Level3_In_Index 2691 Total_Number_Of_Border_ObjectCells_In_Level4_In_Index 26225 Interior_To_Total_Cells_Normalized_To_Leaf_Grid_Percentage 0.004852925 Intersecting_To_Total_Cells_Normalized_To_Leaf_Grid_Percentage 0.288147586 Border_To_Total_Cells_Normalized_To_Leaf_Grid_Percentage 99。70699949 Average_Cells_Per_Object_Normalized_To_Leaf_Grid 405.7282349 Average_Objects_PerLeaf_GridCell 0.002464704 Number_Of_SRIDs_Found 1 Width_Of_Cell_In_Level1 2.8125 Width_Of_Cell_In_Level2 0.043945313 Width_Of_Cell_In_Level3 0.000686646 Width_Of_Cell_In_Level4 1.07E-05 5.625 Height_Of_Cell_In_Level1 Height_Of_Cell_In_Level2 0.087890625 Height_Of_Cell_In_Level3 0.001373291 Height_Of_Cell_In_Level4 2.15E-05 Area_Of_Cell_In_Level1 1012.5 Area_Of_Cell_In_Level2 15.8203125 Area_Of_Cell_In_Level3 0.247192383 Area_Of_Cell_In_Level4 0.003862381 CellArea_To_BoundingBoxArea_Percentage_In_Level1 1.5625 CellArea_To_BoundingBoxArea_Percentage_In_Level2 0.024414063 CellArea_To_BoundingBoxArea_Percentage_In_Level3 0.00038147 CellArea_To_BoundingBoxArea_Percentage_In_Level4 5。96E-06 Number_Of_Rows_Selected_By_Primary_Filter 60956 Number_Of_Rows_Selected_By_Internal_Filter 0 Number_Of_Times_Secondary_Filter_Is_Called 60956 Number_Of_Rows_Output 2 Percentage_Of_Rows_NotSelected_By_Primary_Filter 71.66655821 Percentage_Of_Primary_Filter_Rows_Selected_By_Internal_Filter 0 Internal_Filter_Efficiency 0 Primary_Filter_Efficiency 0.003281055

“Base_Table_Rows 215138”对我来说没有多大意义,表中有 107,000 行,而不是 215,000

渲染后的数据集如下所示:( 来源:norman.cx替代文字

进一步的研究:

我继续对这些数据的初级过滤器性能不佳感到困惑。所以我做了一个测试,看看我的数据是如何分裂的。使用我原来的未拆分功能,我在表格中添加了一个“单元格”列。然后我运行了 16 个查询来计算该特征跨越的 4x4 网格中有多少个单元格。所以我为每个单元格运行了这样的查询:

如果我再查看表​​中的“单元格”列,我的整个数据集中只有 672 个特征与 4x4 网格中的超过 1 个单元格相交。那么,从字面上看,主过滤器如何返回 60,000 个特征来查看一个 200 英里宽的小矩形?

在这一点上,看起来我可以编写自己的索引方案,它会比 SQL Server 对这些功能的执行方式更好。

0 投票
1 回答
844 浏览

solr - 无法在 Spatial Solr 查询中检索计算距离

我正在使用这个插件来允许Solr 中的空间查询。我已按照文档中包含的步骤进行操作,并且空间查询工作正常。

现在我想检索计算出的距离。我在 solrconfig.xml 文件中添加了这些行:

我已将“geodistance”组件添加到标准请求处理程序中:

然后,当我运行诸如“q={!spatial lat=41.641184 long=-0.894032 radius=2 calc=arc unit=km} cafeteria”之类的查询时,它可以工作,但只是第一次。当我再次运行相同的查询时,我收到此错误:

我不知道错误在哪里,因为第一次查询有效并且我在“geo_distance”字段中获得了计算距离。但是当重复查询时,我得到一个 NullPointerException。

0 投票
1 回答
2103 浏览

python - python中用于二维范围计数查询的数据结构

我需要一个数据结构来进行二维范围计数查询(即给定矩形中有多少点)。

我认为我最好的选择是范围树(它可以计入 log^2,甚至可以在一些优化后记录)。听起来是不是一个不错的选择?有人知道python实现还是我必须自己写一个?

0 投票
2 回答
665 浏览

sql-server - 空间查询,将米转换为弧度?

我有加载到地理数据类型中的地理数据。出于非常特定的目的,我现在需要将其存储为几何图形。但是,我需要执行这样的查询。

0 投票
2 回答
382 浏览

mysql - 位置的数据库过程

我正在尝试存储 GPS 位置数据库并运行查询以查找给定半径内的点以及最近的点。我正在使用 mysql 并且一直在研究空间扩展。我不确定我是否了解如何实际使用空间扩展来执行我在位置半径查询中寻找的内容。

所以这就是我对我的选择的想法:

  1. 将 lat 和 long gps 坐标存储为 db 中的浮点索引变量。当我得到一个点 gps 坐标和一个范围时,计算要查询的最大和最小 lat 和 long 值,然后根据这些中的距离函数进行排序以进行排序。

  2. 使用空间扩展。我不太肯定这会奏效。未实现 Distance() 函数。使用空间索引需要找到一个边界框(可行)并调用 MBRContains 边界框函数来找到该边界框中的点。但是,点的边界为零,因此 MBRContains 函数不适用于点。

我不确定执行此操作的标准方法是什么(似乎没有),并且非常感谢任何经验/想法/对决定的帮助。我目前正在使用 mysql 5.13,我很确定即使是 5.5 也没有距离度量。

另外 - 即使 2. 有效,哪一个会更快?请让我知道您的想法是什么,尤其是如果您确定/已经看到某些东西可以用于快速和大型查找!

Mysql 空间索引:http ://dev.mysql.com/doc/refman/5.5/en/using-a-spatial-index.html

0 投票
1 回答
13480 浏览

mysql - 如何使用 MySQL 空间查询查找 X 半径内的所有记录?

我在 MySQL 数据库中有一个表,其中包含 POINT 类型的空间几何列。我希望能够在地图中心取一个点并找到它 X 英里(或任何距离)内的所有记录。我似乎找不到一个很好的例子或解释如何做到这一点,它不会深入到几何数学中。我很高兴走这条路,但首先想尝试使用真正的空间数据库来解决它。

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 投票
1 回答
594 浏览

c# - C#中点的统一网格细分

我有一组 P 的 2D 点,我可以将它们聚集在一个 2D 均匀间隔的网格中,其中每个单元的长度为 X。

我想这样做是因为我正在尝试创建一个热图,并且我有很多信息,所以我希望通过将点聚集到一个均匀间隔的网格中,我可以报告每个网格的最终计数。

谢谢!

如果这有什么不同,我首先在细分之前通过 SQL(点)获取我的信息,这些信息在指定点的某个半径内。

0 投票
2 回答
5871 浏览

c# - SQL Server 2008 中的 Geography 空间类型是什么 ADO 类型?

我希望重构这种方法(来自Rob Conery 的 Massive.cs):

可能添加对 Geography 类型的检查将解决我的 ExecuteNonQuery 和空间数据类型问题,但我会检查什么类型?

if (item.GetType() == typeof(//WhatType?//)) {}

0 投票
3 回答
3313 浏览

python - 空间索引/查询(查找 k 个最近点)

我有 +10k 点(纬度,经度),我正在构建一个应用程序,向您显示离用户位置最近的 k 个点。

我认为这是一个非常普遍的问题,我不想重新发明轮子。我正在学习四叉树。这似乎是解决这个空间问题的好方法。

我正在使用这些工具:

  • 蟒蛇2.5
  • MySQL
  • 蒙古数据库

构建四叉树并不难:http : //donar.umiacs.umd.edu/quadtree/points/pointquad.html 但是一旦我创建了树并将其保存到数据库(MySQL 或 MongoDb),我如何运行查询?

我需要运行这样的查询:

  1. 查找用户位置 10 公里范围内的所有点。
  2. 找到距用户位置最近的 6 个(或至少 6 个)点。

这样做的标准和常用方法是什么?

编辑1:

我已经将 +10k 点加载到 MongoDB(地理空间索引)中,乍一看它工作正常。无论如何,我找到了PostGis

PostGIS 是 PostgreSQL 对象关系数据库系统的扩展,它允许将 GIS(地理信息系统)对象存储在数据库中。

所以我想我会试试 PostGis。

我还找到了SimpleGeo。您可以在云中存储点/地点,然后通过 API 查询它们:https ://simplegeo.com/docs/tutorials/python#how-do-radial-nearby-query