2012-07-11 4 views
6

मेरा लक्ष्य डेटाबेस में आस-पास की इकाइयों को खोजने के लिए mysql POINT (lat, long) का उपयोग करना है। मैं इस ट्यूटोरियल http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL के नीचे कुछ ऐसा करने की कोशिश कर रहा हूं।POINT का उपयोग कर MySQL स्पेक्ट्रियल दूरी - काम नहीं कर रहा

तालिका::

CREATE TABLE mark (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
name VARCHAR(20) DEFAULT NULL, 
loc POINT NOT NULL, 
SPATIAL KEY loc (loc) 
) ENGINE=MyISAM; 

कुछ परीक्षण-डेटा सम्मिलित करना:

INSERT INTO mark (loc,name) VALUES (POINT(59.388433,10.415039), 'Somewhere 1'); 
INSERT INTO mark (loc,name) VALUES (POINT(63.41972,10.39856), 'Somewhere 2'); 

दूरी समारोह की घोषणा:

DELIMITER $$ 
CREATE FUNCTION `distance` 
(a POINT, b POINT) 
RETURNS double DETERMINISTIC 
BEGIN 
RETURN 
round(glength(linestringfromwkb(linestring(asbinary(a), 
asbinary(b))))); 
END $$ 
DELIMITER;  

फ़ंक्शन का उपयोग करने की कोशिश कर यहाँ मैं क्या मिल गया है है पूर्व खोज करने के लिए .:

SELECT name, distance(mark.loc, GeomFromText(' POINT(31.5 42.2) ')) AS cdist 
FROM mark 
ORDER BY 
cdist limit 10; 

या:

SELECT DISTINCT 
dest.name, 
distance(orig.loc, dest.loc) as sdistance 
FROM 
mark orig, 
mark dest 
having sdistance < 10 
ORDER BY 
sdistance limit 10; 

समस्या मैं हो रही है: त्रुटि 1367 (22007): अवैध गैर ज्यामितीय 'aswkb (एक @ 0)' पार्स करने के दौरान पाई गई मूल्य, या त्रुटि 1416 (22003): GEOMETRY फ़ील्ड

पर आपके द्वारा भेजे गए डेटा से ज्यामिति ऑब्जेक्ट प्राप्त नहीं हो सकता है, मुझे यह पता लगाना नहीं है कि इसे कैसे हल किया जाए। महत्वपूर्ण बात यह है कि 'दूरी' फ़ंक्शन गतिशील रूप से उपयोग किया जा सकता है। Find the distance between two points in MYSQL. (using the Point Datatype)

यह मेरा mysql संस्करण mysql वर 14.14 Distrib 5.5.23, लिनक्स (x86_64) के लिए उपयोग कर रहा है ReadLine 5.1

आशा किसी विशेषज्ञता मेरी मदद कर सकते हैं:

मैं भी इस समाधान की कोशिश की है। चीयर्स!

+1

कोशिश 'दौर (glength मीटर में आता है (एस्टेक्स्ट (बी)))))) – acraig5075

+0

@ acraig5075 - सुझाव के लिए धन्यवाद, मैं लगभग उसी परिणाम के साथ समाप्त हुआ। – OMA

उत्तर

7

तो मैं इस के साथ क्वेरी के रूप में दूरी, एक उदाहरण की गणना के लिए समाप्त हो गया:

SELECT glength(LineStringFromWKB(LineString(GeomFromText(astext(PointFromWKB(POINT(63.424818,10.402457)))),GeomFromText(astext(PointFromWKB(POINT(663.422238,10.398996)))))))*100 
AS distance; 

मैं किलोमीटर में एक सन्निकटन प्राप्त करने के लिए 100 से गुणा कर रहा हूँ। परिणाम सटीक नहीं है, लेकिन "ठीक है"। अगर कोई बेहतर तरीका जान लेगा, तो टिप्पणी करने में संकोच न करें।

3

एक कस्टम समारोह

CREATE DEFINER=`test`@`%` FUNCTION `geoDistance`(`lon1` DOUBLE, `lat1` DOUBLE, `lon2` DOUBLE, `lat2` DOUBLE) 
    RETURNS double 
    LANGUAGE SQL 
    DETERMINISTIC 
    NO SQL 
    SQL SECURITY DEFINER 
    COMMENT '' 
    BEGIN 
    DECLARE v DOUBLE; 
    SELECT cos(radians(lat1)) 
     * cos(radians(lat2)) 
     * cos(radians(lon2) - radians(lon1)) 
     + sin(radians(lat1)) 
     * sin(radians(lat2)) INTO v; 
    RETURN IF(v > 1, 0, 6371000 * acos(v)); 
END 

को परिभाषित तो फोन

SELECT geoDistance(X(point1), Y(point1), X(spoint2), Y(point2)) 

परिणाम (LineStringFromWKB (LineString (GeomFromText (astext (क)), GeomFromText

संबंधित मुद्दे