在C++中操作空间数据的一些推荐框架是什么?
我正在寻找一个多边形对象,点对象,以及一些像union,intersection,distance和area这样的操作.我需要在WGS84(lon,lat)中输入坐标并获得平方公里的面积.
我更喜欢免费/开源框架,但我愿意接受建议.
编辑:不幸的是我需要一个非GPL解决方案.LGPL没问题.
我目前有一个网站,其中包含一个具有Lat/Long浮点列的表,以及这两列的索引以及另一个我需要检索的列.
我一直在查询这个表,以获得从某一点落入半径范围内的行(我实际上得到了一个方形的速度),但我只需要已经编入索引的字段,所以这个索引实际上是覆盖的,执行计划只有两个步骤:
Index Seek (cost: 100%) and SELECT (cost: 0%)
Run Code Online (Sandbox Code Playgroud)
现在,我正在尝试利用SQL 2008的空间功能.我创建了Geography列,填充它,创建空间索引,工作.
这一切都运行正常,除了执行计划有一百万步,并且74%的时间花在了Clustered Index Seek上,它将它在Spatial Index中找到的行连接到实际表,以获得其余的数据...
(空间索引寻求占执行计划成本的1%)
所以,显然,它是正确地使用Spatial索引并使用我的"常规"索引比Lat/Long更快地找到我需要的记录,但加入主表是杀了我,空间查询需要7倍作为只要我的旧的.
有没有办法在空间索引中添加更多的列,以便它可以覆盖它,它可以一步完成,就像以前一样?
还有其他方法可以改善这种情况吗?
更新:我发现"常规"索引可以使用INCLUDE关键字"包含"其他列(我不知道,我过去只在索引本身中包含列)
根据此处的文档,该子句不是空间索引的选项...任何想法?
谢谢!
丹尼尔
在我的2D游戏中,我有静态和动态对象.可以有多个摄像头.我的问题:确定与当前相机的视图矩形相交的对象.
目前,我只是遍历所有现有对象(不关心动态或静态)并使用相机视图对其进行AABB检查.这对于非常动态的对象来说似乎是可以接受的,但对于静态对象来说却是不可接受的,在静态对象中可能存在数以万计的静态对象(静态级别几
我已经研究了可以解决我的问题的多个数据结构:
这是我考虑的第一件事,但问题是它会迫使我的场景具有固定的大小.(可接受静态,但不适用于动态对象)
看起来不错,但重新平衡它的开销似乎对许多动态对象来说太大了.
这里的主要问题是,如果你大量使用相机缩小,必须查询大量不存在的空间散列桶,导致性能低下.
总的来说,我对这个问题的良好解决方案的标准是:
动态大小:解决方案不得导致场景大小受限,或者需要大量重新计算才能调整大小
良好的查询性能(适用于相机)
对非常动态对象的良好支持:处理不断变化位置的对象所需的计算应该是好的:
一次我游戏中动态对象的最大合理数量可能是5000.考虑它们每一帧都改变它们的位置.考虑到频繁的插入和删除,是否有一个数据结构可以更快,而不是每帧比较物体的AABB和相机?
我正在使用启用OData的Web Api.我开始工作时提到(只提到问题的相关dll)
Microsoft.AspNet.WebApi.OData
Microsoft.Data.OData
Microsoft.Data.Edm
System.Spatial
Run Code Online (Sandbox Code Playgroud)
但是当我发现OData默认区分大小写时,我寻找一个不区分大小写的解决方案,我已经通过几个帖子支持OData Uri不区分大小写的解析和ODataLib 6.7.0发布然后最终登陆到nuget包Microsoft.OData.核心6.9.0似乎解决了我的问题.在这里我的困惑开始了,它在不同的命名空间下有自己的集合相关库
Microsoft.OData.Core-----------VS------Microsoft.Data.OData
Microsoft.OData.Edm------------VS------Microsoft.Data.Edm
Microsoft.Spatial--------------VS------System.Spatial
Run Code Online (Sandbox Code Playgroud)
上面类似的库之间有什么区别,我们应该相互使用?在矿山的类似案件,Microsoft.OData.Core可以使用的,而不是Microsoft.Data.OData这是解决区分大小写的问题?
我已经从 openstreetmaps 行政边界(城市、地区、国家等)下载了 geoJson 格式。
我正在尝试使用空间数据将与多边形相关的 json 数据存储在我的 ms sql server 中。由于我从未解析过如此复杂的 json 文件,因此在手动创建 ac# 对象来存储解析数据时遇到了困难。
我正在使用 newtonsoftJson.json 来读取 geoJson 文件并创建一个对象。然后我使用反射来获取与对象相关的属性。这是一项相当乏味的任务,因为在某些情况下,对象在 geojson 文件中嵌套在 4 层以上。由于我必须存储世界上所有城市的多边形,因此我显然需要一种更快更准确的方法。
lat long
7.16 124.21
8.6 123.35
8.43 124.28
8.15 125.08
Run Code Online (Sandbox Code Playgroud)
考虑这些坐标,这些坐标对应于测量降雨量数据的气象站.
R中gstat包的介绍使用了meuse数据集.在本教程的某些时候:https://rpubs.com/nabilabd/118172,这些人在这行代码中使用了"meuse.grid":
data("meuse.grid")
Run Code Online (Sandbox Code Playgroud)
我没有这样的文件,我不知道如何创建它,我可以使用这些坐标创建一个吗?或者至少向我指出讨论如何为自定义区域创建自定义网格的材料(即不使用GADM的管理边界).
可能写错了,甚至不知道这个问题是否对R精明的人有意义.不过,我很乐意听到一些方向,或者至少是提示.非常感谢!
R的总瘤和统计数据.
编辑:看到我发布的教程看起来像的样本网格,这是我想做的事情.
编辑2:这种方法是否可行?https://rstudio-pubs-static.s3.amazonaws.com/46259_d328295794034414944deea60552a942.html
我们已将 MySql 5.7 数据库的副本迁移到 Amazon RDS 上的 MySql 8.0.11。在可能的情况下,一切都是相同的。包含几何数据的表已被修改,因此几何列被限制为 SRID 0 并重建空间索引。两个数据库上的执行计划相同,表明查询使用的是空间索引。
在 MySql 5.7 上,以下查询需要 0.001 秒,在 MySql 8 上需要 108 秒。查看 MySql 8 上 100% 的执行统计信息“发送数据”。为什么?
SELECT r.roadid
FROM geocoder.osm_road r
WHERE mbrintersects(ST_Buffer(ST_GEOMETRYFROMTEXT('Point(-1.91289 52.58260)',0),0.0005), r.geometry)
Run Code Online (Sandbox Code Playgroud)
我们有许多不同的空间查询,而且所有查询都如此,但特别是 MBRINTERSECTS 和 ST_INTERSECTS 似乎非常慢。更改为 ST_CONTAINS(在可能的情况下)会带来显着的改进(即上述需要 3 秒而不是 108 秒),但这并不适合许多查询,并且仍然比 5.7 慢了很多。
Show Create Table for 5.7
CREATE TABLE `osm_road` (
`roadid` bigint(20) NOT NULL,
`reference` varchar(20) DEFAULT NULL,
`name` varchar(100) DEFAULT NULL,
`dictionary` longtext,
`road_speed_limit` tinyint(4) unsigned NOT NULL,
`road_speed_unitid` tinyint(1) NOT …Run Code Online (Sandbox Code Playgroud) 我一直在按照这个工作流程将坐标从东/北转换为 R 中的纬度/经度。直到今天它一直工作正常。这是一个可重现的示例:
require(rgdal)
# create test coordinates
x <- 259269 y <- 074728
# create test dataframe
dat <- data.frame(x, y)
class(dat) # "data.frame"
### shortcuts
ukgrid <- "+init=epsg:27700"
latlong <- "+init=epsg:4326"
### Create coordinates object
coords <- cbind(Easting = as.numeric(as.character(x)),
Northing = as.numeric(as.character(y)))
class(coords) # matrix
dat_SP <- SpatialPointsDataFrame(coords,
data = dat,
proj4string = CRS("+init=epsg:27700"))
# Error in !res[[1]] : invalid argument type
# Following steps ----
# Convert
dat_SP_LL <- spTransform(dat_SP, CRS(latlong)
# replace Lat, …Run Code Online (Sandbox Code Playgroud) 我刚刚注意到terra::cellSize()生成的单元格面积估计值与 生成的值不匹配raster::area()。
首先,为什么这两种方法不能提供相同的答案?第二,哪个估计最准确?请参阅下面的示例。
library(raster)
#> Loading required package: sp
library(terra)
#> terra version 1.3.4
# make test raster with raster::raster()
a <- raster::raster(ncols = 100, nrows = 100,
xmn = -84, xmx = -83,
ymn = 42, ymx = 43)
# make test raster with terra::rast()
b <- terra::rast(ncols = 100, nrows = 100,
xmin = -84, xmax = -83,
ymin = 42, ymax = 43)
# calculate cell areas (km2)
a_area <- raster::area(a) # km …Run Code Online (Sandbox Code Playgroud) 我正在使用用于创建静态地图的代码来包含在闪亮的应用程序中。但我有一个问题,绘图大小比实际绘图大得多,因此布局看起来不正常。有什么办法可以减少绘图外部的空白吗?
如果可能的话,我希望输出只是情节本身。
# reprex
library(terra)
library(sf)
library(magrittr)
library(ggplot2)
lux <- vect(system.file("ex/lux.shp", package = "terra"))
p <- lux %>%
st_as_sf() %>%
ggplot() +
geom_sf(aes(fill = NAME_2), colour = "white", size = 0.2) +
theme(legend.position = "None") +
# found online - removes the whitespace around the plot but not the external whitespace
theme(plot.margin=grid::unit(c(0,0,0,0), "mm"))
p
Run Code Online (Sandbox Code Playgroud)