@performant-software/geospatial 2.1.0-beta.4 → 2.1.0-beta.40
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/index.cjs.js +1 -1
- package/dist/index.cjs10.js +1 -1
- package/dist/index.cjs10.js.map +1 -1
- package/dist/index.cjs11.js +1 -1
- package/dist/index.cjs11.js.map +1 -1
- package/dist/index.cjs110.js +1 -1
- package/dist/index.cjs111.js +1 -1
- package/dist/index.cjs113.js +1 -1
- package/dist/index.cjs117.js +1 -1
- package/dist/index.cjs12.js +1 -1
- package/dist/index.cjs12.js.map +1 -1
- package/dist/index.cjs13.js +1 -1
- package/dist/index.cjs13.js.map +1 -1
- package/dist/index.cjs14.js +1 -1
- package/dist/index.cjs14.js.map +1 -1
- package/dist/index.cjs15.js +1 -1
- package/dist/index.cjs15.js.map +1 -1
- package/dist/index.cjs150.js +1 -1
- package/dist/index.cjs153.js +1 -1
- package/dist/index.cjs155.js +1 -1
- package/dist/index.cjs16.js +1 -1
- package/dist/index.cjs16.js.map +1 -1
- package/dist/index.cjs163.js +1 -1
- package/dist/index.cjs168.js +1 -1
- package/dist/index.cjs169.js +1 -1
- package/dist/index.cjs17.js +1 -1
- package/dist/index.cjs17.js.map +1 -1
- package/dist/index.cjs170.js +1 -1
- package/dist/index.cjs171.js +1 -1
- package/dist/index.cjs172.js +1 -1
- package/dist/index.cjs18.js +1 -1
- package/dist/index.cjs18.js.map +1 -1
- package/dist/index.cjs19.js +1 -1
- package/dist/index.cjs19.js.map +1 -1
- package/dist/index.cjs199.js +1 -1
- package/dist/index.cjs2.js +1 -1
- package/dist/index.cjs20.js +1 -1
- package/dist/index.cjs20.js.map +1 -1
- package/dist/index.cjs200.js +1 -1
- package/dist/index.cjs201.js +1 -1
- package/dist/index.cjs205.js +1 -1
- package/dist/index.cjs206.js +1 -1
- package/dist/index.cjs208.js +1 -1
- package/dist/index.cjs209.js +1 -1
- package/dist/index.cjs21.js +1 -1
- package/dist/index.cjs21.js.map +1 -1
- package/dist/index.cjs211.js +1 -1
- package/dist/index.cjs216.js +1 -1
- package/dist/index.cjs218.js +1 -1
- package/dist/index.cjs22.js +1 -1
- package/dist/index.cjs22.js.map +1 -1
- package/dist/index.cjs220.js +1 -1
- package/dist/index.cjs221.js +1 -1
- package/dist/index.cjs225.js +1 -1
- package/dist/index.cjs228.js +1 -1
- package/dist/index.cjs228.js.map +1 -1
- package/dist/index.cjs229.js +1 -1
- package/dist/index.cjs229.js.map +1 -1
- package/dist/index.cjs23.js +1 -1
- package/dist/index.cjs23.js.map +1 -1
- package/dist/index.cjs238.js +1 -1
- package/dist/index.cjs24.js +1 -1
- package/dist/index.cjs24.js.map +1 -1
- package/dist/index.cjs243.js +1 -1
- package/dist/index.cjs246.js +1 -1
- package/dist/index.cjs25.js +1 -1
- package/dist/index.cjs25.js.map +1 -1
- package/dist/index.cjs250.js +1 -1
- package/dist/index.cjs250.js.map +1 -1
- package/dist/index.cjs251.js +1 -1
- package/dist/index.cjs251.js.map +1 -1
- package/dist/index.cjs26.js +1 -1
- package/dist/index.cjs26.js.map +1 -1
- package/dist/index.cjs27.js +1 -1
- package/dist/index.cjs27.js.map +1 -1
- package/dist/index.cjs28.js +1 -1
- package/dist/index.cjs28.js.map +1 -1
- package/dist/index.cjs29.js +1 -1
- package/dist/index.cjs29.js.map +1 -1
- package/dist/index.cjs3.js +1 -1
- package/dist/index.cjs3.js.map +1 -1
- package/dist/index.cjs30.js +1 -1
- package/dist/index.cjs30.js.map +1 -1
- package/dist/index.cjs31.js +1 -1
- package/dist/index.cjs31.js.map +1 -1
- package/dist/index.cjs32.js +1 -1
- package/dist/index.cjs32.js.map +1 -1
- package/dist/index.cjs33.js +1 -1
- package/dist/index.cjs33.js.map +1 -1
- package/dist/index.cjs34.js +1 -1
- package/dist/index.cjs34.js.map +1 -1
- package/dist/index.cjs35.js +1 -1
- package/dist/index.cjs35.js.map +1 -1
- package/dist/index.cjs36.js +1 -1
- package/dist/index.cjs36.js.map +1 -1
- package/dist/index.cjs37.js +1 -1
- package/dist/index.cjs37.js.map +1 -1
- package/dist/index.cjs38.js +1 -1
- package/dist/index.cjs38.js.map +1 -1
- package/dist/index.cjs39.js +1 -1
- package/dist/index.cjs39.js.map +1 -1
- package/dist/index.cjs4.js +1 -1
- package/dist/index.cjs40.js +1 -1
- package/dist/index.cjs40.js.map +1 -1
- package/dist/index.cjs41.js +1 -1
- package/dist/index.cjs41.js.map +1 -1
- package/dist/index.cjs42.js +1 -1
- package/dist/index.cjs42.js.map +1 -1
- package/dist/index.cjs43.js +1 -1
- package/dist/index.cjs43.js.map +1 -1
- package/dist/index.cjs44.js +1 -1
- package/dist/index.cjs44.js.map +1 -1
- package/dist/index.cjs45.js +1 -1
- package/dist/index.cjs45.js.map +1 -1
- package/dist/index.cjs46.js +1 -1
- package/dist/index.cjs5.js +1 -1
- package/dist/index.cjs5.js.map +1 -1
- package/dist/index.cjs52.js +1 -1
- package/dist/index.cjs53.js +1 -9
- package/dist/index.cjs53.js.map +1 -1
- package/dist/index.cjs54.js +1 -19
- package/dist/index.cjs54.js.map +1 -1
- package/dist/index.cjs55.js +9 -1
- package/dist/index.cjs55.js.map +1 -1
- package/dist/index.cjs56.js +19 -1
- package/dist/index.cjs56.js.map +1 -1
- package/dist/index.cjs6.js +1 -1
- package/dist/index.cjs62.js +1 -1
- package/dist/index.cjs63.js +1 -1
- package/dist/index.cjs68.js +1 -1
- package/dist/index.cjs7.js +1 -1
- package/dist/index.cjs77.js +1 -1
- package/dist/index.cjs78.js +1 -1
- package/dist/index.cjs79.js +1 -1
- package/dist/index.cjs8.js +1 -1
- package/dist/index.cjs80.js +1 -1
- package/dist/index.cjs81.js +1 -1
- package/dist/index.cjs82.js +1 -1
- package/dist/index.cjs84.js +1 -1
- package/dist/index.cjs86.js +1 -1
- package/dist/index.cjs87.js +1 -1
- package/dist/index.cjs9.js +1 -1
- package/dist/index.cjs9.js.map +1 -1
- package/dist/index.cjs91.js +1 -1
- package/dist/index.es.js +8 -6
- package/dist/index.es.js.map +1 -1
- package/dist/index.es10.js +39 -2102
- package/dist/index.es10.js.map +1 -1
- package/dist/index.es11.js +2102 -19
- package/dist/index.es11.js.map +1 -1
- package/dist/index.es110.js +2 -2
- package/dist/index.es111.js +1 -1
- package/dist/index.es113.js +1 -1
- package/dist/index.es117.js +1 -1
- package/dist/index.es12.js +19 -12
- package/dist/index.es12.js.map +1 -1
- package/dist/index.es13.js +12 -6
- package/dist/index.es13.js.map +1 -1
- package/dist/index.es14.js +6 -5
- package/dist/index.es14.js.map +1 -1
- package/dist/index.es15.js +6 -28
- package/dist/index.es15.js.map +1 -1
- package/dist/index.es150.js +1 -1
- package/dist/index.es153.js +1 -1
- package/dist/index.es155.js +1 -1
- package/dist/index.es16.js +6 -8
- package/dist/index.es16.js.map +1 -1
- package/dist/index.es163.js +1 -1
- package/dist/index.es168.js +1 -1
- package/dist/index.es169.js +1 -1
- package/dist/index.es17.js +5 -5
- package/dist/index.es17.js.map +1 -1
- package/dist/index.es170.js +1 -1
- package/dist/index.es171.js +1 -1
- package/dist/index.es172.js +1 -1
- package/dist/index.es18.js +28 -10
- package/dist/index.es18.js.map +1 -1
- package/dist/index.es19.js +8 -17
- package/dist/index.es19.js.map +1 -1
- package/dist/index.es199.js +1 -1
- package/dist/index.es2.js +3 -3
- package/dist/index.es20.js +5 -5
- package/dist/index.es20.js.map +1 -1
- package/dist/index.es200.js +1 -1
- package/dist/index.es201.js +1 -1
- package/dist/index.es205.js +1 -1
- package/dist/index.es206.js +2 -2
- package/dist/index.es208.js +1 -1
- package/dist/index.es209.js +2 -2
- package/dist/index.es21.js +9 -4
- package/dist/index.es21.js.map +1 -1
- package/dist/index.es211.js +2 -2
- package/dist/index.es216.js +1 -1
- package/dist/index.es218.js +1 -1
- package/dist/index.es22.js +17 -5
- package/dist/index.es22.js.map +1 -1
- package/dist/index.es220.js +1 -1
- package/dist/index.es221.js +1 -1
- package/dist/index.es225.js +1 -1
- package/dist/index.es228.js +3 -8
- package/dist/index.es228.js.map +1 -1
- package/dist/index.es229.js +8 -3
- package/dist/index.es229.js.map +1 -1
- package/dist/index.es23.js +5 -7
- package/dist/index.es23.js.map +1 -1
- package/dist/index.es238.js +1 -1
- package/dist/index.es24.js +5 -7
- package/dist/index.es24.js.map +1 -1
- package/dist/index.es243.js +1 -1
- package/dist/index.es246.js +1 -1
- package/dist/index.es25.js +5 -4
- package/dist/index.es25.js.map +1 -1
- package/dist/index.es250.js +15 -4
- package/dist/index.es250.js.map +1 -1
- package/dist/index.es251.js +4 -15
- package/dist/index.es251.js.map +1 -1
- package/dist/index.es26.js +7 -4
- package/dist/index.es26.js.map +1 -1
- package/dist/index.es27.js +6 -6
- package/dist/index.es27.js.map +1 -1
- package/dist/index.es28.js +4 -15
- package/dist/index.es28.js.map +1 -1
- package/dist/index.es29.js +4 -12
- package/dist/index.es29.js.map +1 -1
- package/dist/index.es3.js +22 -63
- package/dist/index.es3.js.map +1 -1
- package/dist/index.es30.js +7 -15
- package/dist/index.es30.js.map +1 -1
- package/dist/index.es31.js +14 -6
- package/dist/index.es31.js.map +1 -1
- package/dist/index.es32.js +12 -5
- package/dist/index.es32.js.map +1 -1
- package/dist/index.es33.js +15 -4
- package/dist/index.es33.js.map +1 -1
- package/dist/index.es34.js +6 -17
- package/dist/index.es34.js.map +1 -1
- package/dist/index.es35.js +5 -18
- package/dist/index.es35.js.map +1 -1
- package/dist/index.es36.js +4 -14
- package/dist/index.es36.js.map +1 -1
- package/dist/index.es37.js +17 -5
- package/dist/index.es37.js.map +1 -1
- package/dist/index.es38.js +17 -6
- package/dist/index.es38.js.map +1 -1
- package/dist/index.es39.js +12 -8
- package/dist/index.es39.js.map +1 -1
- package/dist/index.es4.js +8 -8
- package/dist/index.es40.js +6 -4
- package/dist/index.es40.js.map +1 -1
- package/dist/index.es41.js +6 -18
- package/dist/index.es41.js.map +1 -1
- package/dist/index.es42.js +10 -6
- package/dist/index.es42.js.map +1 -1
- package/dist/index.es43.js +4 -6
- package/dist/index.es43.js.map +1 -1
- package/dist/index.es44.js +21 -1
- package/dist/index.es44.js.map +1 -1
- package/dist/index.es45.js +1 -39
- package/dist/index.es45.js.map +1 -1
- package/dist/index.es46.js +2 -2
- package/dist/index.es5.js +27 -19
- package/dist/index.es5.js.map +1 -1
- package/dist/index.es52.js +6 -2
- package/dist/index.es52.js.map +1 -1
- package/dist/index.es53.js +2 -30
- package/dist/index.es53.js.map +1 -1
- package/dist/index.es54.js +2 -602
- package/dist/index.es54.js.map +1 -1
- package/dist/index.es55.js +29 -5
- package/dist/index.es55.js.map +1 -1
- package/dist/index.es56.js +602 -2
- package/dist/index.es56.js.map +1 -1
- package/dist/index.es57.js +2 -2
- package/dist/index.es6.js +6 -6
- package/dist/index.es62.js +26 -26
- package/dist/index.es63.js +2 -2
- package/dist/index.es68.js +1 -1
- package/dist/index.es7.js +7 -7
- package/dist/index.es77.js +2 -2
- package/dist/index.es78.js +1 -1
- package/dist/index.es79.js +1 -1
- package/dist/index.es8.js +2 -2
- package/dist/index.es80.js +1 -1
- package/dist/index.es81.js +1 -1
- package/dist/index.es82.js +1 -1
- package/dist/index.es84.js +4 -4
- package/dist/index.es86.js +1 -1
- package/dist/index.es87.js +1 -1
- package/dist/index.es9.js +18 -10
- package/dist/index.es9.js.map +1 -1
- package/dist/index.es91.js +1 -1
- package/package.json +2 -2
- package/src/components/GeoJsonLayer.js +10 -66
- package/src/components/LocationMarkers.js +51 -8
- package/src/index.js +1 -0
- package/src/utils/Map.js +29 -1
- package/src/utils/MapStyles.js +9 -3
- package/types/components/GeoJsonLayer.js.flow +10 -66
- package/types/components/LocationMarkers.js.flow +51 -8
- package/types/index.js.flow +1 -0
- package/types/utils/Map.js.flow +29 -1
- package/types/utils/MapStyles.js.flow +9 -3
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
// @flow
|
|
2
2
|
|
|
3
3
|
import React, {
|
|
4
|
-
useCallback,
|
|
5
4
|
useEffect,
|
|
6
|
-
useMemo,
|
|
7
5
|
useState
|
|
8
6
|
} from 'react';
|
|
9
7
|
import { Layer, Source } from 'react-map-gl';
|
|
10
|
-
import
|
|
8
|
+
import MapStyles from '../utils/MapStyles';
|
|
11
9
|
|
|
12
10
|
type Props = {
|
|
13
11
|
data?: { [key: string]: any },
|
|
@@ -17,69 +15,9 @@ type Props = {
|
|
|
17
15
|
url?: string
|
|
18
16
|
};
|
|
19
17
|
|
|
20
|
-
const DEFAULT_COLOR = '#CC3333';
|
|
21
|
-
const HIGHLIGHT_COLOR = '#990000';
|
|
22
|
-
|
|
23
|
-
const DEFAULT_FILL_STYLES = {
|
|
24
|
-
'fill-color': DEFAULT_COLOR,
|
|
25
|
-
'fill-opacity': 0.2
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
const DEFAULT_LINE_STYLES = {
|
|
29
|
-
'line-color': HIGHLIGHT_COLOR,
|
|
30
|
-
'line-opacity': 0.6
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const DEFAULT_POINT_STYLES = {
|
|
34
|
-
'circle-radius': [
|
|
35
|
-
'interpolate',
|
|
36
|
-
['linear'],
|
|
37
|
-
['number', ['get', 'point_count'], 1],
|
|
38
|
-
0, 4,
|
|
39
|
-
10, 14
|
|
40
|
-
],
|
|
41
|
-
'circle-stroke-width': 1,
|
|
42
|
-
'circle-color': DEFAULT_COLOR,
|
|
43
|
-
'circle-stroke-color': HIGHLIGHT_COLOR
|
|
44
|
-
};
|
|
45
|
-
|
|
46
18
|
const GeoJsonLayer = (props: Props) => {
|
|
47
19
|
const [data, setData] = useState(props.data);
|
|
48
20
|
|
|
49
|
-
/**
|
|
50
|
-
* Returns the layer style for the passed style and default.
|
|
51
|
-
*
|
|
52
|
-
* @type {function(*, *): *}
|
|
53
|
-
*/
|
|
54
|
-
const getLayerStyles = useCallback((style, defaultStyle) => _.defaults(style, defaultStyle), []);
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Sets the fill layer style.
|
|
58
|
-
*
|
|
59
|
-
* @type {*}
|
|
60
|
-
*/
|
|
61
|
-
const fillStyle = useMemo(() => (
|
|
62
|
-
getLayerStyles(props.fillStyle, DEFAULT_FILL_STYLES)
|
|
63
|
-
), [getLayerStyles, props.fillStyle]);
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Sets the line layer style.
|
|
67
|
-
*
|
|
68
|
-
* @type {*}
|
|
69
|
-
*/
|
|
70
|
-
const lineStyle = useMemo(() => (
|
|
71
|
-
getLayerStyles(props.lineStyle, DEFAULT_LINE_STYLES)
|
|
72
|
-
), [getLayerStyles, props.lineStyle]);
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Sets the point layer style.
|
|
76
|
-
*
|
|
77
|
-
* @type {*}
|
|
78
|
-
*/
|
|
79
|
-
const pointStyle = useMemo(() => (
|
|
80
|
-
getLayerStyles(props.pointStyle, DEFAULT_POINT_STYLES)
|
|
81
|
-
), [getLayerStyles, props.pointStyle]);
|
|
82
|
-
|
|
83
21
|
/**
|
|
84
22
|
* If the data is passed as a URL, fetches the passed URL and sets the response on the state.
|
|
85
23
|
*/
|
|
@@ -98,21 +36,27 @@ const GeoJsonLayer = (props: Props) => {
|
|
|
98
36
|
>
|
|
99
37
|
<Layer
|
|
100
38
|
filter={['!=', '$type', 'Point']}
|
|
101
|
-
paint={fillStyle}
|
|
39
|
+
paint={props.fillStyle}
|
|
102
40
|
type='fill'
|
|
103
41
|
/>
|
|
104
42
|
<Layer
|
|
105
43
|
filter={['!=', '$type', 'Point']}
|
|
106
|
-
paint={lineStyle}
|
|
44
|
+
paint={props.lineStyle}
|
|
107
45
|
type='line'
|
|
108
46
|
/>
|
|
109
47
|
<Layer
|
|
110
48
|
filter={['==', '$type', 'Point']}
|
|
111
|
-
paint={pointStyle}
|
|
49
|
+
paint={props.pointStyle}
|
|
112
50
|
type='circle'
|
|
113
51
|
/>
|
|
114
52
|
</Source>
|
|
115
53
|
);
|
|
116
54
|
};
|
|
117
55
|
|
|
56
|
+
GeoJsonLayer.defaultProps = {
|
|
57
|
+
fillStyle: MapStyles.fill,
|
|
58
|
+
pointStyle: MapStyles.point,
|
|
59
|
+
strokeStyle: MapStyles.stroke
|
|
60
|
+
};
|
|
61
|
+
|
|
118
62
|
export default GeoJsonLayer;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// @flow
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { GeoJSONLayer, PulsingMarkerLayer, useMap } from '@peripleo/maplibre';
|
|
4
4
|
import React, { useEffect } from 'react';
|
|
5
|
-
import
|
|
5
|
+
import MapStyles from '../utils/MapStyles';
|
|
6
6
|
import MapUtils from '../utils/Map';
|
|
7
7
|
|
|
8
8
|
type Props = {
|
|
@@ -16,6 +16,31 @@ type Props = {
|
|
|
16
16
|
*/
|
|
17
17
|
buffer: number,
|
|
18
18
|
|
|
19
|
+
/**
|
|
20
|
+
* If true, markers will be clustered before the specified zoom level.
|
|
21
|
+
*/
|
|
22
|
+
cluster?: boolean,
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Max zoom to cluster points on.
|
|
26
|
+
*/
|
|
27
|
+
clusterMaxZoom?: number,
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Minimum number of points necessary to form a cluster.
|
|
31
|
+
*/
|
|
32
|
+
clusterMinPoints?: number,
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* An object defining custom properties on the generated clusters.
|
|
36
|
+
*/
|
|
37
|
+
clusterProperties?: any,
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Radius of each cluster when clustering point.
|
|
41
|
+
*/
|
|
42
|
+
clusterRadius?: number,
|
|
43
|
+
|
|
19
44
|
/**
|
|
20
45
|
* The GeoJSON data representing the location.
|
|
21
46
|
*/
|
|
@@ -26,6 +51,16 @@ type Props = {
|
|
|
26
51
|
*/
|
|
27
52
|
fillStyle?: { [key: string]: any },
|
|
28
53
|
|
|
54
|
+
/**
|
|
55
|
+
* If `true`, the map will fit the bounding box around the passed data.
|
|
56
|
+
*/
|
|
57
|
+
fitBoundingBox?: boolean,
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* An ID value to apply to the layer.
|
|
61
|
+
*/
|
|
62
|
+
layerId?: string,
|
|
63
|
+
|
|
29
64
|
/**
|
|
30
65
|
* GeoJSON layer point style.
|
|
31
66
|
*/
|
|
@@ -49,22 +84,29 @@ const LocationMarkers = (props: Props) => {
|
|
|
49
84
|
* Sets the bounding box on the map.
|
|
50
85
|
*/
|
|
51
86
|
useEffect(() => {
|
|
52
|
-
if (map && props.data) {
|
|
87
|
+
if (map && props.data && props.fitBoundingBox) {
|
|
53
88
|
const boundingBox = MapUtils.getBoundingBox(props.data, props.buffer);
|
|
54
89
|
map.fitBounds(boundingBox);
|
|
55
90
|
}
|
|
56
|
-
}, [map, props.buffer, props.data]);
|
|
91
|
+
}, [map, props.buffer, props.data, props.fitBoundingBox]);
|
|
57
92
|
|
|
58
93
|
return (
|
|
59
94
|
<>
|
|
60
95
|
{ props.animate && (
|
|
61
96
|
<PulsingMarkerLayer
|
|
62
97
|
data={props.data}
|
|
98
|
+
id={props.layerId}
|
|
63
99
|
/>
|
|
64
100
|
)}
|
|
65
|
-
<
|
|
101
|
+
<GeoJSONLayer
|
|
102
|
+
cluster={props.cluster}
|
|
103
|
+
clusterMaxZoom={props.clusterMaxZoom}
|
|
104
|
+
clusterMinPoints={props.clusterMinPoints}
|
|
105
|
+
clusterProperties={props.clusterProperties}
|
|
106
|
+
clusterRadius={props.clusterRadius}
|
|
66
107
|
data={props.data}
|
|
67
108
|
fillStyle={props.fillStyle}
|
|
109
|
+
id={props.layerId}
|
|
68
110
|
strokeStyle={props.strokeStyle}
|
|
69
111
|
pointStyle={props.pointStyle}
|
|
70
112
|
/>
|
|
@@ -74,9 +116,10 @@ const LocationMarkers = (props: Props) => {
|
|
|
74
116
|
|
|
75
117
|
LocationMarkers.defaultProps = {
|
|
76
118
|
buffer: DEFAULT_BUFFER,
|
|
77
|
-
fillStyle:
|
|
78
|
-
|
|
79
|
-
|
|
119
|
+
fillStyle: MapStyles.fill,
|
|
120
|
+
fitBoundingBox: true,
|
|
121
|
+
pointStyle: MapStyles.point,
|
|
122
|
+
strokeStyle: MapStyles.stroke
|
|
80
123
|
};
|
|
81
124
|
|
|
82
125
|
export default LocationMarkers;
|
package/src/index.js
CHANGED
package/src/utils/Map.js
CHANGED
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
import { bbox, bboxPolygon, buffer } from '@turf/turf';
|
|
4
4
|
|
|
5
|
+
const MIN_LATITUDE = -90;
|
|
6
|
+
const MAX_LATITUDE = 90;
|
|
7
|
+
const MIN_LONGITUDE = -180;
|
|
8
|
+
const MAX_LONGITUDE = 180;
|
|
9
|
+
|
|
5
10
|
/**
|
|
6
11
|
* Returns a bounding box for the passed geometry (with optional buffer).
|
|
7
12
|
*
|
|
@@ -30,6 +35,29 @@ const getBoundingBox = (geometry, bufferDistance = null) => {
|
|
|
30
35
|
return bbox(polygonBuffer);
|
|
31
36
|
};
|
|
32
37
|
|
|
38
|
+
/**
|
|
39
|
+
* Returns true if the passed coordinates are valid.
|
|
40
|
+
*
|
|
41
|
+
* @param coordinates
|
|
42
|
+
*
|
|
43
|
+
* @returns {boolean}
|
|
44
|
+
*/
|
|
45
|
+
const validateCoordinates = (coordinates) => {
|
|
46
|
+
let valid = false;
|
|
47
|
+
|
|
48
|
+
if (coordinates) {
|
|
49
|
+
const [latitude, longitude] = coordinates;
|
|
50
|
+
|
|
51
|
+
valid = latitude >= MIN_LATITUDE
|
|
52
|
+
&& latitude <= MAX_LATITUDE
|
|
53
|
+
&& longitude >= MIN_LONGITUDE
|
|
54
|
+
&& longitude <= MAX_LONGITUDE;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return valid;
|
|
58
|
+
};
|
|
59
|
+
|
|
33
60
|
export default {
|
|
34
|
-
getBoundingBox
|
|
61
|
+
getBoundingBox,
|
|
62
|
+
validateCoordinates
|
|
35
63
|
};
|
package/src/utils/MapStyles.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// @flow
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
const point = {
|
|
4
4
|
type: 'circle',
|
|
5
5
|
paint: {
|
|
6
6
|
'circle-radius': [
|
|
@@ -21,7 +21,7 @@ export const DEFAULT_POINT_STYLE = {
|
|
|
21
21
|
}
|
|
22
22
|
};
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
const fill = {
|
|
25
25
|
type: 'fill',
|
|
26
26
|
paint: {
|
|
27
27
|
'fill-color': '#ff623b',
|
|
@@ -29,10 +29,16 @@ export const DEFAULT_FILL_STYLE = {
|
|
|
29
29
|
}
|
|
30
30
|
};
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
const stroke = {
|
|
33
33
|
type: 'line',
|
|
34
34
|
paint: {
|
|
35
35
|
'line-color': '#ff623b',
|
|
36
36
|
'line-opacity': 0.6
|
|
37
37
|
}
|
|
38
38
|
};
|
|
39
|
+
|
|
40
|
+
export default {
|
|
41
|
+
point,
|
|
42
|
+
fill,
|
|
43
|
+
stroke
|
|
44
|
+
};
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
// @flow
|
|
2
2
|
|
|
3
3
|
import React, {
|
|
4
|
-
useCallback,
|
|
5
4
|
useEffect,
|
|
6
|
-
useMemo,
|
|
7
5
|
useState
|
|
8
6
|
} from 'react';
|
|
9
7
|
import { Layer, Source } from 'react-map-gl';
|
|
10
|
-
import
|
|
8
|
+
import MapStyles from '../utils/MapStyles';
|
|
11
9
|
|
|
12
10
|
type Props = {
|
|
13
11
|
data?: { [key: string]: any },
|
|
@@ -17,69 +15,9 @@ type Props = {
|
|
|
17
15
|
url?: string
|
|
18
16
|
};
|
|
19
17
|
|
|
20
|
-
const DEFAULT_COLOR = '#CC3333';
|
|
21
|
-
const HIGHLIGHT_COLOR = '#990000';
|
|
22
|
-
|
|
23
|
-
const DEFAULT_FILL_STYLES = {
|
|
24
|
-
'fill-color': DEFAULT_COLOR,
|
|
25
|
-
'fill-opacity': 0.2
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
const DEFAULT_LINE_STYLES = {
|
|
29
|
-
'line-color': HIGHLIGHT_COLOR,
|
|
30
|
-
'line-opacity': 0.6
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const DEFAULT_POINT_STYLES = {
|
|
34
|
-
'circle-radius': [
|
|
35
|
-
'interpolate',
|
|
36
|
-
['linear'],
|
|
37
|
-
['number', ['get', 'point_count'], 1],
|
|
38
|
-
0, 4,
|
|
39
|
-
10, 14
|
|
40
|
-
],
|
|
41
|
-
'circle-stroke-width': 1,
|
|
42
|
-
'circle-color': DEFAULT_COLOR,
|
|
43
|
-
'circle-stroke-color': HIGHLIGHT_COLOR
|
|
44
|
-
};
|
|
45
|
-
|
|
46
18
|
const GeoJsonLayer = (props: Props) => {
|
|
47
19
|
const [data, setData] = useState(props.data);
|
|
48
20
|
|
|
49
|
-
/**
|
|
50
|
-
* Returns the layer style for the passed style and default.
|
|
51
|
-
*
|
|
52
|
-
* @type {function(*, *): *}
|
|
53
|
-
*/
|
|
54
|
-
const getLayerStyles = useCallback((style, defaultStyle) => _.defaults(style, defaultStyle), []);
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Sets the fill layer style.
|
|
58
|
-
*
|
|
59
|
-
* @type {*}
|
|
60
|
-
*/
|
|
61
|
-
const fillStyle = useMemo(() => (
|
|
62
|
-
getLayerStyles(props.fillStyle, DEFAULT_FILL_STYLES)
|
|
63
|
-
), [getLayerStyles, props.fillStyle]);
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Sets the line layer style.
|
|
67
|
-
*
|
|
68
|
-
* @type {*}
|
|
69
|
-
*/
|
|
70
|
-
const lineStyle = useMemo(() => (
|
|
71
|
-
getLayerStyles(props.lineStyle, DEFAULT_LINE_STYLES)
|
|
72
|
-
), [getLayerStyles, props.lineStyle]);
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Sets the point layer style.
|
|
76
|
-
*
|
|
77
|
-
* @type {*}
|
|
78
|
-
*/
|
|
79
|
-
const pointStyle = useMemo(() => (
|
|
80
|
-
getLayerStyles(props.pointStyle, DEFAULT_POINT_STYLES)
|
|
81
|
-
), [getLayerStyles, props.pointStyle]);
|
|
82
|
-
|
|
83
21
|
/**
|
|
84
22
|
* If the data is passed as a URL, fetches the passed URL and sets the response on the state.
|
|
85
23
|
*/
|
|
@@ -98,21 +36,27 @@ const GeoJsonLayer = (props: Props) => {
|
|
|
98
36
|
>
|
|
99
37
|
<Layer
|
|
100
38
|
filter={['!=', '$type', 'Point']}
|
|
101
|
-
paint={fillStyle}
|
|
39
|
+
paint={props.fillStyle}
|
|
102
40
|
type='fill'
|
|
103
41
|
/>
|
|
104
42
|
<Layer
|
|
105
43
|
filter={['!=', '$type', 'Point']}
|
|
106
|
-
paint={lineStyle}
|
|
44
|
+
paint={props.lineStyle}
|
|
107
45
|
type='line'
|
|
108
46
|
/>
|
|
109
47
|
<Layer
|
|
110
48
|
filter={['==', '$type', 'Point']}
|
|
111
|
-
paint={pointStyle}
|
|
49
|
+
paint={props.pointStyle}
|
|
112
50
|
type='circle'
|
|
113
51
|
/>
|
|
114
52
|
</Source>
|
|
115
53
|
);
|
|
116
54
|
};
|
|
117
55
|
|
|
56
|
+
GeoJsonLayer.defaultProps = {
|
|
57
|
+
fillStyle: MapStyles.fill,
|
|
58
|
+
pointStyle: MapStyles.point,
|
|
59
|
+
strokeStyle: MapStyles.stroke
|
|
60
|
+
};
|
|
61
|
+
|
|
118
62
|
export default GeoJsonLayer;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// @flow
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { GeoJSONLayer, PulsingMarkerLayer, useMap } from '@peripleo/maplibre';
|
|
4
4
|
import React, { useEffect } from 'react';
|
|
5
|
-
import
|
|
5
|
+
import MapStyles from '../utils/MapStyles';
|
|
6
6
|
import MapUtils from '../utils/Map';
|
|
7
7
|
|
|
8
8
|
type Props = {
|
|
@@ -16,6 +16,31 @@ type Props = {
|
|
|
16
16
|
*/
|
|
17
17
|
buffer: number,
|
|
18
18
|
|
|
19
|
+
/**
|
|
20
|
+
* If true, markers will be clustered before the specified zoom level.
|
|
21
|
+
*/
|
|
22
|
+
cluster?: boolean,
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Max zoom to cluster points on.
|
|
26
|
+
*/
|
|
27
|
+
clusterMaxZoom?: number,
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Minimum number of points necessary to form a cluster.
|
|
31
|
+
*/
|
|
32
|
+
clusterMinPoints?: number,
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* An object defining custom properties on the generated clusters.
|
|
36
|
+
*/
|
|
37
|
+
clusterProperties?: any,
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Radius of each cluster when clustering point.
|
|
41
|
+
*/
|
|
42
|
+
clusterRadius?: number,
|
|
43
|
+
|
|
19
44
|
/**
|
|
20
45
|
* The GeoJSON data representing the location.
|
|
21
46
|
*/
|
|
@@ -26,6 +51,16 @@ type Props = {
|
|
|
26
51
|
*/
|
|
27
52
|
fillStyle?: { [key: string]: any },
|
|
28
53
|
|
|
54
|
+
/**
|
|
55
|
+
* If `true`, the map will fit the bounding box around the passed data.
|
|
56
|
+
*/
|
|
57
|
+
fitBoundingBox?: boolean,
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* An ID value to apply to the layer.
|
|
61
|
+
*/
|
|
62
|
+
layerId?: string,
|
|
63
|
+
|
|
29
64
|
/**
|
|
30
65
|
* GeoJSON layer point style.
|
|
31
66
|
*/
|
|
@@ -49,22 +84,29 @@ const LocationMarkers = (props: Props) => {
|
|
|
49
84
|
* Sets the bounding box on the map.
|
|
50
85
|
*/
|
|
51
86
|
useEffect(() => {
|
|
52
|
-
if (map && props.data) {
|
|
87
|
+
if (map && props.data && props.fitBoundingBox) {
|
|
53
88
|
const boundingBox = MapUtils.getBoundingBox(props.data, props.buffer);
|
|
54
89
|
map.fitBounds(boundingBox);
|
|
55
90
|
}
|
|
56
|
-
}, [map, props.buffer, props.data]);
|
|
91
|
+
}, [map, props.buffer, props.data, props.fitBoundingBox]);
|
|
57
92
|
|
|
58
93
|
return (
|
|
59
94
|
<>
|
|
60
95
|
{ props.animate && (
|
|
61
96
|
<PulsingMarkerLayer
|
|
62
97
|
data={props.data}
|
|
98
|
+
id={props.layerId}
|
|
63
99
|
/>
|
|
64
100
|
)}
|
|
65
|
-
<
|
|
101
|
+
<GeoJSONLayer
|
|
102
|
+
cluster={props.cluster}
|
|
103
|
+
clusterMaxZoom={props.clusterMaxZoom}
|
|
104
|
+
clusterMinPoints={props.clusterMinPoints}
|
|
105
|
+
clusterProperties={props.clusterProperties}
|
|
106
|
+
clusterRadius={props.clusterRadius}
|
|
66
107
|
data={props.data}
|
|
67
108
|
fillStyle={props.fillStyle}
|
|
109
|
+
id={props.layerId}
|
|
68
110
|
strokeStyle={props.strokeStyle}
|
|
69
111
|
pointStyle={props.pointStyle}
|
|
70
112
|
/>
|
|
@@ -74,9 +116,10 @@ const LocationMarkers = (props: Props) => {
|
|
|
74
116
|
|
|
75
117
|
LocationMarkers.defaultProps = {
|
|
76
118
|
buffer: DEFAULT_BUFFER,
|
|
77
|
-
fillStyle:
|
|
78
|
-
|
|
79
|
-
|
|
119
|
+
fillStyle: MapStyles.fill,
|
|
120
|
+
fitBoundingBox: true,
|
|
121
|
+
pointStyle: MapStyles.point,
|
|
122
|
+
strokeStyle: MapStyles.stroke
|
|
80
123
|
};
|
|
81
124
|
|
|
82
125
|
export default LocationMarkers;
|
package/types/index.js.flow
CHANGED
package/types/utils/Map.js.flow
CHANGED
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
import { bbox, bboxPolygon, buffer } from '@turf/turf';
|
|
4
4
|
|
|
5
|
+
const MIN_LATITUDE = -90;
|
|
6
|
+
const MAX_LATITUDE = 90;
|
|
7
|
+
const MIN_LONGITUDE = -180;
|
|
8
|
+
const MAX_LONGITUDE = 180;
|
|
9
|
+
|
|
5
10
|
/**
|
|
6
11
|
* Returns a bounding box for the passed geometry (with optional buffer).
|
|
7
12
|
*
|
|
@@ -30,6 +35,29 @@ const getBoundingBox = (geometry, bufferDistance = null) => {
|
|
|
30
35
|
return bbox(polygonBuffer);
|
|
31
36
|
};
|
|
32
37
|
|
|
38
|
+
/**
|
|
39
|
+
* Returns true if the passed coordinates are valid.
|
|
40
|
+
*
|
|
41
|
+
* @param coordinates
|
|
42
|
+
*
|
|
43
|
+
* @returns {boolean}
|
|
44
|
+
*/
|
|
45
|
+
const validateCoordinates = (coordinates) => {
|
|
46
|
+
let valid = false;
|
|
47
|
+
|
|
48
|
+
if (coordinates) {
|
|
49
|
+
const [latitude, longitude] = coordinates;
|
|
50
|
+
|
|
51
|
+
valid = latitude >= MIN_LATITUDE
|
|
52
|
+
&& latitude <= MAX_LATITUDE
|
|
53
|
+
&& longitude >= MIN_LONGITUDE
|
|
54
|
+
&& longitude <= MAX_LONGITUDE;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return valid;
|
|
58
|
+
};
|
|
59
|
+
|
|
33
60
|
export default {
|
|
34
|
-
getBoundingBox
|
|
61
|
+
getBoundingBox,
|
|
62
|
+
validateCoordinates
|
|
35
63
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// @flow
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
const point = {
|
|
4
4
|
type: 'circle',
|
|
5
5
|
paint: {
|
|
6
6
|
'circle-radius': [
|
|
@@ -21,7 +21,7 @@ export const DEFAULT_POINT_STYLE = {
|
|
|
21
21
|
}
|
|
22
22
|
};
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
const fill = {
|
|
25
25
|
type: 'fill',
|
|
26
26
|
paint: {
|
|
27
27
|
'fill-color': '#ff623b',
|
|
@@ -29,10 +29,16 @@ export const DEFAULT_FILL_STYLE = {
|
|
|
29
29
|
}
|
|
30
30
|
};
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
const stroke = {
|
|
33
33
|
type: 'line',
|
|
34
34
|
paint: {
|
|
35
35
|
'line-color': '#ff623b',
|
|
36
36
|
'line-opacity': 0.6
|
|
37
37
|
}
|
|
38
38
|
};
|
|
39
|
+
|
|
40
|
+
export default {
|
|
41
|
+
point,
|
|
42
|
+
fill,
|
|
43
|
+
stroke
|
|
44
|
+
};
|