Buen dia a todos

Alguien me puede ayudar para pasar la funcion de lineas abajo de Oracle
spatial a postgis necesito un resultado similiar en mi BD esto lo vi en
este blog

https://spatialdbadvisor.com/oracle_spatial_tips_tricks/307/computing-cardinal-directions-to-nearby-geometries



   1. CREATE OR REPLACE
   2. FUNCTION CardinalDirection(p_start_point IN sdo_geometry,
   3.                            p_end_point   IN sdo_geometry,
   4.                            p_tolerance   IN NUMBER DEFAULT 0.05,
   5.                            p_projected   IN INTEGER DEFAULT 1)
   6. RETURN varchar2 deterministic
   7. AS
   8.   c_PI CONSTANT NUMBER := acos(-1);
   9.   v_bearing NUMBER;
   10.   v_tilt    NUMBER;
   11.   v_vertex1 mdsys.vertex_type;
   12.   v_vertex2 mdsys.vertex_type;
   13.   FUNCTION ST_Azimuth(p_dE1 IN NUMBER, p_dN1 IN NUMBER,
   14.                       p_dE2 IN NUMBER, p_dN2 IN NUMBER)
   15.   RETURN NUMBER
   16.   IS
   17.       dBearing NUMBER;
   18.       dEast    NUMBER;
   19.       dNorth   NUMBER;
   20.   BEGIN
   21.       IF (p_dE1 IS NULL OR p_dN1 IS NULL OR
   22.           p_dE2 IS NULL OR p_dE2 IS NULL ) THEN
   23.          RETURN NULL;
   24.       END IF;
   25.       IF ( (p_dE1 = p_dE2) AND (p_dN1 = p_dN2) ) THEN
   26.          RETURN NULL;
   27.       END IF;
   28.       dEast  := p_dE2 - p_dE1;
   29.       dNorth := p_dN2 - p_dN1;
   30.       IF ( dEast = 0 ) THEN
   31.           dBearing := CASE WHEN ( dNorth < 0 )
   32.                            THEN c_PI
   33.                            ELSE 0
   34.                        END;
   35.       ELSE
   36.           dBearing := -aTan(dNorth / dEast) + c_PI / 2;
   37.       END IF;
   38.       RETURN CASE WHEN ( dEast < 0 )
   39.                   THEN dBearing + c_PI
   40.                   ELSE dBearing
   41.               END;
   42.   END ST_Azimuth;
   43. BEGIN
   44.   IF (p_start_point IS NULL OR p_end_point IS NULL) THEN
   45.      RETURN NULL;
   46.   END IF;
   47.   -- If Geodetic....
   48.   IF (NVL(ABS(p_projected),1) = 0 ) THEN
   49.     SDO_UTIL.BEARING_TILT_FOR_POINTS(
   50.              p_start_point,
   51.              p_end_point,
   52.              p_tolerance,v_bearing,v_tilt);
   53.   ELSE
   54.     v_vertex1 := sdo_util.getVertices(p_start_point)(1);
   55.     v_vertex2 := sdo_util.getVertices(p_end_point)(1);
   56.     v_bearing := ST_Azimuth(v_vertex1.X, v_vertex1.Y,
   57.                             v_vertex2.X, v_vertex2.Y);
   58.   END IF;
   59.   v_bearing := round(v_bearing * (180.0 / acos(-1)),2);
   60.   RETURN CASE
   61.          WHEN v_bearing IS NULL THEN 'NULL'
   62.          WHEN /* Cardinal Point 0     */ v_bearing BETWEEN 348.75 AND
      0.0
   63.                                       OR v_bearing BETWEEN   0.0  AND
     11.25 THEN 'N'
   64.          WHEN /* Cardinal Point 22.5  */ v_bearing BETWEEN  11.25 AND
     33.75 THEN 'NNE'
   65.          WHEN /* Cardinal Point 45    */ v_bearing BETWEEN  33.75 AND
     56.25 THEN 'NE'
   66.          WHEN /* Cardinal Point 67.5  */ v_bearing BETWEEN  56.25 AND
     78.75 THEN 'ENE'
   67.          WHEN /* Cardinal Point 90    */ v_bearing BETWEEN  78.75 AND
    101.25 THEN 'E'
   68.          WHEN /* Cardinal Point 112.5 */ v_bearing BETWEEN 101.25 AND
    123.75 THEN 'ESE'
   69.          WHEN /* Cardinal Point 135   */ v_bearing BETWEEN 123.75 AND
    146.25 THEN 'SE'
   70.          WHEN /* Cardinal Point 157.5 */ v_bearing BETWEEN 146.25 AND
    168.75 THEN 'SSE'
   71.          WHEN /* Cardinal Point 180   */ v_bearing BETWEEN 168.75 AND
    191.25 THEN 'S'
   72.          WHEN /* Cardinal Point 202.5 */ v_bearing BETWEEN 191.25 AND
    213.75 THEN 'SSW'
   73.          WHEN /* Cardinal Point 225   */ v_bearing BETWEEN 213.75 AND
    236.25 THEN 'SW'
   74.          WHEN /* Cardinal Point 247.5 */ v_bearing BETWEEN 236.25 AND
    258.75 THEN 'WSW'
   75.          WHEN /* Cardinal Point 270   */ v_bearing BETWEEN 258.75 AND
    281.25 THEN 'W'
   76.          WHEN /* Cardinal Point 292.5 */ v_bearing BETWEEN 281.25 AND
    303.75 THEN 'WNW'
   77.          WHEN /* Cardinal Point 315   */ v_bearing BETWEEN 303.75 AND
    326.25 THEN 'NW'
   78.          WHEN /* Cardinal Point 337.5 */ v_bearing BETWEEN 326.25 AND
    348.75 THEN 'NNW'
   79.          ELSE to_char(v_bearing)
   80.        END;
   81. END CardinalDirection;
   82. /
   83. SHOW errors




-- 
José Mercedes Venegas Acevedo
cel Mov RPC 964185205

Reply via email to