react-native-mapsforge-vtm
Version:
React Native components to build vector maps using Mapsforges fork of vtm. Offline rendering of OpenStreetMap data. Android only
162 lines (158 loc) • 6.84 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = require("react");
var _useRefState = _interopRequireDefault(require("../compose/useRefState.js"));
var _promiseQueue = _interopRequireDefault(require("../promiseQueue.js"));
var _nativeMapModules = require("../nativeMapModules.js");
var _lodashEs = require("lodash-es");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/**
* External dependencies
*/
/**
* Internal dependencies
*/
const Module = _nativeMapModules.MapLayerHillshadingModule;
const shadingAlgorithms = {
CLASY_ADAPTIVE: 'AdaptiveClasyHillShading',
// https://github.com/mapsforge/mapsforge/blob/master/mapsforge-map/src/main/java/org/mapsforge/map/layer/hills/AdaptiveClasyHillShading.java
CLASY_STANDARD: 'StandardClasyHillShading',
// https://github.com/mapsforge/mapsforge/blob/master/mapsforge-map/src/main/java/org/mapsforge/map/layer/hills/StandardClasyHillShading.java
CLASY_SIMPLE: 'SimpleClasyHillShading',
// https://github.com/mapsforge/mapsforge/blob/master/mapsforge-map/src/main/java/org/mapsforge/map/layer/hills/SimpleClasyHillShading.java
CLASY_HALF_RES: 'HalfResClasyHillShading',
// https://github.com/mapsforge/mapsforge/blob/master/mapsforge-map/src/main/java/org/mapsforge/map/layer/hills/HalfResClasyHillShading.java
CLASY_HI_RES: 'HiResClasyHillShading',
// https://github.com/mapsforge/mapsforge/blob/master/mapsforge-map/src/main/java/org/mapsforge/map/layer/hills/HiResClasyHillShading.java
SIMPLE: 'SimpleShadingAlgorithm',
// https://github.com/mapsforge/mapsforge/blob/master/mapsforge-map/src/main/java/org/mapsforge/map/layer/hills/SimpleShadingAlgorithm.java
DIFFUSE_LIGHT: 'DiffuseLightShadingAlgorithm' // https://github.com/mapsforge/mapsforge/blob/master/mapsforge-map/src/main/java/org/mapsforge/map/layer/hills/DiffuseLightShadingAlgorithm.java
};
const clasyParamsKeys = ['maxSlope', 'minSlope', 'asymmetryFactor', 'readingThreadsCount', 'computingThreadsCount', 'isPreprocess'];
const shadingAlgorithmsOptionKeys = {
CLASY_ADAPTIVE: [...clasyParamsKeys, 'isHqEnabled', 'qualityScale'],
CLASY_STANDARD: clasyParamsKeys,
CLASY_SIMPLE: clasyParamsKeys,
CLASY_HALF_RES: clasyParamsKeys,
CLASY_HI_RES: clasyParamsKeys,
SIMPLE: ['linearity', 'scale'],
DIFFUSE_LIGHT: ['heightAngle']
};
const shadingAlgorithmOptionsDefaults = {
linearity: 0.1,
// 1 or higher for linear grade, 0 or lower for a triple-applied sine of grade that gives high emphasis on changes in slope in near-flat areas, but reduces details within steep slopes (default 0.1).
scale: 0.666,
// scales the input slopes, with lower values slopes will saturate later, but nuances closer to flat will suffer (default: 0.666)
heightAngle: 50,
// height angle of light source over ground (in degrees 0..90)
maxSlope: 80,
minSlope: 0,
asymmetryFactor: 0.5,
readingThreadsCount: -1,
// -1 and java fallback Math.max(1, AvailableProcessors);
computingThreadsCount: -1,
// -1 and java fallback AvailableProcessors
isPreprocess: true,
isHqEnabled: true,
qualityScale: 1
};
const LayerHillshading = ({
nativeNodeHandle,
hgtDirPath,
zoomMin = 6,
zoomMax = 20,
enabledZoomMin = 6,
enabledZoomMax = 20,
shadingAlgorithm = shadingAlgorithms.SIMPLE,
shadingAlgorithmOptions = shadingAlgorithmOptionsDefaults,
magnitude = 90,
cacheSize = 64,
cacheDirBase = '/',
// if `/`, will fallback to java getReactApplicationContext().getCacheDir();
cacheDirChild = '',
// if ``, will fallback to cache dbname;
reactTreeIndex,
onCreate,
onRemove,
onChange,
onError
}) => {
// @ts-ignore
const [random, setRandom] = (0, _react.useState)(0);
const [uuid, setUuid] = (0, _useRefState.default)(null);
const [triggerCreateNew, setTriggerCreateNew] = (0, _react.useState)(null);
shadingAlgorithmOptions = {
...shadingAlgorithmOptionsDefaults,
...shadingAlgorithmOptions
};
magnitude = Math.round(magnitude);
cacheSize = Math.round(cacheSize);
const createLayer = () => {
setUuid(false);
_promiseQueue.default.enqueue(() => {
return Module.createLayer(nativeNodeHandle, hgtDirPath, Math.round(zoomMin), Math.round(zoomMax), Math.round(enabledZoomMin), Math.round(enabledZoomMax), shadingAlgorithm, shadingAlgorithmOptions, Math.round(magnitude), Math.round(cacheSize), cacheDirBase.trim(), cacheDirChild.trim(), reactTreeIndex).then(response => {
setUuid(response.uuid);
setRandom(Math.random());
null === triggerCreateNew ? onCreate ? onCreate(response) : null : onChange ? onChange(response) : null;
}).catch(err => {
console.log('ERROR', err);
onError ? onError(err) : null;
});
});
};
(0, _react.useEffect)(() => {
if (uuid === null && nativeNodeHandle) {
createLayer();
}
return () => {
if (uuid && nativeNodeHandle) {
_promiseQueue.default.enqueue(() => {
return Module.removeLayer(nativeNodeHandle, uuid).then(removedUuid => {
onRemove ? onRemove({
uuid: removedUuid
}) : null;
}).catch(err => {
console.log('ERROR', err);
onError ? onError(err) : null;
});
});
}
};
}, [nativeNodeHandle, !!uuid, triggerCreateNew]);
// enabledZoomMin enabledZoomMax changed.
(0, _react.useEffect)(() => {
if (nativeNodeHandle && uuid) {
Module.updateEnabledZoomMinMax(nativeNodeHandle, uuid, Math.round(enabledZoomMin), Math.round(enabledZoomMax)).catch(err => {
console.log('ERROR', err);
onError ? onError(err) : null;
});
}
}, [enabledZoomMin, enabledZoomMax]);
(0, _react.useEffect)(() => {
if (nativeNodeHandle) {
if (uuid) {
_promiseQueue.default.enqueue(() => {
return Module.removeLayer(nativeNodeHandle, uuid).then(() => {
setUuid(null);
setTriggerCreateNew(Math.random());
}).catch(err => {
console.log('ERROR', err);
onError ? onError(err) : null;
});
});
}
} else if (uuid === null && hgtDirPath) {
setTriggerCreateNew(Math.random());
}
}, [hgtDirPath, zoomMin, zoomMax, shadingAlgorithm, magnitude, cacheSize, cacheDirBase, cacheDirChild, Object.keys(shadingAlgorithmOptions).map(key => key + (0, _lodashEs.get)(shadingAlgorithmOptions, key)).join('')]);
return null;
};
LayerHillshading.isMapLayer = true;
LayerHillshading.shadingAlgorithms = shadingAlgorithms;
LayerHillshading.shadingAlgorithmsOptionKeys = shadingAlgorithmsOptionKeys;
LayerHillshading.shadingAlgorithmOptionsDefaults = shadingAlgorithmOptionsDefaults;
var _default = exports.default = LayerHillshading;
//# sourceMappingURL=LayerHillshading.js.map