ما هي الخدمات الموجودة مسبقًا لحساب المسافة بين عنوانين؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

أرغب في تنفيذ طريقة لعرض قائمة بالعناوين المخزنة مرتبة حسب قربها من عنوان معين.

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

على الرغم من أن هذا يتعلق بتطبيق إنترانت، إلا أنه ليس لدي أي مشاكل في استخدام الموارد الخارجية بما في ذلك الوصول إلى خدمات الويب عبر الإنترنت وما شابه.أنا في الواقع أفضل ذلك على التدحرج بنفسي إلا إذا كان القيام بذلك بنفسي أمرًا تافهًا.إذا كان جوجل أو ياهو!يقدم بالفعل خدمة مجانية، وأنا على أتم استعداد للتحقق من ذلك.الكلمة الأساسية هي أنه يجب أن يكون مجانيًا، حيث أنني لست حرًا في تقديم أي تكلفة إضافية لهذا المشروع مقابل هذه الميزة لأنها تعد بالفعل "ميزة" إضافية إذا جاز التعبير.

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

المشكلة في خوارزميات المسافة البسيطة هي طبيعة البيانات.نظرًا لأن العنوان بالكامل أو جزء منه يمكن أن يكون غير محدد، فليس لدي أي شيء مناسب مثل إحداثيات خطوط العرض/الطول.وأيضًا، حتى لو طلبت الرموز البريدية، فمن المحتمل أن يكون لـ 90% من العناوين نفس الرموز البريدية الخمسة.

على الرغم من أنه ليس من الضروري أن يكون سريعًا للغاية، فإن أي شيء يستغرق أكثر من سبع ثوانٍ للظهور على الصفحة بسبب زمن الوصول قد يكون طويلًا جدًا بحيث لا يستطيع المستخدم العادي انتظاره، كما نعلم.إذا كانت هذه الخدمة الافتراضية تدعم إرسال مجموعة من العناوين مرة واحدة بدلاً من الاستعلام عن عنوان واحد في كل مرة، فسيكون ذلك أمرًا رائعًا.ومع ذلك، لا أعتقد أن قائمة العناوين ستتجاوز إجمالي 50 عنوانًا، إذا كان هذا العدد كبيرًا.

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

المحلول

جوجل و ياهو! كلاهما يوفر خدمات الترميز الجغرافي مجانًا.يمكنك حساب المسافة باستخدام صيغة هافيرسين (تم تنفيذها في .NET أو SQL).ستتيح لك كلتا الخدمتين إجراء عمليات بحث جزئية (الرمز البريدي فقط، المدينة فقط) وستتيح لك معرفة مدى دقة نتائجها (حتى تتمكن من استبعاد المواقع التي لا تحتوي على معلومات ذات معنى، على الرغم من أن Yahoo!يوفر معلومات أكثر دقة من جوجل).

نصائح أخرى

إن واجهة برمجة تطبيقات خرائط Google ليست مفيدة لك نظرًا لشروط الاستخدام الخاصة بها.ومع ذلك، تقدم Yahoo خدمة REST لتحويل العناوين إلى إحداثيات طويلة/خطوط العرض، والتي يمكنك استخدامها بعد ذلك لحساب المسافات.إنه هنا.

اطلب منهم إدخال الرمز البريدي، ثم قم بإنشاء جدول قاعدة بيانات لتعيين الرمز البريدي لأزواج خطوط الطول والعرض (أو ابحث عن واحد عبر الإنترنت).لا أعرف كيف هو الحال في مكان عملك ولكن هنا، يمكن أن يكون الرمز البريدي محددًا لعدة أمتار، لذلك يجب أن يكون دقيقًا بدرجة كافية.ثم استخدم هذه الطريقة لحساب المسافة بين الرمزين البريديين:

public static double distance(double lat1, double lon1, double lat2, double lon2, char unit)
{
  double theta = lon1 - lon2;
  double dist = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) +
    Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * Math.Cos(deg2rad(theta));
  dist = Math.Acos(dist);
  dist = rad2deg(dist);
  dist = dist * 60 * 1.1515;
  if (unit == 'K')
  {
    dist = dist * 1.609344;
  }
  else if (unit == 'N')
  {
    dist = dist * 0.8684;
  }
  return (dist);
}

private static double deg2rad(double deg)
{
  return (deg * Math.PI / 180.0);
}

private static double rad2deg(double rad)
{
  return (rad / Math.PI * 180.0);
}

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

ألا يمكنك فقط استخدام Google Maps API للحصول على المسافات وفرزها على جانبك؟

http://code.google.com/apis/maps/

أقترح التحقيق في API لخرائط Google.

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

مرجع API لواجهة برمجة تطبيقات الاتجاهات

أحد الأشياء التي قمنا بها في شركتي هو الغش واستخدام خط العرض/خط الطول للرمز البريدي (مركز منطقة الرمز البريدي تقريبًا).إنها ليست مثالية، ولكنها قريبة بدرجة كافية لأولئك الذين يجدونني × ضمن عدد n ميل من أنواع عمليات البحث. يعد هذا مفيدًا بشكل خاص عندما يتعذر التعرف على العناوين بواسطة خدمات تنظيف العناوين.

في مرحلة ما، عثرت على رمز بريدي مجاني لجدول البحث عن خطوط الطول والعرض لاستخدامه في هذا التقريب.أنا آسف لأنه لم يعد لدي الرابط لهذا بعد الآن.

تحقق من هذا الموقع: http://geocoder.us/help/utility.shtml

يمكنك معالجة السجلات، 1 لكل 15 ثانية مثل هذا:http://geocoder.us/service/distance?zip1=95472&zip2=94305

لديهم أيضًا خدمة اشتراك بدون حد زمني

لقد قام شخص آخر بذلك بالفعل في منطق سخيف (يحرر:خطأ مطبعي).يستخدمون Google Maps API مع صيغة الدائرة الكبرى.لا أعتقد أنه من الصعب التنفيذ.

تحديث:من الناحية العملية، ما عليك سوى الحصول على الإحداثيات من المزود المفضل لديك، ثم إجراء الحساب باستخدام الكود الخاص بك.يمكنك تحميل إحداثيات المحلات التجارية مسبقًا، عندما يقوم المستخدمون بتوفير مواقعهم - ويمكنك أيضًا استخدام هذا للتحقق من الصحة.ومن ثم، عند تقديم الطلب، يمكنك فقط البحث عن موقع العميل.

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