标签: sqlgeography

EntityType'DbGeography'没有定义键

长时间听众,第一次来电(最后在这里开了帐户!)......

我正在使用Visual Studio 2013.NET 4.5.1实体框架6(最终版本,而不是RC或beta).

尝试向我的实体添加DbGeography属性时,执行时出现此错误:

    One or more validation errors were detected during model generation:
    Geocoder.DbGeography: : EntityType 'DbGeography' has no key defined.
    Define the key for this EntityType.
    DbGeographies: EntityType: EntitySet 'DbGeographies' is based on type 'DbGeography' that has no keys defined.
Run Code Online (Sandbox Code Playgroud)

我已经确认我没有引用旧版本的Entity Framework(这里讨论).我一直在使用这篇文章这篇MSDN文章中的示例/信息,因为这是我第一次涉及.NET中的空间类型(以及SQL Server,就此而言).

这是我的实体:

public class Location
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string …
Run Code Online (Sandbox Code Playgroud)

.net c# entity-framework sqlgeography entity-framework-5

25
推荐指数
1
解决办法
5410
查看次数

如何递归地找到两个表之间的相交地理位置

我正在运行Postgres 9.6.1和PostGIS 2.3.0 r15146并且有两个表.
geographies可能有150,000,000行,paths可能有10,000,000行:

CREATE TABLE paths (id uuid NOT NULL, path path NOT NULL, PRIMARY KEY (id))
CREATE TABLE geographies (id uuid NOT NULL, geography geography NOT NULL, PRIMARY KEY (id))
Run Code Online (Sandbox Code Playgroud)

给定一个数组/套ids的表geographies,什么是查找所有交叉路径与几何的"最佳"的方式?

换句话说,如果一个初始geography有一个相应的交叉,path我们还需要找到这个相交的所有其他 .从那里,我们需要找到这些新发现的所有其他相交,依此类推,直到我们找到所有可能的交叉点.geographiespathpathsgeographies

初始地理标识(我们的输入)可以是0到700之间的任何位置.平均值大约为40.
最小交叉点将为0,最大值将为大约1000.平均值可能大约为20,通常小于100连接.

我创建了一个这样做的功能,但我是PostGIS中的GIS和Postgres的新手.我发布了我的解决方案作为这个问题的答案.

我觉得应该有比我想出的更有说服力和更快速的方式.

sql gis postgresql postgis sqlgeography

17
推荐指数
1
解决办法
1631
查看次数

谷歌地图和SQL Server LINESTRING长度不一致

谷歌地图和MSSQL似乎不同意如何使用SRID 4326计算折线/线串的距离/长度.

MSSQL:

SELECT geography::STGeomFromText('LINESTRING(-98.78 39.63,2.98 27.52)', 4326).STLength()
Run Code Online (Sandbox Code Playgroud)

结果: 9030715.95721209

然后谷歌地图:

http://jsbin.com/niratiyojo/1/

结果: 9022896.239500616

起初我以为它只是一个不同的地球测量半径,所以我玩弄了它,事实证明它更多.

我需要我的JavaScript界面​​来匹配MSSQL报告的内容以保持一致和准确.我在哪里或如何找到MSSQL如何计算它们STLength()并且可以在JavaScript中复制?

更新:

我意识到我是否这样做

SELECT GEOGRAPHY::STGeomFromText('LINESTRING(-98.78 39.63,2.98 27.52)', 104001).STLength() * 6378137
Run Code Online (Sandbox Code Playgroud)

然后MSSQL返回 9022896.23950062

MSSQL中的新SRID:

新的"单位球体"空间参考ID SQL Server 2012中的默认空间参考ID(SRID)为4326,它使用公制系统作为其度量单位.该SRID也代表地球真正的椭球形状.虽然这种表示最准确,但计算精确椭球数学也更复杂.SQL Server 2012通过添加新的空间参考ID(SRID)104001来提供速度和准确性的折衷,它使用半径为1的球体来表示完美的圆形地球.

所以问题是Google Maps在计算中不使用真正的椭球体.我正在寻找一个9030715.95721209见证的javascript函数.

我在这里试过Vincenty直接公式:http://jsbin.com/noveqoqepa/1/edit?html,js,console,虽然距离我更接近我仍然无法匹配MSSQL

编辑2:

我能够找到它使用的测量值:

SridList._sridList.Add(4326, new SridInfo(4326, "EPSG", 4326, "GEOGCS[\"WGS 84\", DATUM[\"World Geodetic System 1984\", ELLIPSOID[\"WGS 84\", 6378137, 298.257223563]], PRIMEM[\"Greenwich\", 0], UNIT[\"Degree\", 0.0174532925199433]]", "metre", 1.0, 6378137.0,
6356752.314));
Run Code Online (Sandbox Code Playgroud)

但似乎将这些插入Vincenty不会产生任何好运.

javascript sql-server gis google-maps sqlgeography

16
推荐指数
2
解决办法
904
查看次数

将SQL地理转换为C#

这个地理空间T-SQL代码的C#等价物是什么?

DECLARE @g geography;
DECLARE @h geography;
SET @g = geography::STGeomFromText('POLYGON((-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))', 4326);
SET @h = geography::Point(47.653, -122.358, 4326)

SELECT @g.STIntersects(@h)
Run Code Online (Sandbox Code Playgroud)

我试图使用SqlGeometry数据类型在多边形中找到一个点- 并且可以使用上面的T-SQL; 但我不明白如何实现等效的C#代码.

c# t-sql sql-server sqlgeography

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

为什么SQL Server GEOGRAPHY允许-15069°和+ 15069°之间的经度?为什么±15069°?

我在我的项目中使用Microsoft.SqlServer.Types DLL来验证纬度和经度.

图书馆验证-15069和15069度之间的经度值,而不是-180到180.有人可以解释微软检查经度值在-15069和15069度之间的意义或原因是什么?

Microsoft已在此网站上列出了Geo Spatial标准的标准,其中提到经度值必须介于-15069和15069度之间(包括端点).

https://msdn.microsoft.com/en-us/library/ee301753(v=sql.105).aspx

您对理解这一概念的意见将不胜感激!

sql sql-server geospatial latitude-longitude sqlgeography

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

是否可以使用Linq to Sql的SqlGeography?

我尝试使用时遇到了很多问题Microsoft.SqlServer.Types.SqlGeography.我完全知道在Linq to Sql中对此的支持并不是很好.我尝试了很多方法,从预期的方式(数据库类型geography,CLR类型SqlGeography)开始.这产生了NotSupportedException,这通过博客广泛讨论.

然后我走了将geography列视为一个路径varbinary(max),就像geography存储为二进制的UDT一样.这似乎工作正常(使用一些二进制读取和写入扩展方法).

但是,我现在遇到了一个相当模糊的问题,这似乎并没有发生在许多其他人身上.

System.InvalidCastException:无法将类型为"Microsoft.SqlServer.Types.SqlGeography"的对象强制转换为"System.Byte []".

ObjectMaterializer在迭代查询时抛出此错误.它似乎只有在包含地理列的表隐式包含在查询中时(即使用EntityRef<>属性进行连接)才会出现.

System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()

我的问题:如果我正在检索geographyvarbinary(max),我可能会发现反向错误:无法转换byte[]SqlGeography.我明白了.我没有.我对部分LINQ to SQL类有一些隐藏二进制转换的特性......那可能是问题吗?

任何帮助表示赞赏,我知道可能没有足够的信息.

附加功能:

  • 一个geography在Visual Studio DBML"服务器数据类型" =设计师列geography生成此错误:The specified type 'geography' is not a valid provider type.
  • 一个geography在Visual Studio DBML没有"服务器数据类型"列设计师生成此错误:Could not format node 'Value' for execution as SQL.

c# sql-server geography linq-to-sql sqlgeography

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

在SQL Server管理工作室的地理列中输入数据

我在SQL Server Management Studio中创建了一个新表,其中包含一个Geography列.现在,我正在尝试使用SSMS UI在此列中输入数据,但我找不到正确的方法.

那么,怎么做呢?

sql-server-2008 sqlgeography

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

从中心和半径创建一个SqlGeography多边形圆

我想使用c#在sql-server 2008地理字段中保存一个圆圈.

在c#中,我有纬度,经度和半径,但我找不到计算代表圆圈的多边形并SqlGeography从中创建的方法.

我试过跟随函数来创建多边形:

    private List<Coordinate> getCirclePoints(Coordinate center, int radius, int speed)  //speed 1: draws 360 sides, 2 draws 180 etc...
    {
        var centerLat = (center.Latitude * Math.PI) / 180.0;  //rad
        var centerLng = (center.Longitude * Math.PI) / 180.0; //rad
        var dist = (float)radius / 6371.0;             //d = angular distance covered on earth's surface
        var circlePoints = new List<Coordinate>();
        for (int x = 0; x <= 360; x += speed)
        {
            var brng = x * Math.PI / …
Run Code Online (Sandbox Code Playgroud)

c# sql-server geospatial sqlgeography

9
推荐指数
1
解决办法
7186
查看次数

使用Dapper映射SqlGeography

我有实体"点",包含Id,文本和地理坐标.

CREATE TABLE [Point] (
    [Id] INT IDENTITY CONSTRAINT [PK_Point_Id] PRIMARY KEY,
    [Coords] GEOGRAPHY NOT NULL,
    [Text] NVARCHAR(32) NOT NULL,
    [CreationDate] DATETIME NOT NULL,
    [IsDeleted] BIT NOT NULL DEFAULT(0)
)

CREATE PROCEDURE [InsertPoint]
    @text NVARCHAR(MAX),
    @coords GEOGRAPHY
AS BEGIN
    INSERT INTO [Point](Text, Coords, CreationDate)
    VALUES(@text, @coords, GETUTCDATE())    
    SELECT * FROM [Point] WHERE [Id] = SCOPE_IDENTITY()
END
Run Code Online (Sandbox Code Playgroud)

这是表的sql代码和插入的存储过程.我有使用短小精悍的课程:

public class DapperRequester : IDisposable {
    private readonly SqlConnection _connection;
    private SqlTransaction _transaction;

    public DapperRequester(string connectionString) {
        _connection = new SqlConnection(connectionString);
        _connection.Open();
    } …
Run Code Online (Sandbox Code Playgroud)

c# sql-server mapping sqlgeography dapper

9
推荐指数
1
解决办法
4220
查看次数

Microsoft.SqlServer.Types 与 .NET Standard 不兼容

我正在尝试将我们所有的 C# 类库从 .NET Framework 转换为 .NET Standard 项目,因为我们开始利用 .NET Core,因此需要这些可以被 .NET Core 和 .NET Framework 应用程序使用(使用后者将在未来几个月内移植到 Core。)

我在转换数据访问层代码时遇到问题,因为我们广泛利用 Microsoft.SqlServer.Types,而官方 NuGet 包不支持 .NET Standard。我尝试了dotmorten非官方 NuGet 包,但它缺少很多功能。下面是我们需要的所有缺失的列表(放在一起以获得代码构建......)

public static class SqlMockExtensions
{
    public static SqlBytes STAsBinary(this SqlGeography geography) => throw new NotImplementedException();

    public static SqlGeography MakeValid(this SqlGeography geography) => throw new NotImplementedException();

    public static int STDimension(this SqlGeography geography) => throw new NotImplementedException();

    public static bool STIsValid(this SqlGeography geography) => throw new NotImplementedException();

    public static Nullable<double> …
Run Code Online (Sandbox Code Playgroud)

c# sql-server sqlgeography sqlgeometry .net-standard

9
推荐指数
1
解决办法
3333
查看次数