我有一个表“酒店”,其列为 ID、名称、描述、经度、纬度。 现在我想获取给定半径(4 英里)和中心作为长纬度值的所有酒店。我已将其实现为以下查询:
select NAME from (SELECT
NAME , (
6371 * acos (
cos (3.14*(52.047348)/180)
* cos(3.14*(latitude)/180)
* cos(3.14*(longitude)/180 - 3.14*(1.15542)/180)
+ sin (3.14*(52.047348)/180)
* sin(3.14*(latitude)/180)
)
) AS distance
FROM hotel where latitude is not null and longitude is not null) where distance < 4;
它正在提供正确的记录。 但对于大记录来说它非常慢。 任何人都可以建议我使用替代方法吗?我研究了一下,发现oracle数据库里有geometry。借助它,我们可以通过在存储表中创建几何列来实现它。 但我不知道该怎么做。 请建议我该怎么做。
最佳答案
使用 Oracle 的 Spatial数据:
Oracle 设置:
CREATE TABLE Hotels (
id NUMBER(8,0),
name VARCHAR2(255),
location SDO_GEOMETRY
);
INSERT INTO Hotels
SELECT 1, 'Hotel1', SDO_GEOMETRY( 2001, 8307, SDO_POINT_TYPE(92,72,NULL), NULL, NULL) FROM DUAL
UNION ALL SELECT 2, 'Hotel2', SDO_GEOMETRY( 2001, 8307, SDO_POINT_TYPE(48,56,NULL), NULL, NULL) FROM DUAL
UNION ALL SELECT 3, 'Hotel3', SDO_GEOMETRY( 2001, 8307, SDO_POINT_TYPE(92,75,NULL), NULL, NULL) FROM DUAL;
INSERT INTO USER_SDO_GEOM_METADATA (
TABLE_NAME, COLUMN_NAME, DIMINFO, SRID
) VALUES (
'HOTELS',
'LOCATION',
SDO_DIM_ARRAY(
SDO_DIM_ELEMENT('LONG', -180.0, 180.0, 0.5),
SDO_DIM_ELEMENT('LAT', -90.0, 90.0, 0.5)
),
8307
);
CREATE INDEX HotelsTable_SIDX ON Hotels( location ) INDEXTYPE IS MDSYS.SPATIAL_INDEX;
查询:
SELECT *
FROM Hotels
WHERE sdo_within_distance (
location,
SDO_GEOMETRY( 2001, 8307, SDO_POINT_TYPE(92,72,NULL), NULL, NULL),
'distance=4 unit=MILE'
) = 'TRUE'
关于java - 从 oracle 数据库获取给定经度和纬度的酒店详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34869612/