fix&feat: pmtile问题修复、地图style手动切换试用osm-bright-gl-style

This commit is contained in:
zhouxhere 2025-06-11 18:18:13 +08:00
parent 04a8a98207
commit c7b41ff7aa
3 changed files with 2661 additions and 72 deletions

View File

@ -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)
t.cacheLock.Lock() if offset == pmtilesheader.RootOffset && length == pmtilesheader.RootLength {
defer t.cacheLock.Unlock() cacheKey := PMTilesEntries + key
t.tileCache.Add(cacheKey, pmtilesentries) t.cacheLock.Lock()
defer t.cacheLock.Unlock()
t.tileCache.Add(cacheKey, pmtilesentries)
}
return pmtilesentries, nil return pmtilesentries, nil
} }
@ -453,39 +459,60 @@ 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)
if err != nil { xValue, _ := strconv.ParseUint(strconv.Itoa(x), 10, 32)
return nil, err 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 {
return nil, err
}
entry, ok := pmtiles.FindTile(entries, keyID)
if !ok {
return nil, errors.New("tile not found")
}
if entry.RunLength > 0 {
tileReader, err := bucket.NewRangeReader(context.Background(), key+".pmtiles", int64(pmtilesheader.TileDataOffset+entry.Offset), int64(entry.Length))
if err != nil {
return nil, err
}
defer tileReader.Close()
tileData, err := io.ReadAll(tileReader)
if err != nil {
return nil, err
}
t.cacheLock.Lock()
defer t.cacheLock.Unlock()
t.tileCache.Add(cacheKey, tileData)
return tileData, nil
}
offset = pmtilesheader.LeafDirectoryOffset + entry.Offset
length = uint64(entry.Length)
} }
keyID := pmtiles.ZxyToID(uint8(z), uint32(x), uint32(y)) return nil, errors.New("tile not found")
entry, ok := pmtiles.FindTile(pmtilesentries, keyID)
if !ok {
return nil, errors.New("tile not found")
}
tileReader, err := bucket.NewRangeReader(context.Background(), key+".pmtiles", int64(entry.Offset), int64(entry.Length))
if err != nil {
return nil, err
}
defer tileReader.Close()
tileData, err := io.ReadAll(tileReader)
if err != nil {
return nil, err
}
t.cacheLock.Lock()
defer t.cacheLock.Unlock()
t.tileCache.Add(cacheKey, tileData)
return tileData, nil
} }
func parseVersion(version string) string { func parseVersion(version string) string {

View File

@ -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",

2560
web/public/style.json Normal file

File diff suppressed because it is too large Load Diff