我正在使用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来计算固定位置与数据库中场地的位置之间的距离.
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中调用数据库方法,但我不希望这样做.我希望有一个计算距离的公式.谢谢
我有一个多边形的SqlGeographys列表.我想将它们组合成一个多面体类型的SqlGeography.
List<SqlGeography> areaPolygons = GetAreaPolygons()
SqlGeography multiPoly = null;
foreach (SqlGeography geog in areaPolygons)
{
/// Combine them somehow?
}
Run Code Online (Sandbox Code Playgroud) 我有包含相关城镇(数据类型)的多边形的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多边形则采用与上述相同的方法.
我无法使用地理来计算使用我的表格格式的英里距离.
两个位置的纬度和经度并排:
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) 我正在研究选择与给定坐标一定距离内的最近点的性能。
选项是使用两个decimal(8,6)纬度、长列或单列geography并使用它。
我只感兴趣哪个更快?
sql sql-server database-performance sqlgeography geographic-distance
我编写了一个小应用程序,它从一系列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) 我正在使用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?任何想法都表示赞赏!
我有一个名为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
这里也提出了类似的问题:
进一步提出这个问题,我有一个如下所示的表模式:
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) sqlgeography ×10
sql-server ×6
c# ×4
sql ×4
geography ×2
geospatial ×2
t-sql ×2
.net ×1
kml ×1
polygon ×1
sqlgeometry ×1