Переделано построение всех карт
This commit is contained in:
parent
3fd00f9e3f
commit
9e13e9ec1a
12
index.html
12
index.html
@ -111,7 +111,7 @@
|
|||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
set_style(style) {
|
add_style(style) {
|
||||||
this.style = { ...this.style || {}, ...style }
|
this.style = { ...this.style || {}, ...style }
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
@ -385,13 +385,13 @@
|
|||||||
axios.post('http://localhost:4000/proxy/sqlite', { query }).then(x => x.data)
|
axios.post('http://localhost:4000/proxy/sqlite', { query }).then(x => x.data)
|
||||||
.then(wells => {
|
.then(wells => {
|
||||||
|
|
||||||
let layer_wells = wells.map(w => circle(15).set_style(style_wellhead).move(w.whx, w.why).render())
|
let layer_wells = wells.map(w => circle(15).add_style(style_wellhead).move(w.whx, w.why).render())
|
||||||
let layer_wells_wpr = wells.map(w => svg_sector(70, 0, 70).set_style(style_wir).move(w.whx, w.why).render())
|
let layer_wells_wpr = wells.map(w => svg_sector(70, 0, 70).add_style(style_wir).move(w.whx, w.why).render())
|
||||||
|
|
||||||
let layer_wells_gpr = wells.map(w => svg_sector(70, 70, 130).set_style(style_gpr).move(w.whx, w.why).render())
|
let layer_wells_gpr = wells.map(w => svg_sector(70, 70, 130).add_style(style_gpr).move(w.whx, w.why).render())
|
||||||
let layer_wells_opr = wells.map(w => svg_sector(70, 130, 360).set_style(style_opr).move(w.whx, w.why).render())
|
let layer_wells_opr = wells.map(w => svg_sector(70, 130, 360).add_style(style_opr).move(w.whx, w.why).render())
|
||||||
|
|
||||||
let layer_well_names = wells.map(w => svg_text(w.well).set_style(style_wellhead_text).move(w.whx + 10, w.why - 10).render())
|
let layer_well_names = wells.map(w => svg_text(w.well).add_style(style_wellhead_text).move(w.whx + 10, w.why - 10).render())
|
||||||
// let layers = [...layer_wells, ...layer_wells_wpr, ...layer_well_names]
|
// let layers = [...layer_wells, ...layer_wells_wpr, ...layer_well_names]
|
||||||
// let layers = layer_wells_wpr
|
// let layers = layer_wells_wpr
|
||||||
let layers = [...layer_wells_wpr, ...layer_wells_gpr, ...layer_wells_opr, ...layer_wells, ...layer_well_names,
|
let layers = [...layer_wells_wpr, ...layer_wells_gpr, ...layer_wells_opr, ...layer_wells, ...layer_well_names,
|
||||||
|
|||||||
@ -30,21 +30,21 @@
|
|||||||
let WellsRenderer = {
|
let WellsRenderer = {
|
||||||
// [{x,y}]
|
// [{x,y}]
|
||||||
heads(wells, r, style) {
|
heads(wells, r, style) {
|
||||||
return wells.map((w) => SvgNodes.circle(r).set_style(style).move(w.x, w.y));
|
return wells.map((w) => SvgNodes.circle(r).add_style(style).move(w.x, w.y));
|
||||||
},
|
},
|
||||||
|
|
||||||
// [{x,y,name}]
|
// [{x,y,name}]
|
||||||
names(wells, style, shift) {
|
names(wells, style, shift) {
|
||||||
return wells.map((w) =>
|
return wells.map((w) =>
|
||||||
SvgNodes.text(w.name)
|
SvgNodes.text(w.name)
|
||||||
.set_style(style)
|
.add_style(style)
|
||||||
.move(w.x + shift.x, w.y + shift.y)
|
.move(w.x + shift.x, w.y + shift.y)
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
// {x,y,ring[1,2,3,4,5]}
|
// {x,y,ring[1,2,3,4,5]}
|
||||||
ring(x, y, r0, r1, a0, a1, style) {
|
ring(x, y, r0, r1, a0, a1, style) {
|
||||||
return SvgNodes.ring_sector(r0, r1, a0, a1).move(x, y).set_style(style);
|
return SvgNodes.ring_sector(r0, r1, a0, a1).move(x, y).add_style(style);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -238,17 +238,17 @@
|
|||||||
let a0 = 0;
|
let a0 = 0;
|
||||||
let a1 = 130;
|
let a1 = 130;
|
||||||
let layer_gpt = scaled_wells.map((w) =>
|
let layer_gpt = scaled_wells.map((w) =>
|
||||||
SvgNodes.ring_sector(r0, r1, a0, a1).move(w.whx, w.why).set_style(styles.gpt)
|
SvgNodes.ring_sector(r0, r1, a0, a1).move(w.whx, w.why).add_style(styles.gpt)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let layer_wells = scaled_wells.map((w) =>
|
let layer_wells = scaled_wells.map((w) =>
|
||||||
SvgNodes.circle(whr).set_attrs({ cx: w.whx, cy: w.why }).set_style(styles.wellhead)
|
SvgNodes.circle(whr).set_attrs({ cx: w.whx, cy: w.why }).add_style(styles.wellhead)
|
||||||
);
|
);
|
||||||
let layer_wellnames = scaled_wells.map((w) =>
|
let layer_wellnames = scaled_wells.map((w) =>
|
||||||
SvgNodes.text(w.well)
|
SvgNodes.text(w.well)
|
||||||
.set_style(styles.style_wellhead)
|
.add_style(styles.style_wellhead)
|
||||||
.move(w.whx + shift.x, w.why + shift.y)
|
.move(w.whx + shift.x, w.why + shift.y)
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -256,18 +256,18 @@
|
|||||||
sectored_ring(0, 50, [{v: 10, style: styles.gpt}, {v: 20, style: styles.opt}, {v: 30, style: styles.wopt}]).move(w.whx, w.why)
|
sectored_ring(0, 50, [{v: 10, style: styles.gpt}, {v: 20, style: styles.opt}, {v: 30, style: styles.wopt}]).move(w.whx, w.why)
|
||||||
);
|
);
|
||||||
|
|
||||||
// let layer_wells_wpr = wells.map((w) => svg_sector(70, 0, 70).set_style(style_wir).move(w.whx, w.why).render());
|
// let layer_wells_wpr = wells.map((w) => svg_sector(70, 0, 70).add_style(style_wir).move(w.whx, w.why).render());
|
||||||
|
|
||||||
// let layer_wells_gpr = wells.map((w) =>
|
// let layer_wells_gpr = wells.map((w) =>
|
||||||
// svg_sector(70, 70, 130).set_style(style_gpr).move(w.whx, w.why).render()
|
// svg_sector(70, 70, 130).add_style(style_gpr).move(w.whx, w.why).render()
|
||||||
// );
|
// );
|
||||||
// let layer_wells_opr = wells.map((w) =>
|
// let layer_wells_opr = wells.map((w) =>
|
||||||
// svg_sector(70, 130, 360).set_style(style_opr).move(w.whx, w.why).render()
|
// svg_sector(70, 130, 360).add_style(style_opr).move(w.whx, w.why).render()
|
||||||
// );
|
// );
|
||||||
|
|
||||||
// let layer_well_names = wells.map((w) =>
|
// let layer_well_names = wells.map((w) =>
|
||||||
// svg_text(w.well)
|
// svg_text(w.well)
|
||||||
// .set_style(style_wellhead_text)
|
// .add_style(style_wellhead_text)
|
||||||
// .move(w.whx + 10, w.why - 10)
|
// .move(w.whx + 10, w.why - 10)
|
||||||
// .render()
|
// .render()
|
||||||
// );
|
// );
|
||||||
|
|||||||
477
src/back_.js
477
src/back_.js
@ -1,4 +1,4 @@
|
|||||||
import fs, { symlinkSync } from "fs";
|
import fs from "fs";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
|
|
||||||
import SvgMap from "./svgmap/SvgMap.js";
|
import SvgMap from "./svgmap/SvgMap.js";
|
||||||
@ -9,6 +9,8 @@ import SvgNodes from "./svgmap/SvgNodes.js";
|
|||||||
import Transfrom from "./libs/Transform.js";
|
import Transfrom from "./libs/Transform.js";
|
||||||
import BBox from "./libs/bbox.js";
|
import BBox from "./libs/bbox.js";
|
||||||
|
|
||||||
|
import sql_pi from "./services/sql/prod_inj.js";
|
||||||
|
|
||||||
// import SvgNodes from "./svgmap/SvgNodes.js";
|
// import SvgNodes from "./svgmap/SvgNodes.js";
|
||||||
|
|
||||||
// import math_lib from './libs/math.js'
|
// import math_lib from './libs/math.js'
|
||||||
@ -25,8 +27,46 @@ const path = "../../data/prodmaps";
|
|||||||
|
|
||||||
// let file = fs.readFileSync('../data/2022-03-16/49_Кар тек и сум отб 7 об_вост-px.svg')
|
// let file = fs.readFileSync('../data/2022-03-16/49_Кар тек и сум отб 7 об_вост-px.svg')
|
||||||
|
|
||||||
|
const query = (sql) => axios.post(`${back_url}/proxy/sqlite`, { query: sql }).then((x) => x.data.data);
|
||||||
|
|
||||||
let styles = JSON.parse(fs.readFileSync("./moc/styles.json").toString());
|
let styles = JSON.parse(fs.readFileSync("./moc/styles.json").toString());
|
||||||
|
|
||||||
|
const all_settings = {
|
||||||
|
pt: {
|
||||||
|
tons_in_cm2: 10000,
|
||||||
|
ppu: 100, // 100
|
||||||
|
styles,
|
||||||
|
// Масштаб 1мм карты / 1мм реальный (1000мм в 1м)
|
||||||
|
map_scale: (1 / 10000) * 1000,
|
||||||
|
},
|
||||||
|
|
||||||
|
it: {
|
||||||
|
tons_in_cm2: 100000,
|
||||||
|
ppu: 100, // 100
|
||||||
|
styles,
|
||||||
|
// Масштаб 1мм карты / 1мм реальный (1000мм в 1м)
|
||||||
|
map_scale: (1 / 10000) * 1000,
|
||||||
|
},
|
||||||
|
|
||||||
|
pr: {
|
||||||
|
tons_in_cm2: 5,
|
||||||
|
ppu: 100,
|
||||||
|
styles,
|
||||||
|
// Масштаб 1мм карты / 1мм реальный (1000мм в 1м)
|
||||||
|
map_scale: (1 / 10000) * 1000,
|
||||||
|
},
|
||||||
|
|
||||||
|
ir: {
|
||||||
|
tons_in_cm2: 50,
|
||||||
|
ppu: 100,
|
||||||
|
styles,
|
||||||
|
// Масштаб 1мм карты / 1мм реальный (1000мм в 1м)
|
||||||
|
map_scale: (1 / 10000) * 1000,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
// all_settings.styles = SvgMapBuilder.update_styles(all_settings.styles, all_settings.ppu)
|
||||||
|
|
||||||
let parser = new SvgMap();
|
let parser = new SvgMap();
|
||||||
|
|
||||||
async function start() {
|
async function start() {
|
||||||
@ -93,9 +133,6 @@ async function start() {
|
|||||||
// return tr;
|
// return tr;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Функция перевода координат из глобальных в локальные.
|
// Функция перевода координат из глобальных в локальные.
|
||||||
const cs1 = new CoordSystem(anchor.w1.x, anchor.w1.y, anchor.w2.x, anchor.w2.y);
|
const cs1 = new CoordSystem(anchor.w1.x, anchor.w1.y, anchor.w2.x, anchor.w2.y);
|
||||||
const cs2 = new CoordSystem(ww1.whx, ww1.why, ww2.whx, ww2.why);
|
const cs2 = new CoordSystem(ww1.whx, ww1.why, ww2.whx, ww2.why);
|
||||||
@ -105,11 +142,9 @@ async function start() {
|
|||||||
|
|
||||||
// console.log('tr is:', tr);
|
// console.log('tr is:', tr);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// console.log(wells)
|
// console.log(wells)
|
||||||
|
|
||||||
const DATE = '2023-01-01'
|
const DATE = "2023-01-01";
|
||||||
|
|
||||||
const query_all = `SELECT
|
const query_all = `SELECT
|
||||||
wells.well, wells.whx, wells.why,
|
wells.well, wells.whx, wells.why,
|
||||||
@ -128,21 +163,17 @@ async function start() {
|
|||||||
GROUP BY
|
GROUP BY
|
||||||
wells.well
|
wells.well
|
||||||
|
|
||||||
`// WHERE well='${anchor.w1.name}'`;
|
`; // WHERE well='${anchor.w1.name}'`;
|
||||||
|
|
||||||
|
|
||||||
// Получим максимально удаленные скважины не лежащие вдоль оси.
|
// Получим максимально удаленные скважины не лежащие вдоль оси.
|
||||||
let all_wells = await axios.post(`${back_url}/proxy/sqlite`, { query: query_all }).then((x) => x.data.data);
|
let all_wells = await axios.post(`${back_url}/proxy/sqlite`, { query: query_all }).then((x) => x.data.data);
|
||||||
|
|
||||||
let bbox = BBox.from_array(all_wells.map(w => ({x: w.whx, y: w.why})))
|
let bbox = BBox.from_array(all_wells.map((w) => ({ x: w.whx, y: w.why })));
|
||||||
console.log('BBOX', bbox)
|
console.log("BBOX", bbox);
|
||||||
console.log('BBOX', bbox.toLTWH())
|
console.log("BBOX", bbox.toLTWH());
|
||||||
console.log('BBOX', bbox.toLTRB())
|
console.log("BBOX", bbox.toLTRB());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
tr = Transfrom.fromCoordSyses()
|
|
||||||
|
|
||||||
|
tr = Transfrom.fromCoordSyses();
|
||||||
|
|
||||||
let mapped_wells = all_wells.map((x) => ({ ...x, lx: tr.trx(x.whx), ly: tr.try(x.why) }));
|
let mapped_wells = all_wells.map((x) => ({ ...x, lx: tr.trx(x.whx), ly: tr.try(x.why) }));
|
||||||
|
|
||||||
@ -157,359 +188,179 @@ async function start() {
|
|||||||
|
|
||||||
// console.log(math_lib.make_ranges(vals))
|
// console.log(math_lib.make_ranges(vals))
|
||||||
|
|
||||||
// svg.append(mapped_wells.map((x) => SvgNodes.ring_sector(1.5 * sc.k, 6 * sc.k, 0, 120).move(x.lx, x.ly).set_style(styles.gpt)));
|
// svg.append(mapped_wells.map((x) => SvgNodes.ring_sector(1.5 * sc.k, 6 * sc.k, 0, 120).move(x.lx, x.ly).add_style(styles.gpt)));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const settings = {
|
const settings = {
|
||||||
tons_in_cm2: 10000,
|
tons_in_cm2: 10000,
|
||||||
styles
|
styles,
|
||||||
}
|
};
|
||||||
|
|
||||||
{
|
{
|
||||||
let ti_layer = parser.build_tp_layer(mapped_wells, settings)
|
let ti_layer = parser.build_tp_layer(mapped_wells, settings);
|
||||||
let svg = SvgNodes.svg().set_attr("width", "1000px").set_attr("height", "1000px").set_attr("viewBox", "0 0 1000 1000")
|
let svg = SvgNodes.svg()
|
||||||
|
.set_attr("width", "1000px")
|
||||||
|
.set_attr("height", "1000px")
|
||||||
|
.set_attr("viewBox", "0 0 1000 1000");
|
||||||
// let defs = new SvgNode('defs')
|
// let defs = new SvgNode('defs')
|
||||||
// defs.append(ti_layer.defs)
|
// defs.append(ti_layer.defs)
|
||||||
// console.log(ti_layer.defs.tag)
|
// console.log(ti_layer.defs.tag)
|
||||||
svg.append(ti_layer.defs)
|
svg.append(ti_layer.defs);
|
||||||
svg.append(ti_layer.svg)
|
svg.append(ti_layer.svg);
|
||||||
fs.writeFileSync(`${path}/out.svg`, svg.render());
|
fs.writeFileSync(`${path}/out.svg`, svg.render());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// let ti_layer = parser.build_tp_layer(mapped_wells, settings)
|
// let ti_layer = parser.build_tp_layer(mapped_wells, settings)
|
||||||
// let data = file.toString()
|
// let data = file.toString()
|
||||||
// .replace('</defs>', ti_layer.defs.render() + '</defs>')
|
// .replace('</defs>', ti_layer.defs.render() + '</defs>')
|
||||||
// .replace('</svg>', ti_layer.svg.render() + '</svg>')
|
// .replace('</svg>', ti_layer.svg.render() + '</svg>')
|
||||||
// fs.writeFileSync("../tmp/out_prod.svg", data) //svg.render());
|
// fs.writeFileSync("../tmp/out_prod.svg", data) //svg.render());
|
||||||
|
|
||||||
|
|
||||||
// let ti_layer_inj = parser.build_ti_layer(mapped_wells, settings)
|
// let ti_layer_inj = parser.build_ti_layer(mapped_wells, settings)
|
||||||
// let data2 = file.toString()
|
// let data2 = file.toString()
|
||||||
// .replace('</defs>', ti_layer_inj.defs.render() + '</defs>')
|
// .replace('</defs>', ti_layer_inj.defs.render() + '</defs>')
|
||||||
// .replace('</svg>', ti_layer_inj.svg.render() + '</svg>')
|
// .replace('</svg>', ti_layer_inj.svg.render() + '</svg>')
|
||||||
// fs.writeFileSync("../tmp/out_inj.svg", data2) //svg.render());
|
// fs.writeFileSync("../tmp/out_inj.svg", data2) //svg.render());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class SvgSaver {
|
||||||
|
constructor(settings, bbox) {
|
||||||
|
// Функция перевода координат из глобальных в локальные.
|
||||||
|
const cs1 = new CoordSystem(bbox.l, bbox.t, bbox.r, bbox.b);
|
||||||
|
const cs_mm = cs1.clone().flipy().moveto(0, 0).scale(settings.map_scale);
|
||||||
|
const cs_ppu = cs_mm.clone().scale(settings.ppu);
|
||||||
|
const csw = Math.abs(cs_mm.x1 - cs_mm.x0);
|
||||||
|
const csh = Math.abs(cs_mm.y1 - cs_mm.y0);
|
||||||
|
const bbox_ppu = BBox.fromLTRB(cs_ppu.x0, cs_ppu.y0, cs_ppu.x1, cs_ppu.y1);
|
||||||
|
|
||||||
|
this.svg = SvgNodes.svg()
|
||||||
|
.set_attr("width", csw + "mm")
|
||||||
|
.set_attr("height", csh + "mm")
|
||||||
|
.set_attr("viewBox", `${bbox_ppu.l} ${bbox_ppu.t} ${bbox_ppu.w()} ${bbox_ppu.h()}`);
|
||||||
|
|
||||||
|
this.tr = Transfrom.fromCoordSyses(cs1, cs_ppu);
|
||||||
|
|
||||||
|
settings.styles = SvgMapBuilder.update_styles(settings.styles, settings.ppu);
|
||||||
|
}
|
||||||
|
|
||||||
|
append_defs(defs) {
|
||||||
|
this.svg.append(defs);
|
||||||
|
}
|
||||||
|
|
||||||
|
append_svg(svg) {
|
||||||
|
this.svg.append(svg);
|
||||||
|
}
|
||||||
|
|
||||||
|
append_layer(layer) {
|
||||||
|
this.append_defs(layer.defs);
|
||||||
|
this.append_svg(layer.svg);
|
||||||
|
}
|
||||||
|
|
||||||
|
save(filename) {
|
||||||
|
fs.writeFileSync(filename, this.svg.render());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function build_bbox(data){
|
||||||
|
let bbox = BBox.from_array(data);
|
||||||
|
if (bbox.w() == 0 || bbox.h() == 0) {
|
||||||
|
bbox.r += 1000;
|
||||||
|
bbox.b += 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
return bbox
|
||||||
|
}
|
||||||
|
|
||||||
async function build_map_pt(devobj) {
|
async function build_map_pt(devobj) {
|
||||||
// const DATE = '2023-01-01'
|
let wells = await query(sql_pi.totals(devobj));
|
||||||
|
wells = wells.filter((x) => x.wopt > 0);
|
||||||
|
if (!wells.length) return
|
||||||
|
|
||||||
const query_all = `SELECT
|
let bbox = build_bbox(wells.map(w => ({ x: w.whx, y: w.why })));
|
||||||
wells.well, wells.whx, wells.why
|
const saver = new SvgSaver(all_settings.pt, bbox);
|
||||||
,SUM(production_injections.woptm) as wopt
|
|
||||||
,SUM(production_injections.wwptm) as wwpt
|
|
||||||
,SUM(production_injections.wsgptv) as wgpt
|
|
||||||
,SUM(production_injections.wwitv) as wwit
|
|
||||||
,SUM(production_injections.wwptm)+SUM(production_injections.woptm) as wlpt
|
|
||||||
,SUM(production_injections.wwptm)/(SUM(production_injections.wwptm)+SUM(production_injections.woptm)) as wlf
|
|
||||||
FROM
|
|
||||||
wells, production_injections
|
|
||||||
WHERE
|
|
||||||
wells.well=production_injections.well
|
|
||||||
|
|
||||||
AND object='${devobj}'
|
let mapped_wells = wells.map((x) => ({ ...x, lx: saver.tr.trx(x.whx), ly: saver.tr.try(x.why) }));
|
||||||
GROUP BY
|
let tp_layer = SvgMapBuilder.build_tp_layer(mapped_wells, all_settings.pt);
|
||||||
wells.well
|
|
||||||
|
|
||||||
`
|
saver.append_layer(tp_layer);
|
||||||
|
saver.save(`${path}/out_devobj-${devobj}-PT.svg`);
|
||||||
let all_wells = await axios.post(`${back_url}/proxy/sqlite`, { query: query_all }).then((x) => x.data.data);
|
|
||||||
if (all_wells.length == 0){
|
|
||||||
// fs.writeFileSync(`${path}/out_devobj-${devobj}.svg`, "");
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let bbox = BBox.from_array(all_wells.map(w => ({x: w.whx, y: w.why})))
|
|
||||||
|
|
||||||
{
|
|
||||||
const builder = new SvgMapBuilder()
|
|
||||||
|
|
||||||
const settings = {
|
|
||||||
tons_in_cm2: 10000,
|
|
||||||
ppu: 100, // 100
|
|
||||||
styles: builder.update_styles(styles, 100),
|
|
||||||
// Масштаб 1мм карты / 1мм реальный (1000мм в 1м)
|
|
||||||
map_scale: 1 / 10000 * 1000
|
|
||||||
}
|
|
||||||
|
|
||||||
// Функция перевода координат из глобальных в локальные.
|
|
||||||
const cs1 = new CoordSystem(bbox.l, bbox.t, bbox.r, bbox.b)
|
|
||||||
const cs_mm = cs1.clone().flipy().moveto(0, 0).scale(settings.map_scale)
|
|
||||||
const cs_ppu = cs_mm.clone().scale(settings.ppu)
|
|
||||||
let tr = Transfrom.fromCoordSyses(cs1, cs_ppu);
|
|
||||||
|
|
||||||
let mapped_wells = all_wells.map((x) => ({ ...x, lx: tr.trx(x.whx), ly: tr.try(x.why) }));
|
|
||||||
|
|
||||||
let ti_layer = builder.build_tp_layer(mapped_wells, settings)
|
|
||||||
const csw = Math.abs(cs_mm.x1 - cs_mm.x0)
|
|
||||||
const csh = Math.abs(cs_mm.y1 - cs_mm.y0)
|
|
||||||
const bbox_ppu = BBox.fromLTRB(cs_ppu.x0, cs_ppu.y0, cs_ppu.x1, cs_ppu.y1)
|
|
||||||
|
|
||||||
let svg = SvgNodes.svg()
|
|
||||||
.set_attr("width", csw + "mm").set_attr("height", csh + "mm")
|
|
||||||
.set_attr("viewBox", `${bbox_ppu.l} ${bbox_ppu.t} ${bbox_ppu.w()} ${bbox_ppu.h()}`)
|
|
||||||
svg.append(ti_layer.defs)
|
|
||||||
svg.append(ti_layer.svg)
|
|
||||||
fs.writeFileSync(`${path}/out_devobj-${devobj}-PT.svg`, svg.render());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function build_map_it(devobj) {
|
async function build_map_it(devobj) {
|
||||||
// const DATE = '2023-01-01'
|
let wells = await query(sql_pi.totals(devobj));
|
||||||
|
wells = wells.filter((x) => x.wwit > 0);
|
||||||
|
if (!wells.length) return
|
||||||
|
|
||||||
const query_all = `SELECT
|
let bbox = build_bbox(wells.map(w => ({ x: w.whx, y: w.why })));
|
||||||
wells.well, wells.whx, wells.why
|
const saver = new SvgSaver(all_settings.it, bbox);
|
||||||
,SUM(production_injections.woptm) as wopt
|
|
||||||
,SUM(production_injections.wwptm) as wwpt
|
|
||||||
,SUM(production_injections.wsgptv) as wgpt
|
|
||||||
,SUM(production_injections.wwitv) as wwit
|
|
||||||
,SUM(production_injections.wwptm)+SUM(production_injections.woptm) as wlpt
|
|
||||||
,SUM(production_injections.wwptm)/(SUM(production_injections.wwptm)+SUM(production_injections.woptm)) as wlf
|
|
||||||
FROM
|
|
||||||
wells, production_injections
|
|
||||||
WHERE
|
|
||||||
wells.well=production_injections.well
|
|
||||||
AND object='${devobj}'
|
|
||||||
GROUP BY
|
|
||||||
wells.well
|
|
||||||
HAVING
|
|
||||||
wwit>0
|
|
||||||
|
|
||||||
`
|
let mapped_wells = wells.map((x) => ({ ...x, lx: saver.tr.trx(x.whx), ly: saver.tr.try(x.why) }));
|
||||||
|
let tp_layer = SvgMapBuilder.build_ti_layer(mapped_wells, all_settings.it);
|
||||||
|
|
||||||
let all_wells = await axios.post(`${back_url}/proxy/sqlite`, { query: query_all }).then((x) => x.data.data);
|
saver.append_layer(tp_layer);
|
||||||
|
saver.save(`${path}/out_devobj-${devobj}-IT.svg`);
|
||||||
if (all_wells.length == 0){
|
|
||||||
// fs.writeFileSync(`${path}/out_devobj-${devobj}.svg`, "");
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let bbox = BBox.from_array(all_wells.map(w => ({x: w.whx, y: w.why})))
|
|
||||||
if (bbox.w() == 0 || bbox.h() == 0){
|
|
||||||
bbox.r += 1000
|
|
||||||
bbox.b += 1000
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
const builder = new SvgMapBuilder()
|
|
||||||
|
|
||||||
const settings = {
|
|
||||||
tons_in_cm2: 20000,
|
|
||||||
ppu: 100, // 100
|
|
||||||
styles: builder.update_styles(styles, 100),
|
|
||||||
// Масштаб 1мм карты / 1мм реальный (1000мм в 1м)
|
|
||||||
map_scale: 1 / 10000 * 1000
|
|
||||||
}
|
|
||||||
|
|
||||||
// Функция перевода координат из глобальных в локальные.
|
|
||||||
const cs1 = new CoordSystem(bbox.l, bbox.t, bbox.r, bbox.b)
|
|
||||||
const cs_mm = cs1.clone().flipy().moveto(0, 0).scale(settings.map_scale)
|
|
||||||
const cs_ppu = cs_mm.clone().scale(settings.ppu)
|
|
||||||
let tr = Transfrom.fromCoordSyses(cs1, cs_ppu);
|
|
||||||
|
|
||||||
let mapped_wells = all_wells.map((x) => ({ ...x, lx: tr.trx(x.whx), ly: tr.try(x.why) }));
|
|
||||||
|
|
||||||
// console.log(mapped_wells)
|
|
||||||
|
|
||||||
let ti_layer = builder.build_ti_layer(mapped_wells, settings)
|
|
||||||
const csw = Math.abs(cs_mm.x1 - cs_mm.x0)
|
|
||||||
const csh = Math.abs(cs_mm.y1 - cs_mm.y0)
|
|
||||||
const bbox_ppu = BBox.fromLTRB(cs_ppu.x0, cs_ppu.y0, cs_ppu.x1, cs_ppu.y1)
|
|
||||||
|
|
||||||
let svg = SvgNodes.svg()
|
|
||||||
.set_attr("width", csw + "mm").set_attr("height", csh + "mm")
|
|
||||||
.set_attr("viewBox", `${bbox_ppu.l} ${bbox_ppu.t} ${bbox_ppu.w()} ${bbox_ppu.h()}`)
|
|
||||||
svg.append(ti_layer.defs)
|
|
||||||
svg.append(ti_layer.svg)
|
|
||||||
fs.writeFileSync(`${path}/out_devobj-${devobj}-IT.svg`, svg.render());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// let ti_layer = parser.build_tp_layer(mapped_wells, settings)
|
|
||||||
// let data = file.toString()
|
|
||||||
// .replace('</defs>', ti_layer.defs.render() + '</defs>')
|
|
||||||
// .replace('</svg>', ti_layer.svg.render() + '</svg>')
|
|
||||||
// fs.writeFileSync("../tmp/out_prod.svg", data) //svg.render());
|
|
||||||
|
|
||||||
|
|
||||||
// let ti_layer_inj = parser.build_ti_layer(mapped_wells, settings)
|
|
||||||
// let data2 = file.toString()
|
|
||||||
// .replace('</defs>', ti_layer_inj.defs.render() + '</defs>')
|
|
||||||
// .replace('</svg>', ti_layer_inj.svg.render() + '</svg>')
|
|
||||||
// fs.writeFileSync("../tmp/out_inj.svg", data2) //svg.render());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function build_map_pty(devobj) {
|
|
||||||
console.log('build_map_pty', devobj)
|
|
||||||
|
|
||||||
let sql_max_year = `SELECT max(year) as max_year FROM production_injections`
|
|
||||||
const max_year = await axios.post(`${back_url}/proxy/sqlite`, { query: sql_max_year }).then((x) => x.data.data[0].max_year);
|
|
||||||
|
|
||||||
// const DATE = '2023-01-01'
|
|
||||||
|
|
||||||
// console.log(max_year)
|
|
||||||
|
|
||||||
const query_all = `SELECT
|
|
||||||
wells.well, wells.whx, wells.why
|
|
||||||
,MAX(production_injections.year) as year
|
|
||||||
,SUM(production_injections.woptm) as wopt
|
|
||||||
,SUM(production_injections.wwptm) as wwpt
|
|
||||||
,SUM(production_injections.wsgptv) as wgpt
|
|
||||||
,SUM(production_injections.wwitv) as wwit
|
|
||||||
,SUM(production_injections.wwptm)+SUM(production_injections.woptm) as wlpt
|
|
||||||
,SUM(production_injections.wwptm)/(SUM(production_injections.wwptm)+SUM(production_injections.woptm)) as wlf
|
|
||||||
FROM
|
|
||||||
wells, production_injections
|
|
||||||
WHERE
|
|
||||||
wells.well=production_injections.well
|
|
||||||
AND object='${devobj}'
|
|
||||||
AND year=${max_year}
|
|
||||||
GROUP BY
|
|
||||||
wells.well
|
|
||||||
|
|
||||||
`
|
|
||||||
|
|
||||||
let all_wells = await axios.post(`${back_url}/proxy/sqlite`, { query: query_all }).then((x) => x.data.data);
|
|
||||||
if (all_wells.length == 0){
|
|
||||||
console.log('NO wells found')
|
|
||||||
// fs.writeFileSync(`${path}/out_devobj-${devobj}-CP.svg`, "");
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let bbox = BBox.from_array(all_wells.map(w => ({x: w.whx, y: w.why})))
|
|
||||||
|
|
||||||
{
|
|
||||||
const builder = new SvgMapBuilder()
|
|
||||||
|
|
||||||
const settings = {
|
|
||||||
tons_in_cm2: 10000,
|
|
||||||
ppu: 100, // 100
|
|
||||||
styles: builder.update_styles(styles, 100),
|
|
||||||
// Масштаб 1мм карты / 1мм реальный (1000мм в 1м)
|
|
||||||
map_scale: 1 / 10000 * 1000
|
|
||||||
}
|
|
||||||
|
|
||||||
// Функция перевода координат из глобальных в локальные.
|
|
||||||
const cs1 = new CoordSystem(bbox.l, bbox.t, bbox.r, bbox.b)
|
|
||||||
const cs_mm = cs1.clone().flipy().moveto(0, 0).scale(settings.map_scale)
|
|
||||||
const cs_ppu = cs_mm.clone().scale(settings.ppu)
|
|
||||||
let tr = Transfrom.fromCoordSyses(cs1, cs_ppu);
|
|
||||||
|
|
||||||
let mapped_wells = all_wells.map((x) => ({ ...x, lx: tr.trx(x.whx), ly: tr.try(x.why) }));
|
|
||||||
|
|
||||||
let ti_layer = builder.build_tp_layer(mapped_wells, settings)
|
|
||||||
const csw = Math.abs(cs_mm.x1 - cs_mm.x0)
|
|
||||||
const csh = Math.abs(cs_mm.y1 - cs_mm.y0)
|
|
||||||
const bbox_ppu = BBox.fromLTRB(cs_ppu.x0, cs_ppu.y0, cs_ppu.x1, cs_ppu.y1)
|
|
||||||
|
|
||||||
let svg = SvgNodes.svg()
|
|
||||||
.set_attr("width", csw + "mm").set_attr("height", csh + "mm")
|
|
||||||
.set_attr("viewBox", `${bbox_ppu.l} ${bbox_ppu.t} ${bbox_ppu.w()} ${bbox_ppu.h()}`)
|
|
||||||
svg.append(ti_layer.defs)
|
|
||||||
svg.append(ti_layer.svg)
|
|
||||||
|
|
||||||
fs.writeFileSync(`${path}/out_devobj-${devobj}-PC.svg`, svg.render());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function build_map_pr(devobj) {
|
async function build_map_pr(devobj) {
|
||||||
console.log('build_map_pty', devobj)
|
console.log("build_map_pr", devobj);
|
||||||
|
|
||||||
let sql_max_year = `SELECT MAX(year*1000+month) as max_year FROM production_injections`
|
const md = await query(sql_pi.max_date(devobj)).then((x) => x[0].date);
|
||||||
const max_year_month = await axios.post(`${back_url}/proxy/sqlite`, { query: sql_max_year }).then((x) => x.data.data[0].max_year);
|
let wells = await query(sql_pi.totals(devobj, md))
|
||||||
// console.log(max_year_month)
|
wells = wells.filter((x) => x.wopt > 0);
|
||||||
// const DATE = '2023-01-01'
|
if (!wells.length) return
|
||||||
|
|
||||||
// console.log(max_year)
|
let bbox = build_bbox(wells.map(w => ({ x: w.whx, y: w.why })));
|
||||||
|
const saver = new SvgSaver(all_settings.pr, bbox);
|
||||||
|
|
||||||
const query_all = `SELECT
|
let mapped_wells = wells.map((x) => ({
|
||||||
wells.well, wells.whx, wells.why
|
...x,
|
||||||
,(year*1000+month) as aaa
|
|
||||||
,production_injections.horizon
|
|
||||||
,production_injections.segment
|
|
||||||
,production_injections.object
|
|
||||||
,SUM(production_injections.days) as days
|
|
||||||
,SUM(production_injections.woptm) as wopt
|
|
||||||
,SUM(production_injections.wwptm) as wwpt
|
|
||||||
FROM
|
|
||||||
wells, production_injections
|
|
||||||
WHERE
|
|
||||||
production_injections.woptm > 0
|
|
||||||
AND wells.well=production_injections.well
|
|
||||||
AND production_injections.object='${devobj}'
|
|
||||||
AND (year*1000+month)=${max_year_month}
|
|
||||||
GROUP BY
|
|
||||||
wells.well
|
|
||||||
`
|
|
||||||
|
|
||||||
let all_wells = await axios.post(`${back_url}/proxy/sqlite`, { query: query_all }).then((x) => x.data.data);
|
|
||||||
|
|
||||||
console.log(all_wells)
|
|
||||||
|
|
||||||
if (all_wells.length == 0){
|
|
||||||
console.log('NO wells found')
|
|
||||||
// fs.writeFileSync(`${path}/out_devobj-${devobj}-CP.svg`, "");
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let bbox = BBox.from_array(all_wells.map(w => ({x: w.whx, y: w.why})))
|
|
||||||
|
|
||||||
{
|
|
||||||
const builder = new SvgMapBuilder()
|
|
||||||
|
|
||||||
const settings = {
|
|
||||||
tons_in_cm2: 5,
|
|
||||||
ppu: 100, // 100
|
|
||||||
styles: builder.update_styles(styles, 100),
|
|
||||||
// Масштаб 1мм карты / 1мм реальный (1000мм в 1м)
|
|
||||||
map_scale: 1 / 10000 * 1000
|
|
||||||
}
|
|
||||||
|
|
||||||
// Функция перевода координат из глобальных в локальные.
|
|
||||||
const cs1 = new CoordSystem(bbox.l, bbox.t, bbox.r, bbox.b)
|
|
||||||
const cs_mm = cs1.clone().flipy().moveto(0, 0).scale(settings.map_scale)
|
|
||||||
const cs_ppu = cs_mm.clone().scale(settings.ppu)
|
|
||||||
let tr = Transfrom.fromCoordSyses(cs1, cs_ppu);
|
|
||||||
|
|
||||||
let mapped_wells = all_wells.map((x) => ({ ...x,
|
|
||||||
wopt: x.wopt / x.days,
|
wopt: x.wopt / x.days,
|
||||||
wwpt: x.wwpt / x.days,
|
wwpt: x.wwpt / x.days,
|
||||||
wlpt: (x.wopt + x.wwpt) / x.days,
|
wlpt: (x.wopt + x.wwpt) / x.days,
|
||||||
wlf: x.wwpt / (x.wopt + x.wwpt),
|
wlf: x.wwpt / (x.wopt + x.wwpt),
|
||||||
lx: tr.trx(x.whx), ly: tr.try(x.why)
|
lx: saver.tr.trx(x.whx),
|
||||||
|
ly: saver.tr.try(x.why),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
let ti_layer = builder.build_tp_layer(mapped_wells, settings)
|
// let mapped_wells = wells.map((x) => ({ ...x, lx: saver.tr.trx(x.whx), ly: saver.tr.try(x.why) }));
|
||||||
const csw = Math.abs(cs_mm.x1 - cs_mm.x0)
|
let tp_layer = SvgMapBuilder.build_tp_layer(mapped_wells, all_settings.pr);
|
||||||
const csh = Math.abs(cs_mm.y1 - cs_mm.y0)
|
|
||||||
const bbox_ppu = BBox.fromLTRB(cs_ppu.x0, cs_ppu.y0, cs_ppu.x1, cs_ppu.y1)
|
|
||||||
|
|
||||||
let svg = SvgNodes.svg()
|
saver.append_layer(tp_layer);
|
||||||
.set_attr("width", csw + "mm").set_attr("height", csh + "mm")
|
saver.save(`${path}/out_devobj-${devobj}-PR.svg`);
|
||||||
.set_attr("viewBox", `${bbox_ppu.l} ${bbox_ppu.t} ${bbox_ppu.w()} ${bbox_ppu.h()}`)
|
|
||||||
svg.append(ti_layer.defs)
|
|
||||||
svg.append(ti_layer.svg)
|
|
||||||
|
|
||||||
fs.writeFileSync(`${path}/out_devobj-${devobj}-PR.svg`, svg.render());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function build_map_ir(devobj) {
|
||||||
|
// const DATE = '2023-01-01'
|
||||||
|
|
||||||
|
const md = await query(sql_pi.max_date(devobj)).then((x) => x[0].date);
|
||||||
|
let wells = await query(sql_pi.totals(devobj, md))
|
||||||
|
wells = wells.filter((x) => x.wwit > 0);
|
||||||
|
if (!wells.length) return
|
||||||
|
|
||||||
|
let bbox = build_bbox(wells.map(w => ({ x: w.whx, y: w.why })));
|
||||||
|
const saver = new SvgSaver(all_settings.ir, bbox);
|
||||||
|
|
||||||
|
let mapped_wells = wells.map((x) => ({
|
||||||
|
...x,
|
||||||
|
wwit: x.wwit / x.days,
|
||||||
|
lx: saver.tr.trx(x.whx),
|
||||||
|
ly: saver.tr.try(x.why),
|
||||||
|
}));
|
||||||
|
|
||||||
|
let tp_layer = SvgMapBuilder.build_ti_layer(mapped_wells, all_settings.ir);
|
||||||
|
|
||||||
|
saver.append_layer(tp_layer);
|
||||||
|
saver.save(`${path}/out_devobj-${devobj}-IR.svg`);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
async function start2() {
|
async function start2() {
|
||||||
const DATE = '2023-01-01'
|
const objects = await query(sql_pi.devobjs()).then((r) => r.map((x) => x.devobj));
|
||||||
|
|
||||||
const sql_objects = `SELECT distinct(object) as devobj FROM production_injections` // where devobj=1` //x.wopt
|
objects.map(build_map_pt);
|
||||||
|
|
||||||
let objects = await axios.post(`${back_url}/proxy/sqlite`, { query: sql_objects }).then((x) => x.data.data.map(y => y.devobj));
|
|
||||||
|
|
||||||
objects.map(build_map_pt)
|
|
||||||
objects.map(build_map_it)
|
objects.map(build_map_it)
|
||||||
objects.map(build_map_pr)
|
objects.map(build_map_pr)
|
||||||
|
objects.map(build_map_ir)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
start2();
|
start2();
|
||||||
|
|||||||
@ -1,13 +1,39 @@
|
|||||||
{
|
{
|
||||||
"wellhead": {
|
"black-line": {
|
||||||
|
"stroke-width": "1pt",
|
||||||
|
"stroke": "#000",
|
||||||
|
"fill": "none"
|
||||||
|
},
|
||||||
|
|
||||||
|
"white-body": {
|
||||||
|
"fill": "#fff"
|
||||||
|
},
|
||||||
|
|
||||||
|
"wellhead-name": {
|
||||||
"font-family": "Times New Roman",
|
"font-family": "Times New Roman",
|
||||||
"font-weight": "bold",
|
"font-weight": "bold",
|
||||||
"font-size": "10pt",
|
"font-size": "12pt",
|
||||||
"stroke-width": "0.1pt",
|
|
||||||
"stroke": "#fff",
|
|
||||||
"fill": "#000",
|
"fill": "#000",
|
||||||
"dx":1.7,
|
"dx":1.7,
|
||||||
"dy":"0"
|
"dy":"-1"
|
||||||
|
},
|
||||||
|
|
||||||
|
"wellhead-black": {
|
||||||
|
"stroke-width": "0.1mm",
|
||||||
|
"stroke": "#fff",
|
||||||
|
"fill": "#000"
|
||||||
|
},
|
||||||
|
|
||||||
|
"wellhead-gray": {
|
||||||
|
"stroke-width": "0.1mm",
|
||||||
|
"stroke": "#000",
|
||||||
|
"fill": "#ddd"
|
||||||
|
},
|
||||||
|
|
||||||
|
"wellhead-tri": {
|
||||||
|
"stroke-width": "0.1pt",
|
||||||
|
"stroke": "#fff",
|
||||||
|
"fill": "#000"
|
||||||
},
|
},
|
||||||
|
|
||||||
"wlf": {
|
"wlf": {
|
||||||
|
|||||||
116
src/services/sql/prod_inj.js
Normal file
116
src/services/sql/prod_inj.js
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
export default {
|
||||||
|
max_date(){
|
||||||
|
return `SELECT MAX(date(year||'-01-01', (month - 1)||' month')) as date FROM production_injections`
|
||||||
|
},
|
||||||
|
|
||||||
|
devobjs(){
|
||||||
|
return `SELECT distinct(object) as devobj FROM production_injections`
|
||||||
|
},
|
||||||
|
|
||||||
|
totals(devobj){
|
||||||
|
return `SELECT
|
||||||
|
wells.well, wells.whx, wells.why
|
||||||
|
,SUM(production_injections.woptm) as wopt
|
||||||
|
,SUM(production_injections.wwptm) as wwpt
|
||||||
|
,SUM(production_injections.wsgptv) as wgpt
|
||||||
|
,SUM(production_injections.wwitv) as wwit
|
||||||
|
,SUM(production_injections.days) as days
|
||||||
|
,SUM(production_injections.wwptm)+SUM(production_injections.woptm) as wlpt
|
||||||
|
,SUM(production_injections.wwptm)/(SUM(production_injections.wwptm)+SUM(production_injections.woptm)) as wlf
|
||||||
|
FROM
|
||||||
|
wells, production_injections
|
||||||
|
WHERE
|
||||||
|
wells.well=production_injections.well
|
||||||
|
AND production_injections.object='${devobj}'
|
||||||
|
GROUP BY
|
||||||
|
wells.well
|
||||||
|
ORDER BY
|
||||||
|
wlpt DESC, wwit DESC`
|
||||||
|
},
|
||||||
|
|
||||||
|
rates(devobj, date){
|
||||||
|
date = new Date(date)
|
||||||
|
const year_month = date.getFullYear()*100 + date.getMonth()
|
||||||
|
return `SELECT
|
||||||
|
wells.well, wells.whx, wells.why
|
||||||
|
,SUM(production_injections.woptm)/SUM(production_injections.days) as wopr
|
||||||
|
,SUM(production_injections.wwptm)/SUM(production_injections.days) as wwpr
|
||||||
|
,SUM(production_injections.wsgptv)/SUM(production_injections.days) as wgpr
|
||||||
|
,SUM(production_injections.wwitv)/SUM(production_injections.days) as wwir
|
||||||
|
,SUM(production_injections.days) as days
|
||||||
|
,(SUM(production_injections.wwptm)+SUM(production_injections.woptm)) / SUM(production_injections.days) as wlpr
|
||||||
|
,SUM(production_injections.wwptm)/(SUM(production_injections.wwptm)+SUM(production_injections.woptm)) as wlf
|
||||||
|
FROM
|
||||||
|
wells, production_injections
|
||||||
|
WHERE
|
||||||
|
wells.well=production_injections.well
|
||||||
|
AND production_injections.object='${devobj}'
|
||||||
|
AND (year*100+month)=${year_month}
|
||||||
|
GROUP BY
|
||||||
|
wells.well`
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
production_injection(field, devobj, date){
|
||||||
|
const f_date = date ? `AND year*1000+month=${date.getFullYear()*1000+date.getMonth()}` : ''
|
||||||
|
console.log(f_date)
|
||||||
|
|
||||||
|
return `SELECT
|
||||||
|
wells.well, wells.whx, wells.why
|
||||||
|
,SUM(production_injections.woptm) as wopt
|
||||||
|
,SUM(production_injections.wwptm) as wwpt
|
||||||
|
,SUM(production_injections.wsgptv) as wgpt
|
||||||
|
,SUM(production_injections.wwitv) as wwit
|
||||||
|
,SUM(production_injections.days) as days
|
||||||
|
,SUM(production_injections.wwptm)+SUM(production_injections.woptm) as wlpt
|
||||||
|
,SUM(production_injections.wwptm)/(SUM(production_injections.wwptm)+SUM(production_injections.woptm)) as wlf
|
||||||
|
FROM
|
||||||
|
wells, production_injections
|
||||||
|
WHERE
|
||||||
|
AND wells.well=production_injections.well
|
||||||
|
AND production_injections.object='${devobj}'
|
||||||
|
AND (year*1000+month)=${max_year_month}
|
||||||
|
GROUP BY
|
||||||
|
wells.well`
|
||||||
|
},
|
||||||
|
|
||||||
|
production_total(field, devobj){
|
||||||
|
return `SELECT
|
||||||
|
wells.well, wells.whx, wells.why
|
||||||
|
,SUM(production_injections.woptm) as wopt
|
||||||
|
,SUM(production_injections.wwptm) as wwpt
|
||||||
|
,SUM(production_injections.wsgptv) as wgpt
|
||||||
|
,SUM(production_injections.wwitv) as wwit
|
||||||
|
,SUM(production_injections.wwptm)+SUM(production_injections.woptm) as wlpt
|
||||||
|
,SUM(production_injections.wwptm)/(SUM(production_injections.wwptm)+SUM(production_injections.woptm)) as wlf
|
||||||
|
FROM
|
||||||
|
wells, production_injections
|
||||||
|
WHERE
|
||||||
|
wells.well=production_injections.well
|
||||||
|
AND object='${devobj}'
|
||||||
|
GROUP BY
|
||||||
|
wells.well`
|
||||||
|
},
|
||||||
|
|
||||||
|
injection_total(){
|
||||||
|
const query_all = `SELECT
|
||||||
|
wells.well, wells.whx, wells.why
|
||||||
|
,SUM(production_injections.woptm) as wopt
|
||||||
|
,SUM(production_injections.wwptm) as wwpt
|
||||||
|
,SUM(production_injections.wsgptv) as wgpt
|
||||||
|
,SUM(production_injections.wwitv) as wwit
|
||||||
|
,SUM(production_injections.wwptm)+SUM(production_injections.woptm) as wlpt
|
||||||
|
,SUM(production_injections.wwptm)/(SUM(production_injections.wwptm)+SUM(production_injections.woptm)) as wlf
|
||||||
|
FROM
|
||||||
|
wells, production_injections
|
||||||
|
WHERE
|
||||||
|
wells.well=production_injections.well
|
||||||
|
AND object='${devobj}'
|
||||||
|
GROUP BY
|
||||||
|
wells.well
|
||||||
|
HAVING
|
||||||
|
wwit>0
|
||||||
|
|
||||||
|
`
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -100,11 +100,11 @@ export default class {
|
|||||||
// Круги
|
// Круги
|
||||||
svg.append(wells.map((x) => SvgNodes.ring_sectors(1.5 * sc.k, t2r(x.wlpt) * sc.k, [{v: x.wopt, style: styles.opt}, {v: x.wwpt, style: styles.wpt}]).move(x.lx, x.ly)));
|
svg.append(wells.map((x) => SvgNodes.ring_sectors(1.5 * sc.k, t2r(x.wlpt) * sc.k, [{v: x.wopt, style: styles.opt}, {v: x.wwpt, style: styles.wpt}]).move(x.lx, x.ly)));
|
||||||
// Знак скважины
|
// Знак скважины
|
||||||
svg.append(wells.map((x) => SvgNodes.circle(1.5 * sc.k).move(x.lx, x.ly).set_style(styles.wellhead)));
|
svg.append(wells.map((x) => SvgNodes.circle(1.5 * sc.k).move(x.lx, x.ly).add_style(styles.wellhead)));
|
||||||
// Имя скважины
|
// Имя скважины
|
||||||
svg.append(wells.map((x) => SvgNodes.text(x.well).move(x.lx + styles.wellhead.dx * sc.k, x.ly + styles.wellhead.dy * sc.k).set_style(styles.wellhead)));
|
svg.append(wells.map((x) => SvgNodes.text(x.well).move(x.lx + styles.wellhead.dx * sc.k, x.ly + styles.wellhead.dy * sc.k).add_style(styles.wellhead)));
|
||||||
// Обводненность
|
// Обводненность
|
||||||
svg.append(wells.map((x) => SvgNodes.text(`${Math.round(x.wlf * 1000)/10 || ''}%`).move(x.lx + styles.wlf.dx * sc.k, x.ly + styles.wlf.dy * sc.k).set_style(styles.wlf)));
|
svg.append(wells.map((x) => SvgNodes.text(`${Math.round(x.wlf * 1000)/10 || ''}%`).move(x.lx + styles.wlf.dx * sc.k, x.ly + styles.wlf.dy * sc.k).add_style(styles.wlf)));
|
||||||
|
|
||||||
return {defs, svg}
|
return {defs, svg}
|
||||||
}
|
}
|
||||||
@ -126,13 +126,13 @@ export default class {
|
|||||||
// Круги
|
// Круги
|
||||||
// let g_rings = SvgNodes.group(['<metadata id="CorelCorpID_WWITRingsCorel-Layer"/>']).set_attr("id", "Круги")
|
// let g_rings = SvgNodes.group(['<metadata id="CorelCorpID_WWITRingsCorel-Layer"/>']).set_attr("id", "Круги")
|
||||||
// svg.append(g_rings)
|
// svg.append(g_rings)
|
||||||
svg.append(wells.map((x) => SvgNodes.circle(t2r(x.wwit) * sc.k).set_style(styles.wit).move(x.lx, x.ly)));
|
svg.append(wells.map((x) => SvgNodes.circle(t2r(x.wwit) * sc.k).add_style(styles.wit).move(x.lx, x.ly)));
|
||||||
// Знак скважины
|
// Знак скважины
|
||||||
svg.append(wells.map((x) => SvgNodes.circle(1.5 * sc.k).move(x.lx, x.ly).set_style(styles.wellhead)));
|
svg.append(wells.map((x) => SvgNodes.circle(1.5 * sc.k).move(x.lx, x.ly).add_style(styles.wellhead)));
|
||||||
// Имя скважины
|
// Имя скважины
|
||||||
svg.append(wells.map((x) => SvgNodes.text(x.well).move(x.lx + styles.wellhead.dx * sc.k, x.ly + styles.wellhead.dy * sc.k).set_style(styles.wellhead)));
|
svg.append(wells.map((x) => SvgNodes.text(x.well).move(x.lx + styles.wellhead.dx * sc.k, x.ly + styles.wellhead.dy * sc.k).add_style(styles.wellhead)));
|
||||||
// Обводненность
|
// Обводненность
|
||||||
svg.append(wells.map((x) => SvgNodes.text(`${Math.round(x.wlf * 1000)/10 || ''}%`).move(x.lx + styles.wlf.dx * sc.k, x.ly + styles.wlf.dy * sc.k).set_style(styles.wlf)));
|
svg.append(wells.map((x) => SvgNodes.text(`${Math.round(x.wlf * 1000)/10 || ''}%`).move(x.lx + styles.wlf.dx * sc.k, x.ly + styles.wlf.dy * sc.k).add_style(styles.wlf)));
|
||||||
|
|
||||||
return {defs, svg}
|
return {defs, svg}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,8 @@
|
|||||||
import SvgNode from "./SvgNode.js";
|
import SvgNode from "./SvgNode.js";
|
||||||
import SvgNodes from "./SvgNodes.js";
|
import SvgNodes from "./SvgNodes.js";
|
||||||
|
import SvgWellNodes from "./SvgWellNodes.js";
|
||||||
|
|
||||||
export default class {
|
export default {
|
||||||
/**
|
/**
|
||||||
* Преобразовать размер шрифта в единицы карты
|
* Преобразовать размер шрифта в единицы карты
|
||||||
* @param { string | Number } v Значение для перевода "10mm", "22pt"
|
* @param { string | Number } v Значение для перевода "10mm", "22pt"
|
||||||
@ -17,7 +18,7 @@ export default class {
|
|||||||
if (v.endsWith("pt")) {
|
if (v.endsWith("pt")) {
|
||||||
return (parseFloat(v.slice(0, v.length - 2)) * ppu * 100) / 283.46;
|
return (parseFloat(v.slice(0, v.length - 2)) * ppu * 100) / 283.46;
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Перегоняет стиль в единицы карты (возвращает новый объект)
|
* Перегоняет стиль в единицы карты (возвращает новый объект)
|
||||||
@ -31,7 +32,7 @@ export default class {
|
|||||||
if (convertable.includes(k)) s[k] = this.fontsize2ppu(s[k], ppu);
|
if (convertable.includes(k)) s[k] = this.fontsize2ppu(s[k], ppu);
|
||||||
});
|
});
|
||||||
return s;
|
return s;
|
||||||
}
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Перегоняет все стили в единицы карты (возвращает новый объект)
|
* Перегоняет все стили в единицы карты (возвращает новый объект)
|
||||||
@ -40,7 +41,7 @@ export default class {
|
|||||||
*/
|
*/
|
||||||
update_styles(styles, ppu) {
|
update_styles(styles, ppu) {
|
||||||
return Object.keys(styles).reduce((s, c) => ({ ...s, [c]: this.update_style(styles[c], ppu) }), {});
|
return Object.keys(styles).reduce((s, c) => ({ ...s, [c]: this.update_style(styles[c], ppu) }), {});
|
||||||
}
|
},
|
||||||
|
|
||||||
build_tp_layer(wells, settings) {
|
build_tp_layer(wells, settings) {
|
||||||
function t2r(tons) {
|
function t2r(tons) {
|
||||||
@ -56,41 +57,20 @@ export default class {
|
|||||||
|
|
||||||
let svg = SvgNodes.group(['<metadata id="CorelCorpID_WWPTCorel-Layer"/>']).set_attr("id", "WWPT");
|
let svg = SvgNodes.group(['<metadata id="CorelCorpID_WWPTCorel-Layer"/>']).set_attr("id", "WWPT");
|
||||||
// Круги
|
// Круги
|
||||||
svg.append(
|
svg.append(wells.map((x) => SvgWellNodes.ring.pt(x.wopt, x.wwpt, t2r(x.wlpt), ppu, styles).move(x.lx, x.ly)));
|
||||||
wells.map((x) =>
|
|
||||||
SvgNodes.ring_sectors(1.5 * ppu, t2r(x.wlpt) * ppu, [
|
|
||||||
{ v: x.wopt, style: styles.opt },
|
|
||||||
{ v: x.wwpt, style: styles.wpt },
|
|
||||||
]).move(x.lx, x.ly)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
// Знак скважины
|
// Знак скважины
|
||||||
svg.append(
|
svg.append(
|
||||||
wells.map((x) =>
|
wells.map((x) => SvgWellNodes.wellhead[t2r(x.wlpt) > 1.6 ? "prod" : "gray"](ppu, styles).move(x.lx, x.ly))
|
||||||
SvgNodes.circle(1.5 * ppu)
|
|
||||||
.move(x.lx, x.ly)
|
|
||||||
.set_style(styles.wellhead)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
// Имя скважины
|
|
||||||
svg.append(
|
|
||||||
wells.map((x) =>
|
|
||||||
SvgNodes.text(x.well)
|
|
||||||
.move(x.lx + styles.wellhead.dx * ppu, x.ly + styles.wellhead.dy * ppu)
|
|
||||||
.set_style(styles.wellhead)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
// Обводненность
|
|
||||||
svg.append(
|
|
||||||
wells.map((x) =>
|
|
||||||
SvgNodes.text(`${Math.round(x.wlf * 1000) / 10 || ""}%`)
|
|
||||||
.move(x.lx + styles.wlf.dx * ppu, x.ly + styles.wlf.dy * ppu)
|
|
||||||
.set_style(styles.wlf)
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Имя скважины
|
||||||
|
svg.append(wells.map((x) => SvgWellNodes.wellhead.name(x.well, ppu, styles).move(x.lx, x.ly)));
|
||||||
|
// Обводненность
|
||||||
|
svg.append(wells.map((x) => SvgWellNodes.wellhead.wlp(x.wlf, ppu, styles).move(x.lx, x.ly)));
|
||||||
|
|
||||||
return { defs, svg };
|
return { defs, svg };
|
||||||
}
|
},
|
||||||
|
|
||||||
build_ti_layer(wells, settings) {
|
build_ti_layer(wells, settings) {
|
||||||
function t2r(tons) {
|
function t2r(tons) {
|
||||||
@ -104,41 +84,18 @@ export default class {
|
|||||||
defs.append(SvgNodes.defs.simple.radialGradient("rg1", "#fff", "#c1ff5e"));
|
defs.append(SvgNodes.defs.simple.radialGradient("rg1", "#fff", "#c1ff5e"));
|
||||||
|
|
||||||
let svg = SvgNodes.group(['<metadata id="CorelCorpID_WWITCorel-Layer"/>']).set_attr("id", "WWIT");
|
let svg = SvgNodes.group(['<metadata id="CorelCorpID_WWITCorel-Layer"/>']).set_attr("id", "WWIT");
|
||||||
|
|
||||||
// Круги
|
// Круги
|
||||||
// let g_rings = SvgNodes.group(['<metadata id="CorelCorpID_WWITRingsCorel-Layer"/>']).set_attr("id", "Круги")
|
svg.append(wells.map((x) => SvgWellNodes.ring.it(t2r(x.wwit), ppu, styles).move(x.lx, x.ly)));
|
||||||
// svg.append(g_rings)
|
|
||||||
svg.append(
|
|
||||||
wells.map((x) =>
|
|
||||||
SvgNodes.circle(t2r(x.wwit) * ppu)
|
|
||||||
.set_style(styles.wit)
|
|
||||||
.move(x.lx, x.ly)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
// Знак скважины
|
// Знак скважины
|
||||||
svg.append(
|
svg.append(
|
||||||
wells.map((x) =>
|
wells.map((x) => SvgWellNodes.wellhead[t2r(x.wwit) > 1.6 ? "inj" : "gray"](ppu, styles).move(x.lx, x.ly))
|
||||||
SvgNodes.circle(1.5 * ppu)
|
|
||||||
.move(x.lx, x.ly)
|
|
||||||
.set_style(styles.wellhead)
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
// Имя скважины
|
// Имя скважины
|
||||||
svg.append(
|
svg.append(wells.map((x) => SvgWellNodes.wellhead.name(x.well, ppu, styles).move(x.lx, x.ly)));
|
||||||
wells.map((x) =>
|
|
||||||
SvgNodes.text(x.well)
|
|
||||||
.move(x.lx + styles.wellhead.dx * ppu, x.ly + styles.wellhead.dy * ppu)
|
|
||||||
.set_style(styles.wellhead)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
// Обводненность
|
|
||||||
// svg.append(
|
|
||||||
// wells.map((x) =>
|
|
||||||
// SvgNodes.text(`${Math.round(x.wlf * 1000) / 10 || ""}%`)
|
|
||||||
// .move(x.lx + styles.wlf.dx * ppu, x.ly + styles.wlf.dy * ppu)
|
|
||||||
// .set_style(styles.wlf)
|
|
||||||
// )
|
|
||||||
// );
|
|
||||||
|
|
||||||
return { defs, svg };
|
return { defs, svg };
|
||||||
}
|
},
|
||||||
}
|
};
|
||||||
|
|||||||
@ -20,17 +20,20 @@ export default class SvgNode {
|
|||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
set_style(style) {
|
add_style(style) {
|
||||||
this.style = { ...this.style || {}, ...style }
|
this.style = { ...this.style || {}, ...style }
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
clear_style(style) {
|
clear_style() {
|
||||||
this.style = null
|
this.style = null
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
move(x, y) {
|
move(x, y) {
|
||||||
|
if (this.transform)
|
||||||
|
this.transform = { x: this.transform.x + x, y: this.transform.y + y }
|
||||||
|
else
|
||||||
this.transform = { x, y }
|
this.transform = { x, y }
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|||||||
@ -38,6 +38,22 @@ export default {
|
|||||||
return new SvgNode("circle", {r})
|
return new SvgNode("circle", {r})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
ngon(r, n, ang = 0) {
|
||||||
|
const da = 2 * Math.PI / n
|
||||||
|
ang = ang * Math.PI / 180
|
||||||
|
const pts = Array(n).fill(0).map((x, i) => [Math.sin(i * da + ang) * r, Math.cos(i * da + ang) * r])
|
||||||
|
return new SvgNode("polygon", {points: pts.map(x => `${x[0]},${x[1]}`)})
|
||||||
|
},
|
||||||
|
|
||||||
|
spike1(w, h, ang){
|
||||||
|
const da = ang * Math.PI / 180
|
||||||
|
const sa = Math.sin(da)
|
||||||
|
const ca = Math.cos(da)
|
||||||
|
h = h / 2
|
||||||
|
const pts = `${-sa*h},${-ca*h} ${ca*w},${-sa*w}, ${sa*h},${ca*h}`
|
||||||
|
return new SvgNode("polygon", {points: pts})
|
||||||
|
},
|
||||||
|
|
||||||
sector(r, a0, a1) {
|
sector(r, a0, a1) {
|
||||||
const k = Math.PI / 180;
|
const k = Math.PI / 180;
|
||||||
let s0 = -Math.sin(a0 * k) * r;
|
let s0 = -Math.sin(a0 * k) * r;
|
||||||
@ -80,7 +96,7 @@ export default {
|
|||||||
ring_sectors(r0, r1, sectors){
|
ring_sectors(r0, r1, sectors){
|
||||||
let sum = sectors.reduce((s,c) => s + c.v, 0)
|
let sum = sectors.reduce((s,c) => s + c.v, 0)
|
||||||
let angs = sectors.reduce((s, c, i) => [...s, {...c, a0: i && s[i - 1].a1, a1: c.v + (i && s[i - 1].a1)}], [])
|
let angs = sectors.reduce((s, c, i) => [...s, {...c, a0: i && s[i - 1].a1, a1: c.v + (i && s[i - 1].a1)}], [])
|
||||||
let items = angs.map(x => this.ring_sector(r0, r1, x.a0 * 360 / sum, x.a1 * 360 / sum).set_style(x.style))
|
let items = angs.map(x => this.ring_sector(r0, r1, x.a0 * 360 / sum, x.a1 * 360 / sum).add_style(x.style))
|
||||||
|
|
||||||
return this.group(items)
|
return this.group(items)
|
||||||
},
|
},
|
||||||
|
|||||||
75
src/svgmap/SvgWellNodes.js
Normal file
75
src/svgmap/SvgWellNodes.js
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
import SvgNode from "./SvgNode.js";
|
||||||
|
import SvgNodes from "./SvgNodes.js";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
wellhead: {
|
||||||
|
name(text, ppu, styles) {
|
||||||
|
return SvgNodes.text(text)
|
||||||
|
.move(styles["wellhead-name"].dx * ppu, styles["wellhead-name"].dy * ppu)
|
||||||
|
.add_style(styles["wellhead-name"]);
|
||||||
|
},
|
||||||
|
|
||||||
|
wlp(wlf, ppu, styles) {
|
||||||
|
return SvgNodes.text(`${Math.round(wlf * 1000) / 10 || ""}%`)
|
||||||
|
.move(styles.wlf.dx * ppu, styles.wlf.dy * ppu)
|
||||||
|
.add_style(styles.wlf);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Добывающая скважина
|
||||||
|
* @param {*} ppu
|
||||||
|
* @param {*} styles
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
prod(ppu, styles) {
|
||||||
|
return SvgNodes.circle(1.5 * ppu).add_style(styles["wellhead-black"]);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Нагнетательная
|
||||||
|
* @param {*} ppu
|
||||||
|
* @param {*} styles
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
inj(ppu, styles) {
|
||||||
|
return SvgNodes.group([
|
||||||
|
SvgNodes.spike1(1.8 * ppu, 1.7 * ppu, 0).move(2 * ppu, 0),
|
||||||
|
SvgNodes.spike1(1.8 * ppu, 1.7 * ppu, 90).move(0, -2 * ppu),
|
||||||
|
SvgNodes.spike1(1.8 * ppu, 1.7 * ppu, 180).move(-2 * ppu, 0),
|
||||||
|
SvgNodes.spike1(1.8 * ppu, 1.7 * ppu, 270).move(0, 2 * ppu),
|
||||||
|
new SvgNode("line", { x1: -2 * ppu, x2: 2 * ppu, y1: 0, y2: 0 }).add_style(styles["black-line"]),
|
||||||
|
new SvgNode("line", { y1: -2 * ppu, y2: 2 * ppu, x1: 0, x2: 0 }).add_style(styles["black-line"]),
|
||||||
|
SvgNodes.circle(1.5 * ppu)
|
||||||
|
.add_style(styles["black-line"])
|
||||||
|
.add_style(styles["white-body"]),
|
||||||
|
]);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Серая с треугольником с малым дебитом/нагнетанием
|
||||||
|
* @param {*} ppu
|
||||||
|
* @param {*} styles
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
gray(ppu, styles) {
|
||||||
|
return SvgNodes.group([
|
||||||
|
SvgNodes.circle(1.5 * ppu).add_style(styles["wellhead-gray"]),
|
||||||
|
SvgNodes.ngon(1.5 * ppu, 3, 0).add_style(styles["wellhead-black"]),
|
||||||
|
]);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
ring: {
|
||||||
|
pt(wopt, wwpt, rmm, ppu, styles) {
|
||||||
|
return SvgNodes.ring_sectors(1.5 * ppu, rmm * ppu, [
|
||||||
|
{ v: wopt, style: styles.opt },
|
||||||
|
{ v: wwpt, style: styles.wpt },
|
||||||
|
]);
|
||||||
|
},
|
||||||
|
|
||||||
|
it(rmm, ppu, styles) {
|
||||||
|
return SvgNodes.circle(rmm * ppu)
|
||||||
|
.add_style(styles.wit)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
@ -1,21 +1,31 @@
|
|||||||
export default {
|
export default {
|
||||||
|
wellhead: {
|
||||||
|
prod(x, y, r, style){
|
||||||
|
return SvgNodes.circle(r).add_style(style).move(w.x, w.y);
|
||||||
|
},
|
||||||
|
|
||||||
|
inj(x, y, r, style){
|
||||||
|
return SvgNodes.circle(r).add_style(style).move(w.x, w.y);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
// [{x,y}]
|
// [{x,y}]
|
||||||
heads(wells, r, style) {
|
heads(wells, r, style) {
|
||||||
return wells.map((w) => SvgNodes.circle(r).set_style(style).move(w.x, w.y));
|
return wells.map((w) => SvgNodes.circle(r).add_style(style).move(w.x, w.y));
|
||||||
},
|
},
|
||||||
|
|
||||||
// [{x,y,name}]
|
// [{x,y,name}]
|
||||||
names(wells, style, shift) {
|
names(wells, style, shift) {
|
||||||
return wells.map((w) =>
|
return wells.map((w) =>
|
||||||
SvgNodes.text(w.name)
|
SvgNodes.text(w.name)
|
||||||
.set_style(style)
|
.add_style(style)
|
||||||
.move(w.x + shift.x, w.y + shift.y)
|
.move(w.x + shift.x, w.y + shift.y)
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
// {x,y,ring[1,2,3,4,5]}
|
// {x,y,ring[1,2,3,4,5]}
|
||||||
ring(x, y, r0, r1, a0, a1, style) {
|
ring(x, y, r0, r1, a0, a1, style) {
|
||||||
return SvgNodes.ring_sector(r0, r1, a0, a1).move(x, y).set_style(style);
|
return SvgNodes.ring_sector(r0, r1, a0, a1).move(x, y).add_style(style);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user