У меня есть хорошо известная текстовая строка (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 ответа
Я взял оригинальный 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.
Я попробовал это на
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 и получил правильный ответ.