百度地圖和高德地圖的側重點不太一樣。同樣一個地名,在百度地圖網站上搜索到的地點可能是商業網點,在高德地圖網站上搜索到的地點可能是自然行政地點。
高德地圖api
在高德地圖中,搜索地名,如“亂石頭川”,該地名會出現這樣的鏈接
https://ditu.amap.com/place/B0FFGXCDLJ?
這個高德地圖連接中最后的“B0FFGXCDLJ”是什么意思?如何轉化為經緯度坐標
在高德地圖的鏈接中,B0FFGXCDLJ
是一個 地點的唯一標識符(POI ID),用于標識地圖上的某個特定地點。它并不是直接的經緯度信息,而是高德地圖內部用于定位和檢索地點的編碼。
如何將 POI ID 轉換為經緯度坐標
要將 POI ID 轉換為經緯度坐標,可以通過高德地圖的 API 來實現。高德地圖提供了豐富的API接口,其中 地理編碼API 和 逆地理編碼API 可以用于查詢地點的詳細信息,包括經緯度。
以下是一個使用 Python 和高德地圖API將 POI ID 轉換為經緯度坐標的示例代碼:
import requests# 高德地圖API的Key(需要在高德地圖開放平臺申請)
AMAP_API_KEY = "你的API_KEY"# POI ID
poi_id = "B0FFGXCDLJ"# 高德地圖的POI詳情查詢API
url = f"https://www.amap.com/detail/get/{poi_id}"# 發起請求
response = requests.get(url, params={"key": AMAP_API_KEY})
data = response.json()# 解析經緯度信息
if data.get("status") == "1" and data.get("info") == "OK":location = data["data"]["spec"]["location"]longitude, latitude = map(float, location.split(","))print(f"提取的經緯度信息:經度 = {longitude}, 緯度 = {latitude}")
else:print("無法獲取經緯度信息,請檢查POI ID或API Key是否正確。")
代碼說明
API Key:需要在高德地圖開放平臺(https://lbs.amap.com/)注冊賬號并申請一個API Key。
API 請求:通過 https://www.amap.com/detail/get/{poi_id} 接口查詢POI的詳細信息。
解析數據:從返回的JSON數據中提取經緯度信息。location 字段通常包含經緯度,格式為“經度,緯度”。
?在高德開放平臺中,有如下功能。
坐標拾取器 | 高德地圖API
示例運行
假設你已經申請了API Key并將其替換到代碼中的 AMAP_API_KEY,運行代碼后,輸出結果可能如下:
提取的經緯度信息:經度 = 116.397428, 緯度 = 39.90923
注意事項
API Key 限制:高德地圖API Key有調用次數限制,免費額度通常足夠個人使用,但大量請求可能需要付費。
數據準確性:返回的經緯度信息是高德地圖數據庫中的數據,可能與實際位置有細微偏差。
錯誤處理:在實際使用中,建議添加更詳細的錯誤處理邏輯,以應對網絡請求失敗、API Key無效等情況。
在拾取經緯點的時候,要選擇合適的城市,防止異地重名。如下所示:
高德地圖的坐標系是基于GCJ-02(火星坐標系),而WGS-84是國際上常用的地理坐標系。將高德地圖的坐標轉換為WGS-84坐標需要進行坐標轉換。以下是一個簡單的Python代碼示例,使用了pyproj庫來完成坐標轉換。
坐標系的差異:高德地圖的坐標系(GCJ-02)和WGS-84坐標系存在一定的偏差。簡單的投影轉換可能無法完全消除這種偏差,尤其是在高精度要求的場景中。
更精確的轉換:如果需要更精確的轉換,可以考慮使用專門的算法(如高斯投影反算)或調用高德地圖提供的API進行轉換。
代碼如下:
import math
# 定義常量
PI = math.pi
A = 6378245.0
EE = 0.00669342162296594323
X_PI = PI * 3000.0 / 180.0def transformlat(lng, lat):ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng))ret += (20.0 * math.sin(6.0 * lng * PI) + 20.0 * math.sin(2.0 * lng * PI)) * 2.0 / 3.0ret += (20.0 * math.sin(lat * PI) + 40.0 * math.sin(lat / 3.0 * PI)) * 2.0 / 3.0ret += (160.0 * math.sin(lat / 12.0 * PI) + 320 * math.sin(lat * PI / 30.0)) * 2.0 / 3.0return retdef transformlng(lng, lat):ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))ret += (20.0 * math.sin(6.0 * lng * PI) + 20.0 * math.sin(2.0 * lng * PI)) * 2.0 / 3.0ret += (20.0 * math.sin(lng * PI) + 40.0 * math.sin(lng / 3.0 * PI)) * 2.0 / 3.0ret += (150.0 * math.sin(lng / 12.0 * PI) + 300.0 * math.sin(lng / 30.0 * PI)) * 2.0 / 3.0return retdef out_of_china(lng, lat):return not (73.66 < lng < 135.05 and 3.86 < lat < 53.55)def gcj02_to_wgs84(gcj_lng, gcj_lat):if out_of_china(gcj_lng, gcj_lat):return gcj_lng, gcj_lat # 不在中國范圍內,直接返回原坐標dlat = transformlat(gcj_lng - 105.0, gcj_lat - 35.0)dlng = transformlng(gcj_lng - 105.0, gcj_lat - 35.0)radlat = gcj_lat / 180.0 * PImagic = math.sin(radlat)magic = 1 - EE * magic * magicsqrtmagic = math.sqrt(magic)dlat = (dlat * 180.0) / ((A * (1 - EE)) / (magic * sqrtmagic) * PI)dlng = (dlng * 180.0) / (A / sqrtmagic * math.cos(radlat) * PI)mglat = gcj_lat + dlatmglng = gcj_lng + dlngwgs84_lng = gcj_lng * 2 - mglngwgs84_lat = gcj_lat * 2 - mglatreturn wgs84_lng, wgs84_lat# 示例:高德地圖的經緯度
while True:gcInfo=input("請輸入高德坐標信息:")gcList=gcInfo.split(",")gcj_lng = float(gcList[0]) # 經度gcj_lat = float(gcList[1]) # 緯度# 轉換為WGS-84坐標wgs84_lng, wgs84_lat = gcj02_to_wgs84(gcj_lng, gcj_lat)print(f"高德地圖坐標(GCJ-02): 經度={gcj_lng}, 緯度={gcj_lat}")print(f"WGS-84坐標: 經度={wgs84_lng}, 緯度={wgs84_lat}")
即可完成。
百度地圖api
百度地圖點線面查詢 api ?huiyan,網站如下:
https://huiyan.baidu.com/github/tools/coord/
在該網站上,可以選擇一個點,然后知道其經緯度坐標和墨卡托坐標。
但是需要注意如下:
# ?* 各地圖API坐標系統比較與轉換;
# ?* WGS84坐標系:即地球坐標系,國際上通用的坐標系。設備一般包含GPS芯片或者北斗芯片獲取的經緯度為WGS84地理坐標系,
# ?* 谷歌地圖采用的是WGS84地理坐標系(中國范圍除外);
# ?* GCJ02坐標系:即火星坐標系,是由中國國家測繪局制訂的地理信息系統的坐標系統。由WGS84坐標系經加密后的坐標系。谷歌中國地圖和搜搜中國地圖采用的是GCJ02地理坐標系;?
# ?* 3BD09坐標系:即百度坐標系,GCJ02坐標系經加密后的坐標系;
所以,要想把百度地圖上的經緯度點轉換為Arcgis底圖中的坐標點,還需要進行解密,將3BD09坐標系的坐標位置還原為WGS84地理坐標系的坐標位置。代碼如下
import math
from decimal import *# -*- coding: utf-8 -*-
# /**
# * 各地圖API坐標系統比較與轉換;
# * WGS84坐標系:即地球坐標系,國際上通用的坐標系。設備一般包含GPS芯片或者北斗芯片獲取的經緯度為WGS84地理坐標系,
# * 谷歌地圖采用的是WGS84地理坐標系(中國范圍除外);
# * GCJ02坐標系:即火星坐標系,是由中國國家測繪局制訂的地理信息系統的坐標系統。由WGS84坐標系經加密后的坐標系。谷歌中國地圖和搜搜中國地圖采用的是GCJ02地理坐標系;
# * 3BD09坐標系:即百度坐標系,GCJ02坐標系經加密后的坐標系;
# */
import math
from decimal import *class transfer:def __init__(self,key=None):self.a=6378245.0self.ee=Decimal(0.00669342162296594323)def transformLng(self,x,y):ret=Decimal()ret = 300.0+x+2.0*y+0.1*x*x+0.1*x*y+0.1*math.sqrt(math.fabs(x))ret += (20.0 * math.sin(6.0 * x * math.pi) + 20.0 * math.sin(2.0 * x * math.pi)) * 2.0 / 3.0ret += (20.0 * math.sin(x * math.pi) + 40.0 * math.sin(x / 3.0 * math.pi)) * 2.0 / 3.0ret += (150.0 * math.sin(x / 12.0 * math.pi) + 300.0 * math.sin(x / 30.0* math.pi)) * 2.0 / 3.0return retdef transformLat(self,x,y):ret = Decimal()ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y+ 0.2 * math.sqrt(math.fabs(x))ret += (20.0 * math.sin(6.0 * x * math.pi) + 20.0 * math.sin(2.0 * x * math.pi)) * 2.0 / 3.0ret += (20.0 * math.sin(y * math.pi) + 40.0 * math.sin(y / 3.0 * math.pi)) * 2.0 / 3.0ret += (160.0 * math.sin(y / 12.0 * math.pi) + 320 * math.sin(y * math.pi / 30.0)) * 2.0 / 3.0return retdef transfrom(self,lng,lat):dLat = self.transformLat(lng - 105.0, lat - 35.0)dLng = self.transformLng(lng - 105.0, lat - 35.0)radLat = lat / 180.0 * math.pimagic = math.sin(radLat)magic = 1 - self.ee * Decimal(magic) * Decimal(magic)sqrtMagic = math.sqrt(magic)dLat = Decimal((dLat * 180.0)) / ((Decimal(self.a) * (1 - self.ee)) / (Decimal(magic) * Decimal(sqrtMagic)) * Decimal(math.pi))dLng = (dLng * 180.0) / (self.a / sqrtMagic * math.cos(radLat) * math.pi)mgLat = lat + float(dLat)mgLng = lng + dLngreturn mgLng,mgLat#gps坐標轉換為gcj02坐標系def wg84_to_gcj02(self,wg84_lng,wg84_lat):dLat=self.transformLat(wg84_lng-105.0,wg84_lat-35.0)dLng=self.transformLng(wg84_lng-105.0,wg84_lat-35.0)radLat = wg84_lat / 180.0 * math.pimagic = math.sin(radLat)magic = 1 - self.ee * Decimal(magic) * Decimal(magic)sqrtMagic = math.sqrt(magic)dLat = Decimal((dLat * 180.0)) / ((Decimal(self.a) * (1 - self.ee)) / (Decimal(magic) * Decimal(sqrtMagic)) * Decimal(math.pi))dLng = (dLng * 180.0) / (self.a / sqrtMagic * math.cos(radLat) * math.pi)gcj02Lat = wg84_lat + float(dLat)gcj02Lng = wg84_lng + dLngreturn gcj02Lng,gcj02Lat#gcj02坐標轉百度坐標def gcj02_to_bd09(self,gcj02_lng,gcj02_lat):x = gcj02_lngy = gcj02_latz = math.sqrt(x * x + y * y) + 0.00002 * math.sin(y * math.pi)theta = math.atan2(y, x) + 0.000003 * math.cos(x * math.pi)bd09_Lng = z * math.cos(theta) + 0.0065bd09_Lat = z * math.sin(theta) + 0.006return bd09_Lng,bd09_Lat#wg84坐標轉百度坐標def wg84_to_bd09(self,wg84_lng,wg84_lat):gcj02lng,gcj02lat=self.wg84_to_gcj02(wg84_lng,wg84_lat)return self.gcj02_to_bd09(gcj02lng,gcj02lat)#百度坐標轉GCJ02坐標def bd09_to_gcj02(self,bd09_lng,bd09_lat):x = bd09_lng - 0.0065y = bd09_lat - 0.006z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * math.pi)theta = math.atan2(y, x) - 0.000003 * math.cos(x * math.pi)gcj02_lng = z * math.cos(theta)gcj02_lat = z * math.sin(theta)return gcj02_lng,gcj02_lat#GCJ坐標轉WG84坐標def gcj02_to_wg84(self,gcj02_lng,gcj02_lat):mlng,mlat=self.transfrom(gcj02_lng,gcj02_lat)wg84_Lng=gcj02_lng*2-mlngwg84_Lat=gcj02_lat*2-mlatreturn wg84_Lng,wg84_Lat#將百度坐標轉WG84坐標def bd09_to_wg84(self,bd09_lng,bd09_lat):gcj02_lng, gcj02_lat=self.bd09_to_gcj02(bd09_lng,bd09_lat)return self.gcj02_to_wg84(gcj02_lng,gcj02_lat)tr=transfer()
#測試,轉換正確#循環輸入坐標信息
while True:xyInfo=input("請輸入百度坐標信息:")xyList=xyInfo.split(",")bd09_lng=float(xyList[0])bd09_lat=float(xyList[1])#輸出 百度坐標轉WG84坐標print("百度坐標信息:")print(bd09_lng)print(bd09_lat)print("WGS坐標信息")print(tr.bd09_to_wg84(bd09_lng,bd09_lat)[0])print(tr.bd09_to_wg84(bd09_lng,bd09_lat)[1])print()
即可轉換完成。
綜合代碼
根據以上分析,總的代碼如下:
choice=input("請選擇高德坐標G 或者百度坐標B:")
choice=choice.upper()
if choice=="B":import mathfrom decimal import *# -*- coding: utf-8 -*-# /**# * 各地圖API坐標系統比較與轉換;# * WGS84坐標系:即地球坐標系,國際上通用的坐標系。設備一般包含GPS芯片或者北斗芯片獲取的經緯度為WGS84地理坐標系,# * 谷歌地圖采用的是WGS84地理坐標系(中國范圍除外);# * GCJ02坐標系:即火星坐標系,是由中國國家測繪局制訂的地理信息系統的坐標系統。由WGS84坐標系經加密后的坐標系。谷歌中國地圖和搜搜中國地圖采用的是GCJ02地理坐標系; # * 3BD09坐標系:即百度坐標系,GCJ02坐標系經加密后的坐標系;# */import mathfrom decimal import *class transfer:def __init__(self,key=None):self.a=6378245.0self.ee=Decimal(0.00669342162296594323)def transformLng(self,x,y):ret=Decimal()ret = 300.0+x+2.0*y+0.1*x*x+0.1*x*y+0.1*math.sqrt(math.fabs(x))ret += (20.0 * math.sin(6.0 * x * math.pi) + 20.0 * math.sin(2.0 * x * math.pi)) * 2.0 / 3.0ret += (20.0 * math.sin(x * math.pi) + 40.0 * math.sin(x / 3.0 * math.pi)) * 2.0 / 3.0ret += (150.0 * math.sin(x / 12.0 * math.pi) + 300.0 * math.sin(x / 30.0* math.pi)) * 2.0 / 3.0return retdef transformLat(self,x,y):ret = Decimal()ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y+ 0.2 * math.sqrt(math.fabs(x))ret += (20.0 * math.sin(6.0 * x * math.pi) + 20.0 * math.sin(2.0 * x * math.pi)) * 2.0 / 3.0ret += (20.0 * math.sin(y * math.pi) + 40.0 * math.sin(y / 3.0 * math.pi)) * 2.0 / 3.0ret += (160.0 * math.sin(y / 12.0 * math.pi) + 320 * math.sin(y * math.pi / 30.0)) * 2.0 / 3.0return retdef transfrom(self,lng,lat):dLat = self.transformLat(lng - 105.0, lat - 35.0)dLng = self.transformLng(lng - 105.0, lat - 35.0)radLat = lat / 180.0 * math.pimagic = math.sin(radLat)magic = 1 - self.ee * Decimal(magic) * Decimal(magic)sqrtMagic = math.sqrt(magic)dLat = Decimal((dLat * 180.0)) / ((Decimal(self.a) * (1 - self.ee)) / (Decimal(magic) * Decimal(sqrtMagic)) * Decimal(math.pi))dLng = (dLng * 180.0) / (self.a / sqrtMagic * math.cos(radLat) * math.pi)mgLat = lat + float(dLat)mgLng = lng + dLngreturn mgLng,mgLat#gps坐標轉換為gcj02坐標系def wg84_to_gcj02(self,wg84_lng,wg84_lat):dLat=self.transformLat(wg84_lng-105.0,wg84_lat-35.0)dLng=self.transformLng(wg84_lng-105.0,wg84_lat-35.0)radLat = wg84_lat / 180.0 * math.pimagic = math.sin(radLat)magic = 1 - self.ee * Decimal(magic) * Decimal(magic)sqrtMagic = math.sqrt(magic)dLat = Decimal((dLat * 180.0)) / ((Decimal(self.a) * (1 - self.ee)) / (Decimal(magic) * Decimal(sqrtMagic)) * Decimal(math.pi))dLng = (dLng * 180.0) / (self.a / sqrtMagic * math.cos(radLat) * math.pi)gcj02Lat = wg84_lat + float(dLat)gcj02Lng = wg84_lng + dLngreturn gcj02Lng,gcj02Lat#gcj02坐標轉百度坐標def gcj02_to_bd09(self,gcj02_lng,gcj02_lat):x = gcj02_lngy = gcj02_latz = math.sqrt(x * x + y * y) + 0.00002 * math.sin(y * math.pi)theta = math.atan2(y, x) + 0.000003 * math.cos(x * math.pi)bd09_Lng = z * math.cos(theta) + 0.0065bd09_Lat = z * math.sin(theta) + 0.006return bd09_Lng,bd09_Lat#wg84坐標轉百度坐標def wg84_to_bd09(self,wg84_lng,wg84_lat):gcj02lng,gcj02lat=self.wg84_to_gcj02(wg84_lng,wg84_lat)return self.gcj02_to_bd09(gcj02lng,gcj02lat)#百度坐標轉GCJ02坐標def bd09_to_gcj02(self,bd09_lng,bd09_lat):x = bd09_lng - 0.0065y = bd09_lat - 0.006z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * math.pi)theta = math.atan2(y, x) - 0.000003 * math.cos(x * math.pi)gcj02_lng = z * math.cos(theta)gcj02_lat = z * math.sin(theta)return gcj02_lng,gcj02_lat#GCJ坐標轉WG84坐標def gcj02_to_wg84(self,gcj02_lng,gcj02_lat):mlng,mlat=self.transfrom(gcj02_lng,gcj02_lat)wg84_Lng=gcj02_lng*2-mlngwg84_Lat=gcj02_lat*2-mlatreturn wg84_Lng,wg84_Lat#將百度坐標轉WG84坐標def bd09_to_wg84(self,bd09_lng,bd09_lat):gcj02_lng, gcj02_lat=self.bd09_to_gcj02(bd09_lng,bd09_lat)return self.gcj02_to_wg84(gcj02_lng,gcj02_lat)tr=transfer()#測試,轉換正確#循環輸入坐標信息while True:xyInfo=input("請輸入百度坐標信息:")xyList=xyInfo.split(",")bd09_lng=float(xyList[0])bd09_lat=float(xyList[1])#輸出 百度坐標轉WG84坐標print("百度坐標信息:")elif choice=="G":import math# 定義常量PI = math.piA = 6378245.0EE = 0.00669342162296594323X_PI = PI * 3000.0 / 180.0def transformlat(lng, lat):ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng))ret += (20.0 * math.sin(6.0 * lng * PI) + 20.0 * math.sin(2.0 * lng * PI)) * 2.0 / 3.0ret += (20.0 * math.sin(lat * PI) + 40.0 * math.sin(lat / 3.0 * PI)) * 2.0 / 3.0ret += (160.0 * math.sin(lat / 12.0 * PI) + 320 * math.sin(lat * PI / 30.0)) * 2.0 / 3.0return retdef transformlng(lng, lat):ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))ret += (20.0 * math.sin(6.0 * lng * PI) + 20.0 * math.sin(2.0 * lng * PI)) * 2.0 / 3.0ret += (20.0 * math.sin(lng * PI) + 40.0 * math.sin(lng / 3.0 * PI)) * 2.0 / 3.0ret += (150.0 * math.sin(lng / 12.0 * PI) + 300.0 * math.sin(lng / 30.0 * PI)) * 2.0 / 3.0return retdef out_of_china(lng, lat):return not (73.66 < lng < 135.05 and 3.86 < lat < 53.55)def gcj02_to_wgs84(gcj_lng, gcj_lat):if out_of_china(gcj_lng, gcj_lat):return gcj_lng, gcj_lat # 不在中國范圍內,直接返回原坐標dlat = transformlat(gcj_lng - 105.0, gcj_lat - 35.0)dlng = transformlng(gcj_lng - 105.0, gcj_lat - 35.0)radlat = gcj_lat / 180.0 * PImagic = math.sin(radlat)magic = 1 - EE * magic * magicsqrtmagic = math.sqrt(magic)dlat = (dlat * 180.0) / ((A * (1 - EE)) / (magic * sqrtmagic) * PI)dlng = (dlng * 180.0) / (A / sqrtmagic * math.cos(radlat) * PI)mglat = gcj_lat + dlatmglng = gcj_lng + dlngwgs84_lng = gcj_lng * 2 - mglngwgs84_lat = gcj_lat * 2 - mglatreturn wgs84_lng, wgs84_lat# 示例:高德地圖的經緯度while True:gcInfo=input("請輸入高德坐標信息:")gcList=gcInfo.split(",")gcj_lng = float(gcList[0]) # 經度gcj_lat = float(gcList[1]) # 緯度# 轉換為WGS-84坐標wgs84_lng, wgs84_lat = gcj02_to_wgs84(gcj_lng, gcj_lat)print(f"高德地圖坐標(GCJ-02): 經度={gcj_lng}, 緯度={gcj_lat}")print(f"WGS-84坐標: 經度={wgs84_lng}, 緯度={wgs84_lat}")print(bd09_lng)print(bd09_lat)print("WGS坐標信息")print(tr.bd09_to_wg84(bd09_lng,bd09_lat)[0])print(tr.bd09_to_wg84(bd09_lng,bd09_lat)[1])print()
即可完成。
一日一圖
代碼如下:
import turtle as t# 設置畫布
t.speed('fastest') # 設置繪圖速度
t.hideturtle() # 隱藏海龜圖標
t.bgcolor('black') # 設置背景顏色# 繪制時空隧道
i = 0
while i < 235:t.pencolor('cyan') # 設置畫筆顏色為青色t.penup() # 提起畫筆t.goto(0, 0) # 移動到中心點t.forward(200) # 向前移動200單位t.pendown() # 放下畫筆t.circle(100) # 繪制半徑為100的圓t.left(2) # 左轉2度i += 1# 結束繪圖
t.done()
-
設置畫布:設置背景顏色為黑色,隱藏海龜圖標,設置繪圖速度為最快。
-
繪制時空隧道:通過循環繪制多個圓形,每次繪制后稍微左轉,形成螺旋效果。
-
顏色選擇:使用青色(
cyan
)作為畫筆顏色,以增強未來感。 -
循環次數:循環多次,每次繪制一個圓形并左轉2度,形成螺旋狀的時空隧道效果。
生成圖片如下: