Questions tagged «spatial»

存储,查询和索引空间数据(包括几何和地理表示)。

1
不可修复的空间索引损坏是否被视为正常现象?
我有一个空间索引用于该DBCC CHECKDB报告损坏: DBCC CHECKDB(MyDB) WITH EXTENDED_LOGICAL_CHECKS, DATA_PURITY, NO_INFOMSGS, ALL_ERRORMSGS, TABLERESULTS 空间索引,XML索引或索引视图'sys.extended_index_xxx_384000'(对象ID xxx)不包含视图定义生成的所有行。这不一定代表此数据库中数据的完整性问题。 空间索引,XML索引或索引视图'sys.extended_index_xxx_384000'(对象ID xxx)包含视图定义未生成的行。这不一定代表此数据库中数据的完整性问题。 CHECKDB在表'sys.extended_index_xxx_384000'(对象ID xxx)中发现了0个分配错误和2个一致性错误。 维修等级为repair_rebuild。 删除并重新创建索引不会删除这些损坏报告。没有EXTENDED_LOGICAL_CHECKS但没有DATA_PURITY错误,则不会报告。 同样,CHECKTABLE此表花费45分钟,尽管它的CI大小为30 MB,大约有3万行。该表中的所有数据都是点geography数据。 在任何情况下都可以预期这种行为吗?它说:“这不一定代表完整性问题”。我应该做些什么?CHECKDB失败了,这是一个问题。 此脚本重现了该问题: CREATE TABLE dbo.Cities( ID int NOT NULL, Position geography NULL, CONSTRAINT PK_Cities PRIMARY KEY CLUSTERED ( ID ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, …

3
大型(> 22万亿项)地理空间数据集,具有快速(<1s)的读取查询性能
我正在为大型地理空间数据集设计一个新系统,这将需要快速的读取查询性能。因此,我想看看是否有人认为在以下情况下有合适的DBMS,数据结构或其他方法来实现所需的性能,或者是否有经验/建议: 将从处理后的卫星雷达数据中连续产生数据,这些数据将覆盖全球。根据卫星的分辨率和地球的土地覆盖范围,我估算了完整的数据集,可在全球750亿个离散位置产生价值。在单个卫星的生命周期中,输出将在这些位置的每个位置产生多达300个值(因此,总数据集大于22万亿个值)。这是针对一颗卫星的,已经在轨道上有第二颗,在新的几年中计划再发射两颗。因此会有很多数据!单个数据项非常简单,仅包含(经度,纬度,值),但是由于项数众多,我估计单个卫星可以产生高达100TB的数据。 写入的数据永远不需要更新,因为它只会随着新的卫星采集处理而增长。写入性能并不重要,但读取性能至关重要。该项目的目标是能够通过简单的界面(如google map上的图层)可视化数据,其中每个点均基于其平均值,梯度或随时间变化的某些函数具有彩色值。(帖子末尾的演示)。 根据这些要求,数据库需要具有可伸缩性,我们可能会寻求云解决方案。该系统必须能够处理地理空间查询,例如“(纬度,经度)附近的点”和“(框)中的点”,并具有小于1的读取性能(用于定位单个点)以及包含多达50,000点(尽管最好是200,000点)。 到目前为止,我在1.11亿个位置拥有约7.5亿个数据项的测试数据集。我已经试用了一个postgres / postGIS实例,该实例可以正常运行,但是没有分片的可能性,我不能这样做,因为随着数据的增长,它也可以应对。远,并且通过分片就可以随数据量进行扩展。我最近对弹性搜索学到了一些知识,因此对此的任何评论对我来说都是新的,将是有帮助的。 这是我们希望使用完整数据集实现的快速动画: 这个gif(来自我的postgres试用版)正在提供(6x3)预先计算的栅格图块,每个图块包含约200,000点,并花费约17s来生成每个。通过单击一个点,可以通过在小于1秒的时间内将所有历史值拉到最近的位置来绘制图表。 对于冗长的帖子,我们深表歉意,欢迎提出任何意见/建议。

3
POINT(X,Y)和GeomFromText(“ POINT(XY)”)之间有什么区别?
我想在我的MySQL数据库中存储一些几何位置。为此,我使用了POINT数据类型。我几乎到处都读到该函数GeomFromText应用于在表中插入数据。 但是,我发现这POINT(X,Y)也可行。我没有找到任何说明为什么GeomFromText应代替POINT。 例如,我有以下简单关系: CREATE TABLE Site ( SiteID BIGINT UNSIGNED, Position POINT ); 我可以使用以下两个变体插入值: INSERT INTO Site ( 1, GeomFromText( 'POINT(48.19976 16.45572)' ) ); INSERT INTO Site ( 2, POINT(48.19976, 16.45572) ); 当查看表格(SELECT * FROM Site)时,会看到该位置的相同二进制二进制对象,而查看坐标(SELECT *, AsText(Position) FROM Site)时,也会看到相同的值。 那么为什么要使用GeomFromText?这两个变体之间是否存在(已知的)性能差异?在MySQL以外的其他数据库系统中如何解决?

3
PostgreSQL与MySQL:空间特征比较
我们正在构建具有空间数据组件的Web应用程序。首先,我们的空间数据比较将获取一个给定的点,并返回匹配的重叠空间多边形。 话虽如此,我们的数据库还有许多其他组件,其中包括您在常规关系数据库中可以找到的所有典型内容。 在项目中,我们必须选择要使用的数据库解决方案。 所有项目成员都对MySQL的实现和管理更加熟悉,但是所有研究表明PostgreSQL是更好的解决方案-特别是在使用postGIS的空间数据方面。 我们期望(希望)我们的应用程序在许多并发用户中会经历很多动作。 是否有任何将MySQL用作具有空间数据组件的RDBMS的经验的人有长期的建议/经验? 除熟悉之外,使用PostGIS是否有任何缺点?

2
PostGIS与SQL Server的GIS数据
因此,我最近刚开始在一家新公司工作,有很多ArcGIS用户,他们似乎非常热衷于继续使用PostGIS实例向我们的客户提供一些数据。虽然我对此没有疑问,但我们拥有95%的SQL Server和5%的Oracle商店。我们当前的内部GIS在SQL Server上运行,我还没有收到任何投诉。 我知道SQL Server截至2012年已经改善了很多空间/几何功能,但是PostGIS中是否有任何杀手级功能值得引入新平台?我已经尝试进行研究,但是找不到真正深入的东西,或者那不是完全偏见。 我想为他们提供最好的工具来完成他们的工作,但同时也必须权衡一个事实,即我将从一开始就学习Postgres / GIS,这本身就是一个完整的过程。

2
SQL Server 2016中用于空间数据的MakeValid()的替代方法
我有一张非常大的地理LINESTRING数据表,我正在从Oracle迁移到SQL Server。在Oracle中有许多针对此数据执行的评估,并且也需要针对SQL Server中的数据执行评估。 问题是:SQL Server对有效的要求LINESTRING比对Oracle的要求严格;“ LineString实例不能在两个或多个连续点的间隔内重叠”。 碰巧的是,我们LINESTRING的某个百分比不符合该标准,这意味着我们需要评估数据的功能会失败。我需要调整数据,以便可以在SQL Server中成功对其进行验证。 例如: 验证一个非常简单的方法LINESTRING,使其自身加倍: select geography::STGeomFromText( 'LINESTRING (0 0 1, 0 1 2, 0 -1 3)',4326).IsValidDetailed() 24413: Not valid because of two overlapping edges in curve (1). MakeValid针对它执行功能: select geography::STGeomFromText( 'LINESTRING (0 0 1, 0 1 2, 0 -1 3)',4326).MakeValid().STAsText() LINESTRING (0 -0.999999999999867, 0 …

1
如何优化查询,使其首先查找一个索引,然后查找另一个索引
我有两组来自卫星数据的地球测量数据,每组都有时间字段(均值朱利安日期为mjd)和地理位置(GeoPoint,空间),并且我正在寻找两组数据之间的重合,以使它们的时间与阈值相匹配。 3小时(或0.125天),且彼此之间的距离不超过200公里。 我已经为表和空间表上的mjd字段都建立了索引。 当我刚刚加入时间限制时,数据库将在8秒内计算100,000个匹配项,并计算该时间内所有100,000个匹配项的距离。查询如下所示: select top 100000 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0 from L2V5.dbo.header h join L2.dbo.MLS_Header m on h.mjd between m.mjd-.125 and m.mjd+.125 option( table hint ( h, index(ix_MJD) ), table hint( m, index(ix_MJD) ) ) 执行的计划是: 排序后,有9条距离在200公里以下,因此有比赛。问题是,当我添加距离约束并改为运行它时, select top 10 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0 from L2V5.dbo.header h join L2.dbo.MLS_Header m on …

3
改善STIntersects的性能
表格T_PIN有300,000个图钉和T_POLYGON36,000个多边形。T_PIN具有此索引: CREATE SPATIAL INDEX [T_PIN_COORD] ON [dbo].[T_PIN] ( [Coord] )USING GEOGRAPHY_GRID WITH (GRIDS =(LEVEL_1 = HIGH,LEVEL_2 = HIGH,LEVEL_3 = HIGH,LEVEL_4 = HIGH), CELLS_PER_OBJECT = 128, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]; T_POLYGON 有: …


4
通过MySQL获取半径拉链时出现问题
我有一个邮政编码表,其中包括每个邮政编码的中心纬度,经度。我用它来获取从任意点到给定英里半径内的邮政编码列表。 在我看来,仅仅是因为拉链的中心点不在给定的半径内,并不意味着拉链本身不在半径内。 我用自己的超高级艺术技巧来说明这一点: 绿色条纹斑点表示邮政编码A,B和C。 红色污点是每个邮政编码的地理中心 紫红色的点是目标位置,并且.. 块状蓝色圆圈距离目标位置1英里半径 如果我查询距离粉红色污迹1英里半径内的所有邮政编码,则将返回邮政编码B和C,因为邮政编码A的中心点不在1英里半径内,即使粉红色污迹本身显然在邮政编码A中。 SELECT *, p.distance_unit * DEGREES(ACOS(COS(RADIANS(p.latpoint)) * COS(RADIANS(z.y)) * COS(RADIANS(p.longpoint) - RADIANS(z.x)) + SIN(RADIANS(p.latpoint)) * SIN(RADIANS(z.y)))) AS dist FROM standard_zip AS z JOIN ( /* these are the query parameters */ SELECT $lat AS latpoint, $lng AS longpoint, $miles AS radius, 69 AS …

3
Yelp如何有效地计算数据库中的距离?
例如,说我有一张桌子: Business(BusinessID, Lattitude, Longitude) 所有这些都被索引了。也有一百万条记录 假设我想寻找最接近106.5的企业,该怎么办? 如果我做 SELECT * FROM Business WHERE (Some formula to compute distance here) &lt; 2000 例如,或者如果我这样做 SELECT * FROM Business TOP 20 理论上,计算机将必须计算所有biz的距离,而实际上,只有那些纬度和经度在一定范围内的距离才应计算。 那么,如何在PhP或SQL中做我想做的事情? 到目前为止,我很感谢您的回答。我正在使用mysql,它们没有比明显的解决方案更有效的方法。MySQL空间也没有计算距离功能。

3
在数字表上交叉连接以获得线顶点,是否有更好的方法?
问题: 我有一个空间表(路线),使用ESRI的SDE.ST_GEOMETRY用户定义数据类型存储在Oracle 12c 地理数据库中。我想列出线顶点,以便最终访问并更新它们的坐标。如果使用的是SDO_GEOMETRY / Oracle Locator,则可以使用该 SDO_UTIL.GETVERTICES功能。但是我没有使用SDO_GEOMETRY / Oracle Locator,并且中没有等效功能SDE.ST_GEOMETRY。我可以找到的与顶点有关的唯一SDE.ST_GEOMETRY 函数是ST_PointN和ST_NumPoints。 我想出一个可以成功完成所有操作的查询-将行顶点作为行(受此页面的启发): 1 SELECT a.ROAD_ID 2 ,b.NUMBERS VERTEX_INDEX 3 ,a.SDE.ST_X(SDE.ST_PointN(a.SHAPE, b.NUMBERS)) AS X 4 ,a.SDE.ST_Y(SDE.ST_PointN(a.SHAPE, b.NUMBERS)) AS Y 5 FROM ENG.ROADS a 6 CROSS JOIN ENG.NUMBERS b 7 WHERE b.NUMBERS &lt;= SDE.ST_NumPoints(a.SHAPE) 8 --removed to do explain plan: ORDER …

1
十进制或点数据类型,用于在MySQL中存储地理位置数据
我想将每个地址的地理位置存储在我的MySQL(Innodb)“ tblAddress”表中,我想我有2个选项: 1) 2 columns for Each Address: Latitude DECIMAL(10, 8), Longitude DECIMAL(11, 8) 2) One Column for Each Address: GeoLocation POINT 我的程序需要从当前位置(移动客户端)中查找所有落在1公里半径以内的地址。 同样,下面的命令对我不起作用,不确定我需要什么。 CREATE SPATIAL INDEX GeoLocation ON tblAddress (GeoLocation); 那么,这里建议使用什么方法来存储数据以便更快地进行计算和检索。请指教。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.