我有一个有12行csv格式的玩具数据集,如下所示:

我试图将这些数据加载到arangodb中,在空间上对其进行索引,然后使用arangodb空间查询获取数据。我在db中加载数据并对其进行索引的步骤如下:
arangoimport --file "cricketers.csv" --type csv --create-collection --create-collection-type document --translate "id=_key" --collection "players"
db.players.ensureIndex({type: 'geo', fields: ['lng', 'lat'], geoJson: false})之后,我尝试通过向db发送空间查询来获取一些数据,如下所示:
db._query({'query': 'FOR node IN players FILTER GEO_CONTAINS(GEO_POLYGON([[[-70,-40],[-70,60],[180,60],[180,-40],[-70,-40]]]), [node.lng, node.lat]) RETURN node', "options" : {fullCount:true}}).getExtra();理想情况下,上面的示例查询应该获取所有数据点,因为它指定了一个跨越所有数据点的geo_polygon。但是,查询不返回任何数据点。这是查询返回的内容(请参阅完整计数):
{ "warnings" : [ ], "stats" : { "writesExecuted" : 0, "writesIgnored" : , scannedFull" : 12, "scannedIndex" : 0, "filtered" : 12, "httpRequests" : 0, "fullCount" : 0, "executionTime" : 0.0015139159995669615, "peakMemoryUsage" : }如果我在不使用空间查询的情况下执行相同的查询,即使用以下简单的过滤器:
db._query({'query': 'for node in players filter -40 <= node.lat <= 60 and -70 <= node.lng <= 180 return node', 'options': {fullCount: true}}).getExtra();这就是我所得到的,正如我所期望的:
{ "warnings" : [ ], "stats" : { "writesExecuted" : 0, "writesIgnored" : 0, scannedFull" : 12, "scannedIndex" : 0, "filtered" : 0, "httpRequests" : 0, fullCount" : 12, "executionTime" : 0.0005607399998552864, "peakMemoryUsage" : 0 }请帮助我理解我做错了什么?为什么空间查询不能工作?我已经尝试过按照发送'lat‘和'lng’到空间数据获取和索引查询的顺序进行操作,但没有效果。
ArangoDB文档只讨论了JSON中的一个示例,即使这样也没有多大帮助。它谈到了一些关于分析器的内容,我认为这是我需要使用的东西,但是还不清楚如何对csv数据这样做。
谢谢!
发布于 2021-12-21 09:14:19
有两个不同的问题。非GeoJSON地质空间索引的文档声明:
第一个字段总是定义为纬度,第二个字段定义为经度。
因此,您应该将索引创建为db.players.ensureIndex({type: 'geo', fields: ['lat', 'lng'], geoJson: false})
第二个更重要的问题是你使用的多边形。[Polygon文档}(https://www.arangodb.com/docs/stable/indexing-geo.html#polygon)提到了以下限制:
线性环定义了球面上的两个区域。ArangoDB总是将较小区域的区域解释为环的内部。这带来了一个实际的限制,即任何多边形都不可能有一个包围地球表面一半以上的外圈
不幸的是,这对于你选择的多边形是正确的,所以这就是为什么它没有覆盖到预定的区域。不过,请注意,web中的多边形可视化实际上显示了您想要的多边形。这是一个众所周知的问题,我们目前正在努力解决这个问题。
只有当您使用ArangoSearch时,“分析器”才是相关的,它自v3.8以来也支持地理空间索引。
https://stackoverflow.com/questions/70428411
复制相似问题