Skip to content

Instantly share code, notes, and snippets.

@nommuna2
Last active January 8, 2020 17:29
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nommuna2/d42ffb576a0288106e1fbd57a0cf6536 to your computer and use it in GitHub Desktop.
Save nommuna2/d42ffb576a0288106e1fbd57a0cf6536 to your computer and use it in GitHub Desktop.
(ArcGIS API for JavaScript) Sample of using chart.js with the Esri 4.7 API
html, body, #viewDiv {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no">
<title>Feature Layer</title>
<link rel="stylesheet" href="https://js.arcgis.com/4.7/esri/css/main.css">
<link rel="stylesheet" href="indexstylesheet.css">
<script>
const options = {
// tell Dojo where to load other packages
dojoConfig: {
async: true,
packages: [
{
location: 'https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.js',
name: 'Chart'
}
]
}
};
</script>
<script src="https://js.arcgis.com/4.7/"></script>
</head>
<body>
<div id="viewDiv"></div>
</body>
<script src="index.js"></script>
</html>
//Please go to the following jsbin for a working sample: https://jsbin.com/nejolahicu/1/edit?html,js,output
//Depending on server load, it may take awhile for the feature layer to load and be displayed on the map.
require([
"esri/Map",
"esri/views/MapView",
"esri/PopupTemplate",
"esri/layers/FeatureLayer",
"esri/widgets/Popup",
"esri/tasks/support/Query",
"https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.js",
"dojo/domReady!"
],
function (Map, MapView, PopupTemplate, FeatureLayer, Popup, Query, Chart) {
var featureLayerRenderer = {
type: "simple",
symbol: {
type: "simple-fill",
style: "solid",
color: "white",
}
};
var featureLayer = new FeatureLayer({
url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/2",
definitionExpression: "STATE_NAME = 'California'",
renderer: featureLayerRenderer,
visible: true
});
var map = new Map({
basemap: "dark-gray",
layers: [featureLayer]
});
var view = new MapView({
container: "viewDiv",
map: map,
center: [-117.1825, 34.0556],
zoom: 5,
popup: {
dockEnabled: true,
visible: false,
dockOptions: {
buttonEnabled: true,
breakpoint: false,
position: "auto"
}
}
});
// Create a query to get data from the feature layer
var query = new Query();
query.returnGeometry = true;
query.outFields = ["STATE_NAME", "WHITE", "BLACK", "ASIAN", "HAWN_PI", "OTHER", "HISPANIC"];
query.where = "1=1";
query.num = 50;
// On view click, query the feature layer and pass the results to setContentInfo function.
view.on("click", (e) => {
query.geometry = e.mapPoint;
featureLayer.queryFeatures(query).then((results) =>{
if(results.features[0].attributes.STATE_NAME === "California"){
view.popup.visible = true;
view.popup.open({
title: "Doughnut Graph Example",
content: setContentInfo(results.features[0].attributes)
});
}
});
});
// Using the data from the feature layer, create a doughnut graph.
function setContentInfo(results){
// Create a new canvas element, this is where the graph will be placed.
var canvas = document.createElement('canvas');
canvas.id = "myChart";
// Create a data object, this will include the data from the feature layer and other information like color or labels.
var data = {
datasets:[{
data: [results.ASIAN, results.BLACK, results.HAWN_PI, results.HISPANIC, results.OTHER, results.WHITE],
backgroundColor: ["#4286f4", "#41f4be", "#8b41f4", "#e241f4", "#f44185", "#f4cd41"]
}],
labels: [
'Asian',
'Black',
'Hawaiian',
'Hispanic',
'Other',
'White'
]
};
// Create a new Chart and hook it to the canvas and then return the canvas.
var myPieChart = new Chart(canvas,{
type: 'doughnut',
data: data
});
return canvas;
}
});
@rhodul
Copy link

rhodul commented Jan 8, 2020

This is exactly the problem I'm trying to solve, except my code is in TypeScript and when compiled it does not insert the URL into a define injection section.
This TS import:
import * as jsPDF from 'jspdf';
Compiles to:
define(["require", "exports", "jspdf"]

and then the loader goes and looks for jspdf.js at arcgis.com.

I tried everything, when I import from URL TS complains.
I even tried to wrap jspdf in plain DoJo module, but that too I can't import to TS.

Is there a TS example of your snippet?

Thanks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment