d3.svg.line().interpolate()
옵션을 사용하여 d3 - smooth edges로 그려진 다각형을주고 싶지만 이상한 결과가 나타납니다. 그것은이 [[lat1, long1], [lat2, long2] ...]
처럼 보이는, 그래서 내가 먼저 수정 - 응답이있을 때 호출 -D3 추기경 보간이 잘못되었습니다.
내가 세계로 API는 그래서 routingCallback 함수 형태 [lat1, long1, alt1, lat2, long2, alt2 ...]
에 좌표 데이터를 여기에 노키아에서 폴리곤 데이터를받을 수 있습니다. d3.svg.line()에서이 좌표 배열을 사용하여 픽셀 위치를 계산합니다.을 사용하여 맵에 다각형을 그려서 map.latLngToLayerPoint() 함수를 사용합니다. 다각형의 실제 그림은 데이터를 사용할 수있는 모든 시간이지도가 나는이 부드러운 가장자리를 생산하는 기대하지만, 대신에 난 작은 얻을
var map = new L.Map("map", {"center": [52.515, 13.38], zoom: 12})
.addLayer(new L.TileLayer('http://{s}.tile.cloudmade.com/---account key---/120322/256/{z}/{x}/{y}.png'));
map.on("viewreset", reset);
var svg = d3.select(map.getPanes().overlayPane).append("svg"),
g = svg.append("g").attr("class", "leaflet-zoom-hide group-element"),
bounds = [[],[]],
polygon,
refinedData,
line = d3.svg.line()
.x(function(d) {
var location = L.latLng(d[0], d[1]),
point = map.latLngToLayerPoint(location);
return point.x;
})
.y(function(d) {
var location = L.latLng(d[0], d[1]),
point = map.latLngToLayerPoint(location);
return point.y;
})
.interpolate("cardinal"),
routingCallback = function(observedRouter, key, value) {
if(value == "finished") {
var rawData = observedRouter.calculateIsolineResponse.isolines[0].asArray(),
refinedData = [];
for(var i = 2; i < rawData.length; i += 3) {
var lon = rawData[i-1],
lat = rawData[i-2];
refinedData.push([lat, lon]);
}
if(polygon)
polygon.remove();
polygon = g
.data([refinedData])
.append("path")
.style("stroke", "#000")
.style("fill", "none")
.attr("class", "isoline");
reset();
}
if(value == "failed") {
console.log(observedRouter.getErrorCause());
}
};
getIsolineData = function(isoline) {
return data;
};
function reset() {
var xExtent = d3.extent(refinedData, function(d) {
var location = L.latLng(d[0], d[1]);
var point = map.latLngToLayerPoint(location);
return point.x;
});
var yExtent = d3.extent(refinedData, function(d) {
var location = L.latLng(d[0], d[1]);
var point = map.latLngToLayerPoint(location);
return point.y;
});
bounds[0][0] = xExtent[0];
bounds[0][1] = yExtent[0];
bounds[1][0] = xExtent[1];
bounds[1][1] = yExtent[1];
var topLeft = bounds[0],
bottomRight = bounds[1];
svg .attr("width", bottomRight[0] - topLeft[0])
.attr("height", bottomRight[1] - topLeft[1])
.style("left", topLeft[0] + "px")
.style("top", topLeft[1] + "px");
g .attr("transform", "translate(" + -topLeft[0] + "," + -topLeft[1] + ")");
polygon.attr("d", line);
}
을 확대 도착 직후 routingCallback에서 호출 리셋()에서 발생 모든 구석에 루프. 빨간색 오버레이는 보간없이 동일한 다각형입니다. 구석에만 포인트가 있습니다. 포인트가 없습니다.
그것은 점 (시계 방향/반 시계 방향)의 순서와 함께 할 수있는 뭔가가 있나요? 포인트를 재 배열하려고했지만 아무 일도 일어나지 않았다.
이 경우 점의 순서는 중요하지 않습니다. 전체 예제를 게시 할 수 있습니까? –
각 구석의 직전 및 직후에 점을 추가하여 둥근 모서리를 만들려고합니까? 어떤 경우에는 잘못된 순서로 앞뒤에 추가한다고 생각합니다. 하지만 요점은 더 이상 필요하지 않다고 생각합니다. 추기경 보간은 지정된 핵심 포인트 만 사용하여 모서리를 부드럽게 만듭니다. 선 기능에서 [장력] (https://github.com/mbostock/d3/wiki/SVG-Shapes#wiki- line_tension) 매개 변수를 변경하여 모퉁이의 반경을 대략 제어 할 수 있습니다. – AmeliaBR
@LarsKotthoff 내 게시물을 업데이트하고보다 완벽한 예를 추가했습니다. – Flavio