लैट / लंबे निर्देशांक को देखते हुए, हम शहर / देश का पता कैसे लगा सकते हैं?


141

उदाहरण के लिए यदि हमारे पास ये निर्देशांक हैं

"latitude": 48.858844300000001,
"longitude": 2.2943506,

हम शहर / देश का पता कैसे लगा सकते हैं?


2
आपको शायद किसी प्रकार के डेटाबेस की आवश्यकता होगी। मैं स्वयं Google मैप्स API के साथ खेलने का प्रयास करूँगा ... यह lat / long का समर्थन करता है।
बीटगैम

जवाबों:


96

मुफ्त Google जियोकोडिंग एपीआई HTTP रेस्ट एपीआई के माध्यम से यह सेवा प्रदान करता है। ध्यान दें, एपीआई उपयोग और दर सीमित है , लेकिन आप असीमित उपयोग के लिए भुगतान कर सकते हैं।

आउटपुट का एक उदाहरण देखने के लिए इस लिंक को आज़माएं (यह JSON में है, आउटपुट XML में भी उपलब्ध है)

https://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=true


यह स्वीकार करते हुए क्योंकि यह एक मैं अंत के लिए जा रहा है :) माइकल का जवाब निश्चित रूप से एक बढ़िया विकल्प है!
यिंग

5
Google के रिवर्स जियोकोडिंग को केवल Google मानचित्र के साथ संयोजन में अनुमति दी जाती है। यदि आप ऐसा समाधान चाहते हैं जिसमें ऐसा कोई प्रतिबंध नहीं है (हालांकि यह वाणिज्यिक है और केवल अमेरिकी शहर हैं), तो बाहर की जाँच करें: askgeo.com
जेम्स डी

Mapquest api यहां एक और विकल्प है क्योंकि इसमें कुछ मामलों में कोई दर सीमा नहीं है और विभिन्न जियोकोडिंग आवश्यकताओं के लिए बहुत उच्च दर सीमाएं हैं।
टॉम

2
फ्री डिबेटेबल है, यह कुछ सीमाओं के तहत ही फ्री है।
पेटा

@JamesD: एपीआई नीतियां बताती हैं कि यदि आप किसी मानचित्र पर डेटा प्रदर्शित करते हैं, तो यह एक Google मानचित्र होना चाहिए, लेकिन आपको इसे किसी मानचित्र (या बिल्कुल) पर प्रदर्शित करने की आवश्यकता नहीं है।
user276648

173

एक अन्य विकल्प:

  • Http://download.geonames.org/export/dump/ से शहरों का डेटाबेस डाउनलोड करें
  • प्रत्येक शहर को एक लम्बे / लंबे समय के रूप में जोड़ें -> एक स्थानिक सूचकांक के लिए सिटी मैपिंग जैसे कि आर-ट्री (कुछ DBs की कार्यक्षमता भी है)
  • किसी भी बिंदु के लिए निकटतम शहर खोजने के लिए निकटतम-पड़ोसी खोज का उपयोग करें

लाभ:

  • उपलब्ध होने के लिए किसी बाहरी सर्वर पर निर्भर नहीं करता है
  • बहुत तेज़ (आसानी से प्रति सेकंड हजारों लुकअप करता है)

नुकसान:

  • स्वचालित रूप से अद्यतित नहीं है
  • अतिरिक्त कोड की आवश्यकता होती है यदि आप उस मामले को अलग करना चाहते हैं जहां निकटतम शहर दर्जनों मील दूर है
  • खंभे और अंतरराष्ट्रीय तिथि रेखा के पास अजीब परिणाम दे सकते हैं (हालांकि उन स्थानों में वैसे भी कोई शहर नहीं हैं

5
शहरों के भीतर के शहरों के लिए भी अजीब परिणाम देगा, उदाहरण के लिए रोम के कुछ स्थान "वेटिकन सिटी" लौटा सकते हैं - प्रत्येक के लिए डेटाबेस में निर्दिष्ट लैट / लोन के आधार पर।
नोएल अब्राहम

1
उनके पास एक REST एपीआई भी है और बहुत सभ्य दिखता है: api.geonames.org/…
jeudyx

8
एक उदाहरण अमूल्य होगा
हैक-आर

GeoNames भी एक नि: शुल्क वेब सेवा प्रदान करता है जो बस कमाल है!
मोंट डे

2020 में, GeoNames.org बहुत अधिक निष्क्रिय दिखता है, क्या कोई जानता है कि क्या यह वर्तमान है? समस्या कहीं नहीं है कि वे साइट पर अंतिम अद्यतन की तारीखों का उल्लेख करते हैं।
जॉयोटॉट ५:३२ बजे

45

आप की जरूरत है geopy

pip install geopy

और फिर:

from geopy.geocoders import Nominatim
geolocator = Nominatim()
location = geolocator.reverse("48.8588443, 2.2943506")

print(location.address)

अधिक जानकारी प्राप्त करने के लिए:

print (location.raw)

{'place_id': '24066644', 'osm_id': '2387784956', 'lat': '41.442115', 'lon': '-8.2939909', 'boundingbox': ['41.442015', '41.442215', '-8.2940909', '-8.2938909'], 'address': {'country': 'Portugal', 'suburb': 'Oliveira do Castelo', 'house_number': '99', 'city_district': 'Oliveira do Castelo', 'country_code': 'pt', 'city': 'Oliveira, São Paio e São Sebastião', 'state': 'Norte', 'state_district': 'Ave', 'pedestrian': 'Rua Doutor Avelino Germano', 'postcode': '4800-443', 'county': 'Guimarães'}, 'osm_type': 'node', 'display_name': '99, Rua Doutor Avelino Germano, Oliveira do Castelo, Oliveira, São Paio e São Sebastião, Guimarães, Braga, Ave, Norte, 4800-443, Portugal', 'licence': 'Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright'}

2
क्या इसकी कोई सीमाएं हैं? यह सबसे तेज़ तरीका है। @ माइकल के दृष्टिकोण पर इस का उपयोग न करने का कोई कारण हो सकता है?
शनि

1
अच्छी तरह से यह एक बाहरी सेवा की आवश्यकता है
maxbachmann

यह एक महान दृष्टिकोण है, हालाँकि मुझे सिर्फ काउंटियों की आवश्यकता है, इसलिए मुझे पते को परिष्कृत करने की आवश्यकता है। काश कोई ऐसा तरीका होता जो काउंटियों को वापस दे देता।
फतेमेह असगरिनजाद

22

एक ओपन सोर्स विकल्प ओपन स्ट्रीट मैप से नोमोटिम है। आपको बस एक URL में वेरिएबल्स को सेट करना है और यह उस स्थान के शहर / देश को लौटाता है। कृपया आधिकारिक दस्तावेज के लिए निम्नलिखित लिंक की जांच करें: Nominatim


3
ध्यान दें कि Nominatim उपयोग नीति संचालन .osmfoundation.org/policies/nominatim प्रति सेकंड एक अनुरोध की अधिकतम दर बताता है, इसलिए यह केवल तदर्थ प्रश्नों के लिए उपयुक्त है।
मैथ्यू वाइज

22

मैं एक समान कार्यक्षमता की खोज कर रहा था और मैंने पहले उत्तर पर साझा किए गए डेटा " http://download.geonames.org/export/dump/ " को देखा (साझा करने के लिए धन्यवाद, यह एक उत्कृष्ट स्रोत है), और आधारित सेवा को कार्यान्वित किया city1000.txt डेटा पर।

आप इसे चालू देख सकते हैं http://scatter-otl.rhcloud.com/location?lat=36&long=-78.9 (टूटा लिंक) बस अपने स्थानों के लिए अक्षांश और देशांतर बदलें।

यह OpenShift (RedHat Platform) पर तैनात है। लंबी निष्क्रिय अवधि के बाद पहली कॉल में कुछ समय लग सकता है, लेकिन आमतौर पर प्रदर्शन संतोषजनक होता है। आप की तरह इस सेवा का उपयोग करने के लिए स्वतंत्र महसूस हो रहा है ...

इसके अलावा, आप https://github.com/turgos/Location पर प्रोजेक्ट स्रोत पा सकते हैं ।


यह उचित रूप से काम नहीं करता है। यदि इसे शहर नहीं मिल सकता है तो यह एक निकटतम ज्ञात शहर की खोज करता है। यहाँ एक उदाहरण है: तितर-बितर.शर्क्लाउड.com/ ... यह "सेंट जॉन" के बजाय " बैसटर्रे " कहता है ...
smartmouse

1
यह सही है। एल्गोरिथ्म डेटासेट में उपलब्ध निकटतम शहर को खोजता है। ऊपर तैनात सर्वर के लिए, मैंने "city1000.txt" का उपयोग किया। इसमें केवल प्रमुख शहर हैं। स्रोत कोड github.com/turgos/Location पर उपलब्ध है । आप " download.geonames.org/export/dump " से अधिक विस्तृत डेटा के साथ अपनी शुरुआत कर सकते हैं ।
तुर्गोस

ऐसा लगता है कि city1000.txt अधिक विस्तृत डेटा उपलब्ध है। क्या मैं सही हू?
स्मार्टमाउस

8

मैंने जियोकोडर का उपयोग किया है , एक अच्छा पायथन पुस्तकालय है जो Google, जियोनाम, और ओपनवर्कमैप्स सहित कई प्रदाताओं का समर्थन करता है, बस कुछ का उल्लेख करने के लिए । मैंने जियोपी लाइब्रेरी का उपयोग करने की कोशिश की है, और यह अक्सर टाइमआउट हो जाता है। जियोनेम के लिए अपना खुद का कोड विकसित करना आपके समय का सबसे अच्छा उपयोग नहीं है और आप अस्थिर कोड प्राप्त कर सकते हैं। जियोकोडर मेरे अनुभव में उपयोग करने के लिए बहुत सरल है, और इसके पास पर्याप्त दस्तावेज हैं । नीचे अक्षांश और देशांतर से शहर देखने या शहर के नाम से अक्षांश / देशांतर खोजने के लिए कुछ नमूना कोड दिए गए हैं।

import geocoder

g = geocoder.osm([53.5343609, -113.5065084], method='reverse')
print g.json['city'] # Prints Edmonton

g = geocoder.osm('Edmonton, Canada')
print g.json['lat'], g.json['lng'] # Prints 53.5343609, -113.5065084

इसे साझा करने के लिए धन्यवाद, लेकिन यह सभी निर्देशांक के लिए काम नहीं करता है। क्या निर्देशांक की संख्या को विशिष्ट आकार में होना चाहिए?
फतेमेह असगरिनजाद

1
मेरा मानना ​​है कि मैंने देशांतर और अक्षांश को सही ढंग से चुना। मेरे पास हजारों निर्देशांक हैं जिनमें से एक यादृच्छिक समन्वय काम नहीं करता था। अब ठीक है। मैंने दूसरा तरीका इस्तेमाल किया। आपके प्रतिक्रिया के लिए धन्येवाद।
फतेमेह असगरिनजाद

1
स्वागत हे। यह जानने के लिए उत्सुक हैं कि आपके लिए किस दृष्टिकोण ने काम किया? यदि यह इससे बेहतर है geocoder, तो मैं इसे स्वयं भी आजमाना चाहूंगा!
हम्मन सैमुअल

1
मैंने इसका उपयोग किया: geopy.geocoders से Nominatim geolocator = Nominatim () स्थान = geolocator.reverse ("41.4721, -72.6311") प्रिंट (स्थान .address) आयात करें। यह संपूर्ण पता देता है और फिर मैं इससे काउंटी फ़िल्टर करता हूं।
फतेमेह असगरिनजाद

1
धन्यवाद, मैंने एक बड़े डेटासेट के साथ काम किया और 2017 में, जियोपी का उपयोग करके मुझे कई टाइमआउट मिले। हो सकता है कि 3 साल बाद उन्होंने अपने प्रतिबंधों में ढील दी हो, इसलिए यह जानना बहुत अच्छा है!
हम्मन सैमुअल

5

मैंने एक 30min के बारे में खर्च किया, जो जावास्क्रिप्ट में ऐसा करने का एक कोड उदाहरण खोजने की कोशिश कर रहा था। मुझे आपके द्वारा पोस्ट किए गए प्रश्न का त्वरित स्पष्ट उत्तर नहीं मिला। इसलिए मैंने अपना खुद का बना लिया। उम्मीद है कि लोग इसे एपीआई में खोदकर जाने के बिना उपयोग कर सकते हैं या कोड पर घूर सकते हैं कि उन्हें पता नहीं है कि कैसे पढ़ना है। हा अगर और कुछ नहीं तो मैं इस पोस्ट को अपने सामान के लिए संदर्भित कर सकता हूं .. अच्छा सवाल और चर्चा के मंच के लिए धन्यवाद!

यह Google API का उपयोग कर रहा है।

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?key=<YOURGOOGLEKEY>&sensor=false&v=3&libraries=geometry"></script>

//CHECK IF BROWSER HAS HTML5 GEO LOCATION
if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function (position) {

        //GET USER CURRENT LOCATION
        var locCurrent = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);

        //CHECK IF THE USERS GEOLOCATION IS IN AUSTRALIA
        var geocoder = new google.maps.Geocoder();
            geocoder.geocode({ 'latLng': locCurrent }, function (results, status) {
                var locItemCount = results.length;
                var locCountryNameCount = locItemCount - 1;
                var locCountryName = results[locCountryNameCount].formatted_address;

                if (locCountryName == "Australia") {
                    //SET COOKIE FOR GIVING
                    jQuery.cookie('locCountry', locCountryName, { expires: 30, path: '/' }); 
                }
        });
    }
}

5

मुझे पता है कि यह सवाल वास्तव में पुराना है, लेकिन मैं एक ही मुद्दे पर काम कर रहा हूं और मुझे reverse_geocoderअजय थंपी द्वारा बनाया गया एक अत्यंत कुशल और सुविधाजनक पैकेज मिला । यहां कोड उपलब्ध है । यह केडी पेड़ों के एक समानांतर कार्यान्वयन पर आधारित है जो बड़ी मात्रा में अंकों के लिए बेहद कुशल है (100,000 अंक प्राप्त करने में मुझे कुछ सेकंड लगे।

यह इस डेटाबेस पर आधारित है , जो पहले से ही @turgos द्वारा हाइलाइट किया गया है।

यदि आपका कार्य निर्देशांक की सूची के देश और शहर को जल्दी से ढूंढना है, तो यह एक महान उपकरण है।


3

यह वास्तव में इस बात पर निर्भर करता है कि आपके पास कौन से प्रौद्योगिकी प्रतिबंध हैं।

एक तरीका यह है कि आप जिन देशों और शहरों में रुचि रखते हैं, उनकी रूपरेखा के साथ एक स्थानिक डेटाबेस होना चाहिए। रूपरेखा से मेरा मतलब है कि देशों और शहरों को स्थानिक प्रकार के बहुभुज के रूप में संग्रहीत किया जाता है। आपके निर्देशांक के सेट को स्थानिक प्रकार बिंदु में परिवर्तित किया जा सकता है और देश / शहर का नाम प्राप्त करने के लिए बहुभुज के खिलाफ क्वियर किया जाता है जहां बिंदु स्थित है।

यहाँ कुछ डेटाबेस हैं जो स्थानिक प्रकार का समर्थन करते हैं: SQL सर्वर 2008 , MySQL , postGIS - postgreSQL और Oracle का विस्तार ।

यदि आप इसके लिए अपने स्वयं के डेटाबेस को रखने के बजाय किसी सेवा का उपयोग करना चाहते हैं तो आप याहू के जियोप्लेनेट का उपयोग कर सकते हैं । सेवा दृष्टिकोण के लिए आप इस उत्तर को gis.stackexchange.com पर देख सकते हैं , जो आपकी समस्या को हल करने के लिए सेवाओं की उपलब्धता को कवर करता है।


1

आप Google जियोकोडिंग एपीआई का उपयोग कर सकते हैं

Bellow php फंक्शन है जो Adress, City, State और Country को लौटाता है

public function get_location($latitude='', $longitude='')
{
    $geolocation = $latitude.','.$longitude;
    $request = 'http://maps.googleapis.com/maps/api/geocode/json?latlng='.$geolocation.'&sensor=false'; 
    $file_contents = file_get_contents($request);
    $json_decode = json_decode($file_contents);
    if(isset($json_decode->results[0])) {
        $response = array();
        foreach($json_decode->results[0]->address_components as $addressComponet) {
            if(in_array('political', $addressComponet->types)) {
                    $response[] = $addressComponet->long_name; 
            }
        }

        if(isset($response[0])){ $first  =  $response[0];  } else { $first  = 'null'; }
        if(isset($response[1])){ $second =  $response[1];  } else { $second = 'null'; } 
        if(isset($response[2])){ $third  =  $response[2];  } else { $third  = 'null'; }
        if(isset($response[3])){ $fourth =  $response[3];  } else { $fourth = 'null'; }
        if(isset($response[4])){ $fifth  =  $response[4];  } else { $fifth  = 'null'; }


        $loc['address']=''; $loc['city']=''; $loc['state']=''; $loc['country']='';
        if( $first != 'null' && $second != 'null' && $third != 'null' && $fourth != 'null' && $fifth != 'null' ) {
            $loc['address'] = $first;
            $loc['city'] = $second;
            $loc['state'] = $fourth;
            $loc['country'] = $fifth;
        }
        else if ( $first != 'null' && $second != 'null' && $third != 'null' && $fourth != 'null' && $fifth == 'null'  ) {
            $loc['address'] = $first;
            $loc['city'] = $second;
            $loc['state'] = $third;
            $loc['country'] = $fourth;
        }
        else if ( $first != 'null' && $second != 'null' && $third != 'null' && $fourth == 'null' && $fifth == 'null' ) {
            $loc['city'] = $first;
            $loc['state'] = $second;
            $loc['country'] = $third;
        }
        else if ( $first != 'null' && $second != 'null' && $third == 'null' && $fourth == 'null' && $fifth == 'null'  ) {
            $loc['state'] = $first;
            $loc['country'] = $second;
        }
        else if ( $first != 'null' && $second == 'null' && $third == 'null' && $fourth == 'null' && $fifth == 'null'  ) {
            $loc['country'] = $first;
        }
      }
      return $loc;
}

अगर मुझे केवल प्रशासनिक_कार्य_लेवल_ ३ या स्थानीयता चाहिए (यदि प्रशासनिक_कार्य_लेवल_ ३ उपलब्ध नहीं है), तो मुझे किसको संशोधित करना चाहिए? php के लिए नया ..
अगस्त

1

Loc2country एक गोलांग आधारित उपकरण है जो दिए गए स्थान निर्देशांक (lat / lon) के लिए ISO अल्फा -3 देश कोड देता है। यह माइक्रोसेकंड में प्रतिक्रिया करता है। यह देश के नक्शे के लिए एक geohash का उपयोग करता है।

जियोहेप्टर का उपयोग करके जियोहैश डेटा उत्पन्न होता है

हम इस उपकरण के लिए स्तर 6 पर जियोहैश का उपयोग करते हैं, अर्थात, आकार 1.2 किमी x 600 मीटर के बक्से।


1

पुस्तकालयों की मात्रा कम से कम करें।

अपनी वेबसाइट पर एपी का उपयोग करने के लिए एक कुंजी प्राप्त करें और बस http अनुरोध में परिणाम प्राप्त करें:

कर्ल-आई-एच "कुंजी: Your_KEY" -X https://api.latlong.dev/lookup?lat=38.7447913&long=-9.1625173


0

कृपया नीचे दिए गए उत्तर की जाँच करें। इससे मेरा काम बनता है

if(navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(position){

        initialize(position.coords.latitude,position.coords.longitude);
    }); 
}

function initialize(lat,lng) {
    //directionsDisplay = new google.maps.DirectionsRenderer(rendererOptions);
    //directionsService = new google.maps.DirectionsService();
    var latlng = new google.maps.LatLng(lat, lng);

    //alert(latlng);
    getLocation(latlng);
}

function getLocation(latlng){

    var geocoder = new google.maps.Geocoder();
    geocoder.geocode({'latLng': latlng}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                if (results[0]) {
                    var loc = getCountry(results);
                    alert("location is::"+loc);
                }
            }
        });

}

function getCountry(results)
{
    for (var i = 0; i < results[0].address_components.length; i++)
    {
        var shortname = results[0].address_components[i].short_name;
        var longname = results[0].address_components[i].long_name;
        var type = results[0].address_components[i].types;
        if (type.indexOf("country") != -1)
        {
            if (!isNullOrWhitespace(shortname))
            {
                return shortname;
            }
            else
            {
                return longname;
            }
        }
    }

}

function isNullOrWhitespace(text) {
    if (text == null) {
        return true;
    }
    return text.replace(/\s/gi, '').length < 1;
}

0

यदि आप Google के स्थान API का उपयोग कर रहे हैं, तो यह है कि आप जावास्क्रिप्ट का उपयोग करके ऑब्जेक्ट ऑब्जेक्ट से देश और शहर कैसे प्राप्त कर सकते हैं:

function getCityAndCountry(location) {
  var components = {};
  for(var i = 0; i < location.address_components.length; i++) {
    components[location.address_components[i].types[0]] = location.address_components[i].long_name;
  }

  if(!components['country']) {
    console.warn('Couldn\'t extract country');
    return false;
  }

  if(components['locality']) {
    return [components['locality'], components['country']];
  } else if(components['administrative_area_level_1']) {
    return [components['administrative_area_level_1'], components['country']];
  } else {
    console.warn('Couldn\'t extract city');
    return false;
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.