mapshaper 0.5.93 → 0.5.94

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/mapshaper.js CHANGED
@@ -9461,6 +9461,9 @@
9461
9461
  return rec && (rec[name] === val);
9462
9462
  });
9463
9463
  };
9464
+ obj.file_exists = function(name) {
9465
+ return cli.isFile(name);
9466
+ };
9464
9467
  return obj;
9465
9468
  }
9466
9469
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mapshaper",
3
- "version": "0.5.93",
3
+ "version": "0.5.94",
4
4
  "description": "A tool for editing vector datasets for mapping and GIS.",
5
5
  "keywords": [
6
6
  "shapefile",
@@ -6003,6 +6003,18 @@
6003
6003
  triggerHitEvent('change');
6004
6004
  };
6005
6005
 
6006
+ self.setSelectedVertices = function(points) {
6007
+ if (!active) return;
6008
+ storedData.selected_points = points;
6009
+ triggerHitEvent('change');
6010
+ };
6011
+
6012
+ self.clearSelectedVertices = function() {
6013
+ if (!storedData.selected_points) return;
6014
+ delete storedData.selected_points;
6015
+ triggerHitEvent('change');
6016
+ };
6017
+
6006
6018
  self.clearVertexOverlay = function() {
6007
6019
  if (!storedData.hit_coordinates) return;
6008
6020
  delete storedData.hit_coordinates;
@@ -7573,6 +7585,21 @@
7573
7585
  internal.insertVertex(target.arcs, v.i, v.point);
7574
7586
  }
7575
7587
 
7588
+ function toggleVertexSelection(ids) {
7589
+ if (!ids || ids.length === 0) return;
7590
+ if (!selectedVertexIds) {
7591
+ selectedVertexIds = ids;
7592
+ } else {
7593
+ var intersection = utils$1.intersection(selectedVertexIds, ids);
7594
+ var union = selectedVertexIds.concat(ids);
7595
+ selectedVertexIds = utils$1.difference(union, intersection);
7596
+ }
7597
+ // get coordinates
7598
+ var target = hit.getHitTarget();
7599
+ var points = selectedVertexIds.map(function(id) { return target.arcs.getVertex2(id); });
7600
+ hit.setSelectedVertices(points);
7601
+ }
7602
+
7576
7603
  hit.on('dragstart', function(e) {
7577
7604
  if (!active(e)) return;
7578
7605
  if (activeMidpoint) {
@@ -7613,6 +7640,9 @@
7613
7640
  // kludge to get dataset to recalculate internal bounding boxes
7614
7641
  hit.getHitTarget().arcs.transformPoints(function() {});
7615
7642
  clearHoverVertex();
7643
+
7644
+
7645
+
7616
7646
  fire('vertex_dragend');
7617
7647
  draggedVertexIds = null;
7618
7648
  activeShapeId = -1;
@@ -7624,7 +7654,20 @@
7624
7654
  hit.on('click', function(e) {
7625
7655
  if (!active(e)) return;
7626
7656
  var vertices = findDraggableVertices(e); // same selection criteria as for dragging
7627
- // TODO
7657
+
7658
+ // CASE: no draggable vertices
7659
+ // if selected vertices, deselect, else no-op
7660
+ // CASE: draggable vertices
7661
+ // if vertex is arc endpoint, ignore
7662
+ // if vertex is selected, deselect
7663
+ // if vertex is not selected, select
7664
+
7665
+ // if (vertices) {
7666
+ // toggleVertexSelection(vertices);
7667
+ // } else if (selectedVertexIds) {
7668
+ // toggleVertexSelection(selectedVertexIds);
7669
+ // }
7670
+
7628
7671
  });
7629
7672
 
7630
7673
  // highlight hit vertex in path edit mode
@@ -7876,6 +7919,7 @@
7876
7919
  if (o.mode == 'vertices') {
7877
7920
  style.vertices = true;
7878
7921
  style.vertex_overlay = o.hit_coordinates || null;
7922
+ style.selected_points = o.selected_points || null;
7879
7923
  style.fillColor = null;
7880
7924
  }
7881
7925
  };
@@ -8351,24 +8395,37 @@
8351
8395
  var radius = (style.strokeWidth > 2 ? style.strokeWidth * 0.9 : 2) * GUI.getPixelRatio() * getScaledLineScale(_ext);
8352
8396
  var color = style.strokeColor || 'black';
8353
8397
  var radius2 = radius * 1.7;
8398
+ var i, j, p;
8354
8399
  _ctx.beginPath();
8355
8400
  _ctx.fillStyle = color;
8356
- for (var i=0; i<shapes.length; i++) {
8401
+ for (i=0; i<shapes.length; i++) {
8357
8402
  var shp = shapes[i];
8358
8403
  if (!shp || filter && !filter(shp)) continue;
8359
- for (var j=0; j<shp.length; j++) {
8404
+ for (j=0; j<shp.length; j++) {
8360
8405
  iter.init(shp[j]);
8361
8406
  while (iter.hasNext()) {
8362
8407
  drawCircle(iter.x * t.mx + t.bx, iter.y * t.my + t.by, radius, _ctx);
8363
8408
  }
8364
8409
  }
8365
8410
  }
8411
+
8366
8412
  if (style.vertex_overlay) {
8367
- var p = style.vertex_overlay;
8413
+ p = style.vertex_overlay;
8368
8414
  drawCircle(p[0] * t.mx + t.bx, p[1] * t.my + t.by, radius2, _ctx);
8369
8415
  }
8370
8416
  _ctx.fill();
8371
8417
  _ctx.closePath();
8418
+
8419
+ if (style.selected_points) {
8420
+ _ctx.beginPath();
8421
+ _ctx.fillStyle = 'magenta';
8422
+ for (i=0; i<style.selected_points.length; i++) {
8423
+ p = style.selected_points[i];
8424
+ drawCircle(p[0] * t.mx + t.bx, p[1] * t.my + t.by, radius2, _ctx);
8425
+ }
8426
+ _ctx.fill();
8427
+ _ctx.closePath();
8428
+ }
8372
8429
  };
8373
8430
 
8374
8431
  // Optimized to draw paths in same-style batches (faster Canvas drawing)
package/www/mapshaper.js CHANGED
@@ -9461,6 +9461,9 @@
9461
9461
  return rec && (rec[name] === val);
9462
9462
  });
9463
9463
  };
9464
+ obj.file_exists = function(name) {
9465
+ return cli.isFile(name);
9466
+ };
9464
9467
  return obj;
9465
9468
  }
9466
9469
 
@@ -1,22 +0,0 @@
1
-
2
- map:
3
- mapshaper countyp010.shp name=counties \
4
- -filter 'STATE_FIPS < 72' \
5
- -filter 'COUNTY != ""' \
6
- -dissolve FIPS copy-fields=STATE \
7
- -simplify 2% \
8
- -proj albersusa \
9
- -points inner + name=points \
10
- -i 2012-president-general-counties.csv string-fields=fips name=data \
11
- -filter-fields fips,votes,obama,romney \
12
- -each 'margin = obama - romney' \
13
- -each 'absmargin = Math.abs(margin)' \
14
- -join target=points data keys=FIPS,fips \
15
- -sort absmargin descending \
16
- -svg-style r='Math.sqrt(absmargin) * 0.02' \
17
- -svg-style opacity=0.5 fill='margin > 0 ? "#0061aa" : "#cc0000"' \
18
- -lines STATE target=counties \
19
- -svg-style stroke="#ddd" where='TYPE == "inner"' \
20
- -svg-style stroke="#777" where='TYPE == "outer"' \
21
- -svg-style stroke="#999" where='TYPE == "STATE"' \
22
- -o map.svg target=counties,points
@@ -1,22 +0,0 @@
1
-
2
- map:
3
- mapshaper countyp010.shp name=counties \
4
- -filter 'STATE_FIPS < 72' \
5
- -filter 'COUNTY != ""' \
6
- -dissolve FIPS copy-fields=STATE \
7
- -simplify 2% \
8
- -proj albersusa \
9
- -points inner + name=points \
10
- -i 2012-president-general-counties.csv string-fields=fips name=data \
11
- -filter-fields fips,votes,obama,romney \
12
- -each 'margin = obama - romney' \
13
- -each 'absmargin = Math.abs(margin)' \
14
- -join target=points data keys=FIPS,fips \
15
- -sort absmargin descending \
16
- -svg-style r='Math.sqrt(absmargin) * 0.02' \
17
- -svg-style opacity=0.5 fill='margin > 0 ? "#0061aa" : "#cc0000"' \
18
- -lines STATE target=counties \
19
- -svg-style stroke="#ddd" where='TYPE == "inner"' \
20
- -svg-style stroke="#777" where='TYPE == "outer"' \
21
- -svg-style stroke="#999" where='TYPE == "STATE"' \
22
- -o map.svg target=counties,points
Binary file
Binary file
Binary file
@@ -1,262 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>mapshaper</title>
5
- <meta name="Description" content="A tool for topologically aware shape simplification. Reads and writes Shapefile, GeoJSON and TopoJSON formats.">
6
- <meta charset="UTF-8">
7
- <meta name="viewport" content="width=device-width, initial-scale=1">
8
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
9
- <link rel="stylesheet" href="../page.css">
10
- <link rel="stylesheet" href="../elements.css">
11
- <link rel="icon"
12
- type="image/png"
13
- href="../images/icon.png">
14
- </head>
15
- <body>
16
- <div class="hidden">
17
- <svg version="1.1" id="home-icon" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
18
- y="0px" width="14px" height="19px" viewBox="0 0 14 16">
19
- <g>
20
- <polygon points="13,7 13,6 12,6 12,5 11,5 11,4 10,4 10,3 9,3 9,2 8,2 8,1 6,1 6,2 5,2 5,3 4,3 4,4 3,4 3,5 2,5
21
- 2,6 1,6 1,7 0,7 0,9 2,9 2,14 6,14 6,10 8,10 8,14 12,14 12,9 14,9 14,7"/>
22
- </g>
23
- </svg>
24
- <svg version="1.1" id="zoom-in-icon" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
25
- y="0px" width="14px" height="21px" viewBox="0 0 14 14">
26
- <g>
27
- <polygon points="13,5 9,5 9,1 5,1 5,5 1,5 1,9 5,9 5,13 9,13 9,9 13,9"/>
28
- </g>
29
- </svg>
30
- <svg version="1.1" id="zoom-out-icon" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
31
- y="0px" width="14px" height="16px" viewBox="0 -1 14 10">
32
- <g>
33
- <polygon points="1,1 13,1 13,5 1,5 1,1" />
34
- </g>
35
- </svg>
36
- <svg version="1.1" id="info-icon2"
37
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="13px" height="18px"
38
- viewBox="-510 390 13 18" xml:space="preserve">
39
- <circle fill="#30D4EF" cx="-503.4" cy="392.8" r="2.7"/>
40
- <rect x="-508" y="405" fill="#30D4EF" width="10" height="3"/>
41
- <rect x="-507" y="398" fill="#30D4EF" width="6" height="3"/>
42
- <rect x="-505" y="400" fill="#30D4EF" width="4" height="6"/>
43
- </svg>
44
-
45
- </div>
46
-
47
- <div class="page-header">
48
- <div class="mapshaper-logo">map<span class="logo-highlight">shaper</span></div>
49
-
50
- <div class="layer-control-btn"><span class="btn header-btn layer-name"></span></div>
51
-
52
- <div class="simplify-control-wrapper"><div class="simplify-control"><div class="header-btn btn simplify-settings-btn">Settings</div>
53
- <div class="slider">
54
- <div class="handle"><img src="../images/slider_handle_v1.png" alt=""/></div>
55
- <div class="track"></div>
56
- </div>
57
- <input type="text" value="label" class="clicktext" />
58
- </div></div>
59
- <div id="mode-buttons" class="page-header-buttons">
60
- <span class="simplify-btn header-btn btn">Simplify</span><span class="separator"></span><span class="console-btn header-btn btn">Console</span><span class="separator"></span><span class="export-btn header-btn btn">Export</span>
61
- </div>
62
- <div id="splash-buttons" class="page-header-buttons">
63
- <a href="https://github.com/mbloch/mapshaper/wiki"><span id="wiki-btn" class="header-btn btn">Wiki</span></a><span class="separator"></span><a href="https://github.com/mbloch/mapshaper"><span id="github-btn" class="header-btn btn">GitHub</span></a>
64
- </div>
65
- </div>
66
-
67
- <div id="mshp-not-supported" class="main-area">
68
- <div class="info-box">
69
- <h3>Unfortunately, mapshaper can't run in <span class="unsupported-browser">this web browser</span></h3>
70
- <div>For best results, try <a href="https://www.google.com/chrome/browser/desktop/">Google Chrome</a> or <a href="http://www.mozilla.org/en-US/firefox/new/">Mozilla Firefox</a>.</div>
71
- </div>
72
- </div>
73
-
74
- <div class="layer-control main-area popup-dialog">
75
- <div class="info-box">
76
- <div class="info-box-scrolled">
77
- <div class="layer-menu">
78
- <h3>Layers</h3>
79
- <div class="pin-all pinnable">
80
- <img class="pin-btn unpinned" src="images/eye.png">
81
- <img class="pin-btn pinned" src="images/eye2.png">
82
- </div>
83
- <div class="layer-list"></div>
84
- <div><div id="add-file-btn" class="dialog-btn btn">Add a file</div></div>
85
- </div>
86
- </div>
87
- </div>
88
- </div>
89
-
90
- <div class="export-options main-area popup-dialog">
91
- <div class="info-box">
92
- <h3>Export menu</h3>
93
- <div style="height:3px"></div>
94
- <div class=export-layers>
95
- <h4>Layers</h4>
96
- <div class="export-layer-list option-menu"></div>
97
- </div>
98
- <h4>File format</h4>
99
- <div class="export-formats option-menu">
100
- </div>
101
-
102
- <div class="option-menu"><input type="text" class="advanced-options" placeholder="command line options" /><div class="tip-button">?<div class="tip-anchor">
103
- <div class="tip">Enter options from the command line
104
- interface. Examples: "bbox" "no-quantization"
105
- "precision=0.001"</div></div></div></div>
106
- <div class="cancel-btn btn dialog-btn">Cancel</div>
107
- <div class="save-btn btn dialog-btn">Export</div>
108
- </div>
109
- </div>
110
-
111
- <div class="simplify-options main-area popup-dialog">
112
- <div class="info-box">
113
- <h3>Simplification menu</h3>
114
- <div class="option-menu">
115
- <div><label for="import-retain-opt"><input type="checkbox" class="checkbox import-retain-opt"/>prevent shape removal</label>
116
- <div class="tip-button">?<div class="tip-anchor">
117
- <div class="tip">Prevent small polygon features from
118
- disappearing at high simplification. Keeps
119
- the largest ring of multi-ring features.
120
- </div></div></div></div>
121
- <div class="planar-opt-wrapper"><label for="planar-opt"><input type="checkbox" class="checkbox planar-opt"/>use planar geometry</label>
122
- <div class="tip-button">?<div class="tip-anchor">
123
- <div class="tip">Interpret x, y values as Cartesian coordinates
124
- on a plane, rather than longitude, latitude
125
- coordinates on a sphere.
126
- </div></div></div></div>
127
- </div>
128
-
129
- <h4>Method</h4>
130
- <div class="option-menu">
131
-
132
- <div><label><input type="radio" name="method" value="dp" class="radio">Douglas-Peucker</label><div class="tip-button">?<div class="tip-anchor">
133
- <div class="tip">Simplified lines remain within a set
134
- distance of original lines. Good for
135
- thinning dense points, but spikes
136
- tend to form at high simplification.</div></div></div>
137
- </div>
138
-
139
- <div><label><input type="radio" name="method" value="visvalingam" class="radio">Visvalingam / effective area</label><div class="tip-button">?<div class="tip-anchor">
140
- <div class="tip">Lines are simplified by iteratively
141
- removing the point that forms
142
- the least-area triangle with two
143
- adjacent points.</div></div></div>
144
- </div>
145
-
146
- <div><label><input type="radio" name="method" value="weighted_visvalingam" class="radio">Visvalingam / weighted area</label><div class="tip-button">?<div class="tip-anchor">
147
- <div class="tip">Points located at the vertex
148
- of more acute angles are
149
- preferentially removed, for
150
- a smoother appearance.</div></div></div></div>
151
-
152
-
153
- </div> <!-- option menu -->
154
-
155
- <div>
156
- <div class="cancel-btn btn dialog-btn">Cancel</div>
157
- <div class="submit-btn btn dialog-btn">Apply</div>
158
- </div>
159
- </div> <!-- .info-box -->
160
- </div> <!-- simplify-options -->
161
-
162
- <div id="splash-screen" class="main-area">
163
- <div>
164
- <h3>Mapshaper is an editor for map data</h3>
165
- </div>
166
- <div id="drop-areas" class="drop-area-wrapper main-area">
167
-
168
- <div class="file-catalog catalog-area">
169
- </div>
170
- <div class="file-catalog-spacer spacer"></div>
171
-
172
- <div id="import-drop" class="drop-area">
173
- <h4>Drop files here or <span class="inline-btn btn" id="file-selection-btn"><span class="label-text">select</span></span> from a folder</h4>
174
- <div class="subtitle">Shapefile, GeoJSON, TopoJSON, DBF and CSV files are supported</div>
175
- <div class="subtitle">Files can be loose or in a zip archive</div>
176
-
177
- </div>
178
- <div class="spacer"></div>
179
- <div id="import-quick-drop" class="drop-area">
180
- <h4>Quick import</h4>
181
- <div class="subtitle">Drop files here to import with default settings</div>
182
- </div>
183
- </div>
184
- </div>
185
-
186
- <div id="import-options" class="main-area popup-dialog">
187
- <div class="info-box">
188
- <!-- <h4>Queued files</h4> -->
189
-
190
- <div class="dropped-file-list"></div>
191
-
192
- <div class="option-menu">
193
-
194
- <div id="path-import-options">
195
- <h4>Options</h4>
196
-
197
- <div><label for="repair-intersections-opt"><input type="checkbox" checked class="checkbox" id="repair-intersections-opt"/>detect line intersections</label>
198
- <div class="tip-button">?<div class="tip-anchor">
199
-
200
- <div class="tip">Detect line intersections, including
201
- self-intersections, to help identify
202
- topological errors in a dataset.</div></div></div></div>
203
-
204
- <div><label for="snap-points-opt"><input type="checkbox" class="checkbox" id="snap-points-opt" />snap vertices</label>
205
- <div class="tip-button">?<div class="tip-anchor">
206
- <div class="tip">Fix topology errors by snapping
207
- together points with nearly identical
208
- coordinates. This option does not
209
- apply to TopoJSON files.</div></div></div></div>
210
- <div style="height:5px"></div>
211
-
212
- </div>
213
-
214
- <div><input type="text" class="advanced-options" placeholder="command line options" /><div class="tip-button">?<div class="tip-anchor">
215
- <div class="tip">Enter options from the command line
216
- interface. Examples: "no-topology"
217
- "encoding=big5"</div></div></div></div>
218
-
219
- </div>
220
-
221
- <div id="import-buttons">
222
- <div class="cancel-btn btn dialog-btn">Cancel</div>
223
- <div class="add-btn btn dialog-btn">Select</div>
224
- <div class="submit-btn btn dialog-btn default-btn">Import</div>
225
- </div>
226
-
227
- </div> <!-- .info-box -->
228
- </div> <!-- import-options -->
229
-
230
-
231
- <!-- TODO: remove #mshp-main-page without causing the map to jitter when resized -->
232
- <div id="mshp-main-page">
233
- <div class="console main-area console-area">
234
- <div class="console-window"><div class="console-buffer selectable"></div></div>
235
- </div>
236
- <div class="mshp-main-map main-area map-area">
237
- <div class="coordinate-info colored-text selectable"></div>
238
- <div class="intersection-display">
239
- <div class="intersection-count">0 line intersections</div>
240
- <div class="repair-btn text-btn colored-text">Repair</div>
241
- </div>
242
- <div class="map-layers"></div>
243
- </div>
244
- </div>
245
-
246
- <div id="import-options-drop-area" class="main-area drop-area-wrapper hidden">
247
- <div class="drop-area"></div>
248
- </div>
249
-
250
- <script src="../zip.js" type="text/javascript"></script>
251
- <script src="../modules.js" type="text/javascript"></script>
252
- <script src="../mapshaper.js" type="text/javascript"></script>
253
- <script src="manifest.js" type="text/javascript"></script>
254
- <script src="../mapshaper-gui.js" type="text/javascript"></script>
255
- <script type="text/javascript">
256
- zip.workerScripts = {
257
- deflater: ['../z-worker.js', '../pako.deflate.js', '../codecs.js'],
258
- inflater: ['../z-worker.js', '../pako.inflate.js', '../codecs.js']
259
- };
260
- </script>
261
- </body>
262
- </html>
@@ -1,27 +0,0 @@
1
- mapshaper.manifest = {
2
- catalog: {
3
- cols: 3,
4
- title: 'NACIS PCD Example Datasets',
5
- items: [{
6
- title: 'Sample One',
7
- subtitle: 'Inspection practice',
8
- files: [
9
- 'https://dl.dropboxusercontent.com/s/krtvbezmvgg102x/a.zip?dl=1'
10
- ]
11
- }, {
12
- title: 'Sample Two',
13
- subtitle: 'Line intersections',
14
- url: '',
15
- files: [
16
- 'https://dl.dropboxusercontent.com/s/0duqwhavungcxl3/b.zip?dl=1'
17
- ]
18
- }, {
19
- title: 'Sample Three',
20
- subtitle: 'U.S. counties',
21
- url: '',
22
- files: [
23
- 'https://dl.dropboxusercontent.com/s/4bwywe2856gmnrd/c.zip?dl=1'
24
- ]
25
- }]
26
- }
27
- };