最新消息: 新版网站上线了!!!

mysql利用坐标查询邮编

  1. DELIMITER $$   
  2.    
  3. DROP   FUNCTION  IF EXISTS `GetDistance`$$   
  4.    
  5. CREATE   FUNCTION  `GetDistance`(   
  6.  lat1  numeric (9,6),   
  7.  lon1  numeric (9,6),   
  8.  lat2  numeric (9,6),   
  9.  lon2  numeric (9,6)   
  10. )  RETURNS   decimal (10,5)   
  11. BEGIN  
  12.   DECLARE  x  decimal (20,10);   
  13.   DECLARE  pi  decimal (21,20);   
  14.   SET  pi = 3.14159265358979323846;   
  15.   SET  x = sin( lat1 * pi/180 ) * sin( lat2 * pi/180  ) + cos(   
  16.  lat1 *pi/180 ) * cos( lat2 * pi/180 ) * cos(  abs ( (lon2 * pi/180) -   
  17.  (lon1 *pi/180) ) );   
  18.   SET  x = atan( ( sqrt( 1- power( x, 2 ) ) ) / x );   
  19.   RETURN  ( 1.852 * 60.0 * ((x/pi)*180) ) / 1.609344;   
  20. END $$   
  21.    
  22. DELIMITER ; 

另一个函数

 

  1. DELIMITER $$   
  2.    
  3. DROP   PROCEDURE  IF EXISTS `GetNearbyZipCodes`$$   
  4.    
  5. CREATE   PROCEDURE  `GetNearbyZipCodes`(   
  6.     zipbase  varchar (6),   
  7.     range  numeric (15)   
  8. )   
  9. BEGIN  
  10. DECLARE  lat1  decimal (5,2);   
  11. DECLARE  long1  decimal (5,2);   
  12. DECLARE  rangeFactor  decimal (7,6);   
  13. SET  rangeFactor = 0.014457;   
  14. SELECT  latitude,longitude  into  lat1,long1  FROM  tbl_zipcodes  WHERE  zipcode = zipbase;   
  15. SELECT  B.zipcode   
  16. FROM  tbl_zipcodes  AS  B    
  17. WHERE    
  18.  B.latitude  BETWEEN  lat1-(range*rangeFactor)  AND  lat1+(range*rangeFactor)   
  19.   AND  B.longitude  BETWEEN  long1-(range*rangeFactor)  AND  long1+(range*rangeFactor)   
  20.   AND  GetDistance(lat1,long1,B.latitude,B.longitude)  <= range;   
  21. END $$   
  22.    
  23. DELIMITER ; 

调用方法
 

  1. CALL GetNearbyZipCodes( '85254' , 30) 

 


.....

转载请注明:谷谷点程序 » mysql利用坐标查询邮编