Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 从圆心和半径创建SDO_几何多边形圆_Oracle_Oracle Spatial - Fatal编程技术网

Oracle 从圆心和半径创建SDO_几何多边形圆

Oracle 从圆心和半径创建SDO_几何多边形圆,oracle,oracle-spatial,Oracle,Oracle Spatial,我有圆心和半径的坐标,单位是米。 如何创建SDO_几何体类型的圆,因为它至少需要圆的三个点,如本例中所示 INSERT INTO cola_markets VALUES( 4, 'cola_d', SDO_GEOMETRY( 2003, -- two-dimensional polygon NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,4), -- one circle SDO_ORDINATE_ARRAY(8

我有圆心和半径的坐标,单位是米。 如何创建SDO_几何体类型的圆,因为它至少需要圆的三个点,如本例中所示

INSERT INTO cola_markets VALUES(
  4,
  'cola_d',
  SDO_GEOMETRY(
    2003,  -- two-dimensional polygon
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1,1003,4), -- one circle
    SDO_ORDINATE_ARRAY(8,7, 10,9, 8,11)
  )
);

只有在投影数据的情况下,才能使用三个点表示圆。如果您的数据是大地测量的(即,您的中心位于经度/纬度),则表示圆的唯一方法是将其加密。您可以使用
SDO\u UTIL.CIRCLE\u POLYGON()函数执行此操作

例如:

SQL> select sdo_util.circle_polygon (sdo_geometry(2001, 4326, sdo_point_type(-74.064962, 40.7113, null), null, null),500,1) from dual;

SDO_UTIL.CIRCLE_POLYGON(SDO_GEOMETRY(2001,4326,SDO_POINT_TYPE(-74.064962,40.711
-------------------------------------------------------------------------------
SDO_GEOMETRY(2003, 4326, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARRAY(-74.064962, 40.7067975, -74.06422, 40.706833, -74.063491, 40.7069389, -74.062784, 40.7071136, -74.062112, 40.7073544, -74.061484, 40.7076573, -74.060912, 40.7080177, -74.060403, 40.7084299, -74.059966, 40.7088873, -74.059608, 40.7093828, -74.059335, 40.7099085, -74.05915, 40.7104562, -74.059057, 40.7110171, -74.059057, 40.7115826, -74.05915, 40.7121435, -74.059334, 40.7126912, -74.059608, 40.713217, -74.059966, 40.7137125, -74.060403, 40.7141699, -74.060911, 40.7145821, -74.061484, 40.7149426, -74.062111, 40.7152456, -74.062784, 40.7154863, -74.06349, 40.7156611, -74.06422, 40.715767, -74.064962, 40.7158025, -74.065704, 40.715767, -74.066434, 40.7156611, -74.06714, 40.7154863, -74.067813, 40.7152456, -74.06844, 40.7149426, -74.069013, 40.7145821, -74.069521, 40.7141699, -74.069958, 40.7137125, -74.070316, 40.713217, -74.07059, 40.7126912, -74.070774, 40.7121435, -74.070867, 40.7115826, -74.070867, 40.7110171, -74.070774, 40.7104562, -74.070589, 40.7099085, -74.070316, 40.7093828, -74.069958, 40.7088873, -74.069521, 40.7084299, -74.069012, 40.7080177, -74.06844, 40.7076573, -74.067812, 40.7073544, -74.06714, 40.7071136, -74.066433, 40.7069389, -74.065704, 40.706833, -74.064962, 40.7067975))

1 row selected. 
SQL> select circle (sdo_geometry(2001, 3857, sdo_point_type(-8244873.9, 4969851.29, null), null, null), 500) from dual;

CIRCLE(SDO_GEOMETRY(2001,3857,SDO_POINT_TYPE(-8244873.9,4969851.29,NULL),NULL,N
-------------------------------------------------------------------------------
SDO_GEOMETRY(2003, 3857, NULL, SDO_ELEM_INFO_ARRAY(1,1003, 4), SDO_ORDINATE_ARRAY(-8245373.9, 4969851.29, -8244873.9, 4970351.29, -8244373.9, 4969851.29))
如果数据是投影的,则使用以下函数生成一个3点圆:

create or replace function circle (
  center sdo_geometry,
  radius number
)
return sdo_geometry
is
  x number;
  y number;
begin
  x := center.sdo_point.x;
  y := center.sdo_point.y;
  return sdo_geometry (
     2003, center.sdo_srid, null,
     sdo_elem_info_array(1, 1003, 4),
     sdo_ordinate_array (
       x-radius, y,
       x, y+radius,
       x+radius, y
    )
  );
end;
/
例如:

SQL> select sdo_util.circle_polygon (sdo_geometry(2001, 4326, sdo_point_type(-74.064962, 40.7113, null), null, null),500,1) from dual;

SDO_UTIL.CIRCLE_POLYGON(SDO_GEOMETRY(2001,4326,SDO_POINT_TYPE(-74.064962,40.711
-------------------------------------------------------------------------------
SDO_GEOMETRY(2003, 4326, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARRAY(-74.064962, 40.7067975, -74.06422, 40.706833, -74.063491, 40.7069389, -74.062784, 40.7071136, -74.062112, 40.7073544, -74.061484, 40.7076573, -74.060912, 40.7080177, -74.060403, 40.7084299, -74.059966, 40.7088873, -74.059608, 40.7093828, -74.059335, 40.7099085, -74.05915, 40.7104562, -74.059057, 40.7110171, -74.059057, 40.7115826, -74.05915, 40.7121435, -74.059334, 40.7126912, -74.059608, 40.713217, -74.059966, 40.7137125, -74.060403, 40.7141699, -74.060911, 40.7145821, -74.061484, 40.7149426, -74.062111, 40.7152456, -74.062784, 40.7154863, -74.06349, 40.7156611, -74.06422, 40.715767, -74.064962, 40.7158025, -74.065704, 40.715767, -74.066434, 40.7156611, -74.06714, 40.7154863, -74.067813, 40.7152456, -74.06844, 40.7149426, -74.069013, 40.7145821, -74.069521, 40.7141699, -74.069958, 40.7137125, -74.070316, 40.713217, -74.07059, 40.7126912, -74.070774, 40.7121435, -74.070867, 40.7115826, -74.070867, 40.7110171, -74.070774, 40.7104562, -74.070589, 40.7099085, -74.070316, 40.7093828, -74.069958, 40.7088873, -74.069521, 40.7084299, -74.069012, 40.7080177, -74.06844, 40.7076573, -74.067812, 40.7073544, -74.06714, 40.7071136, -74.066433, 40.7069389, -74.065704, 40.706833, -74.064962, 40.7067975))

1 row selected. 
SQL> select circle (sdo_geometry(2001, 3857, sdo_point_type(-8244873.9, 4969851.29, null), null, null), 500) from dual;

CIRCLE(SDO_GEOMETRY(2001,3857,SDO_POINT_TYPE(-8244873.9,4969851.29,NULL),NULL,N
-------------------------------------------------------------------------------
SDO_GEOMETRY(2003, 3857, NULL, SDO_ELEM_INFO_ARRAY(1,1003, 4), SDO_ORDINATE_ARRAY(-8245373.9, 4969851.29, -8244873.9, 4970351.29, -8244373.9, 4969851.29))

选择1行。

如果给定了中心(x,y)和半径r,则您可以简单地按如下方式形成3个点:
(x-r,y)、(x,y+r)、(x+r,y)
并在SDO坐标阵列中使用它们。在oracle文档中提到,它们需要3个非共线点,位于圆的圆周上。上面提到的点,给出这样的点。

使用这个问题的答案中给出的公式,我可以这样得到3点:点1=x-(180/pi)*(半径/6378137),y,点2=x,y+(180/pi)*(半径/6378137)/cos(x),点3=x+(180/pi)*(半径/6378137),y,就像我说的,三点圆和圆弧只允许用于投影坐标。不允许在大地坐标(即lat/long)中使用。如果您这样做,验证函数将拒绝它,并且如果您想使用它,将导致各种错误。此限制的一个应用是,当您在大地坐标系中围绕形状生成缓冲区时,所有圆边将自动加密。当您围绕一个点生成缓冲区时,也会发生这种情况:您得到一个加密的圆(就像
SDO\u UTIL.circle\u POLYGON()
products)。