21
21
import java .util .ArrayList ;
22
22
import java .util .List ;
23
23
import java .util .Optional ;
24
+ import java .util .Random ;
24
25
import lombok .RequiredArgsConstructor ;
25
26
import org .springframework .data .domain .PageRequest ;
26
27
import org .springframework .data .domain .Pageable ;
@@ -103,6 +104,20 @@ public TrackResponse.TrackId likeTrack(Member member, Long trackId, Boolean isLi
103
104
public TrackResponse .TrackId addTrack (Member member , TrackRequest .TrackUpload trackUpload ) {
104
105
double latitude = trackUpload .getLatitude ();
105
106
double longitude = trackUpload .getLongitude ();
107
+
108
+ List <Track > nearTracks = trackRepository .findAllTracksWithinBounds (
109
+ latitude - 0.001 ,
110
+ latitude + 0.001 ,
111
+ longitude - 0.001 ,
112
+ longitude + 0.001
113
+ );
114
+
115
+ if (hasNearTrack (latitude , longitude , nearTracks )) {
116
+ List <Double > editedPosition = editOverlapPosition (latitude , longitude , nearTracks );
117
+ latitude = editedPosition .get (0 );
118
+ longitude = editedPosition .get (1 );
119
+ }
120
+
106
121
AddressInfo addressInfo = reverseGeoCoding .getAddressInfo (latitude , longitude );
107
122
108
123
Location location = locationRepository .save (trackMapper .toLocation (
@@ -117,6 +132,38 @@ public TrackResponse.TrackId addTrack(Member member, TrackRequest.TrackUpload tr
117
132
return trackMapper .toTrackId (savedTrack .getId ());
118
133
}
119
134
135
+ private List <Double > editOverlapPosition (double latitude , double longitude , List <Track > nearTracks ) {
136
+ List <Double > editedPosition = new ArrayList <>();
137
+ Random random = new Random ();
138
+
139
+ int count = 0 ;
140
+ while (hasNearTrack (latitude , longitude , nearTracks )) {
141
+ if (count > 10 ) {
142
+ return editedPosition ;
143
+ }
144
+ count ++;
145
+ latitude += -0.0001 + (0.0002 * random .nextDouble ());
146
+ longitude += -0.0001 + (0.0002 * random .nextDouble ());
147
+ latitude = Math .round (latitude * 1_000_000 ) / 1_000_000.0 ;
148
+ longitude = Math .round (longitude * 1_000_000 ) / 1_000_000.0 ;
149
+ }
150
+
151
+ return List .of (latitude , longitude );
152
+ }
153
+
154
+ private boolean hasNearTrack (double la1 , double lo1 , List <Track > overlayTracks ) {
155
+ for (Track track : overlayTracks ) {
156
+ double la2 = track .getLocation ().getLatitude ();
157
+ double lo2 = track .getLocation ().getLongitude ();
158
+ double distance = Math .sqrt (Math .pow (la1 - la2 , 2 ) + Math .pow (lo1 - lo2 , 2 ));
159
+
160
+ if (distance <= 0.0001 ) {
161
+ return true ;
162
+ }
163
+ }
164
+ return false ;
165
+ }
166
+
120
167
@ Override
121
168
public TrackResponse .TrackDetailList getTrackFeeds (Member member , int page , int size ) {
122
169
List <Sort .Order > sorts = new ArrayList <>();
0 commit comments