سؤال

هذا السؤال هو خبراء MySQL الجغرافية المكانية.

الاستعلام التالي لا النتيجة التي أتوقعها:

create database test_db;

use test_db;

create table test_table (g polygon not null);

insert into test_table (g) values (geomfromtext('Polygon((0 5,5 10,7 8,2 3,0 5))'));
insert into test_table (g) values (geomfromtext('Polygon((2 3,7  8,9 6,4 1,2 3))'));

select

X(PointN(ExteriorRing(g),1)), Y(PointN(ExteriorRing(g),1)),
X(PointN(ExteriorRing(g),2)), Y(PointN(ExteriorRing(g),2)),
X(PointN(ExteriorRing(g),3)), Y(PointN(ExteriorRing(g),3)),
X(PointN(ExteriorRing(g),4)), Y(PointN(ExteriorRing(g),4))

from test_table where MBRContains(g,GeomFromText('Point(3 6)'));

في الأساس نحن نخلق اثنين من المضلعات، ونحن نحاول استخدام mbrcontains لتحديد ما إذا كانت هناك نقطة داخل أي من المضلعات.

من المستغرب أن يعيد كل من المضلعات! يجب أن توجد نقطة 3،6 فقط في مضلع أول إدراج.

لاحظ أن كلا المضلعات مائلة (بمجرد رسم المضلعات على قطعة من الورق، سترى)

كيف تأتي MySQL إرجاع كل من المضلعات؟ أنا أستخدم MySQL Community Edition 5.1.

هل كانت مفيدة؟

المحلول

تحديث: نأمل أن تكون هذه الإجابة قديمة بواسطة MySQL: http://forge.mysql.com/wiki/gis_functions.في سيغادر كمرجع من تطبيقات Mbrcontains القديمة ولكن إجابة جديدة تشرح التغييرات سيكون موضع ترحيب ويجب أن تكون "مقبولة" فوق هذا واحد.

تبدأ الإجابة القديمة

أنت تستخدم (بالضرورة) الحد الأدنى من المستطيلات المحيطة, ، وليس المضلعين على هذا النحو. لغرض استفسارك الشكل الذي تتم مقارنته هو ما يعادل:

'POLYGON(0 2,0 10,7 10,7 2,0 2)'

للشكل الأول و:

'POLYGON(2 1,9 1,9 9,2 9,2 1)'

للمرة الثانية. (3،6) في كليهما.

MBR هي وسيلة تقريبية لتقدير، صورة المستطيل وجود خطوط رأسية في MIN (X) و MAX (X)، والخطوط الأفقية في Max (Y) و Min (Y). هذه الأشكال أسهل في حساب قاعدة البيانات، ولا يدعم MySQL جميع وظائف المضلع. (المنطقة نعم، LINERTINGS عموما نعم، contains ليس بعد. المزيد من التفاصيل هنا.). إذا كنت تريد المزيد من الهندسة الجغرافية المكانية أكثر دقة في الوقت الحالي، فإن الخيار الأفضل في الجانب المفتوح المصدر هو postgis..

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