标签: spatial-query

Linq和不支持的数据类型(地理位置)

所以,Linq并不支持Geography数据类型,它在可爱的"拖动表到Linq设计界面"开发模型上投入了大量的工具.

有什么方法可以扩展Linq以使用Geography数据类型?或者,我是否需要在需要使用Geography列时构建一个全新的数据层和查询集?

我已经被困在这几天了,如果可能的话就无法解决.

geography spatial-query linq-to-sql

5
推荐指数
1
解决办法
3280
查看次数

我是否需要使用GeoDjango对Spatialite进行特定配置?

根据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上进行一些特殊配置或文档是否错误?

django spatial-query geodjango spatialite

5
推荐指数
1
解决办法
647
查看次数

计算SQL Server 2008中几个几何对象的外边界

我在SQL Server 2008中有很多Polygons数据类型Geometry.下图显示了所有这些Geometrys的选择看起来如何可视化.

很多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函数列表,我看不到一个似乎提供我需要的结果?

spatial geospatial spatial-query sql-server-2008

5
推荐指数
1
解决办法
2715
查看次数

空间数据类型(几何)到GeoJSON

我想将geomgeometry)数据类型转换为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-server asp.net-mvc geometry spatial-query geojson

5
推荐指数
2
解决办法
2702
查看次数

需要帮助来优化可能错误的空间SQL查询

我是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) …

sql sql-server spatial-query spatial-index elasticsearch

5
推荐指数
1
解决办法
165
查看次数

无法按位调用方法

我正在尝试检查两个地理对象是否相交并删除重叠的部分(在下面的代码段中未做此部分)。请在下面找到代码。它给我错误

无法按位调用方法。

我正在使用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)

sql-server geospatial spatial-query node.js

5
推荐指数
1
解决办法
52
查看次数

可以通过lat/long计算最接近的位置,优于O(n)时间吗?

我想知道是否有一个算法用于计算最接近的位置(由lat/long表示)优于O(n)时间.

我知道我可以使用Haversine公式来获取从参考点到每个位置的距离并对ASC进行排序,但这对于大型数据集来说效率很低.

MySQL DISTANCE()函数如何执行?我在猜O(n)?

algorithm gps geolocation spatial-query

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

什么ADO类型是SQL Server 2008的地理空间类型?

我想重构这个方法(来自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)

c# sql ado.net spatial-query

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

Mysql选择多边形包含的点始终为false

我尝试了各种功能,如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

mysql select spatial spatial-query

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

IsWithinDistance 无法翻译

我正在尝试返回给定位置 50 英里范围内的物品列表。

我的表格(简化)如下:

  • ID
  • 经度
  • 纬度
  • 地位
  • 积极的

我有一个初步询问:

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

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