ابحث عن المسافة بين نقطتين في MySQL. (باستخدام نوع بيانات النقطة)
سؤال
افترض أن لدي جدول عمود مثل هذا:
| user_id | int(11) | NO | UNI | NULL | |
| utm | point | NO | MUL | NULL | |
كما ترون ، الأمر بسيط للغاية. UTM هو نقطة نوع البيانات. أنا أدخلها مثل هذا:
INSERT INTO mytable(user_id, utm) VALUES(1, PointFromWKB(point(50, 50)));
ثم ، أقوم بإنشاء فهرس مكاني.
ALTER TABLE mytable ...add spatial index on(utm) or something. (forgot)
حسنًا ، كل شيء جيد. الآن ، أريد ذلك حدد * حيث المسافة <99999.لكنه لا يعمل!
//This is supposed to select all where the distance is less than 99999999.
set @mypoint = PointFromWKB(point(20,20))
select * from mytable where GLength(LineString(utm, @mypoint)) < 9999999;
Empty set (0.00 sec)
select * from mytable where GLength(LineStringFromWKB(LineString(utm, @mypoint))) < 9999;
Empty set (0.00 sec)
بالمناسبة ، حاولت الإدراج دون pointfromwkb ... ولم ينجح ذلك ... ولهذا السبب اقترح شخص ما هذا pointfromwkb لي.
المحلول
تم حلها. وهذا هو ما فعلته:
where GLength(LineStringFromWKB(LineString(asbinary(utm), asbinary(@mypoint)))) < 9999999999999;
نصائح أخرى
يمكنك أيضا أن تفعل ذلك بهذه الطريقة. لست متأكدًا مما إذا كان الأمر أسرع أم لا.
select * from mytable where glength(geomfromtext(concat('linestring(', x(utm), ' ', y(utm), ',20 20', ')'))) < 99999999
على حد علمي ، عليك أن تجرب بهذه الطريقة-
select * from mytable
where
(
GLength(
LineStringFromWKB(
LineString(
geoPoint,
GeomFromText('POINT(51.5177 -0.0968)')
)
)
)
) < 99999999
أكثر في هذا الجواب.
لا تنتمي إلى StackOverflow