2012-12-02 62 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我忘了包含該功能。我已經更新了答案,可以嗎? –