Ảnh bạn chụp bằng điện thoại thông minh hoặc máy ảnh kỹ thuật số có siêu dữ liệu phong phú về thông tin bổ sung về ảnh. Họ lưu trữ siêu dữ liệu này ở định dạng gọi là EXIF, viết tắt của Định dạng tệp hình ảnh có thể trao đổi, có các phiên bản tiêu chuẩn khác nhau
Chương trình này đọc vị trí địa lý. GPS yêu cầu đường ngắm của các vệ tinh GPS hoạt động. Điều này có nghĩa là bạn cần phải ở trạng thái mở nếu không sẽ báo lỗi. Trong trường hợp như vậy, mạng có thể được sử dụng để lấy vị trí. Bạn nên chạy ứng dụng bản đồ yêu thích của mình để sửa vị trí của mình nếu bạn đang chạy ví dụ này lần đầu tiên
gps. py
nhập android droid = android. Android() người máy. startLocation() in "đang đọc GPS. " sự kiện = droid. eventWaitFor('vị trí',10000). kết quả nếu sự kiện ['tên'] == "địa điểm". cố gắng. lat = str(sự kiện['dữ liệu']['gps']['vĩ độ']) lng = str(sự kiện['dữ liệu']['gps']['kinh độ']) ngoại trừ KeyError. lat = str(sự kiện['dữ liệu']['mạng']['vĩ độ']) lng = str(sự kiện['dữ liệu']['mạng']['kinh độ']) latlng = 'lat. ' + lat + ' lng. ' + lng in latlng droid. dừngĐịnh vị()
giải thích mã
Khởi động GPS
sự kiện = droid. eventWaitFor('vị trí',10000). kết quả
Đợi tối đa 10000 mili giây để sự kiện vị trí xảy ra
lat = str(sự kiện['dữ liệu']['gps']['vĩ độ']) lng = str(sự kiện['dữ liệu']['gps']['kinh độ'])
Nhận thông tin lat và lng
Dừng GPS
mã địa lý
Mã địa lý trả về địa chỉ dựa trên thông tin vĩ độ và kinh độ. Thông tin về phương pháp mã địa lý có thể được tìm thấy trong. Bạn không cần khóa API GoogleMap nhưng phải có quyền truy cập mạng để khóa này hoạt động
Tiết lộ. Bài đăng này có thể chứa các liên kết liên kết, nghĩa là khi bạn nhấp vào liên kết và mua hàng, chúng tôi sẽ nhận được hoa hồng
Mã hóa địa lý là quá trình chuyển đổi mô tả về một vị trí (chẳng hạn như địa chỉ vật lý hoặc tên của một địa điểm) thành một cặp vĩ độ và kinh độ trên bề mặt Trái đất cho địa điểm đó
Nó cũng đề cập đến việc chuyển đổi tọa độ địa lý thành mô tả về một vị trí (chẳng hạn như địa chỉ); . Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách thực hiện cả hai với sự trợ giúp của thư viện GeoPy trong Python
Tuy nhiên, nếu bạn muốn định vị địa chỉ IP, thì hướng dẫn này là dành cho bạn
GeoPy là một ứng dụng khách Python cung cấp một số dịch vụ web mã hóa địa lý phổ biến;
Để bắt đầu, hãy cài đặt nó
pip3 install geopyGeoPy cung cấp nhiều trình bao bọc dịch vụ mã hóa địa lý, chẳng hạn như OpenStreetMap Nominatim, Google Geocoding API V3, Bing Maps, v.v. Trong hướng dẫn này, chúng tôi sẽ gắn bó với OpenStreetMap Nominatim
Đây là những gì chúng tôi sẽ đề cập
Nhận Vĩ độ và Kinh độ từ một Địa chỉ (Mã hóa địa lý)
Trong phần này, chúng tôi sẽ sử dụng OpenStreetMap Nominatim API để lấy vĩ độ và kinh độ từ một địa chỉ thực, thành phố hoặc bất kỳ tên vị trí nào
Hãy nhập thư viện trước
from geopy.geocoders import Nominatim import time from pprint import pprintLưu ý rằng chúng tôi đã chọn Trình mã hóa địa lý Nominatim, hiện đang tạo một phiên bản mới của nó
# instantiate a new Nominatim client app = Nominatim(user_agent="tutorial")Bây giờ, hãy thử lấy dữ liệu địa lý từ một địa chỉ
# get location raw data location = app.geocode("Nairobi, Kenya").raw # print raw data pprint(location)đầu ra
{'boundingbox': ['-1.444471', '-1.163332', '36.6509378', '37.1038871'], 'class': 'place', 'display_name': 'Nairobi, Kenya', 'icon': '//nominatim.openstreetmap.org/images/mapicons/poi_place_city.p.20.png', 'importance': 0.845026759433763, 'lat': '-1.2832533', 'licence': 'Data © OpenStreetMap contributors, ODbL 1.0. ' '//osm.org/copyright', 'lon': '36.8172449', 'osm_id': 9185096, 'osm_type': 'relation', 'place_id': 273942566, 'type': 'city'}Tuyệt vời, chúng tôi có vĩ độ tại thuộc tính from geopy.geocoders import Nominatim import time from pprint import pprint1 (trong đó chúng tôi có thể truy cập bằng from geopy.geocoders import Nominatim import time from pprint import pprint2) và kinh độ tại thuộc tính from geopy.geocoders import Nominatim import time from pprint import pprint3, chúng tôi cũng có quyền truy cập vào hộp giới hạn của địa chỉ tại thuộc tính from geopy.geocoders import Nominatim import time from pprint import pprint4
Như bạn có thể thấy, API Nominatim không yêu cầu địa chỉ đầy đủ (bao gồm đường phố, số nhà và thành phố), bạn cũng có thể chuyển địa chỉ doanh nghiệp và điểm bạn quan tâm, nó hỗ trợ điều đó
Tuy nhiên, nếu bạn gọi chức năng này nhiều lần (chẳng hạn như lặp lại danh sách địa chỉ), bạn sẽ gặp phải lỗi hết thời gian chờ và đó là bởi vì nếu bạn đọc Chính sách sử dụng chỉ định, nó yêu cầu bạn sử dụng tối đa 1 yêu cầu cho mỗi
Do đó, chức năng bên dưới tôn trọng yêu cầu đó và ngủ trong một giây trước khi đưa ra yêu cầu
def get_location_by_address(address): """This function returns a location as raw from an address will repeat until success""" time.sleep(1) try: return app.geocode(address).raw except: return get_location_by_address(address)Vì vậy, bất cứ khi nào xảy ra lỗi hết thời gian chờ, chúng tôi sẽ nắm bắt lỗi đó và gọi hàm theo cách đệ quy và hàm này sẽ ngủ thêm một giây nữa và hy vọng sẽ lấy được kết quả
address = "Makai Road, Masaki, Dar es Salaam, Tanzania" location = get_location_by_address(address) latitude = location["lat"] longitude = location["lon"] print(f"{latitude}, {longitude}") # print all returned data pprint(location)đầu ra
-6.7460493, 39.2750804 {'boundingbox': ['-6.7467061', '-6.7454602', '39.2741806', '39.2760514'], 'class': 'highway', 'display_name': 'Makai Road, Masaki, Msasani, Dar es-Salaam, Dar es Salaam, ' 'Coastal Zone, 2585, Tanzania', 'importance': 0.82, 'lat': '-6.7460493', 'licence': 'Data © OpenStreetMap contributors, ODbL 1.0. ' '//osm.org/copyright', 'lon': '39.2750804', 'osm_id': 23347726, 'osm_type': 'way', 'place_id': 89652779, 'type': 'residential'}Nhận địa chỉ từ Vĩ độ và Kinh độ (Mã hóa địa lý ngược)
Bây giờ để truy xuất địa chỉ, thành phố, quốc gia và nhiều thông tin khác, chỉ từ vĩ độ và kinh độ, chúng ta chỉ cần sử dụng phương thức from geopy.geocoders import Nominatim import time from pprint import pprint5 thay vì from geopy.geocoders import Nominatim import time from pprint import pprint6, phương thức này chấp nhận tọa độ (from geopy.geocoders import Nominatim import time from pprint import pprint7 và from geopy.geocoders import Nominatim import time from pprint import pprint8) dưới dạng một chuỗi được phân tách bằng dấu phẩy
Hàm sau đảo ngược tọa độ cùng với việc tôn trọng chính sách sử dụng Nominatim
def get_address_by_location(latitude, longitude, language="en"): """This function returns an address as raw from a location will repeat until success""" # build coordinates string to pass to reverse() function coordinates = f"{latitude}, {longitude}" # sleep for a second to respect Usage Policy time.sleep(1) try: return app.reverse(coordinates, language=language).raw except: return get_address_by_location(latitude, longitude)Vì vậy, chức năng này mong đợi vĩ độ và kinh độ làm tham số và trả về dữ liệu địa lý thô, đây là một cách sử dụng ví dụ
# define your coordinates latitude = 36.723 longitude = 3.188 # get the address info address = get_address_by_location(latitude, longitude) # print all returned data pprint(address)đầu ra
from geopy.geocoders import Nominatim import time from pprint import pprint0Vì vậy, điều này sẽ trả về tất cả dữ liệu địa chỉ, bao gồm tiểu bang, thị trấn, mã bưu điện, quận, v.v. Nếu bạn muốn trả lại thông tin này bằng một ngôn ngữ cụ thể, bạn có thể đặt tham số from geopy.geocoders import Nominatim import time from pprint import pprint9 thành ngôn ngữ bạn muốn hoặc bạn có thể đặt thành # instantiate a new Nominatim client app = Nominatim(user_agent="tutorial")0 cho ngôn ngữ mặc định cho vị trí cụ thể đó
Phần kết luận
Như mọi khi, chúng tôi chỉ xem các ví dụ đơn giản về những gì GeoPy có thể làm, tôi thực sự khuyên bạn nên đọc tài liệu nếu bạn quan tâm đến các tiện ích nâng cao hơn
Cuối cùng, nếu bạn là người mới bắt đầu và muốn học Python, tôi khuyên bạn nên tham gia khóa học Python For Everyone Coursera, trong đó bạn sẽ học được nhiều điều về Python. Bạn cũng có thể xem trang tài nguyên và khóa học của chúng tôi để xem các tài nguyên Python mà tôi đề xuất về các chủ đề khác nhau