标签: sqlgeography

LINQ to SQL Designer和Geography数据类型

我在将表格加载到设计器中时遇到了一些问题.我收到以下错误.

一个或多个所选项目包含设计者不支持的数据类型

假设它是表中使用的导致此错误的地理类型,我是否正确?

任何指针都非常赞赏.

visual-studio-2010 linq-to-sql sqlgeography

8
推荐指数
1
解决办法
4154
查看次数

将SQLGeography多边形重新格式化为JSON

我正在构建一个以JSON格式提供地理边界数据的Web服务.

地理数据使用表中的地理类型存储在SQL Server 2008 R2数据库中.我使用[ColumnName].ToString()方法将多边形数据作为文本返回.

示例输出:

POLYGON ((-6.1646509904325884 56.435153006374627, ... -6.1606079906751 56.4338050060666))

MULTIPOLYGON (((-6.1646509904325884 56.435153006374627 0 0, ... -6.1606079906751 56.4338050060666 0 0)))
Run Code Online (Sandbox Code Playgroud)

地理定义可以采用定义多边形的纬度/长度对数组的形式,或者在多个定义的情况下,采用数组或多边形(多边形).

我有以下正则表达式,根据输出将输出转换为多维数组中包含的JSON对象.

Regex latlngMatch = new Regex(@"(-?[0-9]{1}\.\d*)\s(\d{2}.\d*)(?:\s0\s0,?)?", RegexOptions.Compiled);

    private string ConvertPolysToJson(string polysIn)
    {
        return this.latlngMatch.Replace(polysIn.Remove(0, polysIn.IndexOf("(")) // remove POLYGON or MULTIPOLYGON
                                               .Replace("(", "[")  // convert to JSON array syntax
                                               .Replace(")", "]"), // same as above
                                               "{lng:$1,lat:$2},"); // reformat lat/lng pairs to JSON objects
    }
Run Code Online (Sandbox Code Playgroud)

这实际上工作得很好,并且在响应操作调用时动态地将DB输出转换为JSON.

然而,我不是正则表达式大师,而且String.Replace()对我来说效率似乎也低效.

有没有人对此表现有任何建议/意见?

c# json geojson sqlgeography wkt

8
推荐指数
3
解决办法
7087
查看次数

通过ado.net插入DBGeography类型的正确方法是什么

我正在尝试DBGeography通过ado.net 插入类型,但是没有运气。
这是我得到的错误:

从对象类型System.Data.Entity.Spatial.DbGeography到已知的托管提供程序本机类型不存在映射。

要么:

指定的类型未在目标服务器上注册。System.Data.Entity.Spatial.DbGeography,EntityFramework,Version = 6.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089。

这是我从db获取它时所做的,并且工作正常:

dynamic temp = reader.GetValue(3);

                var text = string.Format("POINT({0:R} {1:R})", temp.Long, temp.Lat);
                var srid = temp.STSrid.Value;
                this.Coordinates = System.Data.Entity.Spatial.DbGeography.PointFromText(text, srid);
Run Code Online (Sandbox Code Playgroud)

但是插入不起作用:

updateCommand.Parameters.AddWithValue("@Coordinates", store.Coordinates);
// or ...
SqlParameter p = new SqlParameter();
                    p.ParameterName = "@Coordinates";
                    p.Value = store.Coordinates;
                    p.SqlDbType = System.Data.SqlDbType.Udt;
                    p.UdtTypeName = "geography";
                    updateCommand.Parameters.Add(p);
Run Code Online (Sandbox Code Playgroud)

怎么了

c# sql-server ado.net entity-framework sqlgeography

8
推荐指数
1
解决办法
884
查看次数

由于此查询中定义的提示,查询处理器无法生成查询计划.重新提交查询,而不使用SET FORCEPLAN

我正在运行以下:

DECLARE @g geography;
declare @point nvarchar(50)  =''
declare @i int =0,
        @lat decimal(8,6) =0.0,
        @long decimal(8,6) =0.0,
        @start datetime = getdate()
set @lat =(select (0.9 -Rand()*1.8)*100)
set @long =(select (0.9 -Rand()*1.8)*100)
set @point = (select 'POINT('+CONVERT(varchar(10), @lat)+ '  ' 
             +CONVERT(varchar(10), @long)+')')
SET @g = geography::STGeomFromText(@point, 4326);
SELECT TOP 1000
    @lat,
    @long,
        @g.STDistance(st.[coord]) AS [DistanceFromPoint (in meters)] 
    ,   st.[coord]
    ,   st.id
FROM    Temp st with(index([SpatialIndex_1]))
Run Code Online (Sandbox Code Playgroud)

这个查询表现不佳,因为它不使用空间索引,所以我添加with(index([SpatialIndex_1]))了强制它.

地理指数如下:

CREATE SPATIAL INDEX [SpatialIndex_1] ON [dbo].Temp
(
    [coord]
)USING  GEOGRAPHY_GRID 
WITH …
Run Code Online (Sandbox Code Playgroud)

sql-server indexing sql-server-2008 spatial-index sqlgeography

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

有没有办法用EntityFrameworkCore 2.2声明空间索引?

我正在使用Entity Framework Core 2.2NetTopologySuite 1.15.1SQL Server 2016.拥有一个类型的列IPoint非常有用,我想在它上面创建一个索引.

我有这张桌子

public class Location
{
    public int Id { get; set; }

    public IPoint Coordinates { get; set; }

    public static void Register(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Location>(entity => entity.HasIndex(x => new {x.Coordinates}));
    }
}
Run Code Online (Sandbox Code Playgroud)

EF核心在生成迁移时处理得很好,从而生成以下代码:

migrationBuilder.CreateIndex(
    name: "IX_Locations_Coordinates",
    schema: "data",
    table: "Locations",
    column: "Coordinates");
Run Code Online (Sandbox Code Playgroud)

但是,只要我尝试将迁移应用到数据库,SqlException就会抛出以下消息

SqlException:表'data.Locations'中的列'Coordinates'的类型无效,无法用作索引或统计信息中的键列.

SQL Server的确实对类型的列支持索引geography.

我相信原因可能是EF Core试图创建一个常规索引而不是空间索引.

我做错了什么还是不支持?有没有办法告诉EF Core它应该创建空间索引?

c# sql-server sqlgeography nettopologysuite entity-framework-core

7
推荐指数
1
解决办法
249
查看次数

SQL中的地理空间数据

我最近一直在试验地理数据类型并且喜欢它.但是我无法决定是否应该从我当前的模式转换,将两个单独的数字(9,5)字段中的纬度和经度存储到地理类型.我已经计算了两种类型的大小,Lat/Long表示一个点的方式是单个点28个字节,而地理类型是26个.空间不是很大的增益,但是在执行地理空间操作(交叉,距离测量等)方面有很大改进.当前使用笨拙的存储过程和标量函数处理的.我想知道的是指数.地理数据类型是否需要更多空间来索引数据?我有一种感觉,即使存储在列中的实际数据较少,我认为地理空间索引的工作方式最终会为它们带来更大的空间分配.

PS作为旁注,似乎SQL Server 2008(不是R2)不会自动搜索地理空间索引,除非明确告知使用WITH(INDEX())子句

sql-server geospatial sqlgeography

6
推荐指数
1
解决办法
661
查看次数

如何使用C#Entity Framework 5 DbGeography空间数据校正多边形环方向

我正在使用新的Entity-Framework 5,使用Spatial数据类型DbGeography作为我的模型的一部分,用于在一个实例中存储POINT,在另一个实例中存储POLYGON.

设置我的POLYGON的值时,所有保存都没有错误,但只有在按顺时针顺序在地图上绘制多边形时才会出现这种情况.如果我以逆时针方向绘制POLGON,我会得到sql级别的错误,表明数据是无效的地理类型.

在对问题进行自己的研究之后,它似乎源于地理数据类型在多边形环方向方面非常严格.最常见的解决方案似乎是将Polygon创建为几何体,然后将其转换为地理类型.

我正在寻找一种C#解决方案,可以在将数据发送到sql之前应用于数据.基本上会自动纠正坐标数组的环方向.

我已经尝试捕获错误,然后通过反转数组重建字符串.这在某些情况下有效,但首先它不可靠,其次捕获错误是一个很大的性能损失.

谢谢克里斯

geography polygon spatial sqlgeography entity-framework-5

6
推荐指数
1
解决办法
3527
查看次数

如何从SQL Server Geography数据类型字段中选择Lat&Long坐标

考虑SQL Server的"地理"数据类型......

我可以输入一个纬度和经度数组(顺便说一句,这是正确的顺序还是经度纬度?),如下所示:

INSERT INTO SpatialZonePolygons (Coordinates)
VALUES (geography::STGeomFromText('POLYGON((-122.358 47.653 , -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))', 4326));
GO
Run Code Online (Sandbox Code Playgroud)

然后显示为:

0xE6100000010405000000DD24068195D34740F4FDD478E9965EC0508D976E12D3474083C0CAA145965EC04E62105839D4474083C0CAA145965EC04E62105839D44740F4FDD478E9965EC0DD24068195D34740F4FDD478E9965EC001000000020000000001000000FFFFFFFF0000000003
Run Code Online (Sandbox Code Playgroud)

如何将它们选择回纬度和经度格式?

非常感谢.

sql sqlgeography

6
推荐指数
2
解决办法
8559
查看次数

SQL Server STIntersects查询返回误报

问题

STIntersects正在返回误报

场景

  1. 我使用GoogleMaps绘制一个表示"伦敦拥堵费"区域的多边形,并将坐标保存到地理区域中的数据库中
  2. 我从Google Directions API获取了一条路线的折线
  3. 我检查折线是否与我存储的任何区域相交.

问题

  1. 一条路线在伦敦附近无处可去(避开它50英里),但STIntersects正在展示伦敦市中心伦敦拥堵费多边形的交叉点.
  2. 我知道折线很好,因为我可以在Google地图上渲染它并看到它.我也知道这不是问题(见后)
  3. 多边形坐标似乎绝对正常(虽然我怀疑这里有些不对劲),因为当我在Google地图上直观地渲染多边形时,它会正确显示.

我相信多边形坐标是一个贡献者是因为我尝试了以下内容:

  1. 我创建了两个完全独立的应用程序和数据库实例
  2. 我已经更明确地绘制了伦敦拥堵冲锋区(更多点)
  3. 虽然在视觉上它们看起来非常相似(它们都覆盖了伦敦拥堵收费区域)但是具有更多积分的版本可以正常工作.折线可以直接传递到它旁边而没有报告的交叉点,而具有较少点的版本返回假折线的假阳性,距离它几英里(50奇数).

怎么会这样?

这是重建问题的方法.

将问题多边形添加到地理数据库字段:

INSERT INTO Polygons (ZoneName,Coordinates) VALUES ('IDoNotWork',geography::STGeomFromText(‘POLYGON ((51.48822 -0.13046, 51.49763 -0.09613, 51.51045 -0.07828, 51.52242 -0.09064, 51.52583 -0.1181, 51.52071 -0.15106, 51.50361 -0.14626, 51.48822 -0.13046)) ', 4326))
Run Code Online (Sandbox Code Playgroud)

将工作多边形添加到地理数据库字段:

INSERT INTO Polygons (ZoneName,Coordinates) VALUES ('IWork',geography::STGeomFromText('POLYGON ((51.51964 -0.16788, 51.5222 -0.15518, 51.52412 -0.14076, 51.52925 -0.12463, 51.52968 -0.12222, 51.5284 -0.11776, 51.53139 -0.11158, 51.52968 -0.09853, 51.52626 -0.08892, 51.52541 -0.08377, 51.51665 -0.07244, 51.50596 -0.07622, 51.49592 -0.08411, 51.49506 -0.09544, …
Run Code Online (Sandbox Code Playgroud)

sql sql-server google-maps sqlgeography

6
推荐指数
1
解决办法
1276
查看次数

带有 .Net Core 2.1 的 SQL Server Geography 数据类型

我知道 .Net EF Core 目前不支持 SQL Server 地理和几何数据类型,但我仍然希望在标准 .Net Core 2.1 中使用它们。Microsoft.SqlServer.Types 包似乎在 Core 中不起作用,至少不能作为通过 NuGet 的默认安装。

是否直接或作为解决方法支持 Core 中的地理?到目前为止,找到的参考是 Core 2 之前的版本。

c# sqlgeography sqlgeometry .net-core asp.net-core

6
推荐指数
0
解决办法
992
查看次数