1 votos

Pérdida de precisión al intentar seleccionar las coordenadas de latitud y logitud de un sde.ST_GEOMETRY utilizando las funciones SDE.STX() y SDE.STY()

En una geodatabase de oracle 11g enterprise estoy intentando lo siguiente:

INSERT INTO MySTATION (STATION_ID, DB_VERSION_NU, CREATED_DT, MOD_DT, SHAPE)
VALUES (1, 0, sysdate, sysdate, SDE.ST_GEOMETRY('multipoint z(1.2345 1.2345 10)', 4326));

INSERT INTO MySTATION (STATION_ID, DB_VERSION_NU, CREATED_DT, MOD_DT, SHAPE)
VALUES (2, 0, sysdate, sysdate, SDE.ST_GEOMETRY('point(1.2345 1.2345)', 4326));

SELECT STATION_ID, SDE.ST_X(SHAPE), SDE.ST_Y(SHAPE) FROM MySTATION ;

Para ambas inserciones anteriores, las coordenadas x, y devueltas con el select son 1,23450000000003 en lugar de 1,2345. ¿Hay alguna manera de leer/escribir datos en una columna ST_GEOMETRY sin perder la precisión?

Además, ¿alguien puede explicarme por qué se pierde la precisión?

3voto

M. B. Altaie Puntos 11

Cada conjunto de coordenadas almacenadas dentro de SDE.ST_GEOMETRY se almacena como una matriz comprimida de enteros de 8 bytes de longitud. La conversión de punto flotante IEEE a entero se realiza restando la referencia de coordenadas X_OFFSET (o Y_OFFSET, o Z_OFFSET, o M_OFFSET) y multiplicando por las XYUNITS (o Z_SCALE o M_SCALE). El proceso se invierte al consultar los valores de las coordenadas (dividir por la escala, añadir el desplazamiento). La diferencia entre el valor original y la representación almacenada no superará la mitad del inverso multiplicativo del factor de escala.

La ligera diferencia que se observa puede haberse introducido en la representación en coma flotante IEEE, cuando una mantisa que no es divisible uniformemente por dos provoca un redondeo al margen de los bits menos significativos, o podría deberse a la elección de una escala de referencia de coordenadas que no es una potencia de 10.

En mi instancia de ArcGIS 10.2.2, el 4326 SRID XYUNITS es de mil millones (10^9), y siguiendo su procedimiento muestra la misma precisión fuera que dentro:

SQL> SELECT srid,x_offset,y_offset,xyunits FROM sde.st_spatial_references WHERE srid = 4326;

      SRID   X_OFFSET   Y_OFFSET    XYUNITS
---------- ---------- ---------- ----------
      4326       -400       -400 1000000000

SQL> create table foo(objectid number(38), shape SDE.st_geometry);

Table created.

SQL> insert into foo values (1, SDE.ST_GEOMETRY('point(1.2345 1.2345)', 4326));

1 row created.

SQL> select SDE.ST_X(SHAPE),SDE.ST_Y(SHAPE) from foo;

SDE.ST_X(SHAPE) SDE.ST_Y(SHAPE)
--------------- ---------------
         1.2345          1.2345

Si está capturando los valores de las coordenadas en una API de 'C', Java o Python, la ligera diferencia de formato (que no es más de 3,4 nanómetros en el ecuador) puede ser un artefacto de su elección de formato (yo uso log10(scale_factor) dígitos a la derecha del decimal cuando el log10 es integral, y log10(scale_factor) + 2 cuando no lo es).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X