2

我刚开始使用 react-leaflet 库并获得了一张要加载 geoJSON 图层的地图,但是我想改用 TopoJSON 图层。

我知道像这样的纯传单是可能的:https ://gist.github.com/rclark/5779673/ 。

但是我将如何使用 React-Leaflet 来做到这一点?

编辑

class MapViz extends React.Component {

    getStyle() {...};

    render() {
        const position = [x,y];
        var geoData = topojson.feature(test_topo,test_topo.objects).geometries;
        return (
            <Map id="my-map" center={position} zoom={10.2}>
                <TileLayer ... />
                <GeoJSON data={geoData} style={this.getStyle} />
            </Map>
        )
    }
}
4

2 回答 2

4

基于提供的 TopoJSON 层,可以为react-leaflet库引入以下用于渲染 TopoJSON 的组件

import React, { useRef, useEffect } from "react";
import { GeoJSON, withLeaflet } from "react-leaflet";
import * as topojson from "topojson-client";

function TopoJSON(props) {
  const layerRef = useRef(null);
  const { data, ...defProps } = 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);
    }
  }

  useEffect(() => {
    const layer = layerRef.current.leafletElement;
    addData(layer, props.data);
  }, []);

  return <GeoJSON ref={layerRef} {...defProps} />;
}

export default withLeaflet(TopoJSON);

笔记:

用法

<Map center={[37.2756537,-104.6561154]} zoom={5}>
    <TileLayer
      attribution='&amp;copy <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
      url="https://{s}.tile.osm.org/{z}/{x}/{y}.png"
    />
     <TopoJSON
      data={data}
      />
</Map>

结果

在此处输入图像描述

这是一个现场演示

于 2020-03-28T15:00:13.310 回答
0

它与您链接的要点非常相似。您需要从 TopoJSON 转换为 GeoJSON 并像通常使用 GeoJSON 一样设置数据。它可以在您的渲染方法中

 import topojson from 'topojson';
 ....
 ....


render() {
  geoData = topojson.feature(topoData,topoData.objects).features;

  return (
    <LeafletMap>
      <GeoJson
        data={geoData}
      />
     </LeafletMap>
  ) 
}
于 2017-02-10T14:49:36.340 回答