ST_BUFFER مكافئ للبحث القائم على الدائرة في MySQL؟

StackOverflow https://stackoverflow.com/questions/1971516

  •  21-09-2019
  •  | 
  •  

سؤال

أحتاج إلى البحث عن صف مع نقطة تقع داخل دائرة محددة باستخدام 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 ، يبدو أن أحدث اللقطات تتضمن وظائف جديدة مثل المخزن المؤقت أو المسافة. قد ترغب في محاولة إعطائها:

نصائح أخرى

حتى لو كنت تستخدم 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 إذا كانت وسيطة نصف القطر موجودة ولكنها ليست إيجابية

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top