Suite

SDO_Inside équivalent dans PostGIS pour les objets 3D

SDO_Inside équivalent dans PostGIS pour les objets 3D


Je recherche une solution pour interroger un point s'il est situé à l'intérieur d'un objet 3D ou non. Si le point est situé sur la surface de la 3D, je pourrais utiliser ST_3DIntersects ou ST_3DIntersection.

Mais, si le point ne touche pas la surface, mais est situé à l'intérieur de l'extérieur, comment pourrais-je l'interroger ?

En bref, je recherche l'équivalent SDO_Inside dans PostGIS pour l'objet 3D.

ST_Contains ne prend pas en charge la 3D.

Voici un exemple d'utilisation de ST_3DIntersects. J'ai choisi un point qui sont à l'intérieur de la région. Le résultat est faux.

SELECT ST_3DIntersects(checkpoint,region) As checkpointinregion FROM (SELECT ST_GeomFromText('POINT(2604000 1205000 1500)', 2056) As checkpoint, (SELECT ST_GeomFromText('POLYHEDRALSURFACE(((2600000 1200000 1000, 2600000 1200000 2000, 2600000 1300000 2000, 2600000) 1300000 1000, 2600000 1200000 1000)), ((2600000 1200000 1000, 2600000 1300000 1000, 2700000 1300000 1000, 2700000 1200000 1000, 2600000 1200000 1000)), ((2600000 1200000 1000, 2700000 1200000 1000, 2700000 1200000 2000, 2600000 1200000 2000 , 2600000 1200000 1000)), ((2700000 1300000 1000, 2700000 1300000 2000, 2700000 1200000 2000, 2700000 1200000 1000, 2700000 1300000 1000)), ((2600000 1300000 1000, 2600000 1300000 2000, 2700000 1300000 2000, 2700000 1300000 1000, 2600000 1300000 1000)), ((2600000 1200000 2000, 2700000 1200000 2000, 2700000 1300000 2000, 2600000 1300000 2000, 2600000 1200000 2000)))', 2056)) As region) as myobjects;

Point de contrôle dans la région

f (1 rangée)


La documentation est un peu fausse. Cela fonctionne également pour les surfaces polyédriques (mais sans sfcgal, il les traite comme des surfaces non volumétriques). Je vais corriger la documentation à ce sujet. user30184 concernant votre question, il est dit Non Disjoint (pas Distinct). Disjoint est le contraire d'intersections donc c'est vrai.

Tsolmon, si vous traitez votre surface comme une zone, alors le point n'est pas sur la surface, vous avez donc raison ST_3DIntersects (sans sfcgal activé) ne peut pas vous aider.

Votre polyèdre 3D semble être un volume puisque :

SELECT ST_Dimension(ST_GeomFromText('POLYHEDRALSURFACE(((2600000 1200000 1000, 2600000 1200000 2000, 2600000 1300000 2000, 2600000 1300000 1000, 2600000 1200000 1000)), ((2600000 1200000 1000, 2600000 1300000 1000, 2700000 1300000 1000, 2700000 1200000 1000, 2600000 1200000 1000)), ((2600000 1200000 1000, 2700000 1200000 1000, 2700000 1200000 2000, 2600000 1200000 2000, 2600000 1200000 1000)), ((2700000 1300000 1000, 2700000 1300000 2000, 2700000 1200000 2000, 2700000 1200000 1000, 2700000 1300000 1000)), ((2600000 1300000 1000, 2600000 1300000 2000, 2700000 1300000 2000, 2700000 1300000 1000, 2600000 1300000 1000)), ((2600000 1200000 2000, 2700000 1200000 2000, 2700000 1300000 2000, 2600000 1300000 2000, 2600000 1200000 2000) ))', 2056) );

Renvoie 3 (il renverrait 2 s'il s'agissait d'une surface ouverte).

Donc, je m'attendrais à ce que si vous avez compilé avec le support sfcgal et que vous avez basculé votre backend pour utiliser sfcgal, le ST_3DIntersects de sfcgal entrerait en jeu et traiterait cela comme un volume.

Même en faisant ça :

SET postgis.backend = sfcgal;

et en exécutant votre test, je reçois toujours faux.

Oracle renvoie-t-il vrai pour cela? Je ne suis pas absolument sûr que SFCGAL ST_3DIntersects et ST_3DIntersection gèrent des volumes. Je pense qu'ils le font depuis que je me souviens avoir fait une vérification ponctuelle à ce sujet. Votre boîte est si fine que je ne peux pas facilement dire si ce point doit être traité comme à l'intérieur ou non.

Quoi qu'il en soit, j'ai mis un ticket de bogue pour clarifier le comportement de ST_3DIntersects. http://trac.osgeo.org/postgis/ticket/2904


Cela fonctionne si vous rendez la POLYHEDRALSURFACE solide. J'ai utilisé ST_MakeSolid sur la surface POLYHEDRALSURFACE et la requête renvoie true maintenant.


Voir la vidéo: Face Mask Detection using Python, Keras, OpenCV and MobileNet. Detect masks real-time video streams