@@ -221,4 +221,144 @@ void featurePropertyToJSI(
221221 return ;
222222 }
223223}
224+
225+ double calculateDelta (double x, double y) {
226+ if (x > y) {
227+ return x - y;
228+ }
229+ return y - x;
230+ }
231+
232+ double calculateAverage (initializer_list<double > args) {
233+ if (args.size () == 0 ) {
234+ return 0 ;
235+ }
236+
237+ double sum = 0 ;
238+ for (auto &num : args) sum += num;
239+
240+ return sum / args.size ();
241+ }
242+
243+ void installHelpers (jsi::Runtime &jsiRuntime) {
244+ auto regionToBBox = jsi::Function::createFromHostFunction (
245+ jsiRuntime, jsi::PropNameID::forAscii (jsiRuntime, " regionToBBox" ), 1 ,
246+ [](jsi::Runtime &runtime, const jsi::Value &thisValue,
247+ const jsi::Value *arguments, size_t count) -> jsi::Array {
248+ jsi::Object region = arguments[0 ].getObject (runtime);
249+
250+ double longitudeDelta =
251+ region.getProperty (runtime, " longitudeDelta" ).asNumber ();
252+
253+ double latitudeDelta =
254+ region.getProperty (runtime, " latitudeDelta" ).asNumber ();
255+
256+ double longitude = region.getProperty (runtime, " longitude" ).asNumber ();
257+
258+ double latitude = region.getProperty (runtime, " latitude" ).asNumber ();
259+
260+ double lngD = longitudeDelta;
261+
262+ if (longitudeDelta < 0 ) {
263+ lngD = longitudeDelta + 360 ;
264+ }
265+
266+ jsi::Array bbox = jsi::Array (runtime, 4 );
267+
268+ bbox.setValueAtIndex (runtime, 0 , longitude - lngD);
269+ bbox.setValueAtIndex (runtime, 1 , latitude - latitudeDelta);
270+ bbox.setValueAtIndex (runtime, 2 , longitude + lngD);
271+ bbox.setValueAtIndex (runtime, 3 , latitude + latitudeDelta);
272+
273+ return bbox;
274+ });
275+
276+ auto getMarkersRegion = jsi::Function::createFromHostFunction (
277+ jsiRuntime, jsi::PropNameID::forAscii (jsiRuntime, " getMarkersRegion" ), 1 ,
278+ [](jsi::Runtime &runtime, const jsi::Value &thisValue,
279+ const jsi::Value *arguments, size_t count) -> jsi::Object {
280+ auto points = arguments[0 ].getObject (runtime).asArray (runtime);
281+
282+ jsi::Object initialValue =
283+ points.getValueAtIndex (runtime, 0 ).asObject (runtime);
284+
285+ jsi::Object coordinates = jsi::Object (runtime);
286+
287+ coordinates.setProperty (
288+ runtime, " minX" ,
289+ initialValue.getProperty (runtime, " latitude" ).asNumber ());
290+
291+ coordinates.setProperty (
292+ runtime, " maxX" ,
293+ initialValue.getProperty (runtime, " latitude" ).asNumber ());
294+
295+ coordinates.setProperty (
296+ runtime, " minY" ,
297+ initialValue.getProperty (runtime, " longitude" ).asNumber ());
298+
299+ coordinates.setProperty (
300+ runtime, " maxY" ,
301+ initialValue.getProperty (runtime, " longitude" ).asNumber ());
302+
303+ for (int i = 0 ; i < points.size (runtime); i++) {
304+ jsi::Object point =
305+ points.getValueAtIndex (runtime, i).asObject (runtime);
306+
307+ double minX =
308+ std::min (coordinates.getProperty (runtime, " minX" ).asNumber (),
309+ point.getProperty (runtime, " latitude" ).asNumber ());
310+
311+ double maxX =
312+ std::max (coordinates.getProperty (runtime, " maxX" ).asNumber (),
313+ point.getProperty (runtime, " latitude" ).asNumber ());
314+
315+ double minY =
316+ std::min (coordinates.getProperty (runtime, " minY" ).asNumber (),
317+ point.getProperty (runtime, " longitude" ).asNumber ());
318+
319+ double maxY =
320+ std::max (coordinates.getProperty (runtime, " maxY" ).asNumber (),
321+ point.getProperty (runtime, " longitude" ).asNumber ());
322+
323+ coordinates.setProperty (runtime, " minX" , minX);
324+
325+ coordinates.setProperty (runtime, " maxX" , maxX);
326+
327+ coordinates.setProperty (runtime, " minY" , minY);
328+
329+ coordinates.setProperty (runtime, " maxY" , maxY);
330+ }
331+
332+ double deltaX =
333+ calculateDelta (coordinates.getProperty (runtime, " maxX" ).asNumber (),
334+ coordinates.getProperty (runtime, " minX" ).asNumber ());
335+ double deltaY =
336+ calculateDelta (coordinates.getProperty (runtime, " maxY" ).asNumber (),
337+ coordinates.getProperty (runtime, " minY" ).asNumber ());
338+
339+ jsi::Object region = jsi::Object (runtime);
340+
341+ region.setProperty (
342+ runtime, " latitude" ,
343+ calculateAverage (
344+ {coordinates.getProperty (runtime, " minX" ).asNumber (),
345+ coordinates.getProperty (runtime, " maxX" ).asNumber ()}));
346+
347+ region.setProperty (
348+ runtime, " longitude" ,
349+ calculateAverage (
350+ {coordinates.getProperty (runtime, " minY" ).asNumber (),
351+ coordinates.getProperty (runtime, " maxY" ).asNumber ()}));
352+
353+ region.setProperty (runtime, " latitudeDelta" , deltaX * 1.5 );
354+ region.setProperty (runtime, " longitudeDelta" , deltaY * 1.5 );
355+
356+ return region;
357+ });
358+
359+ jsiRuntime.global ().setProperty (jsiRuntime, " regionToBBox" ,
360+ std::move (regionToBBox));
361+ jsiRuntime.global ().setProperty (jsiRuntime, " getMarkersRegion" ,
362+ std::move (getMarkersRegion));
363+ }
224364} // namespace clusterer
0 commit comments