이번에는 D3.js를 사용하여 물류맵을 생성하는 과정을 자세히 설명하겠습니다. D3.js를 사용하여 물류맵을 생성할 때 주의사항은 무엇인가요? .
제작 아이디어
배경으로 중국 지도를 그려야 합니다.
코딩 시작하기
1.웹페이지 템플릿 만들기
D3JS를 로드합니다. 편의상 디버깅을 위해 d3.js 파일을 로컬로 직접 다운로드하여 실제 사용 시 로딩 경로로 변경할 수 있습니다. D3의 V4 버전이 사용되며 이는 V3 버전과 다릅니다.
그릴 준비가 된 p 블록을 만듭니다.
rreeeSVG를 만들고 다음 코드를 모두 <script></script>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf8"> <script type="text/javascript" src="../../static/d3/d3.js"></script> <title>地图</title> </head> <body> <p class="fxmap"> </p> </body> <script type="text/javascript"></script> </html>
에 배치하세요. 호출할 준비가 된 SVG 그래픽 그룹 만들기
gmp는 배경 지도와 시작점 마커를 저장합니다.
mline은 시작점과 대상 및 대상점 사이의 연결을 저장합니다.
버튼, 테스트용 버튼
var width=1000 , height=800; // 定义SVG宽高 var svg = d3.select("body p.fxmap") .append("svg") .attr("width", "width) .attr("height", height) .style("background","#000"); //
프로젝션 기능 만들기
경도와 위도는 도면에 직접 사용할 수 없으며 평면 좌표로 변환해야 합니다. d3js는 상대적으로 다양한 투영 방법을 제공합니다. 이 예에서는 geoEquirectangular() 방법이 사용됩니다.
gmap = svg.append("g").attr("id", "map").attr("stroke", "white").attr("stroke-width",1); mline = svg.append("g").attr("id", "moveto").attr("stroke", "#FFF").attr("stroke-width", 1.5).attr("fill","#FFF"); button = svg.append("g").attr("id", "button").attr("stroke", "white").attr("stroke-width", 1).attr("fill", "white");
다중 연결 끝점 호출을 위한 마커 만들기
물류 라인의 끝점은 여러 개 있으므로 모두 마커에서 호출됩니다.
var projection = d3.geoEquirectangular() .center([465,395]) // 指定投影中心,注意[]中的是经纬度 .scale(height) .translate([width / 2, height / 2]); var path = d3.geoPath().projection(projection);
중국 지도를 그리고 출발점(창사)을 표시
지도에 사용된 경도와 위도 세트는 china.json입니다. 온라인에는 많은 파일이 있습니다
marker = svg.append("defs") .append("marker") .append("marker") .attr("id", "pointer") .attr("viewBox","0 0 12 12") // 可见范围 .attr("markerWidth","12") // 标记宽度 .attr("markerHeight","12") // 标记高度 .attr("orient", "auto") // .attr("markerUnits", "strokeWidth") // 随连接线宽度进行缩放 .attr("refX", "6") // 连接点坐标 .attr("refY", "6") // 绘制标记中心圆 marker.append("circle") .attr("cx", "6") .attr("cy", "6") .attr("r", "3") .attr("fill", "white"); // 绘制标记外圆,之后在timer()中添加闪烁效果 marker.append("circle") .attr("id", "markerC") .attr("cx", "6") .attr("cy", "6") .attr("r", "5") .attr("fill-opacity", "0") .attr("stroke-width", "1") .attr("stroke", "white");
지정된 시작점에서 끝점까지 선을 그리는 방법을 만들고 네트워크 지점에 마커를 그립니다.
해당 메소드에는 목적지 도시명(city)과 경도 및 위도(데이터)를 입력해야 합니다.
// 记录长沙坐标 var changsha = projection([112.59,28.12]); // 读取地图数据,并绘制中国地图 mapdata = []; d3.json('china.json', function(error, data){ if (error) console.log(error); // 读取地图数据 mapdata = data.features; // 绘制地图 gmap.selectAll("path") .data(mapdata) .enter() .append("path") .attr("d", path); // 标记长沙 gmap.append("circle").attr("id","changsha") .attr("cx", changsha[0]) .attr("cy", changsha[1]) .attr("r", "6") .attr("fill", "yellow") gmap.append("circle").attr("id","changshaC") .attr("cx", changsha[0]) .attr("cy", changsha[1]) .attr("r", "10") .attr("stroke-width", "2") .attr("fill-opacity", "0"); });
마크 바깥쪽 원의 깜박이는 효과를 얻기 위해 애니메이션 대기열 인스턴스를 만듭니다
// 创建对象,保存每个城市的物流记录数量 var citylist = new Object(); // 创建方法,输入data坐标,绘制发射线 var moveto = function(city, data){ var pf = {x:projection([112.59,28.12])[0], y:projection([112.59,28.12])[1]}; var pt = {x:projection(data)[0], y:projection(data)[1]}; var distance = Math.sqrt((pt.x - pf.x)**2 + (pt.y - pf.y)**2); if (city in citylist){ citylist[city]++; }else{ mline.append("line") .attr("x1", pf.x) .attr("y1", pf.y) .attr("x2", pt.x) .attr("y2", pt.y) .attr("marker-end","url(#pointer)") .style("stroke-dasharray", " "+distance+", "+distance+" ") .transition() .duration(distance*30) .styleTween("stroke-dashoffset", function(){ return d3.interpolateNumber(distance, 0); }); citylist[city] = 1; }; mline.append("circle") .attr("cx", pf.x) .attr("cy", pf.y) .attr("r", 3) .transition() .duration(distance*30) .attr("transform", "translate("+(pt.x-pf.x)+","+(pt.y-pf.y)+")") .remove(); };
테스트 버튼을 만들고 대상 도시 데이터를 테스트하세요
var scale = d3.scaleLinear(); scale.domain([0, 1000, 2000]) .range([0, 1, 0]); var start = Date.now(); d3.timer(function(){ var s1 = scale((Date.now() - start)%2000); // console.log(s1); gmap.select("circle#changshaC") .attr("stroke-opacity", s1); marker.select("circle#markerC") .attr("stroke-opacity", s1); });
이 기사의 사례를 읽으신 후 방법을 마스터하셨다고 믿습니다. 더 흥미로운 정보를 보려면 PHP 중국어 웹사이트의 다른 관련 기사를 주목하세요!
추천 자료:
$.ajax() 메소드 서버에서 json 데이터를 얻는 방법
vue 장바구니의 작은 공 포물선 효과 구현에 대한 자세한 설명
위 내용은 D3.js를 사용하여 물류 지도를 만드는 단계에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!