我有一个包含地理数据的表格,我想在X和Y坐标附近对行进行分组。因此,给定一个偏移量,n和一个包含X和Y列的表,我想对ABS(row1.X - row2.X)<行中的行进行分组。 n,计算组中的行数。这可能是SQL还是我需要一个函数?
答案 0 :(得分:2)
你的空间范围有多大?您的数据集有多大?你需要多准确? 这是相关的,因为如果它们接近,你就不必担心地球的曲率。
纬度是平行的,因此每个度数之间的距离几乎保持不变,但由于经度在赤道处最远并且在极点处会聚,因此它们的距离变化很大。 每个纬度相距约69英里(111公里)。范围从赤道的68.703英里(110.567公里)到极地的69.407(111.699公里)不等(由于地球略呈椭圆形)。这很方便,因为每分钟(1/60度)大约是一英里。 赤道的经度最宽,为69.172英里(111.321),在极地逐渐缩小为零。在北纬40度以北,经度为53英里(85公里)。
另一方面是,如果弗雷德距离比尔4英里,比尔距离汤姆4英里,弗雷德和汤姆之间的距离可能是8英里。如果你的接近门槛是5英里,比尔和弗雷德在同一组,比尔和汤姆在同一组,但弗雷德和汤姆不在。
以下查询可能会为您提供一个有用的开端:
select abs(abs(a.lat) - abs(b.lat)),abs(abs(a.lon) - abs(b.lon)),
sdo_geom.sdo_distance(a.geom, b.geom, 0.005,'unit=kilometer') dist_km
from
(select sdo_geometry(2001,8314,sdo_point_type(33,151, null), null,null) geom, 33 lat, 151 lon from dual) a,
(select sdo_geometry(2001,8314,sdo_point_type(34,151, null), null,null) geom, 34 lat, 151 lon from dual) b
答案 1 :(得分:1)
你有oracle空间吗?如果是这样,有许多内置函数可以为您处理。如果不是 - 你将需要一个函数来确定标记距离(然后将其分组)。我记得上周如何编写这样一个函数的问题。 (这些行中实际上有一些)
How to limit a MySQL Distance Query
最好的选择。使用空间扩展。他们的表现要好得多。