mirror of https://github.com/tidwall/tile38.git
63 lines
1.5 KiB
Go
63 lines
1.5 KiB
Go
|
package bing
|
||
|
|
||
|
import "errors"
|
||
|
|
||
|
func LatLongToQuad(latitude, longitude float64, levelOfDetail uint64, iterator func(part int) bool) {
|
||
|
pixelX, pixelY := LatLongToPixelXY(latitude, longitude, levelOfDetail)
|
||
|
tileX, tileY := PixelXYToTileXY(pixelX, pixelY)
|
||
|
for i := levelOfDetail; i > 0; i-- {
|
||
|
if !iterator(partForTileXY(tileX, tileY, i)) {
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func partForTileXY(tileX, tileY int64, levelOfDetail uint64) int {
|
||
|
mask := int64(1 << (levelOfDetail - 1))
|
||
|
if (tileX & mask) != 0 {
|
||
|
if (tileY & mask) != 0 {
|
||
|
return 3
|
||
|
} else {
|
||
|
return 1
|
||
|
}
|
||
|
} else if (tileY & mask) != 0 {
|
||
|
return 2
|
||
|
} else {
|
||
|
return 0
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TileXYToBounds(tileX, tileY int64, levelOfDetail uint64) (minLat, minLon, maxLat, maxLon float64) {
|
||
|
size := int64(1 << levelOfDetail)
|
||
|
pixelX, pixelY := TileXYToPixelXY(tileX, tileY)
|
||
|
maxLat, minLon = PixelXYToLatLong(pixelX, pixelY, levelOfDetail)
|
||
|
pixelX, pixelY = TileXYToPixelXY(tileX+1, tileY+1)
|
||
|
minLat, maxLon = PixelXYToLatLong(pixelX, pixelY, levelOfDetail)
|
||
|
if tileX%size == 0 {
|
||
|
minLon = MinLongitude
|
||
|
}
|
||
|
if tileX%size == size-1 {
|
||
|
maxLon = MaxLongitude
|
||
|
}
|
||
|
if tileY <= 0 {
|
||
|
maxLat = MaxLatitude
|
||
|
}
|
||
|
if tileY >= size-1 {
|
||
|
minLat = MinLatitude
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func QuadKeyToBounds(quadkey string) (minLat, minLon, maxLat, maxLon float64, err error) {
|
||
|
for i := 0; i < len(quadkey); i++ {
|
||
|
switch quadkey[i] {
|
||
|
case '0', '1', '2', '3':
|
||
|
default:
|
||
|
err = errors.New("invalid quadkey")
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
minLat, minLon, maxLat, maxLon = TileXYToBounds(QuadKeyToTileXY(quadkey))
|
||
|
return
|
||
|
}
|