GIS avagy tavolsagszamitas MySql-ben
Udv mindenkinek,
azzal szenvedek, hogy szeretnek egy tarolt eljaras irni mysql 5.1.37-ben, de mindenfele hiba nelkul csak annyi uzenetet kapok vissza minden fronton (log, error message), hogy Couldn't create Stored Procedure
A tarolt eljaras lenyege, hogy koordinata kozotti tavolsagot szamitsak ki, mindezt MySQL alatt. A kerdeses kod igy nez ki:ha valaki le tudna nekem ezt tesztelni egy sajat szerveren, hogy az an MySQL-m bugos e vagy rossz az egesz koncepcio, akkor kerem tegye meg es valaszat varom ide? :)
kiegeszito tablak:Udv
Sanyi
■ azzal szenvedek, hogy szeretnek egy tarolt eljaras irni mysql 5.1.37-ben, de mindenfele hiba nelkul csak annyi uzenetet kapok vissza minden fronton (log, error message), hogy Couldn't create Stored Procedure
A tarolt eljaras lenyege, hogy koordinata kozotti tavolsagot szamitsak ki, mindezt MySQL alatt. A kerdeses kod igy nez ki:
DELIMITER $$
CREATE PROCEDURE geodist_otp (
IN userid INT,
IN dist INT
)
BEGIN
DECLARE mylon DOUBLE;
DECLARE mylat DOUBLE;
DECLARE lon1 FLOAT;
DECLARE lon2 FLOAT;
DECLARE lat1 FLOAT;
DECLARE lat2 FLOAT;
-- get the original lon and lat for the userid
SELECT longitude, latitude INTO mylon, mylat FROM users WHERE id=userid LIMIT 1;
-- calculate lon and lat for the rectangle:
SET lon1 = mylon-dist/ABS(COS(RADIANS(mylat))*69);
SET lon2 = mylon+dist/ABS(COS(RADIANS(mylat))*69);
SET lat1 = mylat-(dist/69);
SET lat2 = mylat+(dist/69);
SELECT destination.*, 6537 * 2 * ASIN(SQRT( POWER(SIN((origin.latitude - destination.latitude) * PI()/180 / 2), 2) + COS(origin.latitude * PI()/180) * COS(destination.latitude * PI()/180) * POWER(SIN((origin.longitude - destination.longitude) * PI()/180 / 2), 2) )) AS distance FROM atm_otp destination, users origin WHERE origin.id=userid AND destination.longitude BETWEEN lon1 AND lon2 AND destination.latitude BETWEEN lat1 AND lat2 HAVING distance < dist ORDER BY distance LIMIT 10;
END $$
DELIMITER;
kiegeszito tablak:
CREATE TABLE IF NOT EXISTS `atm_otp` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`fulladdress` varchar(300) NOT NULL,
`latitude` decimal(10,0) NOT NULL,
`longitude` decimal(10,0) NOT NULL,
`update_date` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Table structure for table `users`
--
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`device` varchar(300) DEFAULT NULL,
`visit` datetime DEFAULT NULL,
`latitude` decimal(10,0) DEFAULT NULL,
`longitude` decimal(10,0) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=1 ;
Sanyi
Column count of mysql.proc is wrong. Expected 20, found 16.
Én ezt a hibát kaptam:
Column count of mysql.proc is wrong. Expected 20, found 16. The table is probably corrupted
Távolság
...
...
Hat kicsit jobban korbeneztem, de mukodo peldat nem talaltam erre es sokan irtak, hogy sajnos nem a megfelelo tavolsagszamitast alkalmazza a MySQL, helyette ajanlottak FUNCTION illetve STORED PROCEDURE megoldasokat, de egyiket sem birtam lefuttatni / mukodesre birni. Szintaktikailag rendben van, csak 1307 hibaval elszall, ami egy altalanos hibauzenet tarolj eljarasok es fuggvenyek eseteben.
off
Par adatbaziskezelovel volt mar dolgom, ami tamogatja a tarolt eljarasokat illetve fuggvenyeket, irtam is parat, dehogy ennyire ne mukodjon ez MySQL-ben nem gondoltam volna, very dissapointed, (n)
end off
mod: ich bin ein idiot, nem volt mysql_upgrade lefuttatva
Udv
Sanyi