我正在改变如何将我的地图图像从Google地图api获取到使用OpenStreetMap数据的MapQuest托管地图图块。我正在切换谷歌地图,因为我达到了我没想到的每日请求限制,我没有使用OpenStreet api,因为虽然他们的数据是免费的,但他们的图块有一个限制,我只需要一个图像。因此,我在这里使用MapQuest托管的地图图块。
我想我理解它,但有些事情我希望能够做但却找不到任何文件。例如,如果可能的话,我想要一个500x300的图像尺寸,或者至少512 * 512(这是瓷砖出来的双256 * 256)。我还希望能够显示标记。这可能吗?
我使用此代码找到here将我的纬度和经度数据转换为x和y坐标:
public class slippy {
public static void main(String[] args) {
int zoom = 9;
double lat = 42.8549;
double lon = -78.863;
System.out.println("http://otile1.mqcdn.com/tiles/1.0.0/map/" + getTileNumber(lat, lon, zoom) + ".png");
}
public static String getTileNumber(final double lat, final double lon, final int zoom) {
int xtile = (int)Math.floor( (lon + 180) / 360 * (1<<zoom) ) ;
int ytile = (int)Math.floor( (1 - Math.log(Math.tan(Math.toRadians(lat)) + 1 / Math.cos(Math.toRadians(lat))) / Math.PI) / 2 * (1<<zoom) ) ;
return("" + zoom + "/" + xtile + "/" + ytile);
}
}
我使用此代码生成两个指向Buffalo地图的链接;一个缩放为9,here,一个缩放为10,here,中心似乎不同。这是使用开源数据的结果还是我可以使用的属性?
答案 0 :(得分:5)
当然,中心不同。从一个缩放级别到下一个缩放级别,一个tile被“拆分”为另外四个区块。因此,单个瓦片的中心将位于四个瓦片的角落处。使用上面提到的公式,您将始终获得包含坐标的图块。但由于瓷砖的性质,它不一定是瓷砖的中心。对于每个特定坐标,只有包含它的给定缩放级别的一个图块。因此,坐标可以位于图块上的任何位置,而不一定位于中心。
我仍然不太清楚你真正想要实现的目标。对于displaying tiles (and markers),您需要做的就是使用Leaflet或OpenLayers(或任何其他支持图块概念的图书馆)。
请记住,MapQuest也有terms of use。
修改强>
另一种方法是使用 WMS 服务而不是 TMS ,它会为您调整磁贴的大小和连接。使用WMS,您只需在中心周围定义边界框和图像大小。生成的图像将始终以坐标为中心。 OSM wiki有一个list of OSM WMS servers。
不要忘记了解您选择的WMS服务的使用政策。