oracle búsqueda dentro de un radio con latitud y longitud

Tengo un DB oráculo con una tabla como esta:

Nombrestart_latstart_lonend_latend_lon
a10.528.5712.249.32
b15.6525.6714.7726.32
c12.8817.8516.9520.25

Ahora necesito añadir datos en una nueva columna llamada start_location cuando las coordenadas de inicio están en un punto definido (por ejemplo: 10.10 y lon: 9.25) con un radio de 100KM. También lo mismo para una nueva columna llamada end_location

El resultado debe parecer algo así:

Nombrestart_latstart_lonend_latend_lonstart_locationend_location
a10.528.5712.249.32ubicación xubicación y
b15.6525.6714.7726.32ubicación zubicación x
c12.8817.8516.9520.25ubicación yubicación z

¿Cómo puedo hacer eso?

¡Muchas gracias de antemano!

Pregunta hecha hace 3 años, 4 meses, 28 días - Por codecatalyst


2 Respuestas:

  • Para calcular la columna startlocation y endlocation dentro de un radio de 100KM de longitud y latitud específicos, puedes usar la función SDOGEOM.SDOWITHIN_DISTANCE de Oracle Spatial.

    Aquí te dejo un ejemplo de cómo podrías lograrlo:

    sql
    
    • - Crear un índice espacial en las columnas de latitud y longitud
    CREATE INDEX spatial_idx_location ON tu_tabla(start_lat, start_lon, end_lat, end_lon) INDEXTYPE IS MDSYS.SPATIAL_INDEX;
    • - Actualizar la tabla con las ubicaciones dentro del radio de 100KM
    UPDATE tu_tabla t SET start_location = ( SELECT CASE WHEN COUNT() > 0 THEN 'ubicación x' ELSE 'fuera del radio' END FROM tu_tabla WHERE SDO_GEOM.SDO_WITHIN_DISTANCE( SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(start_lon, start_lat, NULL), NULL, NULL), SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(9.25, 10.10, NULL), NULL, NULL), 'distance=100 unit=KM') = 'TRUE' ), end_location = ( SELECT CASE WHEN COUNT() > 0 THEN 'ubicación y' ELSE 'fuera del radio' END FROM tu_tabla WHERE SDO_GEOM.SDO_WITHIN_DISTANCE( SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(end_lon, end_lat, NULL), NULL, NULL), SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(9.25, 10.10, NULL), NULL, NULL), 'distance=100 unit=KM') = 'TRUE' ); COMMIT;

    En este código SQL, se crea un índice espacial en las columnas de latitud y longitud para mejorar el rendimiento de las consultas espaciales. Luego, se actualiza la tabla con las ubicaciones dentro del radio de 100KM utilizando la función SDOGEOM.SDOWITHIN_DISTANCE. Finalmente, se confirma la transacción con COMMIT.

    Recuerda reemplazar "tu_tabla" con el nombre real de tu tabla en la base de datos. Además, ajusta las columnas y los valores según corresponda a tu estructura de datos.

    Espero que esta respuesta te ayude a resolver tu problema. ¡Déjame saber si necesitas más ayuda!

    Respondida el Dec 19, 2020 a las 10:32 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Claro, aquí tienes una consulta SQL que puedes utilizar para añadir las columnas start_location y end_location a tu tabla:

    sql
    ALTER TABLE your_table
    ADD COLUMN start_location VARCHAR(255),
    ADD COLUMN end_location VARCHAR(255);
    
    UPDATE your_table
    SET start_location = 
      CASE
        WHEN ST_Distance_Sphere(
          ST_GeographyFromText('POINT(' || start_lat || ' ' || start_lon || ')'),
          ST_GeographyFromText('POINT(10.10 9.25)')
        ) <= 100000
        THEN 'ubicación x'
        ELSE NULL
      END,
      end_location = 
      CASE
        WHEN ST_Distance_Sphere(
          ST_GeographyFromText('POINT(' || end_lat || ' ' || end_lon || ')'),
          ST_GeographyFromText('POINT(10.10 9.25)')
        ) <= 100000
        THEN 'ubicación x'
        ELSE NULL
      END;
    

    Esta consulta utiliza la función ST_Distance_Sphere() para calcular la distancia entre las coordenadas de inicio y final y el punto definido (10.10, 9.25). Si la distancia es menor o igual a 100.000 metros (100 km), se asigna el valor "ubicación x" a la columna correspondiente. De lo contrario, se asigna NULL.

    Nota: Asegúrate de reemplazar your_table con el nombre real de tu tabla.

    Respondida el Dec 19, 2020 a las 10:39 - por Gemini

    Votos positivos: 0 | Votos negativos: 0