我正在尝试为我正在处理的数据集选择一个不错的SQL Server 2008空间索引设置.
数据集是多边形,表示整个地球的轮廓.表中有106,000行,多边形存储在几何字段中.
我的问题是许多多边形覆盖了地球的很大一部分.这似乎很难获得一个空间索引,它将消除主过滤器中的许多行.例如,查看以下查询:
SELECT "ID","CODE","geom".STAsBinary() as "geom" FROM "dbo"."ContA"
WHERE "geom".Filter(
geometry::STGeomFromText('POLYGON ((-142.03193662573682 59.53396984952896,
-142.03193662573682 59.88928136451884,
-141.32743833481925 59.88928136451884,
-141.32743833481925 59.53396984952896,
-142.03193662573682 59.53396984952896))', 4326)
) = 1
Run Code Online (Sandbox Code Playgroud)
这是查询与表中只有两个多边形相交的区域.无论我选择何种空间索引设置组合,Filter()总是返回大约60,000行.
用STIntersects()替换Filter()当然只返回我想要的两个多边形,但当然需要更长的时间(Filter()为6秒,STIntersects()为12秒).
任何人都可以给我任何关于是否存在可能在60,000行上改进的空间索引设置或者我的数据集是否与SQL Server的空间索引不匹配的提示?
更多信息:
正如所建议的那样,我在地球上使用4x4网格分割多边形.我无法用QGIS看到这样的方法,所以我编写了自己的查询来做到这一点.首先我定义了16个边界框,第一个看起来像这样:
declare @box1 geometry = geometry::STGeomFromText('POLYGON ((
-180 90,
-90 90,
-90 45,
-180 45,
-180 90))', 4326)
Run Code Online (Sandbox Code Playgroud)
然后我使用每个边界框来选择和截断与该框相交的多边形:
insert ContASplit
select CODE, geom.STIntersection(@box1), CODE_DESC from ContA
where geom.STIntersects(@box1) = 1
Run Code Online (Sandbox Code Playgroud)
我显然为4x4网格中的所有16个边界框做了这个.最终结果是我有一个新表~107,000行(这证实我实际上没有很多巨大的多边形).
我添加了一个空间索引,每个对象有1024个单元格,每个级别的单元格低,低,低,低.
然而,非常奇怪的是,这个具有分割多边形的新表仍然与旧表一样.执行上面列出的.Filter 仍然会返回~60,000行.我根本不理解这一点,显然我不明白空间索引实际上是如何工作的.
矛盾的是,虽然.Filter()仍然返回~60,000行,但它的性能有所提高..Filter()现在大约需要2秒而不是6秒,而.STIntersects()现在需要6秒而不是12秒.
这里要求的是索引的SQL示例:
CREATE SPATIAL INDEX [contasplit_sidx] ON [dbo].[ContASplit]
(
[geom]
)USING …Run Code Online (Sandbox Code Playgroud) spatial geospatial spatial-query sql-server-2008 spatial-index
我正在尝试使用 EF 核心 2.2 构建带有空间对象的数据库,但在尝试创建数据库迁移时遇到问题。使用https://docs.microsoft.com/en-us/ef/core/modeling/spatial,特别是:
class Country
{
public int CountryID { get; set; }
public string CountryName { get; set; }
// Database includes both Polygon and MultiPolygon values
public IGeometry Border { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用此创建迁移,则会出现以下错误:
属性“Country.Border”属于接口类型(“IGeometry”)。如果它是导航属性,则通过将其转换为映射实体类型来手动配置此属性的关系,否则使用 NotMappedAttribute 或“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略该属性。
同样,如果我将其更改为 Geometry 类型,则会得到:
无法映射属性“Geometry.UserData”,因为它属于“object”类型,它不是受支持的基本类型或有效的实体类型。显式映射此属性,或使用 '[NotMapped]' 属性或使用 'OnModelCreating' 中的 'EntityTypeBuilder.Ignore' 忽略它。
我不知道我的对象是点、线还是多边形,所以它必须是通用的。我如何在我的结构中表示它?另外我看到有些地方说我需要添加以下代码:
public class MyDBContextFactory : IDesignTimeDbContextFactory<MyDBContext>
{
public MyDBContext CreateDbContext(string[] args)
{
var builder = new DbContextOptionsBuilder<MyDBContext>();
builder.UseSqlServer(cnnString, x => x.UseNetTopologySuite());
return new MyDBContext(builder.Options);
}
} …Run Code Online (Sandbox Code Playgroud) 只是为了澄清前面:我说的是联合几何,而不是SQL关键字UNION.
我正在尝试将Postgres中的一些空间数据与PostGIS一起移动到SQL Server 2008.直到我看到这样的语句之后才好了:
SELECT GeomUnion(the_geom) FROM some_table
Run Code Online (Sandbox Code Playgroud)
这个联合该列中的所有几何体并将其作为一个结果返回(类似于COUNT工作方式).据我所知,SQL Server只具有将STUnion一个几何与另一个几何结合的功能.有没有办法做类似于Postgres的方式?
如果它有帮助,该STUnion功能的工作方式如下:
SELECT first_geometry_column.STUnion(second_geometry_column) FROM some_table
Run Code Online (Sandbox Code Playgroud) 我在R中使用shapefile ,一个是point.shp,另一个是polygon.shp.现在,我想将点与多边形相交,这意味着多边形中的所有值都应该附加到point.shp的表中.
我在包sp中尝试了overlay()和spRbind,但没有做我期望他们做的事情.
谁能给我一个提示?
我正准备开始一个项目,我将为餐馆建立一个推荐引擎.我一直在neo4j(图db)和mongodb(文档db)之间胡扯.我的节点/文件将是餐厅和人.我知道我会想要一些边缘,例如person-> likes-> restaurant,或person-> ate_at-> restaurant.然而,我的主要问题是在位置Y的X英里内找到餐馆.
如果我在Y的X英里内有20个餐厅,但没有任何边缘连接,neo4j将如何处理空间查询?我知道使用mongodb我可以在lat/long上索引并查询所有餐馆类型.neo4j在断开连接的图形中提供相同的功能吗?
当谈到诸如"我的朋友经常吃哪些餐馆?"之类的问题时,neo4j(图表数据库)的方法是什么?或mongodb(文档数据库)为我提供类似的功能?
如果我在本地安装了SQL Server 2008和SQL Server 2012,我只想亲自尝试一下; 但是我只安装了新版本,并希望保持这种方式.
Microsoft.SqlServer.Types.dll,主要版本10.Microsoft.SqlServer.Types.dll,主要版本为11.除其他外,两个程序集都暴露了一种SqlGeometryBuilder类型.两个程序集版本之间的一个显着区别是2012类型有一个额外的重载方法AddCircularArc,而2008类型没有.
因为并行引用这两个程序集并不是一件容易的事(也许是一个坏主意),我想知道我是否可以使用2012版本 - 即使是针对SQL Server 2008实例,只要我不使用它AddCircularArc.
任何人都可以分享他们的经验吗?
spatial backwards-compatibility sql-server-2008 sql-server-2012 sqlgeometry
我有一个包含大约100000个点的数据集和另一个包含大约3000个多边形的数据集.对于每个点我需要找到最近的多边形(空间匹配).多边形内的点应与该多边形匹配.
计算所有对距离是可行的,但需要的时间比必要的长.是否有一个R包将利用空间索引来解决这种匹配问题?
我知道sp包和over函数,但文档没有告诉任何关于索引.
我目前正在研究一个优化问题,该问题需要在所有基本方向上找到大于(或在某些情况下小于)特定点的所有点.例如,在2D中,我可能需要找到满足条件的所有点:
x > x* and y < y*
for an arbitrary point (x*,y*)
Run Code Online (Sandbox Code Playgroud)
(例如 - 如果下图中的蓝点是(x*,y*),我需要蓝色虚线定义的框中的所有点).
注意:我需要这是一个N维结构/搜索,因为我的实际优化问题有两个以上的目标,必须解决.典型的搜索空间大约为1000-5000点,并且具有2到5个维度.
是否有任何特定的数据结构非常适合此目的?在过去,我使用kd-trees来查找最近的邻居,以及半径内的所有点,但是在这种情况下我需要定向搜索.看起来某种形式的R-Tree可以解决这个问题,我的搜索矩形将分别从x*,y*变为一些主要的正值和负值.是否有更好的数据结构特定于这种搜索?

我有一个df1包含10列的数据框.其中两列是lng和lat.我想创建一个SpatialPointsDataframefrom df1.当我读到如何创建SpatialPointsDataframe时,感觉就像我必须m1从我的两个坐标列创建一个矩阵,然后将该矩阵分配给数据帧'df1`.
这将是一个绕道,因为我的坐标已经是我的数据框中的一列df1.此外,我如何确保矩阵m1中的坐标分配给我的数据帧中的正确行df1?
多数民众赞成我的df1样子
> df1
a b c d e lat lng
1 12 f2 23 dd 2d 15.6 80.9
2 12 g5 99 NA hh 20.9 10.9
3 13 g4 12 aa 3r3 1.2 81.8
4 .. .. .. .. .. .. ..
Run Code Online (Sandbox Code Playgroud) 在阅读了很多帖子和网站后,我找不到如何从我的lon-lat数据表创建多边形shapefile.我想创建像这样的地图.

我的csv数据文件包含地中海1000点的经度,纬度和属性.我想按属性创建shapefile子集化数据,然后用ggplot2绘制geom_polygon,填充属性.
我试过这个R代码(来自/sf/answers/1792571371/)但没有成功
library("sp")
library("rgdal")
clust1 <- subset(datos, datos$cluster == 1)
coords<-cbind(clust1$longitud,clust1$latitud)
sp_poly <- SpatialPolygons(list(Polygons(list(Polygon(coords)), ID=1)))
sp_poly_df <- SpatialPolygonsDataFrame(sp_poly, data=data.frame(ID=1))
writeOGR(sp_poly_df, "chull", layer="chull", driver="ESRI Shapefile")
ggplot() + geom_polygon(data=sp_poly_df, aes(x=long, y=lat, group=group))
Run Code Online (Sandbox Code Playgroud)
这产生的输出显然不是shapefile/polygon
plot(sp_poly_df) 给出这个:
我是否需要先使用ggplot强化sp_poly_df以进行绘图?
如何创建shapefile或SpatialPolygon?我想将所有具有相同聚类属性的点合并,以映射数据集中的不同区域/多边形,然后使用聚类值填充多边形.也许这样,创建多边形/ shapefile,不是生成这种类型的地图的最佳方法.
也尝试了,geom_map但它不是我想要的:
ggplot() +
geom_point(data=datos, aes(x=longitud, y=latitud, color=id),
alpha=1, na.rm=TRUE) + scale_size(range=c(1,12)) +
scale_color_identity() +
labs(title= "med cluster",
x="Longitude", y= "Latitude") + coord_map()
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助
使用的数据:
> dput(dato)
structure(list(longitud = c(18.875, 19.125, 19.375, 18.375, 18.625,
18.875, 19.125, 19.375, 19.625, …Run Code Online (Sandbox Code Playgroud) spatial ×10
r ×4
geospatial ×2
shapefile ×2
algorithm ×1
c# ×1
ef-core-2.2 ×1
ggplot2 ×1
intersect ×1
matching ×1
mongodb ×1
neo4j ×1
optimization ×1
polygon ×1
r-sp ×1
search ×1
sql ×1
sqlgeometry ×1