我使用Spatial Index,当我尝试执行WHERE语句时:
WHERE T.GEOMETRY.STIntersects(O.GEOMETRY) = 1 AND T.GEOMETRY.STTouches(O.GEOMETRY) = 0
Run Code Online (Sandbox Code Playgroud)
它工作正常,但当我尝试用OR执行时:
WHERE T.GEOMETRY.STOverlaps(O.GEOMETRY) = 1 OR T.GEOMETRY.STWithin(O.GEOMETRY) = 1
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
查询处理器无法为具有空间索引提示的查询生成查询计划.原因:无法在条件中找到所需的二进制空间方法.尝试删除索引提示或删除SET FORCEPLAN.
任何帮助,这个陈述中有什么问题?
我正在使用来自http://libspatialindex.github.com/的spatialindex库
我在主内存中创建一个R*树:
size_t capacity = 10;
bool bWriteThrough = false;
fileInMem = StorageManager
::createNewRandomEvictionsBuffer(*memStorage, capacity, bWriteThrough);
double fillFactor = 0.7;
size_t indexCapacity = 10;
size_t leafCapacity = 10;
size_t dimension = 2;
RTree::RTreeVariant rv = RTree::RV_RSTAR;
tree = RTree::createNewRTree(*fileInMem, fillFactor, indexCapacity,
leafCapacity, dimension, rv, indexIdentifier);
Run Code Online (Sandbox Code Playgroud)
然后我插入了大量的边界框,目前大约2.5M(德国巴伐利亚州的公路网).后来我的目标是插入欧洲的所有道路.
存储管理器和rtree的参数选择有哪些?大多数情况下,我使用rtree来查找到给定查询(bbox交叉点)最近的道路.
有谁知道为什么MongoDB使用B-Tree但不使用B + -Tree?
据我所知,大多数DBMS使用B + -Tree。MongoDB使用B树有什么特殊原因吗?
谢谢。
我目前正在使用SOLR 4.2来索引地理空间数据(纬度和经度数据).我已将我的地理空间字段配置如下.
<fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/>
<field name="latlong" type="location" indexed="true" stored="false" multiValued="true"/>
Run Code Online (Sandbox Code Playgroud)
我只是想确保我使用正确的SOLR类来执行地理空间搜索,因为我不确定未来版本的SOLR将支持哪个2类(LatLonType与SpatialRecursivePrefixTreeFieldType).
我假设SpatialRecursivePrefixTreeFieldType是latlong的升级版本,有人可以确认我是否正确吗?
考虑以下元组列表:[(5,4,5), (6,9,6), (3,8,3), (7,9,8)]
我正在尝试设计一种算法来检查列表中是否至少存在一个元组,其中该元组的所有元素都大于或等于给定的元组(针)。
例如,对于给定的元组 (6,5,7),算法应返回 True,因为给定元组中的每个元素都小于列表中的最后一个元组,即 (7,9,8)。但是,对于给定的元组 (9,1,9),算法应返回 False,因为列表中不存在每个元素都大于给定元组的元组。特别是,这是由于给定元组的第二个元素 1 小于列表中所有元组的第二个元素。
一个简单的算法会逐一循环列表中的元组,并在内循环中循环元组的元素。假设有 n 个元组,其中每个元组有 m 个元素,则复杂度为 O(nm)。
我在想是否有可能有一种算法来产生复杂度较低的任务。允许预处理或任何奇特的数据结构来存储数据!
我最初的想法是利用二分搜索的某种变体,但我似乎找不到一种数据结构,一旦我们根据第一个元素消除了一些元组,就不会再回到朴素的解决方案,这意味着该算法最终也可能是 O(nm)。
谢谢!
是否可以有效地计算数轴上与单个点重叠的线段的数量P?
所有线段都位于一条数轴上(它是一个1-D世界,而不是一个3-D世界)。
每条线段都有一个起始坐标X1和一个结束坐标X2。
例子:
Line segment A spans from X1==1 to X2==3
Line segment B spans from X1==2 to X2==4
Line segment C spans from X1==3 to X2==5
Line segment D spans from X1==1 to X2==4
----------------------------------------
Ex1: Line segments that overlap point P==2: A,B and D >>> overlap count==3.
Ex2: Line segments that overlap point P==7: None >>> overlap count==0.
Ex3: Line segments that overlap point P==3: A,B,C and …Run Code Online (Sandbox Code Playgroud) 输入:
\n\n\xe2\x80\xa2 N 个点{P1,\xe2\x80\xa6。, Pn} - 每个点都来自同一维度 t:
\n\n\xe2\x80\xa2 距离函数 \xe2\x80\x93 dist(Pi, Pj) - 返回一个数字,即点之间的距离。(该函数是自定义函数 \xe2\x80\x93 不是标准 Minkowski 距离)。
\n\n问题:
\n\n\xe2\x80\xa2 主要问题:
\n\n\xe2\x80\xa2 第二个问题:
\n\n\xe2\x80\xa2 很高兴拥有:
\n\n相关数据结构:
\n\n\xe2\x80\xa2 KD-树
\n\nspatial spatial-query multidimensional-array knn spatial-index
在我的应用程序中,有一个用例来查找与某个其他地理点最接近的点。我决定使用内存空间索引,并找到了几种候选对象:jeospatial和Lucene空间。
我做了一些基准测试,很惊讶地发现Lucene指数非常慢。这是使用JMH完成的基准测试代码。完整的源代码可以在我的GitHub存储库中找到。
@State(Scope.Thread)
public class MyBenchmark {
// Lucene
private static final String COORDINATES_FIELD = "coordinates";
private static final int GEO_PRECISION_LEVEL = 5;
private static final double NEARBY_RADIUS_DEGREE = DistanceUtils.dist2Degrees(
50, DistanceUtils.EARTH_MEAN_RADIUS_KM);
private final Directory directory = new RAMDirectory();
private final IndexWriterConfig iwConfig = new IndexWriterConfig();
private IndexWriter indexWriter = null;
private IndexSearcher indexSearcher = null;
private final SpatialContext spatialCxt = SpatialContext.GEO;
private final ShapeFactory shapeFactory = spatialCxt.getShapeFactory();
private final SpatialStrategy coordinatesStrategy …Run Code Online (Sandbox Code Playgroud) 我是SQL的新手,我需要帮助来优化空间查询,以便它在2秒内运行.我们已经在各个网站上尝试了一些建议(更多内容见下文).
我们有一个表[Id,Geometry],大约300,000个不同大小和复杂度的几何形状,存储为几何数据类型.我们使用下面的代码片段为Geometry创建了一个空间索引.
CREATE SPATIAL INDEX [IX_Geometry_Spatial]
ON [dbo].[Geometries] ([Geometry]) USING GEOMETRY_AUTO_GRID
WITH (
BOUNDING_BOX = (XMAX = 24.43359375, XMIN = 10.810546875, YMAX = 69.2249968541159, YMIN = 55.2791152920156)
);
Run Code Online (Sandbox Code Playgroud)
我们想要的是找到与输入几何形状相交的所有几何形状.这是通过使用以下查询完成的.
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POLYGON ((x0 y0, ...))', 4326); -- A Worst Case Polygon containing 1442 data points
SELECT Count(Id)
FROM Geometries
WHERE Geometries.Geometry.Filter(@g.Reduce(.25)) = 1
Run Code Online (Sandbox Code Playgroud)
对于某些最坏情况的输入几何形状(大的,复杂的多边形),这种执行大约需要7-10秒.
我们可以看到我们达到空间指数,但最昂贵的操作是 clustered index seek (Clustered)
聚集索引寻求详细信息:
空间索引寻求细节:
不应该通过空间索引而不是聚集索引来完成繁重的工作吗?
可以通过更改空间索引的设置来改进查询吗?我们应该使用什么设置(对于GRIDS,CELLS_PER_OBJECT等)?
如何将整个执行时间缩短,或者这种查询可以达到7-10秒?
每个都节省了大约几秒钟.
STIntersect()到Filter()Reduce(.25) …这是我的代码:
SET @poly =
'Polygon((-98.07697478272888 30.123832577126326,
-98.07697478272888 30.535734310413392,
-97.48302581787107 30.535734310413392,
-97.48302581787107 30.123832577126326))';
SELECT name
FROM county_shapes
WHERE MBRContains(ST_GeomFromText(@poly), SHAPE);
Run Code Online (Sandbox Code Playgroud)
每当我运行时,我得到一个"MySQL:提供给函数st_geometryfromtext的无效GIS数据"错误.
这会返回相同的错误:
SELECT name
FROM county_shapes
WHERE MBRContains(ST_GeomFromText('Polygon((-98.07697478272888 30.123832577126326,
-98.07697478272888 30.535734310413392,
-97.48302581787107 30.535734310413392,
-97.48302581787107 30.123832577126326))'), SHAPE);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
spatial-index ×10
geospatial ×4
spatial ×3
c++ ×2
lucene ×2
sql-server ×2
algorithm ×1
b-tree ×1
c# ×1
game-physics ×1
gis ×1
indexing ×1
knn ×1
mongodb ×1
mysql ×1
mysql-5.7 ×1
performance ×1
r-tree ×1
search ×1
solr ×1
solr4 ×1
sql ×1
t-sql ×1