我已将MaxMind中的城市数据库放在一起,它包含数据库中每个城市的lat / lng值。我还整理了一张North / America地图,我想在地图的x / y坐标上出现一个图标,该图标来自城市数据库记录的纬度/经度坐标。
根据我的理解,我需要首先找到地图的左/上界(lat / lng - > x / y),然后将其用作任何北美城市x /之间线性关系的差异y coords。最后,根据地图的大小,只需要进行一些简单的除法和减法操作,找出放置点的位置。
但是我似乎无法弄清楚以下内容:
有什么想法吗?
- 编辑 -
输出地图(北美)是一个连续圆柱:“米勒圆柱投影”。 http://en.wikipedia.org/wiki/Miller_cylindrical_projection
答案 0 :(得分:5)
纬度和经度是在地球上绘制的虚线,因此您可以准确地精确定位世界上的任何位置。简单地说它们是飞机的X和Y坐标。 纬度是一条从北向南延伸的垂直线,北极为90度,南极为90度。
另一方面,经度是一条从东到南的水平线,西面为-180度,东面为180度。你可以将latLng转换为像素坐标,因为假设html容器的宽度是世界的宽度,同样适用于高度。
公式 - 经度 - 像素
(givenLng*widthOfContainerElement)/360
其中360是以度为单位的总经度
公式-Latitude - 像素化
(givenLat*heightOfContainerElement)/180
其中360是度数的总经度
//Height is calculated from the bottom
如果您仍需要任何澄清,请与我们联系。
答案 1 :(得分:1)
这里是Mercator projection的Javascript实现,它仅返回正值(屏幕的笛卡尔坐标系),并说明sphere> flat conversion:
// get x
var x = (lng + 180) * (mapWidth / 360);
// convert from degrees to radians
var latRad = lat * Math.PI / 180;
// get y value
var mercN = Math.log(Math.tan((Math.PI / 4) + (latRad / 2)));
var y = (mapHeight / 2) - (mapWidth * mercN / (2 * Math.PI));
答案 2 :(得分:0)
这是一个很老的问题,但是被接受的答案有些...细微差别...
通常,这是针对卫星/航空影像完成的,通常伴随着“缩放级别”。
此缩放级别大致(我的意思是大致)转换为“地面采样距离”或GSD,当提供时,它表示图像中每像素的厘米。
您经常会看到18、19、20或21的缩放级别。
要注意的问题之一是地球不是平坦的也不是完美的球形,因此,有许多不同的“投影”方法可用于将地球表面的三维坐标转换为地球上的二维图像。屏幕。这些投影方法中最受欢迎和广泛使用的是墨卡托投影。
Google provides a method,使用墨卡托投影提供x
和y
的像素坐标。
然后我们可以使用“缩放级别”缩放坐标以适合我们的图像。
interface LatLngLiteral {
lat: number;
lng: number;
}
interface Coordinate {
x: number;
y: number;
}
const project = (latLng: LatLngLiteral): Coordinate => {
const TILE_SIZE: number = 256;
let siny: number = Math.sin((latLng.lat * Math.PI) / 180);
// Truncating to 0.9999 effectively limits latitude to 89.189. This is
// about a third of a tile past the edge of the world tile.
siny = Math.min(Math.max(siny, -0.9999), 0.9999);
return {
x: TILE_SIZE * (0.5 + latLng.lng / 360),
y: TILE_SIZE * (0.5 - Math.log((1 + siny) / (1 - siny)) / (4 * Math.PI))
};
};
export function formatToPoint(latLng: LatLngLiteral, zoom: number): Coordinate {
// Get the world coordinates in pixels
const worldCoordinate: Coordinate = project(latLng);
// Scale to fit our image
const scale: number = Math.pow(2, zoom);
// Apply scale to world coordinates to get image coordinates
return {
x: Math.floor(worldCoordinate.x * scale),
y: Math.floor(worldCoordinate.y * scale)
}
}