You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在PyQt5组件中打开OSM?如何通过OpenStreetMap获取指定地点经纬度?

Hey there! Let's break down your two PyQt5 + OpenStreetMap questions with free, straightforward solutions—no paid Google Maps required.

问题1:在PyQt5组件中打开OpenStreetMap

The easiest way to embed OSM in a PyQt5 app is using PyQtWebEngine, which lets you load and interact with web content directly in your Qt window. Here's a complete example:

First, make sure you have the required packages installed:

pip install pyqt5 pyqtwebengine

Then the code:

from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtWebEngineWidgets import QWebEngineView
import sys

class OSMViewer(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("OpenStreetMap in PyQt5")
        self.setGeometry(100, 100, 800, 600)
        
        # Create a web view to load OSM
        self.web_view = QWebEngineView()
        # Load OSM homepage, or specify a default location (e.g., Beijing with zoom level 10)
        self.web_view.load("https://www.openstreetmap.org/#map=10/39.9042/116.4074")
        self.setCentralWidget(self.web_view)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = OSMViewer()
    window.show()
    sys.exit(app.exec_())

This code creates a main window with a web view that loads the OSM website. You can tweak the URL to set a default map position, zoom level, or even add markers if you need more customization.

问题2:借助OpenStreetMap获取指定地点的经纬度

For this, we'll use Nominatim—OSM's free geocoding API that doesn't require an API key (just follow their usage policies, like limiting requests to 1 per second and setting a proper User-Agent).

First, install the requests library to handle API calls:

pip install requests

Here's a PyQt5 app that lets you input a location and fetch its coordinates:

from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, 
                             QLineEdit, QPushButton, QLabel)
import requests
import sys

class GeoLocator(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Get Lat/Lon from OSM")
        self.setGeometry(100, 100, 400, 200)
        
        # Set up UI elements
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        layout = QVBoxLayout(central_widget)
        
        self.place_input = QLineEdit()
        self.place_input.setPlaceholderText("Enter a location (e.g., Tiananmen Square, Beijing)")
        layout.addWidget(self.place_input)
        
        self.get_btn = QPushButton("Fetch Coordinates")
        self.get_btn.clicked.connect(self.fetch_coordinates)
        layout.addWidget(self.get_btn)
        
        self.result_label = QLabel("Latitude and longitude will appear here")
        layout.addWidget(self.result_label)
        
    def fetch_coordinates(self):
        place = self.place_input.text().strip()
        if not place:
            self.result_label.setText("Please enter a location first!")
            return
            
        # Call Nominatim API
        url = "https://nominatim.openstreetmap.org/search"
        params = {
            "q": place,
            "format": "json",
            "limit": 1,  # Only return the top match
            "addressdetails": 0  # Skip extra address data to reduce response size
        }
        # Set a custom User-Agent (required by Nominatim to identify your app)
        headers = {
            "User-Agent": "PyQt5GeoLocator/1.0 (your-email@example.com)"
        }
        
        try:
            response = requests.get(url, params=params, headers=headers)
            response.raise_for_status()  # Raise error if request fails
            data = response.json()
            
            if data:
                lat = data[0]["lat"]
                lon = data[0]["lon"]
                self.result_label.setText(f"Latitude: {lat}\nLongitude: {lon}")
            else:
                self.result_label.setText("Location not found—check your input!")
                
        except requests.exceptions.RequestException as e:
            self.result_label.setText(f"Request failed: {str(e)}")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = GeoLocator()
    window.show()
    sys.exit(app.exec_())

Notes for Nominatim usage:

  • Always set a unique User-Agent with your contact info—this helps OSM maintainers reach you if there are issues with your requests.
  • Avoid making too many rapid requests (stick to 1 per second max) to avoid being blocked.

内容的提问来源于stack exchange,提问作者YouRos

火山引擎 最新活动