标签: spatial

选择具有大多边形的良好SQL Server 2008空间索引

我正在尝试为我正在处理的数据集选择一个不错的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

12
推荐指数
2
解决办法
1万
查看次数

EF Core 2.2 空间类型无法添加到数据库迁移

我正在尝试使用 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)

c# entity-framework spatial ef-core-2.2

12
推荐指数
1
解决办法
4573
查看次数

联合Postgres中的GeomUnion等SQL Server表中的所有几何体

只是为了澄清前面:我说的是联合几何,而不是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)

sql spatial sql-server-2008

11
推荐指数
3
解决办法
1万
查看次数

R中的相交点和多边形

我在R中使用shapefile ,一个是point.shp,另一个是polygon.shp.现在,我想将点与多边形相交,这意味着多边形中的所有值都应该附加到point.shp的表中.

我在包sp中尝试了overlay()和spRbind,但没有做我期望他们做的事情.

谁能给我一个提示?

r spatial shapefile intersect

11
推荐指数
2
解决办法
1万
查看次数

neo4j vs mongodb用于空间搜索

我正准备开始一个项目,我将为餐馆建立一个推荐引擎.我一直在neo4j(图db)和mongodb(文档db)之间胡扯.我的节点/文件将是餐厅和人.我知道我会想要一些边缘,例如person-> likes-> restaurant,或person-> ate_at-> restaurant.然而,我的主要问题是在位置Y的X英里内找到餐馆.

如果我在Y的X英里内有20个餐厅,但没有任何边缘连接,neo4j将如何处理空间查询?我知道使用mongodb我可以在lat/long上索引并查询所有餐馆类型.neo4j在断开连接的图形中提供相同的功能吗?

当谈到诸如"我的朋友经常吃哪些餐馆?"之类的问题时,neo4j(图表数据库)的方法是什么?或mongodb(文档数据库)为我提供类似的功能?

spatial mongodb neo4j

11
推荐指数
2
解决办法
4990
查看次数

SQL Server 2012版本的Microsoft.SqlServer.Types几何UDT是否与SQL Server 2008向后兼容?

如果我在本地安装了SQL Server 2008和SQL Server 2012,我只想亲自尝试一下; 但是我只安装了新版本,并希望保持这种方式.

  • SQL Server 2008附带一个程序集Microsoft.SqlServer.Types.dll,主要版本10.
  • SQL Server 2012附带了一个程序集Microsoft.SqlServer.Types.dll,主要版本为11.

除其他外,两个程序集都暴露了一种SqlGeometryBuilder类型.两个程序集版本之间的一个显着区别是2012类型有一个额外的重载方法AddCircularArc,而2008类型没有.

因为并行引用这两个程序集并不是一件容易的事(也许是一个坏主意),我想知道我是否可以使用2012版本 - 即使是针对SQL Server 2008实例,只要我不使用它AddCircularArc.

任何人都可以分享他们的经验吗?

spatial backwards-compatibility sql-server-2008 sql-server-2012 sqlgeometry

11
推荐指数
2
解决办法
8696
查看次数

大数据集的空间匹配

我有一个包含大约100000个点的数据集和另一个包含大约3000个多边形的数据集.对于每个点我需要找到最近的多边形(空间匹配).多边形内的点应与该多边形匹配.

计算所有对距离是可行的,但需要的时间比必要的长.是否有一个R包将利用空间索引来解决这种匹配问题?

我知道sp包和over函数,但文档没有告诉任何关于索引.

r spatial matching spatial-index

11
推荐指数
1
解决办法
1262
查看次数

用于查找大于或小于每个笛卡尔维度中的值的所有点的空间数据结构

我目前正在研究一个优化问题,该问题需要在所有基本方向上找到大于(或在某些情况下小于)特定点的所有点.例如,在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*变为一些主要的正值和负值.是否有更好的数据结构特定于这种搜索?

示例情节

algorithm optimization search spatial data-structures

11
推荐指数
1
解决办法
591
查看次数

创建SpatialPointsDataframe

我有一个df1包含10列的数据框.其中两列是lnglat.我想创建一个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)

r spatial geospatial r-sp

11
推荐指数
2
解决办法
2万
查看次数

从数据框中的点创建shapefile

在阅读了很多帖子和网站后,我找不到如何从我的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)

r polygon spatial shapefile ggplot2

11
推荐指数
1
解决办法
1750
查看次数