我有一个Blazor .NET 6项目,我有一个名为UprRoutesMap的组件。razor我的组件很简单,这是代码:
<div id="@elementid"></div>
字符串
现在我有一个代码隐藏文件名UprRoutes.razor.cs
大多数代码依赖于JavaScript invoke方法和来自我的js文件的.net方法调用。我的文件看起来像这样:
public partial class UprRoutesMap
{
string elementid = "map";
Size _windowSize;
[Inject]
public IJSRuntime JSRuntime { get; set; } = default!;
protected override async Task OnAfterRenderAsync(bool firstRender)
{
var dotnetObjectRef = DotNetObjectReference.Create(this);
if (firstRender)
{
await JSRuntime.InvokeVoidAsync("uprRoutesMapInterop.registerSizeHandler", dotnetObjectRef);
await JSRuntime.InvokeVoidAsync("uprRoutesMapInterop.initialize", elementid, _windowSize.Width);
}
await JSRuntime.InvokeVoidAsync("uprRoutesMapInterop.initialize", elementid, _windowSize.Width);
}
[JSInvokable]
public void SetWindowSize(Size windowSize)
{
_windowSize = windowSize;
StateHasChanged();
}
}
型
这些文件工作正常,没有什么问题,我的问题来了,当我试图使用d3.js从我的UprRoutesMap.js
这是我的js文件代码:
(function () {
var tileUrl = 'https://api.maptiler.com/maps/openstreetmap/{z}/{x}/{y}.jpg?key=i2elDrPBTCAtHTT60x3M';
var tileAttribution = '<a href="https://www.maptiler.com/copyright/" target="_blank">© MapTiler</a> <a href="https://www.openstreetmap.org/copyright" target="_blank">© OpenStreetMap contributors</a>';
var mapCenterAndZoom = {
center: [25.505, -90],
zoom: 5
};
var mapSettings = {
scrollWheelZoom: false
};
var mapBoxTiles = L.tileLayer(tileUrl, { attribution: tileAttribution });
window.uprRoutesMapInterop = {
initialize: function (elementId, width) {
var elem = document.getElementById(elementId);
if (!elem) {
throw new Error('No element with ID ' + elementId);
}
if (elem) {
resetMap(elem.map);
mapCenterAndZoom = SetMapPosition(width);
elem.map = L.map(elementId, mapSettings).setView(mapCenterAndZoom.center, mapCenterAndZoom.zoom)
.addLayer(mapBoxTiles)
.on('focus', onFocusMap)
.on('blur', onBlurMap);
}
var map = elem.map;
// we will be appending the SVG to the Leaflet map pane
// g (group) element will be inside the svg
var svg = d3.select(map.getPanes().overlaypane).append("svg");
// if you don't include the leaflet-zoom-hide when a
// user zooms in or out you will still see the phantom
// original SVG
var g = svg.append("g").attr("class", "leaflet-zoom-hide");
//read in the GeoJSON. This function is asynchronous so
// anything that needs the json file should be within
d3.json("/json/upr-routes.geojson").then(function (collection) {
var featuresdata = collection.features.filter(function (d) {
return d.properties.id == "upr-001";
});
}).catch(error => console.error(error));
},
//Call .NET Method on UprRouteMap Component
registerSizeHandler: function (dotNetObjectRef) {
function resizeHandler() {
dotNetObjectRef.invokeMethodAsync('SetWindowSize',
{
width: window.innerWidth,
height: window.innerHeight
});
}
//Set Up Initial Values
resizeHandler();
window.addEventListener('resize', resizeHandler);
}
};
function resetMap(map) {
if (map != undefined) {
map.off();
map.remove();
}
}
function SetMapPosition(width) {
if (width < 320) {
return {
center: [10.505, -100],
zoom: 3
};
}
if (width >= 320 && width < 450) {
return {
center: [10.505, -100],
zoom: 3
};
}
if (width >= 450 && width < 600) {
return {
center: [10.505, -100],
zoom: 4
};
}
if (width >= 600 && width < 900) {
return {
center: [13.505, -97],
zoom: 4
};
}
if (width >= 900 && width < 1100) {
return {
center: [22.505, -103.3],
zoom: 5
};
}
if (width >= 1100 && width < 1250) {
return {
center: [22.505, -103.3],
zoom: 5
};
}
if (width >= 1250 && width < 1500) {
return {
center: [22.505, -95],
zoom: 5
};
}
if (width >= 1500 && width < 1920) {
return {
center: [22.505, -93],
zoom: 5
};
}
if (width >= 1920) {
return {
center: [25.505, -90],
zoom: 5
};
}
}
function onFocusMap(e) {
e.target.scrollWheelZoom.enable();
}
function onBlurMap(e) {
e.target.scrollWheelZoom.disable();
}})();
型
d3.json(“/json/upr-routes.geojson”)
我的头痛开始,我得到一个404错误,我改变了路径wwwroot/json/upr-routes.geojson,但其结果相同.
谁能帮帮我,我错过了什么?
如果有人能帮我找出一个解决方案,因为我需要使用d3.js来添加动画到数据中。
我可以使用vs代码来完成这个工作,但是在一个web静态项目中,而不是像blazor.net6这样的web应用程序。
希望有人能帮我解决这个问题。
2条答案
按热度按时间w1e3prcc1#
假设
upt-routes.geojson
位于Blazor项目的wwwroot/json
文件夹中,请尝试删除路径中的前导/
:字符串
vkc1a9a22#
我昨天才解决了这个问题,我犯了一个错误,试图在d3.json()方法中加载.geojson文件,但该方法只接受.json文件。
我感到困惑,因为leaflet.js有一个.geojson()方法,它读取.geojson文件中显示的信息,但是.geojson一旦你读取它,它就是纯json文件,所以我只是将我的文件的扩展名部分从upr-routes.geojson更改为upr-routes.json,这就成功了!
d3.json()现在完美地读取了该文件中的信息!
希望这对社区有帮助!