![](/img/trans.png)
[英]How to insert SDO_GEOMETRY object variable from C# code into oracle table containing coloumn of sdo_geometry type?
[英]How to get lat and long from sdo_geometry in oracle
如何從 oracle 中的點獲得經緯度?
像這樣:
MDSYS.SDO_GEOMETRY(2001,4326,NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1,1),
MDSYS.SDO_ORDINATE_ARRAY(51.702814,32.624736))
您顯示的符號不是表示單個 2D 或 3D 點的最佳符號。 對這些點進行編碼的常見且最有效的方法是:
SDO_GEOMETRY(2001,4326,SDO_POINT_TYPE(51.702814,32.624736,NULL),NULL,NULL)
我見過的所有 GIS 工具都使用這種表示法。 您展示的那個也是有效的——它只是使用了更多的存儲空間。 但是這兩個符號在功能上是完全等效的。
使用緊湊符號,獲取單個坐標是微不足道的。 例如,考慮到 US_CITIES 在上面的緊湊符號中包含點:
select c.city, c.location.sdo_point.x longitude, c.location.sdo_point.y latitude
from us_cities c where state_abrv='CO';
CITY LONGITUDE LATITUDE
------------------------------------------ ---------- ----------
Aurora -104.72977 39.712267
Lakewood -105.11356 39.6952
Denver -104.87266 39.768035
Colorado Springs -104.7599 38.8632
4 rows selected.
從您使用的更復雜的基於數組的表示法中獲得相同的結果更加復雜。 您可以使用 SDO_UTIL.GETVERTCES 方法。 例如,假設 US_CITIES_A 包含相同的點,但采用基於數組的表示法:
select city, t.x longitude, t.y latitude
from us_cities_a, table (sdo_util.getvertices(location)) t
where state_abrv = 'CO';
CITY LONGITUDE LATITUDE
------------------------------------------ ---------- ----------
Aurora -104.72977 39.712267
Lakewood -105.11356 39.6952
Denver -104.87266 39.768035
Colorado Springs -104.7599 38.8632
4 rows selected.
我實際上發現更簡單的另一種方法是定義幾個簡單的函數來從數組中提取值:
create or replace function get_x (g sdo_geometry) return number is
begin
return g.sdo_ordinates(1);
end;
/
和
create or replace function get_y (g sdo_geometry) return number is
begin
return g.sdo_ordinates(2);
end;
/
然后使用這些函數使語法更簡單:
select city, get_x(location) longitude, get_y(location) latitude
from us_cities_a
where state_abrv = 'CO';
CITY LONGITUDE LATITUDE
------------------------------------------ ---------- ----------
Aurora -104.72977 39.712267
Lakewood -105.11356 39.6952
Denver -104.87266 39.768035
Colorado Springs -104.7599 38.8632
4 rows selected.
您可以使用 sdo_util.getvertices。 文檔中的示例
SELECT c.mkt_id, c.name, t.X, t.Y, t.id
FROM cola_markets c,
TABLE(SDO_UTIL.GETVERTICES(c.shape)) t
ORDER BY c.mkt_id, t.id;
如果您不使用別名,這將不起作用。
選擇 a.id, tx, ty from geometry_table a,table(sdo_util.getvertices(a.geometry_column)) t where a.id = 1;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.