سؤال

كيف يمكن تطبيق إجراء القرب البحث ؟ على سبيل المثال, المستخدم أنواع في الرمز البريدي ، ثم التطبيق يسرد كافة الشركات في غضون 20 ميلا أمر من القرب.

أريد بناء شيء من هذا القبيل في PHP و MySQL.هذا هو النهج الصحيح ؟

  1. الحصول على عناوين المواقع أنا مهتم في وتخزينها في قاعدة البيانات الخاصة بي
  2. الترميز الجغرافي كافة العناوين مع جوجل خدمة التكويد
  3. كتابة استعلام قاعدة البيانات التي تشمل Haversine صيغة فعل القرب البحث و الطلب

وهذا هو موافق ؟ في الخطوة 3 ، أنا ذاهب إلى حساب القرب عن كل استعلام.هل الأفضل أن يكون القرب الجدول الذي يسرد المسافة بين كل الأعمال وعدد قليل من مرجعية المواقع ؟

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

المحلول

إذا كان هناك ما يكفي من سجلات السرعة إلى المسألة ، وإليك طريقة مؤشر عليها في وقت مبكر.

تعريف الشبكة من صناديق حوالي 20 ميل على الجانب.تخزين بن عدد مع كل مخزن السجل.في وقت البحث ، حساب عدد جميع الصناديق التي تتقاطع 20 ميلا من نقطة تفتيش.ثم استرداد جميع المتاجر في أي من تلك الصناديق ، والمضي قدما كما كان من قبل.

نصائح أخرى

نحن نستخدم هذا فعله عدة آلاف من النقاط.من المهم إذا كنت تقوم بإجراء هذا في SQL أن يكون هناك مؤشر على خطوط الطول والعرض العمود.حاولنا القيام بذلك في SQL server 2008 مع المكاني فهارس ولكن نحن لم نرى زيادة في الأداء توقعنا.على الرغم من إذا كنت ترغب في حساب مسافة معينة من الرمز البريدي تحتاج إلى التفكير حول ما إذا كنت تنوي استخدام الرمز البريدي النقطه الوسطى أو مضلع تمثيل الرمز البريدي.

Haversine forumla هو مكان جيد للبدء.

لم يكن لدينا مشاكل في الأداء حساب المسافة على الطاير, نحن لا حساب عليه في وقت مبكر لبعض التطبيقات أين نحن نعرف نقاط من الوقت و ستكون هناك الملايين من السجلات.

SELECT
        [DistanceRadius]=
        69.09 *
        DEGREES(
          ACOS(
            SIN( RADIANS(latitude) )*SIN( RADIANS(@ziplat) ) 
           +
            COS( RADIANS(latitude) )*COS( RADIANS(@ziplat) ) 
           *
            COS( RADIANS(longitude - (@ziplon)) )
          )
        )
        ,*
        FROM
            table

    ) sub
WHERE
    sub.DistanceRadius < @radius

نحن نفعل هذا من أجل حوالي 1200 المواقع.أنا فقط استخدام Haversine الصيغة على الطاير على الرغم اعتمادا على التطبيق ، فإنه قد يكون من الأفضل تخزينه في PHP بدلا من SQL.(لدينا في مصر .صافي حتى الأميال الخاص بك قد تختلف الأسعار).

حقا أكبر عيب مع طريقة تنفيذ ذلك ، هو أن كل حساب (حتى وقت قريب) قد تكون محسوبة على بيانات الطبقة التي كانت بطيئة (عندما أقول بطيئة, أنا حقا يعني غير لحظية استغرق ثانية أو نحو ذلك) ، ولكن كان ذلك بسبب حقيقة أنه كان لحساب المسافة لجميع 1200 المواقع على أساس الموردة الرمز البريدي.

اعتمادا على المسار الذي تختاره ، هناك طرق تسريع عدد حسابات المسافة ، من خلال النظر في خطوط الطول والعرض وإزالة منها خارج نطاق معرف مسبقا (على سبيل المثال إذا كنت تبحث في كل عنوان في 20 ميلا هناك خط الطول مجموعة يمكنك حساب جميع عناوين يجب أن تقع في 20 ميلا.) التي يمكن أن تصل سرعة الاستعلام إذا لزم الأمر.

نحن في الحقيقة بحثت في تخزين جميع التوليفات الممكنة في قاعدة البيانات الخاصة بنا.في الواقع يبدو أنها يمكن أن تكون كبيرة مخزن البيانات, ولكن الحقيقة أنها ليست في نطاق كبير من الأشياء.مع فهارس يمكن أن تكون سريعة جدا, و كنت لا داعي للقلق حول خوارزمية الأمثل.... الخقررنا ضدها, لأنه كان لدينا المعادلة في C#, و هذا يسمح لنا أن ذاكرة التخزين المؤقت المعلومات اللازمة للقيام بكل العمليات الحسابية في الطبقة التجارية.إما سوف تعمل على ما يرام, انها مجرد مسألة ما تفضله.

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