缩放或缩放从gps获得的X/Y像素以适合特定区域
Scale or Zoom X/Y pixels obtained from gps lat/long to fit a certain area
我正在寻找将一组gps坐标转换为X/Y像素以表示给定区域中的点的正确公式。
最终目标是以.gpx文件为例(或任何长度/长度对数组),解析它,并生成轨道/形状的png。
我不关心世界的曲率和所有的数学为了得到尽可能真实的结果。我也不需要在地图上匹配位置。我只是想让X/Y点适合一个给定的以像素表示的区域。
我有这些小提琴:
https://jsfiddle.net/tpwyz2m5/20/https://jsfiddle.net/bjugo7ff/问题是它们太小了,小到实际上它们都指向给定区域中的相同像素。你必须用一个大的数字来乘以它们,为了让它们适合320x240px的区域,你需要对它们进行调整。
在我运行的一些测试中,我设法放大这些数字以获得我想要的结果,但当我用一组新的坐标尝试它时,我得到了不同的结果,意思是,点是靠近或远离。
我在测试中所做的(只是为了看看转换是否有效)是从每个lat/long中获得X/Y点。循环它们以获得最小/最大值(这些是形状的边界)。然后我开始乘法和除法,直到我得到的形状适合在给定的区域内。
那么,这组坐标
var coords = {
0: {
lat: '45.88289847',
lon: '21.52251720'
},
1: {
lat: '45.88570661',
lon: '21.52431965'
},
2: {
lat: '45.88376483',
lon: '21.52770996'
}
};
和
var coords = {
0: {
lat: '45.23621754',
lon: '20.49499512'
},
1: {
lat: '46.46813299',
lon: '21.67053223'
},
2: {
lat: '45.59097825',
lon: '22.74169922'
}
};
应该有非常相似的结果(就像在小提琴中一样)。
这是我在测试中使用的整个javascript:
var coords = {
0: {
lat: '45.88289847',
lon: '21.52251720'
},
1: {
lat: '45.88570661',
lon: '21.52431965'
},
2: {
lat: '45.88376483',
lon: '21.52770996'
}
};
var w = document.getElementById('box').clientWidth; // 320px
var h = document.getElementById('box').clientHeight; // 240px
for (var key in coords) {
var lat = coords[key]['lat'];
var lon = coords[key]['lon'];
var x = (lon * w) / 360;
var y = (lat * h) / 180;
var div = document.getElementById('box');
var dot = document.createElement("div");
dot.className = 'dot';
dot.style.top = y+'px';
dot.style.left = x+'px';
div.appendChild(dot);
console.log(key + ' -> lat:' + lat + '; lon:' + lon + '; x: ' + x + '; y: ' + y);
}
html: <div id="box"></div>
css: #box {
width:320px;
height:240px;
border:1px solid #F00;
position:relative;
}
.dot {
width:2px;
height:2px;
background-color:#00F;
position:absolute;
}
所以问题是,我如何缩放或放大以适应X × Y像素矩形内的点
经过一番思考,我想到了这个。我知道这不是正确的做法,但它能完成工作。如果有人知道更好(更短更优雅)的方法,请分享!
小提琴:https://jsfiddle.net/g1qtzqhj/
和javascript如下:
var div = document.getElementById('box');
var w = div.clientWidth;
var h = div.clientHeight;
var s = 1;
var d = 10;
var min_x = min_y = max_x = max_y = 0;
for (var key in coords) {
var lat = coords[key]['lat'];
var lon = coords[key]['lon'];
var x = (lon * w) / 360;
coords[key]['x'] = x;
var y = (lat * h) / 180;
coords[key]['y'] = y;
if (x < min_x || min_x == 0)
min_x = x;
if (x > max_x || max_x == 0)
max_x = x;
if (y < min_y || min_y == 0)
min_y = y;
if (y > max_y || max_y == 0)
max_y = y;
}
var dif_x = max_x - min_x;
var dif_y = max_y - min_y;
var bmax_x = bmax_y = 0;
for (var key in coords) {
var x = coords[key]['x'] = (coords[key]['x'] - (max_x - dif_x));
var y = coords[key]['y'] = (coords[key]['y'] - (max_y - dif_y));
if (x > bmax_x || bmax_x == 0)
bmax_x = x;
if (y > bmax_y || bmax_y == 0)
bmax_y = y;
}
nw = (bmax_x) * s;
nh = (bmax_y) * s;
r_x = w / bmax_x;
r_y = h / bmax_y;
for (var key in coords) {
var dot = document.createElement('div');
dot.className = 'dot';
dot.style.width = d +'px';
dot.style.height = d +'px';
dot.style.borderRadius = d +'px';
dot.style.top = h - (coords[key]['y'] * s * r_y) - (d / 2) + 'px';
dot.style.left = (coords[key]['x'] * s * r_x) - (d / 2) + 'px';
div.appendChild(dot);
}
我可能不得不重新考虑它(在我睡了一会儿之后),因为循环遍历同一个对象三次似乎根本不对!
相关文章:
- 更改高贴图的缩放级别
- 如何缩放像图像一样的元素
- HTML 缩放元素,其尺寸以百分比定义,就像以像素定义一样
- 像谷歌新闻一样的缩放事件
- 在 CSS 中将“mm”缩放为“像素”
- 根据浏览器的宽度/高度在页面上进行自动缩放,就像 Firefox 所做的 CTR+- 一样
- 使用RaphaelJS将路径缩放为纸张大小或以像素为单位设置路径尺寸
- 当适合设备的绝对视图在移动设备中向右移动几个像素时,我如何防止双击缩放
- 制作画布镜像、缩放和旋转
- 如何在只使用像素的特定Javascript中动态缩放元素
- 如何将点转换为像素以正确缩放
- 如何计算像素大小作为缩放百分比
- 图像悬停缩放延迟像谷歌图像
- 图像悬停缩放像谷歌图像
- D3.js缩放只工作时,光标在像素的图形
- 像素化的跨浏览器图像缩放
- 我如何实现缩放功能,就像浏览器的CTRL +
- 缩放或缩放从gps获得的X/Y像素以适合特定区域
- 像Firefox一样预览和缩放图像
- 缩放SVG是模糊的或像素化的,不清晰