reactjs - 我如何获得用于反应传单的 Gall-peters 世界地图的 geoJson 文件
问题描述
如何获得 Gall-peter geojson 或如何制作
我已经使用 react 传单使用 geojson 数据制作交互式地图,它运行良好,但现在我需要将地图投影更改为 Gall-peters 地图,所以我需要特定地图投影的 geojson,我怎么能得到它。现在我正在使用墨卡托地图geojson数据
解决方案
首先,让我们现在忘记 react 和 react-leaflet。让我们只关注您要使用传单做什么。您需要更改地图使用的投影/CRS。要使用不太常见的投影创建地图,您可以使用传单插件Proj4Leaflet。您还需要投影定义。对于具有投影代码“cea”(圆柱等面积)的 Gall-peters,您可以在此处找到与 Proj4Leaflet 一起使用的 Proj4 代码。总而言之,在该投影中创建地图:
import "proj4leaflet";
const resolutions = Array.from({ length: 15 })
.map((_, i) => (i + 200) ** 2)
.reverse();
// Define your projection
var crs = new L.Proj.CRS(
"SR-ORG:6838",
"+proj=cea +lon_0=0 +x_0=0 +y_0=0 +lat_ts=45 +ellps=WGS84 +datum=WGS84 +units=m +no_defs",
{
resolutions,
origin: [0, 0]
}
);
var map = L.map("leafletMapid", { crs, ...otherOptions });
现在,将 GeoJSON 添加到地图将自动在该投影中。请注意resolutions
变量,它需要一些微调才能使事情正常工作。
香草传单密码箱
让它在 react-leaflet 中工作只是创建该投影并将其提供给MapContainer
:
const Map = (props) => {
const [data, setData] = useState();
useEffect(() => {
// fetch geojson on mount and save to state
fetch("geojsonurl")
.then((r) => r.json())
.then((r) => setData(r));
}, []);
return (
<MapContainer
{...mapOptions}
crs={crs} // defined in the same way as above
>
{data && <GeoJSON data={data} />}
</MapContainer>
);
};
工作反应传单代码和框
如您所见,您在所需的投影中有一个带有 GeoJSON 的 react-leaflet 地图。
请注意,如果您想在其下方放置一个也遵循此投影的切片图层,那就是另一回事了。您可以查看Proj4Leaflet上的文档以了解有关如何执行此操作的更多信息。
我遇到了一些Invalid LatLng object: (NaN, -130.1624500907549)
错误,尽管它似乎没有影响地图。我 100% 确定它与 proj4leaflet 使用resolutions
. 对于那些沙箱,我使用一些 css on 禁用了错误覆盖iframe
。
推荐阅读
- python - 当我的枪旋转时,我怎样才能让我的 Rect 跟随我的枪尖?游戏
- python - 熊猫根据特定列计算百分比变化
- ios - 使用 UIDocument 和 Swift 将 plist NSdata 与 iCloud 同步
- r - R:找到在一定次数的迭代中不减少的向量中的位置
- javascript - 通过 CDN 提供 JS 小部件
- python-3.x - 如何流式传输包含文件结构中其他压缩对象的 tar 目录/文件夹?
- javascript - 如何在调用对象后更改它以便可以将其插入到链接中
- mysql - 需要编写一个查询而不是 5 个查询来获得所有 5 个状态的结果
- c# - 如何在 C# 中对证书签名请求进行自签名?充气城堡还可以
- swiftui - 如何在 IBSegueAction 上设置 NSHostingController 的 rootView?