我正在开发一款拥有大量动态实体的2D游戏.为了好玩,让我们称他们为士兵,让我们说有50000个(我只是随机想起来,它可能会更多或更少:)).
所有这些士兵都按照规则移动每一帧 - 想想boids/flocking/steering行为.对于每个士兵来说,为了更新它的运动,我需要最接近我正在处理的X士兵.
什么是最好的空间层次结构来存储它们以方便这样的计算而不需要太多的开销?(每帧都更新/移动所有实体,因此它必须非常好地处理动态实体)
为了计算纬度/经度所代表的最近位置,我正在考虑将地图划分为小网格,大约100x100米网格.基本上每个点都将分配给一个网格.
据我所知,我也可以使用MySQL等空间索引,但我计划使用像Cassandra这样的非关系型数据库,因为很难对空间对象进行索引,因此某种网格近似技术可能很简洁.
创建这样一个网格系统并将二维空间位置映射到它的最佳方法是什么?
编辑1:如果网格不完全均匀,那么可能没什么问题.
我创建了以下MySQL表来存储纬度/经度坐标以及每个点的名称:
CREATE TABLE `points` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(128) NOT NULL,
`location` point NOT NULL,
PRIMARY KEY (`id`),
SPATIAL KEY `location` (`location`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;
Run Code Online (Sandbox Code Playgroud)
我试图查询:
我发现的所有示例都涉及使用最小边界矩形(MBR)而不是半径.该表包含大约100万个点,因此需要尽可能高效.
我想在mysql数据库表中存储位置的纬度和经度值.考虑到未来,我希望能够在特定位置的特定半径范围内找到这些位置.话虽如此,我应该将纬度和经度值存储在哪些数据类型?请你能为我提供一个创建表脚本,如下所示:
place_id | lat | long
Run Code Online (Sandbox Code Playgroud)
上表中是否有一个我缺少的专栏,它将为我提供我目前可能看不到的其他信息?
谢谢你的帮助.
我有2个表,其中一个点是地理位置,另一个是多边形作为地理位置.我可以通过以下查询找到单个点落在哪个多边形(从点表):
DECLARE @p geography;
select @p = PointGeom from dbo.PointTable where ID = 1
SELECT a.ID, ATTRIBUTE1, geom
from dbo.PolygonTable a
where geom.STIntersects(@p) = 1;
Run Code Online (Sandbox Code Playgroud)
但是,我想在两个表之间进行连接,并获得Point Table中每个点落入的多边形.它甚至可能吗?或者我是否需要遍历Point表并多次调用上述查询?
我有一个解决方案,使用空间数据来表示地图上的一组点.我需要使用表示簇的范围的坐标来找到可以包含所述点簇的最小边界矩形.
是否存在能够计算此算法的简单算法,或者C#中是否存在任何内置功能来实现此目的.我知道NetTopologySuite,但我不确定如何/如果我可以使用它来实现相同的目标.我有一个坐标列表,所以我需要将这个字符串列表传递给它并获得MBR.
给定k维连续(欧几里德)空间充满了相当不可预测的移动/生长/收缩的超球面,我需要重复找到其表面最接近给定坐标的超球面.如果一些超球面与我的坐标距离相同,那么最大的超球面会获胜.(随着时间的推移,超球面的总数保证保持不变.)
我的第一个想法是使用KDTree,但它不会考虑超球体的非均匀体积.所以我进一步观察并找到了BVH(边界体积层次结构)和BIH(边界间隔层次结构),这似乎可以解决问题.至少在二维/三维空间中.然而,虽然在BVH上找到了相当多的信息和可视化,但我几乎找不到任何关于BIH的信息.
我的基本要求是k维空间数据结构,它考虑了体积,要么是超级快速构建(离线),要么是动态的,几乎没有任何不平衡.
鉴于我的上述要求,您会使用哪种数据结构?我还没提到的其他任何一个?
编辑1:忘记提及:允许hypershperes(实际上是高度期望的)重叠!
我有WCF REST服务,其中包含以下代码
var geo = DbGeography.PointFromText(string.Format("POINT({0} {1})", longitude, latitude), DbGeography.DefaultCoordinateSystemId);
Run Code Online (Sandbox Code Playgroud)
单元测试工作正常,但是当我从客户端或HTTP debuder调用此代码时,提供纬度和经度的任何值exept 0,它会失败,但异常:
"24141: A number is expected at position X of the input. The input has ,XXXXXX."
at Microsoft.SqlServer.Types.WellKnownTextReader.RecognizeDouble()
at Microsoft.SqlServer.Types.WellKnownTextReader.ParsePointText(Boolean parseParentheses)
at Microsoft.SqlServer.Types.WellKnownTextReader.ParseTaggedText(OpenGisType type)
at Microsoft.SqlServer.Types.WellKnownTextReader.Read(OpenGisType type, Int32 srid)
at Microsoft.SqlServer.Types.SqlGeography.ParseText(OpenGisType type, SqlChars taggedText, Int32 srid)
at Microsoft.SqlServer.Types.SqlGeography.GeographyFromText(OpenGisType type, SqlChars taggedText, Int32 srid)
at Microsoft.SqlServer.Types.SqlGeography.STPointFromText(SqlChars pointTaggedText, Int32 srid)
Run Code Online (Sandbox Code Playgroud)
latitude和longitute例如
lat:37.58336895 long:-122.40549454
lat:37.38931302 long:-122.16207476
我使用从SQLServer安装目录和SqlGeography.Point引用的Microsoft.SqlServer.Types来处理代码端的spartial数据.现在我想直接使用EF 5功能而不使用Microsoft.SqlServer.Types.无论有没有这个参考,都会失败.
知道什么是错的吗?
安装了.NET 4.5,SQL Server版本是Microsoft SQL Server 2008(SP3) - 10.0.5500.0(Intel X86)2011年9月22日00:28:06版权所有(c)1988-2008 Microsoft Corporation …
我已经制作了这张地图ggplot2:
library(maptools); library(ggplot2)
data(wrld_simpl)
world <- fortify(wrld_simpl)
worldUk <- subset(world, id=="GBR")
ggplot() +
geom_path(aes(long, lat, group=group), data=worldUk, color="black", fill=NA) +
coord_equal()
Run Code Online (Sandbox Code Playgroud)

使用photoshop,我在地图上添加了比例尺.如何使用添加类似比例尺ggplot2?这篇文章添加了一个比例尺,但该栏并未引用距离:比例尺和map-ggplot2上的北箭头
我是学习图像处理的初学者,我对空间和时间表征的概念有点困惑.那么,对于空间表征,它是否像包含地图的一些统计信息的2D地图?就时间特征而言,关于时间的价值是什么?这是什么意思,我们为什么关心?谢谢!