2012-12-02 58 views
2

是否可以从坐标(纬度,经度),缩放级别和大小(屏幕)获取边界框?我发现只有calculating bounding box from tile。我需要它,因为OpenStreetMap只接受导出模式下的bbox。我没有这方面的经验,所以我会很乐意提供任何建议。谢谢。计算OpenStreetMap的边界框

编辑:

对不起,我形容它错了。我写的是这样的:

(伪) `

x = getX(longitude, zoom); //X Tile - return 41870 
y = getY(latitude, zoom); //Y Tile - return 22226 
north = getXToLongitude(x, zoom); //return 49.998779 
south = getXToLongitude(x + 1, zoom); //return 50.004272 
west = getYToLatitude(y, zoom); //return 49.997078 
east = getYToLatitude(y + 1, zoom); //return 50.000609 

`

但是,这是非常不准确的,并和转移的100米的中心。

+0

如何应该说是可能的吗?特定缩放级别上的可见边界框取决于浏览器窗口大小。 – scai

+0

好吧,我重写它。 – user1518183

+0

您是否已经查看了[这些工具](http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Tools)? – scai

回答

3

是的。我有类似的问题,所以我写了它。就像这样:

use Math::Trig; 

sub getTileNumber { 
    my ($lat,$lon,$zoom) = @_; 
    my $xtile = int(($lon+180)/360 * 2**$zoom) ; 
    my $ytile = int((1 - log(tan(deg2rad($lat)) + sec(deg2rad($lat)))/pi)/2 * 2**$zoom) ; 
    return ($xtile, $ytile); 
} 

sub getLonLat { 
    my ($xtile, $ytile, $zoom) = @_; 
    my $n = 2 ** $zoom; 
    my $lon_deg = $xtile/$n * 360.0 - 180.0; 
    my $lat_deg = rad2deg(atan(sinh(pi * (1 - 2 * $ytile/$n)))); 
    return ($lon_deg, $lat_deg); 
} 

# convert from permalink OSM format like: 
# http://www.openstreetmap.org/?lat=43.731049999999996&lon=15.79375&zoom=13&layers=M 
# to OSM "Export" iframe embedded bbox format like: 
# http://www.openstreetmap.org/export/embed.html?bbox=15.7444,43.708,15.8431,43.7541&layer=mapnik 

sub LonLat_to_bbox { 
    my ($lat, $lon, $zoom) = @_; 

    my $width = 425; my $height = 350; # note: must modify this to match your embed map width/height in pixels 
    my $tile_size = 256; 

    my ($xtile, $ytile) = getTileNumber ($lat, $lon, $zoom); 

    my $xtile_s = ($xtile * $tile_size - $width/2)/$tile_size; 
    my $ytile_s = ($ytile * $tile_size - $height/2)/$tile_size; 
    my $xtile_e = ($xtile * $tile_size + $width/2)/$tile_size; 
    my $ytile_e = ($ytile * $tile_size + $height/2)/$tile_size; 

    my ($lon_s, $lat_s) = getLonLat($xtile_s, $ytile_s, $zoom); 
    my ($lon_e, $lat_e) = getLonLat($xtile_e, $ytile_e, $zoom); 

    my $bbox = "$lon_s,$lat_s,$lon_e,$lat_e"; 
    return $bbox; 
} 

我还添加了此信息,以OSM wiki,所以它会在未来更容易找到...

+0

有什么方法可以计算BBOX不使用getTileNumber函数吗? – unibasil

+0

@unibasil我忘了包含该功能。我已经更新了答案,可以吗? –