Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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:
Un índice espacial debe estar presente en una de las columnas espaciales y el método
STDistance()debe usar esa columna en las cláusulasWHEREyORDER BY.La cláusula
TOPno puede contener una instrucciónPERCENT.La
WHEREcláusula debe contener unSTDistance()método .Si hay varios predicados en la cláusula
WHERE, el predicado que contiene el métodoSTDistance()debe estar conectado mediante una conjunciónANDcon los otros predicados. ElSTDistance()método no puede estar en una parte opcional de laWHEREcláusula .La primera expresión de la
ORDER BYcláusula debe usar elSTDistance()método .El criterio de ordenación de la primera
STDistance()expresión de laORDER BYcláusula debe serASC.Todas las filas para las que
STDistancedevuelveNULLdeben 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.