我有一个csv格式的玩具数据集,有12行,如下所示:
我尝试在arangodb中加载这些数据,对其进行空间索引,然后使用arangodb空间查询获取数据。
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._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数据进行分析。
谢谢你,谢谢你
1条答案
按热度按时间tsm1rwdh1#
这里有两个不同的问题。Non-GeoJSON Geo空间索引的文档说明:
第一个字段始终定义为纬度,第二个字段定义为经度。
因此,您应该将索引创建为
db.players.ensureIndex({type: 'geo', fields: ['lat', 'lng'], geoJson: false})
第二个更重要的问题是使用的多边形。[多边形文档}(https://www.arangodb.com/docs/stable/indexing-geo.html#polygon)提到了以下限制:
线性环定义了球体上的两个区域。ArangoDB始终将面积较小的区域解释为环的内部。这引入了一个实际限制,即任何面的外环都不能包含超过地球表面一半的面积
不幸的是,您选择的多边形也是如此,因此它 * 没有 * 覆盖您想要覆盖的区域。请注意,Web UI中的多边形可视化实际上显示了您想要的多边形。这是一个已知问题,我们目前正在努力解决它。
只有在使用ArangoSearch时,“分析器”才有意义,ArangoSearch从v3.8开始也支持geo spatial indexes。