landxml/lib/parcel.js

79 lines
2.7 KiB
JavaScript

import { getProp, parseSequence, getColor } from './util'
import { polygon } from '@turf/helpers';
import proj4 from 'proj4';
export const LANDXML_PARCEL = 'parcel';
export function convertParcels(xmlObj, projection, opts) {
const originalPoints = getProp(xmlObj, "LandXML", "CgPoints", 0, "CgPoint");
const originalParcels = getProp(xmlObj, "LandXML", "Parcels", 0, "Parcel");
const points = {}
const polygons = []
// Parse out the points
for ( let pt in originalPoints ) {
const opt = originalPoints[pt]
const name = opt.$.name.replace(/ /g,'');
let coords = parseSequence(opt._).map(coord => parseFloat(coord))
coords = [coords[1], coords[0], coords[2]]
coords = proj4(projection, 'WGS84', coords)
points[name] = coords
}
// Parse out the parcels
for ( let pc in originalParcels) {
var opc = originalParcels[pc]
var geom = opc.CoordGeom
if (geom !== undefined) {
let coords = []
// Need to store the start to add at the end
var endCoord = null
var origCoords = opc.CoordGeom[0].Line
for (let oc in origCoords) {
// VERY important note. This code does NOT handle the other two types
// of coordinate definitions, curves and irregular lines. TODO: fixme.
var start = origCoords[oc].Start[0].$.pntRef
// We don't use the end (it probably should be checked, because if the end isn't the start)
var end = origCoords[oc].End[0].$.pntRef
var startPoint = points[start]
if (!startPoint) {
// console.log('Failed to get start point', start, startPoint)
} else {
// Start creating the polygon
coords.push(points[start])
if (!endCoord) {
// Store the first coord, to put back on to close the polygon
endCoord = points[start]
}
}
}
if (coords.length > 2) {
coords.push(endCoord)
coords = [coords]
// name="101" class="Lot" state="proposed" parcelType="Single"
var parameters = {
name: opc.$.name,
landxmlClass: opc.$.class,
landxmlState: opc.$.state,
landxmlParcelType: opc.$.parcelType,
landxmlType: LANDXML_PARCEL,
landxmlColor: getColor(`parcel-${name}`, opts.colorOpts),
}
polygons.push(polygon(coords, parameters))
} else {
// console.log("Couldn't create a polygon because we found less than 2 coords")
}
} else {
// console.log("No geometry")
}
}
return polygons;
}