@@ -147,6 +147,9 @@ func (dec *dataDecoder) scanPrimitiveBlock(data []byte) error {
147
147
func (dec * dataDecoder ) scanPrimitiveGroup (data []byte ) error {
148
148
msg := protoscan .New (data )
149
149
150
+ way := & osm.Way {Visible : true }
151
+ relation := & osm.Relation {Visible : true }
152
+
150
153
for msg .Next () {
151
154
fn := msg .FieldNumber ()
152
155
if fn == 1 {
@@ -173,11 +176,20 @@ func (dec *dataDecoder) scanPrimitiveGroup(data []byte) error {
173
176
return err
174
177
}
175
178
176
- err = dec .scanWays (data )
179
+ way , err = dec .scanWays (data , way )
177
180
if err != nil {
178
181
return err
179
182
}
180
183
184
+ if dec .scanner .FilterWay == nil || dec .scanner .FilterWay (way ) {
185
+ dec .q = append (dec .q , way )
186
+ way = & osm.Way {Visible : true }
187
+ } else {
188
+ tags := way .Tags
189
+ nodes := way .Nodes
190
+ * way = osm.Way {Visible : true , Nodes : nodes [:0 ], Tags : tags [:0 ]}
191
+ }
192
+
181
193
continue
182
194
}
183
195
@@ -187,11 +199,20 @@ func (dec *dataDecoder) scanPrimitiveGroup(data []byte) error {
187
199
return err
188
200
}
189
201
190
- err = dec .scanRelations (data )
202
+ relation , err = dec .scanRelations (data , relation )
191
203
if err != nil {
192
204
return err
193
205
}
194
206
207
+ if dec .scanner .FilterRelation == nil || dec .scanner .FilterRelation (relation ) {
208
+ dec .q = append (dec .q , relation )
209
+ relation = & osm.Relation {Visible : true }
210
+ } else {
211
+ tags := relation .Tags
212
+ members := relation .Members
213
+ * relation = osm.Relation {Visible : true , Members : members [:0 ], Tags : tags [:0 ]}
214
+ }
215
+
195
216
continue
196
217
}
197
218
@@ -465,28 +486,21 @@ func (dec *dataDecoder) extractDenseNodes() error {
465
486
n .Tags = append (n .Tags , osm.Tag {Key : st [k ], Value : st [v ]})
466
487
}
467
488
}
468
- if dec .scanner .NodeFilter == nil || dec .scanner .NodeFilter (* n ) {
489
+
490
+ if dec .scanner .FilterNode == nil || dec .scanner .FilterNode (n ) {
491
+ dec .q = append (dec .q , n )
492
+ n = & osm.Node {Visible : true }
493
+ } else {
469
494
// skip unwanted nodes
470
- index ++
471
- }
472
- }
473
- if len (nodes ) != index {
474
- /* copy to an array just large enough */
475
- tmp := make ([]osm.Node , index )
476
- copy (tmp , nodes )
477
- for i := range tmp {
478
- dec .q = append (dec .q , & tmp [i ])
479
- }
480
- } else {
481
- for i := range nodes {
482
- dec .q = append (dec .q , & nodes [i ])
495
+ tags := n .Tags
496
+ * n = osm.Node {Visible : true , Tags : tags [:0 ]}
483
497
}
484
498
}
485
499
486
500
return nil
487
501
}
488
502
489
- func (dec * dataDecoder ) scanWays (data []byte ) error {
503
+ func (dec * dataDecoder ) scanWays (data []byte , way * osm. Way ) ( * osm. Way , error ) {
490
504
st := dec .primitiveBlock .GetStringtable ().GetS ()
491
505
granularity := int64 (dec .primitiveBlock .GetGranularity ())
492
506
dateGranularity := int64 (dec .primitiveBlock .GetDateGranularity ())
@@ -496,7 +510,10 @@ func (dec *dataDecoder) scanWays(data []byte) error {
496
510
497
511
msg := protoscan .New (data )
498
512
499
- way := & osm.Way {Visible : true }
513
+ if way == nil {
514
+ way = & osm.Way {Visible : true }
515
+ }
516
+
500
517
var foundKeys , foundVals bool
501
518
for msg .Next () {
502
519
var i64 int64
@@ -515,7 +532,7 @@ func (dec *dataDecoder) scanWays(data []byte) error {
515
532
case 4 : // info
516
533
d , err := msg .MessageData ()
517
534
if err != nil {
518
- return err
535
+ return nil , err
519
536
}
520
537
521
538
info := protoscan .New (d )
@@ -524,38 +541,38 @@ func (dec *dataDecoder) scanWays(data []byte) error {
524
541
case 1 :
525
542
v , err := info .Int32 ()
526
543
if err != nil {
527
- return err
544
+ return nil , err
528
545
}
529
546
way .Version = int (v )
530
547
case 2 :
531
548
v , err := info .Int64 ()
532
549
if err != nil {
533
- return err
550
+ return nil , err
534
551
}
535
552
millisec := time .Duration (v * dateGranularity ) * time .Millisecond
536
553
way .Timestamp = time .Unix (0 , millisec .Nanoseconds ()).UTC ()
537
554
case 3 :
538
555
v , err := info .Int64 ()
539
556
if err != nil {
540
- return err
557
+ return nil , err
541
558
}
542
559
way .ChangesetID = osm .ChangesetID (v )
543
560
case 4 :
544
561
v , err := info .Int32 ()
545
562
if err != nil {
546
- return err
563
+ return nil , err
547
564
}
548
565
way .UserID = osm .UserID (v )
549
566
case 5 :
550
567
v , err := info .Uint32 ()
551
568
if err != nil {
552
- return err
569
+ return nil , err
553
570
}
554
571
way .User = st [v ]
555
572
case 6 :
556
573
v , err := info .Bool ()
557
574
if err != nil {
558
- return err
575
+ return nil , err
559
576
}
560
577
way .Visible = v
561
578
default :
@@ -564,12 +581,12 @@ func (dec *dataDecoder) scanWays(data []byte) error {
564
581
}
565
582
566
583
if info .Err () != nil {
567
- return info .Err ()
584
+ return nil , info .Err ()
568
585
}
569
586
case 8 : // refs or nodes
570
587
dec .nodes , err = msg .Iterator (dec .nodes )
571
588
if err != nil {
572
- return err
589
+ return nil , err
573
590
}
574
591
575
592
var prev , index int64
@@ -579,7 +596,7 @@ func (dec *dataDecoder) scanWays(data []byte) error {
579
596
for dec .nodes .HasNext () {
580
597
v , err := dec .nodes .Sint64 ()
581
598
if err != nil {
582
- return err
599
+ return nil , err
583
600
}
584
601
prev = v + prev // delta encoding
585
602
way .Nodes [index ].ID = osm .NodeID (prev )
@@ -588,7 +605,7 @@ func (dec *dataDecoder) scanWays(data []byte) error {
588
605
case 9 : // lat
589
606
dec .wlats , err = msg .Iterator (dec .wlats )
590
607
if err != nil {
591
- return err
608
+ return nil , err
592
609
}
593
610
594
611
var prev , index int64
@@ -598,7 +615,7 @@ func (dec *dataDecoder) scanWays(data []byte) error {
598
615
for dec .wlats .HasNext () {
599
616
v , err := dec .wlats .Sint64 ()
600
617
if err != nil {
601
- return err
618
+ return nil , err
602
619
}
603
620
prev = v + prev // delta encoding
604
621
way .Nodes [index ].Lat = 1e-9 * float64 (latOffset + (granularity * prev ))
@@ -607,7 +624,7 @@ func (dec *dataDecoder) scanWays(data []byte) error {
607
624
case 10 : // lon
608
625
dec .wlons , err = msg .Iterator (dec .wlons )
609
626
if err != nil {
610
- return err
627
+ return nil , err
611
628
}
612
629
613
630
var prev , index int64
@@ -617,7 +634,7 @@ func (dec *dataDecoder) scanWays(data []byte) error {
617
634
for dec .wlons .HasNext () {
618
635
v , err := dec .wlons .Sint64 ()
619
636
if err != nil {
620
- return err
637
+ return nil , err
621
638
}
622
639
prev = v + prev // delta encoding
623
640
way .Nodes [index ].Lon = 1e-9 * float64 (lonOffset + (granularity * prev ))
@@ -628,25 +645,23 @@ func (dec *dataDecoder) scanWays(data []byte) error {
628
645
}
629
646
630
647
if err != nil {
631
- return err
648
+ return nil , err
632
649
}
633
650
}
634
651
635
652
if msg .Err () != nil {
636
- return msg .Err ()
653
+ return nil , msg .Err ()
637
654
}
638
655
639
656
if foundKeys && foundVals {
640
657
var err error
641
658
way .Tags , err = scanTags (st , dec .keys , dec .vals )
642
659
if err != nil {
643
- return err
660
+ return nil , err
644
661
}
645
662
}
646
- if dec .scanner .WayFilter == nil || dec .scanner .WayFilter (* way ) {
647
- dec .q = append (dec .q , way )
648
- }
649
- return nil
663
+
664
+ return way , nil
650
665
}
651
666
652
667
// Make relation members from stringtable and three parallel arrays of IDs.
@@ -693,13 +708,16 @@ func extractMembers(
693
708
return members , nil
694
709
}
695
710
696
- func (dec * dataDecoder ) scanRelations (data []byte ) error {
711
+ func (dec * dataDecoder ) scanRelations (data []byte , relation * osm. Relation ) ( * osm. Relation , error ) {
697
712
st := dec .primitiveBlock .GetStringtable ().GetS ()
698
713
dateGranularity := int64 (dec .primitiveBlock .GetDateGranularity ())
699
714
700
715
msg := protoscan .New (data )
701
716
702
- relation := & osm.Relation {Visible : true }
717
+ if relation == nil {
718
+ relation = & osm.Relation {Visible : true }
719
+ }
720
+
703
721
var foundKeys , foundVals , foundRoles , foundMemids , foundTypes bool
704
722
for msg .Next () {
705
723
var i64 int64
@@ -718,7 +736,7 @@ func (dec *dataDecoder) scanRelations(data []byte) error {
718
736
case 4 : // info
719
737
d , err := msg .MessageData ()
720
738
if err != nil {
721
- return err
739
+ return nil , err
722
740
}
723
741
724
742
info := protoscan .New (d )
@@ -727,38 +745,38 @@ func (dec *dataDecoder) scanRelations(data []byte) error {
727
745
case 1 :
728
746
v , err := info .Int32 ()
729
747
if err != nil {
730
- return err
748
+ return nil , err
731
749
}
732
750
relation .Version = int (v )
733
751
case 2 :
734
752
v , err := info .Int64 ()
735
753
if err != nil {
736
- return err
754
+ return nil , err
737
755
}
738
756
millisec := time .Duration (v * dateGranularity ) * time .Millisecond
739
757
relation .Timestamp = time .Unix (0 , millisec .Nanoseconds ()).UTC ()
740
758
case 3 :
741
759
v , err := info .Int64 ()
742
760
if err != nil {
743
- return err
761
+ return nil , err
744
762
}
745
763
relation .ChangesetID = osm .ChangesetID (v )
746
764
case 4 :
747
765
v , err := info .Int32 ()
748
766
if err != nil {
749
- return err
767
+ return nil , err
750
768
}
751
769
relation .UserID = osm .UserID (v )
752
770
case 5 :
753
771
v , err := info .Uint32 ()
754
772
if err != nil {
755
- return err
773
+ return nil , err
756
774
}
757
775
relation .User = st [v ]
758
776
case 6 :
759
777
v , err := info .Bool ()
760
778
if err != nil {
761
- return err
779
+ return nil , err
762
780
}
763
781
relation .Visible = v
764
782
default :
@@ -767,7 +785,7 @@ func (dec *dataDecoder) scanRelations(data []byte) error {
767
785
}
768
786
769
787
if info .Err () != nil {
770
- return info .Err ()
788
+ return nil , info .Err ()
771
789
}
772
790
case 8 : // refs or nodes
773
791
dec .roles , err = msg .Iterator (dec .roles )
@@ -783,20 +801,20 @@ func (dec *dataDecoder) scanRelations(data []byte) error {
783
801
}
784
802
785
803
if err != nil {
786
- return err
804
+ return nil , err
787
805
}
788
806
}
789
807
790
808
if msg .Err () != nil {
791
- return msg .Err ()
809
+ return nil , msg .Err ()
792
810
}
793
811
794
812
// possible for relation to not have tags
795
813
if foundKeys && foundVals {
796
814
var err error
797
815
relation .Tags , err = scanTags (st , dec .keys , dec .vals )
798
816
if err != nil {
799
- return err
817
+ return nil , err
800
818
}
801
819
}
802
820
@@ -805,13 +823,11 @@ func (dec *dataDecoder) scanRelations(data []byte) error {
805
823
var err error
806
824
relation .Members , err = extractMembers (st , dec .roles , dec .memids , dec .types )
807
825
if err != nil {
808
- return err
826
+ return nil , err
809
827
}
810
828
}
811
- if dec .scanner .RelationFilter == nil || dec .scanner .RelationFilter (* relation ) {
812
- dec .q = append (dec .q , relation )
813
- }
814
- return nil
829
+
830
+ return relation , nil
815
831
}
816
832
817
833
func scanTags (stringTable []string , keys , vals * protoscan.Iterator ) (osm.Tags , error ) {
0 commit comments