Suite

Générer dans oracle sql developer un point avec un SRID spécifique à partir de deux variables


J'ai créé assez souvent (in posgis) des points en utilisant deux variables de la table (LAT, LON) et en définissant le SRID souhaité. J'essaie de faire quelque chose de similaire maintenant avec le développeur Oracle SQL, mais j'obtiens toujours des erreurs lorsque j'essaie de l'afficher en tant que couche dans le géoserveur. C'est ce que j'essaye :

SELECT ID, CO_NAME, ADJUSTMENT_FACTOR, MDSYS.SDO_GEOMETRY(null,2100,SDO_POINT_TYPE(24.004632439599,24.004632439599,NULL),NULL,NULL) AS GEOM FROM CENTRAL_OFFICES

A la place des variables LAT et LNG je viens de mettre deux nombres aléatoires. De plus, je veux demander comment est-il possible de visualiser dans un format lisible la géométrie générée. Quelque chose comme : ST_ASTEXT de postgis.

ÉDITER

J'ai écrit cette requête :

SELECT ID, CO_NAME, ADJUSTMENT_FACTOR, PORT_LOCATION, VDSL_ENABLED, SDO_UTIL.TO_WKTGEOMETRY(SDO_CS.TRANSFORM( SDO_GEOMETRY(2100,4326, SDO_POINT_TYPE(CAST(REPLACE(CENTRAL_OFFICES.LAT, ','.'), FLO (CENTRAL_OFFICES.LNG, '.', ',') AS FLOAT),NULL),NULL,NULL),2100)) AS geom FROM CENTRAL_OFFICES

Cela renvoie une table avec une géométrie de point dans le SRID souhaité (2100).


Supposons que la table CENTRAL_OFFICES ressemble à ceci (simplifié).

créer la table central_offices ( clé primaire du numéro d'identification, numéro lat, numéro lng );

Remplissons-le avec des exemples de données :

insérer dans central_offices (id, lat, lng) les valeurs (1, 39.018483, 22.9983436); s'engager;

La sélection pour obtenir ce que vous voulez est alors comme ceci (en supposant que lat et long sont des degrés décimaux dans WGS84 aka coordonnées GPS)

select id, sdo_cs.transform ( sdo_geometry (2001, 4326, sdo_point_type(lng, lat, null), null,null), 2100 ).get_wkt() de central_offices ;

Notez que cela utilise la méthode get_wkt() pour obtenir les résultats dans OGC WKT (la fonction SDO_UTIL.TO_WKTGEOMETRY fait de même).

IMPORTANT: notez que les coordonnées sont toujours stockées dans (X, Y) ordre, qui pour les coordonnées géodésiques signifie (longitude latitude) - pas (latitude,longitude) comme écrit à l'origine.

Dans votre exemple, il semble que les coordonnées soient stockées sous forme de chaînes avec un point comme séparateur décimal - quelque chose comme "39.018483". Vous pouvez utiliser ces chaînes directement dans le constructeur SDO_GEOMETRY : la conversion de chaîne en nombre se fait automatiquement.

MAIS: cela se passe dans le contexte de la lieu vous utilisez dans votre session. Étant donné que 2100 est un système grec, je suppose que vous êtes en Grèce et que vous utilisez donc un paramètre régional grec où le séparateur décimal est une virgule. Si vous essayez de convertir la chaîne ci-dessus en nombre, vous obtiendrez l'erreur suivante :

SQL> sélectionnez to_number('39.018483') à partir de dual ; select to_number('39.018483') from dual * ERROR at line 1: ORA-01722: μη αποδεκτός αριθμός

Vous pouvez remplacer '.' avec ',' comme vous le faites, mais une meilleure façon est simplement de dire à la base de données d'utiliser un point comme séparateur décimal :

SQL> alter session set nls_numeric_characters = '.,'; Séance modifiée. SQL> sélectionnez to_number('39.018483') à partir de dual ; TO_NUMBER('39.018483') ---------------------- 39.018483 1 ligne sélectionnée.

Essayons cela avec la table CENTRAL_OFFICES qui utilise des chaînes pour les coordonnées :

créer la table central_offices ( clé primaire du numéro d'identification, lat varchar2(20), lng varchar2(20) ); insérer dans central_offices (id, lat, lng) les valeurs (1, '39.018483', '22.9983436'); s'engager;

Sans le paramètre de séparateur, la requête échouera :

select id, sdo_cs.transform ( sdo_geometry (2001, 4326, sdo_point_type(lng, lat, null), null,null), 2100 ).get_wkt() de central_offices ; ERREUR : ORA-01722 : αποδεκτός αριθμός

Avec le réglage, ça marche bien :

alter session set nls_numeric_characters = '.,'; select id, sdo_cs.transform ( sdo_geometry (2001, 4326, sdo_point_type(lng, lat, null), null,null), 2100 ).get_wkt() de central_offices ; ID SDO_CS.TRANSFORM(SDO_GEOMETRY(2001,4326,SDO_POINT_TYPE(LNG,LAT,NULL),NULL,NULL) ---- ---------------------- -------------------------------------------------- ------- 1 POINT (413136.397473566 4319017.56676377)

J'ai écrit cette requête :

SÉLECTIONNEZ L'ID, CO_NAME, ADJUSTMENT_FACTOR, PORT_LOCATION, VDSL_ENABLED, SDO_UTIL.TO_WKTGEOMETRY(SDO_CS.TRANSFORM( SDO_GEOMETRY(2001,4326, SDO_POINT_TYPE(CAST(REPLACE(CENTRAL_OFFICES.LNG), ','.', ', FLO (CENTRAL_OFFICES.LAT, '.', ',') AS FLOAT),NULL),NULL,NULL),2100)) AS geom FROM CENTRAL_OFFICES

Cela renvoie une table avec une géométrie de point dans le SRID souhaité (2100).


Voir la vidéo: Luo NYATITI the Traditional Music and Dance part 2 (Octobre 2021).