Gets the coordinates in the database to the specified latitude and longitude distance, ___ database

Source: Internet
Author: User
Tags asin cos sin
Oracle Stored Procedures

New Project Requirements:

Combined with Baidu map, specify a location on the map to obtain the location and information of the units stored in all databases in the 1km area around this location are marked on the map. So the first write a Oracle stored procedures, purely by groping to write.

The functions needed in the background are as follows:

First, the ARC function is computed

CREATE OR REPLACE FUNCTION RAD (d number) return number
is
PI number: =3.141592625;

Begin
return  d* pi/180.0;
End;

Then compute the distance function

CREATE OR REPLACE FUNCTION getdistance (lat1 number,
                                       lng1 number,
                                       lat2 number,
                                       lng2 number) return number is
  earth_padius number: = 6378.137;
  RADLAT1 number      : = Rad (LAT1);
  RADLAT2 number      : = Rad (LAT2);
  A number            : = RADLAT1-RADLAT2;
  b number            : = Rad (lng1)-Rad (lng2);
  S number            : = 0;
Begin
  S: = 2 *
       Asin (Sqrt (Power (sin (A/2), 2) +
                 cos (RADLAT1) * cos (RADLAT2) * Power (sin (B/2), 2));
  S: = S * Earth_padius;
  S: = Round (S * 10000)/10000;
  return s;

End

Next is the stored procedure that I wrote myself:

CREATE OR REPLACE PROCEDURE distance_maintunit (p_cur out Sys_refcursor, Center_lat in number, center_lng in number)
I S
v_muids VARCHAR (MB);
V_distance NUMERIC (9,6);
BEGIN for

  L_record in (SELECT * from M_maintenaceunit)
LOOP
    Select Getdistance (L_record. Lat,l_record. LONGITUDE,CENTER_LAT,CENTER_LNG) into the v_distance from dual;
    /*dbms_output.put_line (' Distance: ' | | | v_distance);/
    IF (v_distance <=1) THEN v_muids:= v_muids
        | | L_record.muid | | ','; 
    End IF;
End LOOP;
    v_muids:= V_muids | | '-1 ';

    Dbms_output.put_line (v_muids);

    Open p_cur for ' select * M_maintenaceunit where Muid in (' | | v_muids| | ') ';

EXCEPTION when
   others THEN
       ROLLBACK;
    Dbms_output.put_line (SQLERRM);

End;

Because of the use of MyBatis, service calls are as follows:

    @Override public
    list<maintunitdto> getmaitunitbyprocedures (double lat, double LNG) {

        map<string, Object> map=new hashmap<string, object> ();

        Map.put ("LNG", LNG);
        Map.put ("lat", lat);

        try {
            geodao.getmaitunitbyprocedures (map);
        } catch (Uncategorizedsqlexception e) {
//          System.out.println (e);
            E.printstacktrace ();
        }

        @SuppressWarnings ("unchecked")
        list<maintunitdto> sitelist= (list<maintunitdto>) Map.get (" Maintunits ");
        return siteList;

    }

This is related to the article I reproduced earlier about Oracle stored procedures (how to call a stored procedure that returns a collection)

Calls in Mapper.xml:

<select id= "Getmaitunitbyprocedures" statementtype= "callable" parametertype= "Java.util.Map" >
    <![ cdata[ 
    {call Distance_maintunit (

    #{maintunits,jdbctype=cursor,mode=out,resultmap=maintunit_map,javatype =resultset},
    #{lat,jdbctype=double,mode=in},
    #{lng,jdbctype=double,mode=in}

    )}
    ]]> 
< /select>

<resultmap type= "com.cseds.geo.dto.MaintunitDto" id= "Maintunit_map" >
</resultmap >

Called in DAO:

Public list<maintunitdto> getmaintunitlist (@Param ("LNG") double LNG, @Param ("lat") double lat);

Because the first time Oracle stored procedures are written, the code only implements functionality and needs to be improved. calculate the distance between two places based on latitude and longitude in Oracle

Calculate the distance between two places based on latitude and longitude in Oracle

function to get radians:

CREATE OR REPLACE FUNCTION radian (d number) return number
is
PI number: =3.141592625;

Begin
return  d* pi/180.0;
End;

Test this function:

Select Radian (360) from dual;

A function for calculating distances according to latitude and longitude:

CREATE OR REPLACE FUNCTION getdistance (lat1 number,
                                       lng1 number,
                                       lat2 number,
                                       lng2 number) return number is
  earth_padius number: = 6378.137;
  RADLAT1 number      : = Radian (LAT1);
  RADLAT2 number      : = Radian (LAT2);
  A number            : = RADLAT1-RADLAT2;
  b number            : = Radian (lng1)-Radian (lng2);
  S number            : = 0;
Begin
  S: = 2 *
       Asin (Sqrt (Power (sin (A/2), 2) +
                 cos (RADLAT1) * cos (RADLAT2) * Power (sin (B/2), 2));
  S: = S * Earth_padius;
  S: = Round (S * 10000)/10000;
  return s;

End

example, calculate the distance according to the city name:

The latitude and longitude of Oriental Pearl Tower are: 121.506656,31.245087
The latitude and longitude of Lujiazui subway station are: 121.508883,31.243481

Sql> Select Getdistance (' 121.506656 ', ' 31.245087 ', ' 121.508883 ', ' 31.243481 ') from dual;

Output is 0.2649 km SQL Server calculates the distance between two longitude points

The algorithm used here and the Earth's radius and other data are from the network, this article is only to organize records.

The value of the Earth's radius is 6378137.0 meters from the equatorial radius, which is the 1980 International standard data.

The following is a custom function written in the database, passing in two longitude and latitude points of data, a total of 4 parameters, return the meter in the distance between two points

    CREATE FUNCTION [f_getdistance]  
    (   
    @GPSLng Decimal (12,6),  
    @GPSLat Decimal (12,6),  
    @Lng  Decimal ( 12,6),  
    @Lat Decimal (12,6)  
    )  
    RETURNS Decimal (12,4)  
    as  
    BEGIN  
       DECLARE @result Decimal (12,4  
       SELECT @result = 6378137.0*acos (SIN (@GPSLat/180*pi ()) *sin (@Lat/180*pi ()) +cos (@GPSLat/180*pi ()) *cos (@Lat/ 180*pi ()) *cos ((@GPSLng-@Lng)/180*pi ()) return  
       @result end  
    Go  
      

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.