كيفية إعداد البحث عن عنوان عن طريق الإحداثيات (ومكان الحصول على الدليل اللازم)



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

منتج قوي له نفس الوظيفة يقدم Yandex - يطلق عليه Geocoder . لكن خدمة Yandex مجانية فقط للمشاريع غير التجارية المفتوحة. التعريفة القياسية - من 120 000 000 في السنة - ليست مناسبة للجميع.

كنا نظن - إذا قمت بإجراء بديل مجاني أو غير مكلف لـ "Geocoder" ، فمن المحتمل أن يقول المطورون شكرًا. وفعلوا. سوف أخبرك في المقالة كيف تعمل بنية "العنوان حسب الإحداثيات": كيف قمنا بإعداد البحث ، وجمع دليل وتعبئته في طريقة جاهزة.

أين نحصل على البيانات وكيف نبحث عن العنوان


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

نأخذ كائنات العنوان في FIAS - Federal Address Address System . هذا هو الأكثر شمولية من الدلائل عنوان مفتوحة ورسمية. لقد سبق أن كتبنا عنها بالتفصيل عن حبري ، والآن أربع حقائق مهمة:

  • تقوم FIAS بتخزين جميع الكائنات القابلة للعنونة في البلد ، من المناطق وما دونها - إلى المباني والأراضي الإضافية ؛
  • الدليل متاح بحرية بتنسيقات DBF و XML ؛
  • FIAS ليست مثالية - فهي تفتقر إلى عشرات الآلاف من المنازل والعديد من الشوارع ، وخاصة الجديدة منها ؛
  • يتوافق كل كائن عنوان في الدليل مع رمز معرف فريد FIAS. يتم تغيير رمز الكائن في بعض الأحيان ، لكن بالنسبة لمقالنا هذا ليس مهمًا جدًا.

كائنات العنوان التي تم تنزيلها من FIAS مع ID هي أساس دليلنا للترميز الجغرافي العكسي.

قم بتنزيل الإحداثيات من OpenStreetMap (OSM). OSM عبارة عن مشروع برخصة مجانية: يجمع المتحمسون إحداثيات الكائنات المختلفة ونشرها على الجميع.

بعبارات بسيطة ، OSM عبارة عن مجموعة من النقاط والخطوط والمضلعات على الخريطة. كل كائن له وصفه الخاص ، ونوع ومجموعة الإحداثيات. توجد بيانات OSM لروسيا في needgeo.com و osm.sbin.ru/osm_dump/ و osmosis.svimik.com/latest/ .


يتم نشر قائمة المصادر على صفحة خاصة على "ويكي" للمشروع

يتكون التفريغ من ملفات PBF - يستخدم هذا التنسيق بدلاً من XML كتنسيق أكثر ضغطًا. إن تحويل PBF إلى OSM XML لا يكلف شيئًا ، يمكن لمجموعة من الأدوات المساعدة المعتمدة من المجتمع التعامل مع هذا.

بالنسبة إلى الدليل الخاص بنا ، نأخذ كائنات العنوان من FIAS ، ثم نبحث عن إحداثياتها في OSM. إذا وجدت ، احفظ البيانات المدمجة. اتضح مثل هذا التقاطع بين FIAS و OSM.

كل هذا رائع ، ولكن هناك مشكلة واحدة: الأمور ليست سهلة مع جودة البيانات في OSM. إحداثيات الكائنات في كثير من الأحيان لا تتوافق مع الواقع. على سبيل المثال ، المضلعات للمناطق والمناطق كافية. ولكن للمدن وتحت - ليس كثيرا.


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

العمل الرئيسي ، وبهامش واسع ، هو جمع البيانات الكافية من OSM والتخلص من الزواج. المهمة ضخمة جدًا لدرجة أنني كرست قسمًا منفصلاً لها في المقالة.

نقوم أيضًا بتنزيل المنازل غير الموجودة في FIAS من OSM. كما قلت أعلاه ، هناك عشرات الآلاف من المنازل في FIAS. هذه ليست مشكلة ، بل مجرد حقيقة واقعة. لذلك ، نحن تجديد دليلنا مع المنازل من OSM. ولكن فقط تلك التي يوجد بها شارع في FIAS. لا تحتوي المباني التي جاءت من OSM على معرّف FIAS ، لذلك نعرّفها كرمز FIAS + رقم منزل الوالد .

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

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

  1. قمنا بتحميل في Lucene دليل الإحداثيات والعناوين ، وحصلنا على فهرس البحث. لسهولة الاستخدام ، تمت إزالة كل شيء تقريبًا منه ، مع ترك معرفات العنوان والإحداثيات فقط.
  2. قمنا بإعداد بحث حسب الفهرس: إدخال - الإحداثيات ، الإخراج - معرف كائنات العنوان التي تم العثور عليها. لا يُرجع البحث معلومات أخرى ، حيث تم تقصير الفهرس تمامًا.
  3. راض عن الإصدار ، وتحميل البيانات من FIAS "كبيرة" من قبل معرفات وجدت. نضيف الكثير من كل شيء ، من العنوان الذي يحتاجه الجميع في سطر واحد إلى علامة العاصمة الإقليمية للمدن.
  4. اكتشفنا كيفية فرز وإعطاء الأشياء المستلمة.

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

كيفية جمع قاعدة الإحداثيات والعناوين


للبدء ، سأضع الأمتعة: بعد قراءة المقال ، لا يعمل هذا الدليل بسرعة. نحن نجمعها منذ عام 2014 ، ونكملها باستمرار. سأتحدث عن هذا الطريق الطويل.

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

نحن نشكل عناوين كاملة من علامات OSM. في عمليات تحميل OSM ، تنتشر الأجزاء المكونة للعناوين بعلامات مختلفة:

  • addr: المدينة - قرية بولاتنيكوفو ؛
  • addr: الشارع - الشارع المركزي ؛
  • addr: housenumber - 103 .

نركض عبر العلامات ونجمع العنوان الكامل منها: قرية بولاتنيكوفو ، 103 سنترال ستريت .

نقوم بتشغيل كل عنوان جديد من خلال واجهة برمجة تطبيقات توحيد دادات . تحول الخدمة العناوين إلى تنسيق واحد "مثل في FIAS":

  • يصحح الأخطاء المطبعية ؛
  • يقوم بفك تشفير الاختصارات مثل "NiNo" و "Msk" ؛
  • تغيير الأسماء القديمة إلى أسماء جديدة ؛
  • يجد المدينة مفقودة في العنوان بالفهرس ؛
  • يعرف رمز FIAS.

العناوين من واجهة برمجة التطبيقات نظيفة ، على الرغم من أنها الآن ترسل خطابًا أو طردًا.
قبل التوحيدبعد
قرية بولاتنيكوفو ، الشارع المركزي ، 103

142718 ، منطقة موسكو ، حي لينينسكي ، مع بولاتنيكوفو ، شارع سنترال ، 103.


رمز FIAS - a8b6a52f-e96d-4ec3-a0ff-641013ab0445

نقوم بتخزين المنازل والشوارع والمستوطنات الموحدة كنقطة واحدة. للشارع والقرية ، هذه النقطة هي المركز. نتيجة لذلك ، توجد جميع كائنات العنوان في نفس الجدول ، وداخلها - العنوان ، ومعرف FIAS ، وخطوط الطول والعرض.
العنوانFIAS IDاتساعخط الطول
142718 ، منطقة موسكو ، حي لينينسكي ، مع بولاتنيكوفو ، شارع سنترال ، 103a8b6a52f-e96d-4ec3-a0ff- 641013ab044555.55877337.667103
119034 ، موسكو ، حارة تورشانينوف ، د 6 بناية 28c925e61-9173-48b3-999e-dc85c86d89e755.73709637.597190
نحن نحلل العناوين التي لم يقم توحيد بياناتها. يتم تمييز العناوين التي لا يمكن مطابقتها مع FIAS بعلامة من الخدمة. نتحقق منها يدويًا ، وهناك العديد من الخيارات.

  1. لم يأتي العنوان في علامات تحميل OSM المناسبة ، لكن الشيطان يعرف أين. تعرف على علامات العناوين والمدينة في علامة الشارع وغير ملؤها ، وغير ذلك الكثير.
  2. في OSM يكمن كائن غريب مثل الملعب ، ملعب كرة القدم في الكلية أو حتى المقبرة. لا يوجد شيء مثل هذا في FIAS ، ولأغراضنا هذه النتائج ليست مناسبة. يتم فرز هذه الكائنات ببساطة.
  3. خطأ - وليس خطأ على الإطلاق. على سبيل المثال ، جاءت منطقة مدينة غير موجودة في FIAS من OSM. أو في OSM ، يقع الكائن في مستوطنة ، لكن في FIAS تم إرفاق هذه المستوطنة بالمدينة وإزالتها. ثم ننتهي من الخوارزمية للبيانات المحملة ونعملها مرة أخرى.


تحليل التفريغ ، وهناك - الارتباك في العلامات

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

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


كود KLADR هو معرف فريد تم استخدامه قبل FIAS. يمكن أن تجد مليون خدمة هذا الرمز لعنوان

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

في هذا بالنسبة للمدن والشوارع ، ينتهي الفحص.

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

  1. يأخذ عنوان المنزل الجديد ويجد جيرانه في الدليل المرجعي.
  2. وفقا للإحداثيات ، فإنه يأخذ في الاعتبار المسافة بين المنزل الجديد الذي لم يتم التحقق منه والجيران الموثوق بهم.


من السهل العثور على جيران: 1. نأخذ منزلًا جديدًا ونجد معرف FIAS للوالد. 2. نختار من منازل الدليل المرجعي الذي يحمل والديه نفس معرف FIAS

يتم التفتيش فقط في المنزل ، والذي لا يبعد أكثر من 150 مترًا عن زملاء موثوقين. علاوة على ذلك ، فإننا نعتبر كل منزل جديد معتمد عند تحليل ما يلي. إليك كيف تعمل.

لنفترض ، في الدليل المرجعي ، أن المنازل رقم 1 و 2 و 3 مخزنة على طول شارع كوموناروف . في البيانات الجديدة جاءت المنازل رقم 5 و 6 و 7 في نفس الشارع. اذا حكمنا من خلال الاحداثيات ، المنازل الجديدة قريبة. ترى الأداة المساعدة أن هذا المنزل رقم 5 يقع بجوار المنازل رقم 1 و 2 و 3 ويضيفه إلى الدليل المرجعي. لذلك ، يتم اختبار المنازل رقم 6 و 7 .

ثم يتم تحديد مصير البيانات التي تأتي من OSM:

  • المنازل التي اجتازت كلتا الشيكتين: بالنسبة إلى مدافن النفايات وللجيران ، نضيف إلى الدليل المرجعي ؛
  • إذا لم يقع الكائن في المضلع ، فإن البيانات الجديدة ليست مناسبة. نفس الشيء إذا كانت المسافة بين المنزل والجيران كبيرة جدًا ؛
  • المنازل التي ليس لها جيران ، نحن نؤجل. إنهم يكمنون في قاعدة بيانات منفصلة ، في يوم ما سنحلل.

نقسم الكائنات التي تم اختبارها إلى قسمين. سوف يذهبون إلى لوحات مختلفة من الدليل المرجعي لدينا.


في الجدول الأول - جميع الكائنات ذات معرّف FIAS إلى المنازل: المناطق والمستوطنات والشوارع. في الثانية - في المنزل وصلة إلى الوالد من الجدول الأول

هناك حاجة لجدولين لتعيين مفاتيح المنازل المفقودة من FIAS. ليس لديهم كود FIAS الخاص بهم ، لذلك إليك الطريقة:

  • نقوم بتجميع كائنات العناوين إلى المنزل في جدول واحد ، ولكل منها رمز FIAS الخاص به ؛
  • في الثانية - فقط في المنزل ، أثناء الإشارة إلى الوالد في الجدول الأول.

نتيجة لمبنى بدون رمز FIAS ، فإننا نحدد رقم منزل ID + للوالدين باستخدام مفتاح FIAS .

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

الشيء الرئيسي بعد التحديث هو أن لا تزداد سوءا.

عكس الترميز الجغرافي من خلال عيون المستخدم


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

curl -X POST \ -H "Content-Type: application/json" \ -H "Accept: application/json" \ -H "Authorization: Token ${API_KEY}" \ -d '{ "lat": 55.878, "lon": 37.653, "radius_meters": 50 }' \ https://suggestions.dadata.ru/suggestions/api/4_1/rs/geolocate/address 

تقوم الطريقة بإرجاع الأشياء التي تم العثور عليها: المنازل والشوارع والمستوطنات. يفرزها بترتيب تنازلي من الدقة.

  1. في المنزل.
  2. الشوارع.
  3. المستوطنات.
  4. المدينة.

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

بعد كل هذه القلاع ، تقوم الطريقة أخيرًا بإرجاع الكائنات التي عثر عليها.

 { "suggestions": [ { "value": " ,  ,  11", "unrestricted_value": " ,  ,  11", "data": {...} }, { "value": " ,  ,  11", "unrestricted_value": " ,  ,  11", "data": {...} } ] } 

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


جميع البيانات التي تعطيها الطريقة موجودة في الوثائق

تختلف التغطية عن طريق الإحداثيات للمناطق المختلفة ، مثل هذا مع المنازل:

  • موسكو - 96 ٪ ،
  • سانت بطرسبرغ - 88 ٪ ،
  • مدن أخرى زائد - 74 ٪ ،
  • بقية روسيا هي 47 ٪.

وها هي - تغطي الشوارع:

  • موسكو - 92 ٪
  • سانت بطرسبرغ - 79 ٪ ،
  • مدن المليونير الأخرى - 75 ٪ ،
  • بقية روسيا 67 ٪.

لم يفكروا في المدن - على نطاق روسيا ، فحقيقة الانتماء إلى لقب المدينة الفخور كانت غير مستقرة. على سبيل المثال ، منطقة Yaroslavl ، منطقة Poshekhonsky ، s / o Fedorkovsky هي مدينة ، وفقًا لدليل FIAS الرسمي. ولكن في الواقع ، وفي العنوان - المنطقة الريفية. جسديا ، تشبه المنطقة الريفية اتحاد العديد من القرى في بقعة كبيرة. من الصعب ليس فقط تحديد المركز ، ولكن حتى العثور على المستوطنة على الخريطة.

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

خلاف ذلك ، كل شيء بالفعل على همز. ما يصل إلى 10000 طلب يوميًا - مجانًا ، وأكثر - عن طريق الاشتراك من 5000 000 سنويًا. إذا كنت بحاجة إلى عناوين حسب الإحداثيات لمشروع تجاري ، وكان Geocoder باهظ التكلفة ، فجرّب Dadati API .

تم نشر المقال الأصلي على مدونة HFLabs .

Source: https://habr.com/ru/post/ar467787/


All Articles