середа, 23 березня 2016 р.

Работаем с геоданными в Oracle Spatial

Задача: выявить неправильно проставленные КОАТУУ относительно координат.
(к примеру село слилось с городом)

Дано: таблица MOB_STA с перечнем радиостанций, их координатами в полях
longitude и latitude (с типом NUMBER) и с полем CODE_EDRPU - в котором
проставлен КОАТУУ населённого пункта в  границах которого установлена радиостанция.

вторая таблица SETTLEMENT_REGION c перечнем населённых пунктов, КОАТУ и
координатами в поле GEOMETRY, тип поля GEOMETRY. Таблица являеться эталонной.
Эта таблица создалась из ship файла, программы MapInfo, ship файл мы загрузили в Oracle с помощью программы MapBuilder, 
http://www.oracle.com/technetwork/middleware/mapviewer/downloads/index-100641.html


Решение: найдём вхождение координат радиостанций из табл. MOB_STA в границы населённых
пунктов из табл. SETTLEMENT_REGION и сравним КОАТУУ.

== В таблицу MOB_STA нужно добавить поле и назовём его- GEOMETRY, типом поля выберем GEOMETRY, это поле мы потом заполним данными из полей longitude и latitude.

Поехали:

1. Регистрируем в базе таблицу и поле (гео) иначе индекс не создастса

insert into user_sdo_geom_metadata values (
  'MOB_STA',
  'GEOMETRY',
   sdo_dim_array(
   mdsys.sdo_dim_element('X', -180, 180, 0.05),
   mdsys.sdo_dim_element('Y', -90, 90, 0.05)), 8307);


2. Трансформируем кооздинаты в точку и в тип геометрия и заполняем  поле GEOMETRY

declare
begin
for c in(select t.* from MOB_STA t)      ----
loop
update MOB_STA m set m.geometry = sdo_geometry(2001, 8307, sdo_point_type(c.longitude ,c.latitude, null),null,null)
 where m.id = c.id;
end loop;
end;


3. Создаём индекс

create index i_MOB_STA_indx on MOB_STA(geometry) indextype is mdsys.spatial_index;

5. Теперь можно делать выборку

select b.koatuu, b.name_obl, b.join_,b.name_rus,b.codename, c.code, c.address, c.owner_name
   from
  table(sdo_join('settlement_region','GEOMETRY','mob_sta','GEOMETRY','mask=ANYINTERACT')) a,
           settlement_region b,
           mob_sta           c
   where
         a.rowid1 = b.rowid
   and a.rowid2 = c.rowid
   and b.name_obl = 'Житомирська область'
   and b.koatuu <> c.code





Подробно описаны функци Spatial
http://www.oraclegis.com/blog/?p=2622

Немає коментарів:

Дописати коментар