123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630 |
- import jnpf from '@/utils/jnpf'
- import {
- geojson,
- getAtlas
- } from '@/api/portal/portal.js'
- import {
- getDataInterfaceRes
- } from '@/api/common'
- let timer;
- export default {
- data() {
- return {
- show: false,
- mapData: [],
- mapList: [],
- mapType: '',
- markPoints: [],
- pointLoading: false,
- opts: {
- update: true,
- fontSize: 10,
- padding: [40, 15, 30, 15],
- extra: {
- map: {
- mercator: true,
- },
- },
- },
- regionStep: [],
- stepMapList: [],
- option: {}
- }
- },
- created() {
- this.init()
- if (this.config.dataType === 'dynamic') {
- uni.$off('proRefresh')
- uni.$on('proRefresh', () => {
- this.handelChart()
- })
- }
- },
- methods: {
- init() {
- if (timer) clearInterval(timer)
- this.handelChart()
- if (!this.config.allRefresh.autoRefresh && this.config?.refresh?.autoRefresh) {
- timer = setInterval(this.handelChart, this.config.refresh.autoRefreshTime * 60000)
- }
- },
- async handelChart() {
- this.customEchartsKey()
- if (this.config.dataType === 'dynamic') {
- if (!this.config.propsApi) return
- const query = {
- paramList: this.config.templateJson
- };
- getDataInterfaceRes(this.config.propsApi, query).then(res => {
- this.config.option.defaultValue = this.handleMappingConfig(res.data, this.config)
- this.handleAttrs()
- })
- } else {
- this.handleAttrs()
- }
- },
- // 自定义echarts属性取app的
- customEchartsKey() {
- this.config.option = {
- ...this.config.option,
- ...this.config.appOption
- }
- if (['customEcharts'].includes(this.config.jnpfKey)) {
- this.config.dataType = this.config.appDataType
- this.config.propsApi = this.config.appPropsApi
- this.config.propsName = this.config.appPropsName
- this.config.templateJson = this.config.appTemplateJson
- this.config.refresh = this.config.appRefresh ? this.config.appRefresh : {}
- }
- this.config.option.urlAddress = this.config.option.appUrlAddress
- },
- // 处理字段映射
- handleMappingConfig(resultData, config) {
- let defaultValue = undefined
- if (['rankList', 'barChart', 'pieChart', 'tableList'].includes(this.config.jnpfKey)) {
- defaultValue = this.config.option.defaultValue || []
- }
- let mappingConfig = config.mappingConfig
- let result = []
- resultData.forEach(data => {
- let temp = {}
- for (let item of mappingConfig) {
- if (item.field === '系列') {
- temp['type'] = item.value ? data[item.value] : data['type']
- }
- if (item.field === '维度') {
- temp['name'] = item.value ? data[item.value] : data['name']
- }
- if (item.field === '数值') {
- temp['value'] = item.value ? data[item.value] : data['value']
- }
- if (item.field === '最大值') {
- temp['max'] = item.value ? data[item.value] : data['max']
- }
- if (item.field === '时间戳') {
- temp['timestamp'] = item.value ? data[item.value] : data['timestamp']
- }
- if (item.field === '经度') {
- temp['long'] = item.value ? data[item.value] : data['long']
- }
- if (item.field === '纬度') {
- temp['lat'] = item.value ? data[item.value] : data['lat']
- }
- }
- result.push(temp)
- })
- return result
- },
- handleParam(e) {
- let jnpfKey = this.config.jnpfKey
- if (jnpfKey == 'customEcharts') return
- let item = {}
- let choose = e.opts.series && e.opts.series[0]
- let chooseIndex = e.currentIndex['index']
- let name = ''
- let type = ''
- let value = ''
- if (jnpfKey === "barChart") {
- name = e.opts.categories[chooseIndex]
- value = choose.data[chooseIndex]
- type = choose.name
- }
- if (jnpfKey === "pieChart") {
- name = choose.name
- value = choose.data
- let series = this.option.chartData.series && this.option.chartData.series[0]
- type = series.name
- }
- if (jnpfKey === "lineChart") {
- name = e.opts.categories[chooseIndex]
- value = choose.data[chooseIndex]
- type = choose.name
- }
- if (jnpfKey === "radarChart") {
- chooseIndex = e.currentIndex
- name = e.opts.categories[chooseIndex]
- value = choose.data[chooseIndex]
- type = choose.name
- }
- if (jnpfKey === "mapChart" && choose.properties.childrenNum == 0) {
- name = choose.properties.name
- item.long = choose.properties.center[0]
- item.lat = choose.properties.center[1]
- }
- if (chooseIndex < 0 && jnpfKey !== "mapChart") return
- if (jnpfKey === "mapChart" && choose.properties.childrenNum != 0) return
- item.name = name
- item.value = value
- item.type = type
- item.urlAddress = this.config.option.urlAddress
- this.jnpf.solveAddressParam(item, this.config)
- this.jnpf.jumpLink(item.urlAddress)
- },
- handleAttrs() {
- let chartTitle = {
- titleText: this.config.option.titleText, //主标题
- titleTextStyleColor: this.config.option.titleTextStyleColor, //主标题字体颜色
- titleTextStyleFontSize: this.config.option.titleTextStyleFontSize * 2 + 'rpx', //主标题字体大小[12-25px]
- titleTextStyleFontWeight: this.config.option.titleTextStyleFontWeight ? 700 : 0, //主标题是否加粗
- titleLeft: this.config.option.titleLeft === 'left' ? 'flex-start' : this.config.option
- .titleLeft === 'right' ? 'flex-end' : 'center', //主子标题位置[left,center,right]
- titleBgColor: this.config.option.titleBgColor, //主子标题背景色[rgba(),#303133]
- // 图表副标题设置
- titleSubtext: this.config.option.titleSubtext, //子标题
- titleSubtextStyleColor: this.config.option.titleSubtextStyleColor, //子标题字体颜色
- titleSubtextStyleFontSize: this.config.option.titleSubtextStyleFontSize * 2 +
- 'rpx', //子标题字体大小[12-25px]
- titleSubtextStyleFontWeight: this.config.option.titleSubtextStyleFontWeight ? 700 : 0, //子标题是否加粗
- }
- if (['customEcharts'].includes(this.config.jnpfKey)) {
- this.$nextTick(() => {
- this.show = true
- this.key = +new Date()
- })
- return
- }
- let defVal = this.config.option.defaultValue
- let chartVal = JSON.parse(JSON.stringify(defVal)) || []
- let typeArr = Array.from(new Set(chartVal.map((item) => item.type)))
- let axisData = Array.from(new Set(chartVal.map((item) => item.name)))
- let seriesData = []
- let colorList = [];
- let chartsType = "";
- let Ymin = []; //y轴最小
- let Ymax = []; //y轴最大
- let type = "";
- let yAxis = {};
- let xAxis = {};
- if (!['mapChart', 'customEcharts'].includes(this.config.jnpfKey)) {
- typeArr.forEach((title, index) => {
- const type = this.getType(title, this.config)
- let obj = {
- name: title,
- type: type
- }
- if (this.config.option.seriesLabelShow) {
- obj.textSize = (this.config.option.seriesLabelFontSize / 2) < 12 ? 12 : this.config
- .option
- .seriesLabelFontSize / 2
- obj.textColor = this.config.option.seriesLabelColor
- }
- let chartArr = chartVal.filter((item) => title === item.type)
- if (this.config.jnpfKey === 'barChart' || this.config.jnpfKey === 'lineChart' || this
- .config
- .jnpfKey ==
- 'radarChart') {
- obj['data'] = chartArr.map((item) => item.value)
- } else {
- obj['data'] = chartArr.map((item) => {
- return {
- value: item.value,
- name: item.name,
- }
- })
- if (this.config.option.showZero) obj['data'] = obj['data'].filter((item) => item
- .value != 0)
- this.key = +new Date
- }
- Ymin.push(Math.min(...obj['data']))
- Ymax.push(Math.max(...obj['data']))
- seriesData.push(obj);
- })
- xAxis = {
- disabled: !this.config.option.xAxisShow, //不绘制X轴
- axisLine: this.config.option.xAxisShow, //绘制坐标轴轴线
- axisLineColor: !this.config.option.xAxisShow ? '#fff' : this.config.option
- .xAxisAxisLineLineStyleColor, //坐标轴轴线颜色,默认#CCCCCC
- title: "", //X轴标题
- titleFontSize: this.config.option.xAxisNameTextStyleFontSize, //标题字体大小
- titleFontColor: this.config.option.xAxisNameTextStyleColor, //X轴名称字体颜色
- titleOffsetY: -20, //标题纵向偏移距离,负数为向上偏移,正数向下偏移
- titleOffsetX: -300, //标题横向偏移距离,负数为向左偏移,正数向右偏移
- fontSize: (this.config.option.xAxisAxisLabelTextStyleFontSize / 2) < 14 ? 14 : this.config
- .option
- .xAxisAxisLabelTextStyleFontSize / 2, //X轴标签字体大小
- fontColor: this.config.option.xAxisAxisLabelTextStyleColor, //X轴标签字体颜色
- rotateAngle: this.config.option.xAxisAxisLabelRotate, ////X轴标签角度
- rotateLabel: this.config.option.xAxisAxisLabelRotate > 0 ? true : false, //【旋转】数据点(刻度点)文字
- gridColor: this.config.option.xAxisSplitLineLineStyleColor, //纵向网格颜色,默认#CCCCCC
- splitNumber: 4, //X轴网格数量,纵向网格数量(竖着的)
- disableGrid: !this.config.option.xAxisShow ? !this.config.option.xAxisShow : !this.config
- .option.xAxisSplitLineShow, //不绘制纵向网格(即默认绘制网格)
- scrollShow: axisData.length > 5 ? true : false, //是否显示滚动条,配合拖拽滚动使用(即仅在启用 enableScroll 时有效
- scrollAlign: "left", //滚动条初始位置
- scrollColor: "#A6A6A6", //滚动条颜色,默认#A6A6A6
- scrollBackgroundColor: "#EFEBEF", //滚动条底部背景颜色,默认#EFEBEF
- itemCount: axisData.length > 5 ? 6 : 5, //单屏数据密度即图表可视区域内显示的X轴数据点数量,仅在启用enableScroll时有效
- };
- yAxis = {
- data: [{
- position: "left",
- title: "",
- min: this.config.option.styleType == 6 ? -jnpf.toRound(Math.abs(Math.min(...
- Ymin)
- .toString().length > 2 ? Math.min(...Ymin) - 200 : Math
- .min(
- ...Ymin) - 50)) : 0,
- max: jnpf.toRound(Math.max(...Ymax)),
- axisLine: true, //坐标轴轴线是否显示(数据还能显示)
- axisLineColor: this.config.option
- .yAxisAxisLineLineStyleColor, //坐标轴轴线颜色,默认#CCCCCC
- disabled: !this.config.option.yAxisShow, //不绘制Y轴(刻度和轴线都不绘制)
- fontColor: this.config.option
- .yAxisAxisLabelTextStyleColor, //数据点(刻度点)字体颜色,默认#666666
- fontSize: (this.config.option.yAxisAxisLabelTextStyleFontSize / 2) < 12 ? 12 : this
- .config
- .option.yAxisAxisLabelTextStyleFontSize / 2, //数据点(刻度点)字体颜色,默认#666666
- }],
- padding: 10, //多个Y轴间的间距
- gridSet: "number", //横向向网格数量类型设置,可选值,'auto','array'
- disableGrid: !this.config.option.yAxisSplitLineShow, //不绘制横向向网格(即默认绘制网格)
- splitNumber: 4, //【指定数量】的横向向网格数量,此数量与Y轴数据点是否为小数有关,如果指定了max,请指定为能被max-min整除的数值
- gridType: "solid", //横向向网格线型
- gridColor: this.config.option.yAxisSplitLineLineStyleColor, //横向网格颜色,默认#CCCCCC
- };
- this.config.option.colorList.forEach((o, i) => {
- if (o.color1) colorList.push(o.color1)
- })
- }
- let opts = {
- color: colorList, //主题颜色,16进制颜色格式,Array格式
- padding: [15, 15, 0, 15], //画布填充边距[上,右,下,左],Array格式
- enableScroll: axisData.length > 5 ? true :
- false, //开启图表可拖拽滚动,开启后ontouch需要赋值为true,X轴配置里需要配置itemCount单屏幕数据点数量
- dataLabel: this.config.option.seriesLabelShow, //是否显示图表区域内数据点上方的数据文案
- legend: {
- fontColor: this.config.jnpfKey === 'pieChart' ? "#666666" : "",
- show: this.config.option.legendShow, //是否显示图例标识
- position: 'top',
- float: 'right',
- fontSize: (this.config.option.legendTextStyleFontSize / 2) < 14 ? 14 : this.config.option
- .legendTextStyleFontSize / 2
- },
- extra: {
- tooltip: {
- showBox: this.config.option.tooltipShow, //提示语显示
- fontSize: (this.config.option.tooltipTextStyleFontSize / 2) < 14 ? 14 : this.config
- .option
- .tooltipTextStyleFontSize / 2, //提示语字体大小
- fontColor: this.config.option.tooltipTextStyleColor, //提示语字体颜色
- bgColor: this.config.option.tooltipBgColor || '#000000' //提示窗口的背景颜色
- },
- mix: {
- column: {}
- },
- column: {
- type: 'group',
- width: this.config.option.seriesBarWidth, //柱体宽度
- activeBgColor: "#000000",
- activeBgOpacity: 0.08,
- linearType: "none",
- barBorderRadius: [this.config.option.seriesItemStyleBarBorderRadius, this.config.option
- .seriesItemStyleBarBorderRadius, this.config.option
- .seriesItemStyleBarBorderRadius,
- this.config.option.seriesItemStyleBarBorderRadius
- ], //自定义4个圆角半径[左上,右上,右下,左下]
- seriesGap: 5, //多series每个柱子之间的间距
- customColor: colorList, //扩展渐变色
- barBorderCircle: false
- }
- }
- }
- if (this.config.jnpfKey === 'barChart') {
- if (this.config.option.styleType == 5 || this.config.option.styleType == 1 ||
- this.config.option.styleType == 4 || this.config.option.styleType == 6) {
- type = 'group'
- if (this.config.option.styleType == 6) {
- opts.extra.column.barBorderRadius = []
- // opts.extra.column.width = 50
- // yAxis.splitNumber = (yAxis.data[0].max / 500) + (Math.abs(yAxis.data[0].min) / 500)
- }
- } else {
- type = 'stack'
- opts.extra.mix.column = {
- width: this.config.option.seriesBarWidth, //柱体宽度
- barBorderCircle: false, //启用分组柱状图半圆边框
- barBorderRadius: [this.config.option.seriesItemStyleBarBorderRadius, this.config.option
- .seriesItemStyleBarBorderRadius, this.config.option
- .seriesItemStyleBarBorderRadius,
- this.config.option.seriesItemStyleBarBorderRadius
- ], //自定义4个圆角半径[左上,右上,右下,左下]
- }
- }
- chartsType = this.config.option.styleType == 7 ? 'mix' : 'column'
- opts.xAxis = {
- ...xAxis
- }
- opts.yAxis = {
- ...yAxis
- }
- opts.extra.column.type = type
- } else if (this.config.jnpfKey === "pieChart") {
- chartsType = 'pie'
- opts.fontColor = this.config.option.seriesLabelColor
- opts.fontSize = (this.config.option.seriesLabelFontSize / 2) < 14 ? 14 : this.config.option
- .seriesLabelFontSize / 2
- let pieChartObj = {
- borderColor: "#FFFFFF",
- borderWidth: 3,
- activeOpacity: 0.5,
- offsetAngle: -90,
- labelWidth: 15,
- border: false,
- }
- let pieChartObj2 = {
- offsetX: 0,
- offsetY: 0,
- name: "",
- }
- if (this.config.option.styleType == 1) {
- if (this.config.option.roseType) chartsType = 'rose'
- opts.extra[chartsType] = {
- ...pieChartObj
- }
- } else {
- chartsType = 'ring';
- opts.title = {
- fontSize: 15,
- color: "#666666",
- ...pieChartObj2
- };
- opts.subtitle = {
- fontSize: 25,
- color: "#7cb5ec",
- ...pieChartObj2
- }
- opts.extra[chartsType] = {
- ringWidth: 60,
- activeRadius: 10,
- ...pieChartObj
- }
- }
- } else if (this.config.jnpfKey === "lineChart") {
- chartsType = this.config.option.areaStyle ? 'area' : 'line'
- type = this.config.option.styleType == 2 ? 'curve' : this.config.option.styleType == 3 ? 'step' :
- 'straight'
- let lineChartObj = {
- type: type,
- width: this.config.option.seriesLineStyleWidth
- }
- opts.extra[chartsType] = {
- ...lineChartObj
- }
- opts.xAxis = {
- ...xAxis
- }
- opts.yAxis = {
- ...yAxis
- }
- } else if (this.config.jnpfKey === "radarChart") {
- chartsType = "radar";
- type = this.config.option.styleType == 1 ? chartsType : 'circle'
- opts.fontSize = (this.config.option.radarAxisNameFontSize / 2) < 14 ? 14 : this.config.option
- .radarAxisNameFontSize / 2
- opts.fontColor = this.config.option.seriesLabelColor
- opts.extra[chartsType] = {
- gridType: type,
- gridColor: "#CCCCCC",
- gridCount: 5,
- opacity: 0.2,
- max: 200,
- labelShow: true,
- border: true,
- max: 100,
- labelColor: this.config.option.radarAxisNameColor
- }
- } else {
- this.getAtlas()
- chartsType = "map";
- this.config.option.markPoints = []
- opts = {
- update: true,
- fontSize: this.config.option.geoLabelFontSize,
- padding: [15, 15, 30, 15],
- dataLabel: this.config.option.geoLabelShow,
- fontColor: this.config.option.geoLabelColor,
- extra: {
- tooltip: {
- showBox: this.config.option.tooltipShow,
- fontColor: this.config.option.tooltipTextStyleColor || '#000',
- //fontSize: this.config.option.tooltipTextStyleFontSize,
- bgColor: this.config.option.tooltipBgColor || '#fff',
- bgOpacity: 1
- },
- map: {
- mercator: false,
- border: true,
- borderWidth: this.config.option.geoBorderWidth / 2,
- borderColor: this.config.option.geoBorderColor,
- activeBorderColor: "#F04864",
- activeFillColor: "#FACC14",
- activeFillOpacity: 1,
- active: true,
- activeTextColor: "#FFFFFF",
- fillOpacity: 1
- },
- },
- }
- this.config.option.defaultValue.forEach(o => {
- this.config.option.markPoints.push({
- latitude: o.lat,
- longitude: o.long,
- name: o.name,
- value: o.value
- })
- })
- }
- let chartData = {
- categories: axisData,
- series: seriesData,
- opts,
- type: chartsType
- }
- if (chartsType != 'map') {
- if (chartTitle.titleText && chartTitle.titleSubtext) {
- chartData.opts.legend.padding = 50
- } else if (chartTitle.titleText && !chartTitle.titleSubtext) {
- chartData.opts.legend.padding = 30
- } else {
- chartData.opts.legend.padding = 5
- }
- }
- this.config.option.chartData = chartData
- this.config.option.chartTitle = chartTitle
- this.option = this.config.option
- this.$nextTick(() => {
- this.show = true
- this.key = +new Date()
- })
- },
- /* 获取地图树 */
- getAtlas() {
- getAtlas().then(res => {
- this.mapList = jnpf.treeToArray(res.data);
- this.regionStep = []
- this.drawChina()
- })
- },
- /* 获取地图数据 */
- drawChina(type) {
- if (Array.isArray(this.option.mapType) && !type) this.mapType = this.option.mapType[this.option.mapType
- .length - 1]
- geojson(this.mapType).then(res => {
- let series = JSON.parse(JSON.stringify(res.data.features)) || [];
- for (var i = 0; i < series.length; i++) {
- if (series[i].geometry.type === 'Polygon' && !type) {
- if (this.mapType == 150000) {
- series[i].geometry.coordinates = series[i].geometry.coordinates
- } else {
- series[i].geometry.coordinates = [series[i].geometry.coordinates]
- }
- }
- series[i].value = Math.floor(Math.random() * 1000)
- series[i].color = this.option.geoAreaColor
- }
- this.mapData = series
- this.stepMapList.push(this.mapData)
- this.option.chartData.series = series
- this.key = +new Date()
- })
- },
- /* 地图点击路径 */
- regionStepClick(e, index) {
- if (index == 0) {
- this.stepMapList = []
- this.regionStep = []
- for (let i = 0; i < this.mapList.length; i++) {
- if (this.mapList[i].enCode == this.option.mapType[this.option.mapType.length - 1]) {
- this.regionStep.push({
- name: this.mapList[i].fullName,
- adcode: this.mapList[i].enCode
- })
- }
- }
- this.drawChina()
- return
- }
- this.mapType = e.adcode
- this.stepMapList.splice(index + 1, this.regionStep.length - index - 1)
- this.regionStep.splice(index + 1, this.regionStep.length - index - 1)
- this.drawChina(1)
- },
- /* 地图点击 */
- getIndex(e) {
- // 处理跳转参数
- this.handleParam(e)
- let current = this.mapList.filter(o => o.enCode == this.option.mapType[this.option.mapType.length - 1])
- if (!this.config.option.drillDown) return
- let mapData = this.mapData[e.currentIndex] ? this.mapData[e.currentIndex] : []
- this.mapType = mapData.properties.adcode
- let acroutes = mapData.properties.acroutes
- let selectName = mapData.properties.name
- let adcode = mapData.properties.adcode
- this.regionStep.unshift({
- name: current[0].fullName,
- adcode: current[0].enCode
- })
- this.regionStep.push({
- name: selectName,
- adcode: adcode
- })
- //对象数组去重
- this.regionStep = this.regionStep.filter((a, b, c) => {
- return c.findIndex(x => x.name === a.name) === b
- })
- this.pointLoading = false
- this.drawChina(1)
- },
- getType(title) {
- if (this.config.jnpfKey == 'barChart') {
- if (this.config.option.styleType == 7) {
- const arr = this.config.option.barType.find(ele => title == ele.title)
- if (arr && arr.type) {
- if (arr.type == 'bar') return 'column'
- return arr.type
- }
- }
- return 'column'
- } else if (this.config.jnpfKey == 'lineChart') {
- return 'line'
- } else if (this.config.jnpfKey == 'pieChart') {
- return 'pie'
- } else {
- return 'radar'
- }
- },
- /* 设置地图点 */
- setPoints(e) {
- const mapData = e.opts.chartData.mapData;
- this.option.markPoints = this.option.markPoints.slice(0, this.option.appShowNumber)
- for (var i = 0; i < this.option.markPoints.length; i++) {
- const points = this.coordinateToPoint(this.option.markPoints[i].longitude, this.option.markPoints[i]
- .latitude, mapData
- .bounds,
- mapData.scale, mapData.xoffset, mapData.yoffset, mapData.mercator)
- this.option.markPoints[i].x = points.x;
- this.option.markPoints[i].y = points.y;
- }
- this.pointLoading = true
- this.$refs.charts.key = +new Date();
- },
- /* 经纬度转画布坐标 */
- coordinateToPoint(longitude, latitude, bounds, scale, xoffset, yoffset, mercator) {
- var x = longitude;
- var y = latitude;
- if (mercator == true) {
- x = longitude * 20037508.34 / 130;
- y = Math.log(Math.tan((90 + latitude) * Math.PI / 360)) / (Math.PI / 180);
- y = y * 20037508.34 / 180;
- }
- return {
- x: (x - bounds.xMin) * scale + xoffset,
- y: (bounds.yMax - y) * scale + yoffset
- };
- }
- }
- }
|