Линия WKT для SDO_GEOMETRY: Почему так много нулей? - PullRequest
0 голосов
/ 12 января 2020

У меня есть хорошо известная текстовая строка (WKT), которую я хочу преобразовать в SDO_GEOMETRY:

select sdo_geometry(
    'LINESTRING(675939.0 4861635.0, 675881.8 4861589.9)' ,300001)  as sdo
from dual


SDO                                                                             
--------------------------------------------------------------------------------
SDO_GEOMETRY(2002,300001,NULL,MDSYS.SDO_ELEM_INFO_ARRAY(1,2,1,NULL,NULL,NULL,NUL
L,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NUL
L,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NUL
L,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NUL
L,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NUL
L,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NUL
L,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),MDSYS.SDO_OR
DINATE_ARRAY(675939,4861635,675881.8,4861589.9,NULL,NULL,NULL,NULL,NULL,NULL,NUL
L,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NUL
L,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NUL
L,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NUL
L,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NUL
L,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NUL
L,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL))                                

1 row selected.

Почему в результате SDO_GEOMETRY так много нулей и их можно избежать?

Ответы [ 2 ]

3 голосов
/ 12 января 2020

Я взял исходный WKT и сделал это:

with data as (
select SDO_GEOMETRY(2002,300001,NULL,
           SDO_ELEM_INFO_ARRAY(1,2,1),
           SDO_ORDINATE_ARRAY(
           675939.072782156,4861635.03887627, 675881.887546735,4861589.91445772,
           675879.176511937,4861586.04156585, 675877.955649557,4861580.51231971,
           675879.89623824, 4861575.48551016, 675976.967341076,4861477.69703032,
           675982.195781809,4861474.59875878, 675988.005161569,4861472.46858959,
           675994.20185149, 4861471.30679544, 676000.979396532,4861470.91948528,
           676006.788765802,4861471.30679544, 676011.629843934,4861472.27503414,
           676150.620431142,4861517.83428384)
       ) as geom
  from dual
)
select a.geom.Get_WKT(),a.geom.sdo_srid as srid
  from data a;

Преобразование с помощью GET_WKT () завершается неудачно с этим:

Error report:
SQL Error: ORA-24323: value not allowed
ORA-06512: at "MDSYS.MDPRVT_SRID", line 143
ORA-06512: at "MDSYS.SDO_UTIL", line 2828
ORA-06512: at "MDSYS.SDO_GEOMETRY", line 36
24323. 00000 -  "value not allowed"
*Cause:    A null value or a bogus value was passed in for a mandatory
           parameter.
*Action:   Verify that all mandatory parameters are properly initialized.

Если удален SRID 300001, он работает:

with data as (
select SDO_GEOMETRY(2002,NULL,NULL,
           SDO_ELEM_INFO_ARRAY(1,2,1),
           SDO_ORDINATE_ARRAY(
           675939.072782156,4861635.03887627, 675881.887546735,4861589.91445772,
           675879.176511937,4861586.04156585, 675877.955649557,4861580.51231971,
           675879.89623824, 4861575.48551016, 675976.967341076,4861477.69703032,
           675982.195781809,4861474.59875878, 675988.005161569,4861472.46858959,
           675994.20185149, 4861471.30679544, 676000.979396532,4861470.91948528,
           676006.788765802,4861471.30679544, 676011.629843934,4861472.27503414,
           676150.620431142,4861517.83428384)
       ) as geom
  from dual
)
select sdo_geometry(a.geom.Get_WKT(),a.geom.sdo_srid) as geom
  from data a;

GEOM
--------------------------------------------------------------------------------------------------
SDO_GEOMETRY(2002,NULL,NULL,
             SDO_ELEM_INFO_ARRAY(1,2,1),
             SDO_ORDINATE_ARRAY(675939.072782156,4861635.03887627,675881.887546735,4861589.91445772,675879.176511937,4861586.04156585,675877.955649557,4861580.51231971,675879.89623824,4861575.48551016,675976.967341076,4861477.69703032,675982.195781809,4861474.59875878,675988.005161569,4861472.46858959,675994.20185149,4861471.30679544,676000.979396532,4861470.91948528,676006.788765802,4861471.30679544,676011.629843934,4861472.27503414,676150.620431142,4861517.83428384))

Зарегистрирован ли SRID с Oracle?

select * from cs_srs where srid = 300001;

no rows selected

Следуйте документации, чтобы создать запись SRID для 300001 или удалить ее из всех объектов sdo_geometry.

1 голос
/ 12 января 2020

Я пробовал это на

select banner from v$version;

BANNER
----------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
PL/SQL Release 12.1.0.1.0 - Production
CORE    12.1.0.1.0  Production
TNS for 64-bit Windows: Version 12.1.0.1.0 - Production
NLSRTL Version 12.1.0.1.0 - Production

следующим образом:

with data as (
select sdo_geometry('LINESTRING(675939.0 4861635.0, 675881.8 4861589.9)' ,300001) as sdo
from dual
)
select sdo, sdo_util.GetNumVertices(sdo) numPoints, sdo_util.getNumElem(sdo) numElements
  from data;

SDO                NUMPOINTS NUMELEMENTS
------------------ ---------- -----------
SDO_GEOMETRY(2002,300001,NULL,SDO_ELEM_INFO_ARRAY(1,2,1),SDO_ORDINATE_ARRAY(675939,4861635,675881.8,4861589.9))  2           1

Я использую SQL Developer.

Я попробовал ваш оригинальный WKT и получил правильный ответ.

...