Advertisement
Guest User

projection

a guest
Feb 12th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
HTML 6.49 KB | None | 0 0
  1. <!DOCTYPE html>
  2. <meta charset="utf-8">
  3. <script src="http://d3js.org/d3.v4.min.js"></script>
  4. <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  5. <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" />
  6. <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
  7. <style type="text/css">
  8. .select2-results__option, .select2-selection__choice, .select2-search__field {
  9.     font-size: 20px !important;
  10. }
  11. h1 {
  12.    font-family: 'RavaliItalic';
  13.    font-weight: normal;
  14.    font-style: italic;
  15. }
  16. body {
  17.   background-color: #AAA;
  18. }
  19. .overlay {
  20.   fill: none;
  21.   pointer-events: all;
  22. }
  23. svg,div {
  24.     margin-left:auto;
  25.     margin-right:auto;
  26.     display:block;
  27. }
  28. #controls {
  29.     text-align:center;
  30. }
  31. .footer,li {
  32.    font-size: x-small;
  33. }
  34. a {
  35.     color:#7A2B1F;
  36. }
  37. select {
  38.     background-color:#777;
  39. }
  40. table {
  41.     width: 400px;
  42.     text-align: center;
  43.     border: 0;
  44.     margin-left: auto;
  45.     margin-right: auto;
  46. }
  47. td {
  48.     width: 50%;
  49. }
  50. </style>
  51. </head>
  52.  
  53. <body>
  54. <script>
  55.  
  56. var imgHeight = 3490, imgWidth = 6980,      // Image dimensions (don't change these)
  57.     width =  1300, height = 650,             // Dimensions of cropped region
  58.     translate0 = [0,0], scale0 = 0.25,  // Initial offset & scale
  59.     datum = {}
  60.    datumInit = {"x":650,"y":330,"scale":0.75};    //Transition Variables
  61.    
  62. svg = d3.select("body").append("svg")
  63.     .style("border","1px solid black")
  64.     .attr("width",  width + "px")
  65.     .attr("height", height + "px");
  66.  
  67. svg.append("rect")
  68.     .attr("class", "overlay")
  69.     .attr("width", width + "px")
  70.     .attr("height", height + "px");
  71.    
  72. zoomer = d3.zoom().scaleExtent([0.25, 4]).on("zoom", zoom);
  73.  
  74. svg = svg.append("g")
  75.     .attr("transform", "translate(" + translate0 + ")scale(" + scale0 + ")")
  76.     .call(zoomer)
  77.     .append("g");
  78.  
  79. svg.append("image")
  80.     .attr("width",  imgWidth + "px")
  81.     .attr("height", imgHeight + "px")
  82.     .attr("xlink:href", "TalanisFinal-noborder.jpg");
  83. svg.append("image")
  84.     .attr("width",  imgWidth + "px")
  85.     .attr("height", imgHeight + "px")
  86.     .attr("id","politics")
  87.     .attr("xlink:href", "TalanisPolitics-noborder.png");
  88. distline = svg.append("line")
  89.     .attr("display","none")
  90.     .attr("x1",0)
  91.     .attr("x2",0)
  92.     .attr("y1",0)
  93.     .attr("y2",0)
  94.     .attr("stroke-width",5)
  95.     .attr("stroke","red");
  96.    
  97. function zoom() {
  98.   svg.attr("transform", d3.event.transform);
  99.   console.log(""+d3.event.transform);
  100. }
  101.  
  102. //Construct form elements
  103. controls = d3.select("body").append("div").attr("id","controls");
  104. polbox = controls.append("div");
  105. polbox.append("input").attr("type","checkbox").attr("id","politicscb").attr("checked","true").on("change",politicschange);
  106. polbox.append("label").text("Politics Overlay");
  107. sel2 = controls.append("select").attr("id","sel2");
  108. distance = controls.append("div").attr('id','dist').style("display",'none');
  109.   distance.append("p").html("Distance between selected points: <span id='distspan'></span> miles");    
  110.  
  111. d3.json("Talanis.json",function(err,data) {
  112.   mapdataByRegion = d3.nest().key(function(d) { return d.area; }).sortKeys(d3.ascending)
  113.   .sortValues(function(a,b) { return a.name < b.name ? -1 : a.name > b.name ? 1 : a.name >= b.name ? 0 : NaN; } ).entries(data);
  114.   [1,2,3].forEach(function(z) {
  115.         d3.select("#sel"+z).selectAll("option").data(mapdataByRegion)
  116.             .enter()
  117.             .append("optgroup").attr("label",function(d) { return d.key; })
  118.             .selectAll("option").data(function (d) { return d.values; })
  119.                 .enter()
  120.                 .append("option").text(function(d) {return d.name}).attr('value',function(d) {return d.name});
  121.   });
  122. });
  123.  
  124. function politicschange() {
  125.     d3.select("#politics").style("display",(d3.select("#politicscb").property("checked")) ? 'inline' : 'none');
  126. }
  127.  
  128. function locate() {
  129.     distline.style("display","none");
  130.     distance.style("display","none");
  131.     datum = sel2.select("option[value=\""+$("#sel2").select2('data')[0]['id']+"\"]").data()[0];
  132.     console.log(datum);
  133.     svg.transition().duration(1000)
  134.     .call(zoomer.transform,transform);
  135. }
  136.  
  137. function dist() {
  138.     var R = 2266.45;
  139.     var datum1 =    sel2.select("option[value=\""+$("#sel2").select2('data')[0]['id']+"\"]").data()[0];
  140.     var datum2 = sel2.select("option[value=\""+$("#sel2").select2('data')[1]['id']+"\"]").data()[0];
  141.     if(datum1 == undefined || datum2 == undefined) { return; }
  142.     var lat1 = (datum1.y-(imgHeight/2))/(imgHeight/2)*Math.PI/2;
  143.     var lat2 = (datum2.y-(imgHeight/2))/(imgHeight/2)*Math.PI/2;
  144.     var dlat = Math.abs(lat1-lat2);
  145.     var dlon = Math.abs((((datum2.x-(imgWidth/2)) - (datum1.x-(imgWidth/2)))/(imgWidth/2))*Math.PI);
  146.     var a = Math.sin(dlat/2) * Math.sin(dlat/2) +
  147.         Math.cos(lat1) * Math.cos(lat2) *
  148.         Math.sin(dlon/2) * Math.sin(dlon/2);
  149.     var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  150.     var d = R * c;
  151.     distline.attr("x1",datum1.x).attr("x2",datum2.x).attr("y1",datum1.y).attr("y2",datum2.y).style("display","inline");
  152.       var dx = Math.abs(datum1.x - datum2.x),
  153.       dy = Math.abs(datum1.y - datum2.y),
  154.       x = (datum1.x + datum2.x) / 2,
  155.       y = (datum1.y + datum2.y) / 2;
  156.       datum.scale = (3.25-(Math.max(dx/imgWidth,dy/imgHeight))*3.25)+0.74;
  157.       datum.x = x;
  158.       datum.y = y;
  159.     svg.transition().duration(1000).call(zoomer.transform,d3.zoomIdentity
  160.     .scale(4)
  161.     .translate(width/2, height/2)
  162.     .translate(-datum.x,-datum.y));
  163.     //svg.transition().duration(1000).call(zoomer.transform,d3.zoomIdentity
  164.     //.scale(datum.scale));
  165.     d3.select("#distspan").text(Math.round((d + 0.00001) * 100) / 100);
  166.     distance.style("display","block");
  167. }
  168.  
  169. function reset() {
  170.     distline.style("display","none");
  171.     distance.style("display","none");  
  172.     datum = {"x":650,"y":330,"scale":0.75};
  173.     svg.transition().duration(1000).call(zoomer.transform,d3.zoomIdentity
  174.     .scale(datumInit.scale)
  175.     .translate(width/2, height/2)
  176.     .translate(-datumInit.x,-datumInit.y));
  177. }
  178.  
  179. function transform() {
  180.     return d3.zoomIdentity
  181.     .scale(4)  
  182.     .translate(width/2, height/2)
  183.     .translate(-datum.x,-datum.y);
  184. }
  185.     svg.transition().duration(1000)
  186.     .call(zoomer.transform,d3.zoomIdentity
  187.     .scale(datumInit.scale)
  188.     .translate(width/2, height/2)
  189.     .translate(-datumInit.x,-datumInit.y));
  190. $("#sel2").select2({
  191.   width: "400px",
  192.   multiple: true,
  193.   maximumSelectionLength: 2,
  194.   placeholder: "Choose Location",
  195.   allowClear: true  
  196. });
  197.  
  198. $("#sel2").on('change', function (e) {
  199.     var numsel = $("#sel2").select2('data').length;
  200.     if(numsel == 2) { dist(); }
  201.     else if (numsel == 1) { locate(); }
  202.     else reset();
  203. });
  204. </script>
  205. </body>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement