@opengis/gis 0.2.167 → 0.2.169
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{CardIcon-golqfa-Y.js → CardIcon-xkRDr3_E.js} +1 -1
- package/dist/{EntityTablePage-BhmxePgR.js → EntityTablePage-D1IR5Bmq.js} +1 -1
- package/dist/{ExtentOutlineLayer.vue_vue_type_script_setup_true_lang-BFa27smR.js → ExtentOutlineLayer.vue_vue_type_script_setup_true_lang-BJKIgAkD.js} +1 -1
- package/dist/{HeaderActions.vue_vue_type_script_setup_true_lang-Dp0MjgnU.js → HeaderActions.vue_vue_type_script_setup_true_lang-BU8__ouG.js} +1 -1
- package/dist/{MapSettings-F_DT3xKl.js → MapSettings-DIOlNpt6.js} +1 -1
- package/dist/{RastersTablePage-3rXQ0baG.js → RastersTablePage-OD1VqHP8.js} +1 -1
- package/dist/{cartocss-CN-UrS7V.js → cartocss-BiamDcNB.js} +5 -5
- package/dist/{import-utils-F5ErbNz1.js → import-utils-CvUG1jV0.js} +1 -1
- package/dist/{index-CdB0VXro.js → index-C6W8IkTm.js} +1224 -1221
- package/dist/index.css +1 -1
- package/dist/index.js +1 -1
- package/dist/index.umd.cjs +53 -40
- package/dist/{raster-DWmiWlf7.js → raster-BbIiZGoX.js} +3 -3
- package/dist/{register-D1jLD0hK.js → register-Dt2QoLZ3.js} +3 -3
- package/dist/service-CdUYntMi.js +3472 -0
- package/dist/{vs-datatable-BWItxbtK.js → vs-datatable-BELnJrfM.js} +2 -3
- package/module/gis/card/gis.metadata.table/index.yml +22 -22
- package/module/gis/card/gis.rasters.table/index.yml +11 -11
- package/module/gis/card/gis.registers.table/index.yml +23 -23
- package/module/gis/card/gis.services.table/index.yml +25 -25
- package/module/gis/cls/bool.yes_no.json +12 -12
- package/module/gis/cls/encoding.json +14 -14
- package/module/gis/cls/geom_type.json +14 -14
- package/module/gis/cls/gis.column_type.json +34 -34
- package/module/gis/cls/gis.column_view_type.json +26 -26
- package/module/gis/cls/gis.filter_type.json +22 -22
- package/module/gis/cls/language.json +10 -10
- package/module/gis/cls/meta.service_type.json +42 -42
- package/module/gis/cls/ogc.service.json +21 -21
- package/module/gis/cls/source_type.json +10 -10
- package/module/gis/cls/standarts.json +6 -6
- package/module/gis/cls/topic_category.json +106 -106
- package/module/gis/cls/update_frequency.json +29 -29
- package/module/gis/cls/view.json +21 -21
- package/module/gis/form/feedback.answer.form.json +10 -10
- package/module/gis/form/gis.cartocss.form.json +64 -64
- package/module/gis/form/gis.group_list.form.json +17 -17
- package/module/gis/form/gis.maps.form.json +61 -61
- package/module/gis/form/gis.metadata.form.json +240 -240
- package/module/gis/form/gis.metadata_new.form.json +195 -195
- package/module/gis/form/gis.ogc_service.form.json +51 -51
- package/module/gis/form/gis.rasters.form.json +76 -76
- package/module/gis/form/gis.registers.form.json +124 -124
- package/module/gis/form/gis.registers_column.form.json +84 -84
- package/module/gis/form/gis.registers_filter.form.json +65 -65
- package/module/gis/form/gis.services.form.json +111 -111
- package/module/gis/form/gis.services_attributes.form.json +75 -75
- package/module/gis/form/gis.services_filter.form.json +65 -65
- package/module/gis/menu.json +43 -43
- package/module/gis/select/admin.cls.name.sql +9 -9
- package/module/gis/select/layer_list.sql +7 -7
- package/module/gis/select/layer_list_text.sql +7 -7
- package/module/gis/select/pg.column_name.geometry.sql +12 -12
- package/module/gis/select/pg.columns.parent.sql +6 -6
- package/module/gis/select/pg.table_name.sql +17 -17
- package/module/gis/select/service_id.sql +1 -1
- package/module/gis/select/srid.sql +7 -7
- package/module/gis/table/gis.cartocss.table.json +74 -74
- package/module/gis/table/gis.group_list.table.json +58 -58
- package/module/gis/table/gis.maps.table.json +110 -110
- package/module/gis/table/gis.metadata.table.json +70 -70
- package/module/gis/table/gis.metadata_new.table.json +137 -137
- package/module/gis/table/gis.ogc_service.table.json +100 -100
- package/module/gis/table/gis.rasters.table.json +113 -113
- package/module/gis/table/gis.registers.table.json +143 -143
- package/module/gis/table/gis.services.table.json +120 -120
- package/module/gis/table/site.gis.registers.table.json +88 -88
- package/module/gis/table/site.gis.services.table.json +106 -106
- package/module/gis/templates/ISO19136_2017_gml_template.xml +330 -330
- package/module/gis/tokens.yml +5 -5
- package/module/permissions/form/permissions.users.form.json +151 -151
- package/module/permissions/table/gis.permissions.table.json +97 -97
- package/module/test/map/addr.json +303 -0
- package/module/test/map/{addr.yml → addr1.yml} +3 -1
- package/module/test/select/address.str_id.sql +3 -0
- package/package.json +10 -10
- package/plugin.js +21 -12
- package/server/plugins/mapnik/funcs/checkRasterFile.js +1 -3
- package/server/routes/cartocss/cartocss.route.js +31 -0
- package/server/routes/cartocss/cartocss.route.test.js +79 -0
- package/server/routes/cartocss/cartocss.schema.js +73 -0
- package/server/routes/{gis/cartocss → cartocss/functions}/add.cartocss.js +8 -11
- package/server/routes/{gis/cartocss → cartocss/functions}/get.cartocss.js +11 -13
- package/server/routes/gis/functions/checkXML.js +107 -0
- package/server/routes/gis/functions/dashboard.js +24 -0
- package/server/routes/gis/gis.route.js +26 -0
- package/server/routes/gis/gis.route.test.js +34 -0
- package/server/routes/gis/gis.schema.js +1 -0
- package/server/routes/map/{controllers → functions}/clearTiles.js +9 -8
- package/server/routes/map/{controllers → functions}/geojson.js +43 -43
- package/server/routes/map/{controllers → functions}/gis.convert.js +15 -23
- package/server/routes/map/{controllers → functions}/gis.icon.js +23 -10
- package/server/routes/map/{controllers → functions}/jsonData.js +72 -71
- package/server/routes/map/{controllers → functions}/layerList.js +17 -17
- package/server/routes/map/{controllers → functions}/map.js +8 -9
- package/server/routes/map/{controllers → functions}/mapCatalog.js +7 -7
- package/server/routes/map/functions/mapCatalogAttribute.js +54 -0
- package/server/routes/map/{controllers → functions}/mapFeatures.js +22 -18
- package/server/routes/map/{controllers → functions}/mapFormat.js +25 -28
- package/server/routes/map/{controllers → functions}/mapTiles.js +39 -30
- package/server/routes/map/{controllers → functions}/maps.js +3 -3
- package/server/routes/map/{controllers → functions}/marker_icon.js +1 -1
- package/server/routes/map/{controllers → functions}/parseGeoFile.js +10 -11
- package/server/routes/map/{controllers → functions}/pointHeight.js +3 -7
- package/server/routes/map/{controllers → functions}/vtile.js +5 -3
- package/server/routes/map/{vtile1.js → functions/vtile1.js} +39 -33
- package/server/routes/map/map.route.js +280 -0
- package/server/routes/map/map.route.test.js +503 -0
- package/server/routes/map/map.schema.js +356 -0
- package/server/routes/mapnik/{controllers → functions}/clearTiles.js +26 -29
- package/server/routes/mapnik/{controllers → functions}/createXml.js +17 -20
- package/server/routes/mapnik/{controllers → functions}/createXmlMulti.js +11 -15
- package/server/routes/mapnik/{controllers → functions}/fileSearch.js +6 -9
- package/server/routes/mapnik/functions/fileStat.js +28 -0
- package/server/routes/mapnik/{controllers → functions}/pretile.js +29 -35
- package/server/routes/mapnik/{controllers → functions}/rasterInfo.js +19 -10
- package/server/routes/mapnik/{controllers → functions}/readDir.js +4 -4
- package/server/routes/mapnik/functions/rtile.js +164 -0
- package/server/routes/mapnik/{controllers → functions}/uploadRaster.js +19 -24
- package/server/routes/mapnik/functions/uploadXML.js +27 -0
- package/server/routes/mapnik/mapnik.route.js +102 -0
- package/server/routes/mapnik/mapnik.route.test.js +371 -0
- package/server/routes/mapnik/mapnik.schema.mjs +190 -0
- package/server/routes/mapnik.prefixless/functions/mapnikLogger.js +31 -0
- package/server/routes/{mapnik/controllers → mapnik.prefixless/functions}/mapnikStat.js +7 -5
- package/server/routes/mapnik.prefixless/mapnik.prefixless.route.js +20 -0
- package/server/routes/mapnik.prefixless/mapnik.prefixless.route.test.js +91 -0
- package/server/routes/mapnik.prefixless/mapnik.prefixless.schema.mjs +27 -0
- package/server/routes/maps/functions/add.map.js +42 -0
- package/server/routes/{map/maps → maps/functions}/del.map.js +6 -7
- package/server/routes/{map/maps → maps/functions}/get.map.js +12 -11
- package/server/routes/maps/maps.route.js +58 -0
- package/server/routes/maps/maps.route.test.js +231 -0
- package/server/routes/maps/maps.schema.js +10 -0
- package/server/routes/metadata/functions/editMetadata.js +35 -0
- package/server/routes/metadata/functions/metadataXML.js +19 -0
- package/server/routes/metadata/metadata.route.js +26 -0
- package/server/routes/metadata/metadata.route.test.js +47 -0
- package/server/routes/metadata/metadata.schema.js +53 -0
- package/server/routes/{gis/ogc → ogc/functions}/map.info.point.js +22 -29
- package/server/routes/ogc/ogc.route.js +21 -0
- package/server/routes/ogc/ogc.route.test.js +54 -0
- package/server/routes/ogc/ogc.schema.js +16 -0
- package/server/routes/permissions/functions/catalog.permissions.edit.js +20 -0
- package/server/routes/permissions/functions/catalog.permissions.js +13 -0
- package/server/routes/permissions/{controllers → functions}/gis.catalog.js +10 -10
- package/server/routes/permissions/permissions.route.js +35 -0
- package/server/routes/permissions/permissions.route.test.js +35 -0
- package/server/routes/permissions/permissions.schema.js +44 -0
- package/server/routes/registers/functions/add.registry.js +37 -0
- package/server/routes/{gis/registers/funcs → registers/functions}/classifiers.js +2 -2
- package/server/routes/{gis/registers → registers/functions}/del.registry.js +5 -5
- package/server/routes/{gis/registers/funcs → registers/functions}/get.info.js +9 -5
- package/server/routes/{gis/registers → registers/functions}/gis.export.js +27 -21
- package/server/routes/{gis/registers → registers/functions}/gis.registry.js +22 -15
- package/server/routes/{gis/registers → registers/functions}/gis.registry.list.js +12 -10
- package/server/routes/{gis/registers/funcs → registers/functions}/handleRegistryRequest.js +12 -11
- package/server/routes/registers/registers.route.js +80 -0
- package/server/routes/registers/registers.route.test.js +145 -0
- package/server/routes/registers/registers.schema.js +246 -0
- package/server/routes/{gis/services → services/functions}/add.service.js +14 -16
- package/server/routes/services/functions/create.route.js +93 -0
- package/server/routes/{gis/services → services/functions}/del.service.js +5 -5
- package/server/routes/{gis/services → services/functions}/get.service.users.js +15 -13
- package/server/routes/services/functions/get.services.col.js +34 -0
- package/server/routes/{gis/services → services/functions}/get.services.js +21 -16
- package/server/routes/services/services.route.js +76 -0
- package/server/routes/services/services.route.test.js +168 -0
- package/server/routes/services/services.schema.js +278 -0
- package/server/routes/widgets/functions/add.widget.js +39 -0
- package/server/routes/widgets/functions/del.widget.js +18 -0
- package/server/routes/{map/widgets → widgets/functions}/get.widget.js +12 -11
- package/server/routes/widgets/widgets.route.js +61 -0
- package/server/routes/widgets/widgets.route.test.js +144 -0
- package/server/routes/widgets/widgets.schema.js +25 -0
- package/dist/service-JGNtth-y.js +0 -2593
- package/module/cls.json +0 -7
- package/module/gis/card/gis.metadata.table/main_info.hbs +0 -21
- package/module/gis/card/gis.metadata.table/metadata_info.hbs +0 -28
- package/module/gis/card/gis.metadata.table/other.hbs +0 -26
- package/module/gis/card/gis.rasters.table/main_info.hbs +0 -27
- package/module/gis/card/gis.registers.table/cls.hbs +0 -36
- package/module/gis/card/gis.registers.table/columns.hbs +0 -89
- package/module/gis/card/gis.registers.table/filters.hbs +0 -80
- package/module/gis/card/gis.registers.table/main_info.hbs +0 -35
- package/module/gis/card/gis.registers.table/source.hbs +0 -45
- package/module/gis/card/gis.services.table/attributes.hbs +0 -91
- package/module/gis/card/gis.services.table/filters.hbs +0 -83
- package/module/gis/card/gis.services.table/main_info.hbs +0 -27
- package/module/gis/card/gis.services.table/source.hbs +0 -26
- package/module/test/cls/bp_build_type.json +0 -37
- package/module/test/cls/doc_status.json +0 -32
- package/module/test/cls/ts.temp_status.json +0 -18
- package/module/test/cls/ts.temp_structure.ts_class.json +0 -50
- package/module/test/cls/ts.temp_type.json +0 -10
- package/module/test/layer/bp.json +0 -60
- package/module/test/layer/bp1.yml +0 -33
- package/module/test/layer/individual.yml +0 -54
- package/module/test/layer/ts.linking_passport.yml +0 -56
- package/module/test/layer/ts.temp_structure.yml +0 -51
- package/module/test/map/bp_myo.json +0 -44
- package/module/test/map/bpf.json +0 -44
- package/module/test/map/main.json +0 -39
- package/module/test/map/mbd.json +0 -92
- package/module/test/map/ts.json +0 -53
- package/module/test/select/address_id.json +0 -3
- package/module/test/select/address_id.sql +0 -8
- package/module/test/select/core.user_uid.sql +0 -1
- package/module/test/table/data_address.street.table.json +0 -70
- package/module/test/table/data_bp_myo.bp.table.json +0 -123
- package/server/routes/gis/checkXML.js +0 -117
- package/server/routes/gis/dashboard.js +0 -29
- package/server/routes/gis/index.mjs +0 -92
- package/server/routes/gis/metadata/editMetadata.js +0 -34
- package/server/routes/gis/metadata/metadataXML.js +0 -13
- package/server/routes/gis/registers/add.registry.js +0 -35
- package/server/routes/gis/registers/insert.columns.js +0 -107
- package/server/routes/gis/registers/insert.filters.js +0 -110
- package/server/routes/gis/services/create.route.js +0 -96
- package/server/routes/gis/services/get.services.col.js +0 -33
- package/server/routes/map/controllers/mapCatalogAttribute.js +0 -56
- package/server/routes/map/index.mjs +0 -259
- package/server/routes/map/maps/add.map.js +0 -43
- package/server/routes/map/widgets/add.widget.js +0 -39
- package/server/routes/map/widgets/del.widget.js +0 -23
- package/server/routes/mapnik/controllers/fileStat.js +0 -28
- package/server/routes/mapnik/controllers/mapnikLogger.js +0 -29
- package/server/routes/mapnik/controllers/rtile.js +0 -167
- package/server/routes/mapnik/index.js +0 -40
- package/server/routes/permissions/controllers/catalog.permissions.edit.js +0 -22
- package/server/routes/permissions/controllers/catalog.permissions.js +0 -8
- package/server/routes/permissions/index.mjs +0 -18
- /package/server/routes/map/{controllers/pin → pin}/circle1.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/circle2.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/none.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin1.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin2.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin3.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin4.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin5.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin6.svg +0 -0
- /package/server/routes/map/{controllers/pin → pin}/pin7.svg +0 -0
- /package/server/routes/permissions/{controllers/utils → functions}/get.permissions.js +0 -0
- /package/server/routes/{gis/registers/funcs → registers/functions}/columns.js +0 -0
- /package/server/routes/{gis/registers/funcs → registers/functions}/content.type.js +0 -0
- /package/server/routes/{gis/registers → registers/functions}/map.registry.js +0 -0
- /package/server/routes/{gis/services → services/functions}/get.layer.geom.js +0 -0
- /package/server/routes/{gis/services → services/functions}/legend.auto.js +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { BadRequestError } from '@opengis/fastify-table/errors.js';
|
|
1
2
|
import {
|
|
2
3
|
pgClients, getTemplate, handlebars, metaFormat,
|
|
3
4
|
getMeta,
|
|
@@ -15,11 +16,11 @@ function getLayerTableQuery({
|
|
|
15
16
|
const q = `SELECT
|
|
16
17
|
${pk} as "id"
|
|
17
18
|
,'${el.key}' as "key"
|
|
18
|
-
${nogeom ? '' : `,st_asgeojson(${srid !== 4326 ? `st_transform(${geom}, 4326)` : geom})::json as geom`}, ${srid !== 4326 ? `st_transform(${geom}, 4326)` : geom}::box2d as box2d, ${columns ? `row_to_json(t)` : 'null'} as "data"
|
|
19
|
-
${point ? `,st_distance(${el.srid !== 4326 ? `st_transform(${geom}, 4326)` : geom},'${point} ') as distance` : ''}
|
|
20
|
-
FROM ${table} t WHERE ${tableQuery || '1 = 1'} and st_isvalid(${geom}) and st_srid(${geom}) > 0
|
|
19
|
+
${nogeom ? '' : `,st_asgeojson(${srid !== 4326 ? `st_transform(${geom || 'geom'}, 4326)` : (geom || 'geom')})::json as geom`}, ${srid !== 4326 ? `st_transform(${geom || 'geom'}, 4326)` : (geom || 'geom')}::box2d as box2d, ${columns ? `row_to_json(t)` : 'null'} as "data"
|
|
20
|
+
${point ? `,st_distance(${el.srid !== 4326 ? `st_transform(${geom || 'geom'}, 4326)` : (geom || 'geom')},'${point} ') as distance` : ''}
|
|
21
|
+
FROM ${table} t WHERE ${tableQuery || '1 = 1'} and st_isvalid(${geom || 'geom'}) and st_srid(${geom || 'geom'}) > 0
|
|
21
22
|
and ${point
|
|
22
|
-
? `case when ST_GeometryType(${geom}) in ('ST_Polygon','ST_MultiPolygon', 'ST_LineString','ST_MultiLineString', 'ST_MultiPoint', 'ST_Point') then st_intersects(${srid !== 4326 ? `st_transform(${geom}, 4326)` : geom}, ${buffer}) else false end`
|
|
23
|
+
? `case when ST_GeometryType(${geom || 'geom'}) in ('ST_Polygon','ST_MultiPolygon', 'ST_LineString','ST_MultiLineString', 'ST_MultiPoint', 'ST_Point') then st_intersects(${srid !== 4326 ? `st_transform(${geom || 'geom'}, 4326)` : (geom || 'geom')}, ${buffer}) else false end`
|
|
23
24
|
: '1=1'}
|
|
24
25
|
and ${id ? `${pk}='${id.replace(/'/g, "")}'` : '2=2'}
|
|
25
26
|
${point ? 'order by distance' : ''} limit 10`;
|
|
@@ -53,14 +54,14 @@ async function getLayersData({
|
|
|
53
54
|
radius,
|
|
54
55
|
}, pg)
|
|
55
56
|
: cartocss.config
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
57
|
+
.filter((el, idx, arr) => el.key && el.table && pg.pk?.[el.table]
|
|
58
|
+
&& arr.findIndex(item => item.table === el.table && item.query === el.query) === idx)
|
|
59
|
+
.map(el => getLayerTableQuery({
|
|
60
|
+
el, id, point, nogeom, radius,
|
|
61
|
+
}, pg)).join(' union all ');
|
|
61
62
|
|
|
62
63
|
// console.time(q);
|
|
63
|
-
const rows = await pg.query(q).then(
|
|
64
|
+
const rows = await pg.query(q).then(r => r.rows || []);
|
|
64
65
|
// console.timeEnd(q);
|
|
65
66
|
|
|
66
67
|
if (!rows.length) {
|
|
@@ -96,13 +97,13 @@ async function getLayersData({
|
|
|
96
97
|
}
|
|
97
98
|
|
|
98
99
|
async function getTableData({
|
|
99
|
-
service, layer, id,
|
|
100
|
+
service, layer, id, uid, nogeom,
|
|
100
101
|
}, pg = pgClients.client) {
|
|
101
102
|
const {
|
|
102
103
|
source_path: tname, card, template,
|
|
103
104
|
} = service || {};
|
|
104
105
|
|
|
105
|
-
const columns = (card || []).filter((col) => (
|
|
106
|
+
const columns = (card || []).filter((col) => (uid ? true : !col.is_admin));
|
|
106
107
|
|
|
107
108
|
if (!tname) {
|
|
108
109
|
return { error: 'missing source_path', code: 400 };
|
|
@@ -125,7 +126,7 @@ async function getTableData({
|
|
|
125
126
|
const rows = await pg.query(
|
|
126
127
|
`SELECT ${pk} as "id", ${!nogeom ? 'st_asgeojson(geom)::json as geom, geom::box2d as box2d' : ''} ${!nogeom && filteredColumns?.length > 0 ? ',' : ''} ${filteredColumns.map((n) => `"${n}"`).join(', ')} FROM ${tname} WHERE ${pk} = $1`,
|
|
127
128
|
[id],
|
|
128
|
-
).then(
|
|
129
|
+
).then(r => r.rows || []);
|
|
129
130
|
|
|
130
131
|
if (!rows.length) {
|
|
131
132
|
return { error: 'object not found', code: 404 };
|
|
@@ -136,7 +137,7 @@ async function getTableData({
|
|
|
136
137
|
.reduce((acc, curr) => ({ ...acc, [curr.name]: curr.data }), {});
|
|
137
138
|
|
|
138
139
|
const htmlTemplate = pg?.pk?.['admin.templates'] && service?.card_mode === 'html'
|
|
139
|
-
? await pg.query('select body from admin.templates where name=$1 limit 1', [template || layer]).then(
|
|
140
|
+
? await pg.query('select body from admin.templates where name=$1 limit 1', [template || layer]).then(r => r.rows?.[0]?.body)
|
|
140
141
|
: null;
|
|
141
142
|
|
|
142
143
|
return {
|
|
@@ -148,44 +149,40 @@ async function getTableData({
|
|
|
148
149
|
};
|
|
149
150
|
}
|
|
150
151
|
|
|
151
|
-
export default async function mapFormat({
|
|
152
|
-
const {
|
|
153
|
-
layer, id, lat, lng, nogeom, radius = 50,
|
|
154
|
-
} = query;
|
|
155
|
-
|
|
152
|
+
export default async function mapFormat({ layer, id, lat, lng, nogeom, radius = 50, uid }, pg = pgClients.client) {
|
|
156
153
|
const t1 = Date.now();
|
|
157
154
|
|
|
158
155
|
if (!layer) {
|
|
159
|
-
|
|
156
|
+
throw BadRequestError('not enough query params: layer');
|
|
160
157
|
}
|
|
161
158
|
|
|
162
|
-
const service = await getTemplate('layer', layer) || (pg.pk?.['gis.services'] ? await pg.query('SELECT * FROM gis.services WHERE service_id = $1', [layer]).then(
|
|
163
|
-
const cartocss = pg.pk?.['gis.cartocss'] ? await pg.query('SELECT * FROM gis.cartocss WHERE cartocss_id = $1', [layer]).then(
|
|
159
|
+
const service = await getTemplate('layer', layer) || (pg.pk?.['gis.services'] ? await pg.query('SELECT * FROM gis.services WHERE service_id = $1', [layer]).then(r => r.rows[0]) : null);
|
|
160
|
+
const cartocss = pg.pk?.['gis.cartocss'] ? await pg.query('SELECT * FROM gis.cartocss WHERE cartocss_id = $1', [layer]).then(r => r.rows[0]) : null;
|
|
164
161
|
|
|
165
162
|
if (!cartocss && !id) {
|
|
166
|
-
|
|
163
|
+
throw BadRequestError('not enough query params: id');
|
|
167
164
|
}
|
|
168
165
|
|
|
169
166
|
if (cartocss && !(cartocss.config?.length || cartocss.card_table)) {
|
|
170
|
-
|
|
167
|
+
throw BadRequestError('invalid layer settings: empty config');
|
|
171
168
|
}
|
|
172
169
|
|
|
173
170
|
if (cartocss && !(lat && lng) && !id) {
|
|
174
|
-
|
|
171
|
+
throw BadRequestError('not enough query params: lat and lng / id');
|
|
175
172
|
}
|
|
176
173
|
|
|
177
174
|
const {
|
|
178
|
-
ids, rows, data, columns, classifiers, tname, template, error,
|
|
175
|
+
ids, rows, data, columns, classifiers, tname, template, error, htmlTemplate,
|
|
179
176
|
} = cartocss
|
|
180
177
|
? await getLayersData({
|
|
181
178
|
cartocss, id, lng, lat, radius, nogeom,
|
|
182
179
|
}, pg)
|
|
183
180
|
: await getTableData({
|
|
184
|
-
service, layer, id,
|
|
181
|
+
service, layer, id, uid, nogeom,
|
|
185
182
|
}, pg);
|
|
186
183
|
|
|
187
184
|
if (error) {
|
|
188
|
-
|
|
185
|
+
throw new Error(error);
|
|
189
186
|
}
|
|
190
187
|
|
|
191
188
|
rows.forEach(row => Object.assign(row, { box2d: undefined, bounds: row.box2d ? row.box2d.replace(/[A-Z\)\(]+/g, '').split(/[ ,]+/).map(el => el - 0) : null }));
|
|
@@ -1,30 +1,37 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
3
|
import { createHash } from 'node:crypto';
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
readFile, stat, mkdir, writeFile,
|
|
6
|
+
} from 'node:fs/promises';
|
|
5
7
|
|
|
6
|
-
import
|
|
8
|
+
import { SphericalMercator } from '@mapbox/sphericalmercator';
|
|
7
9
|
|
|
8
|
-
|
|
10
|
+
const mercator = new SphericalMercator({ size: 256 });
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
getTemplate, pgClients, getFilterSQL, getMeta,
|
|
14
|
+
} from '@opengis/fastify-table/utils.js';
|
|
9
15
|
|
|
10
16
|
import rootFolder from '../../../plugins/mapnik/funcs/rootFolder.mjs';
|
|
17
|
+
import { BadRequestError, NotFoundError } from '@opengis/fastify-table/errors.js';
|
|
11
18
|
|
|
12
19
|
const limit = 3000;
|
|
13
|
-
|
|
20
|
+
|
|
14
21
|
const types = { point: 'ST_Point', polygon: 'ST_Polygon,ST_MultiPolygon' };
|
|
15
22
|
const systemColumns = ['uid', 'cdate', 'editor_id', 'editor_date', 'created_by', 'created_at', 'updated_by', 'updated_at'];
|
|
16
23
|
|
|
17
|
-
|
|
18
|
-
const { slug, y, z } = params;
|
|
19
|
-
const { sql, nocache, filter, pointZoom, type, layers, layer } = query;
|
|
20
|
-
const x = params.x?.split?.('.')?.[0] - 0;
|
|
24
|
+
const unittest = process.env.NODE_ENV === 'test' || process.env.VITEST;
|
|
21
25
|
|
|
26
|
+
export default async function mapTiles({
|
|
27
|
+
slug, x, y, z, sql, nocache, filter, pointZoom, type, layers, layer,
|
|
28
|
+
}, pg = pgClients.client) {
|
|
22
29
|
if (!slug) {
|
|
23
|
-
|
|
30
|
+
throw BadRequestError('not enough params: slug');
|
|
24
31
|
}
|
|
25
32
|
|
|
26
33
|
if (!x || !y || !z) {
|
|
27
|
-
|
|
34
|
+
throw BadRequestError('not enough params: xyz');
|
|
28
35
|
}
|
|
29
36
|
|
|
30
37
|
const bbox = mercator.bbox(+y, +x, +z, false);
|
|
@@ -39,7 +46,7 @@ export default async function mapTiles({ pg = pgClients.client, params = {}, que
|
|
|
39
46
|
|
|
40
47
|
const filepath = path.join(
|
|
41
48
|
rootFolder,
|
|
42
|
-
`/map/vtile/${slug}/${hash ? `${createHash('md5').update(hash).digest('hex')}/` : ''}${z}/${x}/${y}.pbf
|
|
49
|
+
`/map/vtile/${slug}/${hash ? `${createHash('md5').update(hash).digest('hex')}/` : ''}${z}/${x}/${y}.pbf`,
|
|
43
50
|
);
|
|
44
51
|
|
|
45
52
|
if (existsSync(filepath) && z < 13 && !nocache && !sql && !unittest) {
|
|
@@ -47,14 +54,14 @@ export default async function mapTiles({ pg = pgClients.client, params = {}, que
|
|
|
47
54
|
const ageInMs = Date.now() - birthtimeMs;
|
|
48
55
|
if (ageInMs < 86400000) {
|
|
49
56
|
const buffer = await readFile(filepath);
|
|
50
|
-
return
|
|
57
|
+
return { headers, data: buffer };
|
|
51
58
|
}
|
|
52
59
|
}
|
|
53
60
|
|
|
54
61
|
const loadTemplate = await getTemplate('map', slug);
|
|
55
62
|
|
|
56
63
|
if (!loadTemplate) {
|
|
57
|
-
|
|
64
|
+
throw NotFoundError('map not found');
|
|
58
65
|
}
|
|
59
66
|
|
|
60
67
|
const index = loadTemplate?.find?.(el => el[0].split('.').shift() === 'index')?.[1];
|
|
@@ -64,22 +71,24 @@ export default async function mapTiles({ pg = pgClients.client, params = {}, que
|
|
|
64
71
|
: loadTemplate?.filter?.(el => el[0].split('.').shift() !== 'index')?.map(el => ({ ...el[1], id: el[0].replace('.yml', '').replace('.json', '') }));
|
|
65
72
|
|
|
66
73
|
if (!layers1?.length) {
|
|
67
|
-
|
|
74
|
+
throw NotFoundError('map layers not found');
|
|
68
75
|
}
|
|
69
76
|
|
|
70
77
|
layers1.forEach(el => Object.assign(el, { name: el.name || el.id }));
|
|
71
78
|
|
|
72
|
-
const layers2 = layers1.filter(el => el.name && el.source_path).filter(el => layers ? layers.includes(el.name) : true).filter(el => layer ? el.name === layer : true);
|
|
79
|
+
const layers2 = layers1.filter(el => el.name && el.source_path).filter(el => (layers ? layers.includes(el.name) : true)).filter(el => (layer ? el.name === layer : true));
|
|
73
80
|
|
|
74
81
|
if (!layers2.length) {
|
|
75
|
-
|
|
82
|
+
throw NotFoundError('map layers sources not provided / invalid query params');
|
|
76
83
|
}
|
|
77
84
|
|
|
78
85
|
const allFilters = loadTemplate.widgets?.filter?.(el => el.type === 'filters') || [];
|
|
79
|
-
const { filters: filterList = [], layer_id: layerId } = allFilters.find(el => layer ? el.config?.layer_id === layer : el.default)?.config || allFilters[0]?.config || {};
|
|
86
|
+
const { filters: filterList = [], layer_id: layerId } = allFilters.find(el => (layer ? el.config?.layer_id === layer : el.default))?.config || allFilters[0]?.config || {};
|
|
80
87
|
|
|
81
88
|
const q = (await Promise.all(layers2.map(async (layer) => {
|
|
82
|
-
const {
|
|
89
|
+
const {
|
|
90
|
+
source_path: source, id, name, style, geometry_type: gt, query: lquery, geometry_column: gCol,
|
|
91
|
+
} = layer;
|
|
83
92
|
const loadTable = await getTemplate('table', source);
|
|
84
93
|
|
|
85
94
|
const table = loadTable?.table || source;
|
|
@@ -89,7 +98,9 @@ export default async function mapTiles({ pg = pgClients.client, params = {}, que
|
|
|
89
98
|
if (!columns?.length) return null;
|
|
90
99
|
|
|
91
100
|
const pk = pg.pk?.[table] || loadTable?.key;
|
|
92
|
-
const fData = filter && layerId === name ? await getFilterSQL({
|
|
101
|
+
const fData = filter && layerId === name ? await getFilterSQL({
|
|
102
|
+
pg, table: source, filterList, filter,
|
|
103
|
+
}) : {};
|
|
93
104
|
|
|
94
105
|
const geomCol = parseInt(z, 10) < parseInt(pointZoom || '0', 10) || (style?.centroid && gt === 'point')
|
|
95
106
|
? `ST_Centroid(${geom})`
|
|
@@ -98,11 +109,9 @@ export default async function mapTiles({ pg = pgClients.client, params = {}, que
|
|
|
98
109
|
const columnsFiltered = columns
|
|
99
110
|
.filter(el => !['json', 'geometry'].includes(pg.pgType?.[el.dataTypeID]) && !systemColumns.includes(el.name));
|
|
100
111
|
|
|
101
|
-
const props = columnsFiltered.map(el =>
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
: `${el.name}${['int4'].includes(el.type) ? '::text' : ''}`;
|
|
105
|
-
});
|
|
112
|
+
const props = columnsFiltered.map(el => (el.type?.[0] === '_'
|
|
113
|
+
? `${el.name}[1] as ${el.name}`
|
|
114
|
+
: `${el.name}${['int4'].includes(el.type) ? '::text' : ''}`));
|
|
106
115
|
|
|
107
116
|
return `SELECT ST_AsMVT(q, '${(id || name).replace(/'/g, "''")}', 4096, 'geom','row') as tile
|
|
108
117
|
FROM (
|
|
@@ -129,8 +138,8 @@ export default async function mapTiles({ pg = pgClients.client, params = {}, que
|
|
|
129
138
|
) q`;
|
|
130
139
|
}))).filter(el => el).join(' union all ');
|
|
131
140
|
|
|
132
|
-
if (sql ===
|
|
133
|
-
if (sql ===
|
|
141
|
+
if (sql === 1) return q;
|
|
142
|
+
if (sql === 2) return filepath.replace(/\\/g, '/');
|
|
134
143
|
|
|
135
144
|
const tile = await pg.query(q);
|
|
136
145
|
|
|
@@ -138,9 +147,9 @@ export default async function mapTiles({ pg = pgClients.client, params = {}, que
|
|
|
138
147
|
console.log(slug, q);
|
|
139
148
|
}
|
|
140
149
|
|
|
141
|
-
if (sql ===
|
|
150
|
+
if (sql === 3) return tile.rows.map((el) => el.tile);
|
|
142
151
|
|
|
143
|
-
if (sql ===
|
|
152
|
+
if (sql === 4) return tile.rows.map((el) => el.tile);
|
|
144
153
|
|
|
145
154
|
const buffer = Buffer.concat(tile.rows.map((el) => Buffer.from(el.tile)));
|
|
146
155
|
|
|
@@ -149,5 +158,5 @@ export default async function mapTiles({ pg = pgClients.client, params = {}, que
|
|
|
149
158
|
await writeFile(filepath, buffer, 'binary');
|
|
150
159
|
}
|
|
151
160
|
|
|
152
|
-
return
|
|
153
|
-
}
|
|
161
|
+
return { headers, data: buffer };
|
|
162
|
+
}
|
|
@@ -7,10 +7,10 @@ const list = arr.map(el => {
|
|
|
7
7
|
return { name, slug: el[0] };
|
|
8
8
|
});
|
|
9
9
|
|
|
10
|
-
export default async function mapList(
|
|
10
|
+
export default async function mapList() {
|
|
11
11
|
if (!arr.length) {
|
|
12
|
-
return
|
|
12
|
+
return [];
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
return
|
|
15
|
+
return list;
|
|
16
16
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { BadRequestError } from "@opengis/fastify-table/errors.js";
|
|
2
|
+
|
|
1
3
|
const GEOMETRY_TYPES = new Set([
|
|
2
4
|
'Point',
|
|
3
5
|
'MultiPoint',
|
|
@@ -50,20 +52,19 @@ function normalizeToFeatureCollection(input) {
|
|
|
50
52
|
* @param {string} body.content - вміст файлу
|
|
51
53
|
* @param {string} [body.filename] - ім'я файлу
|
|
52
54
|
*/
|
|
53
|
-
export default async function parseGeoFile({ body = {} }, reply) {
|
|
54
|
-
const { content, filename = '' } = body;
|
|
55
55
|
|
|
56
|
+
export default async function parseGeoFile({ content, filename = '' }) {
|
|
56
57
|
if (!content || typeof content !== 'string') {
|
|
57
|
-
|
|
58
|
+
throw BadRequestError('Потрібен вміст файлу (content)');
|
|
58
59
|
}
|
|
59
60
|
|
|
60
61
|
if (content.length > MAX_FILE_SIZE) {
|
|
61
|
-
|
|
62
|
+
throw BadRequestError('Максимальний розмір файлу — 50MB');
|
|
62
63
|
}
|
|
63
64
|
|
|
64
65
|
const lowerName = String(filename).toLowerCase();
|
|
65
66
|
if (lowerName && !lowerName.endsWith('.json') && !lowerName.endsWith('.geojson')) {
|
|
66
|
-
|
|
67
|
+
throw BadRequestError('Підтримуються лише файли GeoJSON (.geojson, .json)');
|
|
67
68
|
}
|
|
68
69
|
|
|
69
70
|
let parsed;
|
|
@@ -71,16 +72,14 @@ export default async function parseGeoFile({ body = {} }, reply) {
|
|
|
71
72
|
parsed = JSON.parse(content);
|
|
72
73
|
}
|
|
73
74
|
catch {
|
|
74
|
-
|
|
75
|
+
throw BadRequestError('Некоректний JSON');
|
|
75
76
|
}
|
|
76
77
|
|
|
77
78
|
const normalized = normalizeToFeatureCollection(parsed);
|
|
79
|
+
|
|
78
80
|
if (!normalized?.features?.length) {
|
|
79
|
-
|
|
81
|
+
throw BadRequestError('Не вдалося розпізнати геометрію GeoJSON');
|
|
80
82
|
}
|
|
81
83
|
|
|
82
|
-
return
|
|
83
|
-
.status(200)
|
|
84
|
-
.header('Content-Type', 'application/json')
|
|
85
|
-
.send(normalized);
|
|
84
|
+
return normalized;
|
|
86
85
|
}
|
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
const DEFAULT_ENDPOINT = 'https://api.opentopodata.org/v1/srtm90m';
|
|
2
2
|
|
|
3
|
-
function parseLatLng(
|
|
4
|
-
const lat = Number(query?.lat);
|
|
5
|
-
const lng = Number(query?.lng);
|
|
3
|
+
function parseLatLng({ lat, lng }) {
|
|
6
4
|
if (!Number.isFinite(lat) || !Number.isFinite(lng)) {
|
|
7
5
|
throw new Error('lat and lng are required');
|
|
8
6
|
}
|
|
9
7
|
if (Math.abs(lat) > 90 || Math.abs(lng) > 180) {
|
|
10
8
|
throw new Error('coordinates out of range');
|
|
11
9
|
}
|
|
12
|
-
return { lat, lng };
|
|
13
10
|
}
|
|
14
11
|
|
|
15
12
|
function getEndpoint() {
|
|
@@ -42,9 +39,8 @@ async function fetchHeight(lat, lng) {
|
|
|
42
39
|
}
|
|
43
40
|
}
|
|
44
41
|
|
|
45
|
-
export default async function pointHeight(
|
|
46
|
-
|
|
47
|
-
const { lat, lng } = parseLatLng(query);
|
|
42
|
+
export default async function pointHeight({ lat, lng }) {
|
|
43
|
+
parseLatLng({ lat, lng });
|
|
48
44
|
const height = await fetchHeight(lat, lng);
|
|
49
45
|
|
|
50
46
|
return {
|
|
@@ -5,16 +5,18 @@ import {
|
|
|
5
5
|
readFile, stat, mkdir, writeFile,
|
|
6
6
|
} from 'node:fs/promises';
|
|
7
7
|
|
|
8
|
-
import
|
|
8
|
+
import { SphericalMercator } from '@mapbox/sphericalmercator';
|
|
9
|
+
|
|
10
|
+
const mercator = new SphericalMercator({ size: 256 });
|
|
9
11
|
|
|
10
12
|
import {
|
|
11
|
-
getTemplate, pgClients, getFilterSQL, getMeta, yml2json, getColumnCLS,
|
|
13
|
+
getTemplate, pgClients, getFilterSQL, getMeta, yml2json, getColumnCLS,
|
|
12
14
|
} from '@opengis/fastify-table/utils.js';
|
|
13
15
|
|
|
14
16
|
import rootFolder from '../../../plugins/mapnik/funcs/rootFolder.mjs';
|
|
15
17
|
|
|
16
18
|
const limit = 3000;
|
|
17
|
-
|
|
19
|
+
|
|
18
20
|
const types = { point: 'ST_Point', polygon: 'ST_Polygon,ST_MultiPolygon' };
|
|
19
21
|
const systemColumns = ['uid', 'cdate', 'editor_id', 'editor_date', 'created_by', 'created_at', 'updated_by', 'updated_at'];
|
|
20
22
|
|
|
@@ -10,43 +10,46 @@ import {
|
|
|
10
10
|
readFile, stat, mkdir, writeFile,
|
|
11
11
|
} from 'node:fs/promises';
|
|
12
12
|
|
|
13
|
-
import
|
|
13
|
+
import { load } from 'js-yaml';
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
import { SphericalMercator } from '@mapbox/sphericalmercator';
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
// const mercator = new SphericalMercator({ size: 256 });
|
|
17
|
+
const mercator = new SphericalMercator({ size: 256 });
|
|
19
18
|
|
|
20
19
|
import {
|
|
21
20
|
getColumnCLS, getTemplate, getMeta, getFilterSQL, getSelect,
|
|
21
|
+
pgClients,
|
|
22
|
+
getFilterSQLParametrized,
|
|
22
23
|
} from '@opengis/fastify-table/utils.js';
|
|
23
|
-
|
|
24
|
-
import rootFolder from '
|
|
24
|
+
|
|
25
|
+
import rootFolder from '../../../plugins/mapnik/funcs/rootFolder.mjs';
|
|
26
|
+
import { NotFoundError } from '@opengis/fastify-table/errors.js';
|
|
25
27
|
|
|
26
28
|
const propsCache = {};
|
|
27
29
|
|
|
28
|
-
|
|
29
|
-
params = {}, query, pg, user,
|
|
30
|
-
}, reply) {
|
|
31
|
-
const { y, z } = params;
|
|
32
|
-
const x = params.x.split('.')[0] - 0;
|
|
33
|
-
const {
|
|
34
|
-
type, nocache, sql, clusterZoom, filter, nottl,
|
|
35
|
-
} = query;
|
|
30
|
+
const types = { point: 'ST_Point' /* ,ST_MultiPoint */, polygon: 'ST_Polygon,ST_MultiPolygon' };
|
|
36
31
|
|
|
32
|
+
export default async function vtile({
|
|
33
|
+
x, y, z, layer: paramsLayer, type, nocache, sql, clusterZoom, filter, nottl, uid, filter: queryFilter, all: queryAll, sql: querySql, pointZoom,
|
|
34
|
+
}, pg = pgClients.client) {
|
|
37
35
|
const hash = [type, clusterZoom, filter].join();
|
|
38
36
|
|
|
39
37
|
const filepath = path.join(
|
|
40
38
|
rootFolder,
|
|
41
|
-
`/vtile/${
|
|
39
|
+
`/vtile/${paramsLayer}/${hash ? `${createHash('md5').update(hash).digest('hex')}/` : ''}${z}/${x}/${y}.vmt`,
|
|
42
40
|
);
|
|
43
41
|
|
|
44
42
|
// layer
|
|
45
|
-
const [
|
|
43
|
+
const [_, layer] = paramsLayer.includes(':') ? paramsLayer.split(':') : [null, paramsLayer];
|
|
46
44
|
|
|
47
45
|
// service
|
|
48
|
-
const data = await getTemplate('layer', layer) || await pg.query(`select * from gis.services where ${!
|
|
49
|
-
|
|
46
|
+
const data = await getTemplate('layer', layer) || await pg.query(`select * from gis.services where ${!uid ? 'is_public and is_active' : '1=1'} and service_id=$1`, [layer]).then(r => r.rows?.[0]);
|
|
47
|
+
|
|
48
|
+
if (!data) {
|
|
49
|
+
throw NotFoundError('layer not found');
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const style = typeof data?.style === 'object' ? data?.style : load(data?.style);
|
|
50
53
|
|
|
51
54
|
const cacheZoom = style?.cacheZoom || 13;
|
|
52
55
|
const ttl = typeof style?.ttl === 'number' && style.ttl >= 0 ? style.ttl : 86400000;
|
|
@@ -56,7 +59,7 @@ export default async function vtile({
|
|
|
56
59
|
const ageInMs = Date.now() - birthtimeMs;
|
|
57
60
|
if (ageInMs < ttl) {
|
|
58
61
|
const buffer = await readFile(filepath);
|
|
59
|
-
return
|
|
62
|
+
return { headers, data: buffer };
|
|
60
63
|
}
|
|
61
64
|
}
|
|
62
65
|
|
|
@@ -69,20 +72,20 @@ export default async function vtile({
|
|
|
69
72
|
const bbox = mercator.bbox(+y, +x, +z, false/* , '900913' */);
|
|
70
73
|
const bbox2d = `'BOX(${bbox[0]} ${bbox[1]},${bbox[2]} ${bbox[3]})'::box2d`;
|
|
71
74
|
|
|
72
|
-
const filterData =
|
|
73
|
-
filter:
|
|
74
|
-
}) : {};
|
|
75
|
+
const filterData = queryFilter ? await getFilterSQLParametrized({
|
|
76
|
+
filter: queryFilter, table, filterList, pg,
|
|
77
|
+
}) : { args: [] };
|
|
75
78
|
|
|
76
79
|
// meta
|
|
77
|
-
const metaTable = await getMeta({ pg, table });
|
|
78
|
-
|
|
79
|
-
const { pk: pkey = data.key, columns } = metaTable; // if view - specify via template
|
|
80
|
+
const metaTable = table ? await getMeta({ pg, table }) : {};
|
|
81
|
+
|
|
82
|
+
const { pk: pkey = data.key, columns = [] } = metaTable; // if view - specify via template
|
|
80
83
|
|
|
81
84
|
// props
|
|
82
85
|
const statusColumn = style?.colorAttr || style?.iconAttr ? columns.filter(col => col.name === style.colorAttr || style?.iconAttr) : [];
|
|
83
|
-
const props = !
|
|
86
|
+
const props = !queryAll ? (statusColumn || []).concat(data.popup || []).concat(data.card || []) : columns.filter(el => !['json', 'geometry'].includes(pg.pgType[el.dataTypeID]) && !['uid', 'cdate', 'editor_id', 'editor_date'].includes(el.name));
|
|
84
87
|
|
|
85
|
-
const cache = layer + (
|
|
88
|
+
const cache = layer + (queryAll ? '-all' : '') + JSON.stringify(data.popup || []).length;
|
|
86
89
|
const propsWithCls = propsCache[cache] ?? await Promise.all(props.map(async (col, idx) => {
|
|
87
90
|
const key = col.name;
|
|
88
91
|
const select = data.popup?.find(el => el.name === key);
|
|
@@ -109,17 +112,16 @@ export default async function vtile({
|
|
|
109
112
|
propsCache[cache] = propsCache[cache] || propsWithCls;
|
|
110
113
|
|
|
111
114
|
const geomCol = (style?.type === 'point' ? `ST_Centroid(${geom})` : null)
|
|
112
|
-
|| (parseInt(z, 10) < parseInt(
|
|
115
|
+
|| (parseInt(z, 10) < parseInt(pointZoom || style?.pointZoom || style?.iconZoom || '0', 10) ? `ST_Centroid(${geom})` : geom);
|
|
113
116
|
|
|
114
117
|
const koef = {
|
|
115
118
|
10: 0.1, 11: 0.05, 12: 0.005, 13: 0.001, 14: 0.001, 15: 0.0005,
|
|
116
119
|
}[z] || 0.0005;
|
|
117
120
|
|
|
118
|
-
const types = { point: 'ST_Point' /* ,ST_MultiPoint */, polygon: 'ST_Polygon,ST_MultiPolygon' };
|
|
119
121
|
const clusterZoom1 = style?.clusterZoom || clusterZoom;
|
|
120
122
|
const queryMode = ((clusterZoom1 - z) > 2 ? 1 : null) || ((clusterZoom1 - z) > 0 ? 2 : null) || 3;
|
|
121
123
|
// console.log(z, clusterZoom, queryMode);
|
|
122
|
-
const props1 = props.filter((el, idx, arr) => idx === arr.findIndex(item => item.name === el.name));
|
|
124
|
+
// const props1 = props.filter((el, idx, arr) => idx === arr.findIndex(item => item.name === el.name));
|
|
123
125
|
const q = {
|
|
124
126
|
1: `SELECT ST_AsMVT(q, '${layer}', 4096, 'geom','row') as tile
|
|
125
127
|
FROM (
|
|
@@ -166,8 +168,12 @@ export default async function vtile({
|
|
|
166
168
|
) q`,
|
|
167
169
|
}[queryMode];
|
|
168
170
|
|
|
169
|
-
if (
|
|
170
|
-
|
|
171
|
+
if (querySql === 1) {
|
|
172
|
+
return q;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const args = filterData?.args || [];
|
|
176
|
+
const tile = await pg.query(q, args);
|
|
171
177
|
const buffer = Buffer.concat(tile.rows.map((el) => Buffer.from(el.tile)));
|
|
172
178
|
|
|
173
179
|
if (!nocache) {
|
|
@@ -175,5 +181,5 @@ export default async function vtile({
|
|
|
175
181
|
await writeFile(filepath, buffer, 'binary');
|
|
176
182
|
}
|
|
177
183
|
|
|
178
|
-
return
|
|
184
|
+
return { headers: { ...headers, 'Cache-Control': nocache || nottl ? 'no-cache' : headers['Cache-Control'] }, data: buffer };
|
|
179
185
|
}
|