2016-03-05 02:08:16 +03:00
|
|
|
package bing
|
|
|
|
|
|
|
|
import "errors"
|
|
|
|
|
2016-04-03 05:16:36 +03:00
|
|
|
// LatLongToQuad iterates through all of the quads parts until levelOfDetail is reached.
|
2016-03-05 02:08:16 +03:00
|
|
|
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
|
|
|
|
}
|
2016-04-03 05:16:36 +03:00
|
|
|
return 1
|
2016-03-05 02:08:16 +03:00
|
|
|
} else if (tileY & mask) != 0 {
|
|
|
|
return 2
|
|
|
|
}
|
2016-04-03 05:16:36 +03:00
|
|
|
return 0
|
2016-03-05 02:08:16 +03:00
|
|
|
}
|
|
|
|
|
2016-04-03 05:16:36 +03:00
|
|
|
// TileXYToBounds returns the bounds around a tile.
|
2016-03-05 02:08:16 +03:00
|
|
|
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)
|
2018-04-20 03:24:47 +03:00
|
|
|
if size == 0 || tileX%size == 0 {
|
2016-03-05 02:08:16 +03:00
|
|
|
minLon = MinLongitude
|
|
|
|
}
|
2018-04-20 03:24:47 +03:00
|
|
|
if size == 0 || tileX%size == size-1 {
|
2016-03-05 02:08:16 +03:00
|
|
|
maxLon = MaxLongitude
|
|
|
|
}
|
|
|
|
if tileY <= 0 {
|
|
|
|
maxLat = MaxLatitude
|
|
|
|
}
|
|
|
|
if tileY >= size-1 {
|
|
|
|
minLat = MinLatitude
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-11-16 23:01:19 +03:00
|
|
|
// QuadKeyToBounds converts a quadkey to bounds
|
2016-03-05 02:08:16 +03:00
|
|
|
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
|
|
|
|
}
|