ST_BUFFER مكافئ للبحث القائم على الدائرة في MySQL؟
سؤال
أحتاج إلى البحث عن صف مع نقطة تقع داخل دائرة محددة باستخدام MySQL GIS. استعلام مثال Pseudocode هو:
select * from gistable g where isInCircle(g.point, circleCenterPT, radius)
يبدو أن Postgis يمكنه القيام بذلك عبر st_buffer وظيفة. هل تقدم MySQL GIS وظائف مماثلة؟
المحلول
على حد علمي ، وظائف المخزن المؤقت لم تنفذ بعد في MySQL:
هذه الوظائف لم تنفذ في MySQL. قد تظهر في الإصدارات المستقبلية.
* Buffer(g,d) Returns a geometry that represents all points whose distance from the geometry value g is less than or equal to a distance of d.
إذا فهمت سؤالك بشكل صحيح ، فقد لا تحتاج حتى إلى وظيفة مكانية لأداء هذا الاستعلام ، يمكنك استخدام استعلام SQL "العادي" و المسافة الإقليدية:
select *
from gistable g
where SQRT(POW(circleCenterPT.x - point.x,2) + POW(circleCenterPT.y - point.y,2)) < radius
أتمنى أن يساعدك هذا.
تعديل:سيكون الأداء بالتأكيد مشكلة في هذا الاستعلام.
بالنسبة للوظائف المكانية في MySQL ، يبدو أن أحدث اللقطات تتضمن وظائف جديدة مثل المخزن المؤقت أو المسافة. قد ترغب في محاولة إعطائها:
- http://forge.mysql.com/wiki/gis_functions
- http://labs.mysql.com/index.php(ابحث عن لقطات MySQL 5.1 GIS)
نصائح أخرى
حتى لو كنت تستخدم postgis ، فلن تحتاج إلى استخدام st_buffer وظيفة ، ولكن st_expand الذي يؤدي العملية التي تعادل هذا (الكود الزائف):
-- expand bounding box with 'units' in each direction
envelope.xmin -= units;
envelope.ymin -= units;
envelope.xmax += units;
envelope.ymax += units;
-- also Z coordinate can be expanded this way
في بناء جملة postgis ، يبدو استعلام SQL عادةً على النحو التالي:
SELECT AsText(geom) FROM mypoints
WHERE
-- operator && triggers use of spatial index, for better performance
geom && ST_Expand(ST_GeometryFromText('POINT(10 20)', 1234), 5)
AND
-- and here is the actual filter condition
Distance(geom, ST_GeometryFromText('POINT(10 20)', 1234)) < 5
يجد المخزن المؤقت مقابل التوسع Explanation في قائمة المراسلات بعد المستخدمين.
لذلك ، من الناحية المثالية لتكرار سلوك مماثل مع MySQL. أنا لست خبير MySQL على الإطلاق ، لكنني أفترض أنه ممكن حتى لو كان هناك لا ST_Expand
وظيفة.
هنا هو كيفية تقليد ST_Expand
وظيفة:
CONCAT('POLYGON((',
X(GeomFromText('POINT(10 20)')) - 5, ' ', Y(GeomFromText('POINT(10 20)')) - 5, ',',
X(GeomFromText('POINT(10 20)')) + 5, ' ', Y(GeomFromText('POINT(10 20)')) - 5, ',',
X(GeomFromText('POINT(10 20)')) + 5, ' ', Y(GeomFromText('POINT(10 20)')) + 5, ',',
X(GeomFromText('POINT(10 20)')) - 5, ' ', Y(GeomFromText('POINT(10 20)')) + 5, ',',
X(GeomFromText('POINT(10 20)')) - 5, ' ', Y(GeomFromText('POINT(10 20)')) - 5, '))'
);
ثم اجمع هذه النتيجة مع الاستعلام مثل هذا:
SELECT AsText(geom) FROM mypoints
WHERE
-- AFAIK, this should trigger use of spatial index in MySQL
-- replace XXX with the of expanded point as result of CONCAT above
Intersects(geom, GeomFromText( XXX ) )
AND
-- test condition
Distance(geom, GeomFromText('POINT(10 20)')) < 5
إذا كنت تعمل مع إصدارات MySQL القديمة حيث لا تتوفر وظيفة المسافة ، فيمكنك فقط استخدام amercader
استخدام الحساب المستند إلى SQRT.
آمل أن يعطيك بعض الأفكار.
اعتبارا من MySQL 5.7.6.
st_distance_sphere (G1 ، G2 [، نصف قطر])
إرجاع المسافة الكروية الميموم بين نقطتين و/أو نقاط متعددة على كرة ، بأمتار ، أو فارغة إذا كانت أي وسيطة هندسية لاغية أو فارغة
تستخدم الحسابات أرضًا كروية ونصف قطرها قابلة للتكوين. يجب إعطاء حجة نصف القطر الاختيارية بالأمتار. إذا تم حذفه ، فإن نصف القطر الافتراضي هو 6،370،986 متر. يحدث خطأ er_wrong_arguments إذا كانت وسيطة نصف القطر موجودة ولكنها ليست إيجابية