Skip to content

Instantly share code, notes, and snippets.

@gabonator
Created March 27, 2018 16:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gabonator/98ed5df7887a0409a0b284c0f911196c to your computer and use it in GitHub Desktop.
Save gabonator/98ed5df7887a0409a0b284c0f911196c to your computer and use it in GitHub Desktop.
nodejs Kataster portal to kml converter
// Kataster portal to kml converter
// Ziska geometriu parcely a skonvertuje do KML suboru ktory sa da vizualizovat v google earth
var request = require("request");
var list = [
{lv:"5124", parcela:"1372", register:"e", pomer:"1/5", plocha:5355},
{lv:"5124", parcela:"1373/201", register:"e", pomer:"1/5", plocha:3174},
{lv:"5124", parcela:"1373/202", register:"e", pomer:"1/5", plocha:1257},];
function _ASSERT(e)
{
if (!e)
throw new Error();
}
function findParcela(parcela, kategoria, h)
{
findParcelaSub("k.ú. Sereď (855251)", "855251", parcela, kategoria, (r) =>
{
if (r)
{
h(r);
return;
}
if (!r)
findParcelaSub("obec Sereď (okres Galanta)", "504009", parcela, kategoria, (r) =>
{
_ASSERT(r);
h(r);
return;
});
});
}
function findParcelaSub(ltext, cu, parcela, kategoria, h)
{
request({
url: "https://zbgis.skgeodesy.sk/mkzbgis/Cadastral/Suggest",
method: "POST",
json: {text: parcela, lockText: "k.ú. Sereď (855251)", cu: "855251"}
}, (e, r, json) =>
{
if (e)
{
if (e=="Error: read ECONNRESET")
{
console.log("<!-- try reconnect -->");
findParcelaSub(ltext, cu, parcela, kategoria, h);
return;
}
console.log("error: " + e);
_ASSERT(0);
h();
return;
}
for (var i in json)
{
if (json[i].txt == parcela && json[i].category == "parcela-"+kategoria)
{
h(detailToGeometry(json[i].detailLink, kategoria));
return;
}
}
});
}
function downloadJson(url, h)
{
request({
url: url,
method: "GET",
}, (e, r, data) =>
{
if (e)
{
console.log("Chyba pri stahovani: "+url)
_ASSERT(0);
console.log("error: " + e);
h();
return;
}
h(JSON.parse(data));
});
}
function detailToGeometry(url, register)
{
var match = url.match("\\((\\d+)\\)");
if (match && match.length == 2)
return "https://kataster.skgeodesy.sk/eskn/rest/services/VRM/parcels_" + register + "_view/MapServer/0/" +
"query?objectIds="+match[1]+"&returnGeometry=true&outSR=4326&f=json";
}
function dumpKmlHeader()
{
var l = (x) => console.log(x);
l('<?xml version="1.0" encoding="UTF-8"?>');
l('<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">');
l('<Document>');
l('<name>Kataster portal kml report</name>');
}
lastgroupid = "";
curgroupidi = 0;
function dumpKmlFooter()
{
var l = (x) => console.log(x);
if (curgroupidi > 0)
l('</Folder>');
l('</Document>');
l('</kml>');
}
function dumpKmlPolygon(folder, id, groupid, grouppoly)
{
var l = (x) => console.log(x);
var colors = ['#058DC7', '#50B432', '#ED561B', '#DDDF00', '#24CBE5', '#64E572',
'#FF9655', '#FFF263', '#6AF9C4',
'#ff0000', '#00ff00', '#0000ff', "#ffff00", "#ff00ff", "#00ffff"];
if (lastgroupid != groupid)
{
if (curgroupidi > 0)
l('</Folder>');
lastgroupid = groupid;
curgroupidi++;
l('<Folder>');
l('<open>1</open>');
l('<name>' + folder + "</name>");
}
var color = colors[curgroupidi % colors.length].substr(1);
for (var j = 0; j<grouppoly.length; j++)
{
var poly = grouppoly[j];
_ASSERT(poly[0][0] == poly[poly.length-1][0] && poly[0][1] == poly[poly.length-1][1]);
l('<Placemark>');
l('<Style>');
l('<LineStyle><width>1.0</width><color>ff' + color + '</color></LineStyle>');
l('<PolyStyle><color>80' + color + '</color><fill>1</fill></PolyStyle>');
l('</Style>');
if (grouppoly.length>1)
l('<name>' + id + ' ('+(j+1)+"/"+grouppoly.length+ ')</name>');
else
l('<name>' + id + '</name>');
l('<Polygon>');
l('<tessellate>1</tessellate>');
l('<outerBoundaryIs>');
l('<LinearRing>');
l('<coordinates>');
for (var i in poly)
{
l(poly[i][0].toFixed(7) + "," + poly[i][1].toFixed(7)+",0");
}
l('</coordinates>');
l('</LinearRing>');
l('</outerBoundaryIs>');
l('</Polygon>');
l('</Placemark>');
}
}
dumpKmlHeader();
function findContinue()
{
var rec = list.shift();
console.log("<!-- hladam " + rec.lv + " - " + rec.parcela + " (" + rec.register + ") -->");
findParcela(rec.parcela, rec.register, (l) => {
downloadJson(l, (data) => {
if (!data)
{
_ASSERT(0);
console.log("<!-- chyba! -->");
findDone();
return;
}
_ASSERT(data.features.length == 1);
_ASSERT(data.features[0].attributes["PARCEL_NUMBER"] == rec.parcela);
var poly = data.features[0].geometry.rings;
dumpKmlPolygon("LV: "+rec.lv, rec.register.toUpperCase() + ": " + rec.parcela + " " + rec.pomer + " Plocha: " + rec.plocha, rec.lv, poly);
findDone();
})
});
}
function findDone()
{
if (list.length > 0)
{
findContinue();
return;
}
dumpKmlFooter();
}
findContinue();
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<Document>
<name>Kataster portal kml report</name>
<!-- hladam 5124 - 1372 (e) -->
<Folder>
<open>1</open>
<name>LV: 5124</name>
<Placemark>
<Style>
<LineStyle><width>1.0</width><color>ff50B432</color></LineStyle>
<PolyStyle><color>8050B432</color><fill>1</fill></PolyStyle>
</Style>
<name>E: 1372 1/5 Plocha: 5355</name>
<Polygon>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates>
17.7257366,48.2636322,0
17.7256147,48.2635569,0
17.7238495,48.2654334,0
17.7219969,48.2673649,0
17.7220401,48.2673956,0
17.7220988,48.2674364,0
17.7257366,48.2636322,0
</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
<!-- hladam 5124 - 1373/201 (e) -->
<Placemark>
<Style>
<LineStyle><width>1.0</width><color>ff50B432</color></LineStyle>
<PolyStyle><color>8050B432</color><fill>1</fill></PolyStyle>
</Style>
<name>E: 1373/201 1/5 Plocha: 3174</name>
<Polygon>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates>
17.7220735,48.2674669,0
17.7219652,48.2673908,0
17.7199124,48.2695065,0
17.7200940,48.2694999,0
17.7201054,48.2694980,0
17.7220735,48.2674669,0
</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
<!-- hladam 5124 - 1373/202 (e) -->
<Placemark>
<Style>
<LineStyle><width>1.0</width><color>ff50B432</color></LineStyle>
<PolyStyle><color>8050B432</color><fill>1</fill></PolyStyle>
</Style>
<name>E: 1373/202 1/5 Plocha: 1257</name>
<Polygon>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates>
17.7201054,48.2694980,0
17.7200940,48.2694999,0
17.7199124,48.2695065,0
17.7192993,48.2701384,0
17.7191580,48.2702840,0
17.7192328,48.2703984,0
17.7201054,48.2694980,0
</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
</Folder>
</Document>
</kml>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment