Compartir a través de


Consultar datos espaciales para el vecino más próximo

Una consulta común que se usa con datos espaciales es la consulta vecino más cercana. Las consultas de vecinos más cercanos se usan para encontrar los objetos espaciales más cercanos a cierto objeto espacial. Por ejemplo, un localizador de almacén para un sitio web a menudo debe encontrar las ubicaciones de almacén más cercanas a una ubicación del cliente.

Una consulta vecino más cercana se puede escribir en una variedad de formatos de consulta válidos, pero para que la consulta vecino más cercana use un índice espacial, se debe usar la sintaxis siguiente.

Sintaxis

SELECT TOP ( number )  
        [ WITH TIES ]  
        [ * | expression ]   
        [, ...]  
    FROM spatial_table_reference, ...   
        [ WITH   
            (   
                [ INDEX ( index_ref ) ]   
                [ , SPATIAL_WINDOW_MAX_CELLS = <value>]   
                [ ,... ]   
            )   
        ]  
    WHERE   
        column_ref.STDistance ( @spatial_ object )   
            {   
                [ IS NOT NULL ] | [ < const ] | [ > const ]   
                | [ <= const ] | [ >= const ] | [ <> const ] ]   
            }  
            [ AND { other_predicate } ]   
    }  
    ORDER BY column_ref.STDistance ( @spatial_ object ) [ ,...n ]  
[ ; ]  
  

Consulta de Vecino Más Cercano e Índices Espaciales

En SQL Server, las cláusulas TOP y ORDER BY se usan para realizar una consulta de vecino más cercano en columnas de datos espaciales. La ORDER BY cláusula contiene una llamada al método para el STDistance() tipo de datos de columna espacial. La TOP cláusula indica el número de objetos que se van a devolver para la consulta.

Se deben cumplir los siguientes requisitos para que una consulta vecino más cercana use un índice espacial:

  1. Un índice espacial debe estar presente en una de las columnas espaciales y el método STDistance() debe usar esa columna en las cláusulas WHERE y ORDER BY.

  2. La cláusula TOP no puede contener una instrucción PERCENT.

  3. La WHERE cláusula debe contener un STDistance() método .

  4. Si hay varios predicados en la cláusula WHERE, el predicado que contiene el método STDistance() debe estar conectado mediante una conjunción AND con los otros predicados. El STDistance() método no puede estar en una parte opcional de la WHERE cláusula .

  5. La primera expresión de la ORDER BY cláusula debe usar el STDistance() método .

  6. El criterio de ordenación de la primera STDistance() expresión de la ORDER BY cláusula debe ser ASC.

  7. Todas las filas para las que STDistance devuelve NULL deben ser filtradas.

Advertencia

Los métodos que toman geography o geometry tipos de datos como argumentos devolverán NULL si los SRID no son los mismos para los tipos.

Se recomienda usar las nuevas teselaciones de los índices espaciales para los índices que se utilizan en las consultas de vecinos más cercanos. Para obtener más información sobre las teselaciones de índices espaciales, vea Datos espaciales (SQL Server).

Ejemplo

En el ejemplo de código siguiente se muestra una consulta vecino más cercana que puede usar un índice espacial. En el ejemplo, se usa la tabla Person.Address en la base de datos AdventureWorks2012.

USE AdventureWorks2012  
GO  
DECLARE @g geography = 'POINT(-121.626 47.8315)';  
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address  
WHERE SpatialLocation.STDistance(@g) IS NOT NULL  
ORDER BY SpatialLocation.STDistance(@g);  
  

Cree un índice espacial en la columna SpatialLocation para ver cómo una consulta vecino más cercana usa un índice espacial. Para obtener más información sobre cómo crear índices espaciales, vea Crear, modificar y quitar índices espaciales.

Ejemplo

En el ejemplo de código siguiente se muestra una consulta vecino más cercana que no puede usar un índice espacial.

USE AdventureWorks2012  
GO  
DECLARE @g geography = 'POINT(-121.626 47.8315)';  
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address  
ORDER BY SpatialLocation.STDistance(@g);  
  

La consulta carece de una WHERE cláusula que usa STDistance() en un formulario especificado en la sección de sintaxis para que la consulta no pueda usar un índice espacial.

Véase también

Datos Espaciales (SQL Server)