所以,Linq并不支持Geography数据类型,它在可爱的"拖动表到Linq设计界面"开发模型上投入了大量的工具.
有什么方法可以扩展Linq以使用Geography数据类型?或者,我是否需要在需要使用Geography列时构建一个全新的数据层和查询集?
我已经被困在这几天了,如果可能的话就无法解决.
根据https://docs.djangoproject.com/en/1.3/ref/contrib/gis/db-api/,Spatialite支持GeoQuerySet.distance().但是,导入区域列表(MultiPolygon作为mpoly属性)后,我正在尝试执行以下操作:
Area.objects.all().distance(center)
Run Code Online (Sandbox Code Playgroud)
而不是可用的东西,我只收到一条错误消息:" ValueError:SQLite不支持大地坐标系上的线性距离计算. "
这里有什么问题,我是否需要在Spatialite上进行一些特殊配置或文档是否错误?
我在SQL Server 2008中有很多Polygons数据类型Geometry.下图显示了所有这些Geometrys的选择看起来如何可视化.

我需要做的是创建一个Polygon,它代表所有这些多边形的外边界.所以我使用了前面提到的空间问题的响应来创建以下代码:
DECLARE @test TABLE(geom GEOMETRY);
INSERT INTO @test SELECT geom FROM ForceBoundary
DECLARE @geom GEOMETRY
SELECT @geom = (SELECT TOP 1 geom FROM @test)
SELECT @geom = @geom.STUnion(geom) FROM @test
SELECT @geom
Run Code Online (Sandbox Code Playgroud)
这产生了以下结果,由于多边形之间的孔洞而产生裂缝:

所以我通过以下更改更新了我的查询:
INSERT INTO @test SELECT geom.Reduce(0.001).STBuffer(100) FROM ForceBoundary
Run Code Online (Sandbox Code Playgroud)
这改善了结果,但它没有完全解决问题,也损害了外边界精度.

实现这一目标的正确方法是什么?通过查看STxxxx函数列表,我看不到一个似乎提供我需要的结果?
我想将geom(geometry)数据类型转换为GeoJSON。我该怎么办?
例如,WKT中的几何:
POLYGON((455216.346127297 4288433.28426224,455203.386722146 4288427.76317716,455207.791765017 4288417.51116228,455220.784166744 4288423.30230044,455216.346127297 4288433.28426224))
Run Code Online (Sandbox Code Playgroud)
转到以下GeoJSON:
{ "type": "Polygon",
"coordinates": [
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ],
[ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2] ]
]
}
Run Code Online (Sandbox Code Playgroud) 我是SQL的新手,我需要帮助来优化空间查询,以便它在2秒内运行.我们已经在各个网站上尝试了一些建议(更多内容见下文).
我们有一个表[Id,Geometry],大约300,000个不同大小和复杂度的几何形状,存储为几何数据类型.我们使用下面的代码片段为Geometry创建了一个空间索引.
CREATE SPATIAL INDEX [IX_Geometry_Spatial]
ON [dbo].[Geometries] ([Geometry]) USING GEOMETRY_AUTO_GRID
WITH (
BOUNDING_BOX = (XMAX = 24.43359375, XMIN = 10.810546875, YMAX = 69.2249968541159, YMIN = 55.2791152920156)
);
Run Code Online (Sandbox Code Playgroud)
我们想要的是找到与输入几何形状相交的所有几何形状.这是通过使用以下查询完成的.
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POLYGON ((x0 y0, ...))', 4326); -- A Worst Case Polygon containing 1442 data points
SELECT Count(Id)
FROM Geometries
WHERE Geometries.Geometry.Filter(@g.Reduce(.25)) = 1
Run Code Online (Sandbox Code Playgroud)
对于某些最坏情况的输入几何形状(大的,复杂的多边形),这种执行大约需要7-10秒.
我们可以看到我们达到空间指数,但最昂贵的操作是 clustered index seek (Clustered)
聚集索引寻求详细信息:
空间索引寻求细节:
不应该通过空间索引而不是聚集索引来完成繁重的工作吗?
可以通过更改空间索引的设置来改进查询吗?我们应该使用什么设置(对于GRIDS,CELLS_PER_OBJECT等)?
如何将整个执行时间缩短,或者这种查询可以达到7-10秒?
每个都节省了大约几秒钟.
STIntersect()到Filter()Reduce(.25) …我正在尝试检查两个地理对象是否相交并删除重叠的部分(在下面的代码段中未做此部分)。请在下面找到代码。它给我错误
无法按位调用方法。
我正在使用mssql库并使用节点10。找不到关于此错误的任何内容。我想知道这是代码错误还是mssql库出现问题。如果是,那我该怎么解决呢?
*****更新******它仅对STIntersects()给出此错误,对STIntersection()和STDifference很好。
const sql = require('mssql');
let path1 = `geography::STGeomFromText('POLYGON((-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))', 4326).MakeValid()`;
let path2 = `geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326).MakeValid()`;
let query = `SELECT ${path1}.STIntersects(${path2}).ToString();
SELECT ${path1}.STIntersection(${path2}).ToString();`;
let dbConfig = {
user: 'username',
password: 'password',
server: 'localhost',
database: 'db_name',
port: port,
connectionTimeout: 30000,
requestTimeout: 180000,
max: 15,
min: 3,
idleTimeoutMillis: 30000
};
sql.connect(dbConfig, err => {
if (err)
throw err;
console.log('Success');
queryExecuter();
});
let queryExecuter = async () => { …Run Code Online (Sandbox Code Playgroud) 我想知道是否有一个算法用于计算最接近的位置(由lat/long表示)优于O(n)时间.
我知道我可以使用Haversine公式来获取从参考点到每个位置的距离并对ASC进行排序,但这对于大型数据集来说效率很低.
MySQL DISTANCE()函数如何执行?我在猜O(n)?
我想重构这个方法(来自Rob Conery的Massive.cs):
public static void AddParam(this DbCommand cmd, object item) {
var p = cmd.CreateParameter();
p.ParameterName = string.Format("@{0}", cmd.Parameters.Count);
if (item == null) {
p.Value = DBNull.Value;
} else {
if (item.GetType() == typeof(Guid)) {
p.Value = item.ToString();
p.DbType = DbType.String;
p.Size = 4000;
} else if (item.GetType() == typeof(ExpandoObject)) {
var d = (IDictionary<string, object>)item;
p.Value = d.Values.FirstOrDefault();
} else {
p.Value = item;
}
//from DataChomp
if (item.GetType() == typeof(string))
p.Size = 4000;
}
cmd.Parameters.Add(p);
} …Run Code Online (Sandbox Code Playgroud) 我尝试了各种功能,如MBRWithin,MBRContains,Intersects,Contains(所有这些都在这里的大量帖子中找到),但还没有运气.这是简化的查询:
SELECT * FROM users
WHERE Intersects( GeomFromText( 'POINT(50 50)' ), GeomFromText( 'POLYGON(0 0, 100 0, 100 100, 0 100, 0 0)' ) );
Run Code Online (Sandbox Code Playgroud)
我希望它将该条件评估为真(如1 = 1)并返回所有用户,但这并没有发生.请告诉我,我做错了什么?
我正在运行MySql 5.5
我正在尝试返回给定位置 50 英里范围内的物品列表。
我的表格(简化)如下:
我有一个初步询问:
var query = db.MyTable.Where(o=> o.Status == "New" && o.Active == true);
query = query.Where(o => new Point(o.Longitude, o.Latitude)
.IsWithinDistance(new Point(_currentLongitude, _currentLatitude), 50));
var result = query.ToList()
Run Code Online (Sandbox Code Playgroud)
但是 - 它似乎不起作用并且收到如下错误 - 有什么想法如何解决这个问题吗?或者是否有更好的方法来获取最近的物品?
.Where(p => new Point(p.Longitude, p.Latitude) .IsWithinDistance(geom: __p_3,
distance: ___maxDistance_4))' 无法翻译。以可翻译的形式重写查询,或者通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用来显式切换到客户端计算。有关详细信息,请参阅https://go.microsoft.com/fwlink/?linkid=2101038 。
启动.cs:
services.AddDbContext<AppDbContext>(options =>
{
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
x => x.UseNetTopologySuite());
});
Run Code Online (Sandbox Code Playgroud) c# spatial-query nettopologysuite entity-framework-core .net-core
spatial-query ×10
sql-server ×3
c# ×2
geospatial ×2
spatial ×2
sql ×2
.net-core ×1
ado.net ×1
algorithm ×1
asp.net-mvc ×1
django ×1
geodjango ×1
geography ×1
geojson ×1
geolocation ×1
geometry ×1
gps ×1
linq-to-sql ×1
mysql ×1
node.js ×1
select ×1
spatialite ×1