当前位置: 首页 > 知识库问答 >
问题:

最近邻的Postgis SQL

丁宏浚
2023-03-14

我在计算最近的邻居。为此,我需要传递一个参数来限制与邻居的最大距离。比如半径1000米内最近的邻居是哪些?

我做了以下工作:

我用以下数据创建了我的表:

id | name | latitude | longitude

之后,我执行了以下查询:

SELECT AddGeometryColumn ( 'public' , ' green ', ' geom ' , 4326 , ' POINT' , 2 );

UPDATE season
SET geom = ST_Transform(ST_PointFromText ('POINT (' || longitude || ' ' || latitude || ')', 4269), 4326);

第一个问题,巴西的SRID是4326吗?4269是什么?

第二个问题,通过执行以下SQL

SELECT id, name
FROM season
WHERE ST_DWithin (
                 geom ,
                 ST_GeomFromText ('POINT(-49.2653819 -25.4244287 )', 4326),
                 1000
                 );

这不会返回任何结果。据我所知,这个SQL将进一步指出最大距离的半径,对吗?

如果你把1000个结果放在100000000,我的所有条目都会出现。

所以,我想知道这里出了什么问题?

共有1个答案

江宏伟
2023-03-14

首先,如果你使用的是纬度、经度,你需要使用4326。

UPDATE season SET geom = ST_PointFromText ('POINT(' || longitude || ' ' || latitude || ')' , 4326 ) ;

然后在geom字段上创建索引

CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] ); 

然后你会得到kNN neightbors:

SELECT *,ST_Distance(geom,'SRID=4326;POINT(newLon newLat)'::geometry) 
FROM yourDbTable
ORDER BY
yourDbTable.geom <->'SRID=4326;POINT(newLon newLat)'::geometry
LIMIT 10;

此查询将利用gist索引(http://workshops.boundlessgeo.com/postgis-intro/knn.html)的kNN功能。

返回的距离仍然是度数,而不是米(投影4326使用度数)。

要解决此问题,请执行以下操作:

SELECT *,ST_Distance(geography(geom),ST_GeographyFromText('POINT(newLon newLat)') 
FROM yourDbTable
ORDER BY
yourDbTable.geom <->'SRID=4326;POINT(newLon newLat)'::geometry
LIMIT 10;

计算ST_distance使用地理类型。距离总是以米为单位:

http://workshops.boundlessgeo.com/postgis-intro/geography.html" target="_blank">html

所有这些功能可能都需要最新的Postgis版本(2.0)。不过我不确定。

请检查此项以供参考https://gis.stackexchange.com/questions/91765/improve-speed-of-postgis-nearest-neighbor-query/

 类似资料:
  • 校验者: @DataMonk2017 @Veyron C @舞空 翻译者: @那伊抹微笑 sklearn.neighbors 提供了 neighbors-based (基于邻居的) 无监督学习以及监督学习方法的功能。 无监督的最近邻是许多其它学习方法的基础,尤其是 manifold learning (流行学习) 和 spectral clustering (谱聚类)。 neighbors-bas

  • 介绍 KNN算法全名为k-Nearest Neighbor,就是K最近邻的意思。KNN 也是一种分类算法。但是与之前说的决策树分类算法相比,这个算法算是最简单的一个了。算法的主要过程为: 1、给定一个训练集数据,每个训练集数据都是已经分好类的。 2、设定一个初始的测试数据a,计算a到训练集所有数据的欧几里得距离,并排序。                        3、选出训练集中离a距离最近的

  • @subpage tutorial_py_knn_understanding_cn 了解kNN的基本知识。 @subpage tutorial_py_knn_opencv_cn 现在让我们在OpenCV中使用kNN进行数字识别(OCR)

  • 主要内容:KNN算法原理,KNN算法流程,KNN预测分类本节继续探机器学习分类算法——K 最近邻分类算法,简称 KNN(K-Nearest-Neighbor),它是有监督学习分类算法的一种。所谓 K 近邻,就是 K 个最近的邻居。比如对一个样本数据进行分类,我们可以用与它最邻近的 K 个样本来表示它,这与俗语“近朱者赤,近墨者黑”是一个道理。 在学习 KNN 算法的过程中,你需要牢记两个关键词,一个是“少数服从多数”,另一个是“距离”,它们是实现 KN

  • k近邻(k-Nearest Neighbors)采用向量空间模型来分类,是一种常用的监督学习方法。它的工作原理为:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个“邻居”的信息来进行预测。通常,在分类任务中可使用“投票法”,即选择这k个样本中出现最多的类别标记作为预测结果;在回归任务中可使用“平均法”,即将这k个样本的实值输出标记的平均值作为预测结果;还可基于距离

  • 目标 在本章中,我们将理解k-最近邻(kNN)算法的概念。 理论基础 kNN是可用于监督学习的最简单的分类算法之一。这个想法是在特征空间中搜索最接近的测试数据。我们用下面的图片来看看它是怎么工作的。 在图像中,有两类家庭,蓝色方块和红色三角形。我们称每种家庭为一个为Class。他们的房子被显示在他们的城镇地图上,我们称之为特征空间。 (您可以将一个特征空间视为所有数据投影的空间,例如,考虑一个二维