2014-05-09 4 views
0

J'ai mesuré une zone de terrain (tracé) et capturé les coordonnées GPS de ses 4 coins en utilisant un GPS. Maintenant, j'ai deux questionsOracle: comment vérifier si deux polygones se chevauchent ou non

  1. Comment sauvegarder ceci est Oracle Database. (it seems answer of first point. is it?)
  2. Après l'avoir sauvegardé, je veux vérifier si un tracé chevauche (partiellement ou complètement) vers un autre tracé existant dans la base de données ou non?
+0

Veuillez lire la documentation Oracle Spatial et essayer. http://docs.oracle.com/cd/E11882_01/appdev.112/e11830/toc.htm – Rene

+0

1 - Oui. 2 - Essayez sdo_geom.sdo_relate (voir la documentation pour plus de détails). – Ben

Répondre

1

J'ai reçu des commentaires très utiles de René et Ben. et sur la base que j'ai résolu mes problèmes ..

--------------------------- CREATING TABLE -------------------------- 

create table tbl_location(
id int constraint id_pk primary key, 
unit_code char(2) not null, 
plot_id number(15) not null, 
season_cntrl number(2), 
Ryot_code varchar2(9), 
share_or_perc_val number(2) not null, 
plot_no varchar2(18) not null, 
total_area decimal(5,5), 
a1 varchar2(15), 
b1 varchar2(15), 
a2 varchar2(15), 
b2 varchar2(15), 
a3 varchar2(15), 
b3 varchar2(15), 
a4 varchar2(15), 
b4 varchar2(15), 
location sdo_geometry 
); 

--------------------------- CREATING SEQUENCE FOR ID --------------------------- 
create sequence location_sequence 
start with 1 
increment by 1 
nocache 
nocycle; 
/


--- createing a trigger for auto-incrementation of ID ------------------------------ 
Create or replace trigger id_increment 
before insert on tbl_location 
for each row 
begin 
select location_sequence.nextval into :new.id from dual; 
end; 

pour la colonne emplacement données

update tbl_location set location = SDO_GEOMETRY(2003,NULL,NULL,SDO_ELEM_INFO_ARRAY(1,1003,1),SDO_ORDINATE_ARRAY('80.16181','27.8682866666666','80.1616516666666','27.8681266666666','80.161215','27.867975','80.1613933333333','27.8685933333333','80.16181','27.8682866666666')) where id =2; 
update tbl_location set location = SDO_GEOMETRY(2003,NULL,NULL,SDO_ELEM_INFO_ARRAY(1,1003,1),SDO_ORDINATE_ARRAY('80.1538483333333','27.88376','80.15354','27.8841166666666','80.1529499999999','27.8834933333333','80.1532','27.8832566666666','80.1538483333333','27.88376')) where id =3; 

Pour obtenir des parcelles (polygone) qui se croisent les uns les autres

select a.id as id1, b.id as id2,a.unit_code, a.ryot_code,a.share_or_perc_val, 
sdo_geom.sdo_intersection(a.location, b.location, 0.005) location, 
a.plot_no, a.total_area 
from tbl_location a 
Inner Join tbl_location b on 
a.id < b.id and sdo_geom.sdo_intersection(a.location, b.location,0.005) is not null ; 
0

bien , vous pouvez simplement appeler le SDO_GEOM.SDO_AREA() sur le résultat de la fonction SDO_GEOM.SDO_INTERSECTION(). Cependant, cela ne vous donnera pas de résultats significatifs: vos géométries sont (semble-t-il) en coordonnées géodésiques WGS84 (c'est-à-dire en degrés décimaux), mais vous les chargez sans spécifier de système de coordonnées. En conséquence, n'importe quel calcul de zone retournera un résultat en degrés carrés, un résultat sans signification et inutilisable.

Vous devez charger vos deux géométries comme ceci:

update tbl_location set location = SDO_GEOMETRY(2003,4326,NULL,SDO_ELEM_INFO_ARRAY(1,1003,1),SDO_ORDINATE_ARRAY(80.16181,27.8682866666666,80.1616516666666,27.8681266666666,80.161215,27.867975,80.1613933333333,27.8685933333333,80.16181,27.8682866666666)) where id =2; 
update tbl_location set location = SDO_GEOMETRY(2003,4326,NULL,SDO_ELEM_INFO_ARRAY(1,1003,1),SDO_ORDINATE_ARRAY(80.1538483333333,27.88376,80.15354,27.8841166666666,80.1529499999999,27.8834933333333,80.1532,27.8832566666666,80.1538483333333,27.88376)) where id =3; 

Enfin, votre approche ne fonctionne que parce que vous jouez uniquement avec deux géométries. Dès que vous commencez à traiter des données réelles, la requête se comportera très mal: il faut calculer l'intersection entre chaque forme et toutes les autres. Pour un ensemble de 10 000 formes, cela signifie 100 000 000 de calculs (et en fait 99 990 000 puisque vous évitez de couper une géométrie avec elle-même).

L'approche appropriée consiste à détecter les formes qui se croisent en tirant parti de l'indexation spatiale. L'approche appropriée consiste à utiliser la procédure SDO_JOIN() pour cela.

Questions connexes