text-to-map
Version:
Text To Map usiluje o lepší, strojově zpracovatelné využití částí vyhlášek s výčtem ulic a dalších lokací. Jde o rozšiřitelnou sadu konceptů a nástrojů, které zajistí hladký převod výčtu ulic a jejich rozsahů v lidsky srozumitelném jazyce do strojově zpra
95 lines • 13.1 kB
JavaScript
import chunk from "lodash/chunk";
import { extractKeyValuesPairs, getKnexDb, insertMultipleRows, rawQuery, } from "./db";
const citiesColumn = {
cityName: 0,
cityCode: 1,
countyName: 2,
countyCode: 3,
regionName: 4,
regionCode: 5,
postalCode: 6,
latitude: 7,
longitude: 8,
};
export const insertCityPositions = async (data) => {
let changes = 0;
// cities are most likely already inserted, but in case they're not,
// we need to insert them before updating them with region data
changes += await insertCities(data);
const prev = changes;
for (const arrayChunk of chunk(data, 1000)) {
const queries = [];
for (const row of arrayChunk) {
queries.push(rawQuery(`UPDATE city SET wgs84_latitude = ?, wgs84_longitude = ? WHERE code = ?`, [
row[citiesColumn.latitude],
row[citiesColumn.longitude],
row[citiesColumn.cityCode],
]));
}
await Promise.all(queries);
changes += queries.length;
console.log(`Done ${changes - prev} / ${data.length} rows...`);
}
return changes;
};
export const insertCities = async (buffer) => {
return await insertMultipleRows(extractKeyValuesPairs(buffer, citiesColumn.cityCode, [
citiesColumn.cityName,
]), "city", ["code", "name"]);
};
export const setCityPolygonGeojson = async (code, polygon, districtsPolygon) => {
await getKnexDb()
.from("city")
.update({
polygon_geojson: JSON.stringify(polygon),
...(districtsPolygon
? { districts_polygon_geojson: JSON.stringify(districtsPolygon) }
: {}),
})
.where({ code });
};
export const getCityPolygons = async (cityCodes) => {
if (cityCodes.size === 0) {
return {};
}
const cityRows = await getKnexDb()
.from("city")
.select("code", "polygon_geojson")
.whereIn("code", Array.from(cityCodes));
return cityRows.reduce((acc, row) => {
acc[row.code] = JSON.parse(row.polygon_geojson);
return acc;
}, {});
};
export const getDistrictPolygons = async (districtCodes) => {
if (districtCodes.size === 0) {
return {};
}
const cityCodes = (await getKnexDb()
.from("city_district")
.select("city_code")
.whereIn("code", Array.from(districtCodes))
.groupBy("city_code")).map((row) => row.city_code);
const cityRows = await getKnexDb()
.from("city")
.select("code", "districts_polygon_geojson")
.whereIn("code", cityCodes);
const districtPolygons = {};
for (const row of cityRows) {
if (row.districts_polygon_geojson) {
const polygons = JSON.parse(row.districts_polygon_geojson);
for (const feature of polygons.features) {
if (districtCodes.has(Number(feature.properties.KOD))) {
districtPolygons[feature.properties.KOD] = {
type: "FeatureCollection",
features: [
{ ...feature, properties: { code: feature.properties.KOD } },
],
};
}
}
}
}
return districtPolygons;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2l0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RiL2NpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssTUFBTSxjQUFjLENBQUM7QUFDakMsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixTQUFTLEVBQ1Qsa0JBQWtCLEVBQ2xCLFFBQVEsR0FDVCxNQUFNLE1BQU0sQ0FBQztBQUlkLE1BQU0sWUFBWSxHQUFHO0lBQ25CLFFBQVEsRUFBRSxDQUFDO0lBQ1gsUUFBUSxFQUFFLENBQUM7SUFDWCxVQUFVLEVBQUUsQ0FBQztJQUNiLFVBQVUsRUFBRSxDQUFDO0lBQ2IsVUFBVSxFQUFFLENBQUM7SUFDYixVQUFVLEVBQUUsQ0FBQztJQUNiLFVBQVUsRUFBRSxDQUFDO0lBQ2IsUUFBUSxFQUFFLENBQUM7SUFDWCxTQUFTLEVBQUUsQ0FBQztDQUNiLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLEVBQ3RDLElBQWdCLEVBQ0MsRUFBRTtJQUNuQixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFFaEIsb0VBQW9FO0lBQ3BFLCtEQUErRDtJQUMvRCxPQUFPLElBQUksTUFBTSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDO0lBRXJCLEtBQUssTUFBTSxVQUFVLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRTtRQUMxQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbkIsS0FBSyxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUU7WUFDNUIsT0FBTyxDQUFDLElBQUksQ0FDVixRQUFRLENBQ04sd0VBQXdFLEVBQ3hFO2dCQUNFLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO2dCQUMxQixHQUFHLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztnQkFDM0IsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFR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MkJBQTJCLENBQUM7U0FDM0MsT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUU5QixNQUFNLGdCQUFnQixHQUFvQixFQUFFLENBQUM7SUFDN0MsS0FBSyxNQUFNLEdBQUcsSUFBSSxRQUFRLEVBQUU7UUFDMUIsSUFBSSxHQUFHLENBQUMseUJBQXlCLEVBQUU7WUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDekIsR0FBRyxDQUFDLHlCQUF5QixDQUNlLENBQUM7WUFDL0MsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFO2dCQUN2QyxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtvQkFDckQsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRzt3QkFDekMsSUFBSSxFQUFFLG1CQUFtQjt3QkFDekIsUUFBUSxFQUFFOzRCQUNSLEVBQUUsR0FBRyxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUU7eUJBQzdEO3FCQUNGLENBQUM7aUJBQ0g7YUFDRjtTQUNGO0tBQ0Y7SUFFRCxPQUFPLGdCQUFnQixDQUFDO0FBQzFCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaHVuayBmcm9tIFwibG9kYXNoL2NodW5rXCI7XHJcbmltcG9ydCB7XHJcbiAgZXh0cmFjdEtleVZhbHVlc1BhaXJzLFxyXG4gIGdldEtuZXhEYixcclxuICBpbnNlcnRNdWx0aXBsZVJvd3MsXHJcbiAgcmF3UXVlcnksXHJcbn0gZnJvbSBcIi4vZGJcIjtcclxuaW1wb3J0IHsgRmVhdHVyZUNvbGxlY3Rpb24sIE11bHRpUG9seWdvbiwgUG9seWdvbiB9IGZyb20gXCJAdHVyZi9oZWxwZXJzXCI7XHJcbmltcG9ydCB7IFBvbHlnb25zQnlDb2RlcyB9IGZyb20gXCIuL3R5cGVzXCI7XHJcblxyXG5jb25zdCBjaXRpZXNDb2x1bW4gPSB7XHJcbiAgY2l0eU5hbWU6IDAsXHJcbiAgY2l0eUNvZGU6IDEsXHJcbiAgY291bnR5TmFtZTogMixcclxuICBjb3VudHlDb2RlOiAzLFxyXG4gIHJlZ2lvbk5hbWU6IDQsXHJcbiAgcmVnaW9uQ29kZTogNSxcclxuICBwb3N0YWxDb2RlOiA2LFxyXG4gIGxhdGl0dWRlOiA3LFxyXG4gIGxvbmdpdHVkZTogOCxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBpbnNlcnRDaXR5UG9zaXRpb25zID0gYXN5bmMgKFxyXG4gIGRhdGE6IHN0cmluZ1tdW11cclxuKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcclxuICBsZXQgY2hhbmdlcyA9IDA7XHJcblxyXG4gIC8vIGNpdGllcyBhcmUgbW9zdCBsaWtlbHkgYWxyZWFkeSBpbnNlcnRlZCwgYnV0IGluIGNhc2UgdGhleSdyZSBub3QsXHJcbiAgLy8gd2UgbmVlZCB0byBpbnNlcnQgdGhlbSBiZWZvcmUgdXBkYXRpbmcgdGhlbSB3aXRoIHJlZ2lvbiBkYXRhXHJcbiAgY2hhbmdlcyArPSBhd2FpdCBpbnNlcnRDaXRpZXMoZGF0YSk7XHJcbiAgY29uc3QgcHJldiA9IGNoYW5nZXM7XHJcblxyXG4gIGZvciAoY29uc3QgYXJyYXlDaHVuayBvZiBjaHVuayhkYXRhLCAxMDAwKSkge1xyXG4gICAgY29uc3QgcXVlcmllcyA9IFtdO1xyXG4gICAgZm9yIChjb25zdCByb3cgb2YgYXJyYXlDaHVuaykge1xyXG4gICAgICBxdWVyaWVzLnB1c2goXHJcbiAgICAgICAgcmF3UXVlcnkoXHJcbiAgICAgICAgICBgVVBEQVRFIGNpdHkgU0VUIHdnczg0X2xhdGl0dWRlID0gPywgd2dzODRfbG9uZ2l0dWRlID0gPyBXSEVSRSBjb2RlID0gP2AsXHJcbiAgICAgICAgICBbXHJcbiAgICAgICAgICAgIHJvd1tjaXRpZXNDb2x1bW4ubGF0aXR1ZGVdLFxyXG4gICAgICAgICAgICByb3dbY2l0aWVzQ29sdW1uLmxvbmdpdHVkZV0sXHJcbiAgICAgICAgICAgIHJvd1tjaXRpZXNDb2x1bW4uY2l0eUNvZGVdLFxyXG4gICAgICAgICAgXVxyXG4gICAgICAgIClcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGF3YWl0IFByb21pc2UuYWxsKHF1ZXJpZXMpO1xyXG4gICAgY2hhbmdlcyArPSBxdWVyaWVzLmxlbmd0aDtcclxuICAgIGNvbnNvbGUubG9nKGBEb25lICR7Y2hhbmdlcyAtIHByZXZ9IC8gJHtkYXRhLmxlbmd0aH0gcm93cy4uLmApO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNoYW5nZXM7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaW5zZXJ0Q2l0aWVzID0gYXN5bmMgKGJ1ZmZlcjogc3RyaW5nW11bXSk6IFByb21pc2U8bnVtYmVyPiA9PiB7XHJcbiAgcmV0dXJuIGF3YWl0IGluc2VydE11bHRpcGxlUm93cyhcclxuICAgIGV4dHJhY3RLZXlWYWx1ZXNQYWlycyhidWZmZXIsIGNpdGllc0NvbHVtbi5jaXR5Q29kZSwgW1xyXG4gICAgICBjaXRpZXNDb2x1bW4uY2l0eU5hbWUsXHJcbiAgICBdKSxcclxuICAgIFwiY2l0eVwiLFxyXG4gICAgW1wiY29kZVwiLCBcIm5hbWVcIl1cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHNldENpdHlQb2x5Z29uR2VvanNvbiA9IGFzeW5jIChcclxuICBjb2RlOiBzdHJpbmcsXHJcbiAgcG9seWdvbjogRmVhdHVyZUNvbGxlY3Rpb24sXHJcbiAgZGlzdHJpY3RzUG9seWdvbj86IEZlYXR1cmVDb2xsZWN0aW9uXHJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gIGF3YWl0IGdldEtuZXhEYigpXHJcbiAgICAuZnJvbShcImNpdHlcIilcclxuICAgIC51cGRhdGUoe1xyXG4gICAgICBwb2x5Z29uX2dlb2pzb246IEpTT04uc3RyaW5naWZ5KHBvbHlnb24pLFxyXG4gICAgICAuLi4oZGlzdHJpY3RzUG9seWdvblxyXG4gICAgICAgID8geyBkaXN0cmljdHNfcG9seWdvbl9nZW9qc29uOiBKU09OLnN0cmluZ2lmeShkaXN0cmljdHNQb2x5Z29uKSB9XHJcbiAgICAgICAgOiB7fSksXHJcbiAgICB9KVxyXG4gICAgLndoZXJlKHsgY29kZSB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRDaXR5UG9seWdvbnMgPSBhc3luYyAoXHJcbiAgY2l0eUNvZGVzOiBTZXQ8bnVtYmVyPlxyXG4pOiBQcm9taXNlPFBvbHlnb25zQnlDb2Rlcz4gPT4ge1xyXG4gIGlmIChjaXR5Q29kZXMuc2l6ZSA9PT0gMCkge1xyXG4gICAgcmV0dXJuIHt9O1xyXG4gIH1cclxuICBjb25zdCBjaXR5Um93cyA9IGF3YWl0IGdldEtuZXhEYigpXHJcbiAgICAuZnJvbShcImNpdHlcIilcclxuICAgIC5zZWxlY3QoXCJjb2RlXCIsIFwicG9seWdvbl9nZW9qc29uXCIpXHJcbiAgICAud2hlcmVJbihcImNvZGVcIiwgQXJyYXkuZnJvbShjaXR5Q29kZXMpKTtcclxuXHJcbiAgcmV0dXJuIGNpdHlSb3dzLnJlZHVjZSgoYWNjLCByb3cpID0+IHtcclxuICAgIGFjY1tyb3cuY29kZV0gPSBKU09OLnBhcnNlKHJvdy5wb2x5Z29uX2dlb2pzb24pO1xyXG4gICAgcmV0dXJuIGFjYztcclxuICB9LCB7fSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0RGlzdHJpY3RQb2x5Z29ucyA9IGFzeW5jIChcclxuICBkaXN0cmljdENvZGVzOiBTZXQ8bnVtYmVyPlxyXG4pOiBQcm9taXNlPFBvbHlnb25zQnlDb2Rlcz4gPT4ge1xyXG4gIGlmIChkaXN0cmljdENvZGVzLnNpemUgPT09IDApIHtcclxuICAgIHJldHVybiB7fTtcclxuICB9XHJcbiAgY29uc3QgY2l0eUNvZGVzID0gKFxyXG4gICAgYXdhaXQgZ2V0S25leERiKClcclxuICAgICAgLmZyb20oXCJjaXR5X2Rpc3RyaWN0XCIpXHJcbiAgICAgIC5zZWxlY3QoXCJjaXR5X2NvZGVcIilcclxuICAgICAgLndoZXJlSW4oXCJjb2RlXCIsIEFycmF5LmZyb20oZGlzdHJpY3RDb2RlcykpXHJcbiAgICAgIC5ncm91cEJ5KFwiY2l0eV9jb2RlXCIpXHJcbiAgKS5tYXAoKHJvdykgPT4gcm93LmNpdHlfY29kZSk7XHJcblxyXG4gIGNvbnN0IGNpdHlSb3dzID0gYXdhaXQgZ2V0S25leERiKClcclxuICAgIC5mcm9tKFwiY2l0eVwiKVxyXG4gICAgLnNlbGVjdChcImNvZGVcIiwgXCJkaXN0cmljdHNfcG9seWdvbl9nZW9qc29uXCIpXHJcbiAgICAud2hlcmVJbihcImNvZGVcIiwgY2l0eUNvZGVzKTtcclxuXHJcbiAgY29uc3QgZGlzdHJpY3RQb2x5Z29uczogUG9seWdvbnNCeUNvZGVzID0ge307XHJcbiAgZm9yIChjb25zdCByb3cgb2YgY2l0eVJvd3MpIHtcclxuICAgIGlmIChyb3cuZGlzdHJpY3RzX3BvbHlnb25fZ2VvanNvbikge1xyXG4gICAgICBjb25zdCBwb2x5Z29ucyA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgcm93LmRpc3RyaWN0c19wb2x5Z29uX2dlb2pzb25cclxuICAgICAgKSBhcyBGZWF0dXJlQ29sbGVjdGlvbjxQb2x5Z29uIHwgTXVsdGlQb2x5Z29uPjtcclxuICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIHBvbHlnb25zLmZlYXR1cmVzKSB7XHJcbiAgICAgICAgaWYgKGRpc3RyaWN0Q29kZXMuaGFzKE51bWJlcihmZWF0dXJlLnByb3BlcnRpZXMuS09EKSkpIHtcclxuICAgICAgICAgIGRpc3RyaWN0UG9seWdvbnNbZmVhdHVyZS5wcm9wZXJ0aWVzLktPRF0gPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIixcclxuICAgICAgICAgICAgZmVhdHVyZXM6IFtcclxuICAgICAgICAgICAgICB7IC4uLmZlYXR1cmUsIHByb3BlcnRpZXM6IHsgY29kZTogZmVhdHVyZS5wcm9wZXJ0aWVzLktPRCB9IH0sXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGRpc3RyaWN0UG9seWdvbnM7XHJcbn07XHJcbiJdfQ==