Daha çox

Oracle sql developerində iki dəyişəndən xüsusi SRID ilə bir nöqtə yaradın


Cədvəldəki iki dəyişəndən (LAT, LON) istifadə edərək və istədiyiniz SRID-i təyin etməklə (posgisdə) tez-tez nöqtələr yaratdım. İndi Oracle SQL geliştiricisi ilə oxşar bir şey etməyə çalışıram, ancaq geoserverdə bir təbəqə kimi göstərməyə çalışarkən səhvlər alıram. Çalışdığım budur:

SEÇKİN KİMLİK, CO_NAME, ADJUSTMENT_FACTOR, MDSYS.SDO_GEOMETRY (boş, 2100, SDO_POINT_TYPE (24.004632439599,24.004632439599, NULL), NULL, NULL) MƏRKƏZİ OFFİKLƏRDƏN SEÇİN

LAT və LNG dəyişənlərinin əvəzinə iki təsadüfi rəqəm qoymuşam. Üstəlik, yaradılan həndəsəni oxunaqlı formatda necə görmək mümkün olduğunu soruşmaq istəyirəm. Bənzər bir şey: postgisin ST_ASTEXT.

Redaktə edin

Bu sorğunu yazdım:

SELECT ID, CO_NAME, ADJUSTMENT_FACTOR, PORT_LOCATION, VDSL_ENABLED, SDO_UTIL.TO_WKTGEOMETRY (SDO_CS.TRANSFORM (SDO_GEOMETRY (2100,4326, SDO_POINT_TYPE (CAST (REPLACE), REPLACE, REPLACE " (CENTRAL_OFFICES.LNG, '.', ',') DƏZƏN AS), NULL), NULL, NULL), 2100)) AS geom FROM CENTRAL_OFFICES

Bu, istənilən SRID-də bir nöqtə həndəsəsi olan bir cədvəli qaytarır (2100).


CENTRAL_OFFICES cədvəlinin belə göründüyünü düşünün (sadələşdirilmiş).

cədvəl central_offices yaratmaq (id nömrəsi əsas düymə, lat nömrəsi, lng nömrəsi);

Nümunə məlumatlarla dolduraq:

central_offices (id, lat, lng) dəyərlərinə daxil edin (1, 39.018483, 22.9983436); törətmək;

İstədiyinizə çatmaq üçün seçim belədir (WGS84 aka GPS koordinatlarında lat və uzunun ondalık dərəcə olduğunu düşünsək)

seçin id, sdo_cs.transform (sdo_geometry (2001, 4326, sdo_point_type (lng, lat, null), null, null), 2100) .get_wkt () from central_offices;

Bunun OGC WKT-də nəticələr əldə etmək üçün get_wkt () metodundan istifadə etdiyinə diqqət yetirin (funksiya SDO_UTIL.TO_WKTGEOMETRY eyni şeyi edir).

Vacibdir: koordinatların həmişə saxlanıldığına diqqət yetirin (X, Y) geodeziya koordinatları üçün nəzərdə tutulan sifariş (Boylam, en) - əvvəlcə yazıldığı kimi deyil (enlik, Boylam).

Nümunənizdə koordinatların bir nöqtə ilə sətir kimi, onlu ayırıcı kimi saxlanıldığı görünür - "39.018483" kimi bir şey. Bu sətirləri birbaşa SDO_GEOMETRY qurucusunda istifadə edə bilərsiniz: sətirdən nömrəyə çevrilmə avtomatik olaraq baş verir.

AMMA: bu bağlamda olur yerli iclasda istifadə edirsən. 2100 bir Yunan sistemi olduğundan, Yunanıstandasınız deyə düşünürəm və buna görə də onlu ayırıcının vergül olduğu bir Yunan dilini istifadə edin. Yuxarıdakı sətri bir ədədə çevirməyə cəhd etsəniz, aşağıdakı səhvi alacaqsınız:

SQL> ikidən to_number ('39 .018483 ') seçin; 1-ci sətirdə ikili * ERROR-dan to_number ('39 .018483 ') seçin: ORA-01722: μη αποδεκτός αριθμός

'' Əvəz edə bilərsən. ',' ilə etdiyiniz kimi, lakin daha yaxşı bir yol yalnız verilənlər bazasına bir nöqtəni ondalık ayırıcı kimi istifadə etməsini söyləməkdir:

SQL> sessiyanı dəyişdirmək nls_numeric_characters = '.,'; Sessiya dəyişdirildi. SQL> ikidən to_number ('39 .018483 ') seçin; TO_NUMBER ('39 .018483 ') ---------------------- 39.018483 1 sıra seçildi.

Bunu koordinatlar üçün simlərdən istifadə edən CENTRAL_OFFICES cədvəli ilə sınayaq:

cədvəl central_offices yaratmaq (id nömrəsi əsas düymə, lat varchar2 (20), lng varchar2 (20)); central_offices (id, lat, lng) dəyərlərinə daxil edin (1, '39 .018483 ', '22 .9983436'); törətmək;

Ayırıcı ayarı olmadan sorğu uğursuz olacaq:

seçin id, sdo_cs.transform (sdo_geometry (2001, 4326, sdo_point_type (lng, lat, null), null, null), 2100) .get_wkt () from central_offices; XATA: ORA-01722: μη αποδεκτός αριθμός

Ayarla yaxşı işləyir:

sessiyanı dəyişdirmək nls_numeric_characters = '.,'; seçin id, sdo_cs.transform (sdo_geometry (2001, 4326, sdo_point_type (lng, lat, null), null, null), 2100) .get_wkt () from central_offices; ID SDO_CS.TRANSFORM (SDO_GEOMETRY (2001,4326, SDO_POINT_TYPE (LNG, LAT, NULL), NULL, NULL) ---- ----------------------) -------------------------------------------------- ------- 1 Nöqtə (413136.397473566 4319017.56676377)

Bu sorğunu yazdım:

SELECT ID, CO_NAME, ADJUSTMENT_FACTOR, PORT_LOCATION, VDSL_ENABLED, SDO_UTIL.TO_WKTGEOMETRY (SDO_CS.TRANSFORM (SDO_GEOMETRY (2001,4326, SDO_POINT_TYPE (CAST (CAST), REPLACE, REPLACE, REPLACE ") (CENTRAL_OFFICES.LAT, '.', ',') FLOAT AS), NULL), NULL, NULL), 2100)) AS geom FROM CENTRAL_OFFICES

Bu, istənilən SRID-də bir nöqtə həndəsəsi olan bir cədvəli qaytarır (2100).