Más

¿Cómo consulto todos los polígonos dentro de una distancia desde un punto?


Llámame estúpido, pero de alguna manera no pude averiguar cómo hacer lo siguiente.

Tengo un shapefile de prueba con 18 características, que importé con éxito a GeoDjango (1.3, que se ejecuta en Spatialite). Como ejemplo práctico, he tomado un centroide de uno de ellos (area.mpoly.centroid) e intenté encontrar todas las áreas dentro de una distancia de 20 km (tocar sería suficiente, no es necesario cubrir el área completa).

Area.objects.filter (mpoly__dwithin = (centroide, D (km = 20)))

Sin embargo, esto solo me da una lista vacía. Aumentar el número a 200 km (en teoría, esto debería cubrir todo mi conjunto de datos) tampoco arroja nada.

¿Estoy haciendo algo mal?


Me perdí esto antes, estás usando SpatialLite. dwithin no es compatible con SpatialLite.


Respuesta anterior: 'Área' es una clase de GeoDjango. Probablemente tengas un conflicto de nombres. No nombre sus modelos con el mismo nombre de ninguna clase de GeoDjango.

Además, 'centroide' no debe usarse como nombre de variable por la misma razón.


Inserte polígonos geojson en mongodb y consulte, en función de las coordenadas de un punto, todos los polígonos que se encuentran a cierta distancia de él.

Necesito ayuda en: cómo insertar polígonos geojson en una base de datos mongodb y consultar, en función de las coordenadas de un punto determinado, todos los polígonos que se encuentran a cierta distancia de ese punto

Aquí está la muestra de geojson que usaré:

Quiero guardarlo en la base de datos mongodb y poder consultarlo. Para esto, hago lo siguiente:

Creo un esquema de mangosta:

Creo un modelo de mangosta:

var GeoModel = mongoose.model ('GeoModel', GeoSchema)

Guardo el geojson en mi base de datos:

var post = nuevo GeoModel (testJson)

Y finalmente busco y encuentro el registro:

Los problemas con los que necesito ayuda:

Cargaré muchos datos geojson en forma de polígonos.

Digamos que estoy ubicado en las siguientes coordenadas: 40.8003, -73.9580

Para una distancia de x kilómetros, quiero poder todos los polígonos que están dentro del alcance.

Entonces, estoy pensando en hacer una consulta similar a esta, que por supuesto no está funcionando :):


2 respuestas 2

Esta es una respuesta increíblemente tardía, pero tal vez pueda arrojar algo de luz sobre una solución. El número de "conjunto" al que se refiere es un identificador de referencia espacial o SRID. Para los cálculos de latitud / longitud, debe considerar establecer esto en 4326, lo que garantizará que los medidores se utilicen como unidad de medida. También debería considerar cambiar a SqlGeography en lugar de SqlGeometry, pero continuaremos con SqlGeometry por ahora. Para configurar de forma masiva el SRID, puede actualizar su tabla de la siguiente manera:

Para un solo radio, necesita crear un radio como un objeto espacial. Por ejemplo:

STBuffer () toma el punto espacial y crea un círculo (ahora un tipo Polígono) a partir de él. A continuación, puede consultar su conjunto de datos de la siguiente manera:

Lo anterior ahora usará cualquier índice espacial que haya creado en [SpatialColumn] en su plan de consulta.

También hay una opción más simple que funcionará (y aún usará un índice espacial). El método STDistance le permite hacer lo siguiente:

Por último, trabajar con una colección de radios. Tienes pocas opciones. La primera es ejecutar lo anterior para cada radio a su vez, pero consideraría lo siguiente para hacerlo como uno:

La final anterior no ha sido probada, pero estoy 99% seguro de que está casi ahí, con una pequeña cantidad de ajustes como una posibilidad. El ideal de tomar la distancia de radio mínima en la selección es que si los radios múltiples provienen de una sola ubicación, si un punto está dentro del primer radio, naturalmente estará dentro de todos los demás. Por lo tanto, duplicará el registro, pero al agrupar y luego seleccionar el mínimo, obtendrá solo uno (y el más cercano).

Espero que te ayude, aunque 4 semanas después de que hiciste la pregunta. Lo siento, no lo vi antes, si solo hubiera una etiqueta espacial para las preguntas.


3 respuestas 3

Una versión lenta (sin índices espaciales):

Para hacer uso de los índices espaciales, necesita desnormalizar su tabla para que cada vértice de polígono se almacene en su propio registro.

Luego cree el ÍNDICE ESPACIAL en el campo que contiene las coordenadas de los vértices y simplemente emita esta consulta:

Las cosas serán mucho más fáciles si almacena coordenadas UTM en su base de datos en lugar de latitud y longitud.

No creo que haya una sola respuesta a esto. Generalmente se trata de cómo organizar sus datos para que hagan uso de la localidad espacial inherente a su problema.

La primera idea que me viene a la cabeza sería usar una cuadrícula, asignar cada punto a un cuadrado y seleccionar el cuadrado en el que está el punto y los que lo rodean. Si estamos hablando de cuadrículas infinitas, entonces use un valor hash del cuadrado, esto le daría más puntos de los necesarios (donde tiene colisiones), pero aún así reducirá la cantidad en un montón. Por supuesto, esto no se aplica de inmediato a los polígonos, es solo una lluvia de ideas. Un posible enfoque que podría producir demasiadas colisiones sería OR todos los valores hash juntos y seleccionar todas las entradas donde el hash AND con ese valor no sea cero (no estoy seguro de si esto es posible en MySQL), es posible que desee utilizar un gran cantidad de bits sin embargo.

El problema con este enfoque es, asumiendo que estamos hablando de coordenadas esféricas (lat, long generalmente lo hace) son las singularidades, ya que los 'cuadrados' de la cuadrícula se vuelven más estrechos a medida que se acerca a los polos. El enfoque fácil para esto es. no ponga ningún punto cerca de los polos. :)


ors_geocode () transforma una descripción de una ubicación proporcionada en la consulta, como el nombre del lugar, la dirección de la calle o el código postal, en una descripción normalizada de la ubicación con una geometría de puntos. Además, ofrece codificación geográfica inversa que hace exactamente lo contrario: devuelve el siguiente objeto circundante que rodea las coordenadas de la ubicación dada. Para obtener resultados más relevantes, también puede establecer un radio de tolerancia alrededor de las coordenadas solicitadas.

Este servicio le permite encontrar lugares de interés alrededor o dentro de determinadas coordenadas geográficas. Puede buscar características determinadas alrededor de un punto, ruta o incluso dentro de un polígono especificado en geometría. Para enumerar todas las categorías de PDI disponibles, utilice ors_pois ('lista').

Puede recopilar estadísticas sobre la cantidad de determinados puntos de interés en un área utilizando request = 'stats'.


Parámetros

Las características que se evaluarán con los valores del parámetro Seleccionar características. La selección se aplicará a estas características.

Especifica la relación espacial que se evaluará.

  • Intersección: las entidades de la capa de entrada se seleccionarán si intersecan una entidad de selección. Este es el predeterminado.
  • Intersecar 3D: las entidades de la capa de entrada se seleccionarán si intersecan una entidad de selección en un espacio tridimensional (x, y, y z).
  • Intersecar (DBMS): las entidades de la capa de entrada se seleccionarán si intersecan una entidad de selección. Esta opción se aplica solo a geodatabases corporativas. La selección se procesará en el DBMS de la geodatabase corporativa en lugar de en el cliente cuando se cumplan todos los requisitos (consulte más información en las notas de uso). Esta opción puede proporcionar un mejor rendimiento que realizar la selección en el cliente.
  • Dentro de una distancia: las entidades de la capa de entrada se seleccionarán si están dentro de la distancia especificada (utilizando la distancia euclidiana) de una entidad de selección. Utilice el parámetro Distancia de búsqueda para especificar la distancia.
  • Dentro de una distancia geodésica: las entidades en la capa de entrada se seleccionarán si están dentro de una distancia especificada de una entidad seleccionada. La distancia entre entidades se calculará mediante una fórmula geodésica que tiene en cuenta la curvatura del esferoide y maneja correctamente los datos cerca y a través de la línea de fecha y los polos. Utilice el parámetro Distancia de búsqueda para especificar la distancia.
  • Dentro de una distancia 3D: las entidades en la capa de entrada se seleccionarán si están dentro de una distancia especificada de una entidad de selección en un espacio tridimensional. Utilice el parámetro Distancia de búsqueda para especificar la distancia.
  • Contiene: las entidades de la capa de entrada se seleccionarán si contienen una entidad de selección.
  • Completamente contiene: las entidades de la capa de entrada se seleccionarán si contienen por completo una entidad de selección.
  • Contiene Clementini: esta relación espacial produce los mismos resultados que Completamente contiene con la excepción de que si la entidad de selección está completamente en el límite de la entidad de entrada (ninguna parte está correctamente dentro o fuera), la entidad no se seleccionará. Clementini define el polígono de límite como la línea que separa el interior y el exterior, el límite de una línea se define como sus puntos finales y el límite de un punto siempre está vacío.
  • Dentro: las entidades de la capa de entrada se seleccionarán si están dentro de una entidad de selección.
  • Completamente dentro: las entidades en la capa de entrada se seleccionarán si están completamente dentro o contenidas por una entidad de selección.
  • Dentro de Clementini: el resultado será idéntico a Dentro con la excepción de que si la totalidad de la entidad en la capa de entrada está en el límite de la entidad en la capa de selección, la entidad no se seleccionará. Clementini define el polígono de límite como la línea que separa el interior y el exterior, el límite de una línea se define como sus puntos finales y el límite de un punto siempre está vacío.
  • Son idénticas a: las entidades de la capa de entrada se seleccionarán si son idénticas (en geometría) a una entidad de selección.
  • Toques de límite: las entidades de la capa de entrada se seleccionarán si tienen un límite que toca una entidad de selección. Cuando las entidades de entrada son líneas o polígonos, el límite de la entidad de entrada solo puede tocar el límite de la entidad de selección y ninguna parte de la entidad de entrada puede cruzar el límite de la entidad de selección.
  • Compartir un segmento de línea con: las entidades de la capa de entrada se seleccionarán si comparten un segmento de línea con una entidad de selección. Las entidades de entrada y selección deben ser de línea o polígono.
  • Cruzadas por el contorno de: las entidades de la capa de entrada se seleccionarán si están cruzadas por el contorno de una entidad de selección. Las entidades de entrada y selección deben ser líneas o polígonos. Si se utilizan polígonos para la entrada o la capa de selección, se utilizará el límite (línea) del polígono. Las líneas que se cruzan en un punto serán seleccionadas, las líneas que comparten un segmento de línea no serán seleccionadas.
  • Tener su centro en: las entidades de la capa de entrada se seleccionarán si su centro se encuentra dentro de una entidad de selección. El centro de la entidad se calcula de la siguiente manera: para polígono y multipunto, el centroide de la geometría se usa para la entrada de línea, se usa el punto medio de la geometría.

Las entidades del parámetro Entidades de entrada se seleccionarán en función de su relación con las entidades de esta capa o clase de entidad.

La distancia que se buscará. Este parámetro solo es válido si el parámetro Relación se establece en Dentro de una distancia, Dentro de una distancia geodésica, Dentro de una distancia 3D, Intersecar, Intersecar 3D, Tener su centro en o Contiene.

Si se selecciona la opción Dentro de una distancia geodésica, use una unidad lineal como kilómetros o millas.

Especifica cómo se aplicará la selección a la entrada y cómo se combinará con una selección existente. Esta herramienta no incluye una opción para borrar una selección existente, use la opción Borrar la selección actual en la herramienta Seleccionar capa por atributo para hacerlo.

  • Nueva selección: la selección resultante reemplazará cualquier selección existente. Este es el predeterminado.
  • Agregar a la selección actual: la selección resultante se agregará a una selección existente. Si no existe ninguna selección, es lo mismo que la opción Nueva selección.
  • Eliminar de la selección actual: la selección resultante se eliminará de una selección existente. Si no existe ninguna selección, la operación no tendrá ningún efecto.
  • Seleccionar subconjunto de la selección actual: la selección resultante se combinará con la selección existente. Solo quedan seleccionados los registros que son comunes a ambos.
  • Cambiar la selección actual: la selección cambiará. Todos los registros que fueron seleccionados se eliminarán de la selección y todos los registros que no fueron seleccionados se agregarán a la selección. Los parámetros Selección de características y Relación se ignoran cuando se selecciona esta opción.

Especifica si se utilizará el resultado de la evaluación de la relación espacial o el resultado opuesto. Por ejemplo, este parámetro se puede utilizar para obtener una lista de entidades que no se cruzan o que no se encuentran dentro de una distancia determinada de entidades en otro conjunto de datos.

  • Sin marcar: se utilizará el resultado de la consulta. Este es el predeterminado.
  • Marcado: se utilizará el resultado opuesto al de la consulta. Si se utiliza el parámetro Tipo de selección, la inversión de la selección se produce antes de que se combine con las selecciones existentes.

Salida derivada

Las entradas actualizadas con selecciones aplicadas.

Los nombres de las entradas actualizadas.

El número de registros seleccionados.

Las características que se evaluarán con los valores del parámetro select_features. La selección se aplicará a estas características.

Especifica la relación espacial que se evaluará.

  • INTERSECCIÓN: las entidades de la capa de entrada se seleccionarán si intersectan una entidad de selección. Este es el predeterminado.
  • INTERSECT_3D: las entidades de la capa de entrada se seleccionarán si intersecan una entidad de selección en un espacio tridimensional (x, y, y z).
  • INTERSECT_DBMS: las entidades de la capa de entrada se seleccionarán si se cruzan con una entidad de selección. Esta opción se aplica solo a geodatabases corporativas. La selección se procesará en el DBMS de la geodatabase corporativa en lugar de en el cliente cuando se cumplan todos los requisitos (consulte las notas de uso). Esta opción puede proporcionar un mejor rendimiento que realizar la selección en el cliente.
  • WITHIN_A_DISTANCE: las entidades de la capa de entrada se seleccionarán si están dentro de la distancia especificada (utilizando la distancia euclidiana) de una entidad de selección. Utilice el parámetro search_distance para especificar la distancia.
  • WITHIN_A_DISTANCE_3D: las entidades de la capa de entrada se seleccionarán si están dentro de una distancia especificada de una entidad de selección en un espacio tridimensional. Utilice el parámetro search_distance para especificar la distancia.
  • WITHIN_A_DISTANCE_GEODESIC: las entidades de la capa de entrada se seleccionarán si están dentro de una distancia especificada de una entidad de selección. La distancia entre entidades se calculará mediante una fórmula geodésica que tiene en cuenta la curvatura del esferoide y maneja correctamente los datos cerca y a través de la línea de fecha y los polos. Utilice el parámetro search_distance para especificar la distancia.
  • CONTIENE: las entidades de la capa de entrada se seleccionarán si contienen una entidad de selección.
  • COMPLETELY_CONTAINS: las entidades de la capa de entrada se seleccionarán si contienen por completo una entidad de selección.
  • CONTAINS_CLEMENTINI: esta relación espacial produce los mismos resultados que COMPLETELY_CONTAINS con la excepción de que si la entidad de selección está completamente en el límite de la entidad de entrada (ninguna parte está correctamente dentro o fuera), la entidad no se seleccionará. Clementini define el polígono de límite como la línea que separa el interior y el exterior, el límite de una línea se define como sus puntos finales y el límite de un punto siempre está vacío.
  • DENTRO: las entidades de la capa de entrada se seleccionarán si están dentro de una entidad de selección.
  • COMPLETELY_WITHIN: las entidades de la capa de entrada se seleccionarán si están completamente dentro o contenidas en una entidad de selección.
  • WITHIN_CLEMENTINI: el resultado será idéntico a WITHIN con la excepción de que si la totalidad de la entidad en la capa de entrada está en el límite de la entidad en la capa de selección, la entidad no se seleccionará. Clementini define el polígono de límite como la línea que separa el interior y el exterior, el límite de una línea se define como sus puntos finales y el límite de un punto siempre está vacío.
  • ARE_IDENTICAL_TO: las entidades de la capa de entrada se seleccionarán si son idénticas (en geometría) a una entidad de selección.
  • BOUNDARY_TOUCHES: las entidades de la capa de entrada se seleccionarán si tienen un límite que toca una entidad de selección. Cuando las entidades de entrada son líneas o polígonos, el límite de la entidad de entrada solo puede tocar el límite de la entidad de selección y ninguna parte de la entidad de entrada puede cruzar el límite de la entidad de selección.
  • SHARE_A_LINE_SEGMENT_WITH: las entidades de la capa de entrada se seleccionarán si comparten un segmento de línea con una entidad de selección. Las entidades de entrada y selección deben ser de línea o polígono.
  • CROSSED_BY_THE_OUTLINE_OF: las entidades de la capa de entrada se seleccionarán si están cruzadas por el contorno de una entidad de selección. Las entidades de entrada y selección deben ser líneas o polígonos. Si se utilizan polígonos para la capa de entrada o de selección, se utilizará el límite (línea) del polígono. Las líneas que se cruzan en un punto serán seleccionadas, las líneas que comparten un segmento de línea no serán seleccionadas.
  • HAVE_THEIR_CENTER_IN: las entidades de la capa de entrada se seleccionarán si su centro se encuentra dentro de una entidad de selección. El centro de la entidad se calcula de la siguiente manera: para polígono y multipunto, el centroide de la geometría se usa para la entrada de línea, se usa el punto medio de la geometría.

Las entidades del parámetro Entidades de entrada se seleccionarán en función de su relación con las entidades de esta capa o clase de entidad.

La distancia que se buscará. Este parámetro solo es válido si el parámetro de tipo de superposición se establece en WITHIN_A_DISTANCE, WITHIN_A_DISTANCE_GEODESIC, WITHIN_A_DISTANCE_3D, INTERSECT, INTERSECT_3D, HAVE_THEIR_CENTER_IN o CONTAINS.

Si se selecciona la opción WITHIN_A_DISTANCE_GEODESIC, use una unidad lineal como kilómetros o millas.

Especifica cómo se aplicará la selección a la entrada y cómo se combinará con una selección existente. Esta herramienta no incluye una opción para borrar una selección existente, use la opción CLEAR_SELECTION en la herramienta Seleccionar capa por atributo para hacerlo.

  • NEW_SELECTION: la selección resultante reemplazará cualquier selección existente. Este es el predeterminado.
  • ADD_TO_SELECTION: la selección resultante se agregará a una selección existente. Si no existe ninguna selección, es lo mismo que la opción NEW_SELECTION.
  • REMOVE_FROM_SELECTION: la selección resultante se eliminará de una selección existente. Si no existe ninguna selección, la operación no tendrá ningún efecto.
  • SUBSET_SELECTION: la selección resultante se combinará con la selección existente. Solo quedan seleccionados los registros que son comunes a ambos.
  • SWITCH_SELECTION: la selección cambiará. Todos los registros que fueron seleccionados se eliminarán de la selección y todos los registros que no fueron seleccionados se agregarán a la selección. Los parámetros select_features y superpuesto_type se ignoran cuando se selecciona esta opción.

Especifica si se utilizará el resultado de la evaluación de la relación espacial o el resultado opuesto. Por ejemplo, este parámetro se puede utilizar para obtener una lista de entidades que no se cruzan o que no se encuentran dentro de una distancia determinada de entidades en otro conjunto de datos.

  • NOT_INVERT: se utilizará el resultado de la consulta. Este es el predeterminado.
  • INVERTIR: se utilizará el resultado opuesto al de la consulta. Si se utiliza el parámetro selection_type, la inversión de la selección se produce antes de que se combine con las selecciones existentes.

Salida derivada

Las entradas actualizadas con selecciones aplicadas.

Los nombres de las entradas actualizadas.

El número de registros seleccionados.

Muestra de código

La siguiente secuencia de comandos de la ventana de Python demuestra cómo utilizar la función SelectLayerByLocation en el modo inmediato.

La siguiente secuencia de comandos independiente muestra cómo utilizar la función SelectLayerByLocation en un flujo de trabajo para extraer entidades a una nueva clase de entidad según la ubicación y una consulta de atributo.

La siguiente secuencia de comandos independiente muestra una variedad de usos de las opciones WITHIN_A_DISTANCE y WITHIN_A_DISTANCE_GEODESIC con el parámetro search_distance.


Generación de malla

Marshall Bern, Paul Plassmann, en Manual de geometría computacional, 2000

1.1 Tipos de dominios geométricos

Primero dividimos las posibles entradas según la dimensión: dos o tres. Distinguimos cuatro tipos de dominios planos, como se muestra en la Figura 1. Para nosotros, un polígono simple Incluye tanto el límite como el interior. A polígono con agujeros es un polígono simple menos los interiores de algunos otros polígonos simples, su límite tiene más de un componente conectado. A dominio múltiple es más general aún, permitiendo límites internos, de hecho, tal dominio puede ser cualquier gráfico plano en línea recta en el que la cara infinita está limitada por un ciclo simple. Múltiples dominios modelan objetos hechos de más de un material. Dominios curvos permitir lados que sean curvas algebraicas como splines. Como en los tres primeros casos, conocidos colectivamente como dominios poligonales, los dominios curvos pueden incluir o no huecos y límites internos.

Figura 1 . Tipos de entradas bidimensionales: (a) polígono simple, (b) polígono con huecos, (c) dominio múltiple y (d) dominio curvo.

Las entradas tridimensionales tienen tipos análogos. A poliedro simple es topológicamente equivalente a una bola. A poliedro general puede estar conectado de forma múltiple, lo que significa que es topológicamente equivalente a un toro sólido o algún otro género superior sólido. También puede tener cavidades, lo que significa que su límite puede tener más de un componente conectado. Suponemos, sin embargo, que en cada punto del límite de un poliedro general, una esfera suficientemente pequeña encierra una pieza conectada del interior del poliedro y una pieza conectada de su exterior. Finalmente, hay múltiples dominios poliédricos - poliedros generales con límites internos - y Tres-dominios curvos dimensionales, que normalmente tiene límites definidos por parches de spline.

La construcción y el modelado de la geometría de dominio quedan fuera del alcance de este capítulo, por lo que simplemente asumiremos que los dominios se dan en algún tipo de representación de límites, sin especificar la forma exacta de esta representación. Los geómetras computacionales normalmente asumen estructuras de datos combinatorias exactas, como listas enlazadas para polígonos simples y polígonos con huecos, listas de bordes doblemente conectadas [103] o estructuras de cuatro bordes [63] para dominios múltiples planos y estructuras de bordes alados [44, 62] para dominios poliédricos.

En la práctica, los dominios complicados se diseñan en sistemas de diseño asistido por computadora (CAD). Estos sistemas utilizan representaciones de superficies diseñadas para la representación visual y luego traducen el diseño final a otro formato para la entrada al generador de malla. El formato de archivo Stereolithography Tessellation Language (STL), desarrollado originalmente para la creación rápida de prototipos de modelos sólidos, especifica el límite como una lista de polígonos de superficie (generalmente triángulos) y normales de superficie. Las ventajas del formato de entrada STL son que se puede garantizar un modelo “hermético” y el usuario puede especificar la tolerancia del modelo (desviación del modelo CAD). El formato de Especificación de intercambio de gráficos inicial (IGES) permite una variedad de representaciones de superficie, incluidas representaciones de orden superior como B-splines y NURB. Quizás debido a su mayor complejidad, oa sistemas CAD o usuarios descuidados, los archivos IGES a menudo contienen geometría incorrecta (huecos o material adicional) en las intersecciones de superficies.

Un enfoque alternativo para la traducción de formato es consultar directamente el sistema CAD con, por ejemplo, consultas de recintos puntuales y luego construir una nueva representación basada en las respuestas a esas consultas. Este enfoque es más ventajoso cuando el problema de traducción es difícil, como puede ser en el caso de superficies implícitas (conjuntos de niveles de funciones complicadas) o fórmulas de geometría sólida constructiva.

Con el enfoque, la traducción o la reconstrucción mediante consultas, el modelo CAD debe ser topológicamente correcto y lo suficientemente preciso para permitir el mallado. Esperamos ver una mayor integración entre el modelado sólido y el mallado en el futuro.


SDO_NN_DISTANCE

Descripción

Devuelve la distancia de un objeto devuelto por el operador SDO_NN. Válido solo dentro de una llamada al operador SDO_NN.

Palabras clave y parámetros

Valor Descripción
número Especifica un número que debe ser el mismo que el último parámetro pasado al operador SDO_NN.
El tipo de datos es NUMBER.

Este operador devuelve la distancia de un objeto devuelto por el operador SDO_NN. Para determinar qué tan cerca están dos objetos geométricos, se usa la distancia más corta posible entre dos puntos cualesquiera en la superficie de cada objeto.

Notas de uso

SDO_NN_DISTANCE es un operador auxiliar del operador SDO_NN. Devuelve la distancia entre la geometría especificada y un objeto vecino más cercano. Esta distancia se pasa como datos auxiliares al operador SDO_NN. (Para obtener una explicación de cómo los operadores pueden usar datos auxiliares, consulte la sección sobre datos auxiliares en el capítulo sobre índices de dominio en el Guía del desarrollador de cartuchos de datos Oracle9i.)

Puede elegir cualquier número arbitrario para el número parámetro. El único requisito es que debe coincidir con el último parámetro de la llamada al operador SDO_NN.

Utilice una variable de vinculación para almacenar y operar en el valor de distancia.

El siguiente ejemplo busca los dos objetos de la columna SHAPE en la tabla COLA_MARKETS que están más cerca de un punto especificado (10,7) y encuentra la distancia entre cada objeto y el punto. (El ejemplo usa las definiciones y los datos de la Sección 2.1.)

Tenga en cuenta lo siguiente sobre este ejemplo:

1 se utiliza como número parámetro para SDO_NN_DISTANCE, y 1 también se especifica como último parámetro para SDO_NN (después de 'sdo_num_res = 2').

El alias de la columna dist mantiene la distancia entre el objeto y el punto. (Para datos geodésicos, la unidad de distancia son metros para datos no geodésicos, la unidad de distancia es la unidad asociada con los datos).

Temas relacionados


1.7 Consulta de datos espaciales

Una vez que haya creado y llenado las tablas espaciales, actualizado los metadatos espaciales y creado índices espaciales, puede utilizar el operador y las funciones de Oracle Locator para realizar consultas basadas en la ubicación. Esta sección muestra algunas consultas para encontrar los clientes más cercanos a una tienda y todos los clientes dentro de una distancia específica de una tienda.

El ejemplo 1-5 muestra la instrucción SQL y la salida para encontrar los tres clientes más cercanos a la tienda con el valor STORE_ID de 101. Este ejemplo usa el operador SDO_NN ("vecinos más cercanos").

Ejemplo 1-5 Búsqueda de clientes más cercanos a una tienda

La sugerencia / * + ordenada * / es una sugerencia para el optimizador, que asegura que la tabla STORES se busque primero.

El operador SDO_NN devuelve el valor SDO_NUM_RES de los clientes de la tabla CUSTOMERS que están más cerca de la tienda 101. El primer argumento de SDO_NN (c.cust_geo_location en el ejemplo) es la columna para buscar. El segundo argumento de SDO_NN (s.storeh_geo_location en el ejemplo) es la ubicación a la que desea encontrar los vecinos más cercanos. No se deben hacer suposiciones sobre el orden de los resultados devueltos. Por ejemplo, no se garantiza que la primera fila devuelta sea el cliente más cercano a la tienda 101. Si dos o más clientes están a la misma distancia de la tienda, cualquiera de los clientes puede ser devuelto en llamadas posteriores a SDO_NN.

Cuando usa el parámetro SDO_NUM_RES, no se usan otras restricciones en la cláusula WHERE. SDO_NUM_RES solo tiene en cuenta la proximidad. Por ejemplo, si agregó un criterio a la cláusula WHERE porque deseaba que los cinco clientes más cercanos residieran en NY y cuatro de los cinco clientes más cercanos residieran en NJ, la consulta anterior devolvería una fila. Este comportamiento es específico del parámetro SDO_NUM_RES y es posible que sus resultados no sean los que busca.

El Ejemplo 1-6 amplía el Ejemplo 1-5 mostrando la declaración SQL y la salida (reformateada para facilitar la lectura) para encontrar los tres clientes más cercanos a la tienda con el valor STORE_ID de 101, y ordenando los resultados por distancia (en metros) del Tienda. Este ejemplo utiliza el operador auxiliar SDO_NN_DISTANCE.

Ejemplo 1-6 Búsqueda de clientes más cercanos, ordenados por distancia desde la tienda

Aquí se requiere la sugerencia de índice (c customers_sidx) para forzar el uso del índice espacial en la tabla CUSTOMERS, debido a un problema en esta versión con consultas espaciales que usan una cláusula ORDER BY.

El operador SDO_NN_DISTANCE es un operador auxiliar del operador SDO_NN y solo se puede utilizar dentro del operador SDO_NN. El argumento de este operador es un número que coincide con el número especificado como último argumento de SDO_NN en este ejemplo es 1. No hay un significado oculto para este argumento, es simplemente una etiqueta. Con SDO_NN_DISTANCE, puede ordenar los resultados por distancia y garantizar que la primera fila devuelta sea la más cercana. Si los datos que está consultando se almacenan como longitud y latitud, la unidad predeterminada para SDO_NN_DISTANCE son metros.

El operador SDO_NN también tiene un parámetro de unidad que determina la unidad de medida devuelta por SDO_NN_DISTANCE; sin embargo, no se usa en este ejemplo.

La cláusula ORDER BY distancia asegura que las distancias se devuelvan en orden, con la distancia más corta primero.

El ejemplo 1-7 muestra la instrucción SQL y la salida para encontrar todos los clientes dentro de las 100 millas de la tienda con el valor STORE_ID de 101. Este ejemplo usa el operador SDO_WITHIN_DISTANCE.

Ejemplo 1-7 Búsqueda de clientes a menos de 100 millas de una tienda

El operador SDO_WITHIN_DISTANCE devuelve los clientes de la tabla de clientes que están dentro de las 100 millas de la tienda 101. El primer parámetro de SDO_WITHIN_DISTANCE (c.cust_geo_location en el ejemplo) es la columna para buscar. El segundo parámetro (s.store_geo_location en el ejemplo) es la ubicación desde la que desea determinar las distancias. No se deben hacer suposiciones sobre el orden de los resultados devueltos. Por ejemplo, no se garantiza que la primera fila devuelta sea el cliente más cercano a la tienda 101.

La palabra clave distancia especifica el valor de la distancia (100 en este ejemplo).

La palabra clave unit especifica la unidad de medida de la palabra clave distancia. La unidad predeterminada es la unidad de medida asociada con los datos. Para los datos de longitud y latitud, el valor predeterminado es metros; sin embargo, en este ejemplo son millas.


Construcción de un gráfico de series de tiempo

Para construir una gráfica de series de tiempo, debemos mirar ambas partes de nuestra conjunto de datos emparejados. Comenzamos con un sistema de coordenadas cartesiano estándar. El eje horizontal se usa para trazar los incrementos de fecha o hora, y el eje vertical se usa para trazar los valores de la variable que estamos midiendo. Al hacer esto, hacemos que cada punto del gráfico corresponda a una fecha y una cantidad medida. Los puntos del gráfico suelen estar conectados mediante líneas rectas en el orden en que aparecen.


12 respuestas 12

Cualquier polígono (regular o no) puede describirse mediante una ecuación que incluya solo valores absolutos y polinomios. Aquí hay una pequeña explicación de cómo hacerlo.

Digamos que una curva $ C $ viene dada por la ecuación $ f $ si tenemos $ C = <(x, y) in mathbb^ 2, , f (x, y) = 0 > $.

Si $ C_1 $ y $ C_2 $ están dados por $ f_1 $ y $ f_2 $ respectivamente, entonces $ C_1 cup C_2 $ está dado por $ f_1. f_2 $ y $ C_1 cap C_2 $ viene dado por $ f_1 ^ 2 + f_2 ^ 2 $ (o $ | f_1 | + | f_2 | $). Entonces, si $ C_1 $ y $ C_2 $ pueden describirse mediante una ecuación que involucra valores absolutos y polinomios, entonces también lo hacen $ C_1 cup C_2 $ y $ C_1 cap C_2 $.

Si $ C = <(x, y) in mathbb^2, , f(x,y) ge 0>$, then $C$ is given by the equation $|f|-f$.

Now, any segment $S$ can be described as $S = <(x,y) in mathbb^2, , a x + b y = c, , x_0 le x le x_1, , y_0 le y le y_1>$, which is given by a single equation by the above principles. And since union of segments also are given by an equation, you get the result.

EDIT : For the specific case of the octagon of radius $r$, if you denote $s = sin(pi/8)$, $c = cos(pi/8)$, then one segment is given by $|y| le rs$ and $x = rc$, for which an equation is

$f(x, y) = left||rs - |y|| - (rs - |y|) ight| + |x-rc| = 0$

So I think the octagon is given by

To get a general formula for a regular polygon of radius $r$ with $n$ sides, denote $c_n = cos(pi/n)$, $s_n = sin(pi/n)$ and

$f_n(x+iy) = left||rs_n - |y|| - (rs_n - |y|) ight| + |x-rc_n|$

then your polygon is given by

Depending on $n$, you can use symmetries to lower the degree a bit (as was done with $n = 8$).

Here's a parametric equation I have made for a regular $n$-gon, coded in R:

This equation is actually just the polar equation for the line through the point $(1,0)$ and $(cos(2pi/n),sin(2pi/n))$ which contains one of the edges. By restricting the range of the variable $ heta$ to the interval $[0,2pi/n[$, you will in fact just get that edge. Now, we want to replicate that edge by rotating it repeatedly through an angle $2pi/n$ to get the full polygon. But this can also be achieved by using the modulus function and reducing all angles to the interval $[0,2pi/n[$. This way, you get the polar equation I propose.

So, using polar plots and the modulo function, it's pretty easy to make regular $n$-gons.

Aquí está otro parametric equation for a regular $n$-gon with unit radius:

$ beginx&=cosleft(frac ight)cosleft(frac(2lfloor u floor+1) ight)-(2u-2lfloor u floor-1)sinleft(frac ight)sinleft(frac(2lfloor u floor+1) ight)y&=cosleft(frac ight)sinleft(frac(2lfloor u floor+1) ight)+(2u-2lfloor u floor-1)sinleft(frac ight)cosleft(frac(2lfloor u floor+1) ight)end$

The provenance of this set is a bit more transparent if we switch to matrix-vector notation:

$ begincosleft(frac(2lfloor u floor+1) ight)&-sinleft(frac(2lfloor u floor+1) ight)sinleft(frac(2lfloor u floor+1) ight)&cosleft(frac(2lfloor u floor+1) ight)endcomenzarcosleft(frac ight)(2u-2lfloor u floor-1)sinleft(frac ight)end$

and we see that the construction involves rotating and copying the line segment joining the points $(cosleft(frac ight),pmsinleft(frac ight))$ $n$ times around a circle.

Here's sundry Mathematica código:

The following is probably not in the spirit of the game, but what about a parametric equation? If we are willing to use complex numbers to represent points in the plane, we could use $z=texp(2pi ik/n) +(1-t)exp(2pi i(k+1)/n),qquad 0 le t<1,quad k=0, 1, dots, n-1$

When n' = n/2 and % is the modulus operator.

It would work just as well with cosecant as with secant.

Also the apothem would be 1 and the radius sec(-π/n).

$arcsin left(sin left(left[sin left(60cdot frac<180> ight)left(frac><3>cdot x+y ight),x ight] ight) ight)+left(frac<1><3> ight)cdot arcsin left(sin left(left[cos left(30cdot frac<180> ight)left(x-frac><3>y ight),y ight]cdot sqrt<3> ight) ight)=0$

I came up with this to plot a hexagon tessellation in desmos. the [list] funct "hides" the overlay . so it isn't really a single EQ. actually there was very little info on this. took me weeks. enjoy

Reposted from PolymathProgrammer.com, my answer to my own initial query. Generated mostly on my own after some initial help from a friend (Jason Schmurr) and my dad (Russell Gmirkin)

I believe I've solved my own inquiry. The following are functions that, when graphed in polar coordinates render lovely polygons.

In fact, I’ve got 3 versions (6 if you consider rotation a factor to either align a vertex or the midpoint of a side with $ heta=0$). One with circumradius = 1 (as vertices $ o infty$, polygons expand outward toward the circumscribed circle), one with apothem = 1 (as vertices $ o infty$, polygons collapse inward toward the inscribed circle) and one with the midpoint between circumradius & apothem = 1 (as vertices $ o infty$, both the maxima and minima, thus the circumscribed and inscribed circles, collapse toward that ‘midpoint radius’).

I’d be interested to know whether this approach, describing the radius of a polygon as a periodic function, has any precedent (has anyone else done this, or am I the first)? I’ve been working on this idea for some time (on and off for years), but just recently overcame some stumbling blocks with a little help from a friend and my dad. Most of the legwork was my own, though.

The relatively final form(s) appear to be:

(n-gon, circumradius=1, unrotated)
1/(((Sec[pi/v]-1)/(Sec[Pi/4]-1))Abs[Cos[(v*x)/4]]+((Sec[pi/v]-1)/(Sec[Pi/4]-1))Abs[Cos[((v*x)/4)-(Pi/2)]]-((Sec[pi/v]-1)/(Sec[Pi/4]-1))+1)

(n-gon, circumradius=1, rotated $-pi/4$)
1/(((Sec[pi/v]-1)/(Sec[Pi/4]-1))Abs[Cos[((v*x)/4)-(Pi/4)]]+((Sec[pi/v]-1)/(Sec[Pi/4]-1))Abs[Cos[((v*x)/4)-(3Pi/4)]]-((Sec[pi/v]-1)/(Sec[Pi/4]-1))+1)

(n-gon, function centered around unit circle, unrotated)
((Sec[Pi/v]+1)/2)/(((Sec[Pi/v]-1)/(Sec[Pi/4]-1))Abs[Cos[((v*x)/4)]]+((Sec[pi/v]-1)/(Sec[Pi/4]-1))Abs[Cos[((v*x)/4)-(Pi/2)]]-((Sec[pi/v]-1)/(Sec[Pi/4]-1))+1)

(n-gon, function centered around unit circle, rotated $-pi/4$)
((Sec[Pi/v]+1)/2)/(((Sec[pi/v]-1)/(Sec[Pi/4]-1))Abs[Cos[((v*x)/4)-(Pi/4)]]+((Sec[pi/v]-1)/(Sec[Pi/4]-1))Abs[Cos[((v*x)/4)-(3Pi/4)]]-((Sec[pi/v]-1)/(Sec[Pi/4]-1))+1)

(n-gon, apothem=1, unrotated)
Sec[Pi/v]/(((Sec[pi/v]-1)/(Sec[Pi/4]-1))Abs[Cos[(v*x)/4]]+((Sec[pi/v]-1)/(Sec[Pi/4]-1))Abs[Cos[((v*x)/4)-(Pi/2)]]-((Sec[pi/v]-1)/(Sec[Pi/4]-1))+1)

Don’t know whether they simplify at all to something less complicated… Even if not, they’re beauties!

If it's a unique solution and I'm first to it, I submit these as the Gmirkin Polygon Radius Function(s) (or some suitably nifty sounding name that’s not too cumbersome). *Smile* Heh.

I may write them up formally for publication at some point, once a few previous engagements clear up, assuming they’ve not previously been published or some directly correlated function has already been published elsewhere. (If so, I’d like to know when, where and by whom for academic curiosity’s sake.)

It is my belief that a similar function exists for describing 3D Polyhedrons of some description(s). Though, I have not yet even attempted such a case and will probably stick to 2D cases for now. I can also tell you that if you vary the phase shift of the denominator [Abs[Cos[]]] terms by differing amounts (though not both by some multiple of $pi/4$, $pi/2$, etc.), you can also reproduce rectangles, isosceles triangles, etc. In some cases you can also generate diamond shapes by varying some other parameters. It's s surprisingly robust solution, as I'd hoped. Lord knows it's taken me a few years of false starts to get at the correct combination of functions. Though, I learned plenty along the way, much of which helped me generalize to all polygons from the square case a friend solved at my behest a week or two ago.

Here's hoping this is an interesting, unique new solution that's viable and notable. (One can hope!)

Sorry the post is a bit lengthy. )

Lo siento. Jumped the gun slightly.

I retract the above equations. At the behest of someone on another site, I checked in Wolfram Alpha at a few data points. While it appears to work for the Square case (where the coefficients and corrective term basically cancel out), it doesn't work for other cases, but is slightly off. I think I've got the coefficients wrong. Will have to poke around a bit more in the maths to see if it's possible to get a technically correct exact solution.

The graphs were so close as to fool me into thinking they were exact for all cases. Will get back to you if/when I get a technically correct solution. 'Til then. I still believe there is a valid function, since the Square case is technically correct @ 1/(Abs[Sin(x)]+Abs[Cos[x]]) or 1/(Abs[Cos[x]]+[Abs[Cos[x-(Pi/2)]]]) . Just need the technically correct coefficient. will work on it as I've got some time. But, for now, the incorrect versions are darned close! o) Enough to fool most people (including me, apparently).