ตัวอย่างเช่นถ้าเรามีชุดพิกัดเหล่านี้
"latitude": 48.858844300000001,
"longitude": 2.2943506,
เราจะทราบเมือง / ประเทศได้อย่างไร?
ตัวอย่างเช่นถ้าเรามีชุดพิกัดเหล่านี้
"latitude": 48.858844300000001,
"longitude": 2.2943506,
เราจะทราบเมือง / ประเทศได้อย่างไร?
คำตอบ:
Google Geocoding APIฟรีให้บริการนี้ผ่าน HTTP REST API หมายเหตุ API คือการใช้งานและอัตราที่ จำกัดแต่คุณสามารถชำระเงินได้โดยไม่ จำกัด การเข้าถึง
ลองลิงค์นี้เพื่อดูตัวอย่างของเอาต์พุต (นี่คือ json เอาต์พุตยังมีอยู่ใน XML)
https://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=true
ตัวเลือกอื่น:
ข้อดี:
ข้อเสีย:
คุณต้องการ 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'}
ทางเลือกโอเพ่นซอร์สคือ Nominatim จาก Open Street Map สิ่งที่คุณต้องทำคือตั้งค่าตัวแปรใน URL และส่งคืนเมือง / ประเทศของสถานที่นั้น กรุณาตรวจสอบลิงค์ต่อไปนี้สำหรับเอกสารอย่างเป็นทางการ: Nominatim
ฉันกำลังค้นหาฟังก์ชั่นที่คล้ายกันและฉันเห็นข้อมูล " http://download.geonames.org/export/dump/ " แบ่งปันเมื่อตอบกลับก่อนหน้านี้ (ขอบคุณสำหรับการแบ่งปันมันเป็นแหล่งที่ยอดเยี่ยม) และใช้บริการตาม บนข้อมูลเมืองต่างๆ 1000.txt
คุณสามารถเห็นมันทำงานที่
http://scatter-otl.rhcloud.com/location?lat=36&long=-78.9 (ลิงค์เสีย)
เพียงแค่เปลี่ยนละติจูดและลองจิจูดสำหรับตำแหน่งของคุณ
มันถูกปรับใช้บน OpenShift (แพลตฟอร์ม RedHat) การโทรครั้งแรกหลังจากใช้งานเป็นเวลานานอาจใช้เวลานาน แต่โดยทั่วไปแล้วประสิทธิภาพการทำงานจะเป็นที่น่าพอใจ รู้สึกอิสระที่จะใช้บริการนี้ตามที่คุณต้องการ ...
นอกจากนี้คุณสามารถหาแหล่งที่มาของโครงการที่ https://github.com/turgos/Location
ฉันใช้Geocoderห้องสมุด Python ที่ดีที่รองรับผู้ให้บริการหลายรายรวมถึง Google, Geonames และ OpenStreetMaps เพื่อพูดถึงเพียงไม่กี่แห่ง ฉันพยายามใช้ห้องสมุด GeoPy และมันมักจะได้รับการหมดเวลา การพัฒนารหัสของคุณเองสำหรับ GeoNames ไม่ใช่การใช้เวลาให้เกิดประโยชน์สูงสุดและคุณอาจได้รับรหัสที่ไม่เสถียร Geocoder เป็นเรื่องง่ายมากที่จะใช้ในประสบการณ์ของฉันและมีดีพอที่เอกสาร ด้านล่างนี้คือตัวอย่างโค้ดสำหรับค้นหาเมืองตามละติจูดและลองจิจูดหรือค้นหาละติจูด / ลองจิจูดตามชื่อเมือง
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
geocoder
ฉันก็อยากจะลองด้วยตัวเอง!
ฉันใช้เวลาประมาณ 30 นาทีในการพยายามหาตัวอย่างโค้ดของวิธีการทำสิ่งนี้ใน Javascript ฉันไม่พบคำตอบที่ชัดเจนสำหรับคำถามที่คุณโพสต์ ดังนั้น ... ฉันทำเอง หวังว่าผู้คนสามารถใช้สิ่งนี้ได้โดยไม่ต้องไปขุดลงใน API หรือจ้องที่โค้ดพวกเขาไม่รู้จะอ่านอย่างไร ฮ่าถ้าไม่มีอะไรอื่นฉันสามารถอ้างอิงโพสต์นี้สำหรับเนื้อหาของตัวเอง .. คำถามที่ดีและขอบคุณสำหรับฟอรัมการสนทนา
นี่คือการใช้ 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: '/' });
}
});
}
}
ฉันรู้ว่าคำถามนี้เก่ามาก แต่ฉันทำงานในประเด็นเดียวกันและฉันพบแพ็คเกจที่มีประสิทธิภาพและสะดวกมากreverse_geocoder
ซึ่งสร้างโดย Ajay Thampi รหัสที่มีอยู่ที่นี่ มันขึ้นอยู่กับการใช้งานต้นไม้ของ KD ซึ่งขนานกันซึ่งมีประสิทธิภาพอย่างมากสำหรับคะแนนจำนวนมาก (ใช้เวลาไม่กี่วินาทีในการรับ 100,000 คะแนน
มันขึ้นอยู่กับฐานข้อมูลนี้แล้วเน้นโดย @turgos
หากงานของคุณคือการค้นหาประเทศและเมืองของรายการพิกัดอย่างรวดเร็วนี่เป็นเครื่องมือที่ยอดเยี่ยม
มันขึ้นอยู่กับข้อ จำกัด ของเทคโนโลยีที่คุณมี
วิธีหนึ่งคือการมีฐานข้อมูลเชิงพื้นที่ที่มีโครงร่างของประเทศและเมืองที่คุณสนใจโดยเค้าโครงฉันหมายความว่าประเทศและเมืองจะถูกจัดเก็บเป็นรูปหลายเหลี่ยมประเภทเชิงพื้นที่ ชุดพิกัดของคุณสามารถแปลงเป็นจุดประเภทเชิงพื้นที่และสอบถามกับรูปหลายเหลี่ยมเพื่อให้ได้ชื่อประเทศ / เมืองที่เป็นจุดที่ตั้ง
นี่คือบางส่วนของฐานข้อมูลซึ่งสนับสนุนชนิดอวกาศ: เซิร์ฟเวอร์ SQL 2008 , MySQL , PostGIS - นามสกุลของ PostgreSQL และออราเคิล
หากคุณต้องการที่จะใช้บริการในสถานที่ของการมีฐานข้อมูลของคุณเองสำหรับนี้คุณสามารถใช้ของ Yahoo GeoPlanet สำหรับวิธีการบริการที่คุณอาจต้องการตรวจสอบคำตอบนี้ในgis.stackexchange.comซึ่งครอบคลุมความพร้อมของบริการสำหรับการแก้ปัญหาของคุณ
คุณสามารถใช้ Google Geocoding API
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;
}
Loc2countryเป็นเครื่องมือที่ใช้ Golang ซึ่งส่งคืนรหัสประเทศ ISO alpha-3 สำหรับพิกัดตำแหน่งที่กำหนด (lat / lon) มันตอบสนองในไมโครวินาที มันใช้ geohash กับแผนที่ประเทศ
ข้อมูล geohash ถูกสร้างขึ้นโดยใช้georaptor
เราใช้ geohash ที่ระดับ 6 สำหรับเครื่องมือนี้เช่นกล่องขนาด 1.2km x 600m
ลดจำนวนไลบรารี
รับรหัสเพื่อใช้ API ที่เว็บไซต์ของพวกเขาและเพียงรับผลลัพธ์ในคำขอ http:
คีย์ -l -i -H ": YOUR_KEY" -X รับhttps://api.latlong.dev/lookup?lat=38.7447913&long=-9.1625173
กรุณาตรวจสอบคำตอบด้านล่าง มันใช้งานได้สำหรับฉัน
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;
}
หากคุณใช้ Google Places ของ API นี่คือวิธีที่คุณจะได้รับประเทศและเมืองจากวัตถุสถานที่โดยใช้ Javascript:
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;
}
}