![]() |
飘逸的甜瓜 · 驻法国大使孔泉鼓励留法科技工作者服务国家发展 ...· 1 年前 · |
![]() |
满身肌肉的高山 · 第六届中国(昆明)国际大健康养生养老产业博览 ...· 1 年前 · |
![]() |
狂野的水煮鱼 · 残酷的人们_百度百科· 1 年前 · |
![]() |
另类的热水瓶 · 神秘禁区 | ...· 1 年前 · |
![]() |
朝气蓬勃的猴子 · 中国乒乓“牛人” ...· 1 年前 · |
为了实现可视化,我需要一个由两个lat/long坐标定义的特定矩形AOI的光学卫星图像。我尝试了 Mapbox静态图像 API,它采用一个 lat/长边框 和一个宽度/高度像素的 分辨率作为输出。问题是,在我看来,如果lat/long框的比率与w/h像素不相同,它将向lat/long边界框中添加填充,以填充像素图像的w/h。
这将阻止我将光学图像与其他数据相结合,因为我不知道哪个图像像素将(大致)对应于哪个lat/long坐标。
我看到了三个“解决方案”,但我不知道如何实现其中任何一个。
我检查了 我如何从谷歌地图中提取卫星图像给出一个拉特长方形? ,但是我更喜欢使用我现有的付费Mapbox帐户,我的印象是,我仍然无法得到确切的光学图像或光学图像的精确角坐标。
对吗?
注意红色和绿色的别针:路径点在Mapbox上相对的拐角。
经过等矩形修正后,Mapbox与Openstreetmaps (不足为奇)匹配,但Google坐标也相当接近。
curl -g "https://api.mapbox.com/styles/v1/mapbox/streets-v11/static/[17.55490,47.10434,17.55718,47.10543]/600x419?access_token=YOUR_TOKEN_HERE" --output example-walk-600x419-nopad.png
你的规模是多少?1公里- 100公里?
你的光学图像来源是什么?
所需的准确度是多少?
值得一提的是,光学图像有其自身的失真来源。
实践中的 :
你必须有你的非光学卫星数据的范围(让我们保持周围的雾.)我叫它((x1,y1),(x2,y2))我们是程序员,不是制图员-对吗?如果您将您的范围提供给 https://docs.mapbox.com/playground/static/ 作为
最小经度= x1,最小延迟= y1,最大经度= x2,最大延迟= y2
选择“边界框”条目!你在你的数据周围看到了mapbox吗?不要介意确切的尺寸,只需检查mapbox是否与您的数据相关!也许你必须交换一些价值观才能到达地球的右端。
如果您拥有正确的坐标((x1,y1),(x2,y2))坐标,则执行等矩形变换以获得正确的像素大小。
你称它为解决方案#2。
假设你的非光学卫星数据是Wd,高度是Hd。mapbox图像将适合您的数据,如果您要求Wm宽度,和Hm高度的mapbox数据
Wm = Wd
Hm = Wd * (y2 - y1) * cos(x1) / (x2 - x1)
现在你可以把mapbox拉过来了
curl -g "https://api.mapbox.com/styles/v1/mapbox/streets-v11/static/[<x1>,<y1>,<x2>,<y2>]/<Wm>x<Hm>?access_token=<YOUR_TOKEN>" --output overlay.png
If (Hd == Hm)
then {you are lucky :) the two images just fit each other}
else { the two images are for the same area, but you have to scale the height of one of the images to make match }
好吧..。差不多了。你还没有透露你想要覆盖的区域的大小。上面的方程只是一个近似,它的大小相当于一个较小的国家(大约100公里)。对于大陆尺度,您可能需要应用更精确的公式。
在我看来,你的第二个想法是可行的。您确实有LLng bbox,所以剩下的就是计算它的“真实”大小(以像素为单位)。
让我们假设您希望(或允许或负担得起)每像素50m的分辨率,并且该区域足够小,不会发生扭曲(例如,一个长方形,如1弧秒的纬度和1弧秒的经度,其顶部和底部的边长相同,误差小于您选择的分辨率)。我相信,这些都是非常宽松的必需品,而且很容易实现。
然后,您只需要计算(Lat1,Lon1)和(Lat1,Lon2)点之间的距离,就可以计算出(Lat1,Lon1)和(Lat2,Lon1)之间的距离。将这个距离除以50米,你就会得到确切的像素数:
Lon1 Lon2
Lat1 +---------------+
| |
| |
Lat2 +---------------+
你有一个公式-- 哈弗森公式 。
如果您需要更高的精度,您可以求助于 文森 扁球体( 这里 ,一个Javascript库)。在MT站点(第一个链接)上,有一个实时计算器,您可以使用它来插入呼叫中的数据,并验证该方法是否确实有效。也就是说,你插入你的包围框,得到距离,以米,除法和像素大小的图像(如果图像是好的,机会是你可以去更简单的哈弗森。如果不是的话,那么地图API中还会有一些奇怪的地方--可能是它的投影--它不会返回预期的边界框。但这似乎不太可能)。
在苹果手表上使用卫星图像时,我遇到了这个问题。我覆盖了一些标记和一条小路。我把所有的东西从坐标转换成像素。下面是我的代码,用于确定确切的bbox结果
var maxHoleLat = 52.5738902
var maxHoleLon = 4.9577606
var minHoleLat = 52.563994
var minHoleLon = 4.922364
var mapMaxLat = 0.0
var mapMaxLon = 0.0
var mapMinLat = 0.0
var mapMinLon = 0.0
let token = "your token"
var resX = 1000.0
var resY = 1000.0
let screenX = 184.0
let screenY = 224.0 // 448/2 = 224 - navbarHeight
let navbarHeight = 0.0
var latDist = 111000.0
var lonDist = 111000.0
var dx = 0.0
var dy = 0.0
func latLonDist(){
//calgary.rasc.ca/latlong.htm
let latRad = maxHoleLat * .pi / 180
//distance between 1 degree of longitude at given latitude
self.lonDist = 111412.88 * cos(latRad) - 0.09350*cos(3 * latRad) + 0.00012 * cos(5 * latRad)
print("lonDist = \(self.lonDist)")
//distance between 1 degree of latitude at a given longitude
self.latDist = 111132.95 - 0.55982 * cos(2 * latRad) + 0.00117 * cos(4 * latRad)
print("latDist = \(self.latDist)")
func getMapUrl(){
self.dx = (maxHoleLon - minHoleLon) * lonDist
self.dy = (maxHoleLat - minHoleLat) * latDist
//the map is square, but the hole not
//check if the hole has less x than y
if dx < dy {
mapMaxLat = maxHoleLat
mapMinLat = minHoleLat
let midLon = (maxHoleLon + minHoleLon ) / 2
mapMaxLon = midLon + dy / 2 / lonDist
mapMinLon = midLon - dy / 2 / lonDist
} else {
mapMaxLon = maxHoleLon
mapMinLon = minHoleLon
let midLat = (maxHoleLat + minHoleLat ) / 2
mapMaxLat = midLat + dx / 2 / latDist
mapMinLat = midLat - dx / 2 / latDist
![]() |
狂野的水煮鱼 · 残酷的人们_百度百科 1 年前 |