java - 从 oracle 数据库获取给定经度和纬度的酒店详细信息

标签 java sql oracle

我有一个表“酒店”,其列为 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/

相关文章:

java - 在 Java 中用 "$"替换包含 "\$"的字符串

java - java中忽略DTD规范有什么影响?

java - Netbeans 中的 JTable : how do display table of many columns

sql - 在sql查询的where子句中检查当前日期的最佳方法

javascript - 将sql查询解析为JSON

sql - 有效地检查文本列中是否存在文本

c++ - 使用 C++ 连接到 oracle 数据库,基础知识

Java:toString 与字符串连接?

sql - 根据bigquery中的条件合并记录

SQL 查询仅查找 2 列中的唯一字符串