Suite

Comment rechercher tous les polygones à distance d'un point ?


Appelez-moi stupide, mais d'une manière ou d'une autre, je ne pouvais pas comprendre comment faire ce qui suit.

J'ai un fichier de formes de test avec 18 fonctionnalités, que j'ai importé avec succès dans GeoDjango (1.3, fonctionnant sur Spatialite). Comme exemple pratique, j'ai pris un centroïde de l'un d'eux (zone.mpoly.centroid) et a essayé de trouver toutes les zones dans un rayon de 20 km (le toucher suffirait, il n'est pas nécessaire de couvrir toute la zone).

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

Cependant, cela ne me donne qu'une liste vide. Augmenter le nombre à 200 km (en théorie, cela devrait couvrir tout mon ensemble de données) ne donne rien non plus.

Est-ce que je fais quelque chose de mal?


J'ai raté ça avant, vous utilisez SpatialLite. dwithin n'est pas pris en charge avec SpatialLite.


Ancienne réponse : 'Area' est une classe GeoDjango. Vous avez probablement un conflit de nom. Ne nommez pas vos modèles avec le même nom que les classes GeoDjango.

De plus, 'centroid' ne doit pas être utilisé comme nom de variable pour la même raison.


Insérez des polygones geojson dans mongodb et interrogez, en fonction des coordonnées d'un point, tous les polygones qui se trouvent à une certaine distance de celui-ci

J'ai besoin d'aide sur : comment insérer des polygones geojson dans une base de données mongodb et interroger, en fonction des coordonnées d'un certain point, tous les polygones situés à une certaine distance de ce point

Voici l'échantillon geojson que j'utiliserai :

Je veux l'enregistrer dans la base de données mongodb et pouvoir l'interroger. Pour cela, je fais ce qui suit :

Je crée un schéma de mangouste :

Je crée un modèle de mangouste :

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

J'enregistre le geojson dans ma base de données :

var post = nouveau GeoModel (testJson)

Et, enfin, je cherche et trouve l'enregistrement :

Les problèmes pour lesquels j'ai besoin d'aide :

Je vais charger beaucoup et beaucoup de données geojson sous forme de polygones.

Disons que je suis situé aux coordonnées suivantes : 40.8003, -73.9580

Pour une distance de x kilomètres, je veux pouvoir tous les polygones qui sont à portée.

Donc, je pense faire une requête similaire à celle-ci, qui bien sûr ne fonctionne pas :) :


2 réponses 2

C'est une réponse incroyablement tardive, mais je peux peut-être faire la lumière sur une solution. Le numéro « set » auquel vous faites référence est un identificateur de référence spatiale ou SRID. Pour les calculs lat/long, vous devriez envisager de régler ce paramètre sur 4326, ce qui garantira que les mètres sont utilisés comme unité de mesure. Vous devriez également envisager de passer à SqlGeography plutôt qu'à SqlGeometry, mais nous continuerons avec SqlGeometry pour le moment. Pour définir en bloc le SRID, vous pouvez mettre à jour votre table comme suit :

Pour un rayon unique, vous devez créer un rayon en tant qu'objet spatial. Par exemple:

STBuffer() prend le point spatial et crée un cercle (maintenant de type Polygone) à partir de celui-ci. Vous pouvez ensuite interroger votre ensemble de données comme suit :

Ce qui précède utilisera désormais tout index spatial que vous avez créé sur la [SpatialColumn] dans son plan de requête.

Il existe également une option plus simple qui fonctionnera (et utilisera toujours un index spatial). La méthode STDistance vous permet d'effectuer les opérations suivantes :

Enfin, travailler avec une collection de rayons. Vous avez quelques options. La première consiste à exécuter ce qui précède pour chaque rayon à tour de rôle, mais je considérerais ce qui suit pour le faire comme un seul :

La finale ci-dessus n'a pas été testée, mais je suis sûr à 99% que c'est à peu près là avec une petite quantité de peaufinage étant une possibilité. L'idéal de prendre la distance de rayon min dans la sélection est que si les rayons multiples proviennent d'un seul emplacement, si un point se trouve dans le premier rayon, il sera naturellement dans tous les autres. Vous allez donc dupliquer l'enregistrement, mais en regroupant puis en sélectionnant le min, vous n'en obtenez qu'un (et le plus proche).

J'espère que cela vous aidera, même si 4 semaines après avoir posé la question. Désolé de ne pas l'avoir vu plus tôt, si seulement il n'y avait qu'une seule balise spatiale pour les questions.


3 réponses 3

Une version lente (sans index spatiaux) :

Pour utiliser les index spatiaux, vous devez dénormaliser votre table afin que chaque sommet de polygone soit stocké dans son propre enregistrement.

Créez ensuite l'INDICE SPATIAL sur le champ qui contient les coordonnées des sommets et lancez simplement cette requête :

Les choses seront beaucoup plus faciles si vous stockez les coordonnées UTM dans votre base de données plutôt que la latitude et la longitude.

Je ne pense pas qu'il y ait une seule réponse à cela. Il s'agit généralement de savoir comment organiser vos données pour qu'elles exploitent la localité spatiale inhérente à votre problème.

La première idée qui me vient à l'esprit serait d'utiliser une grille, d'attribuer chaque point à un carré et de cocher sélectionner le carré dans lequel se trouve le point et ceux qui l'entourent. Si nous parlons de grilles infinies, alors utilisez une valeur de hachage du carré, cela vous donnerait plus de points que nécessaire (où vous avez des collisions), mais réduira toujours le montant par un tas. Bien sûr, ce n'est pas immédiatement applicable aux polygones, c'est juste un brainstorming. Une approche possible qui pourrait générer trop de collisions serait de OU toutes les valeurs hachées ensemble et de sélectionner toutes les entrées où les hachages AND avec cette valeur sont différents de zéro (je ne sais pas si cela est possible dans MySQL), vous voudrez peut-être utiliser un grand quantité de bits cependant.

Le problème avec cette approche est que, en supposant que nous parlons de coordonnées sphériques (lat, long, généralement) sont les singularités, car les «carrés» de la grille se rétrécissent à mesure que vous vous approchez des pôles. L'approche facile à cela est. ne placez aucun point près des pôles. :)


ors_geocode() transforme une description d'un emplacement fournie dans la requête , telle que le nom du lieu, l'adresse ou le code postal, en une description normalisée de l'emplacement avec une géométrie de point. De plus, il propose un géocodage inversé qui fait exactement le contraire : il renvoie le prochain objet englobant qui entoure les coordonnées de l'emplacement donné. Pour obtenir des résultats plus pertinents, vous pouvez également définir un rayon de tolérance autour des coordonnées demandées.

Ce service vous permet de trouver des lieux d'intérêt autour ou à l'intérieur de coordonnées géographiques données. Vous pouvez rechercher des entités données autour d'un point, d'un chemin ou même à l'intérieur d'un polygone spécifié dans la géométrie . Pour lister toutes les catégories de POI disponibles, utilisez ors_pois('list') .

Vous pouvez collecter des statistiques sur le nombre de certains POI dans une zone en utilisant request='stats' .


Paramètres

Fonctionnalités qui seront évaluées par rapport aux valeurs du paramètre Sélection de fonctionnalités. La sélection sera appliquée à ces fonctionnalités.

Spécifie la relation spatiale à évaluer.

  • Intersection — Les entités de la couche en entrée seront sélectionnées si elles croisent une entité sélectionnée. C'est la valeur par défaut.
  • Intersection 3D — Les entités de la couche en entrée seront sélectionnées si elles croisent une entité de sélection dans un espace tridimensionnel (x, y et z).
  • Intersection (SGBD) : les entités de la couche en entrée seront sélectionnées si elles croisent une entité sélectionnée. Cette option s'applique uniquement aux géodatabases d'entreprise. La sélection sera traitée dans le SGBD de la géodatabase d'entreprise plutôt que sur le client lorsque toutes les exigences sont remplies (voir plus d'informations dans les notes d'utilisation). Cette option peut offrir de meilleures performances que d'effectuer la sélection sur le client.
  • À une distance — Les entités de la couche en entrée seront sélectionnées si elles se trouvent à une distance spécifiée (à l'aide de la distance euclidienne) d'une entité sélectionnée. Utilisez le paramètre Distance de recherche pour spécifier la distance.
  • À l'intérieur d'une distance géodésique : les entités de la couche en entrée seront sélectionnées si elles se trouvent à une distance spécifiée d'une entité sélectionnée. La distance entre les entités sera calculée à l'aide d'une formule géodésique qui prend en compte la courbure du sphéroïde et gère correctement les données à proximité et à travers la ligne de date et les pôles. Utilisez le paramètre Distance de recherche pour spécifier la distance.
  • À une distance 3D — Les entités de la couche en entrée seront sélectionnées si elles se trouvent à une distance spécifiée d'une entité sélectionnée dans l'espace tridimensionnel. Utilisez le paramètre Distance de recherche pour spécifier la distance.
  • Contient — Les entités de la couche en entrée seront sélectionnées si elles contiennent une entité de sélection.
  • Contient complètement — Les entités de la couche en entrée seront sélectionnées si elles contiennent complètement une entité de sélection.
  • Contient Clementini — Cette relation spatiale donne les mêmes résultats que Contient complètement, à l'exception du fait que si l'entité sélectionnée se trouve entièrement sur la limite de l'entité en entrée (aucune partie n'est correctement à l'intérieur ou à l'extérieur), l'entité ne sera pas sélectionnée. Clementini définit le polygone frontière comme la ligne séparant l'intérieur et l'extérieur, la frontière d'une ligne est définie comme ses points d'extrémité et la frontière d'un point est toujours vide.
  • Dans — Les entités de la couche en entrée seront sélectionnées si elles se trouvent dans une entité sélectionnée.
  • Complètement à l'intérieur — Les entités de la couche en entrée seront sélectionnées si elles sont entièrement à l'intérieur ou contenues par une entité sélectionnée.
  • Dans Clementini — Le résultat sera identique à Dans, à l'exception du fait que si l'intégralité de l'entité dans la couche en entrée se trouve sur la limite de l'entité dans la couche de sélection, l'entité ne sera pas sélectionnée. Clementini définit le polygone frontière comme la ligne séparant l'intérieur et l'extérieur, la frontière d'une ligne est définie comme ses points d'extrémité et la frontière d'un point est toujours vide.
  • Sont identiques à — Les entités de la couche en entrée seront sélectionnées si elles sont identiques (en géométrie) à une entité sélectionnée.
  • Touches de limite — Les entités de la couche en entrée seront sélectionnées si elles ont une limite qui touche une entité sélectionnée. Lorsque les entités en entrée sont des lignes ou des polygones, la limite de l'entité en entrée ne peut toucher que la limite de l'entité sélectionnée et aucune partie de l'entité en entrée ne peut traverser la limite de l'entité sélectionnée.
  • Partager un segment de ligne avec — Les entités de la couche en entrée seront sélectionnées si elles partagent un segment de ligne avec une entité sélectionnée. Les entités d'entrée et de sélection doivent être des lignes ou des polygones.
  • Traversé par le contour de — Les entités de la couche en entrée seront sélectionnées si elles sont traversées par le contour d'une entité sélectionnée. Les entités d'entrée et de sélection doivent être des lignes ou des polygones. Si des polygones sont utilisés pour la couche d'entrée ou de sélection, la limite (ligne) du polygone sera utilisée. Les lignes qui se croisent en un point seront sélectionnées, les lignes qui partagent un segment de ligne ne seront pas sélectionnées.
  • Avoir leur centre à l'intérieur — Les entités de la couche en entrée seront sélectionnées si leur centre se situe dans une entité de sélection. Le centre de l'entité est calculé comme suit : pour les polygones et les multipoints, le centroïde de la géométrie est utilisé pour l'entrée de ligne, le milieu de la géométrie est utilisé.

Les entités du paramètre Entités en entrée seront sélectionnées en fonction de leur relation avec les entités de cette couche ou classe d'entités.

La distance qui sera recherchée. Ce paramètre n'est valide que si le paramètre Relation est défini sur Dans une distance , Dans une distance géodésique , Dans une distance 3D , Intersection , Intersection 3D , Avoir leur centre dans ou Contient .

Si l'option Géodésique à une distance est sélectionnée, utilisez une unité linéaire telle que les kilomètres ou les miles.

Spécifie comment la sélection sera appliquée à l'entrée et comment elle sera combinée avec une sélection existante. Cet outil n'inclut pas d'option pour effacer une sélection existante, utilisez l'option Effacer la sélection actuelle sur l'outil Sélectionner une couche par attribut pour le faire.

  • Nouvelle sélection — La sélection résultante remplacera toute sélection existante. C'est la valeur par défaut.
  • Ajouter à la sélection actuelle — La sélection résultante sera ajoutée à une sélection existante. Si aucune sélection n'existe, c'est la même chose que l'option Nouvelle sélection.
  • Supprimer de la sélection actuelle — La sélection résultante sera supprimée d'une sélection existante. Si aucune sélection n'existe, l'opération n'aura aucun effet.
  • Sélectionner un sous-ensemble de la sélection actuelle — La sélection résultante sera combinée avec la sélection existante. Seuls les enregistrements communs aux deux restent sélectionnés.
  • Changer la sélection actuelle — La sélection sera changée. Tous les enregistrements sélectionnés seront supprimés de la sélection et tous les enregistrements non sélectionnés seront ajoutés à la sélection. Les paramètres Sélection d'entités et Relation sont ignorés lorsque cette option est sélectionnée.

Spécifie si le résultat de l'évaluation de la relation spatiale ou le résultat opposé sera utilisé. Par exemple, ce paramètre peut être utilisé pour obtenir une liste d'entités qui ne se coupent pas ou ne se trouvent pas à une distance donnée d'entités dans un autre jeu de données.

  • Non coché : le résultat de la requête sera utilisé. C'est la valeur par défaut.
  • Coché : le contraire du résultat de la requête sera utilisé. Si le paramètre Type de sélection est utilisé, l'inversion de la sélection se produit avant qu'elle ne soit combinée avec les sélections existantes.

Sortie dérivée

Les entrées mises à jour avec les sélections appliquées.

Les noms des entrées mises à jour.

Le nombre d'enregistrements sélectionnés.

Fonctionnalités qui seront évaluées par rapport aux valeurs du paramètre select_features. La sélection sera appliquée à ces fonctionnalités.

Spécifie la relation spatiale à évaluer.

  • INTERSECTION — Les entités de la couche en entrée seront sélectionnées si elles croisent une entité sélectionnée. C'est la valeur par défaut.
  • INTERSECT_3D — Les entités de la couche en entrée seront sélectionnées si elles coupent une entité de sélection dans un espace tridimensionnel (x, y et z).
  • INTERSECT_DBMS — Les entités de la couche en entrée seront sélectionnées si elles croisent une entité sélectionnée. Cette option s'applique uniquement aux géodatabases d'entreprise. La sélection sera traitée dans le SGBD de la géodatabase d'entreprise plutôt que sur le client lorsque toutes les exigences sont remplies (voir les notes d'utilisation). Cette option peut offrir de meilleures performances que d'effectuer la sélection sur le client.
  • WITHIN_A_DISTANCE — Les entités de la couche en entrée seront sélectionnées si elles se trouvent à la distance spécifiée (à l'aide de la distance euclidienne) d'une entité sélectionnée. Utilisez le paramètre search_distance pour spécifier la distance.
  • WITHIN_A_DISTANCE_3D — Les entités de la couche en entrée seront sélectionnées si elles se trouvent à une distance spécifiée d'une entité sélectionnée dans l'espace tridimensionnel. Utilisez le paramètre search_distance pour spécifier la distance.
  • WITHIN_A_DISTANCE_GEODESIC — Les entités de la couche en entrée seront sélectionnées si elles se trouvent à une distance spécifiée d'une entité sélectionnée. La distance entre les entités sera calculée à l'aide d'une formule géodésique qui prend en compte la courbure du sphéroïde et gère correctement les données à proximité et à travers la ligne de date et les pôles. Utilisez le paramètre search_distance pour spécifier la distance.
  • CONTIENT — Les entités de la couche en entrée seront sélectionnées si elles contiennent une entité de sélection.
  • COMPLETELY_CONTAINS — Les entités de la couche en entrée seront sélectionnées si elles contiennent complètement une entité de sélection.
  • CONTAINS_CLEMENTINI — Cette relation spatiale donne les mêmes résultats que COMPLETELY_CONTAINS à l'exception du fait que si l'entité sélectionnée se trouve entièrement sur la limite de l'entité en entrée (aucune partie n'est correctement à l'intérieur ou à l'extérieur), l'entité ne sera pas sélectionnée. Clementini définit le polygone frontière comme la ligne séparant l'intérieur et l'extérieur, la frontière d'une ligne est définie comme ses points d'extrémité et la frontière d'un point est toujours vide.
  • À L'INTÉRIEUR — Les entités de la couche en entrée seront sélectionnées si elles se trouvent dans une entité sélectionnée.
  • COMPLETELY_WITHIN — Les entités de la couche en entrée seront sélectionnées si elles sont entièrement à l'intérieur ou contenues par une entité sélectionnée.
  • WITHIN_CLEMENTINI — Le résultat sera identique à WITHIN à l'exception du fait que si l'intégralité de l'entité dans la couche en entrée se trouve sur la limite de l'entité dans la couche de sélection, l'entité ne sera pas sélectionnée. Clementini définit le polygone frontière comme la ligne séparant l'intérieur et l'extérieur, la frontière d'une ligne est définie comme ses points d'extrémité et la frontière d'un point est toujours vide.
  • ARE_IDENTICAL_TO — Les entités de la couche en entrée seront sélectionnées si elles sont identiques (en géométrie) à une entité sélectionnée.
  • BOUNDARY_TOUCHES — Les entités de la couche en entrée seront sélectionnées si elles ont une limite qui touche une entité sélectionnée. Lorsque les entités en entrée sont des lignes ou des polygones, la limite de l'entité en entrée ne peut toucher que la limite de l'entité sélectionnée et aucune partie de l'entité en entrée ne peut traverser la limite de l'entité sélectionnée.
  • SHARE_A_LINE_SEGMENT_WITH — Les entités de la couche en entrée seront sélectionnées si elles partagent un segment de ligne avec une entité de sélection. Les entités d'entrée et de sélection doivent être des lignes ou des polygones.
  • CROSSED_BY_THE_OUTLINE_OF — Les entités de la couche en entrée seront sélectionnées si elles sont traversées par le contour d'une entité sélectionnée. Les entités d'entrée et de sélection doivent être des lignes ou des polygones. Si des polygones sont utilisés pour la couche d'entrée ou de sélection, la limite (ligne) du polygone sera utilisée. Les lignes qui se croisent en un point seront sélectionnées, les lignes qui partagent un segment de ligne ne seront pas sélectionnées.
  • HAVE_THEIR_CENTER_IN — Les entités de la couche en entrée seront sélectionnées si leur centre se situe dans une entité sélectionnée. Le centre de l'entité est calculé comme suit : pour les polygones et les multipoints, le centroïde de la géométrie est utilisé pour l'entrée de ligne, le milieu de la géométrie est utilisé.

Les entités du paramètre Entités en entrée seront sélectionnées en fonction de leur relation avec les entités de cette couche ou classe d'entités.

La distance qui sera recherchée. Ce paramètre n'est valide que si le paramètre chevauchement_type est défini sur WITHIN_A_DISTANCE , WITHIN_A_DISTANCE_GEODESIC , WITHIN_A_DISTANCE_3D , INTERSECT , INTERSECT_3D , HAVE_THEIR_CENTER_IN ou CONTAINS .

Si l'option WITHIN_A_DISTANCE_GEODESIC est sélectionnée, utilisez une unité linéaire telle que les kilomètres ou les miles.

Spécifie comment la sélection sera appliquée à l'entrée et comment elle sera combinée avec une sélection existante. Cet outil n'inclut pas d'option pour effacer une sélection existante, utilisez l'option CLEAR_SELECTION de l'outil Sélectionner une couche par attribut pour le faire.

  • NEW_SELECTION — La sélection résultante remplacera toute sélection existante. C'est la valeur par défaut.
  • ADD_TO_SELECTION — La sélection résultante sera ajoutée à une sélection existante. Si aucune sélection n'existe, c'est la même chose que l'option NEW_SELECTION.
  • REMOVE_FROM_SELECTION — La sélection résultante sera supprimée d'une sélection existante. Si aucune sélection n'existe, l'opération n'aura aucun effet.
  • SUBSET_SELECTION — La sélection résultante sera combinée avec la sélection existante. Seuls les enregistrements communs aux deux restent sélectionnés.
  • SWITCH_SELECTION — La sélection sera commutée. Tous les enregistrements sélectionnés seront supprimés de la sélection et tous les enregistrements non sélectionnés seront ajoutés à la sélection. Les paramètres select_features et Overload_type sont ignorés lorsque cette option est sélectionnée.

Spécifie si le résultat de l'évaluation de la relation spatiale ou le résultat opposé sera utilisé. Par exemple, ce paramètre peut être utilisé pour obtenir une liste d'entités qui ne se coupent pas ou ne se trouvent pas à une distance donnée d'entités dans un autre jeu de données.

  • NOT_INVERT — Le résultat de la requête sera utilisé. C'est la valeur par défaut.
  • INVERT — L'opposé du résultat de la requête sera utilisé. Si le paramètre selection_type est utilisé, l'inversion de la sélection se produit avant qu'elle ne soit combinée avec les sélections existantes.

Sortie dérivée

Les entrées mises à jour avec les sélections appliquées.

Les noms des entrées mises à jour.

Le nombre d'enregistrements sélectionnés.

Exemple de code

Le script de fenêtre Python suivant montre comment utiliser la fonction SelectLayerByLocation en mode immédiat.

Le script autonome suivant montre comment utiliser la fonction SelectLayerByLocation dans un workflow pour extraire des entités vers une nouvelle classe d'entités en fonction de l'emplacement et d'une requête attributaire.

Le script autonome suivant montre diverses utilisations des options WITHIN_A_DISTANCE et WITHIN_A_DISTANCE_GEODESIC du paramètre chevauchement_type avec le paramètre search_distance.


Génération de maillage

Marshall Bern , Paul Plassmann , dans Handbook of Computational Geometry , 2000

1.1 Types de domaines géométriques

Nous divisons d'abord les entrées possibles en fonction de la dimension - deux ou trois. Nous distinguons quatre types de domaines planaires, comme le montre la figure 1 . Pour nous, un polygone simple comprend à la fois les limites et l'intérieur. UNE polygone avec des trous est un polygone simple moins les intérieurs de certains autres polygones simples, sa limite a plus d'un composant connecté. UNE domaine multiple est plus général encore, autorisant les frontières internes en fait, un tel domaine peut être n'importe quel graphe rectiligne plan dont la face infinie est bornée par un cycle simple. Plusieurs domaines modélisent des objets fabriqués à partir de plusieurs matériaux. Domaines courbes autoriser des côtés qui sont des courbes algébriques telles que des splines. Comme dans les trois premiers cas, appelés collectivement domaines polygonaux, les domaines courbes peuvent inclure ou non des trous et des limites internes.

Fig. 1 . Types d'entrées bidimensionnelles : (a) polygone simple, (b) polygone avec des trous, (c) domaine multiple et (d) domaine courbe.

Les entrées tridimensionnelles ont des types analogues. UNE polyèdre simple est topologiquement équivalent à une boule. UNE polyèdre général peut être plusieurs fois connecté, ce qui signifie qu'il est topologiquement équivalent à un tore solide ou à un autre solide de genre supérieur, il peut également avoir des cavités, ce qui signifie que sa frontière peut avoir plus d'un composant connecté. Nous supposons, cependant, qu'en chaque point de la frontière d'un polyèdre général, une sphère suffisamment petite renferme une pièce connexe de l'intérieur du polyèdre et une pièce connexe de son extérieur. Enfin, il y a plusieurs domaines polyédriques — des polyèdres généraux avec des limites internes — et Trois-domaines courbes dimensionnels, qui ont généralement des limites définies par des patchs de spline.

La construction et la modélisation de la géométrie des domaines sortent du cadre de ce chapitre, nous supposerons donc simplement que les domaines sont donnés dans une sorte de représentation des frontières, sans spécifier la forme exacte de cette représentation. Les géomètres informatiques supposent généralement des structures de données combinatoires exactes, telles que des listes chaînées pour des polygones simples et des polygones avec des trous, des listes de bords doublement connectées [ 103 ] ou des structures à quatre bords [ 63 ] pour des domaines multiples planaires et des structures à bords ailés [ 44 , 62 ] pour les domaines polyédriques.

En pratique, les domaines complexes sont conçus sur des systèmes de conception assistée par ordinateur (CAO). Ces systèmes utilisent des représentations de surface conçues pour le rendu visuel, puis traduisent la conception finale dans un autre format pour l'entrée dans le générateur de maillage. Le format de fichier Stereolithography Tessellation Language (STL), développé à l'origine pour le prototypage rapide de modèles solides, spécifie la limite sous la forme d'une liste de polygones de surface (généralement des triangles) et de normales de surface. Les avantages du format d'entrée STL sont qu'un modèle « étanche » peut être assuré et que la tolérance du modèle (déviation du modèle CAO) peut être spécifiée par l'utilisateur. Le format IGES (Initial Graphics Exchange Specification) permet une variété de représentations de surface, y compris des représentations d'ordre supérieur telles que les B-splines et les NURB. Peut-être en raison de sa plus grande complexité, ou de systèmes de CAO ou d'utilisateurs négligents, les fichiers IGES contiennent souvent une géométrie incorrecte (espaces ou matériau supplémentaire) aux intersections de surfaces.

Une autre approche de la traduction de format consiste à interroger directement le système de CAO avec, par exemple, des requêtes d'enceintes ponctuelles, puis à construire une nouvelle représentation basée sur les réponses à ces requêtes. Cette approche est plus avantageuse lorsque le problème de translation est difficile, comme cela peut être dans le cas de surfaces implicites (level sets de fonctions compliquées) ou de formules de géométrie solide constructive.

Quelle que soit l'approche, la traduction ou la reconstruction par requêtes, le modèle CAO doit être topologiquement correct et suffisamment précis pour permettre le maillage. Nous nous attendons à une plus grande intégration entre la modélisation solide et le maillage à l'avenir.


SDO_NN_DISTANCE

La description

Renvoie la distance d'un objet renvoyé par l'opérateur SDO_NN. Valable uniquement dans le cadre d'un appel à l'opérateur SDO_NN.

Mots-clés et paramètres

Valeur La description
numéro Spécifie un nombre qui doit être le même que le dernier paramètre passé à l'opérateur SDO_NN.
Le type de données est NUMBER.

Cet opérateur renvoie la distance d'un objet renvoyé par l'opérateur SDO_NN. Pour déterminer la proximité de deux objets géométriques, la distance la plus courte possible entre deux points quelconques sur la surface de chaque objet est utilisée.

Notes d'utilisation

SDO_NN_DISTANCE est un opérateur auxiliaire de l'opérateur SDO_NN. Il renvoie la distance entre la géométrie spécifiée et un objet voisin le plus proche. Cette distance est transmise en tant que donnée auxiliaire à l'opérateur SDO_NN. (Pour une explication de la façon dont les opérateurs peuvent utiliser les données auxiliaires, voir la section sur les données auxiliaires dans le chapitre sur les index de domaine dans le Guide du développeur de cartouches de données Oracle9i.)

Vous pouvez choisir n'importe quel nombre arbitraire pour le numéro paramètre. La seule exigence est qu'il doit correspondre au dernier paramètre de l'appel à l'opérateur SDO_NN.

Utilisez une variable de liaison pour stocker et opérer sur la valeur de distance.

L'exemple suivant recherche les deux objets de la colonne SHAPE de la table COLA_MARKETS qui sont les plus proches d'un point spécifié (10,7) et recherche la distance entre chaque objet et le point. (L'exemple utilise les définitions et les données de la section 2.1.)

Notez ce qui suit à propos de cet exemple :

1 est utilisé comme numéro paramètre pour SDO_NN_DISTANCE, et 1 est également spécifié comme dernier paramètre de SDO_NN (après 'sdo_num_res=2' ).

L'alias de la colonne dist maintient la distance entre l'objet et le point. (Pour les données géodésiques, l'unité de distance est le mètre pour les données non géodésiques, l'unité de distance est l'unité associée aux données.)

Rubriques connexes


1.7 Interrogation des données spatiales

Après avoir créé et rempli des tables spatiales, mis à jour les métadonnées spatiales et créé des index spatiaux, vous pouvez utiliser l'opérateur et les fonctions Oracle Locator pour effectuer des requêtes basées sur l'emplacement. Cette section présente quelques requêtes pour trouver les clients les plus proches d'un magasin et tous les clients à une distance spécifiée d'un magasin.

L'exemple 1-5 montre l'instruction SQL et la sortie pour trouver les trois clients les plus proches du magasin avec la valeur STORE_ID de 101. Cet exemple utilise l'opérateur SDO_NN ("les plus proches voisins").

Exemple 1-5 Recherche des clients les plus proches d'un magasin

Le conseil /*+ordered*/ est un conseil pour l'optimiseur, qui garantit que la table STORES est recherchée en premier.

L'opérateur SDO_NN renvoie la valeur SDO_NUM_RES des clients de la table CUSTOMERS qui sont les plus proches du magasin 101. Le premier argument de SDO_NN (c.cust_geo_location dans l'exemple) est la colonne à rechercher. Le deuxième argument de SDO_NN (s.storeh_geo_location dans l'exemple) est l'emplacement dont vous voulez trouver les voisins les plus proches. Aucune hypothèse ne doit être faite sur l'ordre des résultats renvoyés. Par exemple, il n'est pas garanti que la première ligne renvoyée soit le client le plus proche du magasin 101. Si deux clients ou plus sont à égale distance du magasin, l'un ou l'autre des clients peut être renvoyé lors des appels suivants à SDO_NN.

Lorsque vous utilisez le paramètre SDO_NUM_RES, aucune autre contrainte n'est utilisée dans la clause WHERE. SDO_NUM_RES ne prend en compte que la proximité. Par exemple, si vous avez ajouté un critère à la clause WHERE parce que vous vouliez que les cinq clients les plus proches résidaient à NY et que quatre des cinq clients les plus proches résidaient à NJ, la requête précédente renverrait une ligne. Ce comportement est spécifique au paramètre SDO_NUM_RES et ses résultats peuvent ne pas correspondre à ce que vous recherchez.

L'exemple 1-6 étend l'exemple 1-5 en affichant l'instruction SQL et la sortie (reformatée pour plus de lisibilité) pour trouver les trois clients les plus proches du magasin avec la valeur STORE_ID de 101, et en ordonnant les résultats par distance (en mètres) du boutique. Cet exemple utilise l'opérateur auxiliaire SDO_NN_DISTANCE.

Exemple 1-6 Recherche des clients les plus proches, classés par distance du magasin

L'indice index(c customers_sidx) est requis ici pour forcer l'utilisation de l'index spatial sur la table CUSTOMERS, en raison d'un problème dans cette version avec les requêtes spatiales qui utilisent une clause ORDER BY.

L'opérateur SDO_NN_DISTANCE est un opérateur auxiliaire de l'opérateur SDO_NN, il ne peut être utilisé qu'au sein de l'opérateur SDO_NN. L'argument de cet opérateur est un nombre qui correspond au nombre spécifié comme dernier argument de SDO_NN dans cet exemple, il est 1. Il n'y a aucune signification cachée à cet argument, il s'agit simplement d'une balise. Avec SDO_NN_DISTANCE, vous pouvez trier les résultats par distance et garantir que la première ligne renvoyée est la plus proche. Si les données que vous interrogez sont stockées sous forme de longitude et de latitude, l'unité par défaut pour SDO_NN_DISTANCE est le mètre.

L'opérateur SDO_NN a également un paramètre d'unité qui détermine l'unité de mesure renvoyée par SDO_NN_DISTANCE, mais il n'est pas utilisé dans cet exemple.

La clause de distance ORDER BY garantit que les distances sont renvoyées dans l'ordre, avec la distance la plus courte en premier.

L'exemple 1-7 montre l'instruction SQL et la sortie pour trouver tous les clients à moins de 100 miles du magasin avec la valeur STORE_ID de 101. Cet exemple utilise l'opérateur SDO_WITHIN_DISTANCE.

Exemple 1-7 Recherche de clients à moins de 100 milles d'un magasin

L'opérateur SDO_WITHIN_DISTANCE renvoie les clients de la table des clients qui se trouvent dans un rayon de 100 miles du magasin 101. Le premier paramètre de SDO_WITHIN_DISTANCE ( c.cust_geo_location dans l'exemple) est la colonne à rechercher. Le deuxième paramètre ( s.store_geo_location dans l'exemple) est l'emplacement à partir duquel vous souhaitez déterminer les distances. Aucune hypothèse ne doit être faite sur l'ordre des résultats renvoyés. Par exemple, il n'est pas garanti que la première ligne renvoyée soit le client le plus proche du magasin 101.

Le mot-clé distance spécifie la valeur de distance (100 dans cet exemple).

Le mot-clé unit spécifie l'unité de mesure du mot-clé distance. L'unité par défaut est l'unité de mesure associée aux données. Pour les données de longitude et de latitude, la valeur par défaut est mètres, mais dans cet exemple, il s'agit de miles.


Construire un graphique de séries chronologiques

Pour construire un graphique de série chronologique, nous devons examiner les deux parties de notre ensemble de données apparié. Nous commençons avec un système de coordonnées cartésiennes standard. L'axe horizontal est utilisé pour tracer les incréments de date ou d'heure, et l'axe vertical est utilisé pour tracer les valeurs de la variable que nous mesurons. Ce faisant, nous faisons correspondre à chaque point du graphique une date et une quantité mesurée. Les points sur le graphique sont généralement reliés par des lignes droites dans l'ordre dans lequel ils apparaissent.


12 réponses 12

Tout polygone (régulier ou non) peut être décrit par une équation n'impliquant que des valeurs absolues et des polynômes. Voici une petite explication sur la façon de procéder.

Disons qu'une courbe $C$ est donnée par l'équation $f$ si on a $C = <(x,y) in mathbb^2, , f(x,y) = 0>$.

Si $C_1$ et $C_2$ sont donnés par $f_1$ et $f_2$ respectivement, alors $C_1 cup C_2$ est donné par $f_1 . f_2$ et $C_1 cap C_2$ est donné par $f_1^2 + f_2^2$ (ou $|f_1| + |f_2|$). Donc, si $C_1$ et $C_2$ peuvent être décrits par une équation impliquant des valeurs absolues et des polynômes, alors $C_1 cup C_2$ et $C_1 cap C_2$ font de même.

If $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.

Voici une autre parametric equation for a regular $n$-gon with unit radius:

$eginx&=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:

$egincosleft(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)endcommencercosleft(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 Mathématique code:

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. )

Pardon. 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).