\n\n\n Texas A&M Forest Service
\n
\n 200 Technology Way Drive, Suite 1281
\n College Station, TX 77845-2424\n\n
\n\n\n Xufang Zhang, PhD
\n
\n Forest Economist
\n Email: xufang.zhang@tfs.tamu.edu\n\n
\n\n\n Call
\n \n Text a Question
\n Phone: (979) 458-6630\n
\n Phone: (937) 839-8837\n \n\n
Download Reports (PDF)
\n\nClick on one of the links below to download a\n report
\n\n\n\n\n \n Texas*\n 2007\n 2008 \n 2009 \n 2010 \n 2011 \n 2012 \n 2013 \n 2014 \n 2015 \n 2019 \n 2021 \n 2024 \n \n \n\n \n\n \n \n\n |
2024 County (East Texas only):
\n\n\n\n \n | \n\n\n \n | \n\n \n | \n\n\n\n\n\n
\n \n | \n\n \n | \n\n \n | \n\n\n
\n \n | \n\n \n | \n\n \n | \n
\n \n | \n\n \n | \n\n \n | \n
\n \n | \n\n \n | \n\n \n | \n\n
\n\n \n | \n\n \n | \n\n \n | \n\n
\n \n | \n\n \n | \n\n \n | \n
\n \n | \n\n \n | \n\n \n | \n
\n \n | \n\n \n | \n\n \n | \n\n
\n \n | \n\n \n | \n\n \n | \n\n
\n \n | \n\n \n | \n\n \n | \n\n
\n \n | \n\n \n | \n\n \n | \n\n
\n \n | \n\n \n | \n\n \n | \n\n\n\n
\n \n | \n\n \n | \n\n \n\n |
* All years were re-analyzed using methods consistent with the 2012\n analysis.
\n\n ** These represent original analyses that use different econometric\n models than the most recent analysis; thus, the contributions are not directly comparable to re-estimated flyers.\n For trend information, please see the \"Trends\" section of this website.\n
\n\n
\nEast Texas County Trends
\nClick a county on the map to view stats for the county.
\n\nClick a county on the map to view individual values for the county.
\r\n{{legendtext}}
\r\n\" + eventname + \"
\" +\n \"\" + \"\" + measurerounding.toString() + \"
\" + \"\"\n return div;\n }\n\n\n this.template = {\n // autocasts as new PopupTemplate()\n title: \"{NAME} County\",\n //autoCloseEnabled: true,\n content: templateContent\n }\n\n this.mapView.popup.watch(\"selectedFeature\", function (graphic) {\n if (graphic) {\n this.collapseEnabled = false;\n }\n\n });\n\n this.economicimpactLayer.popupTemplate = this.template\n\n\n rendererResponse.renderer.defaultLabel = \"No data available*\"\n this.economicimpactLayer.renderer = rendererResponse.renderer;\n if (!this.map.layers.includes(this.economicimpactLayer)) {\n this.map.add(this.economicimpactLayer);\n }\n this.renderer.setStyle(this.legendcontainerdiv.last.nativeElement, 'display', 'block');\n }, (error) => {\n\n console.log(error);\n });\n\n\n\n }\n\n\n this.mapView.when(\n ).catch(err => {\n // this is for in case user is using old phones that do not support the latest esri js libray, we can test in on Galaxy SIII for example\n Swal.fire(\"Your browser is not currently supported. Please use the latest version of Chrome, Microsoft Edge, Opera, Firefox or Safari\")\n }).then(() => {\n const graphic = {\n\n };\n popup.watch(\"collapsed\", function (value) {\n popup.collapsed = false;\n });\n this.feature = new Feature({\n container: \"feature-node\",\n graphic: graphic,\n map: this.mapView.map,\n spatialReference: this.mapView.spatialReference\n });\n\n var mouseOverSymbol = {\n type: \"simple-fill\", color: [0, 255, 255, 0.25],\n outline: { // autocasts as SimpleLineSymbol\n color: new Color([0, 255, 255, 1]),\n width: 2\n }\n\n\n };\n\n\n this.mapView.whenLayerView(this.economicimpactLayer).then((layerView) => {\n let highlight;\n // listen for the pointer-move event on the View\n this.mapView.on(\"pointer-move\", (event) => {\n // Perform a hitTest on the View\n\n // Perform a hitTest on the View\n this.mapView.hitTest(event).then((hitTestResult) => {\n\n if (hitTestResult.results.length) {\n const result = hitTestResult.results[0];\n highlight && highlight.remove();\n // Update the graphic of the Feature widget\n // on pointer-move with the result\n if (result) {\n graphicsLayer2.removeAll();\n this.feature.graphic = result.graphic;\n this.feature.graphic.symbol = mouseOverSymbol;\n graphicsLayer2.add(this.feature.graphic)\n\n\n } else {\n //this.feature.graphic = graphic;\n }\n }\n else {\n graphicsLayer2.removeAll();\n }\n });\n //this.mapView.hitTest(event).then((hitTestResult) => {\n\n // if (hitTestResult.results.length) {\n // const result = hitTestResult.results[0];\n // highlight && highlight.remove();\n // // Update the graphic of the Feature widget\n // // on pointer-move with the result\n // if (result && hitTestResult.results[0].graphic != null) {\n // if (hitTestResult.results[0].graphic.layer.id == \"economicimpact\") {\n // this.feature.graphic = hitTestResult.results[0].graphic;\n // this.feature.graphic.symbol = mouseOverSymbol;\n // //this.mapView.popup.location = hitTestResult.results[0].graphic.geometry.extent.center;\n // //// this.mapView.popup.content = hitTestResult.results[0].graphic.layer;\n // //// graphicsLayer2.add(this.feature.graphic)\n\n // //this.mapView.popup.open();\n // }\n // else {\n // //this.feature.graphic = graphic;\n // // this.mapView.popup.close();\n\n // }\n // } else {\n // //this.feature.graphic = graphic;\n // // this.mapView.popup.close();\n // // this.mapView.popup.close();\n // }\n // }\n // else {\n // graphicsLayer2.removeAll();\n // }\n //});\n });\n });\n });\n\n\n const graphicsLayer2 = new GraphicsLayer({\n id: \"tempGraphics2\"\n });\n\n this.economicimpactLayer.definitionExpression = \"DATA_YEAR_TXT = '\" + this.selectedYear + \"'\"\n this.generateRenderer(this.selectedMeasure, this.selectedMeasureChange, this.industryoutputcolorsandclasses, this.industryoutputcolors)\n\n var economicimpactQuery = this.economicimpactLayer.createQuery();\n economicimpactQuery.where = \"DATA_YEAR_TXT = '2021'\";\n this.economicimpactLayer.queryFeatures(economicimpactQuery).then(response => {\n response.features.map(function (feature) {\n var yoffset = feature.attributes.YOffset.toString() + \"px\";\n var xoffset = feature.attributes.XOffset.toString() + \"px\";\n var anglefromfield = feature.attributes.Angle;\n\n var countytext = feature.attributes.NAME\n // identify which counties have two words for the name and break the second word to the next line\n if (countytext.trim().indexOf(' ') != -1) {\n\n var firstword = countytext.split(' ').slice(0, 1).toString();\n var secondword = countytext.split(' ').slice(1, 2).toString();\n countytext = firstword + \"\\n\" + secondword\n }\n\n\n const textSymbol = {\n type: \"text\",\n text: countytext,\n\n angle: feature.attributes.Angle,\n color: new Color([104, 104, 104]),\n font: {\n size: \"11px\",\n family: \"Arial\",\n weight: \"bold\"\n },\n haloColor: \"white\",\n haloSize: 1.3,\n lineWidth: 49,\n yoffset: yoffset,\n xoffset: xoffset\n\n }\n\n var graphic = new Graphic({\n geometry: feature.geometry,\n symbol: textSymbol\n });\n graphicsLayer.add(graphic);\n })\n\n this.map.add(graphicsLayer)\n\n this.map.add(graphicsLayer2)\n })\n\n\n //this.mapView.on(\"pointer-move\", function (event) {\n // //console.log(event);\n //});\n })\n .catch(err => {\n console.log(err);\n });\n\n } // ngOnInit\n\n hideRadioButtons = () => {\n this.renderer.setStyle(this.radiobuttondiv.toArray()[0].nativeElement, 'display', 'none');\n this.renderer.setStyle(this.radiobuttondiv.toArray()[1].nativeElement, 'display', 'none');\n }\n\n showRadioButtons = () => {\n this.renderer.setStyle(this.radiobuttondiv.toArray()[0].nativeElement, 'display', 'block');\n this.renderer.setStyle(this.radiobuttondiv.toArray()[1].nativeElement, 'display', 'block');\n }\n MeasureorYearChangeFunction = (event: any) => {\n\n this.economicimpactLayer.definitionExpression = \"DATA_YEAR_TXT = '\" + this.selectedYear + \"'\"\n let measure = mapvars.mapseconomiimpactarray.find(o => o.name === this.selectedMeasure)\n if (this.selectedImpactType == \" Total Contribution\" && !measure.name.includes(\"Employment\")) {\n this.selectedMeasureChange = measure.totalvalue\n this.legendtext = \"Total Contribution (Million $)\"\n }\n if (this.selectedImpactType == \" Direct Contribution\" && !measure.name.includes(\"Employment\")) {\n this.selectedMeasureChange = measure.directvalue\n this.legendtext = \"Direct Contribution (Million $)\"\n }\n\n if (this.selectedImpactType == \" Direct Contribution\" && measure.name.includes(\"Employment\")) {\n this.selectedMeasureChange = measure.directvalue\n this.legendtext = \"Jobs\"\n }\n if (this.selectedImpactType == \" Total Contribution\" && measure.name.includes(\"Employment\")) {\n this.selectedMeasureChange = measure.totalvalue\n this.legendtext = \"Jobs\"\n }\n mapvars.employmentmeasures.forEach((measure1) => {\n if (measure1 == this.selectedMeasureChange) {\n this.measurescolorsandclass = mapvars.employmentcolorsandclasses;\n this.measurescolors = mapvars.employmentcolors;\n this.directvalueaddedselected = false;\n this.showRadioButtons()\n }\n });\n mapvars.industryoutputmeasures.forEach((measure2) => {\n if (measure2 == this.selectedMeasureChange) {\n this.measurescolorsandclass = mapvars.industryoutputcolorsandclasses;\n this.measurescolors = mapvars.industryoutputcolors\n this.directvalueaddedselected = false;\n this.showRadioButtons()\n }\n });\n mapvars.laborincomemeasures.forEach((measure3) => {\n if (measure3 == this.selectedMeasureChange) {\n this.measurescolorsandclass = mapvars.laborincomecolorsandclasses;\n this.measurescolors = mapvars.laborincomecolors;\n this.directvalueaddedselected = false;\n this.showRadioButtons()\n }\n })\n mapvars.directvalueaddedmeasures.forEach((measure4) => {\n if (measure4 == this.selectedMeasureChange) {\n this.measurescolorsandclass = mapvars.directvalueaddedcolorsandclasses;\n this.measurescolors = mapvars.directvalueaddedcolors;\n this.directvalueaddedselected = true;\n this.legendtext = \"Direct Value Added (Million $)\"\n this.hideRadioButtons();\n }\n })\n this.mapView.popup.close();\n this.generateRenderer(measure.name, this.selectedMeasureChange, this.measurescolorsandclass, this.measurescolors);\n }\n\n //event handler for the radio button's change event\n radioChangeHandler = (impactType: any) => {\n console.log(\"Previous: \", this.selectedImpactType);\n\n this.selectedImpactType = impactType\n console.log(\"Updated to: \", this.selectedImpactType);\n // this.selectedImpactType = this.ImpactType; // Manually update the variable\n\n this.economicimpactLayer.definitionExpression = \"DATA_YEAR_TXT = '\" + this.selectedYear + \"'\"\n var measure = mapvars.mapseconomiimpactarray.find(o => o.name === this.selectedMeasure)\n if (this.selectedImpactType == \" Total Contribution\") {\n this.selectedMeasureChange = measure.totalvalue;\n this.legendtext = \"Total Contribution (Million $)\"\n }\n if (this.selectedImpactType == \" Direct Contribution\") {\n this.selectedMeasureChange = measure.directvalue;\n this.legendtext = \"Direct Contribution (Million $)\"\n }\n this.mapView.popup.close();\n this.generateRenderer(measure.name, this.selectedMeasureChange, this.measurescolorsandclass, this.measurescolors);\n }\n}\n","\n\nexport const mapseconomiimpactarray = [{ name: \"Industry Output Totals\", totalvalue: \"TotImpTotalInd\", directvalue: \"DirTotalInd\" },\n { name: \"Employment Totals\", totalvalue: \"TotImpTotalEmp\", directvalue: \"DirTotalEmp\" },\n { name: \"Labor Income Totals\", totalvalue: \"TotImpTotalLabInc\", directvalue: \"DirTotalLabInc\" },\n { name: \"Direct Value Added Totals\", totalvalue: \"DirTotalIndirBusTax\", directvalue: \"DirTotalIndirBusTax\" },\n\n { name: \"Forestry Industry Output\", totalvalue: \"ForTotImpIndOut\", directvalue: \"ForDirIndOut\" },\n { name: \"Forestry Employment\", totalvalue: \"ForTotImpEmp\", directvalue: \"ForDirEmp\" },\n { name: \"Forestry Labor Income\", totalvalue: \"ForTotImpLabInc\", directvalue: \"ForDirLabInc\" },\n { name: \"Forestry Direct Value Added\", totalvalue: \"ForIndirBusTax\", directvalue: \"ForIndirBusTax\" },\n\n { name: \"Logging Industry Output\", totalvalue: \"LogTotImpIndOut\", directvalue: \"LogDirIndOut\" },\n { name: \"Logging Employment\", totalvalue: \"LogTotImpEmp\", directvalue: \"LogDirEmp\" },\n { name: \"Logging Labor Income\", totalvalue: \"LogTotImpLabInc\", directvalue: \"LogDirLabInc\" },\n { name: \"Logging Direct Value Added\", totalvalue: \"LogIndirBusTax\", directvalue: \"LogIndirBusTax\" },\n\n { name: \"Primary Paper Industry Output\", totalvalue: \"PrimaryPaperTotImpIndOut\", directvalue: \"PrimaryPaperDirIndOut\" },\n { name: \"Primary Paper Employment\", totalvalue: \"PrimaryPaperTotImpEmp\", directvalue: \"PrimaryPaperDirEmp\" },\n { name: \"Primary Paper Labor Income\", totalvalue: \"PrimaryPaperTotImpLabInc\", directvalue: \"PrimaryPaperDirLabInc\" },\n { name: \"Primary Paper Direct Value Added\", totalvalue: \"PrimaryPaperIndirBusTax\", directvalue: \"PrimaryPaperIndirBusTax\" },\n\n { name: \"Primary Solid Industry Output\", totalvalue: \"PrimarySolidTotImpIndOut\", directvalue: \"PrimarySolidIndOut\" },\n { name: \"Primary Solid Employment\", totalvalue: \"PrimarySolidTotImpEmp\", directvalue: \"PrimarySolidEmp\" },\n { name: \"Primary Solid Labor Income\", totalvalue: \"PrimarySolidTotImpLabInc\", directvalue: \"PrimarySolidLabInc\" },\n { name: \"Primary Solid Direct Value Added\", totalvalue: \"PrimarySolidIndBusTax\", directvalue: \"PrimarySolidIndBusTax\" },\n\n { name: \"Secondary Paper Industry Output\", totalvalue: \"SecondPaperTotImpIndOut\", directvalue: \"SecondPaperDirIndOut\" },\n { name: \"Secondary Paper Employment\", totalvalue: \"SecondPaperTotImpEmp\", directvalue: \"SecondPaperDirEmp\" },\n { name: \"Secondary Paper Labor Income\", totalvalue: \"SecondPaperTotImpLabInc\", directvalue: \"SecondPaperDirLabInc\" },\n { name: \"Secondary Paper Direct Value Added\", totalvalue: \"SecondPaperIndirBusTax\", directvalue: \"SecondPaperIndirBusTax\" },\n\n { name: \"Secondary Solid Industry Output\", totalvalue: \"SecondSolidIndOut\", directvalue: \"SecondSolidDirIndOut\" },\n { name: \"Secondary Solid Employment\", totalvalue: \"SecondSolidEmp\", directvalue: \"SecondSolidDirEmp\" },\n { name: \"Secondary Solid Labor Income\", totalvalue: \"SecondSolidLabInc\", directvalue: \"SecondSolidDirLabInc\" },\n { name: \"Secondary Solid Direct Value Added\", totalvalue: \"SecondSolidBusTax\", directvalue: \"SecondSolidBusTax\" }\n\n]\nexport const directaddevaluearray = [\n\n\n { name: \"Industry Output Totals\", totalvalue: \"DirTotalIndirBusTax\" },\n { name: \"Forestry Direct Value Added\", totalvalue: \"ForIndirBusTax\" },\n { name: \"Logging Direct Value Added\", totalvalue: \"LogIndirBusTax\" },\n { name: \"Primary Paper Direct Value Added\", totalvalue: \"PrimaryPaperIndirBusTax\" },\n { name: \"Primary Solid Direct Value Added\", totalvalue: \"PrimarySolidIndBusTax\" },\n { name: \"Secondary Paper Direct Value Added\", totalvalue: \"SecondPaperIndirBusTax\" },\n { name: \"Secondary Solid Direct Value Added\", totalvalue: \"SecondSolidBusTax\" }\n]\n\nexport const mapseconomiimpacttodeletearray = ['OBJECTID', 'Join_Count', 'TARGET_FID', 'NAME', 'CNTY_FIPS', 'FIPS',\n 'YEAR_DATA', 'SAMMTotalInd', 'SAMMTotalEmp', 'SAMMTotalLabInc', 'ForSAMMInd', 'ForSAMMEmp', 'ForSAMMLab', 'LogSAMMInd',\n 'PrimaryPaperSAMMInd', 'PrimaryPaperSAMMEmp', 'PrimaryPaperSAMMLab', 'PrimarySolidSAMMInd', 'PrimarySolidSAMMEmp',\n 'PrimarySolidSAMMLab', 'SecondPaperSAMMInd',\n 'SecondPaperSAMMEmp', 'SecondPaperSAMMLab', 'SecondSolidSAMMInd', 'SecondSolidSAMMEmp', 'SecondSolidSAMMLab', 'Industry SAM Multipliers',\n 'Employment SAM Multipliers', 'Labor Income SAM Multipliers',\n 'YEAR_DATA', 'DATA_YEAR_TXT']\n\nexport const laborincomemeasures = ['ForDirLabInc', 'ForTotImpLabInc', 'LogDirLabInc', 'LogTotImpLabInc',\n 'PrimaryPaperDirLabInc', 'PrimaryPaperTotImpLabInc',\n 'PrimarySolidLabInc', 'PrimarySolidTotImpLabInc',\n 'SecondPaperDirLabInc', 'SecondPaperTotImpLabInc',\n 'SecondSolidDirLabInc', 'SecondSolidLabInc', 'SecondSolidSAMMLab', \n 'DirTotalLabInc', 'TotImpTotalLabInc']\n\nexport const industryoutputmeasures = ['ForDirIndOut', 'ForTotImpIndOut', \n 'LogDirIndOut', 'LogTotImpIndOut', \n 'PrimaryPaperDirIndOut', 'PrimaryPaperTotImpIndOut', \n 'PrimarySolidIndOut', 'PrimarySolidTotImpIndOut', \n 'SecondPaperDirIndOut', 'SecondPaperTotImpIndOut', \n 'SecondSolidDirIndOut', 'SecondSolidIndOut', \n 'SecondSolidSAMMInd', 'DirTotalInd', \n 'TotImpTotalInd']\n\nexport const employmentmeasures = ['ForDirEmp', 'ForTotImpEmp', 'LogDirEmp', 'LogTotImpEmp', 'PrimaryPaperDirEmp',\n 'PrimaryPaperTotImpEmp', 'PrimarySolidEmp', 'PrimarySolidTotImpEmp', 'SecondPaperDirEmp', 'SecondPaperTotImpEmp',\n 'SecondSolidDirEmp', 'SecondSolidEmp', 'ForSAMMEmp',\n 'SecondSolidSAMMEmp', 'DirTotalEmp',\n 'TotImpTotalEmp']\n\nexport const directvalueaddedmeasures = ['ForIndirBusTax', 'LogIndirBusTax', 'PrimaryPaperIndirBusTax',\n 'PrimarySolidIndBusTax', 'SecondPaperIndirBusTax', 'SecondSolidBusTax', 'DirTotalIndirBusTax']\n\n\nexport const laborincomecolorsandclasses = [\n {\n colors: [[220, 245, 233]],\n numClasses: 1\n }, {\n colors: [[220, 245, 233], [167, 207, 180]],\n numClasses: 2\n }, {\n colors: [[220, 245, 233], [167, 207, 180], [118, 168, 130]],\n numClasses: 3\n }, {\n colors: [[220, 245, 233], [167, 207, 180], [118, 168, 130], [74, 135, 88]],\n numClasses: 4\n }, {\n colors: [[220, 245, 233], [167, 207, 180], [118, 168, 130], [74, 135, 88], [34, 102, 51]],\n numClasses: 5\n }\n]\nexport const laborincomecolors = [[220, 245, 233], [167, 207, 180], [118, 168, 130], [74, 135, 88], [34, 102, 51]];\n\nexport const industryoutputcolorsandclasses = [\n {\n colors: [[255, 255, 128]],\n numClasses: 1\n }, {\n colors: [[255, 255, 128], [250, 209, 85]],\n numClasses: 2\n }, {\n colors: [[255, 255, 128], [250, 209, 85], [242, 167, 46]],\n numClasses: 3\n }, {\n colors: [[255, 255, 128], [250, 209, 85], [242, 167, 46], [173, 83, 89]],\n numClasses: 4\n }, {\n colors: [[255, 255, 128], [250, 209, 85], [242, 167, 46], [173, 83, 89], [107, 0, 0]],\n numClasses: 5\n }\n]\nexport const industryoutputcolors = [[255, 255, 128], [250, 209, 85], [242, 167, 46], [173, 83, 89], [107, 0, 0]];\n\nexport const employmentcolorsandclasses = [\n {\n colors: [[182, 237, 240]],\n numClasses: 1\n }, {\n colors: [[182, 237, 240], [116, 180, 232]],\n numClasses: 2\n }, {\n colors: [[182, 237, 240], [116, 180, 232], [31, 131, 224]],\n numClasses: 3\n }, {\n colors: [[182, 237, 240], [116, 180, 232], [31, 131, 224], [29, 68, 184]],\n numClasses: 4\n }, {\n colors: [[182, 237, 240], [116, 180, 232], [31, 131, 224], [29, 68, 184], [9, 9, 145]],\n numClasses: 5\n }\n]\nexport const employmentcolors = [[182, 237, 240], [116, 180, 232], [31, 131, 224], [29, 68, 184], [9, 9, 145]];\n\nexport const directvalueaddedcolorsandclasses = [\n {\n colors: [[255, 224, 224]],\n numClasses: 1\n }, {\n colors: [[255, 224, 224], [235, 165, 155]],\n numClasses: 2\n }, {\n colors: [[182, 237, 240], [235, 165, 155], [207, 112, 95]],\n numClasses: 3\n }, {\n colors: [[255, 224, 224], [235, 165, 155], [207, 112, 95], [176, 65, 48]],\n numClasses: 4\n }, {\n colors: [[255, 224, 224], [235, 165, 155], [207, 112, 95], [176, 65, 48], [143, 10, 10]],\n numClasses: 5\n }\n]\nexport const directvalueaddedcolors = [[255, 224, 224], [235, 165, 155], [207, 112, 95], [176, 65, 48], [143, 10, 10]];\n","import { Component, OnInit, ViewChild, ElementRef } from '@angular/core';\nimport { loadModules } from 'esri-loader';\nimport { DOCUMENT } from '@angular/common';\nimport { SummaryToolMapService } from '../esri-summarytoolmap/summarytoolmapservice';\nimport { Inject, Injectable } from '@angular/core';\nimport { jqxTabsComponent } from 'jqwidgets-ng/jqxtabs';\nimport { jqxGridComponent } from 'jqwidgets-ng/jqxgrid';\ndeclare var jsPDF: any;\nimport 'jspdf-autotable';\nimport * as $ from 'jquery'; // import Jquery here\nimport * as xlsx from 'xlsx';\nimport esri = __esri;\nimport Swal from 'sweetalert2';\nimport {\n totaltabledatafields, forestrytabledatafields, loggingtabledatafields,\n pptabledatafields, pstabledatafields, sptabledatafields,\n sstabledatafields\n} from '../esri-summarytoolmap/esrisummarytoolmapvariables';\n@Component({\n selector: 'app-esri-summarytoolmap',\n templateUrl: './esri-summarytoolmap.component.html',\n styleUrls: ['./esri-summarytoolmap.component.css']\n})\n@Injectable()\nexport class EsriSummaryToolMapComponent implements OnInit {\n // this is needed to be able to create the MapView at the DOM element in this component\n @ViewChild('mapViewNode', { static: true }) mapViewEl: ElementRef;\n @ViewChild('chart1', { static: true }) chart1El: ElementRef;\n @ViewChild('chart2', { static: true }) chart2El: ElementRef;\n @ViewChild('chart1panel', { static: true }) chart1panelEl: ElementRef;\n @ViewChild('grid7container', { static: true }) grid7container: ElementRef;\n @ViewChild('grid7', { static: false }) grid7: jqxGridComponent;\n @ViewChild('grid7', { static: false }) grid7El: ElementRef;\n @ViewChild('grid2', { static: false }) grid2: jqxGridComponent;\n @ViewChild('grid3', { static: false }) grid3: jqxGridComponent;\n @ViewChild('grid4', { static: false }) grid4: jqxGridComponent;\n @ViewChild('grid5', { static: false }) grid5: jqxGridComponent;\n @ViewChild('grid6', { static: false }) grid6: jqxGridComponent;\n @ViewChild('grid1', { static: false }) grid1: jqxGridComponent;\n @ViewChild('gridtabs', { static: false }) gridtabs: jqxTabsComponent;\n public chart1;\n public chart2;\n public theme: any;\n public totalsource;\n public totalcolumns;\n public forestrysource;\n public forestrycolumns;\n public loggingsource;\n public loggingcolumns;\n public ppsource;\n public ppcolumns;\n public pssource;\n public pscolumns;\n public spsource;\n public spcolumns;\n public sssource;\n public sscolumns;\n public columngroups;\n public generateData;\n public MeasurementName = ' ';\n public callGenerateDataTotal;\n public callGenerateDataForestry;\n public callGenerateDataLogging;\n public callGenerateDataPrimaryPaper;\n public callGenerateDataPrimarySolid;\n public callGenerateDataSecondaryPaper;\n public callGenerateDataSecondarySolid;\n public callGenerateTableColumns;\n public generateForestryData;\n public generateLoggingData;\n public generatePrimaryPaperData;\n public generatePrimarySolidData;\n public generateSecondaryPaperData;\n public generateSecondarySolidData;\n public forestryindustrydiv;\n public industrytotalarray = [];\n public industrydirectarray = [];\n public employmenttotalarray = [];\n public employmentdirectarray = [];\n public totalindustrytotalarray = [];\n public totalindustrydirectarray = [];\n public totalsammindustryarray = [];\n public totalemploymenttotalarray = [];\n public totalemploymentdirectarray = [];\n public totalsammemploymentarray = [];\n public totallaborincometotalarray = [];\n public totallaborincomedirectarray = [];\n public totalsammlaborincomearray = [];\n public totalindirectbusinesstaxarray = [];\n public forestryindustrytotalarray = [];\n public forestryindustrydirectarray = [];\n public forestrysammindustryarray = [];\n public forestryemploymenttotalarray = [];\n public forestryemploymentdirectarray = [];\n public forestrysammemploymentarray = [];\n public forestrylaborincometotalarray = [];\n public forestrylaborincomedirectarray = [];\n public forestrysammlaborincomearray = [];\n public forestryindirectbusinesstaxarray = [];\n public loggingindustrytotalarray = [];\n public loggingindustrydirectarray = [];\n public loggingsammindustryarray = [];\n public loggingemploymenttotalarray = [];\n public loggingemploymentdirectarray = [];\n public loggingsammemploymentarray = [];\n public logginglaborincometotalarray = [];\n public logginglaborincomedirectarray = [];\n public loggingsammlaborincomearray = [];\n public loggingindirectbusinesstaxarray = [];\n public ppindustrytotalarray = [];\n public ppindustrydirectarray = [];\n public ppsammindustryarray = [];\n public ppemploymenttotalarray = [];\n public ppemploymentdirectarray = [];\n public ppsammemploymentarray = [];\n public pplaborincometotalarray = [];\n public pplaborincomedirectarray = [];\n public ppsammlaborincomearray = [];\n public ppindirectbusinesstaxarray = [];\n public psindustrytotalarray = [];\n public psindustrydirectarray = [];\n public pssammindustryarray = [];\n public psemploymenttotalarray = [];\n public psemploymentdirectarray = [];\n public pssammemploymentarray = [];\n public pslaborincometotalarray = [];\n public pslaborincomedirectarray = [];\n public pssammlaborincomearray = [];\n public psindirectbusinesstaxarray = [];\n public spindustrytotalarray = [];\n public spindustrydirectarray = [];\n public spsammindustryarray = [];\n public spemploymenttotalarray = [];\n public spemploymentdirectarray = [];\n public spsammemploymentarray = [];\n public splaborincometotalarray = [];\n public splaborincomedirectarray = [];\n public spsammlaborincomearray = [];\n public spindirectbusinesstaxarray = [];\n public MeasureorYearChangeFunction;\n public ssindustrytotalarray = [];\n public ssindustrydirectarray = [];\n public sssammindustryarray = [];\n public ssemploymenttotalarray = [];\n public ssemploymentdirectarray = [];\n public sssammemploymentarray = [];\n public sslaborincometotalarray = [];\n public sslaborincomedirectarray = [];\n public sssammlaborincomearray = [];\n public ssindirectbusinesstaxarray = [];\n public countyarray = [];\n public allfeaturesarray = [];\n public labels = [];\n public firsttabletabclick = 0;\n public updateaggregatesrenderer;\n public callgenerateData;\n public loggingindustrydiv: any;\n public renderstatusbar;\n public onSelect;\n public arrayofvalues;\n public clickcount = 0;\n public clickcountingforwarning = 0;\n public bindingcount = 0;\n public createchart1;\n public createchart2;\n public updateCharts;\n public rowselected;\n public tabclick;\n\n view: __esri.MapView;\n attributesarray;\n years;\n draw;\n action;\n instructionsExpand;\n public setUpInstructions;\n public selectedYear;\n public createGraphic;\n public updateVertices;\n public createPolygonGraphic;\n public createMultipointGraphic;\n\n constructor(@Inject(DOCUMENT) private document: Document, private summaryToolMapService: SummaryToolMapService ) { }\n\n public ngOnInit() {\n return loadModules([\n 'esri/Map',\n 'esri/widgets/Expand',\n \"esri/layers/GraphicsLayer\",\n 'esri/widgets/Sketch/SketchViewModel',\n 'esri/views/MapView',\n 'esri/core/promiseUtils',\n 'esri/Color',\n 'esri/views/draw/Draw',\n 'esri/Graphic',\n \"esri/geometry/SpatialReference\",\n 'esri/core/watchUtils',\n 'esri/layers/FeatureLayer'\n ], {\n url: 'https://js.arcgis.com/4.20/' // Explicitly set the desired API version here\n })\n .then(([EsriMap, Expand, GraphicsLayer, SketchViewModel, EsriMapView, promiseUtils, Color, Draw, Graphic, SpatialReference, watchUtils, FeatureLayer]) => {\n // tslint:disable-next-line: prefer-const\n let view: __esri.MapView;\n const map: esri.Map = new EsriMap({\n\n });\n $('#gridtabscontainermain').addClass(\"notallowedtable\");\n\n $('#gridtabscontainer').addClass(\"disabledtable\");\n var graphicforyear;\n // tslint:disable-next-line: prefer-const\n let chart2;\n // tslint:disable-next-line: prefer-const\n let chart1;\n let queryvalues = [];\n const summaryToolMapService2 = this.summaryToolMapService;\n $('.jqx-grid-statusbar').css(\"display\", \"none\");\n const renderer = {\n type: \"simple\", // autocasts as new SimpleRenderer()\n symbol: {\n type: 'simple-fill', // autocasts as SimpleFillSymbol\n color: new Color([232, 104, 80, 0]),\n style: 'solid',\n outline: { // autocasts as SimpleLineSymbol\n color: new Color([160, 160, 160, 1]),\n width: 1\n }\n }\n }\n\n const graphicsLayer = new GraphicsLayer({\n id: \"tempGraphics\"\n });\n\n const economicimpactLayer = new FeatureLayer({\n url: 'http://tfsgis02.tfs.tamu.edu/arcgis/rest/services/EconomicImpacts/EconomicImpacts/FeatureServer/0',\n outFields: ['*'],\n renderer: renderer,\n });\n\n this.view = new EsriMapView({\n container: this.mapViewEl.nativeElement,\n\n extent: {\n xmin: -1.07366510619E7,\n ymin: 3440153.831100002,\n xmax: -1.04091956698E7,\n ymax: 4024099.909699999,\n spatialReference: new SpatialReference({ wkid: 3857 })\n\n },\n\n map,\n navigation: {\n mouseWheelZoomEnabled: false,\n browserTouchPanEnabled: false\n },\n ui: {\n components: [\"attribution\"]\n }\n });\n\n this.view.on(\"drag\", function (evt) {\n // prevents panning with the mouse drag event\n evt.stopPropagation();\n });\n this.view.ui.remove(\"zoom\")\n // to stop zooming, but I need the double click to finish drawing, so if it is not drawing, remove the double-click\n this.view.on(\"double-click\", function (event) {\n if ($('#drawpolygonbutton').hasClass('active') == true && $('#drawmultipointbutton').hasClass('active') == true || ($('#drawpolygonbutton').hasClass('action-button') == true && $('#drawmultipointbutton').hasClass('action-button') == true )) {\n event.stopPropagation();\n }\n\n });\n\n // Watch to the scale property\n //this.view.watch(\"extent\", function (newValue) {\n // console.log(\"scale property changed: \", newValue);\n //});\n\n\n\n map.add(economicimpactLayer);\n map.add(graphicsLayer);\n this.years = ['2007', '2009', '2012', '2015', \"2019\", \"2021\"]\n this.selectedYear = 2021;\n this.createchart1 = (chartel) => {\n this.chart1 = this.summaryToolMapService.createChart(chartel.nativeElement.getContext('2d'), 'Industry Output Totals (Million $)');\n };\n this.createchart2 = (chartel) => {\n this.chart2 = this.summaryToolMapService.createChart(chartel.nativeElement.getContext('2d'), 'Employment Totals (Jobs)');\n };\n\n this.view.when(() => {\n }).catch(err => {\n Swal.fire(\"Your browser is not currently supported. Please use the latest version of Chrome, Microsoft Edge, Opera, Firefox or Safari\")\n }).then;\n {\n\n\n var economicimpactQuery = economicimpactLayer.createQuery();\n economicimpactQuery.where = \"DATA_YEAR_TXT = '2015'\";\n economicimpactLayer.queryFeatures(economicimpactQuery).then(function (response) {\n\n response.features.map(function (feature) {\n var yoffset = feature.attributes.YOffset.toString() + \"px\";\n var xoffset = feature.attributes.XOffset.toString() + \"px\";\n var anglefromfield = feature.attributes.Angle;\n\n var countytext = feature.attributes.NAME\n // identify which counties have two words for the name and break the second word to the next line\n if (countytext.trim().indexOf(' ') != -1) {\n\n var firstword = countytext.split(' ').slice(0, 1).toString();\n var secondword = countytext.split(' ').slice(1, 2).toString();\n countytext = firstword + \"\\n\" + secondword\n }\n const textSymbol = {\n type: \"text\",\n text: countytext,\n angle: feature.attributes.Angle,\n color: new Color([0, 0, 0]),\n font: {\n size: \"11px\",\n family: \"Arial\",\n weight: \"normal\",\n fontColor: \"#000\"\n },\n lineWidth: 47,\n yoffset: yoffset,\n xoffset: xoffset\n }\n var graphic = new Graphic({\n geometry: feature.geometry,\n symbol: textSymbol\n });\n graphicsLayer.add(graphic);\n })\n\n })\n\n // Create the charts when the view is ready\n this.createchart1(this.chart1El);\n this.createchart2(this.chart2El);\n this.gridtabs.select(6);\n this.draw = new Draw({\n view: this.view\n });\n // this.setUpInstructions();\n }\n document.getElementById('exportexcelbutton').addEventListener('click', () => {\n if (this.countyarray.length > 0) {\n if (this.grid1.attrSource != undefined) {\n let griddataforestry = [];\n let griddatalogging = [];\n var griddataprimarypaper = [];\n let griddataprimarysolid = [];\n let griddatasecondarypaper = [];\n let griddatasecondarysolid = [];\n let allgridsdatatotal = [];\n griddataforestry = this.grid1.attrSource.localdata;\n griddatalogging = this.grid2.attrSource.localdata;\n griddataprimarypaper = this.grid3.attrSource.localdata;\n griddataprimarysolid = this.grid4.attrSource.localdata;\n griddatasecondarypaper = this.grid5.attrSource.localdata;\n griddatasecondarysolid = this.grid6.attrSource.localdata;\n allgridsdatatotal = this.grid7.attrSource.localdata;\n\n const wsforestry: xlsx.WorkSheet = xlsx.utils.json_to_sheet(griddataforestry);\n const wslogging: xlsx.WorkSheet = xlsx.utils.json_to_sheet(griddatalogging);\n const wsprimarypaper: xlsx.WorkSheet = xlsx.utils.json_to_sheet(griddataprimarypaper);\n const wsprimarysolid: xlsx.WorkSheet = xlsx.utils.json_to_sheet(griddataprimarysolid);\n const wssecondarypaper: xlsx.WorkSheet = xlsx.utils.json_to_sheet(griddatasecondarypaper);\n const wssecondarysolid: xlsx.WorkSheet = xlsx.utils.json_to_sheet(griddatasecondarysolid);\n const wstotal: xlsx.WorkSheet = xlsx.utils.json_to_sheet(allgridsdatatotal);\n const wb: xlsx.WorkBook = xlsx.utils.book_new();\n xlsx.utils.book_append_sheet(wb, wsforestry, 'Forestry');\n xlsx.utils.book_append_sheet(wb, wslogging, 'Logging');\n xlsx.utils.book_append_sheet(wb, wsprimarypaper, 'Primary Paper');\n xlsx.utils.book_append_sheet(wb, wsprimarysolid, 'Primary Solid');\n xlsx.utils.book_append_sheet(wb, wssecondarypaper, 'Secondary Paper');\n xlsx.utils.book_append_sheet(wb, wssecondarysolid, 'Secondary Solid');\n xlsx.utils.book_append_sheet(wb, wstotal, 'Total');\n const filetitle = 'TexasForestSectorEconomicContribution_' + this.selectedYear + '.xlsx';\n xlsx.writeFile(wb, filetitle);\n }\n }\n else {\n Swal.fire(\"Make sure you select a county before selecting this tool\");\n }\n });\n\n document.getElementById('drawpolygonbutton').addEventListener('click', () => {\n // tslint:disable-next-line: triple-equals\n $('#gridtabscontainer').addClass(\"disabledtable\");\n $('#gridtabscontainer').removeClass(\"enabledtable\");\n if (this.view.graphics != undefined) {\n\n this.view.graphics.removeAll();\n removeData(this.chart1);\n removeData(this.chart2);\n this.grid1.clear();\n this.grid2.clear();\n this.grid3.clear();\n this.grid4.clear();\n this.grid5.clear();\n this.grid6.clear();\n this.grid7.clear();\n this.countyarray = [];\n if ($('.tablefooter').length > 0) {\n\n $('.jqx-grid-statusbar').css(\"display\", \"none\");\n }\n\n\n }\n if ($('#drawpolygonbutton').hasClass('action-button')) {\n this.view.graphics.removeAll();\n this.draw.reset();\n const action = this.draw.create('polygon', { mode: 'hybrid' });\n if (/Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {\n if (document.documentElement.clientHeight > document.documentElement.clientWidth && this.clickcountingforwarning === 0) {\n Swal.fire(\"For optimal display results, please use Landscape orientation.\");\n }\n }\n this.clickcountingforwarning++\n $('#drawpolygonbutton').addClass('active');\n $('#drawpolygonbutton').removeClass('action-button');\n $('#drawmultipointbutton').removeClass('active');\n $('#drawmultipointbutton').addClass('action-button');\n // focus the view to activate keyboard shortcuts for sketching\n this.view.focus();\n action.on('vertex-add', (evt) => this.createPolygonGraphic(evt.vertices, evt));\n action.on('vertex-remove', (evt) => this.createPolygonGraphic(evt.vertices, evt));\n action.on('cursor-update', (evt) => this.createPolygonGraphic(evt.vertices, evt));\n action.on('draw-complete', (evt) => this.createPolygonGraphic(evt.vertices, evt));\n this.clickcount++;\n }\n else {\n this.view.graphics.removeAll();\n this.draw.reset();\n $('#drawpolygonbutton').removeClass('active');\n $('#drawpolygonbutton').addClass('action-button');\n this.clickcount = 0;\n\n }\n });\n\n this.createPolygonGraphic = (vertices: any, event: any) => {\n this.view.graphics.removeAll();\n\n const polygon = {\n type: 'polygon', // autocasts as Polygon\n rings: vertices,\n spatialReference: this.view.spatialReference\n };\n const graphic = new Graphic({\n geometry: polygon,\n symbol: {\n type: 'simple-fill', // autocasts as SimpleFillSymbol\n color: new Color([232, 104, 80, 0.25]),\n style: 'solid',\n outline: { // autocasts as SimpleLineSymbol\n color: new Color([232, 104, 80, 1]),\n width: 2\n }\n }\n });\n\n this.view.graphics.add(graphic);\n if (event.type === 'draw-complete') {\n this.firsttabletabclick = 0;\n $('#gridtabscontainermain').removeClass(\"notallowedtable\");\n $('#gridtabscontainermain').addClass(\"allowedtable\");\n $('#gridtabscontainer').removeClass(\"disabledtable\");\n $('#gridtabscontainer').addClass(\"enabledtable\");\n $('.jqx-grid-statusbar').css(\"display\", \"block\");\n\n $('#drawpolygonbutton').removeClass('active');\n $('#drawpolygonbutton').addClass('action-button');\n queryStatsOnDrag(graphic, this.selectedYear)\n .then(this.updateCharts)\n .catch(function(error) {\n if (error.name != 'AbortError') {\n console.error(error);\n }\n });\n }\n\n };\n document.getElementById('drawmultipointbutton').addEventListener('click', () => {\n $('#gridtabscontainer').addClass(\"disabledtable\");\n $('#gridtabscontainer').removeClass(\"enabledtable\");\n if (this.view.graphics != undefined) {\n //this.view.graphics.removeAll();\n removeData(this.chart1);\n removeData(this.chart2);\n this.grid1.clear();\n this.grid2.clear();\n this.grid3.clear();\n this.grid4.clear();\n this.grid5.clear();\n this.grid6.clear();\n this.grid7.clear();\n this.countyarray = [];\n if ($('.tablefooter').length > 0) {\n\n $('.jqx-grid-statusbar').css(\"display\", \"none\");\n }\n\n }\n\n if ($('#drawmultipointbutton').hasClass('action-button')) {\n this.view.graphics.removeAll();\n var action = this.draw.create('multipoint');\n\n if (/Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {\n // for native resolution as in https://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions\n //alert(\"Your screen resolution is: \" + window.screen.width * window.devicePixelRatio + \"x\" + window.screen.height * window.devicePixelRatio);\n //not good to use native resolution because some old phones have big resolutions like iphone 8 plus and some newer also, while some newer might also have low native resolution\n //resolution of screen:\n // alert(\"Your screen resolution is: \" + screen.width + \"x\" + screen.height);\n if (screen.width <= 414 && screen.height < 896) {\n this.draw.reset()\n action = this.draw.create('point');\n if (document.documentElement.clientHeight > document.documentElement.clientWidth && this.clickcountingforwarning === 0) {\n Swal.fire(\"For this device resolution, only one county can be selected using this tool. For optimal display results, please use Landscape orientation.\")\n }\n else {\n if (this.clickcountingforwarning == 0) {\n Swal.fire(\"For this device resolution, only one county can be selected using this tool\")\n }\n }\n }\n if (screen.width >= 414 && screen.height >= 896 && this.clickcountingforwarning == 0) {\n if (document.documentElement.clientHeight > document.documentElement.clientWidth) {\n Swal.fire(\"For optimal display results, please use Landscape orientation.\");\n }\n this.draw.reset()\n action = this.draw.create('multipoint');\n\n\n }\n this.clickcountingforwarning++\n } else {\n //this.draw.reset()\n //action = this.draw.create('multipoint');\n }\n\n $('#drawmultipointbutton').addClass('active');\n $('#drawmultipointbutton').removeClass('action-button');\n $('#drawpolygonbutton').removeClass('active');\n $('#drawpolygonbutton').addClass('action-button');\n // focus the view to activate keyboard shortcuts for sketching\n //this.view.focus();\n action.on('vertex-add', (evt) => this.createMultipointGraphic(evt.vertices, evt));\n action.on('vertex-remove', (evt) => this.createMultipointGraphic(evt.vertices, evt));\n //action.on('cursor-update', (evt) => this.createMultipointGraphic(evt.vertices, evt));\n action.on('draw-complete', (evt) => this.createMultipointGraphic(evt.vertices, evt));\n this.clickcount++;\n\n }\n else {\n this.draw.reset();\n this.view.graphics.removeAll();\n $('#drawmultipointbutton').removeClass('active');\n $('#drawmultipointbutton').addClass('action-button');\n }\n });\n // create a new graphic presenting the point that is being drawn on the view\n this.createMultipointGraphic = (vertices: any, event: any) => {\n var multipoint = {\n type: 'multipoint', // autocasts as Polygon\n points: vertices,\n\n spatialReference: this.view.spatialReference\n };\n var graphic = new Graphic({\n geometry: multipoint,\n symbol: {\n type: 'simple-marker',\n style: 'circle',\n size: '12px',\n color: new Color([232, 104, 80, 0.25]),\n outline: { // autocasts as SimpleLineSymbol\n color: new Color([232, 104, 80, 1]),\n width: 2\n }\n }\n });\n this.view.graphics.add(graphic);\n if (event.type === 'draw-complete') {\n this.firsttabletabclick = 0;\n $('.jqx-grid-statusbar').css(\"display\", \"block\");\n $('#gridtabscontainermain').removeClass(\"notallowedtable\");\n $('#gridtabscontainermain').addClass(\"allowedtable\");\n $('#gridtabscontainer').removeClass(\"disabledtable\");\n $('#gridtabscontainer').addClass(\"enabledtable\");\n $('#drawmultipointbutton').removeClass('active');\n $('#drawmultipointbutton').addClass('action-button');\n\n queryStatsOnDrag(graphic, this.selectedYear)\n .then(this.updateCharts)\n .catch(function(error) {\n if (error.name !== 'AbortError') {\n console.error(error);\n }\n });\n }\n };\n\n function updateChart(chart, dataValues, labels) {\n if (chart.boxes[0].chart.canvas.id == 'chart1') {\n\n chart.data.datasets[0].data = dataValues.industrytotal;\n chart.data.datasets[1].data = dataValues.industrydirect;\n }\n if (chart.boxes[0].chart.canvas.id == 'chart2') {\n\n chart.data.datasets[0].data = dataValues.employmenttotal;\n chart.data.datasets[1].data = dataValues.employmentdirect;\n }\n chart.data.labels = labels;\n chart.update();\n }\n function removeData(chart) {\n chart.data.labels = [];\n chart.data.datasets.forEach((dataset) => {\n dataset.data = [];\n });\n chart.update();\n }\n\n this.rowselected = (event: any) =>\n {\n\n // var args = event.args;\n // var rowBoundIndex = args.rowindex;\n // var rowData = args.row;\n // if (this.grid7.getselectedrowindex() === rowBoundIndex)\n // {\n // setTimeout(() => {\n // this.grid7.unselectrow(rowBoundIndex);\n // }, 1000);\n // }\n\n }\n\n this.tabclick = (event: any) =>\n {\n this.firsttabletabclick++\n if (event.args.item === 0) {\n\n this.grid1.width(\"100%\")\n }\n //if (this.firsttabletabclick === 1) {\n\n\n // }\nsetTimeout(() => {\nthis.updateaggregatesrenderer()\n\n }, 1500);\n }\n\n this.callgenerateData = () =>\n {\n this.forestrysource.localdata = this.callGenerateDataForestry();\n this.loggingsource.localdata = this.callGenerateDataLogging();\n this.ppsource.localdata = this.callGenerateDataPrimaryPaper();\n this.pssource.localdata = this.callGenerateDataPrimarySolid();\n this.spsource.localdata = this.callGenerateDataSecondaryPaper();\n this.sssource.localdata = this.callGenerateDataSecondarySolid();\n this.totalsource.localdata = this.callGenerateDataTotal();\n }\n this.updateaggregatesrenderer = () =>\n {\n\n\n this.callgenerateData()\n\n if(document.getElementById('forestrycolumindustry') != null && this.forestryindustrydirectarray.length > 0){\n document.getElementById('forestrycolumindustry').innerText = this.forestryindustrydirectarray.reduce((acc, cur) => acc + cur, 0).toFixed(2).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n }\n if(document.getElementById('forestrycolumemployment') != null && this.forestryemploymentdirectarray.length > 0){\n document.getElementById('forestrycolumemployment').innerText = this.forestryemploymentdirectarray.reduce((acc, cur) => acc + cur, 0).toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 });\n }\n if(document.getElementById('forestrycolumlaborincome') != null && this.forestrylaborincomedirectarray.length > 0){\n document.getElementById('forestrycolumlaborincome').innerText = this.forestrylaborincomedirectarray.reduce((acc, cur) => acc + cur, 0).toFixed(2).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n }\n if(document.getElementById('forestrycolumdirectvalue') != null && this.forestryindirectbusinesstaxarray.length > 0){\n document.getElementById('forestrycolumdirectvalue').innerText = this.forestryindirectbusinesstaxarray.reduce((acc, cur) => acc + cur, 0).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n }\n if(document.getElementById('loggingcolumindustry') != null && this.loggingindustrydirectarray.length > 0){\n document.getElementById('loggingcolumindustry').innerText = this.loggingindustrydirectarray.reduce((acc, cur) => acc + cur, 0).toFixed(2).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n }\n if(document.getElementById('loggingcolumemployment') != null && this.loggingemploymentdirectarray.length > 0){\n document.getElementById('loggingcolumemployment').innerText = this.loggingemploymentdirectarray.reduce((acc, cur) => acc + cur, 0).toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 });\n }\n if(document.getElementById('loggingcolumlaborincome') != null && this.logginglaborincomedirectarray.length > 0){\n document.getElementById('loggingcolumlaborincome').innerText = this.logginglaborincomedirectarray.reduce((acc, cur) => acc + cur, 0).toFixed(2).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n }\n if(document.getElementById('loggingcolumdirectvalue') != null && this.loggingindirectbusinesstaxarray.length > 0){\n document.getElementById('loggingcolumdirectvalue').innerText = this.loggingindirectbusinesstaxarray.reduce((acc, cur) => acc + cur, 0).toFixed(2).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n}\n\n if(document.getElementById('ppcolumindustry') != null && this.ppindustrydirectarray.length > 0){\n document.getElementById('ppcolumindustry').innerText = this.ppindustrydirectarray.reduce((acc, cur) => acc + cur, 0).toFixed(2).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n }\n if(document.getElementById('ppcolumemployment') != null && this.ppemploymentdirectarray.length > 0){\n document.getElementById('ppcolumemployment').innerText = this.ppemploymentdirectarray.reduce((acc, cur) => acc + cur, 0).toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 });\n }\n if(document.getElementById('ppcolumlaborincome') != null && this.pplaborincomedirectarray.length > 0){\n document.getElementById('ppcolumlaborincome').innerText = this.pplaborincomedirectarray.reduce((acc, cur) => acc + cur, 0).toFixed(2).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n }\n if(document.getElementById('ppcolumdirectvalue') != null && this.ppindirectbusinesstaxarray.length > 0){\n document.getElementById('ppcolumdirectvalue').innerText = this.ppindirectbusinesstaxarray.reduce((acc, cur) => acc + cur, 0).toFixed(2).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n }\n if(document.getElementById('spcolumindustry') != null && this.spindustrydirectarray.length > 0){\n document.getElementById('spcolumindustry').innerText = this.spindustrydirectarray.reduce((acc, cur) => acc + cur, 0).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n }\n if(document.getElementById('spcolumemployment') != null && this.spemploymentdirectarray.length > 0){\n document.getElementById('spcolumemployment').innerText = this.spemploymentdirectarray.reduce((acc, cur) => acc + cur, 0).toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 });\n }\n if(document.getElementById('spcolumlaborincome') != null && this.splaborincomedirectarray.length > 0){\n document.getElementById('spcolumlaborincome').innerText = this.splaborincomedirectarray.reduce((acc, cur) => acc + cur, 0).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n }\n if(document.getElementById('spcolumdirectvalue') != null && this.spindirectbusinesstaxarray.length > 0){\n document.getElementById('spcolumdirectvalue').innerText = this.spindirectbusinesstaxarray.reduce((acc, cur) => acc + cur, 0).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n }\n if(document.getElementById('pscolumindustry') != null && this.psindustrydirectarray.length > 0){\n document.getElementById('pscolumindustry').innerText = this.psindustrydirectarray.reduce((acc, cur) => acc + cur, 0).toFixed(2).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n }\n if(document.getElementById('pscolumemployment') != null && this.psemploymentdirectarray.length > 0){\n document.getElementById('pscolumemployment').innerText = this.psemploymentdirectarray.reduce((acc, cur) => acc + cur, 0).toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 });\n }\n if(document.getElementById('pscolumlaborincome') != null && this.pslaborincomedirectarray.length > 0){\n document.getElementById('pscolumlaborincome').innerText = this.pslaborincomedirectarray.reduce((acc, cur) => acc + cur, 0).toFixed(2).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n }\n if(document.getElementById('pscolumdirectvalue') != null && this.psindirectbusinesstaxarray.length > 0){\n document.getElementById('pscolumdirectvalue').innerText = this.psindirectbusinesstaxarray.reduce((acc, cur) => acc + cur, 0).toFixed(2).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n }\n if(document.getElementById('sscolumindustry') != null && this.ssindustrydirectarray.length > 0){\n document.getElementById('sscolumindustry').innerText = this.ssindustrydirectarray.reduce((acc, cur) => acc + cur, 0).toFixed(2).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n }\n if(document.getElementById('sscolumemployment') != null && this.ssemploymentdirectarray.length > 0){\n document.getElementById('sscolumemployment').innerText = this.ssemploymentdirectarray.reduce((acc, cur) => acc + cur, 0).toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 });\n }\n if(document.getElementById('sscolumlaborincome') != null && this.sslaborincomedirectarray.length > 0){\n document.getElementById('sscolumlaborincome').innerText = this.sslaborincomedirectarray.reduce((acc, cur) => acc + cur, 0).toFixed(2).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n }\n if(document.getElementById('sscolumdirectvalue') != null && this.ssindirectbusinesstaxarray.length > 0){\n document.getElementById('sscolumdirectvalue').innerText = this.ssindirectbusinesstaxarray.reduce((acc, cur) => acc + cur, 0).toFixed(2).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n }\n if(document.getElementById('totalcolumindustry') != null && this.totalindustrydirectarray.length > 0){\n document.getElementById('totalcolumindustry').innerText = this.totalindustrydirectarray.reduce((acc, cur) => acc + cur, 0).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n }\n if(document.getElementById('totalcolumemployment') != null && this.totalemploymentdirectarray.length > 0){\n document.getElementById('totalcolumemployment').innerText = this.totalemploymentdirectarray.reduce((acc, cur) => acc + cur, 0).toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 });\n }\n if(document.getElementById('totalcolumlaborincome') != null && this.totallaborincomedirectarray.length > 0){\n document.getElementById('totalcolumlaborincome').innerText = this.totallaborincomedirectarray.reduce((acc, cur) => acc + cur, 0).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n }\n if(document.getElementById('totalcolumdirectvalue') != null && this.totalindirectbusinesstaxarray.length > 0){\n document.getElementById('totalcolumdirectvalue').innerText = this.totalindirectbusinesstaxarray.reduce((acc, cur) => acc + cur, 0).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n }\n\n }\n\n\n this.updateCharts = (responses) => {\n\n this.summaryToolMapService.AddDatatoArrays(this, responses);\n this.view.graphics.removeAll();\n for (let i = 0; i < this.allfeaturesarray.length; i++) {\n const graphic = new Graphic({\n geometry: this.allfeaturesarray[i].geometry,\n symbol: {\n type: 'simple-fill', // autocasts as SimpleFillSymbol\n color: new Color([232, 104, 80, 0.25]),\n style: 'solid',\n outline: { // autocasts as SimpleLineSymbol\n color: new Color([232, 104, 80, 1]),\n width: 2\n }\n }\n });\n this.view.graphics.add(graphic);\n }\n this.callGenerateDataTotal = () => {\n return this.generateData(responses, this.countyarray, this.totalindustrytotalarray, this.totalindustrydirectarray,\n this.totalsammindustryarray, this.totalemploymenttotalarray, this.totalemploymentdirectarray,\n this.totalsammemploymentarray, this.totallaborincometotalarray, this.totallaborincomedirectarray,\n this.totalsammlaborincomearray, this.totalindirectbusinesstaxarray, 'Total');\n };\n this.callGenerateDataForestry = () => {\n return this.generateData(responses, this.countyarray, this.forestryindustrytotalarray,\n this.forestryindustrydirectarray, this.forestrysammindustryarray,\n this.forestryemploymenttotalarray, this.forestryemploymentdirectarray,\n this.forestrysammemploymentarray, this.forestrylaborincometotalarray, this.forestrylaborincomedirectarray,\n this.forestrysammlaborincomearray, this.forestryindirectbusinesstaxarray, 'Forestry');\n };\n this.callGenerateDataLogging = () => {\n return this.generateData(responses, this.countyarray, this.loggingindustrytotalarray,\n this.loggingindustrydirectarray, this.loggingsammindustryarray,\n this.loggingemploymenttotalarray, this.loggingemploymentdirectarray,\n this.loggingsammemploymentarray, this.logginglaborincometotalarray, this.logginglaborincomedirectarray,\n this.loggingsammlaborincomearray, this.loggingindirectbusinesstaxarray, 'Logging');\n };\n\n this.callGenerateDataPrimaryPaper = () => {\n return this.generateData(responses, this.countyarray, this.ppindustrytotalarray,\n this.ppindustrydirectarray, this.ppsammindustryarray,\n this.ppemploymenttotalarray, this.ppemploymentdirectarray,\n this.ppsammemploymentarray, this.pplaborincometotalarray, this.pplaborincomedirectarray,\n this.ppsammlaborincomearray, this.ppindirectbusinesstaxarray, 'Primary Paper');\n };\n\n this.callGenerateDataPrimarySolid = () => {\n return this.generateData(responses, this.countyarray, this.psindustrytotalarray,\n this.psindustrydirectarray, this.pssammindustryarray,\n this.psemploymenttotalarray, this.psemploymentdirectarray,\n this.pssammemploymentarray, this.pslaborincometotalarray, this.pslaborincomedirectarray,\n this.pssammlaborincomearray, this.psindirectbusinesstaxarray, 'Primary Solid');\n };\n this.callGenerateDataSecondaryPaper = () => {\n return this.generateData(responses, this.countyarray, this.spindustrytotalarray,\n this.spindustrydirectarray, this.spsammindustryarray,\n this.spemploymenttotalarray, this.spemploymentdirectarray,\n this.spsammemploymentarray, this.splaborincometotalarray, this.splaborincomedirectarray,\n this.spsammlaborincomearray, this.spindirectbusinesstaxarray, 'Secondary Paper');\n };\n this.callGenerateDataSecondarySolid = () => {\n return this.generateData(responses, this.countyarray, this.ssindustrytotalarray,\n this.ssindustrydirectarray, this.sssammindustryarray,\n this.ssemploymenttotalarray, this.ssemploymentdirectarray,\n this.sssammemploymentarray, this.sslaborincometotalarray, this.sslaborincomedirectarray,\n this.sssammlaborincomearray, this.ssindirectbusinesstaxarray, 'Secondary Solid');\n };\n // tslint:disable-next-line: no-shadowed-variable\n this.generateData = (responses, countyarray, industrytotalarray, industrydirectarray, sammindustryarray,\n // tslint:disable-next-line: no-shadowed-variable\n employmenttotalarray, employmentdirectarray, sammemploymentarray, laborincometotalarray,\n laborincomedirectarray, sammlaborincomearray, indirectbusinesstaxarray, MeasurementName) => {\n let totaldata = new Array();\n\n totaldata = this.summaryToolMapService.GenerateTotalData(responses,\n countyarray, industrytotalarray, industrydirectarray, sammindustryarray,\n employmenttotalarray, employmentdirectarray, sammemploymentarray, laborincometotalarray,\n laborincomedirectarray, sammlaborincomearray, indirectbusinesstaxarray, MeasurementName);\n return totaldata;\n };\n this.callGenerateTableColumns = (industrydirectarray,\n employmentdirectarray, laborincomedirectarray, indirectbusinesstaxarray, Measurement) =>\n\n {\n let tablecolumns = new Array();\n\n tablecolumns = this.summaryToolMapService.GenerateTableColumnsData(industrydirectarray,\n employmentdirectarray, laborincomedirectarray, indirectbusinesstaxarray,\n Measurement);\n\n return tablecolumns;\n }\n\n\n\n if (this.clickcount == 1) {\n\n this.totalsource =\n {\n localdata: this.callGenerateDataTotal(),\n datafields:\n totaltabledatafields,\n datatype: 'array'\n };\n\n this.columngroups =\n [\n { text: 'Industry Output (Million $)', align: 'center', name: 'IndustryOutput' },\n { text: 'Employment (Jobs)', align: 'center', name: 'Employment' },\n { text: 'Labor Income (Million $)', align: 'center', name: 'LaborIncome' }\n ];\n this.totalcolumns = this.callGenerateTableColumns(this.totalindustrydirectarray,\n this.totalemploymentdirectarray, this.totallaborincomedirectarray, this.totalindirectbusinesstaxarray, 'Total');\n\n this.forestrysource =\n {\n localdata: this.callGenerateDataForestry(),\n datafields:\n forestrytabledatafields,\n datatype: 'array'\n };\n this.forestrycolumns = this.callGenerateTableColumns(this.forestryindustrydirectarray,\n this.forestryemploymentdirectarray, this.forestrylaborincomedirectarray, this.forestryindirectbusinesstaxarray, 'Forestry');\n\n this.loggingsource =\n {\n localdata: this.callGenerateDataLogging(),\n datafields:\n loggingtabledatafields,\n datatype: 'array'\n };\n this.loggingcolumns = this.callGenerateTableColumns(this.loggingindustrydirectarray,\n this.loggingemploymentdirectarray, this.logginglaborincomedirectarray, this.loggingindirectbusinesstaxarray, 'Logging');\n\n this.ppsource =\n {\n localdata: this.callGenerateDataPrimaryPaper(),\n datafields:\n pptabledatafields,\n datatype: 'array'\n };\n this.ppcolumns = this.callGenerateTableColumns(this.ppindustrydirectarray,\n this.ppemploymentdirectarray, this.pplaborincomedirectarray, this.ppindirectbusinesstaxarray, 'Primary Paper');\n\n this.spsource =\n {\n localdata: this.callGenerateDataSecondaryPaper(),\n datafields:\n sptabledatafields,\n datatype: 'array'\n };\n this.spcolumns = this.callGenerateTableColumns(this.spindustrydirectarray,\n this.spemploymentdirectarray, this.splaborincomedirectarray, this.spindirectbusinesstaxarray, 'Secondary Paper');\n this.pssource =\n {\n localdata: this.callGenerateDataPrimarySolid(),\n datafields:\n pstabledatafields,\n datatype: 'array'\n };\n this.pscolumns = this.callGenerateTableColumns(this.psindustrydirectarray,\n this.psemploymentdirectarray, this.pslaborincomedirectarray, this.psindirectbusinesstaxarray, 'Primary Solid');\n this.sssource =\n {\n localdata: this.callGenerateDataSecondarySolid(),\n datafields:\n sstabledatafields,\n datatype: 'array'\n };\n\n this.sscolumns = this.callGenerateTableColumns(this.ssindustrydirectarray,\n this.ssemploymentdirectarray, this.sslaborincomedirectarray, this.ssindirectbusinesstaxarray, 'Secondary Solid');\n\n }\n // this.onSelect = (event) =>\n // {\n\n // }\n if (this.clickcount > 1) {\n this.callgenerateData()\n this.grid1.updatebounddata('cells');\n this.grid2.updatebounddata('cells');\n this.grid3.updatebounddata('cells');\n this.grid4.updatebounddata('cells');\n this.grid5.updatebounddata('cells');\n this.grid6.updatebounddata('cells');\n this.grid7.updatebounddata('cells');\n\n setTimeout(() => {\n\n this.updateaggregatesrenderer()\n\n }, 1500)\n }\n else {\n\n };\n\n const ChartStats = {\n industrytotal: this.industrytotalarray,\n industrydirect: this.industrydirectarray,\n employmenttotal: this.employmenttotalarray,\n employmentdirect: this.employmentdirectarray\n };\n updateChart(this.chart1, ChartStats, this.labels);\n updateChart(this.chart2, ChartStats, this.labels);\n this.gridtabs.select(6);\n\n };\n\n\n\n this.MeasureorYearChangeFunction = (event: any) => {\n if (this.view.graphics != undefined) {\n\n this.view.graphics.removeAll();\n removeData(this.chart1);\n removeData(this.chart2);\n this.grid1.clear();\n this.grid2.clear();\n this.grid3.clear();\n this.grid4.clear();\n this.grid5.clear();\n this.grid6.clear();\n this.grid7.clear();\n }\n if ($('#drawpolygonbutton').hasClass('action-button') && $('#drawmultipointbutton').hasClass('action-button')) {\n\n if (graphicforyear != undefined) {\n queryStatsOnDrag(graphicforyear, this.selectedYear)\n .then(this.updateCharts)\n .catch(function (error) {\n if (error.name != 'AbortError') {\n console.error(error);\n }\n });\n }\n if ($('#drawpolygonbutton').hasClass('active') || $('#drawmultipointbutton').hasClass('active')) {\n Swal.fire(\"Make sure you first select a county by drawing a polygon or a point\");\n }\n }\n\n else {\n Swal.fire(\"Make sure you first select a county by drawing a polygon or a point\");\n }\n }\n const queryStatsOnDrag = promiseUtils.debounce(function(\n\n graphic,\n selectedYear\n ) {\n graphicforyear = graphic;\n const query = economicimpactLayer.createQuery();\n query.geometry = graphic.geometry; // converts the screen point to a map point\n query.where = 'DATA_YEAR_TXT = \\'' + selectedYear + '\\'';\n query.spatialRelationship = 'intersects';\n const allStatsResponse = economicimpactLayer.queryFeatures(query)\n .then(function(response) {\n\n queryvalues = [];\n queryvalues = summaryToolMapService2.createQueryValuesArray(response);\n const stats = queryvalues;\n return stats;\n });\n // Return the promises that will resolve to each set of statistics\n return promiseUtils.eachAlways([\n allStatsResponse\n ]);\n });\n\n })\n .catch(err => {\n\n });\n\n }\n\n\n exportpdfclick = (event: any) => {\n\n if (this.countyarray.length > 0) {\n $(\".hidden\").show();\n\n var pdf = new jsPDF('l', 'mm', 'a4');\n pdf.setTextColor(0, 0, 0);\n pdf.setFontSize(20);\n //pdf.setFontType(\"bold\");\n pdf.text(36, 11, 'Texas Forest Sector Economic Contribution Analysis Report By County');\n console.log(this.chart1El.nativeElement.width, this.chart1El.nativeElement.height);\n var imgData = this.chart1El.nativeElement.toDataURL(\"image/png\", 1.0);\n pdf.addImage(imgData, 'PNG', 58, 17, 174, 95);\n var imgData2 = this.chart2El.nativeElement.toDataURL(\"image/png\", 1.0);\n pdf.addImage(imgData2, 'PNG', 58, 113, 174, 95);\n //this.chart2El.nativeElement.toBlob(blob => {\n\n //})\n\n let allTotalMeasuresAarray = [this.countyarray, this.totalindustrydirectarray, this.totalindustrytotalarray,\n this.totalsammindustryarray, this.totalemploymentdirectarray, this.totalemploymenttotalarray,\n this.totalsammemploymentarray, this.totallaborincomedirectarray, this.totallaborincometotalarray,\n this.totalsammlaborincomearray, this.totalindirectbusinesstaxarray, \"Total\"];\n\n let allForestryMeasuresArray = [this.countyarray, this.forestryindustrydirectarray, this.forestryindustrytotalarray,\n this.forestrysammindustryarray,\n this.forestryemploymentdirectarray, this.forestryemploymenttotalarray,\n this.forestrysammemploymentarray, this.forestrylaborincomedirectarray, this.forestrylaborincometotalarray,\n this.forestrysammlaborincomearray, this.forestryindirectbusinesstaxarray, \"Forestry\"];\n\n let allLoggingMeasuresArray = [this.countyarray, this.loggingindustrydirectarray, this.loggingindustrytotalarray,\n this.loggingsammindustryarray, this.loggingemploymentdirectarray, this.loggingemploymenttotalarray,\n this.loggingsammemploymentarray, this.logginglaborincomedirectarray, this.logginglaborincometotalarray,\n this.loggingsammlaborincomearray, this.loggingindirectbusinesstaxarray, \"Logging\"];\n\n let allPrimaryPaperMeasuresArray = [this.countyarray, this.ppindustrydirectarray, this.ppindustrytotalarray,\n this.ppsammindustryarray, this.ppemploymentdirectarray, this.ppemploymenttotalarray,\n this.ppsammemploymentarray, this.pplaborincomedirectarray, this.pplaborincometotalarray,\n this.ppsammlaborincomearray, this.ppindirectbusinesstaxarray, \"Primary Paper\"];\n\n let allPrimarySolidMeasuresArray = [this.countyarray, this.psindustrydirectarray, this.psindustrytotalarray,\n this.pssammindustryarray, this.psemploymentdirectarray, this.psemploymenttotalarray,\n this.pssammemploymentarray, this.pslaborincomedirectarray, this.pslaborincometotalarray,\n this.pssammlaborincomearray, this.psindirectbusinesstaxarray, \"Primary Solid\"];\n\n let allSecondaryPaperMeasuresArray = [this.countyarray, this.spindustrydirectarray, this.spindustrytotalarray,\n this.spsammindustryarray, this.spemploymentdirectarray, this.spemploymenttotalarray,\n this.spsammemploymentarray, this.splaborincomedirectarray, this.splaborincometotalarray,\n this.spsammlaborincomearray, this.spindirectbusinesstaxarray, \"Secondary Paper\"];\n\n let allSecondarySolidMeasuresArray = [this.countyarray, this.ssindustrydirectarray, this.ssindustrytotalarray,\n this.sssammindustryarray, this.ssemploymentdirectarray, this.ssemploymenttotalarray,\n this.sssammemploymentarray, this.sslaborincomedirectarray, this.sslaborincometotalarray,\n this.sssammlaborincomearray, this.ssindirectbusinesstaxarray, \"Secondary Solid\"];\n\n // create nested arrays adding the above arrays on the one below:\n let mainMeasuresArray = [];\n mainMeasuresArray[0] = allTotalMeasuresAarray;\n mainMeasuresArray[1] = allForestryMeasuresArray;\n mainMeasuresArray[2] = allLoggingMeasuresArray;\n mainMeasuresArray[3] = allPrimaryPaperMeasuresArray;\n mainMeasuresArray[4] = allPrimarySolidMeasuresArray;\n mainMeasuresArray[5] = allSecondaryPaperMeasuresArray;\n mainMeasuresArray[6] = allSecondarySolidMeasuresArray;\n\n this.summaryToolMapService.createPDF(mainMeasuresArray, pdf);\n\n setTimeout(() => $(\".hidden\").hide(), 500);\n\n\n }\n\n else {\n Swal.fire(\"Make sure you select a county before selecting this tool\");\n setTimeout(() => $(\".hidden\").hide(), 500);\n }\n }// exportpdfclick = (event: any) => {\n\n // ngOnInit\n //// event handler for the radio button's change event\n questionclick = (event: any) => {\n\n $('.questionpopup').show();\n\n\n }\n questioncloseclick = (event: any) => {\n $('.questionpopup').hide();\n }\n\n}\n","\n\n\n This tool allows you to select counties for a summary by drawing a polygon (boundary) on the map. To begin, click the Draw a Polygon button, then click on the map to set a starting point. Continue clicking to add vertices and shape your polygon. The selected area will be outlined and shaded red.\n To finalize the selection, either press Enter on your keyboard or triple-click and release the mouse button—this will automatically select the counties within the drawn area.\n To start a new selection, simply click the Draw a Polygon button again.\n
\n\n\n \n Example\n \n\n
\n\n This tool allows you to select counties for a summary by placing one or more points on the map. To begin, click on the Draw a Point button. Then, left-click on each county of interest to mark it with a red point.\n To finalize the selection, either press Enter on your keyboard or triple-click and release the mouse button—this will automatically select the counties.\n\n To start a new selection, click the Draw a Point button again. On certain mobile devices, you may be limited to drawing one point at a time.\n
\n \n Example\n \n\n
\na. Cells with blank values indicate that data is not available or values have been supressed to avoid disclosure of individual company's information.
\nb. For information on definitions see FAQs.
\nc. Data shown in this table may be different compared to the downloadable individual reports due to rounding or data suppression to protect confidentiality.
\n* The sum of Direct Contribution values for each industry may not match the total values displayed in this column due to data supression.
\n** The total contribution be summed between counties due to potential trade inter-linkages.
\nFAQs
\n\n\nThe Texas Forest Sector Economic Contribution County Summary Tool is a web-based, \n interactive tool developed by the Texas A&M Forest Service. It allows users to query and compare economic contributions\n of the forest sector for counties in East Texas by industry and economic contribution indicators. In addition to providing values for each of the selected counties, totals are provided for all counties in the selection.
\nAn area, or set of counties, can be defined in two ways:
Greater detail on using the selection tools is provided by clicking on the help button (?) between each tool on the Summary Tool page.
\nTo sort data in the results table, double-click on a column heading name. To change the ascending/descending order, click on the up/down arrow to the right of the column heading. Double-click on another column heading name to sort by that column.
\nYes. You may either download the data for Microsoft Excel by clicking \"Export to Excel\" or generate a whole report (including data and charts) in PDF by clicking \"Export to PDF\".
Texas forest sector description, industry codes in IMPLAN, and compatibility with 1997 BEA and NAICS 2007.
\nAt this time, the web-based interactive tool Texas Forest Sector Economic Contribution is available only for the counties in East Texas. However, you can get the estimated economic contributions of the forest sector for the entire state in our downloadable reports. In the future, we may offer the web-based interactive tool for Senate Districts in Texas. Please visit us later.
\nThe difference is mainly due to data suppression to protect confidentiality. When the difference occurs, \n the estimation shown in the downloadable individual county report \n is recommended to use. This does not affect the validity of the summary tool since it is mainly aimed at\n estimating economic contributions of multiple counties while the report is intended to estimate economic contributions of individual counties. \n Minor discrepancy may also come from rounding.
It depends. If you're interested in the contributions for a county, the pre-prepared is a better option as described in Question 8. However, the Summary Tool displays graphs of direct and indirect contributions, which may provide better presentation. If you're interested in the contributions of multiple counties, the Summary Tool is an obvious better choice.
The data provide estimation of the economic contributions of the forest sector for the area of interest in East Texas. Let’s use the retrieved data for Angelina as an example to show how it can be interpreted. Suppose the table below is the economic contribution table for Angelina in 2009.
\nIt shows that the forest sector as a whole directly contributed $459.66 million of industry output to the local economy, employing about 1,350 people with a payroll of $104.45 million in 2009. State and local taxing jurisdictions in Angelina County received around $5.48 million from the forest sector in indirect business taxes (such as sales and use taxes, property taxes, and government revenues from permit fees and licenses).
\nThe forest sector has a ripple effect on other industries in the region. For example, lumber sawmills purchase utilities, machinery and equipment from local suppliers and spend money for transportation services. This spending triggers a series of chain reactions of companies and business which supply raw materials or services to these suppliers. These effects are referred to as “indirect effects” and occur in the backward-linked industries. Employees at the sawmills may use their salaries to buy houses from realtors, clothes from local department stores, food from local grocery stores, or enjoy a drink at local bars. These effects are “induced effects” resulting from household spending of the income the employees receive in the local area.
\nIncluding direct, indirect, and induced effects, the forest sector in Angelina County had a total economic contribution of $701.62 million in industry output and supported 3,171 jobs with a payroll of $182.08 million in the local economy. Every job created in the forest sector resulted in another 1.35 jobs in the county. Every dollar generated in the sector contributed an additional $0.53 to the rest of the economy in Angelina County.
\n\n
Social Accounting Matrices (SAM) multipliers are calculated as the ratio of an industry's total contributions to its direct contributions. \nLet's use the retrieved data for Angelina and Nacogdoches counties as an example to show how the multipliers for the area can be estimated. Suppose the table below is the economic contribution table retrieved from the summary tool for Angelina and Nacogdoches in 2009.\n
\nThe SAM multupliers are calculated as follows:
\n\n
Yes. Our aim is to provide the most realistic projections of the forest sector contribution in the state of Texas. Often, we update the methods which are used to obtain indirect and induced contribution of the forest sector. In recent years, the trade flows model has been preferred over the conventional econometric RPC model for input-output analysis. Since forestry related industries have existed in the state for many years, the five year trend analysis adheres to multi-industry contribution analysis and the trade flows model. \n
\n\n
A little bit. With the new data released in 2013, IMPLAN changed its industry sectoring scheme. Some components of the secondary solid wood products sub-industry are now aggregated with non-forestry sectors. The contributions caused by these changes, however, are small compared to the overall economic contributions of the forestry sector in Texas.
\nTEXAS FOREST SECTOR ECONOMIC CONTRIBUTION
\n\n\nThe Texas forest sector directly contributed $27.36 billion of industry output to the Texas economy
\nTexas forest products firms exported $1.68 billion worth of forest products to foreign countries
\nThe Texas forest sector had a total economic contribution of $54.19 billion in industry output, supporting more than 187,500 jobs
\nHighlights of the Forest Sector Economic Contributions in Texas, 2024
\n\n $27.36 Billion\n
\n \n The Texas forest sector directly contributed $27.36 billion of industry output to the Texas economy, employing 73,096 people with a payroll of $5.41 billion.\n \n
\n 187,500 Jobs\n
\n \n Including direct, indirect, and induced effects, the Texas forest sector had a total economic contribution of $54.19 billion in industry output, supporting more than 187,500 jobs with $13.00 billion in labor income.\n
\n 98 Cent/Dollar\n
\n On average, every dollar generated in the Texas forest sector contributed an additional 98 cents to the rest of the Texas economy.\n
\n Job Creation\n
\n Every job created in the forest sector resulted in another 1.57 jobs in the state.\n
\n Sub-industries\n
\n Secondary forest products manufacturing sub-industries contributed over two-thirds of the Texas forest sector's total industry output and employed 67 percent of the forest sector workforce.\n
\n 1.68 Billion Worth\n
\n Texas forest products firms exported $1.68 billion worth of forest products to foreign countries.\n
\n Industry Output\n
\n Compared to 2021, the 2024 Texas forest sector total industry output and employment increased 30 percent and 9 percent, respectively.\n
\n
\n \n A brief \n summary\n of the Texas Forest Sector Economic Contribution is available for download.\n \n
Texas Forest Sector Economic Contribution
\n\n *NEW FOR 2024! State and county forest sector economic contribution reports.\n
\n\n Top Employers\n
\n \n Most of the timberland in Texas is located in the eastern part of the state. More than two-thirds of all forestry and logging companies and the great majority of the primary forest product companies in the state are found in this region. In 33 of the 43 East Texas counties, wood-based industries are one of the top five manufacturing employers.\n \n
\n Interactive Tools\n
\n \n This website offers an interactive tool to summarize economic contributions of the forest sector in East Texas for 2007, 2009, 2012, 2015, 2019 and 2021.\n The tool allows users to display economic contributions of a selected set of counties. This website also offers thematic maps\n and multi-year trends\n for the counties in East Texas. Statewide economic contributions of forest-related industries during 2010-2021 and the impacts of the recent\n economic downturn are presented in interactive tables and charts.\n \n
\n Reports\n
\n \n Pre-prepared reports can be downloaded for individual counties in East Texas (2024) or for the entire group of East Texas counties (2007, 2009, 2012 and 2015). Statewide economic contribution reports for 2024 and prior years are also available. Reports for Texas Senate districts and House districts will be available soon.\n \n
\n Highlights\n
\n The Highlights pages shows the latest selected facts on the economic contribution of the forest sector in Texas.\n