标签: sqlgeography

地理列上的sql server union

我正在使用sql server 2008 R2,我有两个表,区域和设施.两者都有一个包含地理元素的列.

我想在地理元素的交集处计算联合,如下所示:

SELECT * from Regions join Facilities on [Regions].[geography].STIntersects([Facilities].[geography])
Run Code Online (Sandbox Code Playgroud)

这当然不起作用.区域是大多边形,设施是每个点仅包含在一个多边形中的点.

我可以写一些(伪代码)

for each r in Regions:
    for each f in Facilities:
        if f.[geography].STIntersects(r.[geography]):
            print r, f
Run Code Online (Sandbox Code Playgroud)

但是使用数据库的全部意义在于操作集合而不是元素,当然?

那么,有更好的方法吗?

谢谢梅兰妮

sql t-sql sql-server-2008 sqlgeography

4
推荐指数
1
解决办法
1295
查看次数

.NET等效的SQL Server STDistance

我可以使用以下SQL来计算固定位置与数据库中场地的位置之间的距离.

SELECT Location.STDistance(geography::Point(51, -2, 4326)) * 0.00062137119 FROM Venues
Run Code Online (Sandbox Code Playgroud)

请注意,返回的距离以英里为单位,位置字段是地理类型.

我想知道在.NET中它的等价物会返回相同的值.此方法将具有以下签名:

public static double Distance(location1Latitude, location1Longitude, location2Latitude, location2Longitude) {
    return ...;
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以在.NET中调用数据库方法,但我不希望这样做.我希望有一个计算距离的公式.谢谢

.net c# sql-server sqlgeography geographic-distance

4
推荐指数
1
解决办法
2079
查看次数

从Polygon SqlGeographys创建MultiPolygon SqlGeography

我有一个多边形的SqlGeographys列表.我想将它们组合成一个多面体类型的SqlGeography.

List<SqlGeography> areaPolygons = GetAreaPolygons()
SqlGeography multiPoly = null;

foreach (SqlGeography geog in areaPolygons)
{
    /// Combine them somehow?
}
Run Code Online (Sandbox Code Playgroud)

c# sqlgeography

4
推荐指数
1
解决办法
1071
查看次数

SqlGeography从多边形获取多边形

我有包含相关城镇(数据类型)的多边形的Town列的表.TownBoundarygeography

对于每个城镇,我获得了生成KML(XML)文件所需的多边形数据,如:

sqlg = SqlGeography.STPolyFromText(new SqlChars(
town.TownBoundary.WellKnownValue.WellKnownText),
town.TownBoundary.CoordinateSystemId);
for (int i = 1; i <= sqlg.STNumPoints(); i++)
{
    SqlGeography point = sqlg.STPointN(i);
    var pLong = (point.Long).ToString().Replace(",", ".");
    var pLat = (point.Lat).ToString().Replace(",", ".");
    double dLong = double.Parse(pLong, CultureInfo.InvariantCulture);
    double dLat = double.Parse(pLat, CultureInfo.InvariantCulture);
    kmlCoordinates.Add(new Vector(dLat, dLong)); //one point od polygon
}
Run Code Online (Sandbox Code Playgroud)

值以... town.TownBoundary.WellKnownValue.WellKnownText开头POLYGON(..

但最近我意识到一些城镇包含更多的多边形,并且WellKnownText开始时MULTIPOLYGON(..,函数STPolyFromText最终会出错.

我把它放在try{}块中,但是catch{}- 如果值是多面的 - 是否有可能以某种方式得到单个多边形?我知道有方法STMPolyFromText,但是我不能在那里处理单个多边形,只有方法中的点STPolyFromText.

我的目标是将多边形分割为多边形,而foreach多边形则采用与上述相同的方法.

c# geography polygon sqlgeography

4
推荐指数
1
解决办法
1961
查看次数

SQL地理纬度/经度距离计算

我无法使用地理来计算使用我的表格格式的英里距离.

两个位置的纬度和经度并排:

id | A_Latitude | A_Longitude | B_Latitude | B_Longitude
Run Code Online (Sandbox Code Playgroud)

我试图让的地步A,与点一起B,并返回之间的距离A,并B以英里.

我尝试了一些东西,包括类似的东西:

DECLARE @orig geography 
DECLARE @end geography
SELECT
@orig = geography::Point(A_LATITUDE, A_LONGITUDE, 4326) 
,@end = geography::Point(B_LATITUDE, B_LONGITUDE, 4326) 
FROM table1
SELECT 
    ROUND(@END.STDistance(@ORIG)/1609.344,2) AS MILES
    ,@END.STDistance(@ORIG) AS METERS
    ,table1.*
FROM table1;
Run Code Online (Sandbox Code Playgroud)

我在所有行中获得里程和米的重复值.任何人都可以建议我应该如何构建此查询以获取我正在寻找的内容?

编辑:谢谢SQL冲浪!

WITH X AS 
(SELECT 
 geography::Point(A_LATITUDE, A_LONGITUDE, 4326) A
,geography::Point(B_LATITUDE, B_LONGITUDE, 4326) B
,ID
FROM TABLE1)

SELECT 
ROUND(X.B.STDistance(X.A)/1609.344,2) AS MILES
,X.B.STDistance(X.A) AS METERS
,T.*
FROM TABLE1 T
LEFT JOIN …
Run Code Online (Sandbox Code Playgroud)

sql sql-server sqlgeography

4
推荐指数
1
解决办法
1174
查看次数

SQL 几何 VS 小数(8,6) 纬度、经度性能

我正在研究选择与给定坐标一定距离内的最近点的性能。

选项是使用两个decimal(8,6)纬度、长列或单列geography并使用它。

我只感兴趣哪个更快?

sql sql-server database-performance sqlgeography geographic-distance

4
推荐指数
1
解决办法
1309
查看次数

使用SqlGeographyBuilder时,"指定的输入不表示有效的地理实例"异常

我编写了一个小应用程序,它从一系列KML文件读入,然后Microsoft.SqlServer.Types.SqlGeography使用以下代码将它们转换为类型:

    private SqlGeography CreateGeographyFromKML( string kml, bool debug )
    {
        // use SqlGeographyBuilder to help create the SqlGeography type 
        var geographyBuilder = new SqlGeographyBuilder();

        // Get co-ordinates 
        var xml = XDocument.Parse(kml);
        var df = xml.Root.Name.Namespace;
        XElement coordinates = xml.Descendants(df + "coordinates").Single();

        // set the Spatial Reference Identifiers that will used to create the point 
        geographyBuilder.SetSrid(_srid);
        geographyBuilder.BeginGeography(OpenGisGeographyType.Polygon);

        var longLat = coordinates.Value.Split(' ').Select(c => new { Lat = Convert.ToDouble(c.Split(',')[1]), Long = Convert.ToDouble(c.Split(',')[0]) });

        Console.Write("Found {0} ", longLat.Count());

        foreach (var coord …
Run Code Online (Sandbox Code Playgroud)

geography kml geospatial sql-server-2008 sqlgeography

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

从DataReader检索SqlGeography类型时如何解决InvalidCastException?

我正在使用Visual Studio 2013和SQL Server 2012在C#中开发.我已经能够使用T-SQL在地理列中存储多边形,并且我没有尝试在代码中使用SqlGeography类来检索数据.

当我尝试:

SqlGeography polyB = (SqlGeography)dr["extent"]; // stored in OGC Well Known Binary format
Run Code Online (Sandbox Code Playgroud)

从数据库中检索多边形我收到的消息:

GeoLib.dll中发生了未处理的"System.InvalidCastException"类型异常

附加信息:[A] Microsoft.SqlServer.Types.SqlGeography无法强制转换为[B] Microsoft.SqlServer.Types.SqlGeography.类型A源自'Microsoft.SqlServer.Types,Version = 10.0.0.0,Culture = neutral,PublicKeyToken = 89845dcd8080cc91',位于'默认'位置'C:\ Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Types\10.0 .0.0__89845dcd8080cc91\Microsoft.SqlServer.Types.dll".

类型B源自'Microsoft.SqlServer.Types,Version = 11.0.0.0,Culture = neutral,PublicKeyToken = 89845dcd8080cc91',位于'默认'位置'C:\ Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Types\11.0 .0.0__89845dcd8080cc91\Microsoft.SqlServer.Types.dll".

我怀疑SQL Server和Visual Studio之间的版本不兼容,如不同的版本号所示.有没有人碰到这个?也许我需要安装SQL Server 2014?任何想法都表示赞赏!

c# sql-server sqlgeography sql-server-2012

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

将SQL地理Lat/Long转换为VARCHAR而不会降低精度

我有一个名为Location的地理专栏.我需要选择Location.Lat和Location.Long作为单个VARCHAR结果.使用以下我失去了精度:

查询:

SELECT CONVERT(VARCHAR(MAX), Location.Lat) + ' ' + CONVERT(VARCHAR(MAX), Location.Long)
Run Code Online (Sandbox Code Playgroud)

原始Location.Lat: 52.2708633333333

原来的位置.龙: -9.73093666666667

结果表格如上: 52.2709 -9.73094

我知道这是由于Lat和Long是浮点数而没有指定精度所以可能的解决方法是首先以指定的精度强制它为十进制,然后将其转换为varchar.这似乎......笨重,不得不选择随机精度

(a)如果过低或过低,则会丢失拖尾值

(b)额外的不必要的拖尾值.

请告诉我,我缺少一个函数或转换方法,以返回这些作为准确的varchar表示!

sql sql-server sqlgeography floating-point-precision floating-point-conversion

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

按值分组并根据T-SQL中每个组的点(纬度和经度)创建地理折线

这里也提出了类似的问题:

从T-SQL中的点创建地理折线

进一步提出这个问题,我有一个如下所示的表模式:

CREATE TABLE [dbo].[LongAndLats](
[Longitude] [float] NULL,
[Latitude] [float] NULL,
[SortOrder] [bigint] NULL,
[SensorID] [bigint] NULL,
)
Run Code Online (Sandbox Code Playgroud)

示例数据如下所示:

在此输入图像描述

如何使用TSQL 将这些点转换为每个SensorID的地理折线(以便我为每个SensorID设置SensorID/Polyline记录)?

我尝试过使用db_cursor,但我为每个组获得了一个单独的结果集(我认为这些地理位置可能是相同的).这段代码:

DECLARE @SensorID VARCHAR(2000)
DECLARE @LineFromPoints geography
DECLARE @BuildString NVARCHAR(MAX)

DECLARE db_cursor CURSOR FOR  
SELECT Distinct([SensorId]) 
FROM [dbo].[LongAndLats]

OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO LongAndLats 

WHILE @@FETCH_STATUS = 0   
BEGIN   
       SELECT @BuildString = COALESCE(@BuildString + ',', '') + CAST([Longitude] AS NVARCHAR(50)) + ' ' + CAST([Latitude] AS NVARCHAR(50))
       FROM [LongAndLats]
       WHERE SensorID = @SensorID
       ORDER …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server geospatial sqlgeography sqlgeometry

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