我的表中有一个带有空间索引的地理类型列.如何在使用索引来提高性能的同时选择在给定纬度/经度的X米范围内的前N行?
我有一个应用程序,用户可以在其中绘制区域,然后检查多段线是否穿过它们。
突然间,应用程序因错误而崩溃:
A .NET Framework error occurred during execution of user-defined routine or aggregate "geography":
System.ArgumentException: 24144: This operation cannot be completed because the instance is not valid. Use MakeValid to convert the instance to a valid instance. Note that MakeValid may cause the points of a geometry instance to shift slightly.
System.ArgumentException:
at Microsoft.SqlServer.Types.SqlGeography.STIntersects(SqlGeography other)
Run Code Online (Sandbox Code Playgroud)
我对“Use MakeValid”消息感到惊讶,因为我正在使用“MakeValid”,如下所示:
Select ZonePolygonId, ZoneName, isHome FROM dbo.SpatialZonePolygons
WHERE Coordinates.STIntersects(geography::STGeomFromText('LINESTRING(51.15826 -0.18398, 51.15855 -0.18404, 51.15883 -0.18414, 51.15903 -0.18427, 51.15915 -0.18437, 51.15922 -0.1845, 51.15918 -0.18493, 51.15882 …Run Code Online (Sandbox Code Playgroud) 我在SinglePageApplication中使用DbGeography-Type(带微风和角度).现在使用带有DbGeography-Type的数据(readOnly)时没有问题.
只要我保存了一个具有DbGeography-Type属性的实体,就会出现以下错误:
Error getting value from 'WellKnownValue' on 'System.Data.Entity.Spatial.DbGeography'
Run Code Online (Sandbox Code Playgroud)
当数据被序列化为JSON(使用newtonsoft JSON.NET或ODATA/WebAPI?)时,DbGeography会被正确序列化,但属性"WellKownValue"被称为"Geography".这也反映在MSDN文档中:
[DataMemberAttribute(Name = "Geography")]
public DbGeographyWellKnownValue WellKnownValue { get; set; }
Run Code Online (Sandbox Code Playgroud)
我的实体看起来像这样(通过电线):
{
..
"Name" : "Test",
"Coordinate" : {
"$id" : "3",
"$type" : "System.Data.Entity.Spatial.DbGeography, EntityFramework",
"Geography" : {
"$id" : "4",
"$type" : "System.Data.Entity.Spatial.DbGeographyWellKnownValue, EntityFramework",
"CoordinateSystemId" : 4326,
"WellKnownText" : "POINT (8.73275400148029 47.5006958431132)"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想当它稍后被反序列化时,JSON.NET不知道我的对象的Geography -Property实际上被称为WellKnownValue.
我使用的是Newtonsoft.Json-Package版本7.0.1和Microsoft.Data.OData版本5.6.4.
怎样才能解决这个问题?
我正在使用SQL Server.
我有两个这样的表:
表1:
Column1, Column2, Column3, GeoLoc
-----------------------------------
a b c 0xE61...
Run Code Online (Sandbox Code Playgroud)
表2:
Column1, Column2, Column3, GeoLoc
-----------------------------------
a b c 0xE62...
Run Code Online (Sandbox Code Playgroud)
我希望得到一个输出表,它将比较两个表中的所有点,并告诉我哪里table1有一个GeoLoc在X距离内GeoLoc的位置table2.
有谁知道如何去做?一个表有大约800行,另一个表有大约300,000行.我甚至难以开始......
我有一个有趣/恼人的问题,在矩形边界内找到纬度和长标记.我相信我的两点在我的矩形边界内.但是你可以测试自己第一个选择的结果是假的而不是真的!
DECLARE @boundingRect varchar(1000)
DECLARE @maxLat VARCHAR(20)
DECLARE @minLong VARCHAR(20)
DECLARE @minLat VARCHAR(20)
DECLARE @maxLong VARCHAR(20)
set @maxLat ='-36.06631759541187'
set @minLong ='125.23310677812492'
set @minLat ='-44.43329881450396'
set @maxLong='167.04707162187492'
SET @boundingRect = 'POLYGON((' + @minLong + ' ' + @minLat + ', ' +
@maxLong + ' ' + @minLat + ', ' +
@maxLong + ' ' + @maxLat + ', ' +
@minLong + ' ' + @maxLat + ', ' +
@minLong + ' ' + @minLat + '))' …Run Code Online (Sandbox Code Playgroud) 我们有一个 API,它将 MS SQL 地理类型转换为众所周知的文本,并将其发送到前端,然后将 WKT 发送到 OpenLayer 地图,后者呈现画布(边界、区域等)。
我正在寻找一种方法来减少客户端的有效负载,并将多边形、multypoligons 和地图一般转换为后端的 png。
我尝试的是将画布转换为 base64,并将其另存为 PNG。效果很好,但我需要一个完整的后端解决方案。
我尝试使用 SharpMap,但它已经很旧了,它导致了我的依赖性问题,而且我没有设法让它工作。
我找到了一个测试 SHP 文件,并尝试将其渲染到 Windows 窗体中的 PictureBox 进行测试,但我得到的只是一个空的白框。
SharpMap.Map myMap = new SharpMap.Map(new Size(600, 300));
myMap.BackColor = Color.White;
var shapeFileProvider = new SharpMap.Data.Providers.ShapeFile(@"C:\Users\test\Downloads\FRA_adm\FRA_adm1.shp", true);
SharpMap.Layers.VectorLayer myLayer = new SharpMap.Layers.VectorLayer("World Countries");
myMap.Layers.Add(myLayer);
myMap.ZoomToExtents();
myLayer.DataSource = shapeFileProvider;
pictureBox1.Image = myMap.GetMap();
Run Code Online (Sandbox Code Playgroud)
关于如何解决这个问题的任何想法?
编辑:我什至尝试过geoserver,但它看起来不支持空间地理,而只支持几何。
我需要找到一种方法将边界、区域、国家/地区转换为 c# 后端中的图像。
编辑 2:您正在使用 SHP 文件进行测试,但我真正想要的是从 Sql Server Geography 类型呈现它。
sqlgeography ×6
.net ×2
c# ×2
sql ×2
sql-server ×2
t-sql ×2
breeze ×1
geography ×1
geolocation ×1
json.net ×1
openlayers ×1
polygons ×1
spatial ×1