我在将表格加载到设计器中时遇到了一些问题.我收到以下错误.
一个或多个所选项目包含设计者不支持的数据类型
假设它是表中使用的导致此错误的地理类型,我是否正确?
任何指针都非常赞赏.
我正在构建一个以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()对我来说效率似乎也低效.
有没有人对此表现有任何建议/意见?
我正在尝试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)
怎么了
我正在运行以下:
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
我正在使用Entity Framework Core 2.2与NetTopologySuite 1.15.1和SQL 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
我最近一直在试验地理数据类型并且喜欢它.但是我无法决定是否应该从我当前的模式转换,将两个单独的数字(9,5)字段中的纬度和经度存储到地理类型.我已经计算了两种类型的大小,Lat/Long表示一个点的方式是单个点28个字节,而地理类型是26个.空间不是很大的增益,但是在执行地理空间操作(交叉,距离测量等)方面有很大改进.当前使用笨拙的存储过程和标量函数处理的.我想知道的是指数.地理数据类型是否需要更多空间来索引数据?我有一种感觉,即使存储在列中的实际数据较少,我认为地理空间索引的工作方式最终会为它们带来更大的空间分配.
PS作为旁注,似乎SQL Server 2008(不是R2)不会自动搜索地理空间索引,除非明确告知使用WITH(INDEX())子句
我正在使用新的Entity-Framework 5,使用Spatial数据类型DbGeography作为我的模型的一部分,用于在一个实例中存储POINT,在另一个实例中存储POLYGON.
设置我的POLYGON的值时,所有保存都没有错误,但只有在按顺时针顺序在地图上绘制多边形时才会出现这种情况.如果我以逆时针方向绘制POLGON,我会得到sql级别的错误,表明数据是无效的地理类型.
在对问题进行自己的研究之后,它似乎源于地理数据类型在多边形环方向方面非常严格.最常见的解决方案似乎是将Polygon创建为几何体,然后将其转换为地理类型.
我正在寻找一种C#解决方案,可以在将数据发送到sql之前应用于数据.基本上会自动纠正坐标数组的环方向.
我已经尝试捕获错误,然后通过反转数组重建字符串.这在某些情况下有效,但首先它不可靠,其次捕获错误是一个很大的性能损失.
谢谢克里斯
考虑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)
如何将它们选择回纬度和经度格式?
非常感谢.
STIntersects正在返回误报
我相信多边形坐标是一个贡献者是因为我尝试了以下内容:
怎么会这样?
这是重建问题的方法.
将问题多边形添加到地理数据库字段:
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) 我知道 .Net EF Core 目前不支持 SQL Server 地理和几何数据类型,但我仍然希望在标准 .Net Core 2.1 中使用它们。Microsoft.SqlServer.Types 包似乎在 Core 中不起作用,至少不能作为通过 NuGet 的默认安装。
是否直接或作为解决方法支持 Core 中的地理?到目前为止,找到的参考是 Core 2 之前的版本。
sqlgeography ×10
sql-server ×5
c# ×4
sql ×2
.net-core ×1
ado.net ×1
asp.net-core ×1
geography ×1
geojson ×1
geospatial ×1
google-maps ×1
indexing ×1
json ×1
linq-to-sql ×1
polygon ×1
spatial ×1
sqlgeometry ×1
wkt ×1