पिछले लेख में, मैंने स्पार्क का उपयोग करके रिवर्स जियोकोडिंग की जांच की। अब कल्पना कीजिए कि हमें मेल पतों के प्रत्यक्ष जियोकोडिंग की चुनौती का सामना करना पड़ा। यही है, कुछ भौगोलिक निर्देशांक के पाठ द्वारा दर्ज पते के लिए प्राप्त करना।
निश्चितता के पते रूसी हैं, और सबसे महत्वपूर्ण बात - वे अक्सर कुटिल रूप से लिखे जाते हैं, अर्थात्, त्रुटियों, अस्पष्टता और अन्य प्रसन्नता के साथ। और ये पते Hive डेटाबेस में, Hadoop क्लस्टर पर हैं।
ठीक है, ऐसा लगता है - हम Google मैप्स जियोकोडिंग एपीआई लेते हैं (या, यदि आप आयात प्रतिस्थापन के समर्थक हैं, तो यैंडेक्स मैप्स एपीआई), और हम काम करते हैं। लेकिन यहां हम, साथ ही रिवर्स जियोकोडिंग के साथ, एक छोटे से घात की प्रतीक्षा कर रहे हैं।
या बड़ा, यह एक नज़र की तरह है। तथ्य यह है कि इस बार हमें लगभग 5 मिलियन पतों को संसाधित करने की आवश्यकता है। और शायद 50 - यह तुरंत स्पष्ट नहीं था। जैसा कि आप जानते हैं, Google आपके आईपी को लगभग 10 हजार पतों के बाद प्रतिबंधित कर देगा, यांडेक्स आपके साथ भी ऐसा करेगा, हालांकि यह थोड़ी देर बाद (25 हजार अनुरोध एक दिन, जैसे संभव है)। और इसके अलावा, दोनों एपीआई रीस्ट हैं, जिसका अर्थ है कि यह अपेक्षाकृत धीमा है। और यहां तक कि अगर आप सशुल्क सदस्यता खरीदते हैं, तो इससे गति एक पैसा नहीं बढ़ेगी।
और फिर भी - हम बारूद से बाहर भाग गए।
मैं सबसे महत्वपूर्ण बात भूल गया - हमारे Hadoop क्लस्टर इंट्रानेट पर स्थित है, और Google मैप्स, यांडेक्स मैप्स के साथ कंपनी के लिए, और बाकी सभी, क्लस्टर से हमारे लिए आमतौर पर अप्राप्य हैं। यही है, हमें एक स्वायत्त समाधान की आवश्यकता है।
मैं तुरंत कहूंगा - आपको यहां तैयार समाधान नहीं मिलेगा। मैं केवल उस दृष्टिकोण का वर्णन करूंगा जिसे हम लागू करने की योजना बनाते हैं, और थोड़ा और विस्तार से - एक समाधान के लिए एक लंबे रास्ते पर एक कदम।
बेशक, हमारे पास रिजर्व में कुछ था। एक आंतरिक आर्कगिस सर्वर था जिसका मैंने पहले ही उल्लेख किया था। हमें उन्हें चलाने की अनुमति नहीं थी, लेकिन इसकी REST सेवाओं का उपयोग करने की अनुमति थी।
हमने जो पहला काम किया, वह था इसे कार्य के लिए पेंच करना। उसने हमें प्रतिबंधित नहीं किया, लेकिन कभी-कभी रखरखाव के लिए बंद कर दिया। और क्या अच्छा है - इसमें जियोकोडिंग का एक बैच मोड था, जब आप इनपुट के लिए पतों का एक पैकेट जमा करते हैं (सर्वर को कॉन्फ़िगर करने के बाद, हमारे पास 1000 टुकड़ों का एक पैकेट आकार था, डिफ़ॉल्ट रूप से ऐसा लगता है कि यह परिमाण या उससे छोटे का एक क्रम है)। यह सब आसान नहीं था, और हम, और आर्कगिस समर्थन लंबे समय तक सर्वर के साथ सूमो कुश्ती में लगे रहे, लेकिन यह एक और कहानी है।
सभी चालों और मोड़ और मोड़ के बाद, हम लगभग एक दिन में अपने पांच मिलियन को संसाधित करने में सक्षम थे। यह आगे बढ़ने के लिए आवश्यक था, और अभी तक तेजी लाने की कोशिश करता है।
इसी समय, यह स्पष्ट हो गया कि आरईएसटी वाला कोई भी जियोकोड हमारे लिए सबसे उपयुक्त नहीं है। इसके अलावा, हमने नोमानतिम, और पेलियास, और फोटोन, और गिसग्राफी और सामान्य तौर पर किसी से संतुष्ट नहीं देखा। गुणवत्ता और प्रदर्शन (या दोनों) आदर्श से बहुत दूर था।
उदाहरण के लिए, कोई भी नहीं जानता कि जियोकोड पैकेज (और यह आर्कगिस के साथ बहुत तेजी से काम करता है)।
या गुणवत्ता - gisgraphy.com डेमो सर्वर पर जाएं और मॉस्को को खोजने का प्रयास करें। आपको दर्जनों उत्तर मिलेंगे, जिनमें शामिल हैं: मॉस्को (रूसी संघ का एक शहर), कैनसस सिटी (यूएसए का एक शहर), खिमकी, कलुगा, व्याखिनो-ज़ुलेबिनो, और कई अन्य वस्तुएँ जिन्हें मैं जियोकोडर के उत्तर में नहीं देखना चाहता हूं। मास्को की खोज करें।
ठीक है, आखिरी (लेकिन हमारे लिए महत्वपूर्ण नहीं) समस्या यह है कि सभी भू-निर्माताओं से दूर एपीआई के रूप में अच्छी तरह से सोचा जाता है, जैसे कि, Google मैप्स। मान लीजिए कि आर्कजीआईएस एपीआई पहले से ही बहुत अधिक असुविधाजनक है, और बाकी भाग सबसे ज्यादा खराब है। यदि आप UI के लिए जियोकोड पते, तो एक नियम के रूप में एक व्यक्ति सबसे अच्छा विकल्प चुनने में लगा हुआ है। और वह इसे कार्यक्रम से बेहतर करता है। और बड़े पैमाने पर जियोकोडिंग के मामले में, जैसा कि हमारे पास है, किसी विशेष पते के लिए परिणाम की गुणवत्ता का आकलन करना सफलता के महत्वपूर्ण घटकों में से एक है।
नतीजतन, उदाहरण के लिए, "अपने खुद के Nominatim का विस्तार करें" जैसे विकल्प भी गायब हो गए हैं।
क्या करें?
इसके बजाय एक स्पष्ट समाधान यह था: चूँकि पते कहीं से भी नहीं लिए गए हैं और गायब नहीं हुए हैं, मकान हर दिन नहीं बनते हैं, और सड़कों का निर्माण नहीं होता है, आपको बस हमारी प्रक्रिया के लिए आधिकारिक तौर पर मौजूदा पते का एक डेटाबेस जोड़ने की आवश्यकता है। निर्देशांक के साथ तुरंत बेहतर है, और यदि ऐसा नहीं होता है, तो इसे एक बार जियोकोड करें। इस मामले में, यह हमारे लिए पर्याप्त होगा कि हम अपने आधार को एक ही आवृत्ति के साथ अपडेट करें क्योंकि नए घर या सड़कें दिखाई देती हैं, जो कि अक्सर नहीं होती हैं।
मौजूदा पतों के आधार के लिए पहला और मुख्य उम्मीदवार
FIAS है । एक मिनट रुको, आप कहते हैं, लेकिन FIAS के पास केवल कुछ मिलियन पते हैं - और आपके पास 50 मिलियन के रूप में कई हैं? हां, वास्तव में केवल कुछ ही मिलियन
घर हैं । और हमारे उपयोगकर्ताओं के 50 से 50 मिलियन पते हैं, अर्थात ये लोगों के पते हैं, और उनके पास पते में अचानक एक अपार्टमेंट है। 1-100 अपार्टमेंट के पांच मिलियन घर, प्रत्येक अपार्टमेंट में कई लोग रहते हैं ... ठीक है, आप सब कुछ समझते हैं। और दूसरा विकल्प कार्यालयों के पते हैं, जहां एक कार्यालय केंद्र में सैकड़ों परिसर हैं, जिन्हें कभी-कभी किराए पर दिया जाता है।
उसी समय, हमें स्पष्ट रूप से अपार्टमेंट (या कार्यालय) की संख्या के साथ एक पते की आवश्यकता नहीं है - सबसे पहले, यह सभी परिणामों के साथ व्यक्तिगत डेटा है, और दूसरी बात, हम अभी भी इस बात में दिलचस्पी नहीं रखते हैं कि अपार्टमेंट किसी विशेष घर में कैसे स्थित हैं, और उनके निर्देशांक क्या हैं । केवल एक घर की जरूरत है। कार्यालयों के लिए, यह पूरी तरह से सच नहीं है, लेकिन फर्श से एक इमारत में कार्यालयों का स्थान अभी भी निर्देशांक द्वारा निर्धारित नहीं है।
अंतत:, 5 मिलियन (सशर्त रूप से) विद्यमान घरों का आधार, कहते हैं, हम केवल अपार्टमेंट या कार्यालय को पते से बाहर फेंकने और आधार के साथ मिलान करके 50 या 100 मिलियन पते की जियोकोडिंग समस्या को हल कर सकते हैं।
और घरों के निर्देशांक कहाँ से प्राप्त करें? केवल एक स्पष्ट खुला स्रोत है - ओपनचिटपॉइंट, वहां घर हैं, ज्यामिति के साथ, और कई अन्य विशेषताओं जैसे कि मंजिलों की संख्या या यहां तक कि छत का रंग भी है।
सभी चर्चाओं के बाद, हमारे पास एक नेपोलियन योजना थी। यहाँ एक है:
- OSM से Hadoop में मैप डेटा लोड करना
- पते के साथ FIAS डेटा अपलोड करें
- घर के नंबरों के साथ अद्वितीय पूर्ण पतों की एक सूची बनाएं
- हम इसे OSM में पतों की खोज करके, और हमने जो नहीं पाया है, उसे आर्कगिस के माध्यम से खोजते हैं
हमें अक्षांश और देशांतर वाले घरों का आधार मिलता है। का आनंद लें। लाभ छीनना। बोनस (मजाक) पियो।
इस लेख में मैं आपको बताऊंगा कि हमने इस योजना के पहले बिंदु को कैसे लागू किया।
OpenStreetMap क्या है
यदि आप एक डेटा बिंदु से OSM को देखते हैं, तो कार्ड को तीन तालिकाओं के रूप में कल्पना की जा सकती है:
- अंक (नोड)
- लाइनें (तरीके)
- व्यवहार (संबंधों)
इस डेटा की वास्तविक योजनाएँ नीचे दी गई हैं।
केवल अंक निर्देशांक (अक्षांश और देशांतर, डिग्री में) हैं। लाइनें अंकों का एक क्रमबद्ध क्रम हैं। संबंध बिंदुओं और रेखाओं का एक समूह होते हैं, जिनमें से प्रत्येक की
भूमिका होती है ।
बाकी सभी तथाकथित टैग हैं। अर्थात्, उदाहरण के लिए, एक एटीएम, या एक स्टोर, या मेट्रो का एक प्रवेश द्वार - यह टैग के साथ सुसज्जित एक बिंदु हो सकता है amenity = atm, या shop = कुछ बेचता है, या कुछ और। आधिकारिक रूप से अनुशंसित टैग की एक निर्देशिका है (प्रत्येक लागू भाषा और देश के लिए, वे आंशिक रूप से अपने स्वयं के हो सकते हैं), और गैर-मानक लोगों को आविष्कार करने का अभ्यास।
टैग के अलावा, नक्शे के प्रत्येक तत्व में एक अद्वितीय संख्यात्मक आईडी है, साथ ही इतिहास से संबंधित कुछ विशेषताएं हैं - जिन्होंने कब संपादित किया, संख्या संपादित करें, आदि।
कार्ड के साथ डेटाबेस कई स्वरूपों में आता है:
- pbf Google प्रोटोबॉफ़ है, जो एक पोर्टेबल डेटा क्रमांकन प्रारूप है।
- xml स्पष्ट रूप से XML है। वॉल्यूम में बहुत अधिक।
आपको यह समझने की आवश्यकता है कि डेटाबेस को दैनिक रूप से अपडेट किया गया है। इसलिए, अनलोडिंग पूर्ण और वृद्धिशील है।
हमने पीबीएफ को अधिक कॉम्पैक्ट के रूप में चुना।
Hadoop में इसे पढ़ने के लिए, OSM के लिए विशेष रूप से बनाया गया एक जावा एपीआई है जिसे इस ऑस्मोसिस प्रोजेक्ट कहा जाता है। सिद्धांत रूप में, इसके साथ काम करना सरल है - आप नक्शे के तत्वों के माध्यम से एक फ़ाइल और चक्र अपलोड करते हैं। एक स्थान पर अंक, दूसरे में रेखाएं, तीसरे में संबंध जोड़ें। सिद्धांत रूप में, ऑस्मोसिस और उदाहरण के लिए स्पार्क पहले से ही सभी डेटा डाउनलोड करने के लिए पर्याप्त हैं।
सौभाग्य से, मेरी बाइक को लागू करने की प्रक्रिया में, यह किसी भी तरह मुझे Hadoop - Parquet (लकड़ी की छत) और Avro में स्वीकार किए गए स्वरूपों में OSM को परिवर्तित करने के लिए इंटरनेट पर खोजने के लिए हुआ। एक मायने में, दोनों पीबीएफ के एनालॉग हैं, इसलिए एक कनवर्टर खोजने का मौका था। और वह मिल गया, लेकिन एक नहीं।
मिलिए OSM Parquetizer से
देखो
मुझे क्या मिला!आलसी लोगों के लिए - पहली पंक्ति में परियोजना की रीडमी में सही यह कहता है: टेलीनव ग्रह के साप्ताहिक डाउनलोड प्रकाशित करता है।
बहुत आलसी लोगों के लिए: लगभग 700 गीगाबाइट जहाज करने के लिए तैयार हो जाओ;) ठीक है, अगर आपको निश्चित रूप से एक ग्रह की आवश्यकता है। आप आमतौर पर यूरोप से कह सकते हैं।
यदि आप लोड नहीं करना चाहते हैं, तो प्रक्रिया इस तरह दिखती है:
पीबीएफ प्रारूप में एक नक्शा डाउनलोड करें, उदाहरण के लिए
भू-आकृति से । यह 2.5 गीगाबाइट है अगर आपको रूस की जरूरत है, और 19 को यूरोप की। थोड़ा भी नहीं, लेकिन आप अधिक बारीक कटा हुआ नमूने पा सकते हैं। इसके बाद, फ़ाइल को डिस्क पर रखें, और प्रोग्राम चलाएँ:
java -jar ./osm-parquetizer.jar russia-latest.osm.pbf
कुछ मिनट या कुछ सेकंड के बाद, आपकी मशीन के प्रदर्शन के आधार पर, आपको तीन फाइलें पैराकिट प्रारूप में मिलती हैं। यहाँ लेखक जैसा दिखता है (वह रोमानिया से है):
-rw-r--r-- 1 adrianbona adrianbona 145M Apr 3 19:57 romania-latest.osm.pbf -rw-r--r-- 1 adrianbona adrianbona 372M Apr 3 19:58 romania-latest.osm.pbf.node.parquet -rw-r--r-- 1 adrianbona adrianbona 1.1M Apr 3 19:58 romania-latest.osm.pbf.relation.parquet -rw-r--r-- 1 adrianbona adrianbona 123M Apr 3 19:58 romania-latest.osm.pbf.way.parquet
प्राप्त .parquet फ़ाइलों की योजनाएँ:
node
|-- id: long
|-- version: integer
|-- timestamp: long
|-- changeset: long
|-- uid: integer
|-- user_sid: string
|-- tags: array
| |-- element: struct
| | |-- key: string
| | |-- value: string
|-- latitude: double
|-- longitude: double
way
|-- id: long
|-- version: integer
|-- timestamp: long
|-- changeset: long
|-- uid: integer
|-- user_sid: string
|-- tags: array
| |-- element: struct
| | |-- key: string
| | |-- value: string
|-- nodes: array
| |-- element: struct
| | |-- index: integer
| | |-- nodeId: long
relation
|-- id: long
|-- version: integer
|-- timestamp: long
|-- changeset: long
|-- uid: integer
|-- user_sid: string
|-- tags: array
| |-- element: struct
| | |-- key: string
| | |-- value: string
|-- members: array
| |-- element: struct
| | |-- id: long
| | |-- role: string
| | |-- type: string
जैसा कि आप देख सकते हैं, यहां सब कुछ सरल है। फिर हम निम्नलिखित करते हैं:
- हम Hfsop क्लस्टर पर hdfs dfs -put कमांड के साथ फाइल डालते हैं
- आइए हम हयू में कहते हैं और उपरोक्त डेटा के आधार पर एक स्कीमा / बेस और इसके लिए तीन टेबल बनाएं
- osm.nodes से सेलेक्ट का चयन करें, और परिणाम का आनंद लें।
एक छोटी सी बारीकियों: हाइव के हमारे संस्करण में (और संभवतः आपकी भी), यह Parquet की योजना के आधार पर तालिकाओं को बनाने में सक्षम नहीं है। आपको या तो उपरोक्त को CREATE TABLE में परिवर्तित करना होगा (जो कि सामान्य रूप से, मुश्किल नहीं है, और मैं इसे पाठकों के लिए एक घरेलू अभ्यास के रूप में छोड़ दूँगा), या थोड़ा पेचीदा काम करने के लिए: स्पार्क आरेख और डेटा को फर्श से पढ़ सकता है, और उनके आधार पर अस्थायी सारणी बना सकता है। । तो हम इस तरह से स्पार्क शेल में डेटा पढ़ सकते हैं:
val nodeDF = sqlContext.read.parquet("file:/tmp/osm/romania-latest.osm.pbf.node.parquet") nodeDF.createOrReplaceTempView("nodes")
तब आप पहले से ही LIKE नोड्स का उपयोग करके Hive में टेबल बना सकते हैं।
आलसी लोगों के लिए एक और टिप्पणी: लेखक के पास ऐसा अद्भुत
उदाहरण है , जिससे सामान्य तौर पर सब कुछ स्पष्ट हो जाता है (ठीक है, अगर आप स्पार्क के मालिक हैं)। यह बेशक स्पार्क शेल नहीं है, लेकिन डेटाब्रिक्स नोटबुक है, लेकिन मुझे एक कीबोर्ड को एक दूसरे से अनुवाद करने के लिए टैप करने में लगभग 15 मिनट लगे। और 30-40 मिनट में हाइव के लिए यह सब कुछ प्रश्नों के रूप में परिवर्तित करना संभव था, जो कुछ एनालॉग्स से अलग होते हैं जो स्पार्क से अलग होते हैं।
वास्तविक अनुरोध उदाहरण
हम इस डेटाबेस से इसके वर्तमान स्वरूप में क्या प्राप्त कर सकते हैं? सामान्य तौर पर, बहुत अधिक। यदि आपके पास एक हाइव या स्पार्क, स्थानिक फ्रेमवर्क, ज्योमेट्री एपीआई या एक विकल्प है, जो जियोस्पार्क हैं या उदाहरण के लिए जियोमेसा, तो आप इस आधार पर कई अलग-अलग समस्याओं को हल कर सकते हैं।
एक उदाहरण देखते हैं। अंकों के साथ काम करने का सबसे आसान तरीका। उदाहरण के लिए, उनके निर्देशांकों के साथ एटीएम की सूची प्राप्त करने के लिए एक क्वेरी इस प्रकार है:
select * from nodes where tags['amenity']='atm'
ऐसी क्वेरी का निर्माण कैसे करें, आप
विकी पर पेज को पढ़कर अनुमान लगा सकते हैं। वहां आप पाएंगे कि अन्य टैग क्या हैं, और उनमें से कुछ को आपके अनुरोध में शामिल किया जा सकता है *, इसके बजाय टैग के रूप में ['ऑपरेटर'], उदाहरण के लिए, बैंक का नाम दिखाने के लिए।
उसी पृष्ठ से यह निम्नानुसार है कि एटीएम मार्कअप टैग एमनिटी = बैंक और एटीएम = हां के रूप में संभव है। काश, ऐसी अस्पष्टता हर जगह OSM में होती।
यदि आप एक शुरुआत कर रहे हैं, और बस OSM से परिचित हो गए हैं, तो मैं अत्यधिक माहिर (विकी पर अच्छे उदाहरणों से)
बाईपास-टर्बो की सलाह देता हूं। यह एक उपकरण है जो आपको मानचित्र डेटा पर विभिन्न प्रकार की खोज करने की अनुमति देता है, दोनों ज्यामितीय स्थितियों और टैग के लिए शर्तों के साथ।
और पते कहां हैं?
अच्छा सवाल है। OSM में पते एड्र के साथ दिए गए मानचित्र तत्व हैं: * टैग, अर्थात्। addr के साथ शुरू। वर्णन आपको
यहाँ मिलेगा। सिद्धांत रूप में, सब कुछ जो मैंने ऊपर कहा है, यह जानकर, आप पहले से ही कुछ कार्य अनुरोध लिख सकते हैं:
select * from nodes where tags['addr:housenumber']!=null
हमारे यहाँ कौन-कौन सी समस्याएँ हैं? सबसे पहले, पते दोनों बिंदुओं पर रखे जाते हैं (उदाहरण के लिए, प्रवेश द्वार का निर्माण), और बहुभुज पर, अर्थात। तरीकों पर। इसलिए हमें अनुरोध को कम से कम डुप्लिकेट करना होगा। और दूसरी बात, उपरोक्त पृष्ठ पर, विकी को सादे पाठ में लिखा गया है कि शहर, क्षेत्र, क्षेत्र और देश को इंगित करने वाले टैग लगाने की अनुशंसा नहीं की गई है, लेकिन इसकी गणना ज्यामितीय रूप से की जानी चाहिए। यह कैसे करना है? सामान्य तौर पर, यह व्यावहारिक रूप से प्रकाश के संशोधनों के साथ रिवर्स जियोकोडिंग का कार्य है, और यह पिछले पोस्ट में वर्णित किया गया था।
यही है, सामान्य तौर पर, आपको प्रशासनिक सीमाओं को खोजने की जरूरत है, और उन सभी पतों के लिए जो उनके अंदर हैं, पते को क्षेत्र और उपरोक्त सभी चीजों में जोड़ें। प्रशासनिक संस्थाओं की सीमाओं को कैसे व्यवस्थित किया जाता है,
यहां वर्णित
है ।
सामान्य तौर पर, यह कार्य बहुत सरल नहीं है, लेकिन काफी हल करने योग्य है, और इसे जियोकोडिंग द्वारा हल नहीं किया जाता है, लेकिन आराम से वातावरण में, हमारे डेटाबेस में ओएसएम अपडेट डाउनलोड करके।
आगे क्या करना उपयोगी है
सिद्धांत रूप में, आप पहले से ही हमारे पास मौजूद नोड्स, तरीके और संबंधों की तालिकाओं के साथ काम कर सकते हैं, लेकिन योजना को थोड़ा बदलना बेहतर है, जिससे यह हाइव और स्पार्क के लिए अधिक उपयुक्त है। तथ्य यह है कि ओएसएम योजना पूरी तरह से सामान्यीकृत है, तरीकों और संबंधों में समन्वय बिल्कुल नहीं है। रास्ते के लिए बहुभुज बनाने के लिए, आपको नोड्स के साथ जुड़ने की आवश्यकता है। मैं इस ऑपरेशन को तुरंत करने की सलाह दूंगा, बहुभुजों को या तो संरचनाओं की एक सरणी के रूप में सहेजना (हाइव कम्पोजिट प्रकार सरणी, मैप और स्ट्रक्चर के साथ काम कर सकता है), या तुरंत, ज्यामिति वर्ग का, जैसा कि एक क्रमबद्ध प्रतिनिधित्व के रूप में कहा जा सकता है। यह कैसे करें यह लेखक पैराक्लाइज़र के उदाहरण में है।
आप चाहें तो संबंधों के स्तर पर एक समान ऑपरेशन दोहरा सकते हैं, लेकिन शायद ही इसके लायक हो। सबसे पहले, आपको हमेशा एक रिश्ते के सभी तत्वों की आवश्यकता नहीं होगी, और दूसरी बात, ओएसएम में स्वयं के संबंध बहुत छोटे हैं।
एवरो को कन्वर्टर
यहां एक और कनवर्टर है, इस बार एवरो प्रारूप में। और
यहां यह वर्णन किया गया है कि तैयार फाइलें कहां प्राप्त करें। मैंने आकारों को नहीं मापा, लेकिन मुझे लगता है कि प्रति ग्रह लगभग 15-20 फाइलें PBF के साथ तुलनीय होनी चाहिए। यही है, ये गीगाबाइट हैं, और बहुत सारे हैं।
कुछ निष्कर्ष
और जियोकोडिंग कहां है, आप पूछें? हां, नक्शे डाउनलोड करना और पते निकालना समग्र कार्य का हिस्सा है। मुझे उम्मीद है कि यह इस पर आता है।