3 回答

TA貢獻1877條經驗 獲得超6個贊
您可以嘗試將您的 big 轉換geojson
為topojson
.?因為
topojson 消除了冗余,允許相關的幾何圖形有效地存儲在同一個文件中
當您在傳單地圖上渲染它時,您可以實現更小的文件大小,從而獲得更好的性能。
您可以使用此站點將巨大的 geojson(?17.1mb?) 轉換為 topojson(?2.7mb?)。轉換后您可以看到大小的差異。請注意,它不具有無限的免費轉換功能。
之后,您可以創建自己的反應包裝器來渲染topojson
.?它需要進行一些調整才能與 兼容react-leaflet v.3.x
,并且能夠在每個縣添加彈出窗口,但在進行一些小的更改后,您可以像正常的那樣可視化您的巨大geojson
的.topojson
geojson
function TopoJSON(props) {
? const layerRef = useRef(null);
? const { data, ...otherProps } = props;
? function addData(layer, jsonData) {
? ? if (jsonData.type === "Topology") {
? ? ? for (let key in jsonData.objects) {
? ? ? ? let geojson = topojson.feature(jsonData, jsonData.objects[key]);
? ? ? ? layer.addData(geojson);
? ? ? }
? ? } else {
? ? ? layer.addData(jsonData);
? ? }
? }
? function onEachFeature(feature, layer) {
? ? if (feature.properties) {
? ? ? const { VARNAME_3, NAME_0 } = feature.properties;
? ? ? layer.bindPopup(`${VARNAME_3}, ${NAME_0}`);
? ? }
? }
? useEffect(() => {
? ? const layer = layerRef.current;
? ? addData(layer, props.data);
? }, [props.data]);
? return (
? ? <GeoJSON ref={layerRef} {...otherProps} onEachFeature={onEachFeature} />
? );
}
并像這樣使用它:
import topojson from "./phuong.json";
?<MapContainer ..>
? ? ? ...
? ? ?<TopoJSON data={topojson} />
? </MapContainer>

TA貢獻1780條經驗 獲得超1個贊
一種方法是減少 GeoJSON 中的功能。GeoJSON 很大 (55MB),因為它有很多地理點,可以使用 Mapshaper (mapshaper.org)工具進行簡化。
前
后

TA貢獻1880條經驗 獲得超4個贊
因此,解決此問題的另一種方法是使用畫布渲染器。有一個用于Leaflet Canvas 標記層的包。問題是默認情況下,Leaflet 為每個功能創建 dom 節點,這些功能確實會影響像您這樣的大層的性能。默認情況下,像圓形標記這樣的標記基元可以渲染到畫布上,但是像圖標這樣的東西需要更多的工作來渲染。
添加回答
舉報