fix&feat: pmtile问题修复、地图style手动切换试用osm-bright-gl-style
This commit is contained in:
parent
04a8a98207
commit
c7b41ff7aa
|
@ -377,23 +377,26 @@ func (t *TileReader) getPMTilesHeader(name, key string) (*pmtiles.HeaderV3, erro
|
||||||
return &pmtilesheader, nil
|
return &pmtilesheader, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TileReader) getPMTilesEntries(name, key string) ([]pmtiles.EntryV3, error) {
|
func (t *TileReader) getPMTilesEntries(name, key string, offset, length uint64) ([]pmtiles.EntryV3, error) {
|
||||||
cacheKey := PMTilesEntries + key
|
|
||||||
if pmtilesentries, ok := t.tileCache.Get(cacheKey); ok {
|
|
||||||
return pmtilesentries.([]pmtiles.EntryV3), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
pmtilesheader, err := t.getPMTilesHeader(name, key)
|
pmtilesheader, err := t.getPMTilesHeader(name, key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if offset == pmtilesheader.RootOffset && length == pmtilesheader.RootLength {
|
||||||
|
cacheKey := PMTilesEntries + key
|
||||||
|
if pmtilesentries, ok := t.tileCache.Get(cacheKey); ok {
|
||||||
|
return pmtilesentries.([]pmtiles.EntryV3), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bucket, err := t.loadPMTiles(name)
|
bucket, err := t.loadPMTiles(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
entriesReader, err := bucket.NewRangeReader(context.Background(), key+".pmtiles", int64(pmtilesheader.LeafDirectoryOffset), int64(pmtilesheader.LeafDirectoryLength))
|
entriesReader, err := bucket.NewRangeReader(context.Background(), key+".pmtiles", int64(offset), int64(length))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -405,9 +408,12 @@ func (t *TileReader) getPMTilesEntries(name, key string) ([]pmtiles.EntryV3, err
|
||||||
}
|
}
|
||||||
pmtilesentries := pmtiles.DeserializeEntries(bytes.NewBuffer(entriesData), pmtilesheader.InternalCompression)
|
pmtilesentries := pmtiles.DeserializeEntries(bytes.NewBuffer(entriesData), pmtilesheader.InternalCompression)
|
||||||
|
|
||||||
|
if offset == pmtilesheader.RootOffset && length == pmtilesheader.RootLength {
|
||||||
|
cacheKey := PMTilesEntries + key
|
||||||
t.cacheLock.Lock()
|
t.cacheLock.Lock()
|
||||||
defer t.cacheLock.Unlock()
|
defer t.cacheLock.Unlock()
|
||||||
t.tileCache.Add(cacheKey, pmtilesentries)
|
t.tileCache.Add(cacheKey, pmtilesentries)
|
||||||
|
}
|
||||||
|
|
||||||
return pmtilesentries, nil
|
return pmtilesentries, nil
|
||||||
}
|
}
|
||||||
|
@ -453,24 +459,38 @@ func (t *TileReader) getPMTilesTile(name, key string, z, x, y int) ([]byte, erro
|
||||||
return tileData.([]byte), nil
|
return tileData.([]byte), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pmtilesheader, err := t.getPMTilesHeader(name, key)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
bucket, err := t.loadPMTiles(name)
|
bucket, err := t.loadPMTiles(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
pmtilesentries, err := t.getPMTilesEntries(name, key)
|
zValue, _ := strconv.ParseUint(strconv.Itoa(z), 10, 8)
|
||||||
|
xValue, _ := strconv.ParseUint(strconv.Itoa(x), 10, 32)
|
||||||
|
yValue, _ := strconv.ParseUint(strconv.Itoa(y), 10, 32)
|
||||||
|
|
||||||
|
keyID := pmtiles.ZxyToID(uint8(zValue), uint32(xValue), uint32(yValue))
|
||||||
|
|
||||||
|
offset := pmtilesheader.RootOffset
|
||||||
|
length := pmtilesheader.RootLength
|
||||||
|
|
||||||
|
for depth := 0; depth <= 3; depth++ {
|
||||||
|
entries, err := t.getPMTilesEntries(name, key, offset, length)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
keyID := pmtiles.ZxyToID(uint8(z), uint32(x), uint32(y))
|
entry, ok := pmtiles.FindTile(entries, keyID)
|
||||||
|
|
||||||
entry, ok := pmtiles.FindTile(pmtilesentries, keyID)
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("tile not found")
|
return nil, errors.New("tile not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
tileReader, err := bucket.NewRangeReader(context.Background(), key+".pmtiles", int64(entry.Offset), int64(entry.Length))
|
if entry.RunLength > 0 {
|
||||||
|
tileReader, err := bucket.NewRangeReader(context.Background(), key+".pmtiles", int64(pmtilesheader.TileDataOffset+entry.Offset), int64(entry.Length))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -486,6 +506,13 @@ func (t *TileReader) getPMTilesTile(name, key string, z, x, y int) ([]byte, erro
|
||||||
t.tileCache.Add(cacheKey, tileData)
|
t.tileCache.Add(cacheKey, tileData)
|
||||||
|
|
||||||
return tileData, nil
|
return tileData, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
offset = pmtilesheader.LeafDirectoryOffset + entry.Offset
|
||||||
|
length = uint64(entry.Length)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, errors.New("tile not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseVersion(version string) string {
|
func parseVersion(version string) string {
|
||||||
|
|
|
@ -28,7 +28,8 @@ onMounted(async () => {
|
||||||
if (!mapContainer.value) return;
|
if (!mapContainer.value) return;
|
||||||
map.value = new maplibregl.Map({
|
map.value = new maplibregl.Map({
|
||||||
container: mapContainer.value, // container id
|
container: mapContainer.value, // container id
|
||||||
style: "https://demotiles.maplibre.org/style.json", // style URL
|
// style: "https://demotiles.maplibre.org/style.json", // style URL
|
||||||
|
style: "/style.json",
|
||||||
center: [120.147376, 30.272934], // starting position [lng, lat]
|
center: [120.147376, 30.272934], // starting position [lng, lat]
|
||||||
zoom: 7, // starting zoom
|
zoom: 7, // starting zoom
|
||||||
});
|
});
|
||||||
|
@ -107,42 +108,43 @@ const handleData = () => {
|
||||||
// },
|
// },
|
||||||
// });
|
// });
|
||||||
|
|
||||||
map.value.addSource("zhejiang-pm", {
|
// map.value.addSource("zhejiang-pm", {
|
||||||
type: "vector",
|
// type: "vector",
|
||||||
url: "/api/v1/pmtiles/zhejiang-pm",
|
// url: "/api/v1/pmtiles/zhejiang-pm",
|
||||||
});
|
// // url: "http://localhost:8080/zhejiang-pm.json"
|
||||||
map.value.addLayer({
|
// });
|
||||||
id: "water",
|
// map.value.addLayer({
|
||||||
type: "fill",
|
// id: "water",
|
||||||
filter: ["==", "$type", "Polygon"],
|
// type: "fill",
|
||||||
source: "zhejiang-pm",
|
// filter: ["==", "$type", "Polygon"],
|
||||||
"source-layer": "water",
|
// source: "zhejiang-pm",
|
||||||
paint: {
|
// "source-layer": "water",
|
||||||
"fill-color": "#80deea",
|
// paint: {
|
||||||
},
|
// "fill-color": "#80deea",
|
||||||
});
|
// },
|
||||||
map.value.addLayer({
|
// });
|
||||||
id: "water_river",
|
// map.value.addLayer({
|
||||||
type: "line",
|
// id: "water_river",
|
||||||
source: "zhejiang-pm",
|
// type: "line",
|
||||||
"source-layer": "water",
|
// source: "zhejiang-pm",
|
||||||
minzoom: 9,
|
// "source-layer": "water",
|
||||||
filter: ["in", "kind", "river"],
|
// minzoom: 9,
|
||||||
paint: {
|
// filter: ["in", "kind", "river"],
|
||||||
"line-color": "#80deea",
|
// paint: {
|
||||||
"line-width": [
|
// "line-color": "#80deea",
|
||||||
"interpolate",
|
// "line-width": [
|
||||||
["exponential", 1.6],
|
// "interpolate",
|
||||||
["zoom"],
|
// ["exponential", 1.6],
|
||||||
9,
|
// ["zoom"],
|
||||||
0,
|
// 9,
|
||||||
9.5,
|
// 0,
|
||||||
1,
|
// 9.5,
|
||||||
18,
|
// 1,
|
||||||
12,
|
// 18,
|
||||||
],
|
// 12,
|
||||||
},
|
// ],
|
||||||
});
|
// },
|
||||||
|
// });
|
||||||
// map.value.addLayer({
|
// map.value.addLayer({
|
||||||
// id: "world_cities",
|
// id: "world_cities",
|
||||||
// type: "symbol",
|
// type: "symbol",
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue