From 8b9b7db7f5aa54364353516d6809a71b64fcb938 Mon Sep 17 00:00:00 2001 From: "Documenter.jl" Date: Mon, 25 Nov 2024 21:33:40 +0000 Subject: [PATCH] build based on 9f0e22d --- previews/PR239/404.html | 22 + previews/PR239/api.html | 405 +++++++++++++ previews/PR239/assets/api.md.BkfD-VZg.js | 381 +++++++++++++ previews/PR239/assets/api.md.BkfD-VZg.lean.js | 381 +++++++++++++ previews/PR239/assets/app.CZ1qv-bZ.js | 1 + previews/PR239/assets/bnkpkoa.rOsRk89v.png | Bin 0 -> 63969 bytes .../PR239/assets/call_notes.md.D1Aj_9mC.js | 1 + .../assets/call_notes.md.D1Aj_9mC.lean.js | 1 + previews/PR239/assets/cfoowuw.BEoJ_XVP.png | Bin 0 -> 229594 bytes previews/PR239/assets/cgnfnmo.DHcwB147.png | Bin 0 -> 11197 bytes previews/PR239/assets/chihpsx.CPClNl7F.png | Bin 0 -> 191569 bytes .../chunks/@localSearchIndexroot.rs1EPJPu.js | 1 + .../chunks/VPLocalSearchBox.B2uKxNr_.js | 8 + .../PR239/assets/chunks/framework.onQNwZ2I.js | 18 + .../PR239/assets/chunks/theme.CkNAWswv.js | 2 + previews/PR239/assets/cphyzje.DuBHk1fh.png | Bin 0 -> 62883 bytes previews/PR239/assets/cthossd.DaovVbE6.png | Bin 0 -> 18370 bytes previews/PR239/assets/cvdrlht.HTM0ungm.png | Bin 0 -> 62708 bytes previews/PR239/assets/cwpogcp.pAYw0Yqf.png | Bin 0 -> 162783 bytes previews/PR239/assets/dytnfok.CULn5saZ.png | Bin 0 -> 14528 bytes previews/PR239/assets/eozeurm.DGf_4PiA.png | Bin 0 -> 65478 bytes previews/PR239/assets/evhqnlv.Bglvb-jp.png | Bin 0 -> 44112 bytes ...ments_accurate_accumulators.md.C1U7KOjF.js | 6 + ..._accurate_accumulators.md.C1U7KOjF.lean.js | 6 + .../experiments_predicates.md.C2d7Qctz.js | 98 ++++ ...experiments_predicates.md.C2d7Qctz.lean.js | 98 ++++ .../assets/explanations_crs.md.BdkIxIey.js | 1 + .../explanations_crs.md.BdkIxIey.lean.js | 1 + .../explanations_paradigms.md.B5COLxNa.js | 1 + ...explanations_paradigms.md.B5COLxNa.lean.js | 1 + .../explanations_peculiarities.md.Cphx4jNo.js | 1 + ...anations_peculiarities.md.Cphx4jNo.lean.js | 1 + .../explanations_winding_order.md.0V2FnJmC.js | 1 + ...anations_winding_order.md.0V2FnJmC.lean.js | 1 + previews/PR239/assets/eytjybr.BEFUMtlf.png | Bin 0 -> 12299 bytes previews/PR239/assets/filtvpm.mCtKcWOr.png | Bin 0 -> 83901 bytes previews/PR239/assets/fyfzmss.Dab1-ETk.png | Bin 0 -> 76849 bytes previews/PR239/assets/hvyhqaw.CgiryX2p.png | Bin 0 -> 13822 bytes previews/PR239/assets/ibdeule.BD0hVfse.png | Bin 0 -> 10899 bytes previews/PR239/assets/ievlkku.5DNJaCuT.png | Bin 0 -> 59963 bytes previews/PR239/assets/index.md.C-gmTcRS.js | 1 + .../PR239/assets/index.md.C-gmTcRS.lean.js | 1 + .../inter-italic-cyrillic-ext.r48I6akx.woff2 | Bin 0 -> 43112 bytes .../inter-italic-cyrillic.By2_1cv3.woff2 | Bin 0 -> 31300 bytes .../inter-italic-greek-ext.1u6EdAuj.woff2 | Bin 0 -> 17404 bytes .../assets/inter-italic-greek.DJ8dCoTZ.woff2 | Bin 0 -> 32564 bytes .../inter-italic-latin-ext.CN1xVJS-.woff2 | Bin 0 -> 120840 bytes .../assets/inter-italic-latin.C2AdPX0b.woff2 | Bin 0 -> 74784 bytes .../inter-italic-vietnamese.BSbpV94h.woff2 | Bin 0 -> 14884 bytes .../inter-roman-cyrillic-ext.BBPuwvHQ.woff2 | Bin 0 -> 40488 bytes .../inter-roman-cyrillic.C5lxZ8CY.woff2 | Bin 0 -> 29164 bytes .../inter-roman-greek-ext.CqjqNYQ-.woff2 | Bin 0 -> 16272 bytes .../assets/inter-roman-greek.BBVDIX6e.woff2 | Bin 0 -> 29920 bytes .../inter-roman-latin-ext.4ZJIpNVo.woff2 | Bin 0 -> 110160 bytes .../assets/inter-roman-latin.Di8DUHzh.woff2 | Bin 0 -> 67792 bytes .../inter-roman-vietnamese.BjW4sHH5.woff2 | Bin 0 -> 14072 bytes .../PR239/assets/introduction.md.FQTtykEQ.js | 1 + .../assets/introduction.md.FQTtykEQ.lean.js | 1 + previews/PR239/assets/ivowqmu.Cx40vhB3.png | Bin 0 -> 15689 bytes previews/PR239/assets/izslanu.Cm_V2Vs0.png | Bin 0 -> 207758 bytes previews/PR239/assets/jsdldah.C3SxJ3x-.png | Bin 0 -> 23728 bytes previews/PR239/assets/kbbskga.BT_oJ_KS.png | Bin 0 -> 70949 bytes previews/PR239/assets/kbzwnsa.DC3TvBOO.png | Bin 0 -> 31376 bytes previews/PR239/assets/kguctvv.Cb0_DiYE.png | Bin 0 -> 14120 bytes previews/PR239/assets/kojydpc.3UVIT8DR.png | Bin 0 -> 14090 bytes previews/PR239/assets/krkgpps.4wfjCtJV.png | Bin 0 -> 66660 bytes previews/PR239/assets/mtwzvwz.D9AE7i2o.png | Bin 0 -> 198219 bytes previews/PR239/assets/oafsxip.-VpeHhXX.png | Bin 0 -> 12067 bytes previews/PR239/assets/pkevosp.Dig-DWOQ.png | Bin 0 -> 11901 bytes previews/PR239/assets/rleiuex.3sfpQl2i.png | Bin 0 -> 65364 bytes previews/PR239/assets/rzkakxn._0R9BbFk.png | Bin 0 -> 30821 bytes .../assets/source_GeometryOps.md.D_V6MfpH.js | 85 +++ .../source_GeometryOps.md.D_V6MfpH.lean.js | 85 +++ ...xt_GeometryOpsFlexiJoinsExt.md.BtiH8and.js | 16 + ...ometryOpsFlexiJoinsExt.md.BtiH8and.lean.js | 16 + ...OSExt_GeometryOpsLibGEOSExt.md.BX97MBsi.js | 31 + ..._GeometryOpsLibGEOSExt.md.BX97MBsi.lean.js | 31 + ...eometryOpsLibGEOSExt_buffer.md.BIbTaNIz.js | 31 + ...ryOpsLibGEOSExt_buffer.md.BIbTaNIz.lean.js | 31 + ...tryOpsLibGEOSExt_segmentize.md.C7teKqJd.js | 21 + ...sLibGEOSExt_segmentize.md.C7teKqJd.lean.js | 21 + ...LibGEOSExt_simple_overrides.md.PL-RH0TF.js | 46 ++ ...OSExt_simple_overrides.md.PL-RH0TF.lean.js | 46 ++ ...metryOpsLibGEOSExt_simplify.md.DqcZcvcS.js | 29 + ...OpsLibGEOSExt_simplify.md.DqcZcvcS.lean.js | 29 + ...sProjExt_GeometryOpsProjExt.md.CF-5wcua.js | 8 + ...Ext_GeometryOpsProjExt.md.CF-5wcua.lean.js | 8 + ...eometryOpsProjExt_reproject.md.Cm7Q7Ebj.js | 44 ++ ...ryOpsProjExt_reproject.md.Cm7Q7Ebj.lean.js | 44 ++ ...ometryOpsProjExt_segmentize.md.DOG0-rtA.js | 31 + ...yOpsProjExt_segmentize.md.DOG0-rtA.lean.js | 31 + .../source_methods_angles.md.B9lhXIGg.js | 124 ++++ .../source_methods_angles.md.B9lhXIGg.lean.js | 124 ++++ .../assets/source_methods_area.md.42EUHlu6.js | 87 +++ .../source_methods_area.md.42EUHlu6.lean.js | 87 +++ .../source_methods_barycentric.md.BiNAbdvJ.js | 415 ++++++++++++++ ...ce_methods_barycentric.md.BiNAbdvJ.lean.js | 415 ++++++++++++++ .../source_methods_buffer.md.Wvk7coQv.js | 11 + .../source_methods_buffer.md.Wvk7coQv.lean.js | 11 + .../source_methods_centroid.md.CPAUzyVU.js | 93 +++ ...ource_methods_centroid.md.CPAUzyVU.lean.js | 93 +++ ...clipping_clipping_processor.md.Ci1IQvdb.js | 508 +++++++++++++++++ ...ing_clipping_processor.md.Ci1IQvdb.lean.js | 508 +++++++++++++++++ ...e_methods_clipping_coverage.md.C89Y2dMt.js | 223 ++++++++ ...hods_clipping_coverage.md.C89Y2dMt.lean.js | 223 ++++++++ ...source_methods_clipping_cut.md.D8NjrBmq.js | 87 +++ ...e_methods_clipping_cut.md.D8NjrBmq.lean.js | 87 +++ ...methods_clipping_difference.md.KRJn9sdE.js | 166 ++++++ ...ds_clipping_difference.md.KRJn9sdE.lean.js | 166 ++++++ ...thods_clipping_intersection.md.bcPofDGt.js | 383 +++++++++++++ ..._clipping_intersection.md.bcPofDGt.lean.js | 383 +++++++++++++ ...methods_clipping_predicates.md.BJITr_Uq.js | 44 ++ ...ds_clipping_predicates.md.BJITr_Uq.lean.js | 44 ++ ...urce_methods_clipping_union.md.DlTyWPn1.js | 251 +++++++++ ...methods_clipping_union.md.DlTyWPn1.lean.js | 251 +++++++++ .../source_methods_convex_hull.md.DkVMD0Lv.js | 57 ++ ...ce_methods_convex_hull.md.DkVMD0Lv.lean.js | 57 ++ .../source_methods_distance.md.DLCaGxsq.js | 181 ++++++ ...ource_methods_distance.md.DLCaGxsq.lean.js | 181 ++++++ .../source_methods_equals.md.BsnJrmWL.js | 265 +++++++++ .../source_methods_equals.md.BsnJrmWL.lean.js | 265 +++++++++ ...ods_geom_relations_contains.md.CTaz5DgK.js | 33 ++ ...eom_relations_contains.md.CTaz5DgK.lean.js | 33 ++ ...ds_geom_relations_coveredby.md.BNo4Y8zx.js | 183 ++++++ ...om_relations_coveredby.md.BNo4Y8zx.lean.js | 183 ++++++ ...thods_geom_relations_covers.md.Ds8aZwNW.js | 33 ++ ..._geom_relations_covers.md.Ds8aZwNW.lean.js | 33 ++ ...hods_geom_relations_crosses.md.-nyWl6CC.js | 120 ++++ ...geom_relations_crosses.md.-nyWl6CC.lean.js | 120 ++++ ...ods_geom_relations_disjoint.md.DH85oHhz.js | 178 ++++++ ...eom_relations_disjoint.md.DH85oHhz.lean.js | 178 ++++++ ...ations_geom_geom_processors.md.CmpKdMyB.js | 437 ++++++++++++++ ...s_geom_geom_processors.md.CmpKdMyB.lean.js | 437 ++++++++++++++ ...s_geom_relations_intersects.md.Z6dLYNxj.js | 27 + ...m_relations_intersects.md.Z6dLYNxj.lean.js | 27 + ...ods_geom_relations_overlaps.md.BjDDEk4_.js | 212 +++++++ ...eom_relations_overlaps.md.BjDDEk4_.lean.js | 212 +++++++ ...hods_geom_relations_touches.md.C3wGt7mS.js | 174 ++++++ ...geom_relations_touches.md.C3wGt7mS.lean.js | 174 ++++++ ...thods_geom_relations_within.md.UHYdg8yN.js | 193 +++++++ ..._geom_relations_within.md.UHYdg8yN.lean.js | 193 +++++++ .../source_methods_orientation.md.Cx8oaEg5.js | 100 ++++ ...ce_methods_orientation.md.Cx8oaEg5.lean.js | 100 ++++ .../source_methods_polygonize.md.CCOlggGo.js | 289 ++++++++++ ...rce_methods_polygonize.md.CCOlggGo.lean.js | 289 ++++++++++ .../source_not_implemented_yet.md.BRH4xbkQ.js | 4 + ...ce_not_implemented_yet.md.BRH4xbkQ.lean.js | 4 + .../assets/source_primitives.md.Dyw7zzpW.js | 1 + .../source_primitives.md.Dyw7zzpW.lean.js | 1 + .../source_src_GeometryOpsCore.md.BF7KPh3I.js | 25 + ...ce_src_GeometryOpsCore.md.BF7KPh3I.lean.js | 25 + .../assets/source_src_apply.md.C1jwRpiI.js | 144 +++++ .../source_src_apply.md.C1jwRpiI.lean.js | 144 +++++ .../source_src_applyreduce.md.vbUWBm8w.js | 72 +++ ...source_src_applyreduce.md.vbUWBm8w.lean.js | 72 +++ .../source_src_geometry_utils.md.CpDbCg3A.js | 2 + ...rce_src_geometry_utils.md.CpDbCg3A.lean.js | 2 + .../source_src_keyword_docs.md.BxLB2oH3.js | 1 + ...ource_src_keyword_docs.md.BxLB2oH3.lean.js | 1 + ...source_src_other_primitives.md.BVzBrNUT.js | 131 +++++ ...e_src_other_primitives.md.BVzBrNUT.lean.js | 131 +++++ .../assets/source_src_types.md.BulrghgC.js | 111 ++++ .../source_src_types.md.BulrghgC.lean.js | 111 ++++ ...ions_correction_closed_ring.md.DlzJm4wM.js | 30 + ...correction_closed_ring.md.DlzJm4wM.lean.js | 30 + ...rection_geometry_correction.md.DSGv3LiX.js | 31 + ...on_geometry_correction.md.DSGv3LiX.lean.js | 31 + ...ction_intersecting_polygons.md.CLhMqjHy.js | 97 ++++ ..._intersecting_polygons.md.CLhMqjHy.lean.js | 97 ++++ ...urce_transformations_extent.md.CrI7_2Lj.js | 13 + ...transformations_extent.md.CrI7_2Lj.lean.js | 13 + ...source_transformations_flip.md.CbHFKr9B.js | 22 + ...e_transformations_flip.md.CbHFKr9B.lean.js | 22 + ...e_transformations_forcedims.md._lugiyHg.js | 5 + ...nsformations_forcedims.md._lugiyHg.lean.js | 5 + ...e_transformations_reproject.md.DZgumE25.js | 1 + ...nsformations_reproject.md.DZgumE25.lean.js | 1 + ..._transformations_segmentize.md.DQ-jJDsI.js | 161 ++++++ ...sformations_segmentize.md.DQ-jJDsI.lean.js | 161 ++++++ ...ce_transformations_simplify.md.CnWLEC8c.js | 490 ++++++++++++++++ ...ansformations_simplify.md.CnWLEC8c.lean.js | 490 ++++++++++++++++ ...e_transformations_transform.md.BWclfchr.js | 55 ++ ...nsformations_transform.md.BWclfchr.lean.js | 55 ++ ...urce_transformations_tuples.md.BFXQMbxF.js | 19 + ...transformations_tuples.md.BFXQMbxF.lean.js | 19 + .../PR239/assets/source_types.md.BzRqHlPc.js | 38 ++ .../assets/source_types.md.BzRqHlPc.lean.js | 38 ++ .../PR239/assets/source_utils.md.Cy9C-nnj.js | 120 ++++ .../assets/source_utils.md.Cy9C-nnj.lean.js | 120 ++++ previews/PR239/assets/sqwzzcg.DeeQUply.png | Bin 0 -> 41343 bytes previews/PR239/assets/style.BIJ4ByRG.css | 1 + previews/PR239/assets/tfqfmef.Dz86q2IX.png | Bin 0 -> 14890 bytes previews/PR239/assets/tlayvwm.DiwGEg2f.png | Bin 0 -> 13659 bytes previews/PR239/assets/tsgqxnn.B94PsR1K.png | Bin 0 -> 34578 bytes previews/PR239/assets/tstphwa.DTKLkKh_.png | Bin 0 -> 200857 bytes ...tutorials_creating_geometry.md.BW0vmesq.js | 89 +++ ...ials_creating_geometry.md.BW0vmesq.lean.js | 89 +++ .../tutorials_geodesic_paths.md.BlU0MlUq.js | 11 + ...torials_geodesic_paths.md.BlU0MlUq.lean.js | 11 + .../tutorials_spatial_joins.md.B67GghbG.js | 52 ++ ...utorials_spatial_joins.md.B67GghbG.lean.js | 52 ++ previews/PR239/assets/twuyjor.DYrZOYql.png | Bin 0 -> 72147 bytes previews/PR239/assets/umfmfiz.Da39FuJg.png | Bin 0 -> 75505 bytes previews/PR239/assets/wjwdigs.0f3Lq4Lw.png | Bin 0 -> 201557 bytes previews/PR239/assets/xetmrwv.0OJvb21A.png | Bin 0 -> 18310 bytes previews/PR239/assets/xnfkjof.D5-bot8v.png | Bin 0 -> 41516 bytes previews/PR239/call_notes.html | 25 + .../experiments/accurate_accumulators.html | 30 + previews/PR239/experiments/predicates.html | 122 ++++ previews/PR239/explanations/crs.html | 25 + previews/PR239/explanations/paradigms.html | 25 + .../PR239/explanations/peculiarities.html | 25 + .../PR239/explanations/winding_order.html | 25 + previews/PR239/favicon.ico | Bin 0 -> 23866 bytes previews/PR239/hashmap.json | 1 + previews/PR239/index.html | 25 + previews/PR239/introduction.html | 25 + previews/PR239/logo.png | Bin 0 -> 87252 bytes previews/PR239/siteinfo.js | 1 + previews/PR239/source/GeometryOps.html | 109 ++++ .../GeometryOpsFlexiJoinsExt.html | 40 ++ .../GeometryOpsLibGEOSExt.html | 55 ++ .../source/GeometryOpsLibGEOSExt/buffer.html | 55 ++ .../GeometryOpsLibGEOSExt/segmentize.html | 45 ++ .../simple_overrides.html | 70 +++ .../GeometryOpsLibGEOSExt/simplify.html | 53 ++ .../GeometryOpsProjExt.html | 32 ++ .../source/GeometryOpsProjExt/reproject.html | 68 +++ .../source/GeometryOpsProjExt/segmentize.html | 55 ++ previews/PR239/source/methods/angles.html | 148 +++++ previews/PR239/source/methods/area.html | 111 ++++ .../PR239/source/methods/barycentric.html | 439 +++++++++++++++ previews/PR239/source/methods/buffer.html | 35 ++ previews/PR239/source/methods/centroid.html | 117 ++++ .../methods/clipping/clipping_processor.html | 532 ++++++++++++++++++ .../source/methods/clipping/coverage.html | 247 ++++++++ .../PR239/source/methods/clipping/cut.html | 111 ++++ .../source/methods/clipping/difference.html | 190 +++++++ .../source/methods/clipping/intersection.html | 407 ++++++++++++++ .../source/methods/clipping/predicates.html | 68 +++ .../PR239/source/methods/clipping/union.html | 275 +++++++++ .../PR239/source/methods/convex_hull.html | 81 +++ previews/PR239/source/methods/distance.html | 205 +++++++ previews/PR239/source/methods/equals.html | 289 ++++++++++ .../methods/geom_relations/contains.html | 57 ++ .../methods/geom_relations/coveredby.html | 207 +++++++ .../source/methods/geom_relations/covers.html | 57 ++ .../methods/geom_relations/crosses.html | 144 +++++ .../methods/geom_relations/disjoint.html | 202 +++++++ .../geom_relations/geom_geom_processors.html | 461 +++++++++++++++ .../methods/geom_relations/intersects.html | 51 ++ .../methods/geom_relations/overlaps.html | 236 ++++++++ .../methods/geom_relations/touches.html | 198 +++++++ .../source/methods/geom_relations/within.html | 217 +++++++ .../PR239/source/methods/orientation.html | 124 ++++ previews/PR239/source/methods/polygonize.html | 313 +++++++++++ .../PR239/source/not_implemented_yet.html | 28 + previews/PR239/source/primitives.html | 25 + .../PR239/source/src/GeometryOpsCore.html | 49 ++ previews/PR239/source/src/apply.html | 170 ++++++ previews/PR239/source/src/applyreduce.html | 96 ++++ previews/PR239/source/src/geometry_utils.html | 26 + previews/PR239/source/src/keyword_docs.html | 33 ++ .../PR239/source/src/other_primitives.html | 155 +++++ previews/PR239/source/src/types.html | 135 +++++ .../correction/closed_ring.html | 54 ++ .../correction/geometry_correction.html | 55 ++ .../correction/intersecting_polygons.html | 121 ++++ .../PR239/source/transformations/extent.html | 37 ++ .../PR239/source/transformations/flip.html | 46 ++ .../source/transformations/forcedims.html | 29 + .../source/transformations/reproject.html | 65 +++ .../source/transformations/segmentize.html | 185 ++++++ .../source/transformations/simplify.html | 514 +++++++++++++++++ .../source/transformations/transform.html | 79 +++ .../PR239/source/transformations/tuples.html | 43 ++ previews/PR239/source/types.html | 62 ++ previews/PR239/source/utils.html | 144 +++++ .../PR239/tutorials/creating_geometry.html | 113 ++++ previews/PR239/tutorials/geodesic_paths.html | 35 ++ previews/PR239/tutorials/spatial_joins.html | 76 +++ previews/PR239/vp-icons.css | 1 + 282 files changed, 24133 insertions(+) create mode 100644 previews/PR239/404.html create mode 100644 previews/PR239/api.html create mode 100644 previews/PR239/assets/api.md.BkfD-VZg.js create mode 100644 previews/PR239/assets/api.md.BkfD-VZg.lean.js create mode 100644 previews/PR239/assets/app.CZ1qv-bZ.js create mode 100644 previews/PR239/assets/bnkpkoa.rOsRk89v.png create mode 100644 previews/PR239/assets/call_notes.md.D1Aj_9mC.js create mode 100644 previews/PR239/assets/call_notes.md.D1Aj_9mC.lean.js create mode 100644 previews/PR239/assets/cfoowuw.BEoJ_XVP.png create mode 100644 previews/PR239/assets/cgnfnmo.DHcwB147.png create mode 100644 previews/PR239/assets/chihpsx.CPClNl7F.png create mode 100644 previews/PR239/assets/chunks/@localSearchIndexroot.rs1EPJPu.js create mode 100644 previews/PR239/assets/chunks/VPLocalSearchBox.B2uKxNr_.js create mode 100644 previews/PR239/assets/chunks/framework.onQNwZ2I.js create mode 100644 previews/PR239/assets/chunks/theme.CkNAWswv.js create mode 100644 previews/PR239/assets/cphyzje.DuBHk1fh.png create mode 100644 previews/PR239/assets/cthossd.DaovVbE6.png create mode 100644 previews/PR239/assets/cvdrlht.HTM0ungm.png create mode 100644 previews/PR239/assets/cwpogcp.pAYw0Yqf.png create mode 100644 previews/PR239/assets/dytnfok.CULn5saZ.png create mode 100644 previews/PR239/assets/eozeurm.DGf_4PiA.png create mode 100644 previews/PR239/assets/evhqnlv.Bglvb-jp.png create mode 100644 previews/PR239/assets/experiments_accurate_accumulators.md.C1U7KOjF.js create mode 100644 previews/PR239/assets/experiments_accurate_accumulators.md.C1U7KOjF.lean.js create mode 100644 previews/PR239/assets/experiments_predicates.md.C2d7Qctz.js create mode 100644 previews/PR239/assets/experiments_predicates.md.C2d7Qctz.lean.js create mode 100644 previews/PR239/assets/explanations_crs.md.BdkIxIey.js create mode 100644 previews/PR239/assets/explanations_crs.md.BdkIxIey.lean.js create mode 100644 previews/PR239/assets/explanations_paradigms.md.B5COLxNa.js create mode 100644 previews/PR239/assets/explanations_paradigms.md.B5COLxNa.lean.js create mode 100644 previews/PR239/assets/explanations_peculiarities.md.Cphx4jNo.js create mode 100644 previews/PR239/assets/explanations_peculiarities.md.Cphx4jNo.lean.js create mode 100644 previews/PR239/assets/explanations_winding_order.md.0V2FnJmC.js create mode 100644 previews/PR239/assets/explanations_winding_order.md.0V2FnJmC.lean.js create mode 100644 previews/PR239/assets/eytjybr.BEFUMtlf.png create mode 100644 previews/PR239/assets/filtvpm.mCtKcWOr.png create mode 100644 previews/PR239/assets/fyfzmss.Dab1-ETk.png create mode 100644 previews/PR239/assets/hvyhqaw.CgiryX2p.png create mode 100644 previews/PR239/assets/ibdeule.BD0hVfse.png create mode 100644 previews/PR239/assets/ievlkku.5DNJaCuT.png create mode 100644 previews/PR239/assets/index.md.C-gmTcRS.js create mode 100644 previews/PR239/assets/index.md.C-gmTcRS.lean.js create mode 100644 previews/PR239/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 create mode 100644 previews/PR239/assets/inter-italic-cyrillic.By2_1cv3.woff2 create mode 100644 previews/PR239/assets/inter-italic-greek-ext.1u6EdAuj.woff2 create mode 100644 previews/PR239/assets/inter-italic-greek.DJ8dCoTZ.woff2 create mode 100644 previews/PR239/assets/inter-italic-latin-ext.CN1xVJS-.woff2 create mode 100644 previews/PR239/assets/inter-italic-latin.C2AdPX0b.woff2 create mode 100644 previews/PR239/assets/inter-italic-vietnamese.BSbpV94h.woff2 create mode 100644 previews/PR239/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 create mode 100644 previews/PR239/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 create mode 100644 previews/PR239/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 create mode 100644 previews/PR239/assets/inter-roman-greek.BBVDIX6e.woff2 create mode 100644 previews/PR239/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 create mode 100644 previews/PR239/assets/inter-roman-latin.Di8DUHzh.woff2 create mode 100644 previews/PR239/assets/inter-roman-vietnamese.BjW4sHH5.woff2 create mode 100644 previews/PR239/assets/introduction.md.FQTtykEQ.js create mode 100644 previews/PR239/assets/introduction.md.FQTtykEQ.lean.js create mode 100644 previews/PR239/assets/ivowqmu.Cx40vhB3.png create mode 100644 previews/PR239/assets/izslanu.Cm_V2Vs0.png create mode 100644 previews/PR239/assets/jsdldah.C3SxJ3x-.png create mode 100644 previews/PR239/assets/kbbskga.BT_oJ_KS.png create mode 100644 previews/PR239/assets/kbzwnsa.DC3TvBOO.png create mode 100644 previews/PR239/assets/kguctvv.Cb0_DiYE.png create mode 100644 previews/PR239/assets/kojydpc.3UVIT8DR.png create mode 100644 previews/PR239/assets/krkgpps.4wfjCtJV.png create mode 100644 previews/PR239/assets/mtwzvwz.D9AE7i2o.png create mode 100644 previews/PR239/assets/oafsxip.-VpeHhXX.png create mode 100644 previews/PR239/assets/pkevosp.Dig-DWOQ.png create mode 100644 previews/PR239/assets/rleiuex.3sfpQl2i.png create mode 100644 previews/PR239/assets/rzkakxn._0R9BbFk.png create mode 100644 previews/PR239/assets/source_GeometryOps.md.D_V6MfpH.js create mode 100644 previews/PR239/assets/source_GeometryOps.md.D_V6MfpH.lean.js create mode 100644 previews/PR239/assets/source_GeometryOpsFlexiJoinsExt_GeometryOpsFlexiJoinsExt.md.BtiH8and.js create mode 100644 previews/PR239/assets/source_GeometryOpsFlexiJoinsExt_GeometryOpsFlexiJoinsExt.md.BtiH8and.lean.js create mode 100644 previews/PR239/assets/source_GeometryOpsLibGEOSExt_GeometryOpsLibGEOSExt.md.BX97MBsi.js create mode 100644 previews/PR239/assets/source_GeometryOpsLibGEOSExt_GeometryOpsLibGEOSExt.md.BX97MBsi.lean.js create mode 100644 previews/PR239/assets/source_GeometryOpsLibGEOSExt_buffer.md.BIbTaNIz.js create mode 100644 previews/PR239/assets/source_GeometryOpsLibGEOSExt_buffer.md.BIbTaNIz.lean.js create mode 100644 previews/PR239/assets/source_GeometryOpsLibGEOSExt_segmentize.md.C7teKqJd.js create mode 100644 previews/PR239/assets/source_GeometryOpsLibGEOSExt_segmentize.md.C7teKqJd.lean.js create mode 100644 previews/PR239/assets/source_GeometryOpsLibGEOSExt_simple_overrides.md.PL-RH0TF.js create mode 100644 previews/PR239/assets/source_GeometryOpsLibGEOSExt_simple_overrides.md.PL-RH0TF.lean.js create mode 100644 previews/PR239/assets/source_GeometryOpsLibGEOSExt_simplify.md.DqcZcvcS.js create mode 100644 previews/PR239/assets/source_GeometryOpsLibGEOSExt_simplify.md.DqcZcvcS.lean.js create mode 100644 previews/PR239/assets/source_GeometryOpsProjExt_GeometryOpsProjExt.md.CF-5wcua.js create mode 100644 previews/PR239/assets/source_GeometryOpsProjExt_GeometryOpsProjExt.md.CF-5wcua.lean.js create mode 100644 previews/PR239/assets/source_GeometryOpsProjExt_reproject.md.Cm7Q7Ebj.js create mode 100644 previews/PR239/assets/source_GeometryOpsProjExt_reproject.md.Cm7Q7Ebj.lean.js create mode 100644 previews/PR239/assets/source_GeometryOpsProjExt_segmentize.md.DOG0-rtA.js create mode 100644 previews/PR239/assets/source_GeometryOpsProjExt_segmentize.md.DOG0-rtA.lean.js create mode 100644 previews/PR239/assets/source_methods_angles.md.B9lhXIGg.js create mode 100644 previews/PR239/assets/source_methods_angles.md.B9lhXIGg.lean.js create mode 100644 previews/PR239/assets/source_methods_area.md.42EUHlu6.js create mode 100644 previews/PR239/assets/source_methods_area.md.42EUHlu6.lean.js create mode 100644 previews/PR239/assets/source_methods_barycentric.md.BiNAbdvJ.js create mode 100644 previews/PR239/assets/source_methods_barycentric.md.BiNAbdvJ.lean.js create mode 100644 previews/PR239/assets/source_methods_buffer.md.Wvk7coQv.js create mode 100644 previews/PR239/assets/source_methods_buffer.md.Wvk7coQv.lean.js create mode 100644 previews/PR239/assets/source_methods_centroid.md.CPAUzyVU.js create mode 100644 previews/PR239/assets/source_methods_centroid.md.CPAUzyVU.lean.js create mode 100644 previews/PR239/assets/source_methods_clipping_clipping_processor.md.Ci1IQvdb.js create mode 100644 previews/PR239/assets/source_methods_clipping_clipping_processor.md.Ci1IQvdb.lean.js create mode 100644 previews/PR239/assets/source_methods_clipping_coverage.md.C89Y2dMt.js create mode 100644 previews/PR239/assets/source_methods_clipping_coverage.md.C89Y2dMt.lean.js create mode 100644 previews/PR239/assets/source_methods_clipping_cut.md.D8NjrBmq.js create mode 100644 previews/PR239/assets/source_methods_clipping_cut.md.D8NjrBmq.lean.js create mode 100644 previews/PR239/assets/source_methods_clipping_difference.md.KRJn9sdE.js create mode 100644 previews/PR239/assets/source_methods_clipping_difference.md.KRJn9sdE.lean.js create mode 100644 previews/PR239/assets/source_methods_clipping_intersection.md.bcPofDGt.js create mode 100644 previews/PR239/assets/source_methods_clipping_intersection.md.bcPofDGt.lean.js create mode 100644 previews/PR239/assets/source_methods_clipping_predicates.md.BJITr_Uq.js create mode 100644 previews/PR239/assets/source_methods_clipping_predicates.md.BJITr_Uq.lean.js create mode 100644 previews/PR239/assets/source_methods_clipping_union.md.DlTyWPn1.js create mode 100644 previews/PR239/assets/source_methods_clipping_union.md.DlTyWPn1.lean.js create mode 100644 previews/PR239/assets/source_methods_convex_hull.md.DkVMD0Lv.js create mode 100644 previews/PR239/assets/source_methods_convex_hull.md.DkVMD0Lv.lean.js create mode 100644 previews/PR239/assets/source_methods_distance.md.DLCaGxsq.js create mode 100644 previews/PR239/assets/source_methods_distance.md.DLCaGxsq.lean.js create mode 100644 previews/PR239/assets/source_methods_equals.md.BsnJrmWL.js create mode 100644 previews/PR239/assets/source_methods_equals.md.BsnJrmWL.lean.js create mode 100644 previews/PR239/assets/source_methods_geom_relations_contains.md.CTaz5DgK.js create mode 100644 previews/PR239/assets/source_methods_geom_relations_contains.md.CTaz5DgK.lean.js create mode 100644 previews/PR239/assets/source_methods_geom_relations_coveredby.md.BNo4Y8zx.js create mode 100644 previews/PR239/assets/source_methods_geom_relations_coveredby.md.BNo4Y8zx.lean.js create mode 100644 previews/PR239/assets/source_methods_geom_relations_covers.md.Ds8aZwNW.js create mode 100644 previews/PR239/assets/source_methods_geom_relations_covers.md.Ds8aZwNW.lean.js create mode 100644 previews/PR239/assets/source_methods_geom_relations_crosses.md.-nyWl6CC.js create mode 100644 previews/PR239/assets/source_methods_geom_relations_crosses.md.-nyWl6CC.lean.js create mode 100644 previews/PR239/assets/source_methods_geom_relations_disjoint.md.DH85oHhz.js create mode 100644 previews/PR239/assets/source_methods_geom_relations_disjoint.md.DH85oHhz.lean.js create mode 100644 previews/PR239/assets/source_methods_geom_relations_geom_geom_processors.md.CmpKdMyB.js create mode 100644 previews/PR239/assets/source_methods_geom_relations_geom_geom_processors.md.CmpKdMyB.lean.js create mode 100644 previews/PR239/assets/source_methods_geom_relations_intersects.md.Z6dLYNxj.js create mode 100644 previews/PR239/assets/source_methods_geom_relations_intersects.md.Z6dLYNxj.lean.js create mode 100644 previews/PR239/assets/source_methods_geom_relations_overlaps.md.BjDDEk4_.js create mode 100644 previews/PR239/assets/source_methods_geom_relations_overlaps.md.BjDDEk4_.lean.js create mode 100644 previews/PR239/assets/source_methods_geom_relations_touches.md.C3wGt7mS.js create mode 100644 previews/PR239/assets/source_methods_geom_relations_touches.md.C3wGt7mS.lean.js create mode 100644 previews/PR239/assets/source_methods_geom_relations_within.md.UHYdg8yN.js create mode 100644 previews/PR239/assets/source_methods_geom_relations_within.md.UHYdg8yN.lean.js create mode 100644 previews/PR239/assets/source_methods_orientation.md.Cx8oaEg5.js create mode 100644 previews/PR239/assets/source_methods_orientation.md.Cx8oaEg5.lean.js create mode 100644 previews/PR239/assets/source_methods_polygonize.md.CCOlggGo.js create mode 100644 previews/PR239/assets/source_methods_polygonize.md.CCOlggGo.lean.js create mode 100644 previews/PR239/assets/source_not_implemented_yet.md.BRH4xbkQ.js create mode 100644 previews/PR239/assets/source_not_implemented_yet.md.BRH4xbkQ.lean.js create mode 100644 previews/PR239/assets/source_primitives.md.Dyw7zzpW.js create mode 100644 previews/PR239/assets/source_primitives.md.Dyw7zzpW.lean.js create mode 100644 previews/PR239/assets/source_src_GeometryOpsCore.md.BF7KPh3I.js create mode 100644 previews/PR239/assets/source_src_GeometryOpsCore.md.BF7KPh3I.lean.js create mode 100644 previews/PR239/assets/source_src_apply.md.C1jwRpiI.js create mode 100644 previews/PR239/assets/source_src_apply.md.C1jwRpiI.lean.js create mode 100644 previews/PR239/assets/source_src_applyreduce.md.vbUWBm8w.js create mode 100644 previews/PR239/assets/source_src_applyreduce.md.vbUWBm8w.lean.js create mode 100644 previews/PR239/assets/source_src_geometry_utils.md.CpDbCg3A.js create mode 100644 previews/PR239/assets/source_src_geometry_utils.md.CpDbCg3A.lean.js create mode 100644 previews/PR239/assets/source_src_keyword_docs.md.BxLB2oH3.js create mode 100644 previews/PR239/assets/source_src_keyword_docs.md.BxLB2oH3.lean.js create mode 100644 previews/PR239/assets/source_src_other_primitives.md.BVzBrNUT.js create mode 100644 previews/PR239/assets/source_src_other_primitives.md.BVzBrNUT.lean.js create mode 100644 previews/PR239/assets/source_src_types.md.BulrghgC.js create mode 100644 previews/PR239/assets/source_src_types.md.BulrghgC.lean.js create mode 100644 previews/PR239/assets/source_transformations_correction_closed_ring.md.DlzJm4wM.js create mode 100644 previews/PR239/assets/source_transformations_correction_closed_ring.md.DlzJm4wM.lean.js create mode 100644 previews/PR239/assets/source_transformations_correction_geometry_correction.md.DSGv3LiX.js create mode 100644 previews/PR239/assets/source_transformations_correction_geometry_correction.md.DSGv3LiX.lean.js create mode 100644 previews/PR239/assets/source_transformations_correction_intersecting_polygons.md.CLhMqjHy.js create mode 100644 previews/PR239/assets/source_transformations_correction_intersecting_polygons.md.CLhMqjHy.lean.js create mode 100644 previews/PR239/assets/source_transformations_extent.md.CrI7_2Lj.js create mode 100644 previews/PR239/assets/source_transformations_extent.md.CrI7_2Lj.lean.js create mode 100644 previews/PR239/assets/source_transformations_flip.md.CbHFKr9B.js create mode 100644 previews/PR239/assets/source_transformations_flip.md.CbHFKr9B.lean.js create mode 100644 previews/PR239/assets/source_transformations_forcedims.md._lugiyHg.js create mode 100644 previews/PR239/assets/source_transformations_forcedims.md._lugiyHg.lean.js create mode 100644 previews/PR239/assets/source_transformations_reproject.md.DZgumE25.js create mode 100644 previews/PR239/assets/source_transformations_reproject.md.DZgumE25.lean.js create mode 100644 previews/PR239/assets/source_transformations_segmentize.md.DQ-jJDsI.js create mode 100644 previews/PR239/assets/source_transformations_segmentize.md.DQ-jJDsI.lean.js create mode 100644 previews/PR239/assets/source_transformations_simplify.md.CnWLEC8c.js create mode 100644 previews/PR239/assets/source_transformations_simplify.md.CnWLEC8c.lean.js create mode 100644 previews/PR239/assets/source_transformations_transform.md.BWclfchr.js create mode 100644 previews/PR239/assets/source_transformations_transform.md.BWclfchr.lean.js create mode 100644 previews/PR239/assets/source_transformations_tuples.md.BFXQMbxF.js create mode 100644 previews/PR239/assets/source_transformations_tuples.md.BFXQMbxF.lean.js create mode 100644 previews/PR239/assets/source_types.md.BzRqHlPc.js create mode 100644 previews/PR239/assets/source_types.md.BzRqHlPc.lean.js create mode 100644 previews/PR239/assets/source_utils.md.Cy9C-nnj.js create mode 100644 previews/PR239/assets/source_utils.md.Cy9C-nnj.lean.js create mode 100644 previews/PR239/assets/sqwzzcg.DeeQUply.png create mode 100644 previews/PR239/assets/style.BIJ4ByRG.css create mode 100644 previews/PR239/assets/tfqfmef.Dz86q2IX.png create mode 100644 previews/PR239/assets/tlayvwm.DiwGEg2f.png create mode 100644 previews/PR239/assets/tsgqxnn.B94PsR1K.png create mode 100644 previews/PR239/assets/tstphwa.DTKLkKh_.png create mode 100644 previews/PR239/assets/tutorials_creating_geometry.md.BW0vmesq.js create mode 100644 previews/PR239/assets/tutorials_creating_geometry.md.BW0vmesq.lean.js create mode 100644 previews/PR239/assets/tutorials_geodesic_paths.md.BlU0MlUq.js create mode 100644 previews/PR239/assets/tutorials_geodesic_paths.md.BlU0MlUq.lean.js create mode 100644 previews/PR239/assets/tutorials_spatial_joins.md.B67GghbG.js create mode 100644 previews/PR239/assets/tutorials_spatial_joins.md.B67GghbG.lean.js create mode 100644 previews/PR239/assets/twuyjor.DYrZOYql.png create mode 100644 previews/PR239/assets/umfmfiz.Da39FuJg.png create mode 100644 previews/PR239/assets/wjwdigs.0f3Lq4Lw.png create mode 100644 previews/PR239/assets/xetmrwv.0OJvb21A.png create mode 100644 previews/PR239/assets/xnfkjof.D5-bot8v.png create mode 100644 previews/PR239/call_notes.html create mode 100644 previews/PR239/experiments/accurate_accumulators.html create mode 100644 previews/PR239/experiments/predicates.html create mode 100644 previews/PR239/explanations/crs.html create mode 100644 previews/PR239/explanations/paradigms.html create mode 100644 previews/PR239/explanations/peculiarities.html create mode 100644 previews/PR239/explanations/winding_order.html create mode 100644 previews/PR239/favicon.ico create mode 100644 previews/PR239/hashmap.json create mode 100644 previews/PR239/index.html create mode 100644 previews/PR239/introduction.html create mode 100644 previews/PR239/logo.png create mode 100644 previews/PR239/siteinfo.js create mode 100644 previews/PR239/source/GeometryOps.html create mode 100644 previews/PR239/source/GeometryOpsFlexiJoinsExt/GeometryOpsFlexiJoinsExt.html create mode 100644 previews/PR239/source/GeometryOpsLibGEOSExt/GeometryOpsLibGEOSExt.html create mode 100644 previews/PR239/source/GeometryOpsLibGEOSExt/buffer.html create mode 100644 previews/PR239/source/GeometryOpsLibGEOSExt/segmentize.html create mode 100644 previews/PR239/source/GeometryOpsLibGEOSExt/simple_overrides.html create mode 100644 previews/PR239/source/GeometryOpsLibGEOSExt/simplify.html create mode 100644 previews/PR239/source/GeometryOpsProjExt/GeometryOpsProjExt.html create mode 100644 previews/PR239/source/GeometryOpsProjExt/reproject.html create mode 100644 previews/PR239/source/GeometryOpsProjExt/segmentize.html create mode 100644 previews/PR239/source/methods/angles.html create mode 100644 previews/PR239/source/methods/area.html create mode 100644 previews/PR239/source/methods/barycentric.html create mode 100644 previews/PR239/source/methods/buffer.html create mode 100644 previews/PR239/source/methods/centroid.html create mode 100644 previews/PR239/source/methods/clipping/clipping_processor.html create mode 100644 previews/PR239/source/methods/clipping/coverage.html create mode 100644 previews/PR239/source/methods/clipping/cut.html create mode 100644 previews/PR239/source/methods/clipping/difference.html create mode 100644 previews/PR239/source/methods/clipping/intersection.html create mode 100644 previews/PR239/source/methods/clipping/predicates.html create mode 100644 previews/PR239/source/methods/clipping/union.html create mode 100644 previews/PR239/source/methods/convex_hull.html create mode 100644 previews/PR239/source/methods/distance.html create mode 100644 previews/PR239/source/methods/equals.html create mode 100644 previews/PR239/source/methods/geom_relations/contains.html create mode 100644 previews/PR239/source/methods/geom_relations/coveredby.html create mode 100644 previews/PR239/source/methods/geom_relations/covers.html create mode 100644 previews/PR239/source/methods/geom_relations/crosses.html create mode 100644 previews/PR239/source/methods/geom_relations/disjoint.html create mode 100644 previews/PR239/source/methods/geom_relations/geom_geom_processors.html create mode 100644 previews/PR239/source/methods/geom_relations/intersects.html create mode 100644 previews/PR239/source/methods/geom_relations/overlaps.html create mode 100644 previews/PR239/source/methods/geom_relations/touches.html create mode 100644 previews/PR239/source/methods/geom_relations/within.html create mode 100644 previews/PR239/source/methods/orientation.html create mode 100644 previews/PR239/source/methods/polygonize.html create mode 100644 previews/PR239/source/not_implemented_yet.html create mode 100644 previews/PR239/source/primitives.html create mode 100644 previews/PR239/source/src/GeometryOpsCore.html create mode 100644 previews/PR239/source/src/apply.html create mode 100644 previews/PR239/source/src/applyreduce.html create mode 100644 previews/PR239/source/src/geometry_utils.html create mode 100644 previews/PR239/source/src/keyword_docs.html create mode 100644 previews/PR239/source/src/other_primitives.html create mode 100644 previews/PR239/source/src/types.html create mode 100644 previews/PR239/source/transformations/correction/closed_ring.html create mode 100644 previews/PR239/source/transformations/correction/geometry_correction.html create mode 100644 previews/PR239/source/transformations/correction/intersecting_polygons.html create mode 100644 previews/PR239/source/transformations/extent.html create mode 100644 previews/PR239/source/transformations/flip.html create mode 100644 previews/PR239/source/transformations/forcedims.html create mode 100644 previews/PR239/source/transformations/reproject.html create mode 100644 previews/PR239/source/transformations/segmentize.html create mode 100644 previews/PR239/source/transformations/simplify.html create mode 100644 previews/PR239/source/transformations/transform.html create mode 100644 previews/PR239/source/transformations/tuples.html create mode 100644 previews/PR239/source/types.html create mode 100644 previews/PR239/source/utils.html create mode 100644 previews/PR239/tutorials/creating_geometry.html create mode 100644 previews/PR239/tutorials/geodesic_paths.html create mode 100644 previews/PR239/tutorials/spatial_joins.html create mode 100644 previews/PR239/vp-icons.css diff --git a/previews/PR239/404.html b/previews/PR239/404.html new file mode 100644 index 000000000..61cab2d93 --- /dev/null +++ b/previews/PR239/404.html @@ -0,0 +1,22 @@ + + + + + + 404 | GeometryOps.jl + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/previews/PR239/api.html b/previews/PR239/api.html new file mode 100644 index 000000000..811994a92 --- /dev/null +++ b/previews/PR239/api.html @@ -0,0 +1,405 @@ + + + + + + Full GeometryOps API documentation | GeometryOps.jl + + + + + + + + + + + + + + +
Skip to content

Full GeometryOps API documentation

Warning

This page is still very much WIP!

Documentation for GeometryOps's full API (only for reference!).

apply and associated functions

GeometryOpsCore.apply Function
julia
apply(f, target::Union{TraitTarget, GI.AbstractTrait}, obj; kw...)

Reconstruct a geometry, feature, feature collection, or nested vectors of either using the function f on the target trait.

f(target_geom) => x where x also has the target trait, or a trait that can be substituted. For example, swapping PolgonTrait to MultiPointTrait will fail if the outer object has MultiPolygonTrait, but should work if it has FeatureTrait.

Objects "shallower" than the target trait are always completely rebuilt, like a Vector of FeatureCollectionTrait of FeatureTrait when the target has PolygonTrait and is held in the features. These will always be GeoInterface geometries/feature/feature collections. But "deeper" objects may remain unchanged or be whatever GeoInterface compatible objects f returns.

The result is a functionally similar geometry with values depending on f.

  • threaded: true or false. Whether to use multithreading. Defaults to false.

  • crs: The CRS to attach to geometries. Defaults to nothing.

  • calc_extent: true or false. Whether to calculate the extent. Defaults to false.

Example

Flipped point the order in any feature or geometry, or iterables of either:

julia
import GeoInterface as GI
+import GeometryOps as GO
+geom = GI.Polygon([GI.LinearRing([(1, 2), (3, 4), (5, 6), (1, 2)]),
+                   GI.LinearRing([(3, 4), (5, 6), (6, 7), (3, 4)])])
+
+flipped_geom = GO.apply(GI.PointTrait, geom) do p
+    (GI.y(p), GI.x(p))
+end

source

GeometryOpsCore.applyreduce Function
julia
applyreduce(f, op, target::Union{TraitTarget, GI.AbstractTrait}, obj; threaded)

Apply function f to all objects with the target trait, and reduce the result with an op like +.

The order and grouping of application of op is not guaranteed.

If threaded==true threads will be used over arrays and iterables, feature collections and nested geometries.

source

GeometryOps.reproject Function
julia
reproject(geometry; source_crs, target_crs, transform, always_xy, time)
+reproject(geometry, source_crs, target_crs; always_xy, time)
+reproject(geometry, transform; always_xy, time)

Reproject any GeoInterface.jl compatible geometry from source_crs to target_crs.

The returned object will be constructed from GeoInterface.WrapperGeometry geometries, wrapping views of a Vector{Proj.Point{D}}, where D is the dimension.

Tip

The Proj.jl package must be loaded for this method to work, since it is implemented in a package extension.

Arguments

  • geometry: Any GeoInterface.jl compatible geometries.

  • source_crs: the source coordinate reference system, as a GeoFormatTypes.jl object or a string.

  • target_crs: the target coordinate reference system, as a GeoFormatTypes.jl object or a string.

If these a passed as keywords, transform will take priority. Without it target_crs is always needed, and source_crs is needed if it is not retrievable from the geometry with GeoInterface.crs(geometry).

Keywords

  • always_xy: force x, y coordinate order, true by default. false will expect and return points in the crs coordinate order.

  • time: the time for the coordinates. Inf by default.

  • threaded: true or false. Whether to use multithreading. Defaults to false.

  • crs: The CRS to attach to geometries. Defaults to nothing.

  • calc_extent: true or false. Whether to calculate the extent. Defaults to false.

source

GeometryOps.transform Function
julia
transform(f, obj)

Apply a function f to all the points in obj.

Points will be passed to f as an SVector to allow using CoordinateTransformations.jl and Rotations.jl without hassle.

SVector is also a valid GeoInterface.jl point, so will work in all GeoInterface.jl methods.

Example

julia
julia> import GeoInterface as GI
+
+julia> import GeometryOps as GO
+
+julia> geom = GI.Polygon([GI.LinearRing([(1, 2), (3, 4), (5, 6), (1, 2)]), GI.LinearRing([(3, 4), (5, 6), (6, 7), (3, 4)])]);
+
+julia> f = CoordinateTransformations.Translation(3.5, 1.5)
+Translation(3.5, 1.5)
+
+julia> GO.transform(f, geom)
+GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Linea
+rRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticArraysCo
+re.SVector{2, Float64}[[4.5, 3.5], [6.5, 5.5], [8.5, 7.5], [4.5, 3.5]], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticA
+rraysCore.SVector{2, Float64}[[6.5, 5.5], [8.5, 7.5], [9.5, 8.5], [6.5, 5.5]], nothing, nothing)], nothing, nothing)

With Rotations.jl you need to actually multiply the Rotation by the SVector point, which is easy using an anonymous function.

julia
julia> using Rotations
+
+julia> GO.transform(p -> one(RotMatrix{2}) * p, geom)
+GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearR
+ing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}(StaticArraysCore.SVe
+ctor{2, Int64}[[2, 1], [4, 3], [6, 5], [2, 1]], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}(StaticArraysCore.SVector{2, Int64
+}[[4, 3], [6, 5], [7, 6], [4, 3]], nothing, nothing)], nothing, nothing)

source

General geometry methods

OGC methods

GeometryOps.contains Function
julia
contains(g1::AbstractGeometry, g2::AbstractGeometry)::Bool

Return true if the second geometry is completely contained by the first geometry. The interiors of both geometries must intersect and the interior and boundary of the secondary (g2) must not intersect the exterior of the first (g1).

contains returns the exact opposite result of within.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
+point = GI.Point((1, 2))
+
+GO.contains(line, point)
+# output
+true

source

GeometryOps.coveredby Function
julia
coveredby(g1, g2)::Bool

Return true if the first geometry is completely covered by the second geometry. The interior and boundary of the primary geometry (g1) must not intersect the exterior of the secondary geometry (g2).

Furthermore, coveredby returns the exact opposite result of covers. They are equivalent with the order of the arguments swapped.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+p1 = GI.Point(0.0, 0.0)
+p2 = GI.Point(1.0, 1.0)
+l1 = GI.Line([p1, p2])
+
+GO.coveredby(p1, l1)
+# output
+true

source

GeometryOps.covers Function
julia
covers(g1::AbstractGeometry, g2::AbstractGeometry)::Bool

Return true if the first geometry is completely covers the second geometry, The exterior and boundary of the second geometry must not be outside of the interior and boundary of the first geometry. However, the interiors need not intersect.

covers returns the exact opposite result of coveredby.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+l1 = GI.LineString([(1.0, 1.0), (1.0, 2.0), (1.0, 3.0), (1.0, 4.0)])
+l2 = GI.LineString([(1.0, 1.0), (1.0, 2.0)])
+
+GO.covers(l1, l2)
+# output
+true

source

GeometryOps.crosses Function
julia
 crosses(geom1, geom2)::Bool

Return true if the intersection results in a geometry whose dimension is one less than the maximum dimension of the two source geometries and the intersection set is interior to both source geometries.

TODO: broken

Examples

julia
import GeoInterface as GI, GeometryOps as GO
+# TODO: Add working example

source

GeometryOps.disjoint Function
julia
disjoint(geom1, geom2)::Bool

Return true if the first geometry is disjoint from the second geometry.

Return true if the first geometry is disjoint from the second geometry. The interiors and boundaries of both geometries must not intersect.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+
+line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
+point = (2, 2)
+GO.disjoint(point, line)
+
+# output
+true

source

GeometryOps.intersects Function
julia
intersects(geom1, geom2)::Bool

Return true if the interiors or boundaries of the two geometries interact.

intersects returns the exact opposite result of disjoint.

Example

julia
import GeoInterface as GI, GeometryOps as GO
+
+line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)])
+line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)])
+GO.intersects(line1, line2)
+
+# output
+true

source

GeometryOps.overlaps Function
julia
overlaps(geom1, geom2)::Bool

Compare two Geometries of the same dimension and return true if their intersection set results in a geometry different from both but of the same dimension. This means one geometry cannot be within or contain the other and they cannot be equal

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+poly1 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
+poly2 = GI.Polygon([[(1,1), (1,6), (6,6), (6,1), (1,1)]])
+
+GO.overlaps(poly1, poly2)
+# output
+true

source

julia
overlaps(::GI.AbstractTrait, geom1, ::GI.AbstractTrait, geom2)::Bool

For any non-specified pair, all have non-matching dimensions, return false.

source

julia
overlaps(
+    ::GI.MultiPointTrait, points1,
+    ::GI.MultiPointTrait, points2,
+)::Bool

If the multipoints overlap, meaning some, but not all, of the points within the multipoints are shared, return true.

source

julia
overlaps(::GI.LineTrait, line1, ::GI.LineTrait, line)::Bool

If the lines overlap, meaning that they are collinear but each have one endpoint outside of the other line, return true. Else false.

source

julia
overlaps(
+    ::Union{GI.LineStringTrait, GI.LinearRing}, line1,
+    ::Union{GI.LineStringTrait, GI.LinearRing}, line2,
+)::Bool

If the curves overlap, meaning that at least one edge of each curve overlaps, return true. Else false.

source

julia
overlaps(
+    trait_a::GI.PolygonTrait, poly_a,
+    trait_b::GI.PolygonTrait, poly_b,
+)::Bool

If the two polygons intersect with one another, but are not equal, return true. Else false.

source

julia
overlaps(
+    ::GI.PolygonTrait, poly1,
+    ::GI.MultiPolygonTrait, polys2,
+)::Bool

Return true if polygon overlaps with at least one of the polygons within the multipolygon. Else false.

source

julia
overlaps(
+    ::GI.MultiPolygonTrait, polys1,
+    ::GI.PolygonTrait, poly2,
+)::Bool

Return true if polygon overlaps with at least one of the polygons within the multipolygon. Else false.

source

julia
overlaps(
+    ::GI.MultiPolygonTrait, polys1,
+    ::GI.MultiPolygonTrait, polys2,
+)::Bool

Return true if at least one pair of polygons from multipolygons overlap. Else false.

source

GeometryOps.touches Function
julia
touches(geom1, geom2)::Bool

Return true if the first geometry touches the second geometry. In other words, the two interiors cannot interact, but one of the geometries must have a boundary point that interacts with either the other geometry's interior or boundary.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+
+l1 = GI.Line([(0.0, 0.0), (1.0, 0.0)])
+l2 = GI.Line([(1.0, 1.0), (1.0, -1.0)])
+
+GO.touches(l1, l2)
+# output
+true

source

GeometryOps.within Function
julia
within(geom1, geom2)::Bool

Return true if the first geometry is completely within the second geometry. The interiors of both geometries must intersect and the interior and boundary of the primary geometry (geom1) must not intersect the exterior of the secondary geometry (geom2).

Furthermore, within returns the exact opposite result of contains.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+
+line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
+point = (1, 2)
+GO.within(point, line)
+
+# output
+true

source

Other general methods

GeometryOps.equals Function
julia
equals(geom1, geom2)::Bool

Compare two Geometries return true if they are the same geometry.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+poly1 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
+poly2 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
+
+GO.equals(poly1, poly2)
+# output
+true

source

julia
equals(::T, geom_a, ::T, geom_b)::Bool

Two geometries of the same type, which don't have a equals function to dispatch off of should throw an error.

source

julia
equals(trait_a, geom_a, trait_b, geom_b)

Two geometries which are not of the same type cannot be equal so they always return false.

source

julia
equals(::GI.PointTrait, p1, ::GI.PointTrait, p2)::Bool

Two points are the same if they have the same x and y (and z if 3D) coordinates.

source

julia
equals(::GI.PointTrait, p1, ::GI.MultiPointTrait, mp2)::Bool

A point and a multipoint are equal if the multipoint is composed of a single point that is equivalent to the given point.

source

julia
equals(::GI.MultiPointTrait, mp1, ::GI.PointTrait, p2)::Bool

A point and a multipoint are equal if the multipoint is composed of a single point that is equivalent to the given point.

source

julia
equals(::GI.MultiPointTrait, mp1, ::GI.MultiPointTrait, mp2)::Bool

Two multipoints are equal if they share the same set of points.

source

julia
equals(
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
+)::Bool

Two lines/linestrings are equal if they share the same set of points going along the curve. Note that lines/linestrings aren't closed by definition.

source

julia
equals(
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
+    ::GI.LinearRingTrait, l2,
+)::Bool

A line/linestring and a linear ring are equal if they share the same set of points going along the curve. Note that lines aren't closed by definition, but rings are, so the line must have a repeated last point to be equal

source

julia
equals(
+    ::GI.LinearRingTrait, l1,
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
+)::Bool

A linear ring and a line/linestring are equal if they share the same set of points going along the curve. Note that lines aren't closed by definition, but rings are, so the line must have a repeated last point to be equal

source

julia
equals(
+    ::GI.LinearRingTrait, l1,
+    ::GI.LinearRingTrait, l2,
+)::Bool

Two linear rings are equal if they share the same set of points going along the curve. Note that rings are closed by definition, so they can have, but don't need, a repeated last point to be equal.

source

julia
equals(::GI.PolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool

Two polygons are equal if they share the same exterior edge and holes.

source

julia
equals(::GI.PolygonTrait, geom_a, ::GI.MultiPolygonTrait, geom_b)::Bool

A polygon and a multipolygon are equal if the multipolygon is composed of a single polygon that is equivalent to the given polygon.

source

julia
equals(::GI.MultiPolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool

A polygon and a multipolygon are equal if the multipolygon is composed of a single polygon that is equivalent to the given polygon.

source

julia
equals(::GI.PolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool

Two multipolygons are equal if they share the same set of polygons.

source

GeometryOps.centroid Function
julia
centroid(geom, [T=Float64])::Tuple{T, T}

Returns the centroid of a given line segment, linear ring, polygon, or mutlipolygon.

source

GeometryOps.distance Function
julia
distance(point, geom, ::Type{T} = Float64)::T

Calculates the ditance from the geometry g1 to the point. The distance will always be positive or zero.

The method will differ based on the type of the geometry provided: - The distance from a point to a point is just the Euclidean distance between the points. - The distance from a point to a line is the minimum distance from the point to the closest point on the given line. - The distance from a point to a linestring is the minimum distance from the point to the closest segment of the linestring. - The distance from a point to a linear ring is the minimum distance from the point to the closest segment of the linear ring. - The distance from a point to a polygon is zero if the point is within the polygon and otherwise is the minimum distance from the point to an edge of the polygon. This includes edges created by holes. - The distance from a point to a multigeometry or a geometry collection is the minimum distance between the point and any of the sub-geometries.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

GeometryOps.signed_distance Function
julia
signed_distance(point, geom, ::Type{T} = Float64)::T

Calculates the signed distance from the geometry geom to the given point. Points within geom have a negative signed distance, and points outside of geom have a positive signed distance. - The signed distance from a point to a point, line, linestring, or linear ring is equal to the distance between the two. - The signed distance from a point to a polygon is negative if the point is within the polygon and is positive otherwise. The value of the distance is the minimum distance from the point to an edge of the polygon. This includes edges created by holes. - The signed distance from a point to a multigeometry or a geometry collection is the minimum signed distance between the point and any of the sub-geometries.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

GeometryOps.area Function
julia
area(geom, [T = Float64])::T

Returns the area of a geometry or collection of geometries. This is computed slightly differently for different geometries:

- The area of a point/multipoint is always zero.
+- The area of a curve/multicurve is always zero.
+- The area of a polygon is the absolute value of the signed area.
+- The area multi-polygon is the sum of the areas of all of the sub-polygons.
+- The area of a geometry collection, feature collection of array/iterable 
+    is the sum of the areas of all of the sub-geometries.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

GeometryOps.signed_area Function
julia
signed_area(geom, [T = Float64])::T

Returns the signed area of a single geometry, based on winding order. This is computed slightly differently for different geometries:

- The signed area of a point is always zero.
+- The signed area of a curve is always zero.
+- The signed area of a polygon is computed with the shoelace formula and is
+positive if the polygon coordinates wind clockwise and negative if
+counterclockwise.
+- You cannot compute the signed area of a multipolygon as it doesn't have a
+meaning as each sub-polygon could have a different winding order.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

GeometryOps.angles Function
julia
angles(geom, ::Type{T} = Float64)

Returns the angles of a geometry or collection of geometries. This is computed differently for different geometries:

- The angles of a point is an empty vector.
+- The angles of a single line segment is an empty vector.
+- The angles of a linestring or linearring is a vector of angles formed by the curve.
+- The angles of a polygon is a vector of vectors of angles formed by each ring.
+- The angles of a multi-geometry collection is a vector of the angles of each of the
+    sub-geometries as defined above.

Result will be a Vector, or nested set of vectors, of type T where an optional argument with a default value of Float64.

source

GeometryOps.embed_extent Function
julia
embed_extent(obj)

Recursively wrap the object with a GeoInterface.jl geometry, calculating and adding an Extents.Extent to all objects.

This can improve performance when extents need to be checked multiple times, such when needing to check if many points are in geometries, and using their extents as a quick filter for obviously exterior points.

Keywords

  • threaded: true or false. Whether to use multithreading. Defaults to false.

  • crs: The CRS to attach to geometries. Defaults to nothing.

source

Barycentric coordinates

GeometryOps.barycentric_coordinates Function
julia
barycentric_coordinates(method = MeanValue(), polygon, point)

Returns the barycentric coordinates of point in polygon using the barycentric coordinate method method.

source

GeometryOps.barycentric_coordinates! Function
julia
barycentric_coordinates!(λs::Vector{<: Real}, method::AbstractBarycentricCoordinateMethod, polygon, point)

Loads the barycentric coordinates of point in polygon into λs using the barycentric coordinate method method.

λs must be of the length of the polygon plus its holes.

Tip

Use this method to avoid excess allocations when you need to calculate barycentric coordinates for many points.

source

GeometryOps.barycentric_interpolate Function
julia
barycentric_interpolate(method = MeanValue(), polygon, values::AbstractVector{V}, point)

Returns the interpolated value at point within polygon using the barycentric coordinate method method. values are the per-point values for the polygon which are to be interpolated.

Returns an object of type V.

Warning

Barycentric interpolation is currently defined only for 2-dimensional polygons. If you pass a 3-D polygon in, the Z coordinate will be used as per-vertex value to be interpolated (the M coordinate in GIS parlance).

source

Other methods

GeometryOps.AbstractBarycentricCoordinateMethod Type
julia
abstract type AbstractBarycentricCoordinateMethod

Abstract supertype for barycentric coordinate methods. The subtypes may serve as dispatch types, or may cache some information about the target polygon.

API

The following methods must be implemented for all subtypes:

  • barycentric_coordinates!(λs::Vector{<: Real}, method::AbstractBarycentricCoordinateMethod, exterior::Vector{<: Point{2, T1}}, point::Point{2, T2})

  • barycentric_interpolate(method::AbstractBarycentricCoordinateMethod, exterior::Vector{<: Point{2, T1}}, values::Vector{V}, point::Point{2, T2})::V

  • barycentric_interpolate(method::AbstractBarycentricCoordinateMethod, exterior::Vector{<: Point{2, T1}}, interiors::Vector{<: Vector{<: Point{2, T1}}} values::Vector{V}, point::Point{2, T2})::V

The rest of the methods will be implemented in terms of these, and have efficient dispatches for broadcasting.

source

GeometryOps.ClosedRing Type
julia
ClosedRing() <: GeometryCorrection

This correction ensures that a polygon's exterior and interior rings are closed.

It can be called on any geometry correction as usual.

See also GeometryCorrection.

source

GeometryOps.DiffIntersectingPolygons Type
julia
DiffIntersectingPolygons() <: GeometryCorrection

This correction ensures that the polygons included in a multipolygon aren't intersecting. If any polygon's are intersecting, they will be made nonintersecting through the difference operation to create a unique set of disjoint (other than potentially connections by a single point) polygons covering the same area. See also GeometryCorrection, UnionIntersectingPolygons.

source

GeometryOps.DouglasPeucker Type
julia
DouglasPeucker <: SimplifyAlg
+
+DouglasPeucker(; number, ratio, tol)

Simplifies geometries by removing points below tol distance from the line between its neighboring points.

Keywords

  • ratio: the fraction of points that should remain after simplify. Useful as it will generalise for large collections of objects.

  • number: the number of points that should remain after simplify. Less useful for large collections of mixed size objects.

  • tol: the minimum distance a point will be from the line joining its neighboring points.

Note: user input tol is squared to avoid unnecessary computation in algorithm.

source

GeometryOps.GEOS Type
julia
GEOS(; params...)

A struct which instructs the method it's passed to as an algorithm to use the appropriate GEOS function via LibGEOS.jl for the operation.

Dispatch is generally carried out using the names of the keyword arguments. For example, segmentize will only accept a GEOS struct with only a max_distance keyword, and no other.

It's generally a lot slower than the native Julia implementations, since it must convert to the LibGEOS implementation and back - so be warned!

source

GeometryOps.GeodesicSegments Type
julia
GeodesicSegments(; max_distance::Real, equatorial_radius::Real=6378137, flattening::Real=1/298.257223563)

A method for segmentizing geometries by adding extra vertices to the geometry so that no segment is longer than a given distance. This method calculates the distance between points on the geodesic, and assumes input in lat/long coordinates.

Warning

Any input geometries must be in lon/lat coordinates! If not, the method may fail or error.

Arguments

  • max_distance::Real: The maximum distance, in meters, between vertices in the geometry.

  • equatorial_radius::Real=6378137: The equatorial radius of the Earth, in meters. Passed to Proj.geod_geodesic.

  • flattening::Real=1/298.257223563: The flattening of the Earth, which is the ratio of the difference between the equatorial and polar radii to the equatorial radius. Passed to Proj.geod_geodesic.

One can also omit the equatorial_radius and flattening keyword arguments, and pass a geodesic object directly to the eponymous keyword.

This method uses the Proj/GeographicLib API for geodesic calculations.

source

GeometryOps.GeometryCorrection Type
julia
abstract type GeometryCorrection

This abstract type represents a geometry correction.

Interface

Any GeometryCorrection must implement two functions: * application_level(::GeometryCorrection)::AbstractGeometryTrait: This function should return the GeoInterface trait that the correction is intended to be applied to, like PointTrait or LineStringTrait or PolygonTrait. * (::GeometryCorrection)(::AbstractGeometryTrait, geometry)::(some_geometry): This function should apply the correction to the given geometry, and return a new geometry.

source

GeometryOps.LineOrientation Type
julia
Enum LineOrientation

Enum for the orientation of a line with respect to a curve. A line can be line_cross (crossing over the curve), line_hinge (crossing the endpoint of the curve), line_over (collinear with the curve), or line_out (not interacting with the curve).

source

GeometryOps.LinearSegments Type
julia
LinearSegments(; max_distance::Real)

A method for segmentizing geometries by adding extra vertices to the geometry so that no segment is longer than a given distance.

Here, max_distance is a purely nondimensional quantity and will apply in the input space. This is to say, that if the polygon is provided in lat/lon coordinates then the max_distance will be in degrees of arc. If the polygon is provided in meters, then the max_distance will be in meters.

source

GeometryOps.MeanValue Type
julia
MeanValue() <: AbstractBarycentricCoordinateMethod

This method calculates barycentric coordinates using the mean value method.

References

source

GeometryOps.MonotoneChainMethod Type
julia
MonotoneChainMethod()

This is an algorithm for the convex_hull function.

Uses DelaunayTriangulation.jl to compute the convex hull. This is a pure Julia algorithm which provides an optimal Delaunay triangulation.

See also convex_hull

source

GeometryOps.PointOrientation Type
julia
Enum PointOrientation

Enum for the orientation of a point with respect to a curve. A point can be point_in the curve, point_on the curve, or point_out of the curve.

source

GeometryOps.RadialDistance Type
julia
RadialDistance <: SimplifyAlg

Simplifies geometries by removing points less than tol distance from the line between its neighboring points.

Keywords

  • ratio: the fraction of points that should remain after simplify. Useful as it will generalise for large collections of objects.

  • number: the number of points that should remain after simplify. Less useful for large collections of mixed size objects.

  • tol: the minimum distance between points.

Note: user input tol is squared to avoid unnecessary computation in algorithm.

source

GeometryOps.SimplifyAlg Type
julia
abstract type SimplifyAlg

Abstract type for simplification algorithms.

API

For now, the algorithm must hold the number, ratio and tol properties.

Simplification algorithm types can hook into the interface by implementing the _simplify(trait, alg, geom) methods for whichever traits are necessary.

source

GeometryOps.UnionIntersectingPolygons Type
julia
UnionIntersectingPolygons() <: GeometryCorrection

This correction ensures that the polygon's included in a multipolygon aren't intersecting. If any polygon's are intersecting, they will be combined through the union operation to create a unique set of disjoint (other than potentially connections by a single point) polygons covering the same area.

See also GeometryCorrection.

source

GeometryOps.VisvalingamWhyatt Type
julia
VisvalingamWhyatt <: SimplifyAlg
+
+VisvalingamWhyatt(; kw...)

Simplifies geometries by removing points below tol distance from the line between its neighboring points.

Keywords

  • ratio: the fraction of points that should remain after simplify. Useful as it will generalise for large collections of objects.

  • number: the number of points that should remain after simplify. Less useful for large collections of mixed size objects.

  • tol: the minimum area of a triangle made with a point and its neighboring points.

Note: user input tol is doubled to avoid unnecessary computation in algorithm.

source

GeometryOps._det Method
julia
_det(s1::Point2{T1}, s2::Point2{T2}) where {T1 <: Real, T2 <: Real}

Returns the determinant of the matrix formed by hcat'ing two points s1 and s2.

Specifically, this is:

julia
s1[1] * s2[2] - s1[2] * s2[1]

source

GeometryOps._equals_curves Method
julia
_equals_curves(c1, c2, closed_type1, closed_type2)::Bool

Two curves are equal if they share the same set of point, representing the same geometry. Both curves must must be composed of the same set of points, however, they do not have to wind in the same direction, or start on the same point to be equivalent. Inputs: c1 first geometry c2 second geometry closed_type1::Bool true if c1 is closed by definition (polygon, linear ring) closed_type2::Bool true if c2 is closed by definition (polygon, linear ring)

source

GeometryOps.angles Method
julia
angles(geom, ::Type{T} = Float64)

Returns the angles of a geometry or collection of geometries. This is computed differently for different geometries:

- The angles of a point is an empty vector.
+- The angles of a single line segment is an empty vector.
+- The angles of a linestring or linearring is a vector of angles formed by the curve.
+- The angles of a polygon is a vector of vectors of angles formed by each ring.
+- The angles of a multi-geometry collection is a vector of the angles of each of the
+    sub-geometries as defined above.

Result will be a Vector, or nested set of vectors, of type T where an optional argument with a default value of Float64.

source

GeometryOps.area Method
julia
area(geom, [T = Float64])::T

Returns the area of a geometry or collection of geometries. This is computed slightly differently for different geometries:

- The area of a point/multipoint is always zero.
+- The area of a curve/multicurve is always zero.
+- The area of a polygon is the absolute value of the signed area.
+- The area multi-polygon is the sum of the areas of all of the sub-polygons.
+- The area of a geometry collection, feature collection of array/iterable 
+    is the sum of the areas of all of the sub-geometries.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

GeometryOps.barycentric_coordinates! Method
julia
barycentric_coordinates!(λs::Vector{<: Real}, method::AbstractBarycentricCoordinateMethod, polygon, point)

Loads the barycentric coordinates of point in polygon into λs using the barycentric coordinate method method.

λs must be of the length of the polygon plus its holes.

Tip

Use this method to avoid excess allocations when you need to calculate barycentric coordinates for many points.

source

GeometryOps.barycentric_coordinates Method
julia
barycentric_coordinates(method = MeanValue(), polygon, point)

Returns the barycentric coordinates of point in polygon using the barycentric coordinate method method.

source

GeometryOps.barycentric_interpolate Method
julia
barycentric_interpolate(method = MeanValue(), polygon, values::AbstractVector{V}, point)

Returns the interpolated value at point within polygon using the barycentric coordinate method method. values are the per-point values for the polygon which are to be interpolated.

Returns an object of type V.

Warning

Barycentric interpolation is currently defined only for 2-dimensional polygons. If you pass a 3-D polygon in, the Z coordinate will be used as per-vertex value to be interpolated (the M coordinate in GIS parlance).

source

GeometryOps.centroid Method
julia
centroid(geom, [T=Float64])::Tuple{T, T}

Returns the centroid of a given line segment, linear ring, polygon, or mutlipolygon.

source

GeometryOps.centroid_and_area Method
julia
centroid_and_area(geom, [T=Float64])::(::Tuple{T, T}, ::Real)

Returns the centroid and area of a given geometry.

source

GeometryOps.centroid_and_length Method
julia
centroid_and_length(geom, [T=Float64])::(::Tuple{T, T}, ::Real)

Returns the centroid and length of a given line/ring. Note this is only valid for line strings and linear rings.

source

GeometryOps.contains Method
julia
contains(g1::AbstractGeometry, g2::AbstractGeometry)::Bool

Return true if the second geometry is completely contained by the first geometry. The interiors of both geometries must intersect and the interior and boundary of the secondary (g2) must not intersect the exterior of the first (g1).

contains returns the exact opposite result of within.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
+point = GI.Point((1, 2))
+
+GO.contains(line, point)
+# output
+true

source

GeometryOps.convex_hull Function
julia
convex_hull([method], geometries)

Compute the convex hull of the points in geometries. Returns a GI.Polygon representing the convex hull.

Note that the polygon returned is wound counterclockwise as in the Simple Features standard by default. If you choose GEOS, the winding order will be inverted.

Warning

This interface only computes the 2-dimensional convex hull!

For higher dimensional hulls, use the relevant package (Qhull.jl, Quickhull.jl, or similar).

source

GeometryOps.coverage Method
julia
coverage(geom, xmin, xmax, ymin, ymax, [T = Float64])::T

Returns the area of intersection between given geometry and grid cell defined by its minimum and maximum x and y-values. This is computed differently for different geometries:

  • The signed area of a point is always zero.

  • The signed area of a curve is always zero.

  • The signed area of a polygon is calculated by tracing along its edges and switching to the cell edges if needed.

  • The coverage of a geometry collection, multi-geometry, feature collection of array/iterable is the sum of the coverages of all of the sub-geometries.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

GeometryOps.coveredby Method
julia
coveredby(g1, g2)::Bool

Return true if the first geometry is completely covered by the second geometry. The interior and boundary of the primary geometry (g1) must not intersect the exterior of the secondary geometry (g2).

Furthermore, coveredby returns the exact opposite result of covers. They are equivalent with the order of the arguments swapped.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+p1 = GI.Point(0.0, 0.0)
+p2 = GI.Point(1.0, 1.0)
+l1 = GI.Line([p1, p2])
+
+GO.coveredby(p1, l1)
+# output
+true

source

GeometryOps.covers Method
julia
covers(g1::AbstractGeometry, g2::AbstractGeometry)::Bool

Return true if the first geometry is completely covers the second geometry, The exterior and boundary of the second geometry must not be outside of the interior and boundary of the first geometry. However, the interiors need not intersect.

covers returns the exact opposite result of coveredby.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+l1 = GI.LineString([(1.0, 1.0), (1.0, 2.0), (1.0, 3.0), (1.0, 4.0)])
+l2 = GI.LineString([(1.0, 1.0), (1.0, 2.0)])
+
+GO.covers(l1, l2)
+# output
+true

source

GeometryOps.crosses Method
julia
 crosses(geom1, geom2)::Bool

Return true if the intersection results in a geometry whose dimension is one less than the maximum dimension of the two source geometries and the intersection set is interior to both source geometries.

TODO: broken

Examples

julia
import GeoInterface as GI, GeometryOps as GO
+# TODO: Add working example

source

GeometryOps.cut Method
julia
cut(geom, line, [T::Type])

Return given geom cut by given line as a list of geometries of the same type as the input geom. Return the original geometry as only list element if none are found. Line must cut fully through given geometry or the original geometry will be returned.

Note: This currently doesn't work for degenerate cases there line crosses through vertices.

Example

julia
import GeoInterface as GI, GeometryOps as GO
+
+poly = GI.Polygon([[(0.0, 0.0), (10.0, 0.0), (10.0, 10.0), (0.0, 10.0), (0.0, 0.0)]])
+line = GI.Line([(5.0, -5.0), (5.0, 15.0)])
+cut_polys = GO.cut(poly, line)
+GI.coordinates.(cut_polys)
+
+# output
+2-element Vector{Vector{Vector{Vector{Float64}}}}:
+ [[[0.0, 0.0], [5.0, 0.0], [5.0, 10.0], [0.0, 10.0], [0.0, 0.0]]]
+ [[[5.0, 0.0], [10.0, 0.0], [10.0, 10.0], [5.0, 10.0], [5.0, 0.0]]]

source

GeometryOps.difference Method
julia
difference(geom_a, geom_b, [T::Type]; target::Type, fix_multipoly = UnionIntersectingPolygons())

Return the difference between two geometries as a list of geometries. Return an empty list if none are found. The type of the list will be constrained as much as possible given the input geometries. Furthermore, the user can provide a taget type as a keyword argument and a list of target geometries found in the difference will be returned. The user can also provide a float type that they would like the points of returned geometries to be. If the user is taking a intersection involving one or more multipolygons, and the multipolygon might be comprised of polygons that intersect, if fix_multipoly is set to an IntersectingPolygons correction (the default is UnionIntersectingPolygons()), then the needed multipolygons will be fixed to be valid before performing the intersection to ensure a correct answer. Only set fix_multipoly to false if you know that the multipolygons are valid, as it will avoid unneeded computation.

Example

julia
import GeoInterface as GI, GeometryOps as GO
+
+poly1 = GI.Polygon([[[0.0, 0.0], [5.0, 5.0], [10.0, 0.0], [5.0, -5.0], [0.0, 0.0]]])
+poly2 = GI.Polygon([[[3.0, 0.0], [8.0, 5.0], [13.0, 0.0], [8.0, -5.0], [3.0, 0.0]]])
+diff_poly = GO.difference(poly1, poly2; target = GI.PolygonTrait())
+GI.coordinates.(diff_poly)
+
+# output
+1-element Vector{Vector{Vector{Vector{Float64}}}}:
+ [[[6.5, 3.5], [5.0, 5.0], [0.0, 0.0], [5.0, -5.0], [6.5, -3.5], [3.0, 0.0], [6.5, 3.5]]]

source

GeometryOps.disjoint Method
julia
disjoint(geom1, geom2)::Bool

Return true if the first geometry is disjoint from the second geometry.

Return true if the first geometry is disjoint from the second geometry. The interiors and boundaries of both geometries must not intersect.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+
+line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
+point = (2, 2)
+GO.disjoint(point, line)
+
+# output
+true

source

GeometryOps.distance Method
julia
distance(point, geom, ::Type{T} = Float64)::T

Calculates the ditance from the geometry g1 to the point. The distance will always be positive or zero.

The method will differ based on the type of the geometry provided: - The distance from a point to a point is just the Euclidean distance between the points. - The distance from a point to a line is the minimum distance from the point to the closest point on the given line. - The distance from a point to a linestring is the minimum distance from the point to the closest segment of the linestring. - The distance from a point to a linear ring is the minimum distance from the point to the closest segment of the linear ring. - The distance from a point to a polygon is zero if the point is within the polygon and otherwise is the minimum distance from the point to an edge of the polygon. This includes edges created by holes. - The distance from a point to a multigeometry or a geometry collection is the minimum distance between the point and any of the sub-geometries.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

GeometryOps.embed_extent Method
julia
embed_extent(obj)

Recursively wrap the object with a GeoInterface.jl geometry, calculating and adding an Extents.Extent to all objects.

This can improve performance when extents need to be checked multiple times, such when needing to check if many points are in geometries, and using their extents as a quick filter for obviously exterior points.

Keywords

  • threaded: true or false. Whether to use multithreading. Defaults to false.

  • crs: The CRS to attach to geometries. Defaults to nothing.

source

GeometryOps.enforce Method
julia
enforce(alg::GO.GEOS, kw::Symbol, f)

Enforce the presence of a keyword argument in a GEOS algorithm, and return alg.params[kw].

Throws an error if the key is not present, and mentions f in the error message (since there isn't a good way to get the name of the function that called this method).

source

GeometryOps.equals Method
julia
equals(trait_a, geom_a, trait_b, geom_b)

Two geometries which are not of the same type cannot be equal so they always return false.

source

GeometryOps.equals Method
julia
equals(geom1, geom2)::Bool

Compare two Geometries return true if they are the same geometry.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+poly1 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
+poly2 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
+
+GO.equals(poly1, poly2)
+# output
+true

source

GeometryOps.equals Method
julia
equals(
+    ::GI.LinearRingTrait, l1,
+    ::GI.LinearRingTrait, l2,
+)::Bool

Two linear rings are equal if they share the same set of points going along the curve. Note that rings are closed by definition, so they can have, but don't need, a repeated last point to be equal.

source

GeometryOps.equals Method
julia
equals(
+    ::GI.LinearRingTrait, l1,
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
+)::Bool

A linear ring and a line/linestring are equal if they share the same set of points going along the curve. Note that lines aren't closed by definition, but rings are, so the line must have a repeated last point to be equal

source

GeometryOps.equals Method
julia
equals(::GI.MultiPointTrait, mp1, ::GI.MultiPointTrait, mp2)::Bool

Two multipoints are equal if they share the same set of points.

source

GeometryOps.equals Method
julia
equals(::GI.MultiPointTrait, mp1, ::GI.PointTrait, p2)::Bool

A point and a multipoint are equal if the multipoint is composed of a single point that is equivalent to the given point.

source

GeometryOps.equals Method
julia
equals(::GI.PolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool

Two multipolygons are equal if they share the same set of polygons.

source

GeometryOps.equals Method
julia
equals(::GI.MultiPolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool

A polygon and a multipolygon are equal if the multipolygon is composed of a single polygon that is equivalent to the given polygon.

source

GeometryOps.equals Method
julia
equals(::GI.PointTrait, p1, ::GI.MultiPointTrait, mp2)::Bool

A point and a multipoint are equal if the multipoint is composed of a single point that is equivalent to the given point.

source

GeometryOps.equals Method
julia
equals(::GI.PointTrait, p1, ::GI.PointTrait, p2)::Bool

Two points are the same if they have the same x and y (and z if 3D) coordinates.

source

GeometryOps.equals Method
julia
equals(::GI.PolygonTrait, geom_a, ::GI.MultiPolygonTrait, geom_b)::Bool

A polygon and a multipolygon are equal if the multipolygon is composed of a single polygon that is equivalent to the given polygon.

source

GeometryOps.equals Method
julia
equals(::GI.PolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool

Two polygons are equal if they share the same exterior edge and holes.

source

GeometryOps.equals Method
julia
equals(
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
+    ::GI.LinearRingTrait, l2,
+)::Bool

A line/linestring and a linear ring are equal if they share the same set of points going along the curve. Note that lines aren't closed by definition, but rings are, so the line must have a repeated last point to be equal

source

GeometryOps.equals Method
julia
equals(
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
+)::Bool

Two lines/linestrings are equal if they share the same set of points going along the curve. Note that lines/linestrings aren't closed by definition.

source

GeometryOps.equals Method
julia
equals(::T, geom_a, ::T, geom_b)::Bool

Two geometries of the same type, which don't have a equals function to dispatch off of should throw an error.

source

GeometryOps.flip Method
julia
flip(obj)

Swap all of the x and y coordinates in obj, otherwise keeping the original structure (but not necessarily the original type).

Keywords

  • threaded: true or false. Whether to use multithreading. Defaults to false.

  • crs: The CRS to attach to geometries. Defaults to nothing.

  • calc_extent: true or false. Whether to calculate the extent. Defaults to false.

source

GeometryOps.intersection Method
julia
intersection(geom_a, geom_b, [T::Type]; target::Type, fix_multipoly = UnionIntersectingPolygons())

Return the intersection between two geometries as a list of geometries. Return an empty list if none are found. The type of the list will be constrained as much as possible given the input geometries. Furthermore, the user can provide a target type as a keyword argument and a list of target geometries found in the intersection will be returned. The user can also provide a float type that they would like the points of returned geometries to be. If the user is taking a intersection involving one or more multipolygons, and the multipolygon might be comprised of polygons that intersect, if fix_multipoly is set to an IntersectingPolygons correction (the default is UnionIntersectingPolygons()), then the needed multipolygons will be fixed to be valid before performing the intersection to ensure a correct answer. Only set fix_multipoly to nothing if you know that the multipolygons are valid, as it will avoid unneeded computation.

Example

julia
import GeoInterface as GI, GeometryOps as GO
+
+line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)])
+line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)])
+inter_points = GO.intersection(line1, line2; target = GI.PointTrait())
+GI.coordinates.(inter_points)
+
+# output
+1-element Vector{Vector{Float64}}:
+ [125.58375366067548, -14.83572303404496]

source

GeometryOps.intersection_points Method
julia
intersection_points(geom_a, geom_b, [T::Type])

Return a list of intersection tuple points between two geometries. If no intersection points exist, returns an empty list.

Example

jldoctest

+line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)]) line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)]) inter_points = GO.intersection_points(line1, line2)
+
+**output**
+
+1-element Vector{Tuple{Float64, Float64}}:  (125.58375366067548, -14.83572303404496)
+
+
+[source](https://github.com/JuliaGeo/GeometryOps.jl/blob/9f0e22db49f7b49d5352750e9f69705f13c06d64/src/methods/clipping/intersection.jl#L177-L195)
+
+</details>
+
+<details class='jldocstring custom-block' open>
+<summary><a id='GeometryOps.intersects-Tuple{Any, Any}' href='#GeometryOps.intersects-Tuple{Any, Any}'><span class="jlbinding">GeometryOps.intersects</span></a> <Badge type="info" class="jlObjectType jlMethod" text="Method" /></summary>
+
+
+
+```julia
+intersects(geom1, geom2)::Bool

Return true if the interiors or boundaries of the two geometries interact.

intersects returns the exact opposite result of disjoint.

Example

julia
import GeoInterface as GI, GeometryOps as GO
+
+line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)])
+line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)])
+GO.intersects(line1, line2)
+
+# output
+true

source

GeometryOps.isclockwise Method
julia
isclockwise(line::Union{LineString, Vector{Position}})::Bool

Take a ring and return true if the line goes clockwise, or false if the line goes counter-clockwise. "Going clockwise" means, mathematically,

(i=2n(xixi1)(yi+yi1))>0

Example

julia
julia> import GeoInterface as GI, GeometryOps as GO
+julia> ring = GI.LinearRing([(0, 0), (1, 1), (1, 0), (0, 0)]);
+julia> GO.isclockwise(ring)
+# output
+true

source

GeometryOps.isconcave Method
julia
isconcave(poly::Polygon)::Bool

Take a polygon and return true or false as to whether it is concave or not.

Examples

julia
import GeoInterface as GI, GeometryOps as GO
+
+poly = GI.Polygon([[(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)]])
+GO.isconcave(poly)
+
+# output
+false

source

GeometryOps.overlaps Method
julia
overlaps(geom1, geom2)::Bool

Compare two Geometries of the same dimension and return true if their intersection set results in a geometry different from both but of the same dimension. This means one geometry cannot be within or contain the other and they cannot be equal

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+poly1 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
+poly2 = GI.Polygon([[(1,1), (1,6), (6,6), (6,1), (1,1)]])
+
+GO.overlaps(poly1, poly2)
+# output
+true

source

GeometryOps.overlaps Method
julia
overlaps(::GI.AbstractTrait, geom1, ::GI.AbstractTrait, geom2)::Bool

For any non-specified pair, all have non-matching dimensions, return false.

source

GeometryOps.overlaps Method
julia
overlaps(::GI.LineTrait, line1, ::GI.LineTrait, line)::Bool

If the lines overlap, meaning that they are collinear but each have one endpoint outside of the other line, return true. Else false.

source

GeometryOps.overlaps Method
julia
overlaps(
+    ::GI.MultiPointTrait, points1,
+    ::GI.MultiPointTrait, points2,
+)::Bool

If the multipoints overlap, meaning some, but not all, of the points within the multipoints are shared, return true.

source

GeometryOps.overlaps Method
julia
overlaps(
+    ::GI.MultiPolygonTrait, polys1,
+    ::GI.MultiPolygonTrait, polys2,
+)::Bool

Return true if at least one pair of polygons from multipolygons overlap. Else false.

source

GeometryOps.overlaps Method
julia
overlaps(
+    ::GI.MultiPolygonTrait, polys1,
+    ::GI.PolygonTrait, poly2,
+)::Bool

Return true if polygon overlaps with at least one of the polygons within the multipolygon. Else false.

source

GeometryOps.overlaps Method
julia
overlaps(
+    ::GI.PolygonTrait, poly1,
+    ::GI.MultiPolygonTrait, polys2,
+)::Bool

Return true if polygon overlaps with at least one of the polygons within the multipolygon. Else false.

source

GeometryOps.overlaps Method
julia
overlaps(
+    trait_a::GI.PolygonTrait, poly_a,
+    trait_b::GI.PolygonTrait, poly_b,
+)::Bool

If the two polygons intersect with one another, but are not equal, return true. Else false.

source

GeometryOps.overlaps Method
julia
overlaps(
+    ::Union{GI.LineStringTrait, GI.LinearRing}, line1,
+    ::Union{GI.LineStringTrait, GI.LinearRing}, line2,
+)::Bool

If the curves overlap, meaning that at least one edge of each curve overlaps, return true. Else false.

source

GeometryOps.polygon_to_line Method
julia
polygon_to_line(poly::Polygon)

Converts a Polygon to LineString or MultiLineString

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+
+poly = GI.Polygon([[(-2.275543, 53.464547), (-2.275543, 53.489271), (-2.215118, 53.489271), (-2.215118, 53.464547), (-2.275543, 53.464547)]])
+GO.polygon_to_line(poly)
+# output
+GeoInterface.Wrappers.LineString{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(-2.275543, 53.464547), (-2.275543, 53.489271), (-2.215118, 53.489271), (-2.215118, 53.464547), (-2.275543, 53.464547)], nothing, nothing)

source

GeometryOps.polygonize Method
julia
polygonize(A::AbstractMatrix{Bool}; kw...)
+polygonize(f, A::AbstractMatrix; kw...)
+polygonize(xs, ys, A::AbstractMatrix{Bool}; kw...)
+polygonize(f, xs, ys, A::AbstractMatrix; kw...)

Polygonize an AbstractMatrix of values, currently to a single class of polygons.

Returns a MultiPolygon for Bool values and f return values, and a FeatureCollection of Features holding MultiPolygon for all other values.

Function f should return either true or false or a transformation of values into simpler groups, especially useful for floating point arrays.

If xs and ys are ranges, they are used as the pixel/cell center points. If they are Vector of Tuple they are used as the lower and upper bounds of each pixel/cell.

Keywords

  • minpoints: ignore polygons with less than minpoints points.

  • values: the values to turn into polygons. By default these are union(A), If function f is passed these refer to the return values of f, by default union(map(f, A). If values Bool, false is ignored and a single MultiPolygon is returned rather than a FeatureCollection.

Example

julia
using GeometryOps
+A = rand(100, 100)
+multipolygon = polygonize(>(0.5), A);

source

GeometryOps.segmentize Method
julia
segmentize([method = Planar()], geom; max_distance::Real, threaded)

Segmentize a geometry by adding extra vertices to the geometry so that no segment is longer than a given distance. This is useful for plotting geometries with a limited number of vertices, or for ensuring that a geometry is not too "coarse" for a given application.

Arguments

  • method::Manifold = Planar(): The method to use for segmentizing the geometry. At the moment, only Planar (assumes a flat plane) and Geodesic (assumes geometry on the ellipsoidal Earth and uses Vincenty's formulae) are available.

  • geom: The geometry to segmentize. Must be a LineString, LinearRing, Polygon, MultiPolygon, or GeometryCollection, or some vector or table of those.

  • max_distance::Real: The maximum distance between vertices in the geometry. Beware: for Planar, this is in the units of the geometry, but for Geodesic and Spherical it's in units of the radius of the sphere.

Returns a geometry of similar type to the input geometry, but resampled.

source

GeometryOps.signed_area Method
julia
signed_area(geom, [T = Float64])::T

Returns the signed area of a single geometry, based on winding order. This is computed slightly differently for different geometries:

- The signed area of a point is always zero.
+- The signed area of a curve is always zero.
+- The signed area of a polygon is computed with the shoelace formula and is
+positive if the polygon coordinates wind clockwise and negative if
+counterclockwise.
+- You cannot compute the signed area of a multipolygon as it doesn't have a
+meaning as each sub-polygon could have a different winding order.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

GeometryOps.signed_distance Method
julia
signed_distance(point, geom, ::Type{T} = Float64)::T

Calculates the signed distance from the geometry geom to the given point. Points within geom have a negative signed distance, and points outside of geom have a positive signed distance. - The signed distance from a point to a point, line, linestring, or linear ring is equal to the distance between the two. - The signed distance from a point to a polygon is negative if the point is within the polygon and is positive otherwise. The value of the distance is the minimum distance from the point to an edge of the polygon. This includes edges created by holes. - The signed distance from a point to a multigeometry or a geometry collection is the minimum signed distance between the point and any of the sub-geometries.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

GeometryOps.simplify Method
julia
simplify(obj; kw...)
+simplify(::SimplifyAlg, obj; kw...)

Simplify a geometry, feature, feature collection, or nested vectors or a table of these.

RadialDistance, DouglasPeucker, or VisvalingamWhyatt algorithms are available, listed in order of increasing quality but decreasing performance.

PoinTrait and MultiPointTrait are returned unchanged.

The default behaviour is simplify(DouglasPeucker(; kw...), obj). Pass in other SimplifyAlg to use other algorithms.

Keywords

  • prefilter_alg: SimplifyAlg algorithm used to pre-filter object before using primary filtering algorithm.

  • threaded: true or false. Whether to use multithreading. Defaults to false.

  • crs: The CRS to attach to geometries. Defaults to nothing.

  • calc_extent: true or false. Whether to calculate the extent. Defaults to false.

Keywords for DouglasPeucker are allowed when no algorithm is specified:

Keywords

  • ratio: the fraction of points that should remain after simplify. Useful as it will generalise for large collections of objects.

  • number: the number of points that should remain after simplify. Less useful for large collections of mixed size objects.

  • tol: the minimum distance a point will be from the line joining its neighboring points.

Example

Simplify a polygon to have six points:

julia
import GeoInterface as GI
+import GeometryOps as GO
+
+poly = GI.Polygon([[
+    [-70.603637, -33.399918],
+    [-70.614624, -33.395332],
+    [-70.639343, -33.392466],
+    [-70.659942, -33.394759],
+    [-70.683975, -33.404504],
+    [-70.697021, -33.419406],
+    [-70.701141, -33.434306],
+    [-70.700454, -33.446339],
+    [-70.694274, -33.458369],
+    [-70.682601, -33.465816],
+    [-70.668869, -33.472117],
+    [-70.646209, -33.473835],
+    [-70.624923, -33.472117],
+    [-70.609817, -33.468107],
+    [-70.595397, -33.458369],
+    [-70.587158, -33.442901],
+    [-70.587158, -33.426283],
+    [-70.590591, -33.414248],
+    [-70.594711, -33.406224],
+    [-70.603637, -33.399918]]])
+
+simple = GO.simplify(poly; number=6)
+GI.npoint(simple)
+
+# output
+6

source

GeometryOps.t_value Method
julia
t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)

Returns the "T-value" as described in Hormann's presentation [1] on how to calculate the mean-value coordinate.

Here, sᵢ is the vector from vertex vᵢ to the point, and rᵢ is the norm (length) of sᵢ. s must be Point and r must be real numbers.

t=det(s,s)rr+ss

+
+[source](https://github.com/JuliaGeo/GeometryOps.jl/blob/9f0e22db49f7b49d5352750e9f69705f13c06d64/src/methods/barycentric.jl#L289-L305)
+
+</details>
+
+<details class='jldocstring custom-block' open>
+<summary><a id='GeometryOps.to_edges-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T' href='#GeometryOps.to_edges-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T'><span class="jlbinding">GeometryOps.to_edges</span></a> <Badge type="info" class="jlObjectType jlMethod" text="Method" /></summary>
+
+
+
+```julia
+to_edges()

Convert any geometry or collection of geometries into a flat vector of Tuple{Tuple{Float64,Float64},Tuple{Float64,Float64}} edges.

source

GeometryOps.touches Method
julia
touches(geom1, geom2)::Bool

Return true if the first geometry touches the second geometry. In other words, the two interiors cannot interact, but one of the geometries must have a boundary point that interacts with either the other geometry's interior or boundary.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+
+l1 = GI.Line([(0.0, 0.0), (1.0, 0.0)])
+l2 = GI.Line([(1.0, 1.0), (1.0, -1.0)])
+
+GO.touches(l1, l2)
+# output
+true

source

GeometryOps.transform Method
julia
transform(f, obj)

Apply a function f to all the points in obj.

Points will be passed to f as an SVector to allow using CoordinateTransformations.jl and Rotations.jl without hassle.

SVector is also a valid GeoInterface.jl point, so will work in all GeoInterface.jl methods.

Example

julia
julia> import GeoInterface as GI
+
+julia> import GeometryOps as GO
+
+julia> geom = GI.Polygon([GI.LinearRing([(1, 2), (3, 4), (5, 6), (1, 2)]), GI.LinearRing([(3, 4), (5, 6), (6, 7), (3, 4)])]);
+
+julia> f = CoordinateTransformations.Translation(3.5, 1.5)
+Translation(3.5, 1.5)
+
+julia> GO.transform(f, geom)
+GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Linea
+rRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticArraysCo
+re.SVector{2, Float64}[[4.5, 3.5], [6.5, 5.5], [8.5, 7.5], [4.5, 3.5]], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticA
+rraysCore.SVector{2, Float64}[[6.5, 5.5], [8.5, 7.5], [9.5, 8.5], [6.5, 5.5]], nothing, nothing)], nothing, nothing)

With Rotations.jl you need to actually multiply the Rotation by the SVector point, which is easy using an anonymous function.

julia
julia> using Rotations
+
+julia> GO.transform(p -> one(RotMatrix{2}) * p, geom)
+GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearR
+ing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}(StaticArraysCore.SVe
+ctor{2, Int64}[[2, 1], [4, 3], [6, 5], [2, 1]], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}(StaticArraysCore.SVector{2, Int64
+}[[4, 3], [6, 5], [7, 6], [4, 3]], nothing, nothing)], nothing, nothing)

source

GeometryOps.tuples Method
julia
tuples(obj)

Convert all points in obj to Tuples, wherever the are nested.

Returns a similar object or collection of objects using GeoInterface.jl geometries wrapping Tuple points.

Keywords

  • threaded: true or false. Whether to use multithreading. Defaults to false.

  • crs: The CRS to attach to geometries. Defaults to nothing.

  • calc_extent: true or false. Whether to calculate the extent. Defaults to false.

source

GeometryOps.union Method
julia
union(geom_a, geom_b, [::Type{T}]; target::Type, fix_multipoly = UnionIntersectingPolygons())

Return the union between two geometries as a list of geometries. Return an empty list if none are found. The type of the list will be constrained as much as possible given the input geometries. Furthermore, the user can provide a taget type as a keyword argument and a list of target geometries found in the difference will be returned. The user can also provide a float type 'T' that they would like the points of returned geometries to be. If the user is taking a intersection involving one or more multipolygons, and the multipolygon might be comprised of polygons that intersect, if fix_multipoly is set to an IntersectingPolygons correction (the default is UnionIntersectingPolygons()), then the needed multipolygons will be fixed to be valid before performing the intersection to ensure a correct answer. Only set fix_multipoly to false if you know that the multipolygons are valid, as it will avoid unneeded computation.

Calculates the union between two polygons.

Example

julia
import GeoInterface as GI, GeometryOps as GO
+
+p1 = GI.Polygon([[(0.0, 0.0), (5.0, 5.0), (10.0, 0.0), (5.0, -5.0), (0.0, 0.0)]])
+p2 = GI.Polygon([[(3.0, 0.0), (8.0, 5.0), (13.0, 0.0), (8.0, -5.0), (3.0, 0.0)]])
+union_poly = GO.union(p1, p2; target = GI.PolygonTrait())
+GI.coordinates.(union_poly)
+
+# output
+1-element Vector{Vector{Vector{Vector{Float64}}}}:
+ [[[6.5, 3.5], [5.0, 5.0], [0.0, 0.0], [5.0, -5.0], [6.5, -3.5], [8.0, -5.0], [13.0, 0.0], [8.0, 5.0], [6.5, 3.5]]]

source

GeometryOps.weighted_mean Method
julia
weighted_mean(weight::Real, x1, x2)

Returns the weighted mean of x1 and x2, where weight is the weight of x1.

Specifically, calculates x1 * weight + x2 * (1 - weight).

Note

The idea for this method is that you can override this for custom types, like Color types, in extension modules.

source

GeometryOps.within Method
julia
within(geom1, geom2)::Bool

Return true if the first geometry is completely within the second geometry. The interiors of both geometries must intersect and the interior and boundary of the primary geometry (geom1) must not intersect the exterior of the secondary geometry (geom2).

Furthermore, within returns the exact opposite result of contains.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+
+line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
+point = (1, 2)
+GO.within(point, line)
+
+# output
+true

source


  1. K. Hormann and N. Sukumar. Generalized Barycentric Coordinates in Computer Graphics and Computational Mechanics. Taylor & Fancis, CRC Press, 2017. ↩︎

+ + + + \ No newline at end of file diff --git a/previews/PR239/assets/api.md.BkfD-VZg.js b/previews/PR239/assets/api.md.BkfD-VZg.js new file mode 100644 index 000000000..952041e56 --- /dev/null +++ b/previews/PR239/assets/api.md.BkfD-VZg.js @@ -0,0 +1,381 @@ +import{_ as h,c as l,a5 as a,j as i,a as e,G as n,B as k,o as p}from"./chunks/framework.onQNwZ2I.js";const mi=JSON.parse('{"title":"Full GeometryOps API documentation","description":"","frontmatter":{},"headers":[],"relativePath":"api.md","filePath":"api.md","lastUpdated":null}'),r={name:"api.md"},o={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},G={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},O={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},Q={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""},L={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},P={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},R={class:"jldocstring custom-block",open:""},S={class:"jldocstring custom-block",open:""},V={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},U={class:"jldocstring custom-block",open:""},H={class:"jldocstring custom-block",open:""},N={class:"jldocstring custom-block",open:""},W={class:"jldocstring custom-block",open:""},z={class:"jldocstring custom-block",open:""},Z={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},K={class:"jldocstring custom-block",open:""},X={class:"jldocstring custom-block",open:""},$={class:"jldocstring custom-block",open:""},Y={class:"jldocstring custom-block",open:""},ss={class:"jldocstring custom-block",open:""},is={class:"jldocstring custom-block",open:""},as={class:"jldocstring custom-block",open:""},es={class:"jldocstring custom-block",open:""},ts={class:"jldocstring custom-block",open:""},ns={class:"jldocstring custom-block",open:""},ls={class:"jldocstring custom-block",open:""},ps={class:"jldocstring custom-block",open:""},hs={class:"jldocstring custom-block",open:""},ks={class:"jldocstring custom-block",open:""},rs={class:"jldocstring custom-block",open:""},os={class:"jldocstring custom-block",open:""},ds={class:"jldocstring custom-block",open:""},gs={class:"jldocstring custom-block",open:""},ys={class:"jldocstring custom-block",open:""},Es={class:"jldocstring custom-block",open:""},cs={class:"jldocstring custom-block",open:""},us={class:"jldocstring custom-block",open:""},ms={class:"jldocstring custom-block",open:""},Fs={class:"jldocstring custom-block",open:""},Cs={class:"jldocstring custom-block",open:""},bs={class:"jldocstring custom-block",open:""},fs={class:"jldocstring custom-block",open:""},Ts={class:"jldocstring custom-block",open:""},Gs={class:"jldocstring custom-block",open:""},vs={class:"jldocstring custom-block",open:""},As={class:"jldocstring custom-block",open:""},js={class:"jldocstring custom-block",open:""},Bs={class:"jldocstring custom-block",open:""},Os={class:"jldocstring custom-block",open:""},Ds={class:"jldocstring custom-block",open:""},Qs={class:"jldocstring custom-block",open:""},xs={class:"jldocstring custom-block",open:""},ws={class:"jldocstring custom-block",open:""},Ls={class:"jldocstring custom-block",open:""},Is={class:"jldocstring custom-block",open:""},Ms={class:"jldocstring custom-block",open:""},Ps={class:"jldocstring custom-block",open:""},qs={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},Rs={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.827ex"},xmlns:"http://www.w3.org/2000/svg",width:"33.539ex",height:"6.785ex",role:"img",focusable:"false",viewBox:"0 -1749.5 14824.1 2999","aria-hidden":"true"},Ss={class:"jldocstring custom-block",open:""},Vs={class:"jldocstring custom-block",open:""},Js={class:"jldocstring custom-block",open:""},Us={class:"jldocstring custom-block",open:""},Hs={class:"jldocstring custom-block",open:""},Ns={class:"jldocstring custom-block",open:""},Ws={class:"jldocstring custom-block",open:""},zs={class:"jldocstring custom-block",open:""},Zs={class:"jldocstring custom-block",open:""},_s={class:"jldocstring custom-block",open:""},Ks={class:"jldocstring custom-block",open:""},Xs={class:"jldocstring custom-block",open:""},$s={class:"jldocstring custom-block",open:""},Ys={class:"jldocstring custom-block",open:""},si={class:"jldocstring custom-block",open:""},ii={class:"jldocstring custom-block",open:""},ai={class:"jldocstring custom-block",open:""},ei={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},ti={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.059ex"},xmlns:"http://www.w3.org/2000/svg",width:"27.746ex",height:"5.362ex",role:"img",focusable:"false",viewBox:"0 -1460 12263.9 2370","aria-hidden":"true"},ni={class:"jldocstring custom-block",open:""},li={class:"jldocstring custom-block",open:""},pi={class:"jldocstring custom-block",open:""},hi={class:"jldocstring custom-block",open:""},ki={class:"jldocstring custom-block",open:""},ri={class:"jldocstring custom-block",open:""};function oi(di,s,gi,yi,Ei,ci){const t=k("Badge");return p(),l("div",null,[s[318]||(s[318]=a('

Full GeometryOps API documentation

Warning

This page is still very much WIP!

Documentation for GeometryOps's full API (only for reference!).

apply and associated functions

',5)),i("details",o,[i("summary",null,[s[0]||(s[0]=i("a",{id:"GeometryOpsCore.apply",href:"#GeometryOpsCore.apply"},[i("span",{class:"jlbinding"},"GeometryOpsCore.apply")],-1)),s[1]||(s[1]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=a(`
julia
apply(f, target::Union{TraitTarget, GI.AbstractTrait}, obj; kw...)

Reconstruct a geometry, feature, feature collection, or nested vectors of either using the function f on the target trait.

f(target_geom) => x where x also has the target trait, or a trait that can be substituted. For example, swapping PolgonTrait to MultiPointTrait will fail if the outer object has MultiPolygonTrait, but should work if it has FeatureTrait.

Objects "shallower" than the target trait are always completely rebuilt, like a Vector of FeatureCollectionTrait of FeatureTrait when the target has PolygonTrait and is held in the features. These will always be GeoInterface geometries/feature/feature collections. But "deeper" objects may remain unchanged or be whatever GeoInterface compatible objects f returns.

The result is a functionally similar geometry with values depending on f.

Example

Flipped point the order in any feature or geometry, or iterables of either:

julia
import GeoInterface as GI
+import GeometryOps as GO
+geom = GI.Polygon([GI.LinearRing([(1, 2), (3, 4), (5, 6), (1, 2)]),
+                   GI.LinearRing([(3, 4), (5, 6), (6, 7), (3, 4)])])
+
+flipped_geom = GO.apply(GI.PointTrait, geom) do p
+    (GI.y(p), GI.x(p))
+end

source

`,10))]),i("details",d,[i("summary",null,[s[3]||(s[3]=i("a",{id:"GeometryOpsCore.applyreduce",href:"#GeometryOpsCore.applyreduce"},[i("span",{class:"jlbinding"},"GeometryOpsCore.applyreduce")],-1)),s[4]||(s[4]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=a('
julia
applyreduce(f, op, target::Union{TraitTarget, GI.AbstractTrait}, obj; threaded)

Apply function f to all objects with the target trait, and reduce the result with an op like +.

The order and grouping of application of op is not guaranteed.

If threaded==true threads will be used over arrays and iterables, feature collections and nested geometries.

source

',5))]),i("details",g,[i("summary",null,[s[6]||(s[6]=i("a",{id:"GeometryOps.reproject",href:"#GeometryOps.reproject"},[i("span",{class:"jlbinding"},"GeometryOps.reproject")],-1)),s[7]||(s[7]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=a(`
julia
reproject(geometry; source_crs, target_crs, transform, always_xy, time)
+reproject(geometry, source_crs, target_crs; always_xy, time)
+reproject(geometry, transform; always_xy, time)

Reproject any GeoInterface.jl compatible geometry from source_crs to target_crs.

The returned object will be constructed from GeoInterface.WrapperGeometry geometries, wrapping views of a Vector{Proj.Point{D}}, where D is the dimension.

Tip

The Proj.jl package must be loaded for this method to work, since it is implemented in a package extension.

Arguments

If these a passed as keywords, transform will take priority. Without it target_crs is always needed, and source_crs is needed if it is not retrievable from the geometry with GeoInterface.crs(geometry).

Keywords

source

`,10))]),i("details",y,[i("summary",null,[s[9]||(s[9]=i("a",{id:"GeometryOps.transform",href:"#GeometryOps.transform"},[i("span",{class:"jlbinding"},"GeometryOps.transform")],-1)),s[10]||(s[10]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[11]||(s[11]=a(`
julia
transform(f, obj)

Apply a function f to all the points in obj.

Points will be passed to f as an SVector to allow using CoordinateTransformations.jl and Rotations.jl without hassle.

SVector is also a valid GeoInterface.jl point, so will work in all GeoInterface.jl methods.

Example

julia
julia> import GeoInterface as GI
+
+julia> import GeometryOps as GO
+
+julia> geom = GI.Polygon([GI.LinearRing([(1, 2), (3, 4), (5, 6), (1, 2)]), GI.LinearRing([(3, 4), (5, 6), (6, 7), (3, 4)])]);
+
+julia> f = CoordinateTransformations.Translation(3.5, 1.5)
+Translation(3.5, 1.5)
+
+julia> GO.transform(f, geom)
+GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Linea
+rRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticArraysCo
+re.SVector{2, Float64}[[4.5, 3.5], [6.5, 5.5], [8.5, 7.5], [4.5, 3.5]], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticA
+rraysCore.SVector{2, Float64}[[6.5, 5.5], [8.5, 7.5], [9.5, 8.5], [6.5, 5.5]], nothing, nothing)], nothing, nothing)

With Rotations.jl you need to actually multiply the Rotation by the SVector point, which is easy using an anonymous function.

julia
julia> using Rotations
+
+julia> GO.transform(p -> one(RotMatrix{2}) * p, geom)
+GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearR
+ing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}(StaticArraysCore.SVe
+ctor{2, Int64}[[2, 1], [4, 3], [6, 5], [2, 1]], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}(StaticArraysCore.SVector{2, Int64
+}[[4, 3], [6, 5], [7, 6], [4, 3]], nothing, nothing)], nothing, nothing)

source

`,9))]),s[319]||(s[319]=i("h2",{id:"General-geometry-methods",tabindex:"-1"},[e("General geometry methods "),i("a",{class:"header-anchor",href:"#General-geometry-methods","aria-label":'Permalink to "General geometry methods {#General-geometry-methods}"'},"​")],-1)),s[320]||(s[320]=i("h3",{id:"OGC-methods",tabindex:"-1"},[e("OGC methods "),i("a",{class:"header-anchor",href:"#OGC-methods","aria-label":'Permalink to "OGC methods {#OGC-methods}"'},"​")],-1)),i("details",E,[i("summary",null,[s[12]||(s[12]=i("a",{id:"GeometryOps.contains",href:"#GeometryOps.contains"},[i("span",{class:"jlbinding"},"GeometryOps.contains")],-1)),s[13]||(s[13]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[14]||(s[14]=a(`
julia
contains(g1::AbstractGeometry, g2::AbstractGeometry)::Bool

Return true if the second geometry is completely contained by the first geometry. The interiors of both geometries must intersect and the interior and boundary of the secondary (g2) must not intersect the exterior of the first (g1).

contains returns the exact opposite result of within.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
+point = GI.Point((1, 2))
+
+GO.contains(line, point)
+# output
+true

source

`,6))]),i("details",c,[i("summary",null,[s[15]||(s[15]=i("a",{id:"GeometryOps.coveredby",href:"#GeometryOps.coveredby"},[i("span",{class:"jlbinding"},"GeometryOps.coveredby")],-1)),s[16]||(s[16]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=a(`
julia
coveredby(g1, g2)::Bool

Return true if the first geometry is completely covered by the second geometry. The interior and boundary of the primary geometry (g1) must not intersect the exterior of the secondary geometry (g2).

Furthermore, coveredby returns the exact opposite result of covers. They are equivalent with the order of the arguments swapped.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+p1 = GI.Point(0.0, 0.0)
+p2 = GI.Point(1.0, 1.0)
+l1 = GI.Line([p1, p2])
+
+GO.coveredby(p1, l1)
+# output
+true

source

`,6))]),i("details",u,[i("summary",null,[s[18]||(s[18]=i("a",{id:"GeometryOps.covers",href:"#GeometryOps.covers"},[i("span",{class:"jlbinding"},"GeometryOps.covers")],-1)),s[19]||(s[19]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[20]||(s[20]=a(`
julia
covers(g1::AbstractGeometry, g2::AbstractGeometry)::Bool

Return true if the first geometry is completely covers the second geometry, The exterior and boundary of the second geometry must not be outside of the interior and boundary of the first geometry. However, the interiors need not intersect.

covers returns the exact opposite result of coveredby.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+l1 = GI.LineString([(1.0, 1.0), (1.0, 2.0), (1.0, 3.0), (1.0, 4.0)])
+l2 = GI.LineString([(1.0, 1.0), (1.0, 2.0)])
+
+GO.covers(l1, l2)
+# output
+true

source

`,6))]),i("details",m,[i("summary",null,[s[21]||(s[21]=i("a",{id:"GeometryOps.crosses",href:"#GeometryOps.crosses"},[i("span",{class:"jlbinding"},"GeometryOps.crosses")],-1)),s[22]||(s[22]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[23]||(s[23]=a(`
julia
 crosses(geom1, geom2)::Bool

Return true if the intersection results in a geometry whose dimension is one less than the maximum dimension of the two source geometries and the intersection set is interior to both source geometries.

TODO: broken

Examples

julia
import GeoInterface as GI, GeometryOps as GO
+# TODO: Add working example

source

`,6))]),i("details",F,[i("summary",null,[s[24]||(s[24]=i("a",{id:"GeometryOps.disjoint",href:"#GeometryOps.disjoint"},[i("span",{class:"jlbinding"},"GeometryOps.disjoint")],-1)),s[25]||(s[25]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=a(`
julia
disjoint(geom1, geom2)::Bool

Return true if the first geometry is disjoint from the second geometry.

Return true if the first geometry is disjoint from the second geometry. The interiors and boundaries of both geometries must not intersect.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+
+line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
+point = (2, 2)
+GO.disjoint(point, line)
+
+# output
+true

source

`,6))]),i("details",C,[i("summary",null,[s[27]||(s[27]=i("a",{id:"GeometryOps.intersects",href:"#GeometryOps.intersects"},[i("span",{class:"jlbinding"},"GeometryOps.intersects")],-1)),s[28]||(s[28]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[29]||(s[29]=a(`
julia
intersects(geom1, geom2)::Bool

Return true if the interiors or boundaries of the two geometries interact.

intersects returns the exact opposite result of disjoint.

Example

julia
import GeoInterface as GI, GeometryOps as GO
+
+line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)])
+line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)])
+GO.intersects(line1, line2)
+
+# output
+true

source

`,6))]),i("details",b,[i("summary",null,[s[30]||(s[30]=i("a",{id:"GeometryOps.overlaps",href:"#GeometryOps.overlaps"},[i("span",{class:"jlbinding"},"GeometryOps.overlaps")],-1)),s[31]||(s[31]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[32]||(s[32]=a(`
julia
overlaps(geom1, geom2)::Bool

Compare two Geometries of the same dimension and return true if their intersection set results in a geometry different from both but of the same dimension. This means one geometry cannot be within or contain the other and they cannot be equal

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+poly1 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
+poly2 = GI.Polygon([[(1,1), (1,6), (6,6), (6,1), (1,1)]])
+
+GO.overlaps(poly1, poly2)
+# output
+true

source

julia
overlaps(::GI.AbstractTrait, geom1, ::GI.AbstractTrait, geom2)::Bool

For any non-specified pair, all have non-matching dimensions, return false.

source

julia
overlaps(
+    ::GI.MultiPointTrait, points1,
+    ::GI.MultiPointTrait, points2,
+)::Bool

If the multipoints overlap, meaning some, but not all, of the points within the multipoints are shared, return true.

source

julia
overlaps(::GI.LineTrait, line1, ::GI.LineTrait, line)::Bool

If the lines overlap, meaning that they are collinear but each have one endpoint outside of the other line, return true. Else false.

source

julia
overlaps(
+    ::Union{GI.LineStringTrait, GI.LinearRing}, line1,
+    ::Union{GI.LineStringTrait, GI.LinearRing}, line2,
+)::Bool

If the curves overlap, meaning that at least one edge of each curve overlaps, return true. Else false.

source

julia
overlaps(
+    trait_a::GI.PolygonTrait, poly_a,
+    trait_b::GI.PolygonTrait, poly_b,
+)::Bool

If the two polygons intersect with one another, but are not equal, return true. Else false.

source

julia
overlaps(
+    ::GI.PolygonTrait, poly1,
+    ::GI.MultiPolygonTrait, polys2,
+)::Bool

Return true if polygon overlaps with at least one of the polygons within the multipolygon. Else false.

source

julia
overlaps(
+    ::GI.MultiPolygonTrait, polys1,
+    ::GI.PolygonTrait, poly2,
+)::Bool

Return true if polygon overlaps with at least one of the polygons within the multipolygon. Else false.

source

julia
overlaps(
+    ::GI.MultiPolygonTrait, polys1,
+    ::GI.MultiPolygonTrait, polys2,
+)::Bool

Return true if at least one pair of polygons from multipolygons overlap. Else false.

source

`,29))]),i("details",f,[i("summary",null,[s[33]||(s[33]=i("a",{id:"GeometryOps.touches",href:"#GeometryOps.touches"},[i("span",{class:"jlbinding"},"GeometryOps.touches")],-1)),s[34]||(s[34]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[35]||(s[35]=a(`
julia
touches(geom1, geom2)::Bool

Return true if the first geometry touches the second geometry. In other words, the two interiors cannot interact, but one of the geometries must have a boundary point that interacts with either the other geometry's interior or boundary.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+
+l1 = GI.Line([(0.0, 0.0), (1.0, 0.0)])
+l2 = GI.Line([(1.0, 1.0), (1.0, -1.0)])
+
+GO.touches(l1, l2)
+# output
+true

source

`,5))]),i("details",T,[i("summary",null,[s[36]||(s[36]=i("a",{id:"GeometryOps.within",href:"#GeometryOps.within"},[i("span",{class:"jlbinding"},"GeometryOps.within")],-1)),s[37]||(s[37]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[38]||(s[38]=a(`
julia
within(geom1, geom2)::Bool

Return true if the first geometry is completely within the second geometry. The interiors of both geometries must intersect and the interior and boundary of the primary geometry (geom1) must not intersect the exterior of the secondary geometry (geom2).

Furthermore, within returns the exact opposite result of contains.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+
+line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
+point = (1, 2)
+GO.within(point, line)
+
+# output
+true

source

`,6))]),s[321]||(s[321]=i("h3",{id:"Other-general-methods",tabindex:"-1"},[e("Other general methods "),i("a",{class:"header-anchor",href:"#Other-general-methods","aria-label":'Permalink to "Other general methods {#Other-general-methods}"'},"​")],-1)),i("details",G,[i("summary",null,[s[39]||(s[39]=i("a",{id:"GeometryOps.equals",href:"#GeometryOps.equals"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[40]||(s[40]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[41]||(s[41]=a(`
julia
equals(geom1, geom2)::Bool

Compare two Geometries return true if they are the same geometry.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+poly1 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
+poly2 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
+
+GO.equals(poly1, poly2)
+# output
+true

source

julia
equals(::T, geom_a, ::T, geom_b)::Bool

Two geometries of the same type, which don't have a equals function to dispatch off of should throw an error.

source

julia
equals(trait_a, geom_a, trait_b, geom_b)

Two geometries which are not of the same type cannot be equal so they always return false.

source

julia
equals(::GI.PointTrait, p1, ::GI.PointTrait, p2)::Bool

Two points are the same if they have the same x and y (and z if 3D) coordinates.

source

julia
equals(::GI.PointTrait, p1, ::GI.MultiPointTrait, mp2)::Bool

A point and a multipoint are equal if the multipoint is composed of a single point that is equivalent to the given point.

source

julia
equals(::GI.MultiPointTrait, mp1, ::GI.PointTrait, p2)::Bool

A point and a multipoint are equal if the multipoint is composed of a single point that is equivalent to the given point.

source

julia
equals(::GI.MultiPointTrait, mp1, ::GI.MultiPointTrait, mp2)::Bool

Two multipoints are equal if they share the same set of points.

source

julia
equals(
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
+)::Bool

Two lines/linestrings are equal if they share the same set of points going along the curve. Note that lines/linestrings aren't closed by definition.

source

julia
equals(
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
+    ::GI.LinearRingTrait, l2,
+)::Bool

A line/linestring and a linear ring are equal if they share the same set of points going along the curve. Note that lines aren't closed by definition, but rings are, so the line must have a repeated last point to be equal

source

julia
equals(
+    ::GI.LinearRingTrait, l1,
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
+)::Bool

A linear ring and a line/linestring are equal if they share the same set of points going along the curve. Note that lines aren't closed by definition, but rings are, so the line must have a repeated last point to be equal

source

julia
equals(
+    ::GI.LinearRingTrait, l1,
+    ::GI.LinearRingTrait, l2,
+)::Bool

Two linear rings are equal if they share the same set of points going along the curve. Note that rings are closed by definition, so they can have, but don't need, a repeated last point to be equal.

source

julia
equals(::GI.PolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool

Two polygons are equal if they share the same exterior edge and holes.

source

julia
equals(::GI.PolygonTrait, geom_a, ::GI.MultiPolygonTrait, geom_b)::Bool

A polygon and a multipolygon are equal if the multipolygon is composed of a single polygon that is equivalent to the given polygon.

source

julia
equals(::GI.MultiPolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool

A polygon and a multipolygon are equal if the multipolygon is composed of a single polygon that is equivalent to the given polygon.

source

julia
equals(::GI.PolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool

Two multipolygons are equal if they share the same set of polygons.

source

`,47))]),i("details",v,[i("summary",null,[s[42]||(s[42]=i("a",{id:"GeometryOps.centroid",href:"#GeometryOps.centroid"},[i("span",{class:"jlbinding"},"GeometryOps.centroid")],-1)),s[43]||(s[43]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[44]||(s[44]=a('
julia
centroid(geom, [T=Float64])::Tuple{T, T}

Returns the centroid of a given line segment, linear ring, polygon, or mutlipolygon.

source

',3))]),i("details",A,[i("summary",null,[s[45]||(s[45]=i("a",{id:"GeometryOps.distance",href:"#GeometryOps.distance"},[i("span",{class:"jlbinding"},"GeometryOps.distance")],-1)),s[46]||(s[46]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[47]||(s[47]=a('
julia
distance(point, geom, ::Type{T} = Float64)::T

Calculates the ditance from the geometry g1 to the point. The distance will always be positive or zero.

The method will differ based on the type of the geometry provided: - The distance from a point to a point is just the Euclidean distance between the points. - The distance from a point to a line is the minimum distance from the point to the closest point on the given line. - The distance from a point to a linestring is the minimum distance from the point to the closest segment of the linestring. - The distance from a point to a linear ring is the minimum distance from the point to the closest segment of the linear ring. - The distance from a point to a polygon is zero if the point is within the polygon and otherwise is the minimum distance from the point to an edge of the polygon. This includes edges created by holes. - The distance from a point to a multigeometry or a geometry collection is the minimum distance between the point and any of the sub-geometries.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

',5))]),i("details",j,[i("summary",null,[s[48]||(s[48]=i("a",{id:"GeometryOps.signed_distance",href:"#GeometryOps.signed_distance"},[i("span",{class:"jlbinding"},"GeometryOps.signed_distance")],-1)),s[49]||(s[49]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[50]||(s[50]=a('
julia
signed_distance(point, geom, ::Type{T} = Float64)::T

Calculates the signed distance from the geometry geom to the given point. Points within geom have a negative signed distance, and points outside of geom have a positive signed distance. - The signed distance from a point to a point, line, linestring, or linear ring is equal to the distance between the two. - The signed distance from a point to a polygon is negative if the point is within the polygon and is positive otherwise. The value of the distance is the minimum distance from the point to an edge of the polygon. This includes edges created by holes. - The signed distance from a point to a multigeometry or a geometry collection is the minimum signed distance between the point and any of the sub-geometries.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

',4))]),i("details",B,[i("summary",null,[s[51]||(s[51]=i("a",{id:"GeometryOps.area",href:"#GeometryOps.area"},[i("span",{class:"jlbinding"},"GeometryOps.area")],-1)),s[52]||(s[52]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[53]||(s[53]=a(`
julia
area(geom, [T = Float64])::T

Returns the area of a geometry or collection of geometries. This is computed slightly differently for different geometries:

- The area of a point/multipoint is always zero.
+- The area of a curve/multicurve is always zero.
+- The area of a polygon is the absolute value of the signed area.
+- The area multi-polygon is the sum of the areas of all of the sub-polygons.
+- The area of a geometry collection, feature collection of array/iterable 
+    is the sum of the areas of all of the sub-geometries.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

`,5))]),i("details",O,[i("summary",null,[s[54]||(s[54]=i("a",{id:"GeometryOps.signed_area",href:"#GeometryOps.signed_area"},[i("span",{class:"jlbinding"},"GeometryOps.signed_area")],-1)),s[55]||(s[55]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[56]||(s[56]=a(`
julia
signed_area(geom, [T = Float64])::T

Returns the signed area of a single geometry, based on winding order. This is computed slightly differently for different geometries:

- The signed area of a point is always zero.
+- The signed area of a curve is always zero.
+- The signed area of a polygon is computed with the shoelace formula and is
+positive if the polygon coordinates wind clockwise and negative if
+counterclockwise.
+- You cannot compute the signed area of a multipolygon as it doesn't have a
+meaning as each sub-polygon could have a different winding order.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

`,5))]),i("details",D,[i("summary",null,[s[57]||(s[57]=i("a",{id:"GeometryOps.angles",href:"#GeometryOps.angles"},[i("span",{class:"jlbinding"},"GeometryOps.angles")],-1)),s[58]||(s[58]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[59]||(s[59]=a(`
julia
angles(geom, ::Type{T} = Float64)

Returns the angles of a geometry or collection of geometries. This is computed differently for different geometries:

- The angles of a point is an empty vector.
+- The angles of a single line segment is an empty vector.
+- The angles of a linestring or linearring is a vector of angles formed by the curve.
+- The angles of a polygon is a vector of vectors of angles formed by each ring.
+- The angles of a multi-geometry collection is a vector of the angles of each of the
+    sub-geometries as defined above.

Result will be a Vector, or nested set of vectors, of type T where an optional argument with a default value of Float64.

source

`,5))]),i("details",Q,[i("summary",null,[s[60]||(s[60]=i("a",{id:"GeometryOps.embed_extent",href:"#GeometryOps.embed_extent"},[i("span",{class:"jlbinding"},"GeometryOps.embed_extent")],-1)),s[61]||(s[61]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[62]||(s[62]=a('
julia
embed_extent(obj)

Recursively wrap the object with a GeoInterface.jl geometry, calculating and adding an Extents.Extent to all objects.

This can improve performance when extents need to be checked multiple times, such when needing to check if many points are in geometries, and using their extents as a quick filter for obviously exterior points.

Keywords

source

',6))]),s[322]||(s[322]=i("h2",{id:"Barycentric-coordinates",tabindex:"-1"},[e("Barycentric coordinates "),i("a",{class:"header-anchor",href:"#Barycentric-coordinates","aria-label":'Permalink to "Barycentric coordinates {#Barycentric-coordinates}"'},"​")],-1)),i("details",x,[i("summary",null,[s[63]||(s[63]=i("a",{id:"GeometryOps.barycentric_coordinates",href:"#GeometryOps.barycentric_coordinates"},[i("span",{class:"jlbinding"},"GeometryOps.barycentric_coordinates")],-1)),s[64]||(s[64]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[65]||(s[65]=a('
julia
barycentric_coordinates(method = MeanValue(), polygon, point)

Returns the barycentric coordinates of point in polygon using the barycentric coordinate method method.

source

',3))]),i("details",w,[i("summary",null,[s[66]||(s[66]=i("a",{id:"GeometryOps.barycentric_coordinates!",href:"#GeometryOps.barycentric_coordinates!"},[i("span",{class:"jlbinding"},"GeometryOps.barycentric_coordinates!")],-1)),s[67]||(s[67]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[68]||(s[68]=a('
julia
barycentric_coordinates!(λs::Vector{<: Real}, method::AbstractBarycentricCoordinateMethod, polygon, point)

Loads the barycentric coordinates of point in polygon into λs using the barycentric coordinate method method.

λs must be of the length of the polygon plus its holes.

Tip

Use this method to avoid excess allocations when you need to calculate barycentric coordinates for many points.

source

',5))]),i("details",L,[i("summary",null,[s[69]||(s[69]=i("a",{id:"GeometryOps.barycentric_interpolate",href:"#GeometryOps.barycentric_interpolate"},[i("span",{class:"jlbinding"},"GeometryOps.barycentric_interpolate")],-1)),s[70]||(s[70]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[71]||(s[71]=a('
julia
barycentric_interpolate(method = MeanValue(), polygon, values::AbstractVector{V}, point)

Returns the interpolated value at point within polygon using the barycentric coordinate method method. values are the per-point values for the polygon which are to be interpolated.

Returns an object of type V.

Warning

Barycentric interpolation is currently defined only for 2-dimensional polygons. If you pass a 3-D polygon in, the Z coordinate will be used as per-vertex value to be interpolated (the M coordinate in GIS parlance).

source

',5))]),s[323]||(s[323]=i("h2",{id:"Other-methods",tabindex:"-1"},[e("Other methods "),i("a",{class:"header-anchor",href:"#Other-methods","aria-label":'Permalink to "Other methods {#Other-methods}"'},"​")],-1)),i("details",I,[i("summary",null,[s[72]||(s[72]=i("a",{id:"GeometryOps.AbstractBarycentricCoordinateMethod",href:"#GeometryOps.AbstractBarycentricCoordinateMethod"},[i("span",{class:"jlbinding"},"GeometryOps.AbstractBarycentricCoordinateMethod")],-1)),s[73]||(s[73]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[74]||(s[74]=a('
julia
abstract type AbstractBarycentricCoordinateMethod

Abstract supertype for barycentric coordinate methods. The subtypes may serve as dispatch types, or may cache some information about the target polygon.

API

The following methods must be implemented for all subtypes:

The rest of the methods will be implemented in terms of these, and have efficient dispatches for broadcasting.

source

',7))]),i("details",M,[i("summary",null,[s[75]||(s[75]=i("a",{id:"GeometryOps.ClosedRing",href:"#GeometryOps.ClosedRing"},[i("span",{class:"jlbinding"},"GeometryOps.ClosedRing")],-1)),s[76]||(s[76]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[77]||(s[77]=a('
julia
ClosedRing() <: GeometryCorrection

This correction ensures that a polygon's exterior and interior rings are closed.

It can be called on any geometry correction as usual.

See also GeometryCorrection.

source

',5))]),i("details",P,[i("summary",null,[s[78]||(s[78]=i("a",{id:"GeometryOps.DiffIntersectingPolygons",href:"#GeometryOps.DiffIntersectingPolygons"},[i("span",{class:"jlbinding"},"GeometryOps.DiffIntersectingPolygons")],-1)),s[79]||(s[79]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[80]||(s[80]=a('
julia
DiffIntersectingPolygons() <: GeometryCorrection

This correction ensures that the polygons included in a multipolygon aren't intersecting. If any polygon's are intersecting, they will be made nonintersecting through the difference operation to create a unique set of disjoint (other than potentially connections by a single point) polygons covering the same area. See also GeometryCorrection, UnionIntersectingPolygons.

source

',3))]),i("details",q,[i("summary",null,[s[81]||(s[81]=i("a",{id:"GeometryOps.DouglasPeucker",href:"#GeometryOps.DouglasPeucker"},[i("span",{class:"jlbinding"},"GeometryOps.DouglasPeucker")],-1)),s[82]||(s[82]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[83]||(s[83]=a(`
julia
DouglasPeucker <: SimplifyAlg
+
+DouglasPeucker(; number, ratio, tol)

Simplifies geometries by removing points below tol distance from the line between its neighboring points.

Keywords

Note: user input tol is squared to avoid unnecessary computation in algorithm.

source

`,6))]),i("details",R,[i("summary",null,[s[84]||(s[84]=i("a",{id:"GeometryOps.GEOS",href:"#GeometryOps.GEOS"},[i("span",{class:"jlbinding"},"GeometryOps.GEOS")],-1)),s[85]||(s[85]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[86]||(s[86]=a('
julia
GEOS(; params...)

A struct which instructs the method it's passed to as an algorithm to use the appropriate GEOS function via LibGEOS.jl for the operation.

Dispatch is generally carried out using the names of the keyword arguments. For example, segmentize will only accept a GEOS struct with only a max_distance keyword, and no other.

It's generally a lot slower than the native Julia implementations, since it must convert to the LibGEOS implementation and back - so be warned!

source

',5))]),i("details",S,[i("summary",null,[s[87]||(s[87]=i("a",{id:"GeometryOps.GeodesicSegments",href:"#GeometryOps.GeodesicSegments"},[i("span",{class:"jlbinding"},"GeometryOps.GeodesicSegments")],-1)),s[88]||(s[88]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[89]||(s[89]=a('
julia
GeodesicSegments(; max_distance::Real, equatorial_radius::Real=6378137, flattening::Real=1/298.257223563)

A method for segmentizing geometries by adding extra vertices to the geometry so that no segment is longer than a given distance. This method calculates the distance between points on the geodesic, and assumes input in lat/long coordinates.

Warning

Any input geometries must be in lon/lat coordinates! If not, the method may fail or error.

Arguments

One can also omit the equatorial_radius and flattening keyword arguments, and pass a geodesic object directly to the eponymous keyword.

This method uses the Proj/GeographicLib API for geodesic calculations.

source

',8))]),i("details",V,[i("summary",null,[s[90]||(s[90]=i("a",{id:"GeometryOps.GeometryCorrection",href:"#GeometryOps.GeometryCorrection"},[i("span",{class:"jlbinding"},"GeometryOps.GeometryCorrection")],-1)),s[91]||(s[91]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[92]||(s[92]=a('
julia
abstract type GeometryCorrection

This abstract type represents a geometry correction.

Interface

Any GeometryCorrection must implement two functions: * application_level(::GeometryCorrection)::AbstractGeometryTrait: This function should return the GeoInterface trait that the correction is intended to be applied to, like PointTrait or LineStringTrait or PolygonTrait. * (::GeometryCorrection)(::AbstractGeometryTrait, geometry)::(some_geometry): This function should apply the correction to the given geometry, and return a new geometry.

source

',5))]),i("details",J,[i("summary",null,[s[93]||(s[93]=i("a",{id:"GeometryOps.LineOrientation",href:"#GeometryOps.LineOrientation"},[i("span",{class:"jlbinding"},"GeometryOps.LineOrientation")],-1)),s[94]||(s[94]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[95]||(s[95]=a('
julia
Enum LineOrientation

Enum for the orientation of a line with respect to a curve. A line can be line_cross (crossing over the curve), line_hinge (crossing the endpoint of the curve), line_over (collinear with the curve), or line_out (not interacting with the curve).

source

',3))]),i("details",U,[i("summary",null,[s[96]||(s[96]=i("a",{id:"GeometryOps.LinearSegments",href:"#GeometryOps.LinearSegments"},[i("span",{class:"jlbinding"},"GeometryOps.LinearSegments")],-1)),s[97]||(s[97]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[98]||(s[98]=a('
julia
LinearSegments(; max_distance::Real)

A method for segmentizing geometries by adding extra vertices to the geometry so that no segment is longer than a given distance.

Here, max_distance is a purely nondimensional quantity and will apply in the input space. This is to say, that if the polygon is provided in lat/lon coordinates then the max_distance will be in degrees of arc. If the polygon is provided in meters, then the max_distance will be in meters.

source

',4))]),i("details",H,[i("summary",null,[s[99]||(s[99]=i("a",{id:"GeometryOps.MeanValue",href:"#GeometryOps.MeanValue"},[i("span",{class:"jlbinding"},"GeometryOps.MeanValue")],-1)),s[100]||(s[100]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[101]||(s[101]=a('
julia
MeanValue() <: AbstractBarycentricCoordinateMethod

This method calculates barycentric coordinates using the mean value method.

References

source

',4))]),i("details",N,[i("summary",null,[s[102]||(s[102]=i("a",{id:"GeometryOps.MonotoneChainMethod",href:"#GeometryOps.MonotoneChainMethod"},[i("span",{class:"jlbinding"},"GeometryOps.MonotoneChainMethod")],-1)),s[103]||(s[103]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[104]||(s[104]=a('
julia
MonotoneChainMethod()

This is an algorithm for the convex_hull function.

Uses DelaunayTriangulation.jl to compute the convex hull. This is a pure Julia algorithm which provides an optimal Delaunay triangulation.

See also convex_hull

source

',5))]),i("details",W,[i("summary",null,[s[105]||(s[105]=i("a",{id:"GeometryOps.PointOrientation",href:"#GeometryOps.PointOrientation"},[i("span",{class:"jlbinding"},"GeometryOps.PointOrientation")],-1)),s[106]||(s[106]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[107]||(s[107]=a('
julia
Enum PointOrientation

Enum for the orientation of a point with respect to a curve. A point can be point_in the curve, point_on the curve, or point_out of the curve.

source

',3))]),i("details",z,[i("summary",null,[s[108]||(s[108]=i("a",{id:"GeometryOps.RadialDistance",href:"#GeometryOps.RadialDistance"},[i("span",{class:"jlbinding"},"GeometryOps.RadialDistance")],-1)),s[109]||(s[109]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[110]||(s[110]=a('
julia
RadialDistance <: SimplifyAlg

Simplifies geometries by removing points less than tol distance from the line between its neighboring points.

Keywords

Note: user input tol is squared to avoid unnecessary computation in algorithm.

source

',6))]),i("details",Z,[i("summary",null,[s[111]||(s[111]=i("a",{id:"GeometryOps.SimplifyAlg",href:"#GeometryOps.SimplifyAlg"},[i("span",{class:"jlbinding"},"GeometryOps.SimplifyAlg")],-1)),s[112]||(s[112]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[113]||(s[113]=a('
julia
abstract type SimplifyAlg

Abstract type for simplification algorithms.

API

For now, the algorithm must hold the number, ratio and tol properties.

Simplification algorithm types can hook into the interface by implementing the _simplify(trait, alg, geom) methods for whichever traits are necessary.

source

',6))]),i("details",_,[i("summary",null,[s[114]||(s[114]=i("a",{id:"GeometryOps.UnionIntersectingPolygons",href:"#GeometryOps.UnionIntersectingPolygons"},[i("span",{class:"jlbinding"},"GeometryOps.UnionIntersectingPolygons")],-1)),s[115]||(s[115]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[116]||(s[116]=a('
julia
UnionIntersectingPolygons() <: GeometryCorrection

This correction ensures that the polygon's included in a multipolygon aren't intersecting. If any polygon's are intersecting, they will be combined through the union operation to create a unique set of disjoint (other than potentially connections by a single point) polygons covering the same area.

See also GeometryCorrection.

source

',4))]),i("details",K,[i("summary",null,[s[117]||(s[117]=i("a",{id:"GeometryOps.VisvalingamWhyatt",href:"#GeometryOps.VisvalingamWhyatt"},[i("span",{class:"jlbinding"},"GeometryOps.VisvalingamWhyatt")],-1)),s[118]||(s[118]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[119]||(s[119]=a(`
julia
VisvalingamWhyatt <: SimplifyAlg
+
+VisvalingamWhyatt(; kw...)

Simplifies geometries by removing points below tol distance from the line between its neighboring points.

Keywords

Note: user input tol is doubled to avoid unnecessary computation in algorithm.

source

`,6))]),i("details",X,[i("summary",null,[s[120]||(s[120]=i("a",{id:"GeometryOps._det-Union{Tuple{T2}, Tuple{T1}, Tuple{Union{Tuple{T1, T1}, StaticArraysCore.StaticArray{Tuple{2}, T1, 1}}, Union{Tuple{T2, T2}, StaticArraysCore.StaticArray{Tuple{2}, T2, 1}}}} where {T1<:Real, T2<:Real}",href:"#GeometryOps._det-Union{Tuple{T2}, Tuple{T1}, Tuple{Union{Tuple{T1, T1}, StaticArraysCore.StaticArray{Tuple{2}, T1, 1}}, Union{Tuple{T2, T2}, StaticArraysCore.StaticArray{Tuple{2}, T2, 1}}}} where {T1<:Real, T2<:Real}"},[i("span",{class:"jlbinding"},"GeometryOps._det")],-1)),s[121]||(s[121]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[122]||(s[122]=a('
julia
_det(s1::Point2{T1}, s2::Point2{T2}) where {T1 <: Real, T2 <: Real}

Returns the determinant of the matrix formed by hcat'ing two points s1 and s2.

Specifically, this is:

julia
s1[1] * s2[2] - s1[2] * s2[1]

source

',5))]),i("details",$,[i("summary",null,[s[123]||(s[123]=i("a",{id:"GeometryOps._equals_curves-NTuple{4, Any}",href:"#GeometryOps._equals_curves-NTuple{4, Any}"},[i("span",{class:"jlbinding"},"GeometryOps._equals_curves")],-1)),s[124]||(s[124]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[125]||(s[125]=a('
julia
_equals_curves(c1, c2, closed_type1, closed_type2)::Bool

Two curves are equal if they share the same set of point, representing the same geometry. Both curves must must be composed of the same set of points, however, they do not have to wind in the same direction, or start on the same point to be equivalent. Inputs: c1 first geometry c2 second geometry closed_type1::Bool true if c1 is closed by definition (polygon, linear ring) closed_type2::Bool true if c2 is closed by definition (polygon, linear ring)

source

',3))]),i("details",Y,[i("summary",null,[s[126]||(s[126]=i("a",{id:"GeometryOps.angles-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T<:AbstractFloat",href:"#GeometryOps.angles-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T<:AbstractFloat"},[i("span",{class:"jlbinding"},"GeometryOps.angles")],-1)),s[127]||(s[127]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[128]||(s[128]=a(`
julia
angles(geom, ::Type{T} = Float64)

Returns the angles of a geometry or collection of geometries. This is computed differently for different geometries:

- The angles of a point is an empty vector.
+- The angles of a single line segment is an empty vector.
+- The angles of a linestring or linearring is a vector of angles formed by the curve.
+- The angles of a polygon is a vector of vectors of angles formed by each ring.
+- The angles of a multi-geometry collection is a vector of the angles of each of the
+    sub-geometries as defined above.

Result will be a Vector, or nested set of vectors, of type T where an optional argument with a default value of Float64.

source

`,5))]),i("details",ss,[i("summary",null,[s[129]||(s[129]=i("a",{id:"GeometryOps.area-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T<:AbstractFloat",href:"#GeometryOps.area-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T<:AbstractFloat"},[i("span",{class:"jlbinding"},"GeometryOps.area")],-1)),s[130]||(s[130]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[131]||(s[131]=a(`
julia
area(geom, [T = Float64])::T

Returns the area of a geometry or collection of geometries. This is computed slightly differently for different geometries:

- The area of a point/multipoint is always zero.
+- The area of a curve/multicurve is always zero.
+- The area of a polygon is the absolute value of the signed area.
+- The area multi-polygon is the sum of the areas of all of the sub-polygons.
+- The area of a geometry collection, feature collection of array/iterable 
+    is the sum of the areas of all of the sub-geometries.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

`,5))]),i("details",is,[i("summary",null,[s[132]||(s[132]=i("a",{id:"GeometryOps.barycentric_coordinates!-Tuple{Vector{<:Real}, GeometryOps.AbstractBarycentricCoordinateMethod, Any, Any}",href:"#GeometryOps.barycentric_coordinates!-Tuple{Vector{<:Real}, GeometryOps.AbstractBarycentricCoordinateMethod, Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.barycentric_coordinates!")],-1)),s[133]||(s[133]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[134]||(s[134]=a('
julia
barycentric_coordinates!(λs::Vector{<: Real}, method::AbstractBarycentricCoordinateMethod, polygon, point)

Loads the barycentric coordinates of point in polygon into λs using the barycentric coordinate method method.

λs must be of the length of the polygon plus its holes.

Tip

Use this method to avoid excess allocations when you need to calculate barycentric coordinates for many points.

source

',5))]),i("details",as,[i("summary",null,[s[135]||(s[135]=i("a",{id:"GeometryOps.barycentric_coordinates-Tuple{GeometryOps.AbstractBarycentricCoordinateMethod, Any, Any}",href:"#GeometryOps.barycentric_coordinates-Tuple{GeometryOps.AbstractBarycentricCoordinateMethod, Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.barycentric_coordinates")],-1)),s[136]||(s[136]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[137]||(s[137]=a('
julia
barycentric_coordinates(method = MeanValue(), polygon, point)

Returns the barycentric coordinates of point in polygon using the barycentric coordinate method method.

source

',3))]),i("details",es,[i("summary",null,[s[138]||(s[138]=i("a",{id:"GeometryOps.barycentric_interpolate-Union{Tuple{V}, Tuple{GeometryOps.AbstractBarycentricCoordinateMethod, Any, AbstractVector{V}, Any}} where V",href:"#GeometryOps.barycentric_interpolate-Union{Tuple{V}, Tuple{GeometryOps.AbstractBarycentricCoordinateMethod, Any, AbstractVector{V}, Any}} where V"},[i("span",{class:"jlbinding"},"GeometryOps.barycentric_interpolate")],-1)),s[139]||(s[139]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[140]||(s[140]=a('
julia
barycentric_interpolate(method = MeanValue(), polygon, values::AbstractVector{V}, point)

Returns the interpolated value at point within polygon using the barycentric coordinate method method. values are the per-point values for the polygon which are to be interpolated.

Returns an object of type V.

Warning

Barycentric interpolation is currently defined only for 2-dimensional polygons. If you pass a 3-D polygon in, the Z coordinate will be used as per-vertex value to be interpolated (the M coordinate in GIS parlance).

source

',5))]),i("details",ts,[i("summary",null,[s[141]||(s[141]=i("a",{id:"GeometryOps.centroid-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T",href:"#GeometryOps.centroid-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T"},[i("span",{class:"jlbinding"},"GeometryOps.centroid")],-1)),s[142]||(s[142]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[143]||(s[143]=a('
julia
centroid(geom, [T=Float64])::Tuple{T, T}

Returns the centroid of a given line segment, linear ring, polygon, or mutlipolygon.

source

',3))]),i("details",ns,[i("summary",null,[s[144]||(s[144]=i("a",{id:"GeometryOps.centroid_and_area-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T",href:"#GeometryOps.centroid_and_area-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T"},[i("span",{class:"jlbinding"},"GeometryOps.centroid_and_area")],-1)),s[145]||(s[145]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[146]||(s[146]=a('
julia
centroid_and_area(geom, [T=Float64])::(::Tuple{T, T}, ::Real)

Returns the centroid and area of a given geometry.

source

',3))]),i("details",ls,[i("summary",null,[s[147]||(s[147]=i("a",{id:"GeometryOps.centroid_and_length-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T",href:"#GeometryOps.centroid_and_length-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T"},[i("span",{class:"jlbinding"},"GeometryOps.centroid_and_length")],-1)),s[148]||(s[148]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[149]||(s[149]=a('
julia
centroid_and_length(geom, [T=Float64])::(::Tuple{T, T}, ::Real)

Returns the centroid and length of a given line/ring. Note this is only valid for line strings and linear rings.

source

',3))]),i("details",ps,[i("summary",null,[s[150]||(s[150]=i("a",{id:"GeometryOps.contains-Tuple{Any, Any}",href:"#GeometryOps.contains-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.contains")],-1)),s[151]||(s[151]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[152]||(s[152]=a(`
julia
contains(g1::AbstractGeometry, g2::AbstractGeometry)::Bool

Return true if the second geometry is completely contained by the first geometry. The interiors of both geometries must intersect and the interior and boundary of the secondary (g2) must not intersect the exterior of the first (g1).

contains returns the exact opposite result of within.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
+point = GI.Point((1, 2))
+
+GO.contains(line, point)
+# output
+true

source

`,6))]),i("details",hs,[i("summary",null,[s[153]||(s[153]=i("a",{id:"GeometryOps.convex_hull",href:"#GeometryOps.convex_hull"},[i("span",{class:"jlbinding"},"GeometryOps.convex_hull")],-1)),s[154]||(s[154]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[155]||(s[155]=a('
julia
convex_hull([method], geometries)

Compute the convex hull of the points in geometries. Returns a GI.Polygon representing the convex hull.

Note that the polygon returned is wound counterclockwise as in the Simple Features standard by default. If you choose GEOS, the winding order will be inverted.

Warning

This interface only computes the 2-dimensional convex hull!

For higher dimensional hulls, use the relevant package (Qhull.jl, Quickhull.jl, or similar).

source

',5))]),i("details",ks,[i("summary",null,[s[156]||(s[156]=i("a",{id:"GeometryOps.coverage-Union{Tuple{T}, NTuple{5, Any}, Tuple{Any, Any, Any, Any, Any, Type{T}}} where T<:AbstractFloat",href:"#GeometryOps.coverage-Union{Tuple{T}, NTuple{5, Any}, Tuple{Any, Any, Any, Any, Any, Type{T}}} where T<:AbstractFloat"},[i("span",{class:"jlbinding"},"GeometryOps.coverage")],-1)),s[157]||(s[157]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[158]||(s[158]=a('
julia
coverage(geom, xmin, xmax, ymin, ymax, [T = Float64])::T

Returns the area of intersection between given geometry and grid cell defined by its minimum and maximum x and y-values. This is computed differently for different geometries:

Result will be of type T, where T is an optional argument with a default value of Float64.

source

',5))]),i("details",rs,[i("summary",null,[s[159]||(s[159]=i("a",{id:"GeometryOps.coveredby-Tuple{Any, Any}",href:"#GeometryOps.coveredby-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.coveredby")],-1)),s[160]||(s[160]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[161]||(s[161]=a(`
julia
coveredby(g1, g2)::Bool

Return true if the first geometry is completely covered by the second geometry. The interior and boundary of the primary geometry (g1) must not intersect the exterior of the secondary geometry (g2).

Furthermore, coveredby returns the exact opposite result of covers. They are equivalent with the order of the arguments swapped.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+p1 = GI.Point(0.0, 0.0)
+p2 = GI.Point(1.0, 1.0)
+l1 = GI.Line([p1, p2])
+
+GO.coveredby(p1, l1)
+# output
+true

source

`,6))]),i("details",os,[i("summary",null,[s[162]||(s[162]=i("a",{id:"GeometryOps.covers-Tuple{Any, Any}",href:"#GeometryOps.covers-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.covers")],-1)),s[163]||(s[163]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[164]||(s[164]=a(`
julia
covers(g1::AbstractGeometry, g2::AbstractGeometry)::Bool

Return true if the first geometry is completely covers the second geometry, The exterior and boundary of the second geometry must not be outside of the interior and boundary of the first geometry. However, the interiors need not intersect.

covers returns the exact opposite result of coveredby.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+l1 = GI.LineString([(1.0, 1.0), (1.0, 2.0), (1.0, 3.0), (1.0, 4.0)])
+l2 = GI.LineString([(1.0, 1.0), (1.0, 2.0)])
+
+GO.covers(l1, l2)
+# output
+true

source

`,6))]),i("details",ds,[i("summary",null,[s[165]||(s[165]=i("a",{id:"GeometryOps.crosses-Tuple{Any, Any}",href:"#GeometryOps.crosses-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.crosses")],-1)),s[166]||(s[166]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[167]||(s[167]=a(`
julia
 crosses(geom1, geom2)::Bool

Return true if the intersection results in a geometry whose dimension is one less than the maximum dimension of the two source geometries and the intersection set is interior to both source geometries.

TODO: broken

Examples

julia
import GeoInterface as GI, GeometryOps as GO
+# TODO: Add working example

source

`,6))]),i("details",gs,[i("summary",null,[s[168]||(s[168]=i("a",{id:"GeometryOps.cut-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat",href:"#GeometryOps.cut-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat"},[i("span",{class:"jlbinding"},"GeometryOps.cut")],-1)),s[169]||(s[169]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[170]||(s[170]=a(`
julia
cut(geom, line, [T::Type])

Return given geom cut by given line as a list of geometries of the same type as the input geom. Return the original geometry as only list element if none are found. Line must cut fully through given geometry or the original geometry will be returned.

Note: This currently doesn't work for degenerate cases there line crosses through vertices.

Example

julia
import GeoInterface as GI, GeometryOps as GO
+
+poly = GI.Polygon([[(0.0, 0.0), (10.0, 0.0), (10.0, 10.0), (0.0, 10.0), (0.0, 0.0)]])
+line = GI.Line([(5.0, -5.0), (5.0, 15.0)])
+cut_polys = GO.cut(poly, line)
+GI.coordinates.(cut_polys)
+
+# output
+2-element Vector{Vector{Vector{Vector{Float64}}}}:
+ [[[0.0, 0.0], [5.0, 0.0], [5.0, 10.0], [0.0, 10.0], [0.0, 0.0]]]
+ [[[5.0, 0.0], [10.0, 0.0], [10.0, 10.0], [5.0, 10.0], [5.0, 0.0]]]

source

`,6))]),i("details",ys,[i("summary",null,[s[171]||(s[171]=i("a",{id:"GeometryOps.difference-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat",href:"#GeometryOps.difference-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat"},[i("span",{class:"jlbinding"},"GeometryOps.difference")],-1)),s[172]||(s[172]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[173]||(s[173]=a(`
julia
difference(geom_a, geom_b, [T::Type]; target::Type, fix_multipoly = UnionIntersectingPolygons())

Return the difference between two geometries as a list of geometries. Return an empty list if none are found. The type of the list will be constrained as much as possible given the input geometries. Furthermore, the user can provide a taget type as a keyword argument and a list of target geometries found in the difference will be returned. The user can also provide a float type that they would like the points of returned geometries to be. If the user is taking a intersection involving one or more multipolygons, and the multipolygon might be comprised of polygons that intersect, if fix_multipoly is set to an IntersectingPolygons correction (the default is UnionIntersectingPolygons()), then the needed multipolygons will be fixed to be valid before performing the intersection to ensure a correct answer. Only set fix_multipoly to false if you know that the multipolygons are valid, as it will avoid unneeded computation.

Example

julia
import GeoInterface as GI, GeometryOps as GO
+
+poly1 = GI.Polygon([[[0.0, 0.0], [5.0, 5.0], [10.0, 0.0], [5.0, -5.0], [0.0, 0.0]]])
+poly2 = GI.Polygon([[[3.0, 0.0], [8.0, 5.0], [13.0, 0.0], [8.0, -5.0], [3.0, 0.0]]])
+diff_poly = GO.difference(poly1, poly2; target = GI.PolygonTrait())
+GI.coordinates.(diff_poly)
+
+# output
+1-element Vector{Vector{Vector{Vector{Float64}}}}:
+ [[[6.5, 3.5], [5.0, 5.0], [0.0, 0.0], [5.0, -5.0], [6.5, -3.5], [3.0, 0.0], [6.5, 3.5]]]

source

`,5))]),i("details",Es,[i("summary",null,[s[174]||(s[174]=i("a",{id:"GeometryOps.disjoint-Tuple{Any, Any}",href:"#GeometryOps.disjoint-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.disjoint")],-1)),s[175]||(s[175]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[176]||(s[176]=a(`
julia
disjoint(geom1, geom2)::Bool

Return true if the first geometry is disjoint from the second geometry.

Return true if the first geometry is disjoint from the second geometry. The interiors and boundaries of both geometries must not intersect.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+
+line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
+point = (2, 2)
+GO.disjoint(point, line)
+
+# output
+true

source

`,6))]),i("details",cs,[i("summary",null,[s[177]||(s[177]=i("a",{id:"GeometryOps.distance-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat",href:"#GeometryOps.distance-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat"},[i("span",{class:"jlbinding"},"GeometryOps.distance")],-1)),s[178]||(s[178]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[179]||(s[179]=a('
julia
distance(point, geom, ::Type{T} = Float64)::T

Calculates the ditance from the geometry g1 to the point. The distance will always be positive or zero.

The method will differ based on the type of the geometry provided: - The distance from a point to a point is just the Euclidean distance between the points. - The distance from a point to a line is the minimum distance from the point to the closest point on the given line. - The distance from a point to a linestring is the minimum distance from the point to the closest segment of the linestring. - The distance from a point to a linear ring is the minimum distance from the point to the closest segment of the linear ring. - The distance from a point to a polygon is zero if the point is within the polygon and otherwise is the minimum distance from the point to an edge of the polygon. This includes edges created by holes. - The distance from a point to a multigeometry or a geometry collection is the minimum distance between the point and any of the sub-geometries.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

',5))]),i("details",us,[i("summary",null,[s[180]||(s[180]=i("a",{id:"GeometryOps.embed_extent-Tuple{Any}",href:"#GeometryOps.embed_extent-Tuple{Any}"},[i("span",{class:"jlbinding"},"GeometryOps.embed_extent")],-1)),s[181]||(s[181]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[182]||(s[182]=a('
julia
embed_extent(obj)

Recursively wrap the object with a GeoInterface.jl geometry, calculating and adding an Extents.Extent to all objects.

This can improve performance when extents need to be checked multiple times, such when needing to check if many points are in geometries, and using their extents as a quick filter for obviously exterior points.

Keywords

source

',6))]),i("details",ms,[i("summary",null,[s[183]||(s[183]=i("a",{id:"GeometryOps.enforce-Tuple{GEOS, Symbol, Any}",href:"#GeometryOps.enforce-Tuple{GEOS, Symbol, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.enforce")],-1)),s[184]||(s[184]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[185]||(s[185]=a('
julia
enforce(alg::GO.GEOS, kw::Symbol, f)

Enforce the presence of a keyword argument in a GEOS algorithm, and return alg.params[kw].

Throws an error if the key is not present, and mentions f in the error message (since there isn't a good way to get the name of the function that called this method).

source

',4))]),i("details",Fs,[i("summary",null,[s[186]||(s[186]=i("a",{id:"GeometryOps.equals-NTuple{4, Any}",href:"#GeometryOps.equals-NTuple{4, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[187]||(s[187]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[188]||(s[188]=a('
julia
equals(trait_a, geom_a, trait_b, geom_b)

Two geometries which are not of the same type cannot be equal so they always return false.

source

',3))]),i("details",Cs,[i("summary",null,[s[189]||(s[189]=i("a",{id:"GeometryOps.equals-Tuple{Any, Any}",href:"#GeometryOps.equals-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[190]||(s[190]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[191]||(s[191]=a(`
julia
equals(geom1, geom2)::Bool

Compare two Geometries return true if they are the same geometry.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+poly1 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
+poly2 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
+
+GO.equals(poly1, poly2)
+# output
+true

source

`,5))]),i("details",bs,[i("summary",null,[s[192]||(s[192]=i("a",{id:"GeometryOps.equals-Tuple{GeoInterface.LinearRingTrait, Any, GeoInterface.LinearRingTrait, Any}",href:"#GeometryOps.equals-Tuple{GeoInterface.LinearRingTrait, Any, GeoInterface.LinearRingTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[193]||(s[193]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[194]||(s[194]=a(`
julia
equals(
+    ::GI.LinearRingTrait, l1,
+    ::GI.LinearRingTrait, l2,
+)::Bool

Two linear rings are equal if they share the same set of points going along the curve. Note that rings are closed by definition, so they can have, but don't need, a repeated last point to be equal.

source

`,3))]),i("details",fs,[i("summary",null,[s[195]||(s[195]=i("a",{id:"GeometryOps.equals-Tuple{GeoInterface.LinearRingTrait, Any, Union{GeoInterface.LineStringTrait, GeoInterface.LineTrait}, Any}",href:"#GeometryOps.equals-Tuple{GeoInterface.LinearRingTrait, Any, Union{GeoInterface.LineStringTrait, GeoInterface.LineTrait}, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[196]||(s[196]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[197]||(s[197]=a(`
julia
equals(
+    ::GI.LinearRingTrait, l1,
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
+)::Bool

A linear ring and a line/linestring are equal if they share the same set of points going along the curve. Note that lines aren't closed by definition, but rings are, so the line must have a repeated last point to be equal

source

`,3))]),i("details",Ts,[i("summary",null,[s[198]||(s[198]=i("a",{id:"GeometryOps.equals-Tuple{GeoInterface.MultiPointTrait, Any, GeoInterface.MultiPointTrait, Any}",href:"#GeometryOps.equals-Tuple{GeoInterface.MultiPointTrait, Any, GeoInterface.MultiPointTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[199]||(s[199]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[200]||(s[200]=a('
julia
equals(::GI.MultiPointTrait, mp1, ::GI.MultiPointTrait, mp2)::Bool

Two multipoints are equal if they share the same set of points.

source

',3))]),i("details",Gs,[i("summary",null,[s[201]||(s[201]=i("a",{id:"GeometryOps.equals-Tuple{GeoInterface.MultiPointTrait, Any, GeoInterface.PointTrait, Any}",href:"#GeometryOps.equals-Tuple{GeoInterface.MultiPointTrait, Any, GeoInterface.PointTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[202]||(s[202]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[203]||(s[203]=a('
julia
equals(::GI.MultiPointTrait, mp1, ::GI.PointTrait, p2)::Bool

A point and a multipoint are equal if the multipoint is composed of a single point that is equivalent to the given point.

source

',3))]),i("details",vs,[i("summary",null,[s[204]||(s[204]=i("a",{id:"GeometryOps.equals-Tuple{GeoInterface.MultiPolygonTrait, Any, GeoInterface.MultiPolygonTrait, Any}",href:"#GeometryOps.equals-Tuple{GeoInterface.MultiPolygonTrait, Any, GeoInterface.MultiPolygonTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[205]||(s[205]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[206]||(s[206]=a('
julia
equals(::GI.PolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool

Two multipolygons are equal if they share the same set of polygons.

source

',3))]),i("details",As,[i("summary",null,[s[207]||(s[207]=i("a",{id:"GeometryOps.equals-Tuple{GeoInterface.MultiPolygonTrait, Any, GeoInterface.PolygonTrait, Any}",href:"#GeometryOps.equals-Tuple{GeoInterface.MultiPolygonTrait, Any, GeoInterface.PolygonTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[208]||(s[208]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[209]||(s[209]=a('
julia
equals(::GI.MultiPolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool

A polygon and a multipolygon are equal if the multipolygon is composed of a single polygon that is equivalent to the given polygon.

source

',3))]),i("details",js,[i("summary",null,[s[210]||(s[210]=i("a",{id:"GeometryOps.equals-Tuple{GeoInterface.PointTrait, Any, GeoInterface.MultiPointTrait, Any}",href:"#GeometryOps.equals-Tuple{GeoInterface.PointTrait, Any, GeoInterface.MultiPointTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[211]||(s[211]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[212]||(s[212]=a('
julia
equals(::GI.PointTrait, p1, ::GI.MultiPointTrait, mp2)::Bool

A point and a multipoint are equal if the multipoint is composed of a single point that is equivalent to the given point.

source

',3))]),i("details",Bs,[i("summary",null,[s[213]||(s[213]=i("a",{id:"GeometryOps.equals-Tuple{GeoInterface.PointTrait, Any, GeoInterface.PointTrait, Any}",href:"#GeometryOps.equals-Tuple{GeoInterface.PointTrait, Any, GeoInterface.PointTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[214]||(s[214]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[215]||(s[215]=a('
julia
equals(::GI.PointTrait, p1, ::GI.PointTrait, p2)::Bool

Two points are the same if they have the same x and y (and z if 3D) coordinates.

source

',3))]),i("details",Os,[i("summary",null,[s[216]||(s[216]=i("a",{id:"GeometryOps.equals-Tuple{GeoInterface.PolygonTrait, Any, GeoInterface.MultiPolygonTrait, Any}",href:"#GeometryOps.equals-Tuple{GeoInterface.PolygonTrait, Any, GeoInterface.MultiPolygonTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[217]||(s[217]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[218]||(s[218]=a('
julia
equals(::GI.PolygonTrait, geom_a, ::GI.MultiPolygonTrait, geom_b)::Bool

A polygon and a multipolygon are equal if the multipolygon is composed of a single polygon that is equivalent to the given polygon.

source

',3))]),i("details",Ds,[i("summary",null,[s[219]||(s[219]=i("a",{id:"GeometryOps.equals-Tuple{GeoInterface.PolygonTrait, Any, GeoInterface.PolygonTrait, Any}",href:"#GeometryOps.equals-Tuple{GeoInterface.PolygonTrait, Any, GeoInterface.PolygonTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[220]||(s[220]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[221]||(s[221]=a('
julia
equals(::GI.PolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool

Two polygons are equal if they share the same exterior edge and holes.

source

',3))]),i("details",Qs,[i("summary",null,[s[222]||(s[222]=i("a",{id:"GeometryOps.equals-Tuple{Union{GeoInterface.LineStringTrait, GeoInterface.LineTrait}, Any, GeoInterface.LinearRingTrait, Any}",href:"#GeometryOps.equals-Tuple{Union{GeoInterface.LineStringTrait, GeoInterface.LineTrait}, Any, GeoInterface.LinearRingTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[223]||(s[223]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[224]||(s[224]=a(`
julia
equals(
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
+    ::GI.LinearRingTrait, l2,
+)::Bool

A line/linestring and a linear ring are equal if they share the same set of points going along the curve. Note that lines aren't closed by definition, but rings are, so the line must have a repeated last point to be equal

source

`,3))]),i("details",xs,[i("summary",null,[s[225]||(s[225]=i("a",{id:"GeometryOps.equals-Tuple{Union{GeoInterface.LineStringTrait, GeoInterface.LineTrait}, Any, Union{GeoInterface.LineStringTrait, GeoInterface.LineTrait}, Any}",href:"#GeometryOps.equals-Tuple{Union{GeoInterface.LineStringTrait, GeoInterface.LineTrait}, Any, Union{GeoInterface.LineStringTrait, GeoInterface.LineTrait}, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[226]||(s[226]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[227]||(s[227]=a(`
julia
equals(
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
+)::Bool

Two lines/linestrings are equal if they share the same set of points going along the curve. Note that lines/linestrings aren't closed by definition.

source

`,3))]),i("details",ws,[i("summary",null,[s[228]||(s[228]=i("a",{id:"GeometryOps.equals-Union{Tuple{T}, Tuple{T, Any, T, Any}} where T",href:"#GeometryOps.equals-Union{Tuple{T}, Tuple{T, Any, T, Any}} where T"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[229]||(s[229]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[230]||(s[230]=a('
julia
equals(::T, geom_a, ::T, geom_b)::Bool

Two geometries of the same type, which don't have a equals function to dispatch off of should throw an error.

source

',3))]),i("details",Ls,[i("summary",null,[s[231]||(s[231]=i("a",{id:"GeometryOps.flip-Tuple{Any}",href:"#GeometryOps.flip-Tuple{Any}"},[i("span",{class:"jlbinding"},"GeometryOps.flip")],-1)),s[232]||(s[232]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[233]||(s[233]=a('
julia
flip(obj)

Swap all of the x and y coordinates in obj, otherwise keeping the original structure (but not necessarily the original type).

Keywords

source

',5))]),i("details",Is,[i("summary",null,[s[234]||(s[234]=i("a",{id:"GeometryOps.intersection-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat",href:"#GeometryOps.intersection-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat"},[i("span",{class:"jlbinding"},"GeometryOps.intersection")],-1)),s[235]||(s[235]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[236]||(s[236]=a(`
julia
intersection(geom_a, geom_b, [T::Type]; target::Type, fix_multipoly = UnionIntersectingPolygons())

Return the intersection between two geometries as a list of geometries. Return an empty list if none are found. The type of the list will be constrained as much as possible given the input geometries. Furthermore, the user can provide a target type as a keyword argument and a list of target geometries found in the intersection will be returned. The user can also provide a float type that they would like the points of returned geometries to be. If the user is taking a intersection involving one or more multipolygons, and the multipolygon might be comprised of polygons that intersect, if fix_multipoly is set to an IntersectingPolygons correction (the default is UnionIntersectingPolygons()), then the needed multipolygons will be fixed to be valid before performing the intersection to ensure a correct answer. Only set fix_multipoly to nothing if you know that the multipolygons are valid, as it will avoid unneeded computation.

Example

julia
import GeoInterface as GI, GeometryOps as GO
+
+line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)])
+line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)])
+inter_points = GO.intersection(line1, line2; target = GI.PointTrait())
+GI.coordinates.(inter_points)
+
+# output
+1-element Vector{Vector{Float64}}:
+ [125.58375366067548, -14.83572303404496]

source

`,5))]),i("details",Ms,[i("summary",null,[s[237]||(s[237]=i("a",{id:"GeometryOps.intersection_points-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat",href:"#GeometryOps.intersection_points-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat"},[i("span",{class:"jlbinding"},"GeometryOps.intersection_points")],-1)),s[238]||(s[238]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[239]||(s[239]=a(`
julia
intersection_points(geom_a, geom_b, [T::Type])

Return a list of intersection tuple points between two geometries. If no intersection points exist, returns an empty list.

Example

jldoctest

+line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)]) line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)]) inter_points = GO.intersection_points(line1, line2)
+
+**output**
+
+1-element Vector{Tuple{Float64, Float64}}:  (125.58375366067548, -14.83572303404496)
+
+
+[source](https://github.com/JuliaGeo/GeometryOps.jl/blob/9f0e22db49f7b49d5352750e9f69705f13c06d64/src/methods/clipping/intersection.jl#L177-L195)
+
+</details>
+
+<details class='jldocstring custom-block' open>
+<summary><a id='GeometryOps.intersects-Tuple{Any, Any}' href='#GeometryOps.intersects-Tuple{Any, Any}'><span class="jlbinding">GeometryOps.intersects</span></a> <Badge type="info" class="jlObjectType jlMethod" text="Method" /></summary>
+
+
+
+\`\`\`julia
+intersects(geom1, geom2)::Bool

Return true if the interiors or boundaries of the two geometries interact.

intersects returns the exact opposite result of disjoint.

Example

julia
import GeoInterface as GI, GeometryOps as GO
+
+line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)])
+line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)])
+GO.intersects(line1, line2)
+
+# output
+true

source

`,9))]),i("details",Ps,[i("summary",null,[s[240]||(s[240]=i("a",{id:"GeometryOps.isclockwise-Tuple{Any}",href:"#GeometryOps.isclockwise-Tuple{Any}"},[i("span",{class:"jlbinding"},"GeometryOps.isclockwise")],-1)),s[241]||(s[241]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[244]||(s[244]=a('
julia
isclockwise(line::Union{LineString, Vector{Position}})::Bool

Take a ring and return true if the line goes clockwise, or false if the line goes counter-clockwise. "Going clockwise" means, mathematically,

',2)),i("mjx-container",qs,[(p(),l("svg",Rs,s[242]||(s[242]=[a('',1)]))),s[243]||(s[243]=i("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[i("mrow",{"data-mjx-texclass":"INNER"},[i("mo",{"data-mjx-texclass":"OPEN"},"("),i("munderover",null,[i("mo",{"data-mjx-texclass":"OP"},"∑"),i("mrow",{"data-mjx-texclass":"ORD"},[i("mi",null,"i"),i("mo",null,"="),i("mn",null,"2")]),i("mi",null,"n")]),i("mo",{stretchy:"false"},"("),i("msub",null,[i("mi",null,"x"),i("mi",null,"i")]),i("mo",null,"−"),i("msub",null,[i("mi",null,"x"),i("mrow",{"data-mjx-texclass":"ORD"},[i("mi",null,"i"),i("mo",null,"−"),i("mn",null,"1")])]),i("mo",{stretchy:"false"},")"),i("mo",null,"⋅"),i("mo",{stretchy:"false"},"("),i("msub",null,[i("mi",null,"y"),i("mi",null,"i")]),i("mo",null,"+"),i("msub",null,[i("mi",null,"y"),i("mrow",{"data-mjx-texclass":"ORD"},[i("mi",null,"i"),i("mo",null,"−"),i("mn",null,"1")])]),i("mo",{stretchy:"false"},")"),i("mo",{"data-mjx-texclass":"CLOSE"},")")]),i("mo",null,">"),i("mn",null,"0")])],-1))]),s[245]||(s[245]=a(`

Example

julia
julia> import GeoInterface as GI, GeometryOps as GO
+julia> ring = GI.LinearRing([(0, 0), (1, 1), (1, 0), (0, 0)]);
+julia> GO.isclockwise(ring)
+# output
+true

source

`,3))]),i("details",Ss,[i("summary",null,[s[246]||(s[246]=i("a",{id:"GeometryOps.isconcave-Tuple{Any}",href:"#GeometryOps.isconcave-Tuple{Any}"},[i("span",{class:"jlbinding"},"GeometryOps.isconcave")],-1)),s[247]||(s[247]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[248]||(s[248]=a(`
julia
isconcave(poly::Polygon)::Bool

Take a polygon and return true or false as to whether it is concave or not.

Examples

julia
import GeoInterface as GI, GeometryOps as GO
+
+poly = GI.Polygon([[(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)]])
+GO.isconcave(poly)
+
+# output
+false

source

`,5))]),i("details",Vs,[i("summary",null,[s[249]||(s[249]=i("a",{id:"GeometryOps.overlaps-Tuple{Any, Any}",href:"#GeometryOps.overlaps-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.overlaps")],-1)),s[250]||(s[250]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[251]||(s[251]=a(`
julia
overlaps(geom1, geom2)::Bool

Compare two Geometries of the same dimension and return true if their intersection set results in a geometry different from both but of the same dimension. This means one geometry cannot be within or contain the other and they cannot be equal

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+poly1 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
+poly2 = GI.Polygon([[(1,1), (1,6), (6,6), (6,1), (1,1)]])
+
+GO.overlaps(poly1, poly2)
+# output
+true

source

`,5))]),i("details",Js,[i("summary",null,[s[252]||(s[252]=i("a",{id:"GeometryOps.overlaps-Tuple{GeoInterface.AbstractTrait, Any, GeoInterface.AbstractTrait, Any}",href:"#GeometryOps.overlaps-Tuple{GeoInterface.AbstractTrait, Any, GeoInterface.AbstractTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.overlaps")],-1)),s[253]||(s[253]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[254]||(s[254]=a('
julia
overlaps(::GI.AbstractTrait, geom1, ::GI.AbstractTrait, geom2)::Bool

For any non-specified pair, all have non-matching dimensions, return false.

source

',3))]),i("details",Us,[i("summary",null,[s[255]||(s[255]=i("a",{id:"GeometryOps.overlaps-Tuple{GeoInterface.LineTrait, Any, GeoInterface.LineTrait, Any}",href:"#GeometryOps.overlaps-Tuple{GeoInterface.LineTrait, Any, GeoInterface.LineTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.overlaps")],-1)),s[256]||(s[256]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[257]||(s[257]=a('
julia
overlaps(::GI.LineTrait, line1, ::GI.LineTrait, line)::Bool

If the lines overlap, meaning that they are collinear but each have one endpoint outside of the other line, return true. Else false.

source

',3))]),i("details",Hs,[i("summary",null,[s[258]||(s[258]=i("a",{id:"GeometryOps.overlaps-Tuple{GeoInterface.MultiPointTrait, Any, GeoInterface.MultiPointTrait, Any}",href:"#GeometryOps.overlaps-Tuple{GeoInterface.MultiPointTrait, Any, GeoInterface.MultiPointTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.overlaps")],-1)),s[259]||(s[259]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[260]||(s[260]=a(`
julia
overlaps(
+    ::GI.MultiPointTrait, points1,
+    ::GI.MultiPointTrait, points2,
+)::Bool

If the multipoints overlap, meaning some, but not all, of the points within the multipoints are shared, return true.

source

`,3))]),i("details",Ns,[i("summary",null,[s[261]||(s[261]=i("a",{id:"GeometryOps.overlaps-Tuple{GeoInterface.MultiPolygonTrait, Any, GeoInterface.MultiPolygonTrait, Any}",href:"#GeometryOps.overlaps-Tuple{GeoInterface.MultiPolygonTrait, Any, GeoInterface.MultiPolygonTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.overlaps")],-1)),s[262]||(s[262]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[263]||(s[263]=a(`
julia
overlaps(
+    ::GI.MultiPolygonTrait, polys1,
+    ::GI.MultiPolygonTrait, polys2,
+)::Bool

Return true if at least one pair of polygons from multipolygons overlap. Else false.

source

`,3))]),i("details",Ws,[i("summary",null,[s[264]||(s[264]=i("a",{id:"GeometryOps.overlaps-Tuple{GeoInterface.MultiPolygonTrait, Any, GeoInterface.PolygonTrait, Any}",href:"#GeometryOps.overlaps-Tuple{GeoInterface.MultiPolygonTrait, Any, GeoInterface.PolygonTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.overlaps")],-1)),s[265]||(s[265]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[266]||(s[266]=a(`
julia
overlaps(
+    ::GI.MultiPolygonTrait, polys1,
+    ::GI.PolygonTrait, poly2,
+)::Bool

Return true if polygon overlaps with at least one of the polygons within the multipolygon. Else false.

source

`,3))]),i("details",zs,[i("summary",null,[s[267]||(s[267]=i("a",{id:"GeometryOps.overlaps-Tuple{GeoInterface.PolygonTrait, Any, GeoInterface.MultiPolygonTrait, Any}",href:"#GeometryOps.overlaps-Tuple{GeoInterface.PolygonTrait, Any, GeoInterface.MultiPolygonTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.overlaps")],-1)),s[268]||(s[268]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[269]||(s[269]=a(`
julia
overlaps(
+    ::GI.PolygonTrait, poly1,
+    ::GI.MultiPolygonTrait, polys2,
+)::Bool

Return true if polygon overlaps with at least one of the polygons within the multipolygon. Else false.

source

`,3))]),i("details",Zs,[i("summary",null,[s[270]||(s[270]=i("a",{id:"GeometryOps.overlaps-Tuple{GeoInterface.PolygonTrait, Any, GeoInterface.PolygonTrait, Any}",href:"#GeometryOps.overlaps-Tuple{GeoInterface.PolygonTrait, Any, GeoInterface.PolygonTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.overlaps")],-1)),s[271]||(s[271]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[272]||(s[272]=a(`
julia
overlaps(
+    trait_a::GI.PolygonTrait, poly_a,
+    trait_b::GI.PolygonTrait, poly_b,
+)::Bool

If the two polygons intersect with one another, but are not equal, return true. Else false.

source

`,3))]),i("details",_s,[i("summary",null,[s[273]||(s[273]=i("a",{id:"GeometryOps.overlaps-Tuple{Union{GeoInterface.LineStringTrait, GeoInterface.Wrappers.LinearRing}, Any, Union{GeoInterface.LineStringTrait, GeoInterface.Wrappers.LinearRing}, Any}",href:"#GeometryOps.overlaps-Tuple{Union{GeoInterface.LineStringTrait, GeoInterface.Wrappers.LinearRing}, Any, Union{GeoInterface.LineStringTrait, GeoInterface.Wrappers.LinearRing}, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.overlaps")],-1)),s[274]||(s[274]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[275]||(s[275]=a(`
julia
overlaps(
+    ::Union{GI.LineStringTrait, GI.LinearRing}, line1,
+    ::Union{GI.LineStringTrait, GI.LinearRing}, line2,
+)::Bool

If the curves overlap, meaning that at least one edge of each curve overlaps, return true. Else false.

source

`,3))]),i("details",Ks,[i("summary",null,[s[276]||(s[276]=i("a",{id:"GeometryOps.polygon_to_line-Tuple{Any}",href:"#GeometryOps.polygon_to_line-Tuple{Any}"},[i("span",{class:"jlbinding"},"GeometryOps.polygon_to_line")],-1)),s[277]||(s[277]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[278]||(s[278]=a(`
julia
polygon_to_line(poly::Polygon)

Converts a Polygon to LineString or MultiLineString

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+
+poly = GI.Polygon([[(-2.275543, 53.464547), (-2.275543, 53.489271), (-2.215118, 53.489271), (-2.215118, 53.464547), (-2.275543, 53.464547)]])
+GO.polygon_to_line(poly)
+# output
+GeoInterface.Wrappers.LineString{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(-2.275543, 53.464547), (-2.275543, 53.489271), (-2.215118, 53.489271), (-2.215118, 53.464547), (-2.275543, 53.464547)], nothing, nothing)

source

`,5))]),i("details",Xs,[i("summary",null,[s[279]||(s[279]=i("a",{id:"GeometryOps.polygonize-Tuple{AbstractMatrix{Bool}}",href:"#GeometryOps.polygonize-Tuple{AbstractMatrix{Bool}}"},[i("span",{class:"jlbinding"},"GeometryOps.polygonize")],-1)),s[280]||(s[280]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[281]||(s[281]=a(`
julia
polygonize(A::AbstractMatrix{Bool}; kw...)
+polygonize(f, A::AbstractMatrix; kw...)
+polygonize(xs, ys, A::AbstractMatrix{Bool}; kw...)
+polygonize(f, xs, ys, A::AbstractMatrix; kw...)

Polygonize an AbstractMatrix of values, currently to a single class of polygons.

Returns a MultiPolygon for Bool values and f return values, and a FeatureCollection of Features holding MultiPolygon for all other values.

Function f should return either true or false or a transformation of values into simpler groups, especially useful for floating point arrays.

If xs and ys are ranges, they are used as the pixel/cell center points. If they are Vector of Tuple they are used as the lower and upper bounds of each pixel/cell.

Keywords

Example

julia
using GeometryOps
+A = rand(100, 100)
+multipolygon = polygonize(>(0.5), A);

source

`,10))]),i("details",$s,[i("summary",null,[s[282]||(s[282]=i("a",{id:"GeometryOps.segmentize-Tuple{Any}",href:"#GeometryOps.segmentize-Tuple{Any}"},[i("span",{class:"jlbinding"},"GeometryOps.segmentize")],-1)),s[283]||(s[283]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[284]||(s[284]=a('
julia
segmentize([method = Planar()], geom; max_distance::Real, threaded)

Segmentize a geometry by adding extra vertices to the geometry so that no segment is longer than a given distance. This is useful for plotting geometries with a limited number of vertices, or for ensuring that a geometry is not too "coarse" for a given application.

Arguments

Returns a geometry of similar type to the input geometry, but resampled.

source

',6))]),i("details",Ys,[i("summary",null,[s[285]||(s[285]=i("a",{id:"GeometryOps.signed_area-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T<:AbstractFloat",href:"#GeometryOps.signed_area-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T<:AbstractFloat"},[i("span",{class:"jlbinding"},"GeometryOps.signed_area")],-1)),s[286]||(s[286]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[287]||(s[287]=a(`
julia
signed_area(geom, [T = Float64])::T

Returns the signed area of a single geometry, based on winding order. This is computed slightly differently for different geometries:

- The signed area of a point is always zero.
+- The signed area of a curve is always zero.
+- The signed area of a polygon is computed with the shoelace formula and is
+positive if the polygon coordinates wind clockwise and negative if
+counterclockwise.
+- You cannot compute the signed area of a multipolygon as it doesn't have a
+meaning as each sub-polygon could have a different winding order.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

`,5))]),i("details",si,[i("summary",null,[s[288]||(s[288]=i("a",{id:"GeometryOps.signed_distance-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat",href:"#GeometryOps.signed_distance-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat"},[i("span",{class:"jlbinding"},"GeometryOps.signed_distance")],-1)),s[289]||(s[289]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[290]||(s[290]=a('
julia
signed_distance(point, geom, ::Type{T} = Float64)::T

Calculates the signed distance from the geometry geom to the given point. Points within geom have a negative signed distance, and points outside of geom have a positive signed distance. - The signed distance from a point to a point, line, linestring, or linear ring is equal to the distance between the two. - The signed distance from a point to a polygon is negative if the point is within the polygon and is positive otherwise. The value of the distance is the minimum distance from the point to an edge of the polygon. This includes edges created by holes. - The signed distance from a point to a multigeometry or a geometry collection is the minimum signed distance between the point and any of the sub-geometries.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

',4))]),i("details",ii,[i("summary",null,[s[291]||(s[291]=i("a",{id:"GeometryOps.simplify-Tuple{GeometryOps.SimplifyAlg, Any}",href:"#GeometryOps.simplify-Tuple{GeometryOps.SimplifyAlg, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.simplify")],-1)),s[292]||(s[292]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[293]||(s[293]=a(`
julia
simplify(obj; kw...)
+simplify(::SimplifyAlg, obj; kw...)

Simplify a geometry, feature, feature collection, or nested vectors or a table of these.

RadialDistance, DouglasPeucker, or VisvalingamWhyatt algorithms are available, listed in order of increasing quality but decreasing performance.

PoinTrait and MultiPointTrait are returned unchanged.

The default behaviour is simplify(DouglasPeucker(; kw...), obj). Pass in other SimplifyAlg to use other algorithms.

Keywords

Keywords for DouglasPeucker are allowed when no algorithm is specified:

Keywords

Example

Simplify a polygon to have six points:

julia
import GeoInterface as GI
+import GeometryOps as GO
+
+poly = GI.Polygon([[
+    [-70.603637, -33.399918],
+    [-70.614624, -33.395332],
+    [-70.639343, -33.392466],
+    [-70.659942, -33.394759],
+    [-70.683975, -33.404504],
+    [-70.697021, -33.419406],
+    [-70.701141, -33.434306],
+    [-70.700454, -33.446339],
+    [-70.694274, -33.458369],
+    [-70.682601, -33.465816],
+    [-70.668869, -33.472117],
+    [-70.646209, -33.473835],
+    [-70.624923, -33.472117],
+    [-70.609817, -33.468107],
+    [-70.595397, -33.458369],
+    [-70.587158, -33.442901],
+    [-70.587158, -33.426283],
+    [-70.590591, -33.414248],
+    [-70.594711, -33.406224],
+    [-70.603637, -33.399918]]])
+
+simple = GO.simplify(poly; number=6)
+GI.npoint(simple)
+
+# output
+6

source

`,14))]),i("details",ai,[i("summary",null,[s[294]||(s[294]=i("a",{id:"GeometryOps.t_value-Union{Tuple{T2}, Tuple{T1}, Tuple{N}, Tuple{Union{NTuple{N, T1}, StaticArraysCore.StaticArray{Tuple{N}, T1, 1}}, Union{NTuple{N, T1}, StaticArraysCore.StaticArray{Tuple{N}, T1, 1}}, T2, T2}} where {N, T1<:Real, T2<:Real}",href:"#GeometryOps.t_value-Union{Tuple{T2}, Tuple{T1}, Tuple{N}, Tuple{Union{NTuple{N, T1}, StaticArraysCore.StaticArray{Tuple{N}, T1, 1}}, Union{NTuple{N, T1}, StaticArraysCore.StaticArray{Tuple{N}, T1, 1}}, T2, T2}} where {N, T1<:Real, T2<:Real}"},[i("span",{class:"jlbinding"},"GeometryOps.t_value")],-1)),s[295]||(s[295]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[298]||(s[298]=a('
julia
t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)

Returns the "T-value" as described in Hormann's presentation [1] on how to calculate the mean-value coordinate.

Here, sᵢ is the vector from vertex vᵢ to the point, and rᵢ is the norm (length) of sᵢ. s must be Point and r must be real numbers.

',3)),i("mjx-container",ei,[(p(),l("svg",ti,s[296]||(s[296]=[a('',1)]))),s[297]||(s[297]=i("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[i("mi",null,"t"),i("mi",null,"ᵢ"),i("mo",null,"="),i("mfrac",null,[i("mrow",null,[i("mrow",{"data-mjx-texclass":"ORD"},[i("mi",{"data-mjx-auto-op":"false"},"det")]),i("mrow",{"data-mjx-texclass":"INNER"},[i("mo",{"data-mjx-texclass":"OPEN"},"("),i("mi",null,"s"),i("mi",null,"ᵢ"),i("mo",null,","),i("mi",null,"s"),i("mi",null,"ᵢ"),i("mrow",{"data-mjx-texclass":"ORD"},[i("mo",{"data-mjx-pseudoscript":"true"},"₊")]),i("mrow",{"data-mjx-texclass":"ORD"},[i("mo",{"data-mjx-pseudoscript":"true"},"₁")]),i("mo",{"data-mjx-texclass":"CLOSE"},")")])]),i("mrow",null,[i("mi",null,"r"),i("mi",null,"ᵢ"),i("mo",null,"∗"),i("mi",null,"r"),i("mi",null,"ᵢ"),i("mrow",{"data-mjx-texclass":"ORD"},[i("mo",{"data-mjx-pseudoscript":"true"},"₊")]),i("mrow",{"data-mjx-texclass":"ORD"},[i("mo",{"data-mjx-pseudoscript":"true"},"₁")]),i("mo",null,"+"),i("mi",null,"s"),i("mi",null,"ᵢ"),i("mo",null,"⋅"),i("mi",null,"s"),i("mi",null,"ᵢ"),i("mrow",{"data-mjx-texclass":"ORD"},[i("mo",{"data-mjx-pseudoscript":"true"},"₊")]),i("mrow",{"data-mjx-texclass":"ORD"},[i("mo",{"data-mjx-pseudoscript":"true"},"₁")])])])])],-1))]),s[299]||(s[299]=a(`

+
+[source](https://github.com/JuliaGeo/GeometryOps.jl/blob/9f0e22db49f7b49d5352750e9f69705f13c06d64/src/methods/barycentric.jl#L289-L305)
+
+</details>
+
+<details class='jldocstring custom-block' open>
+<summary><a id='GeometryOps.to_edges-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T' href='#GeometryOps.to_edges-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T'><span class="jlbinding">GeometryOps.to_edges</span></a> <Badge type="info" class="jlObjectType jlMethod" text="Method" /></summary>
+
+
+
+\`\`\`julia
+to_edges()

Convert any geometry or collection of geometries into a flat vector of Tuple{Tuple{Float64,Float64},Tuple{Float64,Float64}} edges.

source

`,3))]),i("details",ni,[i("summary",null,[s[300]||(s[300]=i("a",{id:"GeometryOps.touches-Tuple{Any, Any}",href:"#GeometryOps.touches-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.touches")],-1)),s[301]||(s[301]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[302]||(s[302]=a(`
julia
touches(geom1, geom2)::Bool

Return true if the first geometry touches the second geometry. In other words, the two interiors cannot interact, but one of the geometries must have a boundary point that interacts with either the other geometry's interior or boundary.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+
+l1 = GI.Line([(0.0, 0.0), (1.0, 0.0)])
+l2 = GI.Line([(1.0, 1.0), (1.0, -1.0)])
+
+GO.touches(l1, l2)
+# output
+true

source

`,5))]),i("details",li,[i("summary",null,[s[303]||(s[303]=i("a",{id:"GeometryOps.transform-Tuple{Any, Any}",href:"#GeometryOps.transform-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.transform")],-1)),s[304]||(s[304]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[305]||(s[305]=a(`
julia
transform(f, obj)

Apply a function f to all the points in obj.

Points will be passed to f as an SVector to allow using CoordinateTransformations.jl and Rotations.jl without hassle.

SVector is also a valid GeoInterface.jl point, so will work in all GeoInterface.jl methods.

Example

julia
julia> import GeoInterface as GI
+
+julia> import GeometryOps as GO
+
+julia> geom = GI.Polygon([GI.LinearRing([(1, 2), (3, 4), (5, 6), (1, 2)]), GI.LinearRing([(3, 4), (5, 6), (6, 7), (3, 4)])]);
+
+julia> f = CoordinateTransformations.Translation(3.5, 1.5)
+Translation(3.5, 1.5)
+
+julia> GO.transform(f, geom)
+GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Linea
+rRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticArraysCo
+re.SVector{2, Float64}[[4.5, 3.5], [6.5, 5.5], [8.5, 7.5], [4.5, 3.5]], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticA
+rraysCore.SVector{2, Float64}[[6.5, 5.5], [8.5, 7.5], [9.5, 8.5], [6.5, 5.5]], nothing, nothing)], nothing, nothing)

With Rotations.jl you need to actually multiply the Rotation by the SVector point, which is easy using an anonymous function.

julia
julia> using Rotations
+
+julia> GO.transform(p -> one(RotMatrix{2}) * p, geom)
+GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearR
+ing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}(StaticArraysCore.SVe
+ctor{2, Int64}[[2, 1], [4, 3], [6, 5], [2, 1]], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}(StaticArraysCore.SVector{2, Int64
+}[[4, 3], [6, 5], [7, 6], [4, 3]], nothing, nothing)], nothing, nothing)

source

`,9))]),i("details",pi,[i("summary",null,[s[306]||(s[306]=i("a",{id:"GeometryOps.tuples-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T",href:"#GeometryOps.tuples-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T"},[i("span",{class:"jlbinding"},"GeometryOps.tuples")],-1)),s[307]||(s[307]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[308]||(s[308]=a('
julia
tuples(obj)

Convert all points in obj to Tuples, wherever the are nested.

Returns a similar object or collection of objects using GeoInterface.jl geometries wrapping Tuple points.

Keywords

source

',6))]),i("details",hi,[i("summary",null,[s[309]||(s[309]=i("a",{id:"GeometryOps.union-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat",href:"#GeometryOps.union-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat"},[i("span",{class:"jlbinding"},"GeometryOps.union")],-1)),s[310]||(s[310]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[311]||(s[311]=a(`
julia
union(geom_a, geom_b, [::Type{T}]; target::Type, fix_multipoly = UnionIntersectingPolygons())

Return the union between two geometries as a list of geometries. Return an empty list if none are found. The type of the list will be constrained as much as possible given the input geometries. Furthermore, the user can provide a taget type as a keyword argument and a list of target geometries found in the difference will be returned. The user can also provide a float type 'T' that they would like the points of returned geometries to be. If the user is taking a intersection involving one or more multipolygons, and the multipolygon might be comprised of polygons that intersect, if fix_multipoly is set to an IntersectingPolygons correction (the default is UnionIntersectingPolygons()), then the needed multipolygons will be fixed to be valid before performing the intersection to ensure a correct answer. Only set fix_multipoly to false if you know that the multipolygons are valid, as it will avoid unneeded computation.

Calculates the union between two polygons.

Example

julia
import GeoInterface as GI, GeometryOps as GO
+
+p1 = GI.Polygon([[(0.0, 0.0), (5.0, 5.0), (10.0, 0.0), (5.0, -5.0), (0.0, 0.0)]])
+p2 = GI.Polygon([[(3.0, 0.0), (8.0, 5.0), (13.0, 0.0), (8.0, -5.0), (3.0, 0.0)]])
+union_poly = GO.union(p1, p2; target = GI.PolygonTrait())
+GI.coordinates.(union_poly)
+
+# output
+1-element Vector{Vector{Vector{Vector{Float64}}}}:
+ [[[6.5, 3.5], [5.0, 5.0], [0.0, 0.0], [5.0, -5.0], [6.5, -3.5], [8.0, -5.0], [13.0, 0.0], [8.0, 5.0], [6.5, 3.5]]]

source

`,6))]),i("details",ki,[i("summary",null,[s[312]||(s[312]=i("a",{id:"GeometryOps.weighted_mean-Union{Tuple{WT}, Tuple{WT, Any, Any}} where WT<:Real",href:"#GeometryOps.weighted_mean-Union{Tuple{WT}, Tuple{WT, Any, Any}} where WT<:Real"},[i("span",{class:"jlbinding"},"GeometryOps.weighted_mean")],-1)),s[313]||(s[313]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[314]||(s[314]=a('
julia
weighted_mean(weight::Real, x1, x2)

Returns the weighted mean of x1 and x2, where weight is the weight of x1.

Specifically, calculates x1 * weight + x2 * (1 - weight).

Note

The idea for this method is that you can override this for custom types, like Color types, in extension modules.

source

',5))]),i("details",ri,[i("summary",null,[s[315]||(s[315]=i("a",{id:"GeometryOps.within-Tuple{Any, Any}",href:"#GeometryOps.within-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.within")],-1)),s[316]||(s[316]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[317]||(s[317]=a(`
julia
within(geom1, geom2)::Bool

Return true if the first geometry is completely within the second geometry. The interiors of both geometries must intersect and the interior and boundary of the primary geometry (geom1) must not intersect the exterior of the secondary geometry (geom2).

Furthermore, within returns the exact opposite result of contains.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+
+line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
+point = (1, 2)
+GO.within(point, line)
+
+# output
+true

source

`,6))]),s[324]||(s[324]=a('
  1. K. Hormann and N. Sukumar. Generalized Barycentric Coordinates in Computer Graphics and Computational Mechanics. Taylor & Fancis, CRC Press, 2017. ↩︎

',2))])}const Fi=h(r,[["render",oi]]);export{mi as __pageData,Fi as default}; diff --git a/previews/PR239/assets/api.md.BkfD-VZg.lean.js b/previews/PR239/assets/api.md.BkfD-VZg.lean.js new file mode 100644 index 000000000..952041e56 --- /dev/null +++ b/previews/PR239/assets/api.md.BkfD-VZg.lean.js @@ -0,0 +1,381 @@ +import{_ as h,c as l,a5 as a,j as i,a as e,G as n,B as k,o as p}from"./chunks/framework.onQNwZ2I.js";const mi=JSON.parse('{"title":"Full GeometryOps API documentation","description":"","frontmatter":{},"headers":[],"relativePath":"api.md","filePath":"api.md","lastUpdated":null}'),r={name:"api.md"},o={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},G={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},O={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},Q={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""},L={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},P={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},R={class:"jldocstring custom-block",open:""},S={class:"jldocstring custom-block",open:""},V={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},U={class:"jldocstring custom-block",open:""},H={class:"jldocstring custom-block",open:""},N={class:"jldocstring custom-block",open:""},W={class:"jldocstring custom-block",open:""},z={class:"jldocstring custom-block",open:""},Z={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},K={class:"jldocstring custom-block",open:""},X={class:"jldocstring custom-block",open:""},$={class:"jldocstring custom-block",open:""},Y={class:"jldocstring custom-block",open:""},ss={class:"jldocstring custom-block",open:""},is={class:"jldocstring custom-block",open:""},as={class:"jldocstring custom-block",open:""},es={class:"jldocstring custom-block",open:""},ts={class:"jldocstring custom-block",open:""},ns={class:"jldocstring custom-block",open:""},ls={class:"jldocstring custom-block",open:""},ps={class:"jldocstring custom-block",open:""},hs={class:"jldocstring custom-block",open:""},ks={class:"jldocstring custom-block",open:""},rs={class:"jldocstring custom-block",open:""},os={class:"jldocstring custom-block",open:""},ds={class:"jldocstring custom-block",open:""},gs={class:"jldocstring custom-block",open:""},ys={class:"jldocstring custom-block",open:""},Es={class:"jldocstring custom-block",open:""},cs={class:"jldocstring custom-block",open:""},us={class:"jldocstring custom-block",open:""},ms={class:"jldocstring custom-block",open:""},Fs={class:"jldocstring custom-block",open:""},Cs={class:"jldocstring custom-block",open:""},bs={class:"jldocstring custom-block",open:""},fs={class:"jldocstring custom-block",open:""},Ts={class:"jldocstring custom-block",open:""},Gs={class:"jldocstring custom-block",open:""},vs={class:"jldocstring custom-block",open:""},As={class:"jldocstring custom-block",open:""},js={class:"jldocstring custom-block",open:""},Bs={class:"jldocstring custom-block",open:""},Os={class:"jldocstring custom-block",open:""},Ds={class:"jldocstring custom-block",open:""},Qs={class:"jldocstring custom-block",open:""},xs={class:"jldocstring custom-block",open:""},ws={class:"jldocstring custom-block",open:""},Ls={class:"jldocstring custom-block",open:""},Is={class:"jldocstring custom-block",open:""},Ms={class:"jldocstring custom-block",open:""},Ps={class:"jldocstring custom-block",open:""},qs={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},Rs={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.827ex"},xmlns:"http://www.w3.org/2000/svg",width:"33.539ex",height:"6.785ex",role:"img",focusable:"false",viewBox:"0 -1749.5 14824.1 2999","aria-hidden":"true"},Ss={class:"jldocstring custom-block",open:""},Vs={class:"jldocstring custom-block",open:""},Js={class:"jldocstring custom-block",open:""},Us={class:"jldocstring custom-block",open:""},Hs={class:"jldocstring custom-block",open:""},Ns={class:"jldocstring custom-block",open:""},Ws={class:"jldocstring custom-block",open:""},zs={class:"jldocstring custom-block",open:""},Zs={class:"jldocstring custom-block",open:""},_s={class:"jldocstring custom-block",open:""},Ks={class:"jldocstring custom-block",open:""},Xs={class:"jldocstring custom-block",open:""},$s={class:"jldocstring custom-block",open:""},Ys={class:"jldocstring custom-block",open:""},si={class:"jldocstring custom-block",open:""},ii={class:"jldocstring custom-block",open:""},ai={class:"jldocstring custom-block",open:""},ei={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},ti={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.059ex"},xmlns:"http://www.w3.org/2000/svg",width:"27.746ex",height:"5.362ex",role:"img",focusable:"false",viewBox:"0 -1460 12263.9 2370","aria-hidden":"true"},ni={class:"jldocstring custom-block",open:""},li={class:"jldocstring custom-block",open:""},pi={class:"jldocstring custom-block",open:""},hi={class:"jldocstring custom-block",open:""},ki={class:"jldocstring custom-block",open:""},ri={class:"jldocstring custom-block",open:""};function oi(di,s,gi,yi,Ei,ci){const t=k("Badge");return p(),l("div",null,[s[318]||(s[318]=a('

Full GeometryOps API documentation

Warning

This page is still very much WIP!

Documentation for GeometryOps's full API (only for reference!).

apply and associated functions

',5)),i("details",o,[i("summary",null,[s[0]||(s[0]=i("a",{id:"GeometryOpsCore.apply",href:"#GeometryOpsCore.apply"},[i("span",{class:"jlbinding"},"GeometryOpsCore.apply")],-1)),s[1]||(s[1]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=a(`
julia
apply(f, target::Union{TraitTarget, GI.AbstractTrait}, obj; kw...)

Reconstruct a geometry, feature, feature collection, or nested vectors of either using the function f on the target trait.

f(target_geom) => x where x also has the target trait, or a trait that can be substituted. For example, swapping PolgonTrait to MultiPointTrait will fail if the outer object has MultiPolygonTrait, but should work if it has FeatureTrait.

Objects "shallower" than the target trait are always completely rebuilt, like a Vector of FeatureCollectionTrait of FeatureTrait when the target has PolygonTrait and is held in the features. These will always be GeoInterface geometries/feature/feature collections. But "deeper" objects may remain unchanged or be whatever GeoInterface compatible objects f returns.

The result is a functionally similar geometry with values depending on f.

Example

Flipped point the order in any feature or geometry, or iterables of either:

julia
import GeoInterface as GI
+import GeometryOps as GO
+geom = GI.Polygon([GI.LinearRing([(1, 2), (3, 4), (5, 6), (1, 2)]),
+                   GI.LinearRing([(3, 4), (5, 6), (6, 7), (3, 4)])])
+
+flipped_geom = GO.apply(GI.PointTrait, geom) do p
+    (GI.y(p), GI.x(p))
+end

source

`,10))]),i("details",d,[i("summary",null,[s[3]||(s[3]=i("a",{id:"GeometryOpsCore.applyreduce",href:"#GeometryOpsCore.applyreduce"},[i("span",{class:"jlbinding"},"GeometryOpsCore.applyreduce")],-1)),s[4]||(s[4]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=a('
julia
applyreduce(f, op, target::Union{TraitTarget, GI.AbstractTrait}, obj; threaded)

Apply function f to all objects with the target trait, and reduce the result with an op like +.

The order and grouping of application of op is not guaranteed.

If threaded==true threads will be used over arrays and iterables, feature collections and nested geometries.

source

',5))]),i("details",g,[i("summary",null,[s[6]||(s[6]=i("a",{id:"GeometryOps.reproject",href:"#GeometryOps.reproject"},[i("span",{class:"jlbinding"},"GeometryOps.reproject")],-1)),s[7]||(s[7]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=a(`
julia
reproject(geometry; source_crs, target_crs, transform, always_xy, time)
+reproject(geometry, source_crs, target_crs; always_xy, time)
+reproject(geometry, transform; always_xy, time)

Reproject any GeoInterface.jl compatible geometry from source_crs to target_crs.

The returned object will be constructed from GeoInterface.WrapperGeometry geometries, wrapping views of a Vector{Proj.Point{D}}, where D is the dimension.

Tip

The Proj.jl package must be loaded for this method to work, since it is implemented in a package extension.

Arguments

If these a passed as keywords, transform will take priority. Without it target_crs is always needed, and source_crs is needed if it is not retrievable from the geometry with GeoInterface.crs(geometry).

Keywords

source

`,10))]),i("details",y,[i("summary",null,[s[9]||(s[9]=i("a",{id:"GeometryOps.transform",href:"#GeometryOps.transform"},[i("span",{class:"jlbinding"},"GeometryOps.transform")],-1)),s[10]||(s[10]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[11]||(s[11]=a(`
julia
transform(f, obj)

Apply a function f to all the points in obj.

Points will be passed to f as an SVector to allow using CoordinateTransformations.jl and Rotations.jl without hassle.

SVector is also a valid GeoInterface.jl point, so will work in all GeoInterface.jl methods.

Example

julia
julia> import GeoInterface as GI
+
+julia> import GeometryOps as GO
+
+julia> geom = GI.Polygon([GI.LinearRing([(1, 2), (3, 4), (5, 6), (1, 2)]), GI.LinearRing([(3, 4), (5, 6), (6, 7), (3, 4)])]);
+
+julia> f = CoordinateTransformations.Translation(3.5, 1.5)
+Translation(3.5, 1.5)
+
+julia> GO.transform(f, geom)
+GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Linea
+rRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticArraysCo
+re.SVector{2, Float64}[[4.5, 3.5], [6.5, 5.5], [8.5, 7.5], [4.5, 3.5]], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticA
+rraysCore.SVector{2, Float64}[[6.5, 5.5], [8.5, 7.5], [9.5, 8.5], [6.5, 5.5]], nothing, nothing)], nothing, nothing)

With Rotations.jl you need to actually multiply the Rotation by the SVector point, which is easy using an anonymous function.

julia
julia> using Rotations
+
+julia> GO.transform(p -> one(RotMatrix{2}) * p, geom)
+GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearR
+ing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}(StaticArraysCore.SVe
+ctor{2, Int64}[[2, 1], [4, 3], [6, 5], [2, 1]], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}(StaticArraysCore.SVector{2, Int64
+}[[4, 3], [6, 5], [7, 6], [4, 3]], nothing, nothing)], nothing, nothing)

source

`,9))]),s[319]||(s[319]=i("h2",{id:"General-geometry-methods",tabindex:"-1"},[e("General geometry methods "),i("a",{class:"header-anchor",href:"#General-geometry-methods","aria-label":'Permalink to "General geometry methods {#General-geometry-methods}"'},"​")],-1)),s[320]||(s[320]=i("h3",{id:"OGC-methods",tabindex:"-1"},[e("OGC methods "),i("a",{class:"header-anchor",href:"#OGC-methods","aria-label":'Permalink to "OGC methods {#OGC-methods}"'},"​")],-1)),i("details",E,[i("summary",null,[s[12]||(s[12]=i("a",{id:"GeometryOps.contains",href:"#GeometryOps.contains"},[i("span",{class:"jlbinding"},"GeometryOps.contains")],-1)),s[13]||(s[13]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[14]||(s[14]=a(`
julia
contains(g1::AbstractGeometry, g2::AbstractGeometry)::Bool

Return true if the second geometry is completely contained by the first geometry. The interiors of both geometries must intersect and the interior and boundary of the secondary (g2) must not intersect the exterior of the first (g1).

contains returns the exact opposite result of within.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
+point = GI.Point((1, 2))
+
+GO.contains(line, point)
+# output
+true

source

`,6))]),i("details",c,[i("summary",null,[s[15]||(s[15]=i("a",{id:"GeometryOps.coveredby",href:"#GeometryOps.coveredby"},[i("span",{class:"jlbinding"},"GeometryOps.coveredby")],-1)),s[16]||(s[16]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[17]||(s[17]=a(`
julia
coveredby(g1, g2)::Bool

Return true if the first geometry is completely covered by the second geometry. The interior and boundary of the primary geometry (g1) must not intersect the exterior of the secondary geometry (g2).

Furthermore, coveredby returns the exact opposite result of covers. They are equivalent with the order of the arguments swapped.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+p1 = GI.Point(0.0, 0.0)
+p2 = GI.Point(1.0, 1.0)
+l1 = GI.Line([p1, p2])
+
+GO.coveredby(p1, l1)
+# output
+true

source

`,6))]),i("details",u,[i("summary",null,[s[18]||(s[18]=i("a",{id:"GeometryOps.covers",href:"#GeometryOps.covers"},[i("span",{class:"jlbinding"},"GeometryOps.covers")],-1)),s[19]||(s[19]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[20]||(s[20]=a(`
julia
covers(g1::AbstractGeometry, g2::AbstractGeometry)::Bool

Return true if the first geometry is completely covers the second geometry, The exterior and boundary of the second geometry must not be outside of the interior and boundary of the first geometry. However, the interiors need not intersect.

covers returns the exact opposite result of coveredby.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+l1 = GI.LineString([(1.0, 1.0), (1.0, 2.0), (1.0, 3.0), (1.0, 4.0)])
+l2 = GI.LineString([(1.0, 1.0), (1.0, 2.0)])
+
+GO.covers(l1, l2)
+# output
+true

source

`,6))]),i("details",m,[i("summary",null,[s[21]||(s[21]=i("a",{id:"GeometryOps.crosses",href:"#GeometryOps.crosses"},[i("span",{class:"jlbinding"},"GeometryOps.crosses")],-1)),s[22]||(s[22]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[23]||(s[23]=a(`
julia
 crosses(geom1, geom2)::Bool

Return true if the intersection results in a geometry whose dimension is one less than the maximum dimension of the two source geometries and the intersection set is interior to both source geometries.

TODO: broken

Examples

julia
import GeoInterface as GI, GeometryOps as GO
+# TODO: Add working example

source

`,6))]),i("details",F,[i("summary",null,[s[24]||(s[24]=i("a",{id:"GeometryOps.disjoint",href:"#GeometryOps.disjoint"},[i("span",{class:"jlbinding"},"GeometryOps.disjoint")],-1)),s[25]||(s[25]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=a(`
julia
disjoint(geom1, geom2)::Bool

Return true if the first geometry is disjoint from the second geometry.

Return true if the first geometry is disjoint from the second geometry. The interiors and boundaries of both geometries must not intersect.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+
+line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
+point = (2, 2)
+GO.disjoint(point, line)
+
+# output
+true

source

`,6))]),i("details",C,[i("summary",null,[s[27]||(s[27]=i("a",{id:"GeometryOps.intersects",href:"#GeometryOps.intersects"},[i("span",{class:"jlbinding"},"GeometryOps.intersects")],-1)),s[28]||(s[28]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[29]||(s[29]=a(`
julia
intersects(geom1, geom2)::Bool

Return true if the interiors or boundaries of the two geometries interact.

intersects returns the exact opposite result of disjoint.

Example

julia
import GeoInterface as GI, GeometryOps as GO
+
+line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)])
+line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)])
+GO.intersects(line1, line2)
+
+# output
+true

source

`,6))]),i("details",b,[i("summary",null,[s[30]||(s[30]=i("a",{id:"GeometryOps.overlaps",href:"#GeometryOps.overlaps"},[i("span",{class:"jlbinding"},"GeometryOps.overlaps")],-1)),s[31]||(s[31]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[32]||(s[32]=a(`
julia
overlaps(geom1, geom2)::Bool

Compare two Geometries of the same dimension and return true if their intersection set results in a geometry different from both but of the same dimension. This means one geometry cannot be within or contain the other and they cannot be equal

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+poly1 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
+poly2 = GI.Polygon([[(1,1), (1,6), (6,6), (6,1), (1,1)]])
+
+GO.overlaps(poly1, poly2)
+# output
+true

source

julia
overlaps(::GI.AbstractTrait, geom1, ::GI.AbstractTrait, geom2)::Bool

For any non-specified pair, all have non-matching dimensions, return false.

source

julia
overlaps(
+    ::GI.MultiPointTrait, points1,
+    ::GI.MultiPointTrait, points2,
+)::Bool

If the multipoints overlap, meaning some, but not all, of the points within the multipoints are shared, return true.

source

julia
overlaps(::GI.LineTrait, line1, ::GI.LineTrait, line)::Bool

If the lines overlap, meaning that they are collinear but each have one endpoint outside of the other line, return true. Else false.

source

julia
overlaps(
+    ::Union{GI.LineStringTrait, GI.LinearRing}, line1,
+    ::Union{GI.LineStringTrait, GI.LinearRing}, line2,
+)::Bool

If the curves overlap, meaning that at least one edge of each curve overlaps, return true. Else false.

source

julia
overlaps(
+    trait_a::GI.PolygonTrait, poly_a,
+    trait_b::GI.PolygonTrait, poly_b,
+)::Bool

If the two polygons intersect with one another, but are not equal, return true. Else false.

source

julia
overlaps(
+    ::GI.PolygonTrait, poly1,
+    ::GI.MultiPolygonTrait, polys2,
+)::Bool

Return true if polygon overlaps with at least one of the polygons within the multipolygon. Else false.

source

julia
overlaps(
+    ::GI.MultiPolygonTrait, polys1,
+    ::GI.PolygonTrait, poly2,
+)::Bool

Return true if polygon overlaps with at least one of the polygons within the multipolygon. Else false.

source

julia
overlaps(
+    ::GI.MultiPolygonTrait, polys1,
+    ::GI.MultiPolygonTrait, polys2,
+)::Bool

Return true if at least one pair of polygons from multipolygons overlap. Else false.

source

`,29))]),i("details",f,[i("summary",null,[s[33]||(s[33]=i("a",{id:"GeometryOps.touches",href:"#GeometryOps.touches"},[i("span",{class:"jlbinding"},"GeometryOps.touches")],-1)),s[34]||(s[34]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[35]||(s[35]=a(`
julia
touches(geom1, geom2)::Bool

Return true if the first geometry touches the second geometry. In other words, the two interiors cannot interact, but one of the geometries must have a boundary point that interacts with either the other geometry's interior or boundary.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+
+l1 = GI.Line([(0.0, 0.0), (1.0, 0.0)])
+l2 = GI.Line([(1.0, 1.0), (1.0, -1.0)])
+
+GO.touches(l1, l2)
+# output
+true

source

`,5))]),i("details",T,[i("summary",null,[s[36]||(s[36]=i("a",{id:"GeometryOps.within",href:"#GeometryOps.within"},[i("span",{class:"jlbinding"},"GeometryOps.within")],-1)),s[37]||(s[37]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[38]||(s[38]=a(`
julia
within(geom1, geom2)::Bool

Return true if the first geometry is completely within the second geometry. The interiors of both geometries must intersect and the interior and boundary of the primary geometry (geom1) must not intersect the exterior of the secondary geometry (geom2).

Furthermore, within returns the exact opposite result of contains.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+
+line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
+point = (1, 2)
+GO.within(point, line)
+
+# output
+true

source

`,6))]),s[321]||(s[321]=i("h3",{id:"Other-general-methods",tabindex:"-1"},[e("Other general methods "),i("a",{class:"header-anchor",href:"#Other-general-methods","aria-label":'Permalink to "Other general methods {#Other-general-methods}"'},"​")],-1)),i("details",G,[i("summary",null,[s[39]||(s[39]=i("a",{id:"GeometryOps.equals",href:"#GeometryOps.equals"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[40]||(s[40]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[41]||(s[41]=a(`
julia
equals(geom1, geom2)::Bool

Compare two Geometries return true if they are the same geometry.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+poly1 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
+poly2 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
+
+GO.equals(poly1, poly2)
+# output
+true

source

julia
equals(::T, geom_a, ::T, geom_b)::Bool

Two geometries of the same type, which don't have a equals function to dispatch off of should throw an error.

source

julia
equals(trait_a, geom_a, trait_b, geom_b)

Two geometries which are not of the same type cannot be equal so they always return false.

source

julia
equals(::GI.PointTrait, p1, ::GI.PointTrait, p2)::Bool

Two points are the same if they have the same x and y (and z if 3D) coordinates.

source

julia
equals(::GI.PointTrait, p1, ::GI.MultiPointTrait, mp2)::Bool

A point and a multipoint are equal if the multipoint is composed of a single point that is equivalent to the given point.

source

julia
equals(::GI.MultiPointTrait, mp1, ::GI.PointTrait, p2)::Bool

A point and a multipoint are equal if the multipoint is composed of a single point that is equivalent to the given point.

source

julia
equals(::GI.MultiPointTrait, mp1, ::GI.MultiPointTrait, mp2)::Bool

Two multipoints are equal if they share the same set of points.

source

julia
equals(
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
+)::Bool

Two lines/linestrings are equal if they share the same set of points going along the curve. Note that lines/linestrings aren't closed by definition.

source

julia
equals(
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
+    ::GI.LinearRingTrait, l2,
+)::Bool

A line/linestring and a linear ring are equal if they share the same set of points going along the curve. Note that lines aren't closed by definition, but rings are, so the line must have a repeated last point to be equal

source

julia
equals(
+    ::GI.LinearRingTrait, l1,
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
+)::Bool

A linear ring and a line/linestring are equal if they share the same set of points going along the curve. Note that lines aren't closed by definition, but rings are, so the line must have a repeated last point to be equal

source

julia
equals(
+    ::GI.LinearRingTrait, l1,
+    ::GI.LinearRingTrait, l2,
+)::Bool

Two linear rings are equal if they share the same set of points going along the curve. Note that rings are closed by definition, so they can have, but don't need, a repeated last point to be equal.

source

julia
equals(::GI.PolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool

Two polygons are equal if they share the same exterior edge and holes.

source

julia
equals(::GI.PolygonTrait, geom_a, ::GI.MultiPolygonTrait, geom_b)::Bool

A polygon and a multipolygon are equal if the multipolygon is composed of a single polygon that is equivalent to the given polygon.

source

julia
equals(::GI.MultiPolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool

A polygon and a multipolygon are equal if the multipolygon is composed of a single polygon that is equivalent to the given polygon.

source

julia
equals(::GI.PolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool

Two multipolygons are equal if they share the same set of polygons.

source

`,47))]),i("details",v,[i("summary",null,[s[42]||(s[42]=i("a",{id:"GeometryOps.centroid",href:"#GeometryOps.centroid"},[i("span",{class:"jlbinding"},"GeometryOps.centroid")],-1)),s[43]||(s[43]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[44]||(s[44]=a('
julia
centroid(geom, [T=Float64])::Tuple{T, T}

Returns the centroid of a given line segment, linear ring, polygon, or mutlipolygon.

source

',3))]),i("details",A,[i("summary",null,[s[45]||(s[45]=i("a",{id:"GeometryOps.distance",href:"#GeometryOps.distance"},[i("span",{class:"jlbinding"},"GeometryOps.distance")],-1)),s[46]||(s[46]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[47]||(s[47]=a('
julia
distance(point, geom, ::Type{T} = Float64)::T

Calculates the ditance from the geometry g1 to the point. The distance will always be positive or zero.

The method will differ based on the type of the geometry provided: - The distance from a point to a point is just the Euclidean distance between the points. - The distance from a point to a line is the minimum distance from the point to the closest point on the given line. - The distance from a point to a linestring is the minimum distance from the point to the closest segment of the linestring. - The distance from a point to a linear ring is the minimum distance from the point to the closest segment of the linear ring. - The distance from a point to a polygon is zero if the point is within the polygon and otherwise is the minimum distance from the point to an edge of the polygon. This includes edges created by holes. - The distance from a point to a multigeometry or a geometry collection is the minimum distance between the point and any of the sub-geometries.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

',5))]),i("details",j,[i("summary",null,[s[48]||(s[48]=i("a",{id:"GeometryOps.signed_distance",href:"#GeometryOps.signed_distance"},[i("span",{class:"jlbinding"},"GeometryOps.signed_distance")],-1)),s[49]||(s[49]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[50]||(s[50]=a('
julia
signed_distance(point, geom, ::Type{T} = Float64)::T

Calculates the signed distance from the geometry geom to the given point. Points within geom have a negative signed distance, and points outside of geom have a positive signed distance. - The signed distance from a point to a point, line, linestring, or linear ring is equal to the distance between the two. - The signed distance from a point to a polygon is negative if the point is within the polygon and is positive otherwise. The value of the distance is the minimum distance from the point to an edge of the polygon. This includes edges created by holes. - The signed distance from a point to a multigeometry or a geometry collection is the minimum signed distance between the point and any of the sub-geometries.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

',4))]),i("details",B,[i("summary",null,[s[51]||(s[51]=i("a",{id:"GeometryOps.area",href:"#GeometryOps.area"},[i("span",{class:"jlbinding"},"GeometryOps.area")],-1)),s[52]||(s[52]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[53]||(s[53]=a(`
julia
area(geom, [T = Float64])::T

Returns the area of a geometry or collection of geometries. This is computed slightly differently for different geometries:

- The area of a point/multipoint is always zero.
+- The area of a curve/multicurve is always zero.
+- The area of a polygon is the absolute value of the signed area.
+- The area multi-polygon is the sum of the areas of all of the sub-polygons.
+- The area of a geometry collection, feature collection of array/iterable 
+    is the sum of the areas of all of the sub-geometries.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

`,5))]),i("details",O,[i("summary",null,[s[54]||(s[54]=i("a",{id:"GeometryOps.signed_area",href:"#GeometryOps.signed_area"},[i("span",{class:"jlbinding"},"GeometryOps.signed_area")],-1)),s[55]||(s[55]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[56]||(s[56]=a(`
julia
signed_area(geom, [T = Float64])::T

Returns the signed area of a single geometry, based on winding order. This is computed slightly differently for different geometries:

- The signed area of a point is always zero.
+- The signed area of a curve is always zero.
+- The signed area of a polygon is computed with the shoelace formula and is
+positive if the polygon coordinates wind clockwise and negative if
+counterclockwise.
+- You cannot compute the signed area of a multipolygon as it doesn't have a
+meaning as each sub-polygon could have a different winding order.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

`,5))]),i("details",D,[i("summary",null,[s[57]||(s[57]=i("a",{id:"GeometryOps.angles",href:"#GeometryOps.angles"},[i("span",{class:"jlbinding"},"GeometryOps.angles")],-1)),s[58]||(s[58]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[59]||(s[59]=a(`
julia
angles(geom, ::Type{T} = Float64)

Returns the angles of a geometry or collection of geometries. This is computed differently for different geometries:

- The angles of a point is an empty vector.
+- The angles of a single line segment is an empty vector.
+- The angles of a linestring or linearring is a vector of angles formed by the curve.
+- The angles of a polygon is a vector of vectors of angles formed by each ring.
+- The angles of a multi-geometry collection is a vector of the angles of each of the
+    sub-geometries as defined above.

Result will be a Vector, or nested set of vectors, of type T where an optional argument with a default value of Float64.

source

`,5))]),i("details",Q,[i("summary",null,[s[60]||(s[60]=i("a",{id:"GeometryOps.embed_extent",href:"#GeometryOps.embed_extent"},[i("span",{class:"jlbinding"},"GeometryOps.embed_extent")],-1)),s[61]||(s[61]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[62]||(s[62]=a('
julia
embed_extent(obj)

Recursively wrap the object with a GeoInterface.jl geometry, calculating and adding an Extents.Extent to all objects.

This can improve performance when extents need to be checked multiple times, such when needing to check if many points are in geometries, and using their extents as a quick filter for obviously exterior points.

Keywords

source

',6))]),s[322]||(s[322]=i("h2",{id:"Barycentric-coordinates",tabindex:"-1"},[e("Barycentric coordinates "),i("a",{class:"header-anchor",href:"#Barycentric-coordinates","aria-label":'Permalink to "Barycentric coordinates {#Barycentric-coordinates}"'},"​")],-1)),i("details",x,[i("summary",null,[s[63]||(s[63]=i("a",{id:"GeometryOps.barycentric_coordinates",href:"#GeometryOps.barycentric_coordinates"},[i("span",{class:"jlbinding"},"GeometryOps.barycentric_coordinates")],-1)),s[64]||(s[64]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[65]||(s[65]=a('
julia
barycentric_coordinates(method = MeanValue(), polygon, point)

Returns the barycentric coordinates of point in polygon using the barycentric coordinate method method.

source

',3))]),i("details",w,[i("summary",null,[s[66]||(s[66]=i("a",{id:"GeometryOps.barycentric_coordinates!",href:"#GeometryOps.barycentric_coordinates!"},[i("span",{class:"jlbinding"},"GeometryOps.barycentric_coordinates!")],-1)),s[67]||(s[67]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[68]||(s[68]=a('
julia
barycentric_coordinates!(λs::Vector{<: Real}, method::AbstractBarycentricCoordinateMethod, polygon, point)

Loads the barycentric coordinates of point in polygon into λs using the barycentric coordinate method method.

λs must be of the length of the polygon plus its holes.

Tip

Use this method to avoid excess allocations when you need to calculate barycentric coordinates for many points.

source

',5))]),i("details",L,[i("summary",null,[s[69]||(s[69]=i("a",{id:"GeometryOps.barycentric_interpolate",href:"#GeometryOps.barycentric_interpolate"},[i("span",{class:"jlbinding"},"GeometryOps.barycentric_interpolate")],-1)),s[70]||(s[70]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[71]||(s[71]=a('
julia
barycentric_interpolate(method = MeanValue(), polygon, values::AbstractVector{V}, point)

Returns the interpolated value at point within polygon using the barycentric coordinate method method. values are the per-point values for the polygon which are to be interpolated.

Returns an object of type V.

Warning

Barycentric interpolation is currently defined only for 2-dimensional polygons. If you pass a 3-D polygon in, the Z coordinate will be used as per-vertex value to be interpolated (the M coordinate in GIS parlance).

source

',5))]),s[323]||(s[323]=i("h2",{id:"Other-methods",tabindex:"-1"},[e("Other methods "),i("a",{class:"header-anchor",href:"#Other-methods","aria-label":'Permalink to "Other methods {#Other-methods}"'},"​")],-1)),i("details",I,[i("summary",null,[s[72]||(s[72]=i("a",{id:"GeometryOps.AbstractBarycentricCoordinateMethod",href:"#GeometryOps.AbstractBarycentricCoordinateMethod"},[i("span",{class:"jlbinding"},"GeometryOps.AbstractBarycentricCoordinateMethod")],-1)),s[73]||(s[73]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[74]||(s[74]=a('
julia
abstract type AbstractBarycentricCoordinateMethod

Abstract supertype for barycentric coordinate methods. The subtypes may serve as dispatch types, or may cache some information about the target polygon.

API

The following methods must be implemented for all subtypes:

The rest of the methods will be implemented in terms of these, and have efficient dispatches for broadcasting.

source

',7))]),i("details",M,[i("summary",null,[s[75]||(s[75]=i("a",{id:"GeometryOps.ClosedRing",href:"#GeometryOps.ClosedRing"},[i("span",{class:"jlbinding"},"GeometryOps.ClosedRing")],-1)),s[76]||(s[76]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[77]||(s[77]=a('
julia
ClosedRing() <: GeometryCorrection

This correction ensures that a polygon's exterior and interior rings are closed.

It can be called on any geometry correction as usual.

See also GeometryCorrection.

source

',5))]),i("details",P,[i("summary",null,[s[78]||(s[78]=i("a",{id:"GeometryOps.DiffIntersectingPolygons",href:"#GeometryOps.DiffIntersectingPolygons"},[i("span",{class:"jlbinding"},"GeometryOps.DiffIntersectingPolygons")],-1)),s[79]||(s[79]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[80]||(s[80]=a('
julia
DiffIntersectingPolygons() <: GeometryCorrection

This correction ensures that the polygons included in a multipolygon aren't intersecting. If any polygon's are intersecting, they will be made nonintersecting through the difference operation to create a unique set of disjoint (other than potentially connections by a single point) polygons covering the same area. See also GeometryCorrection, UnionIntersectingPolygons.

source

',3))]),i("details",q,[i("summary",null,[s[81]||(s[81]=i("a",{id:"GeometryOps.DouglasPeucker",href:"#GeometryOps.DouglasPeucker"},[i("span",{class:"jlbinding"},"GeometryOps.DouglasPeucker")],-1)),s[82]||(s[82]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[83]||(s[83]=a(`
julia
DouglasPeucker <: SimplifyAlg
+
+DouglasPeucker(; number, ratio, tol)

Simplifies geometries by removing points below tol distance from the line between its neighboring points.

Keywords

Note: user input tol is squared to avoid unnecessary computation in algorithm.

source

`,6))]),i("details",R,[i("summary",null,[s[84]||(s[84]=i("a",{id:"GeometryOps.GEOS",href:"#GeometryOps.GEOS"},[i("span",{class:"jlbinding"},"GeometryOps.GEOS")],-1)),s[85]||(s[85]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[86]||(s[86]=a('
julia
GEOS(; params...)

A struct which instructs the method it's passed to as an algorithm to use the appropriate GEOS function via LibGEOS.jl for the operation.

Dispatch is generally carried out using the names of the keyword arguments. For example, segmentize will only accept a GEOS struct with only a max_distance keyword, and no other.

It's generally a lot slower than the native Julia implementations, since it must convert to the LibGEOS implementation and back - so be warned!

source

',5))]),i("details",S,[i("summary",null,[s[87]||(s[87]=i("a",{id:"GeometryOps.GeodesicSegments",href:"#GeometryOps.GeodesicSegments"},[i("span",{class:"jlbinding"},"GeometryOps.GeodesicSegments")],-1)),s[88]||(s[88]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[89]||(s[89]=a('
julia
GeodesicSegments(; max_distance::Real, equatorial_radius::Real=6378137, flattening::Real=1/298.257223563)

A method for segmentizing geometries by adding extra vertices to the geometry so that no segment is longer than a given distance. This method calculates the distance between points on the geodesic, and assumes input in lat/long coordinates.

Warning

Any input geometries must be in lon/lat coordinates! If not, the method may fail or error.

Arguments

One can also omit the equatorial_radius and flattening keyword arguments, and pass a geodesic object directly to the eponymous keyword.

This method uses the Proj/GeographicLib API for geodesic calculations.

source

',8))]),i("details",V,[i("summary",null,[s[90]||(s[90]=i("a",{id:"GeometryOps.GeometryCorrection",href:"#GeometryOps.GeometryCorrection"},[i("span",{class:"jlbinding"},"GeometryOps.GeometryCorrection")],-1)),s[91]||(s[91]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[92]||(s[92]=a('
julia
abstract type GeometryCorrection

This abstract type represents a geometry correction.

Interface

Any GeometryCorrection must implement two functions: * application_level(::GeometryCorrection)::AbstractGeometryTrait: This function should return the GeoInterface trait that the correction is intended to be applied to, like PointTrait or LineStringTrait or PolygonTrait. * (::GeometryCorrection)(::AbstractGeometryTrait, geometry)::(some_geometry): This function should apply the correction to the given geometry, and return a new geometry.

source

',5))]),i("details",J,[i("summary",null,[s[93]||(s[93]=i("a",{id:"GeometryOps.LineOrientation",href:"#GeometryOps.LineOrientation"},[i("span",{class:"jlbinding"},"GeometryOps.LineOrientation")],-1)),s[94]||(s[94]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[95]||(s[95]=a('
julia
Enum LineOrientation

Enum for the orientation of a line with respect to a curve. A line can be line_cross (crossing over the curve), line_hinge (crossing the endpoint of the curve), line_over (collinear with the curve), or line_out (not interacting with the curve).

source

',3))]),i("details",U,[i("summary",null,[s[96]||(s[96]=i("a",{id:"GeometryOps.LinearSegments",href:"#GeometryOps.LinearSegments"},[i("span",{class:"jlbinding"},"GeometryOps.LinearSegments")],-1)),s[97]||(s[97]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[98]||(s[98]=a('
julia
LinearSegments(; max_distance::Real)

A method for segmentizing geometries by adding extra vertices to the geometry so that no segment is longer than a given distance.

Here, max_distance is a purely nondimensional quantity and will apply in the input space. This is to say, that if the polygon is provided in lat/lon coordinates then the max_distance will be in degrees of arc. If the polygon is provided in meters, then the max_distance will be in meters.

source

',4))]),i("details",H,[i("summary",null,[s[99]||(s[99]=i("a",{id:"GeometryOps.MeanValue",href:"#GeometryOps.MeanValue"},[i("span",{class:"jlbinding"},"GeometryOps.MeanValue")],-1)),s[100]||(s[100]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[101]||(s[101]=a('
julia
MeanValue() <: AbstractBarycentricCoordinateMethod

This method calculates barycentric coordinates using the mean value method.

References

source

',4))]),i("details",N,[i("summary",null,[s[102]||(s[102]=i("a",{id:"GeometryOps.MonotoneChainMethod",href:"#GeometryOps.MonotoneChainMethod"},[i("span",{class:"jlbinding"},"GeometryOps.MonotoneChainMethod")],-1)),s[103]||(s[103]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[104]||(s[104]=a('
julia
MonotoneChainMethod()

This is an algorithm for the convex_hull function.

Uses DelaunayTriangulation.jl to compute the convex hull. This is a pure Julia algorithm which provides an optimal Delaunay triangulation.

See also convex_hull

source

',5))]),i("details",W,[i("summary",null,[s[105]||(s[105]=i("a",{id:"GeometryOps.PointOrientation",href:"#GeometryOps.PointOrientation"},[i("span",{class:"jlbinding"},"GeometryOps.PointOrientation")],-1)),s[106]||(s[106]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[107]||(s[107]=a('
julia
Enum PointOrientation

Enum for the orientation of a point with respect to a curve. A point can be point_in the curve, point_on the curve, or point_out of the curve.

source

',3))]),i("details",z,[i("summary",null,[s[108]||(s[108]=i("a",{id:"GeometryOps.RadialDistance",href:"#GeometryOps.RadialDistance"},[i("span",{class:"jlbinding"},"GeometryOps.RadialDistance")],-1)),s[109]||(s[109]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[110]||(s[110]=a('
julia
RadialDistance <: SimplifyAlg

Simplifies geometries by removing points less than tol distance from the line between its neighboring points.

Keywords

Note: user input tol is squared to avoid unnecessary computation in algorithm.

source

',6))]),i("details",Z,[i("summary",null,[s[111]||(s[111]=i("a",{id:"GeometryOps.SimplifyAlg",href:"#GeometryOps.SimplifyAlg"},[i("span",{class:"jlbinding"},"GeometryOps.SimplifyAlg")],-1)),s[112]||(s[112]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[113]||(s[113]=a('
julia
abstract type SimplifyAlg

Abstract type for simplification algorithms.

API

For now, the algorithm must hold the number, ratio and tol properties.

Simplification algorithm types can hook into the interface by implementing the _simplify(trait, alg, geom) methods for whichever traits are necessary.

source

',6))]),i("details",_,[i("summary",null,[s[114]||(s[114]=i("a",{id:"GeometryOps.UnionIntersectingPolygons",href:"#GeometryOps.UnionIntersectingPolygons"},[i("span",{class:"jlbinding"},"GeometryOps.UnionIntersectingPolygons")],-1)),s[115]||(s[115]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[116]||(s[116]=a('
julia
UnionIntersectingPolygons() <: GeometryCorrection

This correction ensures that the polygon's included in a multipolygon aren't intersecting. If any polygon's are intersecting, they will be combined through the union operation to create a unique set of disjoint (other than potentially connections by a single point) polygons covering the same area.

See also GeometryCorrection.

source

',4))]),i("details",K,[i("summary",null,[s[117]||(s[117]=i("a",{id:"GeometryOps.VisvalingamWhyatt",href:"#GeometryOps.VisvalingamWhyatt"},[i("span",{class:"jlbinding"},"GeometryOps.VisvalingamWhyatt")],-1)),s[118]||(s[118]=e()),n(t,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[119]||(s[119]=a(`
julia
VisvalingamWhyatt <: SimplifyAlg
+
+VisvalingamWhyatt(; kw...)

Simplifies geometries by removing points below tol distance from the line between its neighboring points.

Keywords

Note: user input tol is doubled to avoid unnecessary computation in algorithm.

source

`,6))]),i("details",X,[i("summary",null,[s[120]||(s[120]=i("a",{id:"GeometryOps._det-Union{Tuple{T2}, Tuple{T1}, Tuple{Union{Tuple{T1, T1}, StaticArraysCore.StaticArray{Tuple{2}, T1, 1}}, Union{Tuple{T2, T2}, StaticArraysCore.StaticArray{Tuple{2}, T2, 1}}}} where {T1<:Real, T2<:Real}",href:"#GeometryOps._det-Union{Tuple{T2}, Tuple{T1}, Tuple{Union{Tuple{T1, T1}, StaticArraysCore.StaticArray{Tuple{2}, T1, 1}}, Union{Tuple{T2, T2}, StaticArraysCore.StaticArray{Tuple{2}, T2, 1}}}} where {T1<:Real, T2<:Real}"},[i("span",{class:"jlbinding"},"GeometryOps._det")],-1)),s[121]||(s[121]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[122]||(s[122]=a('
julia
_det(s1::Point2{T1}, s2::Point2{T2}) where {T1 <: Real, T2 <: Real}

Returns the determinant of the matrix formed by hcat'ing two points s1 and s2.

Specifically, this is:

julia
s1[1] * s2[2] - s1[2] * s2[1]

source

',5))]),i("details",$,[i("summary",null,[s[123]||(s[123]=i("a",{id:"GeometryOps._equals_curves-NTuple{4, Any}",href:"#GeometryOps._equals_curves-NTuple{4, Any}"},[i("span",{class:"jlbinding"},"GeometryOps._equals_curves")],-1)),s[124]||(s[124]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[125]||(s[125]=a('
julia
_equals_curves(c1, c2, closed_type1, closed_type2)::Bool

Two curves are equal if they share the same set of point, representing the same geometry. Both curves must must be composed of the same set of points, however, they do not have to wind in the same direction, or start on the same point to be equivalent. Inputs: c1 first geometry c2 second geometry closed_type1::Bool true if c1 is closed by definition (polygon, linear ring) closed_type2::Bool true if c2 is closed by definition (polygon, linear ring)

source

',3))]),i("details",Y,[i("summary",null,[s[126]||(s[126]=i("a",{id:"GeometryOps.angles-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T<:AbstractFloat",href:"#GeometryOps.angles-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T<:AbstractFloat"},[i("span",{class:"jlbinding"},"GeometryOps.angles")],-1)),s[127]||(s[127]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[128]||(s[128]=a(`
julia
angles(geom, ::Type{T} = Float64)

Returns the angles of a geometry or collection of geometries. This is computed differently for different geometries:

- The angles of a point is an empty vector.
+- The angles of a single line segment is an empty vector.
+- The angles of a linestring or linearring is a vector of angles formed by the curve.
+- The angles of a polygon is a vector of vectors of angles formed by each ring.
+- The angles of a multi-geometry collection is a vector of the angles of each of the
+    sub-geometries as defined above.

Result will be a Vector, or nested set of vectors, of type T where an optional argument with a default value of Float64.

source

`,5))]),i("details",ss,[i("summary",null,[s[129]||(s[129]=i("a",{id:"GeometryOps.area-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T<:AbstractFloat",href:"#GeometryOps.area-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T<:AbstractFloat"},[i("span",{class:"jlbinding"},"GeometryOps.area")],-1)),s[130]||(s[130]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[131]||(s[131]=a(`
julia
area(geom, [T = Float64])::T

Returns the area of a geometry or collection of geometries. This is computed slightly differently for different geometries:

- The area of a point/multipoint is always zero.
+- The area of a curve/multicurve is always zero.
+- The area of a polygon is the absolute value of the signed area.
+- The area multi-polygon is the sum of the areas of all of the sub-polygons.
+- The area of a geometry collection, feature collection of array/iterable 
+    is the sum of the areas of all of the sub-geometries.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

`,5))]),i("details",is,[i("summary",null,[s[132]||(s[132]=i("a",{id:"GeometryOps.barycentric_coordinates!-Tuple{Vector{<:Real}, GeometryOps.AbstractBarycentricCoordinateMethod, Any, Any}",href:"#GeometryOps.barycentric_coordinates!-Tuple{Vector{<:Real}, GeometryOps.AbstractBarycentricCoordinateMethod, Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.barycentric_coordinates!")],-1)),s[133]||(s[133]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[134]||(s[134]=a('
julia
barycentric_coordinates!(λs::Vector{<: Real}, method::AbstractBarycentricCoordinateMethod, polygon, point)

Loads the barycentric coordinates of point in polygon into λs using the barycentric coordinate method method.

λs must be of the length of the polygon plus its holes.

Tip

Use this method to avoid excess allocations when you need to calculate barycentric coordinates for many points.

source

',5))]),i("details",as,[i("summary",null,[s[135]||(s[135]=i("a",{id:"GeometryOps.barycentric_coordinates-Tuple{GeometryOps.AbstractBarycentricCoordinateMethod, Any, Any}",href:"#GeometryOps.barycentric_coordinates-Tuple{GeometryOps.AbstractBarycentricCoordinateMethod, Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.barycentric_coordinates")],-1)),s[136]||(s[136]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[137]||(s[137]=a('
julia
barycentric_coordinates(method = MeanValue(), polygon, point)

Returns the barycentric coordinates of point in polygon using the barycentric coordinate method method.

source

',3))]),i("details",es,[i("summary",null,[s[138]||(s[138]=i("a",{id:"GeometryOps.barycentric_interpolate-Union{Tuple{V}, Tuple{GeometryOps.AbstractBarycentricCoordinateMethod, Any, AbstractVector{V}, Any}} where V",href:"#GeometryOps.barycentric_interpolate-Union{Tuple{V}, Tuple{GeometryOps.AbstractBarycentricCoordinateMethod, Any, AbstractVector{V}, Any}} where V"},[i("span",{class:"jlbinding"},"GeometryOps.barycentric_interpolate")],-1)),s[139]||(s[139]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[140]||(s[140]=a('
julia
barycentric_interpolate(method = MeanValue(), polygon, values::AbstractVector{V}, point)

Returns the interpolated value at point within polygon using the barycentric coordinate method method. values are the per-point values for the polygon which are to be interpolated.

Returns an object of type V.

Warning

Barycentric interpolation is currently defined only for 2-dimensional polygons. If you pass a 3-D polygon in, the Z coordinate will be used as per-vertex value to be interpolated (the M coordinate in GIS parlance).

source

',5))]),i("details",ts,[i("summary",null,[s[141]||(s[141]=i("a",{id:"GeometryOps.centroid-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T",href:"#GeometryOps.centroid-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T"},[i("span",{class:"jlbinding"},"GeometryOps.centroid")],-1)),s[142]||(s[142]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[143]||(s[143]=a('
julia
centroid(geom, [T=Float64])::Tuple{T, T}

Returns the centroid of a given line segment, linear ring, polygon, or mutlipolygon.

source

',3))]),i("details",ns,[i("summary",null,[s[144]||(s[144]=i("a",{id:"GeometryOps.centroid_and_area-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T",href:"#GeometryOps.centroid_and_area-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T"},[i("span",{class:"jlbinding"},"GeometryOps.centroid_and_area")],-1)),s[145]||(s[145]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[146]||(s[146]=a('
julia
centroid_and_area(geom, [T=Float64])::(::Tuple{T, T}, ::Real)

Returns the centroid and area of a given geometry.

source

',3))]),i("details",ls,[i("summary",null,[s[147]||(s[147]=i("a",{id:"GeometryOps.centroid_and_length-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T",href:"#GeometryOps.centroid_and_length-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T"},[i("span",{class:"jlbinding"},"GeometryOps.centroid_and_length")],-1)),s[148]||(s[148]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[149]||(s[149]=a('
julia
centroid_and_length(geom, [T=Float64])::(::Tuple{T, T}, ::Real)

Returns the centroid and length of a given line/ring. Note this is only valid for line strings and linear rings.

source

',3))]),i("details",ps,[i("summary",null,[s[150]||(s[150]=i("a",{id:"GeometryOps.contains-Tuple{Any, Any}",href:"#GeometryOps.contains-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.contains")],-1)),s[151]||(s[151]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[152]||(s[152]=a(`
julia
contains(g1::AbstractGeometry, g2::AbstractGeometry)::Bool

Return true if the second geometry is completely contained by the first geometry. The interiors of both geometries must intersect and the interior and boundary of the secondary (g2) must not intersect the exterior of the first (g1).

contains returns the exact opposite result of within.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
+point = GI.Point((1, 2))
+
+GO.contains(line, point)
+# output
+true

source

`,6))]),i("details",hs,[i("summary",null,[s[153]||(s[153]=i("a",{id:"GeometryOps.convex_hull",href:"#GeometryOps.convex_hull"},[i("span",{class:"jlbinding"},"GeometryOps.convex_hull")],-1)),s[154]||(s[154]=e()),n(t,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[155]||(s[155]=a('
julia
convex_hull([method], geometries)

Compute the convex hull of the points in geometries. Returns a GI.Polygon representing the convex hull.

Note that the polygon returned is wound counterclockwise as in the Simple Features standard by default. If you choose GEOS, the winding order will be inverted.

Warning

This interface only computes the 2-dimensional convex hull!

For higher dimensional hulls, use the relevant package (Qhull.jl, Quickhull.jl, or similar).

source

',5))]),i("details",ks,[i("summary",null,[s[156]||(s[156]=i("a",{id:"GeometryOps.coverage-Union{Tuple{T}, NTuple{5, Any}, Tuple{Any, Any, Any, Any, Any, Type{T}}} where T<:AbstractFloat",href:"#GeometryOps.coverage-Union{Tuple{T}, NTuple{5, Any}, Tuple{Any, Any, Any, Any, Any, Type{T}}} where T<:AbstractFloat"},[i("span",{class:"jlbinding"},"GeometryOps.coverage")],-1)),s[157]||(s[157]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[158]||(s[158]=a('
julia
coverage(geom, xmin, xmax, ymin, ymax, [T = Float64])::T

Returns the area of intersection between given geometry and grid cell defined by its minimum and maximum x and y-values. This is computed differently for different geometries:

Result will be of type T, where T is an optional argument with a default value of Float64.

source

',5))]),i("details",rs,[i("summary",null,[s[159]||(s[159]=i("a",{id:"GeometryOps.coveredby-Tuple{Any, Any}",href:"#GeometryOps.coveredby-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.coveredby")],-1)),s[160]||(s[160]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[161]||(s[161]=a(`
julia
coveredby(g1, g2)::Bool

Return true if the first geometry is completely covered by the second geometry. The interior and boundary of the primary geometry (g1) must not intersect the exterior of the secondary geometry (g2).

Furthermore, coveredby returns the exact opposite result of covers. They are equivalent with the order of the arguments swapped.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+p1 = GI.Point(0.0, 0.0)
+p2 = GI.Point(1.0, 1.0)
+l1 = GI.Line([p1, p2])
+
+GO.coveredby(p1, l1)
+# output
+true

source

`,6))]),i("details",os,[i("summary",null,[s[162]||(s[162]=i("a",{id:"GeometryOps.covers-Tuple{Any, Any}",href:"#GeometryOps.covers-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.covers")],-1)),s[163]||(s[163]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[164]||(s[164]=a(`
julia
covers(g1::AbstractGeometry, g2::AbstractGeometry)::Bool

Return true if the first geometry is completely covers the second geometry, The exterior and boundary of the second geometry must not be outside of the interior and boundary of the first geometry. However, the interiors need not intersect.

covers returns the exact opposite result of coveredby.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+l1 = GI.LineString([(1.0, 1.0), (1.0, 2.0), (1.0, 3.0), (1.0, 4.0)])
+l2 = GI.LineString([(1.0, 1.0), (1.0, 2.0)])
+
+GO.covers(l1, l2)
+# output
+true

source

`,6))]),i("details",ds,[i("summary",null,[s[165]||(s[165]=i("a",{id:"GeometryOps.crosses-Tuple{Any, Any}",href:"#GeometryOps.crosses-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.crosses")],-1)),s[166]||(s[166]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[167]||(s[167]=a(`
julia
 crosses(geom1, geom2)::Bool

Return true if the intersection results in a geometry whose dimension is one less than the maximum dimension of the two source geometries and the intersection set is interior to both source geometries.

TODO: broken

Examples

julia
import GeoInterface as GI, GeometryOps as GO
+# TODO: Add working example

source

`,6))]),i("details",gs,[i("summary",null,[s[168]||(s[168]=i("a",{id:"GeometryOps.cut-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat",href:"#GeometryOps.cut-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat"},[i("span",{class:"jlbinding"},"GeometryOps.cut")],-1)),s[169]||(s[169]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[170]||(s[170]=a(`
julia
cut(geom, line, [T::Type])

Return given geom cut by given line as a list of geometries of the same type as the input geom. Return the original geometry as only list element if none are found. Line must cut fully through given geometry or the original geometry will be returned.

Note: This currently doesn't work for degenerate cases there line crosses through vertices.

Example

julia
import GeoInterface as GI, GeometryOps as GO
+
+poly = GI.Polygon([[(0.0, 0.0), (10.0, 0.0), (10.0, 10.0), (0.0, 10.0), (0.0, 0.0)]])
+line = GI.Line([(5.0, -5.0), (5.0, 15.0)])
+cut_polys = GO.cut(poly, line)
+GI.coordinates.(cut_polys)
+
+# output
+2-element Vector{Vector{Vector{Vector{Float64}}}}:
+ [[[0.0, 0.0], [5.0, 0.0], [5.0, 10.0], [0.0, 10.0], [0.0, 0.0]]]
+ [[[5.0, 0.0], [10.0, 0.0], [10.0, 10.0], [5.0, 10.0], [5.0, 0.0]]]

source

`,6))]),i("details",ys,[i("summary",null,[s[171]||(s[171]=i("a",{id:"GeometryOps.difference-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat",href:"#GeometryOps.difference-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat"},[i("span",{class:"jlbinding"},"GeometryOps.difference")],-1)),s[172]||(s[172]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[173]||(s[173]=a(`
julia
difference(geom_a, geom_b, [T::Type]; target::Type, fix_multipoly = UnionIntersectingPolygons())

Return the difference between two geometries as a list of geometries. Return an empty list if none are found. The type of the list will be constrained as much as possible given the input geometries. Furthermore, the user can provide a taget type as a keyword argument and a list of target geometries found in the difference will be returned. The user can also provide a float type that they would like the points of returned geometries to be. If the user is taking a intersection involving one or more multipolygons, and the multipolygon might be comprised of polygons that intersect, if fix_multipoly is set to an IntersectingPolygons correction (the default is UnionIntersectingPolygons()), then the needed multipolygons will be fixed to be valid before performing the intersection to ensure a correct answer. Only set fix_multipoly to false if you know that the multipolygons are valid, as it will avoid unneeded computation.

Example

julia
import GeoInterface as GI, GeometryOps as GO
+
+poly1 = GI.Polygon([[[0.0, 0.0], [5.0, 5.0], [10.0, 0.0], [5.0, -5.0], [0.0, 0.0]]])
+poly2 = GI.Polygon([[[3.0, 0.0], [8.0, 5.0], [13.0, 0.0], [8.0, -5.0], [3.0, 0.0]]])
+diff_poly = GO.difference(poly1, poly2; target = GI.PolygonTrait())
+GI.coordinates.(diff_poly)
+
+# output
+1-element Vector{Vector{Vector{Vector{Float64}}}}:
+ [[[6.5, 3.5], [5.0, 5.0], [0.0, 0.0], [5.0, -5.0], [6.5, -3.5], [3.0, 0.0], [6.5, 3.5]]]

source

`,5))]),i("details",Es,[i("summary",null,[s[174]||(s[174]=i("a",{id:"GeometryOps.disjoint-Tuple{Any, Any}",href:"#GeometryOps.disjoint-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.disjoint")],-1)),s[175]||(s[175]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[176]||(s[176]=a(`
julia
disjoint(geom1, geom2)::Bool

Return true if the first geometry is disjoint from the second geometry.

Return true if the first geometry is disjoint from the second geometry. The interiors and boundaries of both geometries must not intersect.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+
+line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
+point = (2, 2)
+GO.disjoint(point, line)
+
+# output
+true

source

`,6))]),i("details",cs,[i("summary",null,[s[177]||(s[177]=i("a",{id:"GeometryOps.distance-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat",href:"#GeometryOps.distance-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat"},[i("span",{class:"jlbinding"},"GeometryOps.distance")],-1)),s[178]||(s[178]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[179]||(s[179]=a('
julia
distance(point, geom, ::Type{T} = Float64)::T

Calculates the ditance from the geometry g1 to the point. The distance will always be positive or zero.

The method will differ based on the type of the geometry provided: - The distance from a point to a point is just the Euclidean distance between the points. - The distance from a point to a line is the minimum distance from the point to the closest point on the given line. - The distance from a point to a linestring is the minimum distance from the point to the closest segment of the linestring. - The distance from a point to a linear ring is the minimum distance from the point to the closest segment of the linear ring. - The distance from a point to a polygon is zero if the point is within the polygon and otherwise is the minimum distance from the point to an edge of the polygon. This includes edges created by holes. - The distance from a point to a multigeometry or a geometry collection is the minimum distance between the point and any of the sub-geometries.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

',5))]),i("details",us,[i("summary",null,[s[180]||(s[180]=i("a",{id:"GeometryOps.embed_extent-Tuple{Any}",href:"#GeometryOps.embed_extent-Tuple{Any}"},[i("span",{class:"jlbinding"},"GeometryOps.embed_extent")],-1)),s[181]||(s[181]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[182]||(s[182]=a('
julia
embed_extent(obj)

Recursively wrap the object with a GeoInterface.jl geometry, calculating and adding an Extents.Extent to all objects.

This can improve performance when extents need to be checked multiple times, such when needing to check if many points are in geometries, and using their extents as a quick filter for obviously exterior points.

Keywords

source

',6))]),i("details",ms,[i("summary",null,[s[183]||(s[183]=i("a",{id:"GeometryOps.enforce-Tuple{GEOS, Symbol, Any}",href:"#GeometryOps.enforce-Tuple{GEOS, Symbol, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.enforce")],-1)),s[184]||(s[184]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[185]||(s[185]=a('
julia
enforce(alg::GO.GEOS, kw::Symbol, f)

Enforce the presence of a keyword argument in a GEOS algorithm, and return alg.params[kw].

Throws an error if the key is not present, and mentions f in the error message (since there isn't a good way to get the name of the function that called this method).

source

',4))]),i("details",Fs,[i("summary",null,[s[186]||(s[186]=i("a",{id:"GeometryOps.equals-NTuple{4, Any}",href:"#GeometryOps.equals-NTuple{4, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[187]||(s[187]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[188]||(s[188]=a('
julia
equals(trait_a, geom_a, trait_b, geom_b)

Two geometries which are not of the same type cannot be equal so they always return false.

source

',3))]),i("details",Cs,[i("summary",null,[s[189]||(s[189]=i("a",{id:"GeometryOps.equals-Tuple{Any, Any}",href:"#GeometryOps.equals-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[190]||(s[190]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[191]||(s[191]=a(`
julia
equals(geom1, geom2)::Bool

Compare two Geometries return true if they are the same geometry.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+poly1 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
+poly2 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
+
+GO.equals(poly1, poly2)
+# output
+true

source

`,5))]),i("details",bs,[i("summary",null,[s[192]||(s[192]=i("a",{id:"GeometryOps.equals-Tuple{GeoInterface.LinearRingTrait, Any, GeoInterface.LinearRingTrait, Any}",href:"#GeometryOps.equals-Tuple{GeoInterface.LinearRingTrait, Any, GeoInterface.LinearRingTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[193]||(s[193]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[194]||(s[194]=a(`
julia
equals(
+    ::GI.LinearRingTrait, l1,
+    ::GI.LinearRingTrait, l2,
+)::Bool

Two linear rings are equal if they share the same set of points going along the curve. Note that rings are closed by definition, so they can have, but don't need, a repeated last point to be equal.

source

`,3))]),i("details",fs,[i("summary",null,[s[195]||(s[195]=i("a",{id:"GeometryOps.equals-Tuple{GeoInterface.LinearRingTrait, Any, Union{GeoInterface.LineStringTrait, GeoInterface.LineTrait}, Any}",href:"#GeometryOps.equals-Tuple{GeoInterface.LinearRingTrait, Any, Union{GeoInterface.LineStringTrait, GeoInterface.LineTrait}, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[196]||(s[196]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[197]||(s[197]=a(`
julia
equals(
+    ::GI.LinearRingTrait, l1,
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
+)::Bool

A linear ring and a line/linestring are equal if they share the same set of points going along the curve. Note that lines aren't closed by definition, but rings are, so the line must have a repeated last point to be equal

source

`,3))]),i("details",Ts,[i("summary",null,[s[198]||(s[198]=i("a",{id:"GeometryOps.equals-Tuple{GeoInterface.MultiPointTrait, Any, GeoInterface.MultiPointTrait, Any}",href:"#GeometryOps.equals-Tuple{GeoInterface.MultiPointTrait, Any, GeoInterface.MultiPointTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[199]||(s[199]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[200]||(s[200]=a('
julia
equals(::GI.MultiPointTrait, mp1, ::GI.MultiPointTrait, mp2)::Bool

Two multipoints are equal if they share the same set of points.

source

',3))]),i("details",Gs,[i("summary",null,[s[201]||(s[201]=i("a",{id:"GeometryOps.equals-Tuple{GeoInterface.MultiPointTrait, Any, GeoInterface.PointTrait, Any}",href:"#GeometryOps.equals-Tuple{GeoInterface.MultiPointTrait, Any, GeoInterface.PointTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[202]||(s[202]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[203]||(s[203]=a('
julia
equals(::GI.MultiPointTrait, mp1, ::GI.PointTrait, p2)::Bool

A point and a multipoint are equal if the multipoint is composed of a single point that is equivalent to the given point.

source

',3))]),i("details",vs,[i("summary",null,[s[204]||(s[204]=i("a",{id:"GeometryOps.equals-Tuple{GeoInterface.MultiPolygonTrait, Any, GeoInterface.MultiPolygonTrait, Any}",href:"#GeometryOps.equals-Tuple{GeoInterface.MultiPolygonTrait, Any, GeoInterface.MultiPolygonTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[205]||(s[205]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[206]||(s[206]=a('
julia
equals(::GI.PolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool

Two multipolygons are equal if they share the same set of polygons.

source

',3))]),i("details",As,[i("summary",null,[s[207]||(s[207]=i("a",{id:"GeometryOps.equals-Tuple{GeoInterface.MultiPolygonTrait, Any, GeoInterface.PolygonTrait, Any}",href:"#GeometryOps.equals-Tuple{GeoInterface.MultiPolygonTrait, Any, GeoInterface.PolygonTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[208]||(s[208]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[209]||(s[209]=a('
julia
equals(::GI.MultiPolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool

A polygon and a multipolygon are equal if the multipolygon is composed of a single polygon that is equivalent to the given polygon.

source

',3))]),i("details",js,[i("summary",null,[s[210]||(s[210]=i("a",{id:"GeometryOps.equals-Tuple{GeoInterface.PointTrait, Any, GeoInterface.MultiPointTrait, Any}",href:"#GeometryOps.equals-Tuple{GeoInterface.PointTrait, Any, GeoInterface.MultiPointTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[211]||(s[211]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[212]||(s[212]=a('
julia
equals(::GI.PointTrait, p1, ::GI.MultiPointTrait, mp2)::Bool

A point and a multipoint are equal if the multipoint is composed of a single point that is equivalent to the given point.

source

',3))]),i("details",Bs,[i("summary",null,[s[213]||(s[213]=i("a",{id:"GeometryOps.equals-Tuple{GeoInterface.PointTrait, Any, GeoInterface.PointTrait, Any}",href:"#GeometryOps.equals-Tuple{GeoInterface.PointTrait, Any, GeoInterface.PointTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[214]||(s[214]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[215]||(s[215]=a('
julia
equals(::GI.PointTrait, p1, ::GI.PointTrait, p2)::Bool

Two points are the same if they have the same x and y (and z if 3D) coordinates.

source

',3))]),i("details",Os,[i("summary",null,[s[216]||(s[216]=i("a",{id:"GeometryOps.equals-Tuple{GeoInterface.PolygonTrait, Any, GeoInterface.MultiPolygonTrait, Any}",href:"#GeometryOps.equals-Tuple{GeoInterface.PolygonTrait, Any, GeoInterface.MultiPolygonTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[217]||(s[217]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[218]||(s[218]=a('
julia
equals(::GI.PolygonTrait, geom_a, ::GI.MultiPolygonTrait, geom_b)::Bool

A polygon and a multipolygon are equal if the multipolygon is composed of a single polygon that is equivalent to the given polygon.

source

',3))]),i("details",Ds,[i("summary",null,[s[219]||(s[219]=i("a",{id:"GeometryOps.equals-Tuple{GeoInterface.PolygonTrait, Any, GeoInterface.PolygonTrait, Any}",href:"#GeometryOps.equals-Tuple{GeoInterface.PolygonTrait, Any, GeoInterface.PolygonTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[220]||(s[220]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[221]||(s[221]=a('
julia
equals(::GI.PolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool

Two polygons are equal if they share the same exterior edge and holes.

source

',3))]),i("details",Qs,[i("summary",null,[s[222]||(s[222]=i("a",{id:"GeometryOps.equals-Tuple{Union{GeoInterface.LineStringTrait, GeoInterface.LineTrait}, Any, GeoInterface.LinearRingTrait, Any}",href:"#GeometryOps.equals-Tuple{Union{GeoInterface.LineStringTrait, GeoInterface.LineTrait}, Any, GeoInterface.LinearRingTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[223]||(s[223]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[224]||(s[224]=a(`
julia
equals(
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
+    ::GI.LinearRingTrait, l2,
+)::Bool

A line/linestring and a linear ring are equal if they share the same set of points going along the curve. Note that lines aren't closed by definition, but rings are, so the line must have a repeated last point to be equal

source

`,3))]),i("details",xs,[i("summary",null,[s[225]||(s[225]=i("a",{id:"GeometryOps.equals-Tuple{Union{GeoInterface.LineStringTrait, GeoInterface.LineTrait}, Any, Union{GeoInterface.LineStringTrait, GeoInterface.LineTrait}, Any}",href:"#GeometryOps.equals-Tuple{Union{GeoInterface.LineStringTrait, GeoInterface.LineTrait}, Any, Union{GeoInterface.LineStringTrait, GeoInterface.LineTrait}, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[226]||(s[226]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[227]||(s[227]=a(`
julia
equals(
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
+    ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
+)::Bool

Two lines/linestrings are equal if they share the same set of points going along the curve. Note that lines/linestrings aren't closed by definition.

source

`,3))]),i("details",ws,[i("summary",null,[s[228]||(s[228]=i("a",{id:"GeometryOps.equals-Union{Tuple{T}, Tuple{T, Any, T, Any}} where T",href:"#GeometryOps.equals-Union{Tuple{T}, Tuple{T, Any, T, Any}} where T"},[i("span",{class:"jlbinding"},"GeometryOps.equals")],-1)),s[229]||(s[229]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[230]||(s[230]=a('
julia
equals(::T, geom_a, ::T, geom_b)::Bool

Two geometries of the same type, which don't have a equals function to dispatch off of should throw an error.

source

',3))]),i("details",Ls,[i("summary",null,[s[231]||(s[231]=i("a",{id:"GeometryOps.flip-Tuple{Any}",href:"#GeometryOps.flip-Tuple{Any}"},[i("span",{class:"jlbinding"},"GeometryOps.flip")],-1)),s[232]||(s[232]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[233]||(s[233]=a('
julia
flip(obj)

Swap all of the x and y coordinates in obj, otherwise keeping the original structure (but not necessarily the original type).

Keywords

source

',5))]),i("details",Is,[i("summary",null,[s[234]||(s[234]=i("a",{id:"GeometryOps.intersection-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat",href:"#GeometryOps.intersection-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat"},[i("span",{class:"jlbinding"},"GeometryOps.intersection")],-1)),s[235]||(s[235]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[236]||(s[236]=a(`
julia
intersection(geom_a, geom_b, [T::Type]; target::Type, fix_multipoly = UnionIntersectingPolygons())

Return the intersection between two geometries as a list of geometries. Return an empty list if none are found. The type of the list will be constrained as much as possible given the input geometries. Furthermore, the user can provide a target type as a keyword argument and a list of target geometries found in the intersection will be returned. The user can also provide a float type that they would like the points of returned geometries to be. If the user is taking a intersection involving one or more multipolygons, and the multipolygon might be comprised of polygons that intersect, if fix_multipoly is set to an IntersectingPolygons correction (the default is UnionIntersectingPolygons()), then the needed multipolygons will be fixed to be valid before performing the intersection to ensure a correct answer. Only set fix_multipoly to nothing if you know that the multipolygons are valid, as it will avoid unneeded computation.

Example

julia
import GeoInterface as GI, GeometryOps as GO
+
+line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)])
+line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)])
+inter_points = GO.intersection(line1, line2; target = GI.PointTrait())
+GI.coordinates.(inter_points)
+
+# output
+1-element Vector{Vector{Float64}}:
+ [125.58375366067548, -14.83572303404496]

source

`,5))]),i("details",Ms,[i("summary",null,[s[237]||(s[237]=i("a",{id:"GeometryOps.intersection_points-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat",href:"#GeometryOps.intersection_points-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat"},[i("span",{class:"jlbinding"},"GeometryOps.intersection_points")],-1)),s[238]||(s[238]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[239]||(s[239]=a(`
julia
intersection_points(geom_a, geom_b, [T::Type])

Return a list of intersection tuple points between two geometries. If no intersection points exist, returns an empty list.

Example

jldoctest

+line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)]) line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)]) inter_points = GO.intersection_points(line1, line2)
+
+**output**
+
+1-element Vector{Tuple{Float64, Float64}}:  (125.58375366067548, -14.83572303404496)
+
+
+[source](https://github.com/JuliaGeo/GeometryOps.jl/blob/9f0e22db49f7b49d5352750e9f69705f13c06d64/src/methods/clipping/intersection.jl#L177-L195)
+
+</details>
+
+<details class='jldocstring custom-block' open>
+<summary><a id='GeometryOps.intersects-Tuple{Any, Any}' href='#GeometryOps.intersects-Tuple{Any, Any}'><span class="jlbinding">GeometryOps.intersects</span></a> <Badge type="info" class="jlObjectType jlMethod" text="Method" /></summary>
+
+
+
+\`\`\`julia
+intersects(geom1, geom2)::Bool

Return true if the interiors or boundaries of the two geometries interact.

intersects returns the exact opposite result of disjoint.

Example

julia
import GeoInterface as GI, GeometryOps as GO
+
+line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)])
+line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)])
+GO.intersects(line1, line2)
+
+# output
+true

source

`,9))]),i("details",Ps,[i("summary",null,[s[240]||(s[240]=i("a",{id:"GeometryOps.isclockwise-Tuple{Any}",href:"#GeometryOps.isclockwise-Tuple{Any}"},[i("span",{class:"jlbinding"},"GeometryOps.isclockwise")],-1)),s[241]||(s[241]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[244]||(s[244]=a('
julia
isclockwise(line::Union{LineString, Vector{Position}})::Bool

Take a ring and return true if the line goes clockwise, or false if the line goes counter-clockwise. "Going clockwise" means, mathematically,

',2)),i("mjx-container",qs,[(p(),l("svg",Rs,s[242]||(s[242]=[a('',1)]))),s[243]||(s[243]=i("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[i("mrow",{"data-mjx-texclass":"INNER"},[i("mo",{"data-mjx-texclass":"OPEN"},"("),i("munderover",null,[i("mo",{"data-mjx-texclass":"OP"},"∑"),i("mrow",{"data-mjx-texclass":"ORD"},[i("mi",null,"i"),i("mo",null,"="),i("mn",null,"2")]),i("mi",null,"n")]),i("mo",{stretchy:"false"},"("),i("msub",null,[i("mi",null,"x"),i("mi",null,"i")]),i("mo",null,"−"),i("msub",null,[i("mi",null,"x"),i("mrow",{"data-mjx-texclass":"ORD"},[i("mi",null,"i"),i("mo",null,"−"),i("mn",null,"1")])]),i("mo",{stretchy:"false"},")"),i("mo",null,"⋅"),i("mo",{stretchy:"false"},"("),i("msub",null,[i("mi",null,"y"),i("mi",null,"i")]),i("mo",null,"+"),i("msub",null,[i("mi",null,"y"),i("mrow",{"data-mjx-texclass":"ORD"},[i("mi",null,"i"),i("mo",null,"−"),i("mn",null,"1")])]),i("mo",{stretchy:"false"},")"),i("mo",{"data-mjx-texclass":"CLOSE"},")")]),i("mo",null,">"),i("mn",null,"0")])],-1))]),s[245]||(s[245]=a(`

Example

julia
julia> import GeoInterface as GI, GeometryOps as GO
+julia> ring = GI.LinearRing([(0, 0), (1, 1), (1, 0), (0, 0)]);
+julia> GO.isclockwise(ring)
+# output
+true

source

`,3))]),i("details",Ss,[i("summary",null,[s[246]||(s[246]=i("a",{id:"GeometryOps.isconcave-Tuple{Any}",href:"#GeometryOps.isconcave-Tuple{Any}"},[i("span",{class:"jlbinding"},"GeometryOps.isconcave")],-1)),s[247]||(s[247]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[248]||(s[248]=a(`
julia
isconcave(poly::Polygon)::Bool

Take a polygon and return true or false as to whether it is concave or not.

Examples

julia
import GeoInterface as GI, GeometryOps as GO
+
+poly = GI.Polygon([[(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)]])
+GO.isconcave(poly)
+
+# output
+false

source

`,5))]),i("details",Vs,[i("summary",null,[s[249]||(s[249]=i("a",{id:"GeometryOps.overlaps-Tuple{Any, Any}",href:"#GeometryOps.overlaps-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.overlaps")],-1)),s[250]||(s[250]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[251]||(s[251]=a(`
julia
overlaps(geom1, geom2)::Bool

Compare two Geometries of the same dimension and return true if their intersection set results in a geometry different from both but of the same dimension. This means one geometry cannot be within or contain the other and they cannot be equal

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+poly1 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
+poly2 = GI.Polygon([[(1,1), (1,6), (6,6), (6,1), (1,1)]])
+
+GO.overlaps(poly1, poly2)
+# output
+true

source

`,5))]),i("details",Js,[i("summary",null,[s[252]||(s[252]=i("a",{id:"GeometryOps.overlaps-Tuple{GeoInterface.AbstractTrait, Any, GeoInterface.AbstractTrait, Any}",href:"#GeometryOps.overlaps-Tuple{GeoInterface.AbstractTrait, Any, GeoInterface.AbstractTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.overlaps")],-1)),s[253]||(s[253]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[254]||(s[254]=a('
julia
overlaps(::GI.AbstractTrait, geom1, ::GI.AbstractTrait, geom2)::Bool

For any non-specified pair, all have non-matching dimensions, return false.

source

',3))]),i("details",Us,[i("summary",null,[s[255]||(s[255]=i("a",{id:"GeometryOps.overlaps-Tuple{GeoInterface.LineTrait, Any, GeoInterface.LineTrait, Any}",href:"#GeometryOps.overlaps-Tuple{GeoInterface.LineTrait, Any, GeoInterface.LineTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.overlaps")],-1)),s[256]||(s[256]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[257]||(s[257]=a('
julia
overlaps(::GI.LineTrait, line1, ::GI.LineTrait, line)::Bool

If the lines overlap, meaning that they are collinear but each have one endpoint outside of the other line, return true. Else false.

source

',3))]),i("details",Hs,[i("summary",null,[s[258]||(s[258]=i("a",{id:"GeometryOps.overlaps-Tuple{GeoInterface.MultiPointTrait, Any, GeoInterface.MultiPointTrait, Any}",href:"#GeometryOps.overlaps-Tuple{GeoInterface.MultiPointTrait, Any, GeoInterface.MultiPointTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.overlaps")],-1)),s[259]||(s[259]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[260]||(s[260]=a(`
julia
overlaps(
+    ::GI.MultiPointTrait, points1,
+    ::GI.MultiPointTrait, points2,
+)::Bool

If the multipoints overlap, meaning some, but not all, of the points within the multipoints are shared, return true.

source

`,3))]),i("details",Ns,[i("summary",null,[s[261]||(s[261]=i("a",{id:"GeometryOps.overlaps-Tuple{GeoInterface.MultiPolygonTrait, Any, GeoInterface.MultiPolygonTrait, Any}",href:"#GeometryOps.overlaps-Tuple{GeoInterface.MultiPolygonTrait, Any, GeoInterface.MultiPolygonTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.overlaps")],-1)),s[262]||(s[262]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[263]||(s[263]=a(`
julia
overlaps(
+    ::GI.MultiPolygonTrait, polys1,
+    ::GI.MultiPolygonTrait, polys2,
+)::Bool

Return true if at least one pair of polygons from multipolygons overlap. Else false.

source

`,3))]),i("details",Ws,[i("summary",null,[s[264]||(s[264]=i("a",{id:"GeometryOps.overlaps-Tuple{GeoInterface.MultiPolygonTrait, Any, GeoInterface.PolygonTrait, Any}",href:"#GeometryOps.overlaps-Tuple{GeoInterface.MultiPolygonTrait, Any, GeoInterface.PolygonTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.overlaps")],-1)),s[265]||(s[265]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[266]||(s[266]=a(`
julia
overlaps(
+    ::GI.MultiPolygonTrait, polys1,
+    ::GI.PolygonTrait, poly2,
+)::Bool

Return true if polygon overlaps with at least one of the polygons within the multipolygon. Else false.

source

`,3))]),i("details",zs,[i("summary",null,[s[267]||(s[267]=i("a",{id:"GeometryOps.overlaps-Tuple{GeoInterface.PolygonTrait, Any, GeoInterface.MultiPolygonTrait, Any}",href:"#GeometryOps.overlaps-Tuple{GeoInterface.PolygonTrait, Any, GeoInterface.MultiPolygonTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.overlaps")],-1)),s[268]||(s[268]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[269]||(s[269]=a(`
julia
overlaps(
+    ::GI.PolygonTrait, poly1,
+    ::GI.MultiPolygonTrait, polys2,
+)::Bool

Return true if polygon overlaps with at least one of the polygons within the multipolygon. Else false.

source

`,3))]),i("details",Zs,[i("summary",null,[s[270]||(s[270]=i("a",{id:"GeometryOps.overlaps-Tuple{GeoInterface.PolygonTrait, Any, GeoInterface.PolygonTrait, Any}",href:"#GeometryOps.overlaps-Tuple{GeoInterface.PolygonTrait, Any, GeoInterface.PolygonTrait, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.overlaps")],-1)),s[271]||(s[271]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[272]||(s[272]=a(`
julia
overlaps(
+    trait_a::GI.PolygonTrait, poly_a,
+    trait_b::GI.PolygonTrait, poly_b,
+)::Bool

If the two polygons intersect with one another, but are not equal, return true. Else false.

source

`,3))]),i("details",_s,[i("summary",null,[s[273]||(s[273]=i("a",{id:"GeometryOps.overlaps-Tuple{Union{GeoInterface.LineStringTrait, GeoInterface.Wrappers.LinearRing}, Any, Union{GeoInterface.LineStringTrait, GeoInterface.Wrappers.LinearRing}, Any}",href:"#GeometryOps.overlaps-Tuple{Union{GeoInterface.LineStringTrait, GeoInterface.Wrappers.LinearRing}, Any, Union{GeoInterface.LineStringTrait, GeoInterface.Wrappers.LinearRing}, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.overlaps")],-1)),s[274]||(s[274]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[275]||(s[275]=a(`
julia
overlaps(
+    ::Union{GI.LineStringTrait, GI.LinearRing}, line1,
+    ::Union{GI.LineStringTrait, GI.LinearRing}, line2,
+)::Bool

If the curves overlap, meaning that at least one edge of each curve overlaps, return true. Else false.

source

`,3))]),i("details",Ks,[i("summary",null,[s[276]||(s[276]=i("a",{id:"GeometryOps.polygon_to_line-Tuple{Any}",href:"#GeometryOps.polygon_to_line-Tuple{Any}"},[i("span",{class:"jlbinding"},"GeometryOps.polygon_to_line")],-1)),s[277]||(s[277]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[278]||(s[278]=a(`
julia
polygon_to_line(poly::Polygon)

Converts a Polygon to LineString or MultiLineString

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+
+poly = GI.Polygon([[(-2.275543, 53.464547), (-2.275543, 53.489271), (-2.215118, 53.489271), (-2.215118, 53.464547), (-2.275543, 53.464547)]])
+GO.polygon_to_line(poly)
+# output
+GeoInterface.Wrappers.LineString{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(-2.275543, 53.464547), (-2.275543, 53.489271), (-2.215118, 53.489271), (-2.215118, 53.464547), (-2.275543, 53.464547)], nothing, nothing)

source

`,5))]),i("details",Xs,[i("summary",null,[s[279]||(s[279]=i("a",{id:"GeometryOps.polygonize-Tuple{AbstractMatrix{Bool}}",href:"#GeometryOps.polygonize-Tuple{AbstractMatrix{Bool}}"},[i("span",{class:"jlbinding"},"GeometryOps.polygonize")],-1)),s[280]||(s[280]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[281]||(s[281]=a(`
julia
polygonize(A::AbstractMatrix{Bool}; kw...)
+polygonize(f, A::AbstractMatrix; kw...)
+polygonize(xs, ys, A::AbstractMatrix{Bool}; kw...)
+polygonize(f, xs, ys, A::AbstractMatrix; kw...)

Polygonize an AbstractMatrix of values, currently to a single class of polygons.

Returns a MultiPolygon for Bool values and f return values, and a FeatureCollection of Features holding MultiPolygon for all other values.

Function f should return either true or false or a transformation of values into simpler groups, especially useful for floating point arrays.

If xs and ys are ranges, they are used as the pixel/cell center points. If they are Vector of Tuple they are used as the lower and upper bounds of each pixel/cell.

Keywords

Example

julia
using GeometryOps
+A = rand(100, 100)
+multipolygon = polygonize(>(0.5), A);

source

`,10))]),i("details",$s,[i("summary",null,[s[282]||(s[282]=i("a",{id:"GeometryOps.segmentize-Tuple{Any}",href:"#GeometryOps.segmentize-Tuple{Any}"},[i("span",{class:"jlbinding"},"GeometryOps.segmentize")],-1)),s[283]||(s[283]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[284]||(s[284]=a('
julia
segmentize([method = Planar()], geom; max_distance::Real, threaded)

Segmentize a geometry by adding extra vertices to the geometry so that no segment is longer than a given distance. This is useful for plotting geometries with a limited number of vertices, or for ensuring that a geometry is not too "coarse" for a given application.

Arguments

Returns a geometry of similar type to the input geometry, but resampled.

source

',6))]),i("details",Ys,[i("summary",null,[s[285]||(s[285]=i("a",{id:"GeometryOps.signed_area-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T<:AbstractFloat",href:"#GeometryOps.signed_area-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T<:AbstractFloat"},[i("span",{class:"jlbinding"},"GeometryOps.signed_area")],-1)),s[286]||(s[286]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[287]||(s[287]=a(`
julia
signed_area(geom, [T = Float64])::T

Returns the signed area of a single geometry, based on winding order. This is computed slightly differently for different geometries:

- The signed area of a point is always zero.
+- The signed area of a curve is always zero.
+- The signed area of a polygon is computed with the shoelace formula and is
+positive if the polygon coordinates wind clockwise and negative if
+counterclockwise.
+- You cannot compute the signed area of a multipolygon as it doesn't have a
+meaning as each sub-polygon could have a different winding order.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

`,5))]),i("details",si,[i("summary",null,[s[288]||(s[288]=i("a",{id:"GeometryOps.signed_distance-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat",href:"#GeometryOps.signed_distance-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat"},[i("span",{class:"jlbinding"},"GeometryOps.signed_distance")],-1)),s[289]||(s[289]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[290]||(s[290]=a('
julia
signed_distance(point, geom, ::Type{T} = Float64)::T

Calculates the signed distance from the geometry geom to the given point. Points within geom have a negative signed distance, and points outside of geom have a positive signed distance. - The signed distance from a point to a point, line, linestring, or linear ring is equal to the distance between the two. - The signed distance from a point to a polygon is negative if the point is within the polygon and is positive otherwise. The value of the distance is the minimum distance from the point to an edge of the polygon. This includes edges created by holes. - The signed distance from a point to a multigeometry or a geometry collection is the minimum signed distance between the point and any of the sub-geometries.

Result will be of type T, where T is an optional argument with a default value of Float64.

source

',4))]),i("details",ii,[i("summary",null,[s[291]||(s[291]=i("a",{id:"GeometryOps.simplify-Tuple{GeometryOps.SimplifyAlg, Any}",href:"#GeometryOps.simplify-Tuple{GeometryOps.SimplifyAlg, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.simplify")],-1)),s[292]||(s[292]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[293]||(s[293]=a(`
julia
simplify(obj; kw...)
+simplify(::SimplifyAlg, obj; kw...)

Simplify a geometry, feature, feature collection, or nested vectors or a table of these.

RadialDistance, DouglasPeucker, or VisvalingamWhyatt algorithms are available, listed in order of increasing quality but decreasing performance.

PoinTrait and MultiPointTrait are returned unchanged.

The default behaviour is simplify(DouglasPeucker(; kw...), obj). Pass in other SimplifyAlg to use other algorithms.

Keywords

Keywords for DouglasPeucker are allowed when no algorithm is specified:

Keywords

Example

Simplify a polygon to have six points:

julia
import GeoInterface as GI
+import GeometryOps as GO
+
+poly = GI.Polygon([[
+    [-70.603637, -33.399918],
+    [-70.614624, -33.395332],
+    [-70.639343, -33.392466],
+    [-70.659942, -33.394759],
+    [-70.683975, -33.404504],
+    [-70.697021, -33.419406],
+    [-70.701141, -33.434306],
+    [-70.700454, -33.446339],
+    [-70.694274, -33.458369],
+    [-70.682601, -33.465816],
+    [-70.668869, -33.472117],
+    [-70.646209, -33.473835],
+    [-70.624923, -33.472117],
+    [-70.609817, -33.468107],
+    [-70.595397, -33.458369],
+    [-70.587158, -33.442901],
+    [-70.587158, -33.426283],
+    [-70.590591, -33.414248],
+    [-70.594711, -33.406224],
+    [-70.603637, -33.399918]]])
+
+simple = GO.simplify(poly; number=6)
+GI.npoint(simple)
+
+# output
+6

source

`,14))]),i("details",ai,[i("summary",null,[s[294]||(s[294]=i("a",{id:"GeometryOps.t_value-Union{Tuple{T2}, Tuple{T1}, Tuple{N}, Tuple{Union{NTuple{N, T1}, StaticArraysCore.StaticArray{Tuple{N}, T1, 1}}, Union{NTuple{N, T1}, StaticArraysCore.StaticArray{Tuple{N}, T1, 1}}, T2, T2}} where {N, T1<:Real, T2<:Real}",href:"#GeometryOps.t_value-Union{Tuple{T2}, Tuple{T1}, Tuple{N}, Tuple{Union{NTuple{N, T1}, StaticArraysCore.StaticArray{Tuple{N}, T1, 1}}, Union{NTuple{N, T1}, StaticArraysCore.StaticArray{Tuple{N}, T1, 1}}, T2, T2}} where {N, T1<:Real, T2<:Real}"},[i("span",{class:"jlbinding"},"GeometryOps.t_value")],-1)),s[295]||(s[295]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[298]||(s[298]=a('
julia
t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)

Returns the "T-value" as described in Hormann's presentation [1] on how to calculate the mean-value coordinate.

Here, sᵢ is the vector from vertex vᵢ to the point, and rᵢ is the norm (length) of sᵢ. s must be Point and r must be real numbers.

',3)),i("mjx-container",ei,[(p(),l("svg",ti,s[296]||(s[296]=[a('',1)]))),s[297]||(s[297]=i("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[i("mi",null,"t"),i("mi",null,"ᵢ"),i("mo",null,"="),i("mfrac",null,[i("mrow",null,[i("mrow",{"data-mjx-texclass":"ORD"},[i("mi",{"data-mjx-auto-op":"false"},"det")]),i("mrow",{"data-mjx-texclass":"INNER"},[i("mo",{"data-mjx-texclass":"OPEN"},"("),i("mi",null,"s"),i("mi",null,"ᵢ"),i("mo",null,","),i("mi",null,"s"),i("mi",null,"ᵢ"),i("mrow",{"data-mjx-texclass":"ORD"},[i("mo",{"data-mjx-pseudoscript":"true"},"₊")]),i("mrow",{"data-mjx-texclass":"ORD"},[i("mo",{"data-mjx-pseudoscript":"true"},"₁")]),i("mo",{"data-mjx-texclass":"CLOSE"},")")])]),i("mrow",null,[i("mi",null,"r"),i("mi",null,"ᵢ"),i("mo",null,"∗"),i("mi",null,"r"),i("mi",null,"ᵢ"),i("mrow",{"data-mjx-texclass":"ORD"},[i("mo",{"data-mjx-pseudoscript":"true"},"₊")]),i("mrow",{"data-mjx-texclass":"ORD"},[i("mo",{"data-mjx-pseudoscript":"true"},"₁")]),i("mo",null,"+"),i("mi",null,"s"),i("mi",null,"ᵢ"),i("mo",null,"⋅"),i("mi",null,"s"),i("mi",null,"ᵢ"),i("mrow",{"data-mjx-texclass":"ORD"},[i("mo",{"data-mjx-pseudoscript":"true"},"₊")]),i("mrow",{"data-mjx-texclass":"ORD"},[i("mo",{"data-mjx-pseudoscript":"true"},"₁")])])])])],-1))]),s[299]||(s[299]=a(`

+
+[source](https://github.com/JuliaGeo/GeometryOps.jl/blob/9f0e22db49f7b49d5352750e9f69705f13c06d64/src/methods/barycentric.jl#L289-L305)
+
+</details>
+
+<details class='jldocstring custom-block' open>
+<summary><a id='GeometryOps.to_edges-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T' href='#GeometryOps.to_edges-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T'><span class="jlbinding">GeometryOps.to_edges</span></a> <Badge type="info" class="jlObjectType jlMethod" text="Method" /></summary>
+
+
+
+\`\`\`julia
+to_edges()

Convert any geometry or collection of geometries into a flat vector of Tuple{Tuple{Float64,Float64},Tuple{Float64,Float64}} edges.

source

`,3))]),i("details",ni,[i("summary",null,[s[300]||(s[300]=i("a",{id:"GeometryOps.touches-Tuple{Any, Any}",href:"#GeometryOps.touches-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.touches")],-1)),s[301]||(s[301]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[302]||(s[302]=a(`
julia
touches(geom1, geom2)::Bool

Return true if the first geometry touches the second geometry. In other words, the two interiors cannot interact, but one of the geometries must have a boundary point that interacts with either the other geometry's interior or boundary.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+
+l1 = GI.Line([(0.0, 0.0), (1.0, 0.0)])
+l2 = GI.Line([(1.0, 1.0), (1.0, -1.0)])
+
+GO.touches(l1, l2)
+# output
+true

source

`,5))]),i("details",li,[i("summary",null,[s[303]||(s[303]=i("a",{id:"GeometryOps.transform-Tuple{Any, Any}",href:"#GeometryOps.transform-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.transform")],-1)),s[304]||(s[304]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[305]||(s[305]=a(`
julia
transform(f, obj)

Apply a function f to all the points in obj.

Points will be passed to f as an SVector to allow using CoordinateTransformations.jl and Rotations.jl without hassle.

SVector is also a valid GeoInterface.jl point, so will work in all GeoInterface.jl methods.

Example

julia
julia> import GeoInterface as GI
+
+julia> import GeometryOps as GO
+
+julia> geom = GI.Polygon([GI.LinearRing([(1, 2), (3, 4), (5, 6), (1, 2)]), GI.LinearRing([(3, 4), (5, 6), (6, 7), (3, 4)])]);
+
+julia> f = CoordinateTransformations.Translation(3.5, 1.5)
+Translation(3.5, 1.5)
+
+julia> GO.transform(f, geom)
+GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Linea
+rRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticArraysCo
+re.SVector{2, Float64}[[4.5, 3.5], [6.5, 5.5], [8.5, 7.5], [4.5, 3.5]], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticA
+rraysCore.SVector{2, Float64}[[6.5, 5.5], [8.5, 7.5], [9.5, 8.5], [6.5, 5.5]], nothing, nothing)], nothing, nothing)

With Rotations.jl you need to actually multiply the Rotation by the SVector point, which is easy using an anonymous function.

julia
julia> using Rotations
+
+julia> GO.transform(p -> one(RotMatrix{2}) * p, geom)
+GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearR
+ing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}(StaticArraysCore.SVe
+ctor{2, Int64}[[2, 1], [4, 3], [6, 5], [2, 1]], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}(StaticArraysCore.SVector{2, Int64
+}[[4, 3], [6, 5], [7, 6], [4, 3]], nothing, nothing)], nothing, nothing)

source

`,9))]),i("details",pi,[i("summary",null,[s[306]||(s[306]=i("a",{id:"GeometryOps.tuples-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T",href:"#GeometryOps.tuples-Union{Tuple{Any}, Tuple{T}, Tuple{Any, Type{T}}} where T"},[i("span",{class:"jlbinding"},"GeometryOps.tuples")],-1)),s[307]||(s[307]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[308]||(s[308]=a('
julia
tuples(obj)

Convert all points in obj to Tuples, wherever the are nested.

Returns a similar object or collection of objects using GeoInterface.jl geometries wrapping Tuple points.

Keywords

source

',6))]),i("details",hi,[i("summary",null,[s[309]||(s[309]=i("a",{id:"GeometryOps.union-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat",href:"#GeometryOps.union-Union{Tuple{T}, Tuple{Any, Any}, Tuple{Any, Any, Type{T}}} where T<:AbstractFloat"},[i("span",{class:"jlbinding"},"GeometryOps.union")],-1)),s[310]||(s[310]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[311]||(s[311]=a(`
julia
union(geom_a, geom_b, [::Type{T}]; target::Type, fix_multipoly = UnionIntersectingPolygons())

Return the union between two geometries as a list of geometries. Return an empty list if none are found. The type of the list will be constrained as much as possible given the input geometries. Furthermore, the user can provide a taget type as a keyword argument and a list of target geometries found in the difference will be returned. The user can also provide a float type 'T' that they would like the points of returned geometries to be. If the user is taking a intersection involving one or more multipolygons, and the multipolygon might be comprised of polygons that intersect, if fix_multipoly is set to an IntersectingPolygons correction (the default is UnionIntersectingPolygons()), then the needed multipolygons will be fixed to be valid before performing the intersection to ensure a correct answer. Only set fix_multipoly to false if you know that the multipolygons are valid, as it will avoid unneeded computation.

Calculates the union between two polygons.

Example

julia
import GeoInterface as GI, GeometryOps as GO
+
+p1 = GI.Polygon([[(0.0, 0.0), (5.0, 5.0), (10.0, 0.0), (5.0, -5.0), (0.0, 0.0)]])
+p2 = GI.Polygon([[(3.0, 0.0), (8.0, 5.0), (13.0, 0.0), (8.0, -5.0), (3.0, 0.0)]])
+union_poly = GO.union(p1, p2; target = GI.PolygonTrait())
+GI.coordinates.(union_poly)
+
+# output
+1-element Vector{Vector{Vector{Vector{Float64}}}}:
+ [[[6.5, 3.5], [5.0, 5.0], [0.0, 0.0], [5.0, -5.0], [6.5, -3.5], [8.0, -5.0], [13.0, 0.0], [8.0, 5.0], [6.5, 3.5]]]

source

`,6))]),i("details",ki,[i("summary",null,[s[312]||(s[312]=i("a",{id:"GeometryOps.weighted_mean-Union{Tuple{WT}, Tuple{WT, Any, Any}} where WT<:Real",href:"#GeometryOps.weighted_mean-Union{Tuple{WT}, Tuple{WT, Any, Any}} where WT<:Real"},[i("span",{class:"jlbinding"},"GeometryOps.weighted_mean")],-1)),s[313]||(s[313]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[314]||(s[314]=a('
julia
weighted_mean(weight::Real, x1, x2)

Returns the weighted mean of x1 and x2, where weight is the weight of x1.

Specifically, calculates x1 * weight + x2 * (1 - weight).

Note

The idea for this method is that you can override this for custom types, like Color types, in extension modules.

source

',5))]),i("details",ri,[i("summary",null,[s[315]||(s[315]=i("a",{id:"GeometryOps.within-Tuple{Any, Any}",href:"#GeometryOps.within-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"GeometryOps.within")],-1)),s[316]||(s[316]=e()),n(t,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[317]||(s[317]=a(`
julia
within(geom1, geom2)::Bool

Return true if the first geometry is completely within the second geometry. The interiors of both geometries must intersect and the interior and boundary of the primary geometry (geom1) must not intersect the exterior of the secondary geometry (geom2).

Furthermore, within returns the exact opposite result of contains.

Examples

julia
import GeometryOps as GO, GeoInterface as GI
+
+line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
+point = (1, 2)
+GO.within(point, line)
+
+# output
+true

source

`,6))]),s[324]||(s[324]=a('
  1. K. Hormann and N. Sukumar. Generalized Barycentric Coordinates in Computer Graphics and Computational Mechanics. Taylor & Fancis, CRC Press, 2017. ↩︎

',2))])}const Fi=h(r,[["render",oi]]);export{mi as __pageData,Fi as default}; diff --git a/previews/PR239/assets/app.CZ1qv-bZ.js b/previews/PR239/assets/app.CZ1qv-bZ.js new file mode 100644 index 000000000..e1c58d33e --- /dev/null +++ b/previews/PR239/assets/app.CZ1qv-bZ.js @@ -0,0 +1 @@ +import{R as p}from"./chunks/theme.CkNAWswv.js";import{R as o,a6 as u,a7 as c,a8 as l,a9 as f,aa as d,ab as m,ac as h,ad as g,ae as A,af as v,d as P,u as R,v as w,s as y,ag as C,ah as b,ai as E,a4 as S}from"./chunks/framework.onQNwZ2I.js";function i(e){if(e.extends){const a=i(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=i(p),T=P({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=R();return w(()=>{y(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&C(),b(),E(),s.setup&&s.setup(),()=>S(s.Layout)}});async function D(){globalThis.__VITEPRESS__=!0;const e=j(),a=_();a.provide(c,e);const t=l(e.route);return a.provide(f,t),a.component("Content",d),a.component("ClientOnly",m),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:h}),{app:a,router:e,data:t}}function _(){return g(T)}function j(){let e=o,a;return A(t=>{let n=v(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=import(n)),o&&(e=!1),r},s.NotFound)}o&&D().then(({app:e,router:a,data:t})=>{a.go().then(()=>{u(a.route,t.site),e.mount("#app")})});export{D as createApp}; diff --git a/previews/PR239/assets/bnkpkoa.rOsRk89v.png b/previews/PR239/assets/bnkpkoa.rOsRk89v.png new file mode 100644 index 0000000000000000000000000000000000000000..9f49cef5ae7d6c958bf26680870c0b1152b15078 GIT binary patch literal 63969 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 literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/call_notes.md.D1Aj_9mC.js b/previews/PR239/assets/call_notes.md.D1Aj_9mC.js new file mode 100644 index 000000000..23a9a2a60 --- /dev/null +++ b/previews/PR239/assets/call_notes.md.D1Aj_9mC.js @@ -0,0 +1 @@ +import{_ as i,c as l,a5 as t,o}from"./chunks/framework.onQNwZ2I.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"call_notes.md","filePath":"call_notes.md","lastUpdated":null}'),a={name:"call_notes.md"};function r(n,e,s,p,c,d){return o(),l("div",null,e[0]||(e[0]=[t('

20th April, 2024

See GeometryOps#114.

  • [ ] Exact predicates can be defined for lower-level, more atomic predicates within GeometryOps.

  • [ ] Add Shewchuck's adaptive math as a stage for exact predicates.

  • [x] @skygering to write docstrings for the predicates

29th Feb, 2024

To do

  • [ ] Finish clipping degeneracies

  • [ ] Fix cross & overlap functions

  • [x] Benchmarks to show why things you couldn't concieve of in R are doable in Julia

  • [x] profile functions for exponential improvements

  • [ ] A list of projects people can work on...the beauty here is that each function is kind of self-contained so it's an undergrad level project

  • [ ] Doc improvements

    • more

    • benchmarks page

  • Methods to validate and fix geometry

    • [ ] Polygons and LinearRings:

      • [ ] self-intersection

      • [ ] holes are actually within the polygon

      • [ ] Polygon exteriors must be counterclockwise, holes clockwise.

      • [ ] length of all rings > 4

      • [ ] repeated last point

    • [ ] LineStrings: NaN/Inf points

    • [x] Fix linear rings at some point to make sure the ring is closed, i.e., points[end] == points[begin]

  • Tests

    • [x] Simplify functions

    • [x] Polygonize

    • Barycentric tests for n_vertices > 4

Done

  • Rename bools.jl to something more relevant to the actual code -> orientation.jl

  • Doc improvements:

    • organise sections
',8)]))}const f=i(a,[["render",r]]);export{u as __pageData,f as default}; diff --git a/previews/PR239/assets/call_notes.md.D1Aj_9mC.lean.js b/previews/PR239/assets/call_notes.md.D1Aj_9mC.lean.js new file mode 100644 index 000000000..23a9a2a60 --- /dev/null +++ b/previews/PR239/assets/call_notes.md.D1Aj_9mC.lean.js @@ -0,0 +1 @@ +import{_ as i,c as l,a5 as t,o}from"./chunks/framework.onQNwZ2I.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"call_notes.md","filePath":"call_notes.md","lastUpdated":null}'),a={name:"call_notes.md"};function r(n,e,s,p,c,d){return o(),l("div",null,e[0]||(e[0]=[t('

20th April, 2024

See GeometryOps#114.

  • [ ] Exact predicates can be defined for lower-level, more atomic predicates within GeometryOps.

  • [ ] Add Shewchuck's adaptive math as a stage for exact predicates.

  • [x] @skygering to write docstrings for the predicates

29th Feb, 2024

To do

  • [ ] Finish clipping degeneracies

  • [ ] Fix cross & overlap functions

  • [x] Benchmarks to show why things you couldn't concieve of in R are doable in Julia

  • [x] profile functions for exponential improvements

  • [ ] A list of projects people can work on...the beauty here is that each function is kind of self-contained so it's an undergrad level project

  • [ ] Doc improvements

    • more

    • benchmarks page

  • Methods to validate and fix geometry

    • [ ] Polygons and LinearRings:

      • [ ] self-intersection

      • [ ] holes are actually within the polygon

      • [ ] Polygon exteriors must be counterclockwise, holes clockwise.

      • [ ] length of all rings > 4

      • [ ] repeated last point

    • [ ] LineStrings: NaN/Inf points

    • [x] Fix linear rings at some point to make sure the ring is closed, i.e., points[end] == points[begin]

  • Tests

    • [x] Simplify functions

    • [x] Polygonize

    • Barycentric tests for n_vertices > 4

Done

  • Rename bools.jl to something more relevant to the actual code -> orientation.jl

  • Doc improvements:

    • organise sections
',8)]))}const f=i(a,[["render",r]]);export{u as __pageData,f as default}; diff --git a/previews/PR239/assets/cfoowuw.BEoJ_XVP.png b/previews/PR239/assets/cfoowuw.BEoJ_XVP.png new file mode 100644 index 0000000000000000000000000000000000000000..31a71c289394309a32d7bd9f6d646deb31387abe GIT binary patch literal 229594 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 z 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 literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/evhqnlv.Bglvb-jp.png b/previews/PR239/assets/evhqnlv.Bglvb-jp.png new file mode 100644 index 0000000000000000000000000000000000000000..07de5081966cc2531eef8ee125d88c40ce962435 GIT binary patch literal 44112 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 literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/experiments_accurate_accumulators.md.C1U7KOjF.js b/previews/PR239/assets/experiments_accurate_accumulators.md.C1U7KOjF.js new file mode 100644 index 000000000..eb05109cf --- /dev/null +++ b/previews/PR239/assets/experiments_accurate_accumulators.md.C1U7KOjF.js @@ -0,0 +1,6 @@ +import{_ as i,c as a,a5 as t,o as e}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"Accurate accumulation","description":"","frontmatter":{},"headers":[],"relativePath":"experiments/accurate_accumulators.md","filePath":"experiments/accurate_accumulators.md","lastUpdated":null}'),n={name:"experiments/accurate_accumulators.md"};function l(h,s,p,k,d,r){return e(),a("div",null,s[0]||(s[0]=[t(`

Accurate accumulation

Accurate arithmetic is a technique which allows you to calculate using more precision than the provided numeric type.

We will use the accurate sum routines from AccurateArithmetic.jl to show the difference!

julia
import GeometryOps as GO, GeoInterface as GI
+using GeoJSON
+using AccurateArithmetic
+using NaturalEarth
+
+all_adm0 = naturalearth("admin_0_countries", 10)
FeatureCollection with 258 Features
julia
GO.area(all_adm0)
21427.909318372607
julia
AccurateArithmetic.sum_oro(GO.area.(all_adm0.geometry))
21427.909318372607
julia
AccurateArithmetic.sum_kbn(GO.area.(all_adm0.geometry))
21427.909318372607
julia
GI.Polygon.(GO.flatten(Union{GI.LineStringTrait, GI.LinearRingTrait}, all_adm0) |> collect .|> x -> [x]) .|> GO.signed_area |> sum
-21427.90063612163
julia
GI.Polygon.(GO.flatten(Union{GI.LineStringTrait, GI.LinearRingTrait}, all_adm0) |> collect .|> x -> [x]) .|> GO.signed_area |> sum_oro
-21427.90063612163

@example accurate GI.Polygon.(GO.flatten(Union{GI.LineStringTrait, GI.LinearRingTrait}, all_adm0) |> collect .|> x -> [x]) .|> GO.signed_area |> sum_kbn \`\`\`

`,16)]))}const E=i(n,[["render",l]]);export{g as __pageData,E as default}; diff --git a/previews/PR239/assets/experiments_accurate_accumulators.md.C1U7KOjF.lean.js b/previews/PR239/assets/experiments_accurate_accumulators.md.C1U7KOjF.lean.js new file mode 100644 index 000000000..eb05109cf --- /dev/null +++ b/previews/PR239/assets/experiments_accurate_accumulators.md.C1U7KOjF.lean.js @@ -0,0 +1,6 @@ +import{_ as i,c as a,a5 as t,o as e}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"Accurate accumulation","description":"","frontmatter":{},"headers":[],"relativePath":"experiments/accurate_accumulators.md","filePath":"experiments/accurate_accumulators.md","lastUpdated":null}'),n={name:"experiments/accurate_accumulators.md"};function l(h,s,p,k,d,r){return e(),a("div",null,s[0]||(s[0]=[t(`

Accurate accumulation

Accurate arithmetic is a technique which allows you to calculate using more precision than the provided numeric type.

We will use the accurate sum routines from AccurateArithmetic.jl to show the difference!

julia
import GeometryOps as GO, GeoInterface as GI
+using GeoJSON
+using AccurateArithmetic
+using NaturalEarth
+
+all_adm0 = naturalearth("admin_0_countries", 10)
FeatureCollection with 258 Features
julia
GO.area(all_adm0)
21427.909318372607
julia
AccurateArithmetic.sum_oro(GO.area.(all_adm0.geometry))
21427.909318372607
julia
AccurateArithmetic.sum_kbn(GO.area.(all_adm0.geometry))
21427.909318372607
julia
GI.Polygon.(GO.flatten(Union{GI.LineStringTrait, GI.LinearRingTrait}, all_adm0) |> collect .|> x -> [x]) .|> GO.signed_area |> sum
-21427.90063612163
julia
GI.Polygon.(GO.flatten(Union{GI.LineStringTrait, GI.LinearRingTrait}, all_adm0) |> collect .|> x -> [x]) .|> GO.signed_area |> sum_oro
-21427.90063612163

@example accurate GI.Polygon.(GO.flatten(Union{GI.LineStringTrait, GI.LinearRingTrait}, all_adm0) |> collect .|> x -> [x]) .|> GO.signed_area |> sum_kbn \`\`\`

`,16)]))}const E=i(n,[["render",l]]);export{g as __pageData,E as default}; diff --git a/previews/PR239/assets/experiments_predicates.md.C2d7Qctz.js b/previews/PR239/assets/experiments_predicates.md.C2d7Qctz.js new file mode 100644 index 000000000..eec97f2c7 --- /dev/null +++ b/previews/PR239/assets/experiments_predicates.md.C2d7Qctz.js @@ -0,0 +1,98 @@ +import{_ as i,c as a,a5 as h,o as k}from"./chunks/framework.onQNwZ2I.js";const n="/GeometryOps.jl/previews/PR239/assets/ievlkku.5DNJaCuT.png",y=JSON.parse('{"title":"Predicates","description":"","frontmatter":{},"headers":[],"relativePath":"experiments/predicates.md","filePath":"experiments/predicates.md","lastUpdated":null}'),p={name:"experiments/predicates.md"};function l(t,s,E,e,r,d){return k(),a("div",null,s[0]||(s[0]=[h(`

Predicates

Exact vs fast predicates

Orient

julia
using CairoMakie
+import GeometryOps as GO, GeoInterface as GI, LibGEOS as LG
+import ExactPredicates
+using MultiFloats
+using Chairmarks: @be
+using BenchmarkTools: prettytime
+using Statistics
+
+function orient_f64(p, q, r)
+    return sign((GI.x(p) - GI.x(r))*(GI.y(q) - GI.y(r)) - (GI.y(p) - GI.y(r))*(GI.x(q) - GI.x(r)))
+end
+
+function orient_adaptive(p, q, r)
+    px, py = Float64x2(GI.x(p)), Float64x2(GI.y(p))
+    qx, qy = Float64x2(GI.x(q)), Float64x2(GI.y(q))
+    rx, ry = Float64x2(GI.x(r)), Float64x2(GI.y(r))
+    return sign((px - rx)*(qy - ry) - (py - ry)*(qx - rx))
+end
+# Create an interactive Makie dashboard which can show what is done here
+labels = ["Float64", "Adaptive", "Exact"]
+funcs = [orient_f64, orient_adaptive, ExactPredicates.orient]
+fig = Figure()
+axs = [Axis(fig[1, i]; aspect = DataAspect(), xticklabelrotation = pi/4, title) for (i, title) in enumerate(labels)]
+w, r, q, p = 42.0, 0.95, 18.0, 16.8
+function generate_heatmap_args(func, w, r, q, p, heatmap_size = 1000)
+    w_range = LinRange(0, 0+2.0^(-w), heatmap_size)
+    orient_field = [func((p, p), (q, q), (r+x, r+y)) for x in w_range, y in w_range]
+    return (w_range, w_range, orient_field)
+end
+for (i, (ax, func)) in enumerate(zip(axs, funcs))
+    heatmap!(ax, generate_heatmap_args(func, w, r, q, p)...)
+    # now get timing
+    w_range = LinRange(0, 0+2.0^(-w), 5) # for timing - we want to sample stable + unstable points
+    @time timings = [@be $(func)($((p, p)), $((q, q)), $((r+x, r+y))) for x in w_range, y in w_range]
+    median_timings = map.(x -> getproperty(x, :time), getproperty.(timings, :samples)) |> Iterators.flatten |> collect
+    ax.subtitle = prettytime(Statistics.median(median_timings)*10^9)
+    # create time histogram plot
+    # hist(fig[2, i], median_timings; axis = (; xticklabelrotation = pi/4))
+    display(fig)
+end
+resize!(fig, 1000, 450)
+fig

Dashboard

julia
using WGLMakie
+import GeometryOps as GO, GeoInterface as GI, LibGEOS as LG
+import ExactPredicates
+using MultiFloats
+
+function orient_f64(p, q, r)
+    return sign((GI.x(p) - GI.x(r))*(GI.y(q) - GI.y(r)) - (GI.y(p) - GI.y(r))*(GI.x(q) - GI.x(r)))
+end
+
+function orient_adaptive(p, q, r)
+    px, py = Float64x2(GI.x(p)), Float64x2(GI.y(p))
+    qx, qy = Float64x2(GI.x(q)), Float64x2(GI.y(q))
+    rx, ry = Float64x2(GI.x(r)), Float64x2(GI.y(r))
+    return sign((px - rx)*(qy - ry) - (py - ry)*(qx - rx))
+end
+# Create an interactive Makie dashboard which can show what is done here
+fig = Figure()
+ax = Axis(fig[1, 1]; aspect = DataAspect())
+sliders = SliderGrid(fig[2, 1],
+        (label = L"w = 2^{-v} (zoom)", range = LinRange(40, 44, 100), startvalue = 42),
+        (label = L"r = (x, y),~ x, y ∈ v + [0..w)", range = 0:0.01:3, startvalue = 0.95),
+        (label = L"q = (k, k),~ k = v", range = LinRange(0, 30, 100), startvalue = 18),
+        (label = L"p = (k, k),~ k = v", range = LinRange(0, 30, 100), startvalue = 16.8),
+)
+orient_funcs = [orient_f64, orient_adaptive, ExactPredicates.orient]
+menu = Menu(fig[3, 1], options = zip(string.(orient_funcs), orient_funcs))
+w_obs, r_obs, q_obs, p_obs = getproperty.(sliders.sliders, :value)
+orient_obs = menu.selection
+
+heatmap_size = @lift maximum(widths($(ax.scene.viewport)))*4
+
+matrix_observable = lift(orient_obs, w_obs, r_obs, q_obs, p_obs, heatmap_size) do orient, w, r, q, p, heatmap_size
+    return [orient((p, p), (q, q), (r+x, r+y)) for x in LinRange(0, 0+2.0^(-w), heatmap_size), y in LinRange(0, 0+2.0^(-w), heatmap_size)]
+end
+heatmap!(ax, matrix_observable; colormap = [:red, :green, :blue])
+resize!(fig, 500, 700)
+fig

Testing robust vs regular predicates

julia

+import GeoInterface as GI, GeometryOps as GO, LibGEOS as LG
+using MultiFloats
+c1 = [[-28083.868447876892, -58059.13401805979], [-9833.052704767595, -48001.726711609794], [-16111.439295815226, -2.856614689791036e-11], [-76085.95770326033, -2.856614689791036e-11], [-28083.868447876892, -58059.13401805979]]
+c2 = [[-53333.333333333336, 0.0], [0.0, 0.0], [0.0, -80000.0], [-60000.0, -80000.0], [-53333.333333333336, 0.0]]
+
+p1 = GI.Polygon([c1])
+p2 = GI.Polygon([c2])
+GO.intersection(p1, p2; target = GI.PolygonTrait(), fix_multipoly = nothing)
+
+p1_m, p2_m = GO.transform(x -> (Float64x2.(x)), [p1, p2])
+GO.intersection(p1_m, p2_m; target = GI.PolygonTrait(), fix_multipoly = nothing)
+
+p1 = GI.Polygon([[[-57725.80869813739, -52709.704377648755], [-53333.333333333336, 0.0], [-41878.01362848005, 0.0], [-36022.23699059147, -43787.61366192682], [-48268.44121252392, -52521.18593721105], [-57725.80869813739, -52709.704377648755]]])
+p2 = GI.Polygon([[[-60000.0, 80000.0], [0.0, 80000.0], [0.0, 0.0], [-53333.33333333333, 0.0], [-50000.0, 40000.0], [-60000.0, 80000.0]]])
+p1_m, p2_m = GO.transform(x -> (Float64x2.(x)), [p1, p2])
+f, a, p__1 = poly(p1; label = "p1")
+p__2 = poly!(a, p2; label = "p2")
+
+GO.intersection(p1_m, p2_m; target = GI.PolygonTrait(), fix_multipoly = nothing)
+LG.intersection(p1_m, p2_m)

Incircle

`,10)]))}const F=i(p,[["render",l]]);export{y as __pageData,F as default}; diff --git a/previews/PR239/assets/experiments_predicates.md.C2d7Qctz.lean.js b/previews/PR239/assets/experiments_predicates.md.C2d7Qctz.lean.js new file mode 100644 index 000000000..eec97f2c7 --- /dev/null +++ b/previews/PR239/assets/experiments_predicates.md.C2d7Qctz.lean.js @@ -0,0 +1,98 @@ +import{_ as i,c as a,a5 as h,o as k}from"./chunks/framework.onQNwZ2I.js";const n="/GeometryOps.jl/previews/PR239/assets/ievlkku.5DNJaCuT.png",y=JSON.parse('{"title":"Predicates","description":"","frontmatter":{},"headers":[],"relativePath":"experiments/predicates.md","filePath":"experiments/predicates.md","lastUpdated":null}'),p={name:"experiments/predicates.md"};function l(t,s,E,e,r,d){return k(),a("div",null,s[0]||(s[0]=[h(`

Predicates

Exact vs fast predicates

Orient

julia
using CairoMakie
+import GeometryOps as GO, GeoInterface as GI, LibGEOS as LG
+import ExactPredicates
+using MultiFloats
+using Chairmarks: @be
+using BenchmarkTools: prettytime
+using Statistics
+
+function orient_f64(p, q, r)
+    return sign((GI.x(p) - GI.x(r))*(GI.y(q) - GI.y(r)) - (GI.y(p) - GI.y(r))*(GI.x(q) - GI.x(r)))
+end
+
+function orient_adaptive(p, q, r)
+    px, py = Float64x2(GI.x(p)), Float64x2(GI.y(p))
+    qx, qy = Float64x2(GI.x(q)), Float64x2(GI.y(q))
+    rx, ry = Float64x2(GI.x(r)), Float64x2(GI.y(r))
+    return sign((px - rx)*(qy - ry) - (py - ry)*(qx - rx))
+end
+# Create an interactive Makie dashboard which can show what is done here
+labels = ["Float64", "Adaptive", "Exact"]
+funcs = [orient_f64, orient_adaptive, ExactPredicates.orient]
+fig = Figure()
+axs = [Axis(fig[1, i]; aspect = DataAspect(), xticklabelrotation = pi/4, title) for (i, title) in enumerate(labels)]
+w, r, q, p = 42.0, 0.95, 18.0, 16.8
+function generate_heatmap_args(func, w, r, q, p, heatmap_size = 1000)
+    w_range = LinRange(0, 0+2.0^(-w), heatmap_size)
+    orient_field = [func((p, p), (q, q), (r+x, r+y)) for x in w_range, y in w_range]
+    return (w_range, w_range, orient_field)
+end
+for (i, (ax, func)) in enumerate(zip(axs, funcs))
+    heatmap!(ax, generate_heatmap_args(func, w, r, q, p)...)
+    # now get timing
+    w_range = LinRange(0, 0+2.0^(-w), 5) # for timing - we want to sample stable + unstable points
+    @time timings = [@be $(func)($((p, p)), $((q, q)), $((r+x, r+y))) for x in w_range, y in w_range]
+    median_timings = map.(x -> getproperty(x, :time), getproperty.(timings, :samples)) |> Iterators.flatten |> collect
+    ax.subtitle = prettytime(Statistics.median(median_timings)*10^9)
+    # create time histogram plot
+    # hist(fig[2, i], median_timings; axis = (; xticklabelrotation = pi/4))
+    display(fig)
+end
+resize!(fig, 1000, 450)
+fig

Dashboard

julia
using WGLMakie
+import GeometryOps as GO, GeoInterface as GI, LibGEOS as LG
+import ExactPredicates
+using MultiFloats
+
+function orient_f64(p, q, r)
+    return sign((GI.x(p) - GI.x(r))*(GI.y(q) - GI.y(r)) - (GI.y(p) - GI.y(r))*(GI.x(q) - GI.x(r)))
+end
+
+function orient_adaptive(p, q, r)
+    px, py = Float64x2(GI.x(p)), Float64x2(GI.y(p))
+    qx, qy = Float64x2(GI.x(q)), Float64x2(GI.y(q))
+    rx, ry = Float64x2(GI.x(r)), Float64x2(GI.y(r))
+    return sign((px - rx)*(qy - ry) - (py - ry)*(qx - rx))
+end
+# Create an interactive Makie dashboard which can show what is done here
+fig = Figure()
+ax = Axis(fig[1, 1]; aspect = DataAspect())
+sliders = SliderGrid(fig[2, 1],
+        (label = L"w = 2^{-v} (zoom)", range = LinRange(40, 44, 100), startvalue = 42),
+        (label = L"r = (x, y),~ x, y ∈ v + [0..w)", range = 0:0.01:3, startvalue = 0.95),
+        (label = L"q = (k, k),~ k = v", range = LinRange(0, 30, 100), startvalue = 18),
+        (label = L"p = (k, k),~ k = v", range = LinRange(0, 30, 100), startvalue = 16.8),
+)
+orient_funcs = [orient_f64, orient_adaptive, ExactPredicates.orient]
+menu = Menu(fig[3, 1], options = zip(string.(orient_funcs), orient_funcs))
+w_obs, r_obs, q_obs, p_obs = getproperty.(sliders.sliders, :value)
+orient_obs = menu.selection
+
+heatmap_size = @lift maximum(widths($(ax.scene.viewport)))*4
+
+matrix_observable = lift(orient_obs, w_obs, r_obs, q_obs, p_obs, heatmap_size) do orient, w, r, q, p, heatmap_size
+    return [orient((p, p), (q, q), (r+x, r+y)) for x in LinRange(0, 0+2.0^(-w), heatmap_size), y in LinRange(0, 0+2.0^(-w), heatmap_size)]
+end
+heatmap!(ax, matrix_observable; colormap = [:red, :green, :blue])
+resize!(fig, 500, 700)
+fig

Testing robust vs regular predicates

julia

+import GeoInterface as GI, GeometryOps as GO, LibGEOS as LG
+using MultiFloats
+c1 = [[-28083.868447876892, -58059.13401805979], [-9833.052704767595, -48001.726711609794], [-16111.439295815226, -2.856614689791036e-11], [-76085.95770326033, -2.856614689791036e-11], [-28083.868447876892, -58059.13401805979]]
+c2 = [[-53333.333333333336, 0.0], [0.0, 0.0], [0.0, -80000.0], [-60000.0, -80000.0], [-53333.333333333336, 0.0]]
+
+p1 = GI.Polygon([c1])
+p2 = GI.Polygon([c2])
+GO.intersection(p1, p2; target = GI.PolygonTrait(), fix_multipoly = nothing)
+
+p1_m, p2_m = GO.transform(x -> (Float64x2.(x)), [p1, p2])
+GO.intersection(p1_m, p2_m; target = GI.PolygonTrait(), fix_multipoly = nothing)
+
+p1 = GI.Polygon([[[-57725.80869813739, -52709.704377648755], [-53333.333333333336, 0.0], [-41878.01362848005, 0.0], [-36022.23699059147, -43787.61366192682], [-48268.44121252392, -52521.18593721105], [-57725.80869813739, -52709.704377648755]]])
+p2 = GI.Polygon([[[-60000.0, 80000.0], [0.0, 80000.0], [0.0, 0.0], [-53333.33333333333, 0.0], [-50000.0, 40000.0], [-60000.0, 80000.0]]])
+p1_m, p2_m = GO.transform(x -> (Float64x2.(x)), [p1, p2])
+f, a, p__1 = poly(p1; label = "p1")
+p__2 = poly!(a, p2; label = "p2")
+
+GO.intersection(p1_m, p2_m; target = GI.PolygonTrait(), fix_multipoly = nothing)
+LG.intersection(p1_m, p2_m)

Incircle

`,10)]))}const F=i(p,[["render",l]]);export{y as __pageData,F as default}; diff --git a/previews/PR239/assets/explanations_crs.md.BdkIxIey.js b/previews/PR239/assets/explanations_crs.md.BdkIxIey.js new file mode 100644 index 000000000..f01c24a96 --- /dev/null +++ b/previews/PR239/assets/explanations_crs.md.BdkIxIey.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a}from"./chunks/framework.onQNwZ2I.js";const _=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"explanations/crs.md","filePath":"explanations/crs.md","lastUpdated":null}'),s={name:"explanations/crs.md"};function n(r,o,c,p,i,l){return a(),t("div")}const m=e(s,[["render",n]]);export{_ as __pageData,m as default}; diff --git a/previews/PR239/assets/explanations_crs.md.BdkIxIey.lean.js b/previews/PR239/assets/explanations_crs.md.BdkIxIey.lean.js new file mode 100644 index 000000000..f01c24a96 --- /dev/null +++ b/previews/PR239/assets/explanations_crs.md.BdkIxIey.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a}from"./chunks/framework.onQNwZ2I.js";const _=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"explanations/crs.md","filePath":"explanations/crs.md","lastUpdated":null}'),s={name:"explanations/crs.md"};function n(r,o,c,p,i,l){return a(),t("div")}const m=e(s,[["render",n]]);export{_ as __pageData,m as default}; diff --git a/previews/PR239/assets/explanations_paradigms.md.B5COLxNa.js b/previews/PR239/assets/explanations_paradigms.md.B5COLxNa.js new file mode 100644 index 000000000..ebf2c4ccd --- /dev/null +++ b/previews/PR239/assets/explanations_paradigms.md.B5COLxNa.js @@ -0,0 +1 @@ +import{_ as a,c as t,a5 as o,o as i}from"./chunks/framework.onQNwZ2I.js";const u=JSON.parse('{"title":"Paradigms","description":"","frontmatter":{},"headers":[],"relativePath":"explanations/paradigms.md","filePath":"explanations/paradigms.md","lastUpdated":null}'),r={name:"explanations/paradigms.md"};function s(n,e,d,p,c,l){return i(),t("div",null,e[0]||(e[0]=[o('

Paradigms

GeometryOps exposes functions like apply and applyreduce, as well as the fix and prepare APIs, that represent paradigms of programming, by which we mean the ability to program in a certain way, and in so doing, fit neatly into the tools we've built without needing to re-implement the wheel.

Below, we'll describe some of the foundational paradigms of GeometryOps, and why you should care!

apply

The apply function allows you to decompose a given collection of geometries down to a certain level, operate on it, and reconstruct it back to the same nested form as the original. In general, its invocation is:

julia
apply(f, trait::Trait, geom)

Functionally, it's similar to map in the way you apply it to geometries - except that you tell it at which level it should stop, by passing a trait to it.

apply will start by decomposing the geometry, feature, featurecollection, iterable, or table that you pass to it, and stop when it encounters a geometry for which GI.trait(geom) isa Trait. This encompasses unions of traits especially, but beware that any geometry which is not explicitly handled, and hits GI.PointTrait, will cause an error.

apply is unlike map in that it returns reconstructed geometries, instead of the raw output of the function. If you want a purely map-like behaviour, like calculating the length of each linestring in your feature collection, then call GO.flatten(f, trait, geom), which will decompose each geometry to the given trait and apply f to it, returning the decomposition as a flattened vector.

applyreduce

applyreduce is like the previous map-based approach that we mentioned, except that it reduces the result of f by op. Note that applyreduce does not guarantee associativity, so it's best to have typeof(init) == returntype(op).

fix and prepare

The fix and prepare paradigms are different from apply, though they are built on top of it. They involve the use of structs as "actions", where a constructed object indicates an action that should be taken. A trait like interface prescribes the level (polygon, linestring, point, etc) at which each action should be applied.

In general, the idea here is to be able to invoke several actions efficiently and simultaneously, for example when correcting invalid geometries, or instantiating a Prepared geometry with several preparations (sorted edge lists, rtrees, monotone chains, etc.)

',14)]))}const m=a(r,[["render",s]]);export{u as __pageData,m as default}; diff --git a/previews/PR239/assets/explanations_paradigms.md.B5COLxNa.lean.js b/previews/PR239/assets/explanations_paradigms.md.B5COLxNa.lean.js new file mode 100644 index 000000000..ebf2c4ccd --- /dev/null +++ b/previews/PR239/assets/explanations_paradigms.md.B5COLxNa.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,a5 as o,o as i}from"./chunks/framework.onQNwZ2I.js";const u=JSON.parse('{"title":"Paradigms","description":"","frontmatter":{},"headers":[],"relativePath":"explanations/paradigms.md","filePath":"explanations/paradigms.md","lastUpdated":null}'),r={name:"explanations/paradigms.md"};function s(n,e,d,p,c,l){return i(),t("div",null,e[0]||(e[0]=[o('

Paradigms

GeometryOps exposes functions like apply and applyreduce, as well as the fix and prepare APIs, that represent paradigms of programming, by which we mean the ability to program in a certain way, and in so doing, fit neatly into the tools we've built without needing to re-implement the wheel.

Below, we'll describe some of the foundational paradigms of GeometryOps, and why you should care!

apply

The apply function allows you to decompose a given collection of geometries down to a certain level, operate on it, and reconstruct it back to the same nested form as the original. In general, its invocation is:

julia
apply(f, trait::Trait, geom)

Functionally, it's similar to map in the way you apply it to geometries - except that you tell it at which level it should stop, by passing a trait to it.

apply will start by decomposing the geometry, feature, featurecollection, iterable, or table that you pass to it, and stop when it encounters a geometry for which GI.trait(geom) isa Trait. This encompasses unions of traits especially, but beware that any geometry which is not explicitly handled, and hits GI.PointTrait, will cause an error.

apply is unlike map in that it returns reconstructed geometries, instead of the raw output of the function. If you want a purely map-like behaviour, like calculating the length of each linestring in your feature collection, then call GO.flatten(f, trait, geom), which will decompose each geometry to the given trait and apply f to it, returning the decomposition as a flattened vector.

applyreduce

applyreduce is like the previous map-based approach that we mentioned, except that it reduces the result of f by op. Note that applyreduce does not guarantee associativity, so it's best to have typeof(init) == returntype(op).

fix and prepare

The fix and prepare paradigms are different from apply, though they are built on top of it. They involve the use of structs as "actions", where a constructed object indicates an action that should be taken. A trait like interface prescribes the level (polygon, linestring, point, etc) at which each action should be applied.

In general, the idea here is to be able to invoke several actions efficiently and simultaneously, for example when correcting invalid geometries, or instantiating a Prepared geometry with several preparations (sorted edge lists, rtrees, monotone chains, etc.)

',14)]))}const m=a(r,[["render",s]]);export{u as __pageData,m as default}; diff --git a/previews/PR239/assets/explanations_peculiarities.md.Cphx4jNo.js b/previews/PR239/assets/explanations_peculiarities.md.Cphx4jNo.js new file mode 100644 index 000000000..8dd61995b --- /dev/null +++ b/previews/PR239/assets/explanations_peculiarities.md.Cphx4jNo.js @@ -0,0 +1 @@ +import{_ as o,c as t,a5 as a,o as r}from"./chunks/framework.onQNwZ2I.js";const u=JSON.parse('{"title":"Peculiarities","description":"","frontmatter":{},"headers":[],"relativePath":"explanations/peculiarities.md","filePath":"explanations/peculiarities.md","lastUpdated":null}'),n={name:"explanations/peculiarities.md"};function i(s,e,l,d,c,p){return r(),t("div",null,e[0]||(e[0]=[a('

Peculiarities

What does apply return and why?

apply returns the target geometries returned by f, whatever type/package they are from, but geometries, features or feature collections that wrapped the target are replaced with GeoInterace.jl wrappers with matching GeoInterface.trait to the originals. All non-geointerface iterables become Arrays. Tables.jl compatible tables are converted either back to the original type if a Tables.materializer is defined, and if not then returned as generic NamedTuple column tables (i.e., a NamedTuple of vectors).

It is recommended for consistency that f returns GeoInterface geometries unless there is a performance/conversion overhead to doing that.

Why do you want me to provide a target in set operations?

In polygon set operations like intersection, difference, and union, many different geometry types may be obtained - depending on the relationship between the polygons. For example, when performing an union on two nonintersecting polygons, one would technically have two disjoint polygons as an output.

We use the target keyword to allow the user to control which kinds of geometry they want back. For example, setting target to PolygonTrait will cause a vector of polygons to be returned (this is the only currently supported behaviour). In future, we may implement MultiPolygonTrait or GeometryCollectionTrait targets which will return a single geometry, as LibGEOS and ArchGDAL do.

This also allows for a lot more type stability - when you ask for polygons, we won't return a geometrycollection with line segments. Especially in simulation workflows, this is excellent for simplified data processing.

_True and _False (or BoolsAsTypes)

Warning

These are internals and explicitly not public API, meaning they may change at any time!

When dispatch can be controlled by the value of a boolean variable, this introduces type instability. Instead of introducing type instability, we chose to encode our boolean decision variables, like threaded and calc_extent in apply, as types. This allows the compiler to reason about what will happen, and call the correct compiled method, in a stable way without worrying about

',11)]))}const y=o(n,[["render",i]]);export{u as __pageData,y as default}; diff --git a/previews/PR239/assets/explanations_peculiarities.md.Cphx4jNo.lean.js b/previews/PR239/assets/explanations_peculiarities.md.Cphx4jNo.lean.js new file mode 100644 index 000000000..8dd61995b --- /dev/null +++ b/previews/PR239/assets/explanations_peculiarities.md.Cphx4jNo.lean.js @@ -0,0 +1 @@ +import{_ as o,c as t,a5 as a,o as r}from"./chunks/framework.onQNwZ2I.js";const u=JSON.parse('{"title":"Peculiarities","description":"","frontmatter":{},"headers":[],"relativePath":"explanations/peculiarities.md","filePath":"explanations/peculiarities.md","lastUpdated":null}'),n={name:"explanations/peculiarities.md"};function i(s,e,l,d,c,p){return r(),t("div",null,e[0]||(e[0]=[a('

Peculiarities

What does apply return and why?

apply returns the target geometries returned by f, whatever type/package they are from, but geometries, features or feature collections that wrapped the target are replaced with GeoInterace.jl wrappers with matching GeoInterface.trait to the originals. All non-geointerface iterables become Arrays. Tables.jl compatible tables are converted either back to the original type if a Tables.materializer is defined, and if not then returned as generic NamedTuple column tables (i.e., a NamedTuple of vectors).

It is recommended for consistency that f returns GeoInterface geometries unless there is a performance/conversion overhead to doing that.

Why do you want me to provide a target in set operations?

In polygon set operations like intersection, difference, and union, many different geometry types may be obtained - depending on the relationship between the polygons. For example, when performing an union on two nonintersecting polygons, one would technically have two disjoint polygons as an output.

We use the target keyword to allow the user to control which kinds of geometry they want back. For example, setting target to PolygonTrait will cause a vector of polygons to be returned (this is the only currently supported behaviour). In future, we may implement MultiPolygonTrait or GeometryCollectionTrait targets which will return a single geometry, as LibGEOS and ArchGDAL do.

This also allows for a lot more type stability - when you ask for polygons, we won't return a geometrycollection with line segments. Especially in simulation workflows, this is excellent for simplified data processing.

_True and _False (or BoolsAsTypes)

Warning

These are internals and explicitly not public API, meaning they may change at any time!

When dispatch can be controlled by the value of a boolean variable, this introduces type instability. Instead of introducing type instability, we chose to encode our boolean decision variables, like threaded and calc_extent in apply, as types. This allows the compiler to reason about what will happen, and call the correct compiled method, in a stable way without worrying about

',11)]))}const y=o(n,[["render",i]]);export{u as __pageData,y as default}; diff --git a/previews/PR239/assets/explanations_winding_order.md.0V2FnJmC.js b/previews/PR239/assets/explanations_winding_order.md.0V2FnJmC.js new file mode 100644 index 000000000..bbc6c7dd5 --- /dev/null +++ b/previews/PR239/assets/explanations_winding_order.md.0V2FnJmC.js @@ -0,0 +1 @@ +import{_ as e,c as n,o as t}from"./chunks/framework.onQNwZ2I.js";const l=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"explanations/winding_order.md","filePath":"explanations/winding_order.md","lastUpdated":null}'),a={name:"explanations/winding_order.md"};function r(o,i,d,s,c,p){return t(),n("div")}const m=e(a,[["render",r]]);export{l as __pageData,m as default}; diff --git a/previews/PR239/assets/explanations_winding_order.md.0V2FnJmC.lean.js b/previews/PR239/assets/explanations_winding_order.md.0V2FnJmC.lean.js new file mode 100644 index 000000000..bbc6c7dd5 --- /dev/null +++ b/previews/PR239/assets/explanations_winding_order.md.0V2FnJmC.lean.js @@ -0,0 +1 @@ +import{_ as e,c as n,o as t}from"./chunks/framework.onQNwZ2I.js";const l=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"explanations/winding_order.md","filePath":"explanations/winding_order.md","lastUpdated":null}'),a={name:"explanations/winding_order.md"};function r(o,i,d,s,c,p){return t(),n("div")}const m=e(a,[["render",r]]);export{l as __pageData,m as default}; diff --git a/previews/PR239/assets/eytjybr.BEFUMtlf.png b/previews/PR239/assets/eytjybr.BEFUMtlf.png new file mode 100644 index 0000000000000000000000000000000000000000..b400f44a5ed054fcef54600502b6550629540c83 GIT binary patch literal 12299 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 z[m^{F?$N0<>;nCqi8>N=m^t@$7tD2V7#4^aH!K9>vwZo7O6)ZFc@J<7;?a{D?B z{q{Tj05!B1(zmzkzIRf!C z_Iw0#QEZDIo+ih&_^^I-d))@BRml-YYi~F`Jsem`Yl-rb9eGZb&wusiH^Kvo|9ur1 z3cfEe(1iApMSm?YPG!_=4(>M;OVKzvGRz}N7k9udrW&68evhW)AU;ThxOse< z3vb1*&;#>=)Ai!Uy_1f&@jbs;ZqGg?DvTBq)K?9WvoGFU$5Lh?-|{R4=rYjE zrG>|Ceu1K=9d-Bl?~N8K^IO^w-Cztof%A3p)My^L-3&ww;G95=g}6Lz>a}vV6VFoW zUBeQ&PGJRiF3Go;PS%g=C3g77!R#xyg~&pNXWEUwTvV=iAA6koafW5wI zLN%xqPAF~7A3=EI_VF_L!!WE29z(3T1O-KDb%TFoOw1pc6LcPf>YMn%ePnwXM$aeK zboW6x9&wKOTtHZW15_&#vTv!bQ_h3_krseTKMusv+A9&AkA(EdEWS~$8fYs+MLIc=j%7!?^+rgNNBe=y~U#oloipa))*O{h3m5@;z#05I1>(M+l)>!~fepaOjFZ!B4DzoZ78(%$(E zzMW$sCr`Z?YVK36V6ULyy#AR%6q6YUQ&q}hG)?&NG^FDIi(L~3o=0sKbQGOJmR;)) zj1FUQ+lTGUV!a%u+m6JeGsZ2N%*)w46)ibtwU^YcXG^jz@fz4O$La4~6}txsBf@l8 z>@lGcw0pX5e=9z^dZstG*flcir^yMsYEZ%VKlD8MQctIBSWLqY9IvD*Dl6P9UCIc=eo zuQd)5Nzx;}Xhoxbtc+KA&^%4^#Kl9J65?}{8aYwP*5qVVxE!&$HPrnsR~Hw7^yQyy zB;X!SK+DPwia!$EY@bZ%_k)Ti6(=Q77q*%AqjziBg`pp&C4aCuuXUdr*29}hmoc#Q zJ#9acr1<=rOLfe`O?Ri)5vjmGi4$Qp5K)9%;HtioK4(WK0C30dtJ+k0G%}9cO&QVK z&wzpp!h1agHA$;O!BNQfzbK>355cP#?8SXWDCxvP;1=zCp)}vL@`HUS zR78xA)y>Tnrg3(4aej}6{w-KTp@qS=ZZFi>JGkkOPn8oB6w0KODxz@|+rO zqDW?3v;OvMx@HMI`#&E;9-{M6=M|=<;C^bSlXb(w8<2`KCe#@#E8F1kmHS`lsr(|Z zb0h^G;9>cblJm_!ZD1wu6rtZ^y1JX!VsEC7zcbpFiAOC@QVEd&4}(D+5nwb+tt59GAAmb(-D)AI9as~Y4GnXO2W(%W#7K?7VzWN|| zE}J@HvtFK6O3WDu(;AZ4D&@aFUk!dB`(eQ~?KbrFmnp~~09rYXI&*0z*qrDR4vQ{3 z$)0s^p4ff?PWl#JN(d^;N68a>?*b~7`0=6y(~8YXyQ%0$+0J>2m0YTI4e#}3d!!LI zJWB)6wpIS1Z0ddUVU^CidJzD=?u=*dCt`_kG9=fP+CP!gkEy%#ZdXkyn_YwH=ahzQi`15xBG z;Mr9J;6a10@cI5`hLNt|tL!*hI|zj8x2r<`3l<{*s8V&J7B2FIN~Q3fXB$R9*b@)Z zD$V2DMx3~4E?(Z$7WWSM72)8SUg*-oOL@DarcU01MTcW8-NIg%`K}jkbO>U#kWld) zQcLssH{worx)K9|WvGuK6jZbFV-}_Sa9^B)lYLK(7lMXdX_ zB#CIK^zYRdtthC}Ome6;Wbos*QozxD{@LE+h}fQE0pDNDC0vJn{FFE>22gxMjBmJd z)d@7y$g+8bO3&uvHE8tX z;RoHqA(zj{akx-u-G+$lp)0&kgKX>O^AIV(J{1Bri0paYa}fUW@G>!% z!TROqgfphRkEWg47+(n)A_TK*pTpCzAOTLhsZqCUUG_2X4=yPF4mg@~?+1S)GnWj$ zzw?V}zdR%6jK0&bTHggtf$jf9l_jh0M(+Yoj4w{a5fYIPnkEX@2F?JT2N7LbcLsYC zfipQw{u~0C-xyCO(zVg=#?*a19B|LYEl*&eQdM^zBlK;dccE#8ei$3d@-wvA&Ok&1 zmJl+<7ltd|nV<1dx?fW@y{2R7yNxbE@OuGug4wg6uA-+9A6PTnuCOTVE(5Zx2H2Xb z(V@ExRIPfQkL*;Mq=nH?dCwpv)u2;d-~(bcre2E!fN`m0=b$K9(0IU8iNI`(Opj*q zmuwH{Fsz;TfI`0lfH0UX%B|3 zY_HsHbA!517!a}w1oMJ!QV&*=yd^KSeA#nntiM8nT*mzX2 z|C2l4|5MBUDQp--Bh-n^l7ZKMjoEPp;rh#CpP(6=O6BQx3d4kkT$fk zm=8HGeZSyPB?Yt(UiXJ#x!8*f`kbl_N%!&B|A{)R1;Z+ryWXP9c4Obg>j^+1i(snK-n}k2A}ERnR&@u(b*^c7;!MIQT^qL6sz=BdmS>i&;uxLUrqN`vU zXb{nwKIM~lS{fuO+A%~Kk#%c^VLY4LmJ)dd-d@(;+20V=0@VN-9Nc4k@90!6Lu=dH z;6f2p!HM~NjU;Df3$AS>rDT!>Pkk!-Zv`?0_D<%->SO5LO-4vEw< zAhxdr27`@eiEL!ld!Q>LuTU+6uHHk;g(d@@^@%T_s`vQ>{B*Z|6+8pqxORvoG_fBA z#fVYU@eauG_T~KagAhT5d;HZ|?l_1`N?gwBJClE)egSL~CPgTqlP~M6X4w1`{^|yl zrXV$AvqMEiEU`Bq%atpd$|sTmfyp@5Wl0QL(NTuS(^__SUsO2EkC+Ch z-+AQ$-g)sj*88AfT6=z8h%i@4NQBL>cRJp8^F13!t0(|W)ntURy0=5u0UEeTf!W^m ziAKRPu*sI(@jRwZVfQnn^@Ft9MhJ8zjlAeZ#=$W$ygby@_`pL}WJyOACRV?_{R>b( zeiOE(`IgQJUe>PtV8OS3MVrQcG39hd=-$g?x-xl7d%HVUjN>gVnced$E<Xas`)LAy%+fB}{R(=1sU6c4l@+9x^|MUX1f0BFWBJV?Y z?s0|{my(RbuFPEOi$_?2NVCLjbjqwj;KC&C~f0L0qP6K(3Q+So)qAnNits+4IXDUUz$Vl_Q8=mzN3-^Fa z0DT<}8~#p=%MgIqq)QvG;8BO3H`N;$8GEz$b*XUbK+(?S9UUJMqecLR5=SrSvrOWq z@(|NRKIcvDx5U;1ImyT;N0K7ThwNHD7Dk)Pz9Kv@5%XkmrsizFx9L8U6SuibEfFS# z#rq!Dd;Amrp5^Vn4I>&3Q%qnuULeR2;DwyXl;>4vEOrvt&G$NIK*Oanau)QNoEGWgs|#lF%Lx9?|9o)`zeX^yXklQHN_cSg4H_$B5*1J zizoWrfKhvsOBoYd5Tfvcg}76u2^Ta%a=~#-jPz(3|1>NMxs_YMn0_KAC+2uT84Uwn zFr)Rmpfl?tH<_fx4aleBy`VE%$Ikmw&V4JrAF%Ad4w5GC{sAOb2ox&5wtUHFeK1(C zvvsAGuy*Pl`M-kW=D{TjTsA;Q|0P$v!gZxsb%SA>z1xE3Q<#v}@2Z}%n_Yf4jOrXZ z_v>j5eE@}_=H63$DBC$2yoxOjXal_x`}NjlW;A$+Y_p!@{O&b)JOuf(a&uT5JhZi& zLH|eKB&kGcB0B%oF7XD=ijtr(FzvRN^Cx?`m~%p0J_F~&R3hWL5rpkTXI#m5u;8-0 z7}nz^%udO=*0f|07J`OTAZG1+MxSEy&^ePv#CcjNYQo#BPVhtVK!2^xSOmkkV=2Yv zNHyw@`d1D{jE;476A}qp<0V)=E$(8V@jK?E*#{yg1R=vS=w<)X8DC zBw5|=Xo9qQOrg6rgQ223Nmu3Mt%)_i6rhhqQ{2*!1Kj8eF~z(=ayXN8jvdj&paB(< z+y!$Sycs~V24or9-HAYcdva>*&3m+w%CYj%UM6cJbg&zsK%k%~JSz?J*IZiUUMWn2C8<=hCc_5ewF0wEKl zj6r?^G8W7f&30jLr9M#3!n9y29CIm2C&a>hns=67e&Cb%H!GmX?$Xzf4GsR2TK0;x zbi#_7O3!e+GH6~s|LbcC|9j8@0>SWQ$%H_(i)KvblyV-Jb2oP8ub&rW9t2^(d4l&f zSWS?J_O8%TrDGJ|-}m2IEL_18=;dh;Gfh|oy=!ilDg7$5Y$1o{ZU}Jo42D2_$l`13 z^0=D#K8=BOmYk@t?pwDvR-TfcL1(*k6?&ho$Vf>k;wlqBVIrB-MOGNiG7y@IQ)1}W zP}(u7Y?5~y0)r9AUT5y#>0gonq!M45cEV^n={aVEmbWTYNaJrz(G3798FeJ+8KZGA zHrxe> HL;dzn!7-7K+VM+y25085#kd<~ayR3A|BD7nG_HB&zZWjW-FF!06od(G?B!h2s+Vz921xx|BlE100NqnWzCilUrCS;Kxm<(tD zv`w4_b?{^7vfVDw4*z@p36(%_7fo4QhtlaaWZ5}O!w=A<9GQNgAORi_1Obbof&;HlirRPcH5Z`W+a+O57-k?mN2_PH!9W& z+vmSa2sD+T0f-E(np(@Z)Y}tW=4q`0O-mrRsYxIO%tFHGYq95{aBT zfX2MtM>S_$(%kNX7@X^mxTF#a;1LL96va^&AwHtg98!OboTVB{N6TVztLf5_Rbzb^fTVtnE0Vbg|?;ME|h*RRn7^Mn#(;D#i8X`t8+8@K3$6-TAul zBFFXs(1uJH{27)^nw_i!8bcw=k`_ZlNreCx-d-NsH3G%{K3;L`@P{v&@whA=@g(VW z(@E<$ZHo@A$_-&KSWMnHnbXDGm0ugG|3Tx)P#`+71OI~iL6dW_F+V?lenCO7$w2%| zV{fO8frR$&-@muYO0;+Bsn&7Pq`+V<4fmx#Cm=o|S3T%|7!&+q_v1}OWXot@=&bOj1#dU}_`Hl*OKmWR6%xmFl^3>F82;hakKe7Uh>Lfc zjFCG6L4w=1ILxZl@!7O3I1=_-9`0RFHqMR=+}$_9{prgT78;tYs;a85OiT!1n!BL2 zlB{f#PSj)kFN#k0qDDU!ErZ)dl!gtth`>8cyWZ#7nB#%t0pQOLVC;YUujuvV*JCxC99lb4e6 z4Py;Mp~T!Z6ND0%u8X*ct0iUY{c)RXYX$}eh1yN^2XwNuQSARPy0>U5WGg@;Moo5a z94AY3ychH9mrxO5@}W5QoWIrW4?j#qCA_Eo($!vGD3*>1CThmHnof??k*BcFCfA|o z#Cb8?oMioIbJeMs*>&KTr3JK4D@2VM5B%b!@lc=41wS)|X;K3w)yL8CnDFAB-Xt$Z z$r=-M^$WP%PXD2@dNALevu@F9a4J&ByWPtCI)r;7r!;;xl|Mdn^EA$>Aq6&cgPJug zd{g*!7-c7DWo5;)1zD3q*ukua^65b($3{pg#WU(DaL?*gF7IPGbHS)drTVSF<0UAW z+=pR1=7)V6Xp`6Xm7JHh`ud2gcqk1E`!>Ao9UTDMMf_>OgKCN?lH{7%IEEL#8BEWj zz{$0pyxFeV9(j@xQ-d8rqvvKb7Gvef*7AF?rF(mO+w0+G=|u2h>>XQnZf@FzD;Qgg z#*Fu_1OxemXwa2ElufmCx$yuO6VqnVc)1-R{>>PmCtxlKb^nmr)lHv?9`J@&s4_Fg zpgbJ;eRVaM{AvAR%bUT<$>ugi2gg9fAx~lZJS>wjrfvuiE zjfH>&wUS%CNXI>qBz$+OxI%kD$8~O^!JgWX8uLQw!i@hJv$2?{6 z_p9fuu${t$&weQiZC>on)#!F0Qq^y!x{EWS4+ZP4kA35!qWVpGO%hS?2-1QBXpJ(^ z&+%#bJhq0WrPT5&=T<|c_bR>gD0G;tz|vdSJc3=@RY~T84BeR>x9Q-&C8*;P@fFKg zRR6NFvaf>2$k3*%jih&RtP5b|@crG5O0g!N^S);8ctUcr$CBqouom^{W4J%nwAB&` z{|In7NUM*nAlq(hjX+(}l8DRq@~Rs}x$uV$V@V6Sa9GZZz(r2(wlK%TZyrH6i$BwXv61~ge@=DXAfzG^ayy+#GgNb0sCPugV|F=cy0EjiA2hND z`IRF`w=Nc((=HIjFj1A^I2LH;_0iNT=L4iL&le$826ze%VWTxnAe3Iwaps0va!r$6 z(H@k^UOCH!dp~^2X1_X3Uc*Uo_vU>?;w}Ggxw_vp({3G%hpbYlI(or*vN@b4;(h-; z`UxuqI_Y4kU1|m2>=!-_CMFE%-vr;5GXFE;6F{=4f6fG88f2)Xe4=sBK=I=@I~NyG zh4}i-T%#~vT;!)D!=QsNft?IoLf9Huu__u=ujpEI_y!{|^#PYnYntOkPHH**m$T&# znCw;8%pk37Dg19?pmPC&Z?w>s50oU~=6q3NXJ~%SQNpg49r@ck?FQkZ&D<>JlLLta zg~_IiM?~Sp+svOj_X;`Miw@R@L7%^&!HQPH+a!1ws<_Wv_`?d^(MyXv+`4n$N+7;P zVhH|eU@r%oFvH2M#uMhZzl>`KdJ38tJ?`BFtzefK5Wm%J0PvFB%2I3;pj-Q>y}%sEN47|=cje|eGU z;@pxV0xtT+!Bc-*kb$wD*5B~g?0?aB+;k@aA9?ePQduH>OiHq3QkrtqYKi@O4J#Ig zLX37sItefv$Aikw2j)HnnFV4h63eFmu?_x<*ltf=JVp?+AVOorslG zTJm>CXWjn+ZJmogChhOnoY;el9UP(JlmZhfw32@hrl^_LQR-VH%xo6Swq?bH-x?h@ z1Sx!~#V()XoE6_q8Q>-xz4Qawi>-FnAH~@d6)?XbN7Z+{*7rLM_X4*XHJ|;pO-ja@ zSz>Z)zK9ROjU4*<$-e$hfYI2J z2lr0$FKBu(_lOenvw3fO59*V7!AB4(x7D1`PuZdHEeE|!@Fqr|pu|Li*^`d{hpfL0 zt1{}g$KefvfTGeNxd{Q0mTuUjG}0v^(%p@8cc_#C(jn3dCqgr?|R=4 za`|Q7vDS<+$Cz{7c7+(PYcxC2n~NvHT>eXchJ5AT^W-H5YhOs}VJLT0!2$326~raU zylHfy^grw_qMN(S_)stn?wzfED7tvM zPjazhT^?sRoPk)oUYb7z*LTALw|NWby?E%t$db5c!VPU44dyiUbGp>!!dk=kk@?9n zd_v)2E>JS^i91k3m~|WI8pj>CAdovSaN@R_7*iZE&Tx02u)-$zKJBjl&`L1%qN8sp zl}+A5Z9v}vLs9en0vSz5Z85X*;I*6qGG<90Eg0iHug6RVvX!Majx$e-?W9%E}m36Y0SI)1*P%d?S?`*vw+g@-5lt9ya8IZ z(wIfym2;o-4Yhubl-t*6+SyZaYdo+?Eby}#`hUj#v0~`NdERMGXI^(2OZ+?=4dHL& zEGL7_DSNI_+T)vBzX{O$4QoBTDNI`do-PCft$^Dr&J;DTRh(8kQO{Kj>E;)V1%+V+ z+CCq|IGoUuEKnTWEoOd}_zD|^UFRe%+)NPk5U^XFgB@$igh{NhC@XrwsR6~~)6 zZ&}a;p6L3Z&lYDK@(pf1Mw45shF1CN9eR*xt+5HTT8E=~u14#7$?^!pc8~)^CzyvJ62SwmkOSC^rC;Rt4ssK~I3! zOjH9cy(WR+?fuTIle^aFB+9|M?yg~nTRWR>3ARyS6fzYC2f`D-dNnk+iUItoKR*kG zguVpugTW6ZL_c)altnI5!a27W7MpX|cQ%G?-zNSP6@9vINb}r?ev@)cATzLR*LUo$ zci3$;`X}HKgj_J*$K#V?U;FfW`?t4CY>u3X1X(Fj)&q}IVhl;u$qj83DeMkomxR(B zNb=(kKD;Kz#1c6Wr1FDcm;)nUkLk)j(etjpecE400P$9|G_`fMEHFCn-&=vxXNUnw!q*SuMxIb(BbR=-6vY92Z$dH$cjwPB zP0%uJy);y(kPqS=mA=cwY~W-=Pp@gg*mq5h+;ih1oRFEH6iSAVQWN$LM;vWh^Y0)z z6zSdoM^nX_6cZDzs3?V1;t^z^xOXSFC>1BdXAPY3q8Xo!TsPb6Rg&+rka)+;0;N%H zp7z~KwRM|?S9Ju(`_YzAuE$h<b4rVG@)Q!Z2z>W1PVox0&n0={+5keWT)29!Pd$uH@3UXb6Zmj1^O8w?NK2ag#)`QVetBF2ZPhB{tl3iY1EV1wmW zl;8mrNjdm$ssMM|w3(%0f-VX>F_bE;+yiJaXSH6`+0=69f(sjypXzW|*sLwT4oqR- zWXV`;xq!89e2NB@L`H)`kh1HzmeIZq!dBM&$2rHkNkHQGSEnN05iw}l=r%`$kH`2g zBHEgN&XCSSk@zJIpU^+d=LI6&L;WU!cMws90e4Ai~=L8oAO5(Dbykid~b^PWU>QWe8U}f>dMf`T|#F%J^^&xlI5D0Aeig)l`ndpY` zjqnWBhd5W!xk9Bk2m-*|u$07{x4Yl}C_;xIB_&15W20DE=Ej!!AVP#BJ0sZ$N1jmR zZC9|LbKeLwR$oZj{OGTV7?sxO#0fwIyB4Il6~9;w`>69R#WwH}#5yXr)Sz9AC@5!o z?aElfcV-d1yi5~oY)o^Tjg3LE7mZW7l_ST!2@z10I1p1Dk;$m70Cd+8BL8 zF*P?(s`4k#6$1GwV%{YRll7EEo#kIWtAUI0EO;~99pCgX!1k0yVIT@IhYsX2(#qg; zYzQJiFvzknQSRzRjpt6O(D*P-l=~DTy3UvXF}nkM*39daO08k#U-jvEB~1x_vE0vkWbF{|3KhR1l%1J2?W_Iqnfa2QMU& z=6davY1`af`GH5y;C=N4Kzf{B?QI&P@D7T78DQW6!4@qTblBtsGvf!z6*#MZs1X#|%i zI*J6shxgJ4@7B@2l*aMVKMzN4OhpF=29ZOgV8ZXunV;+)JbDyN4)qiI`y2}K3z=Ta z>X(Y7g0JHJp&b762*kg%Yzv(^`@DW<-}`6k-GYKtBsNN|4&*R?=;U zB*(0_AHxOuO1J;Vo7*pFxT4U(8e_mwfCxYV%Od?vgCx)DTn0dI6&fgB5f~c_rSbKgtDb2LbU5@{^jk{h;zLB*W|8roSjl*JT+2 z5;fA`*z?rvb=zU7QTU7D*B(h7+Ba2P1BTk^%vo39=2-BXtE^DT>wMc|g_~5A^?F^H zh6&KNS1$0!-gm(xpr7S^dh6m^u(6}-$}i;@kEGUFWy|90??6^GXsW*p1(C!L1JO^B z@CC@8uM^?&4Vi98TQ_>yfryLummo64usNhYa5Nw2ImZKZT;qYNW%B2I`v-iN&Z0;_IZtI z-?xwX5@L*yz-dui7ucgLr8jtFlIXw!`n>(D^XsC4nvK<>pjswOygUN@f;qhYOhQ$a zufnwW;$S~}Rh(#~LAH&Tr@$>S6rO-@u*s18B3FGO?hCo}l-3`02*pjJctNxFd?L2l z%-nz|4A)|9ax)qpqZd#bcg*xE8m@X~8Ri7?{e$&6dyndAbAFv5mze%|Z5#9I@Y6jE z4dDw|%s@rLc>T$}RMwIr^gb+jMhHHEGl7BgCKZ|K@9RXI*x zV&fDW{ExK6DMCdtK(jV^!m1p@4VJoIg@DvAy(u^sqt!3Bms?ubu z(XWI9po3DIbbVLea8;jvB@j4$4UX0TSimberJ{;lchihR5;k_E<}87NNhkAdYUKC^ zgAoY>*bS}9$ouKLb5yv)*sruYV>K5#%!cYtU!0b+wQsyX3P6G|I}an{(P zK@|KSfN|WDj3N231ktg<`cezCv%h?%yJ=5tC6FKo*QERmob5Rc$33$?LUIvIR_uwD zSeS#VhxfGYIenq*v)qCPHo|pbHi!`7rP@DZ9csJS9Y(7iv;2Z~o}c3c@iDkS5?LBh zw|^W!S zMK44Cz4OgVrggP1viD%$;u;e;9B_DxB0Uau)-6#^pYR_4{_Vc2Ch>+{B5U5Ft^|?> zJQ^#D$(E}$$isc=XIGA*oa}S?4-9)Y`oY1$(!Z22jGf-in-p6V?3bKR&1Tm(nA{eY zvSkdI;zCyJI})k2wrheV3qJ@pe9Y@7S&wWQ{H=7u)j@k2Q1{C-jSLaM2=F>JjYTrN zSRxPtG=hL9OS1Fx)-!cph5KbSnpecg^2KtIL)j8r!<46liUB8*w>STCB>A88LxjBR zwBFxuS+Or&RNEaHWx*s%LR`k-Wt9hiet7gpG*k$%B;&kJI^c|I=io$L1aC}A!MPJ) zm2!9I;`yYJ>@-3ruSc`{{?+cc+OP(oKr$qx?B-?DTwk+mvr=y+OqwVaESb*l znCr^IA=C1H9Jn$%PW%@kgZJWw>Uh!WYM&F~DC?s4&?K5nkA;0pa{Z6zROm-G2>H(| z(reCN43ULXZcWo#@~*3#`CuUX#(CHbA4j?@z52q&=0{J}dwrRBV_a0o4u%iS-ftf4e8P^LSmq&(*=R$My&4OuW^1l;em znBK0Xz=}((_~mB&FuJMKR4W+L+jY>x#>6yuQza2XP5$8koOXvWHT>vrCti_?tn?FJ zCy|?5n(&@rcC6^pE{mMa7+yvQfeDvx)lmycppoxu7M49sErA15+1f8RLAYC=cb|DOmBUj+hyX?!0!7`jR$_qEeT%xn-sJ|JZoKiGP?!IoYe9Gvar&qrE`-tQds@Kom+5CIBTrmFYmH zFS#wcZl7-2U9^ab-!0;(*bgx8AK40yc)mSYP|g|L42?Ou^H4*k9UY`K(KGJ zfKq^zE4$PTDSV;?V)79H50DI5usp}>EBjS$x^+^bFb0o^r}K2SHgz*L2w-gDPOX1# zVbi5#Uynnq=`k${&J3Q}B|V6qhr$%vfuv{vWAg!w{dXe{BkOh_S2_NTC~P~QXaBZF z2H*(t*0{>==T7QDv@-cODJ( z385mh>HFtK7E~1e0#b=CF64=ir2s&lMBfk(0I5U92H z1454Et~pbd^~X1eAV97^^yy49q7j{oIPuG){g3Jn3ki>d;n!FI_&n^hzUHctnjBjW zF6{lBX~S6~?`i}p#AjAnaKCmV1>jAL!Lk*WkN$aoe?NrZcmD~$9)HLDfyto$fkUhe zZO^*R)2C0{4rzFa=y?l{+Cin>)BBXu{m=0is~%@z^7I+?Wr;-jXP+RTLJWQ6u?H%| zCo4nb>|jZVR7TnhO+Gbc4C4Kp4K5PrThnx(beP9gi>J;i{0D*aV-y>oAFxd&#} zS_bs+S8rBVb|4)K|8KZNKiI;6fJ#m-FDJJmFA{Ye72yL;(l@N19|$AxLy}y3pI0i{ zjoiO=n$~95so0V;b4V<&8CIP&!6kE?)PAJr*c*nkneiCX<)Jv_zIi=e02Hpb(vFv6 zv5enha4wktwMB+L(rN$o#K3gn5hNFEGk0!!cJL#36|P7xlm8}&a~GVm;}GjpF$XiJG!&RGqta$W<44)&1jcX=~GN zi1HCxKyCIv-E($KOcua4Ad*3lARqw5W*3G1t*v>7)YnH_2FDWQz5p@v61fE%A0}zJ zJJ+gq1#G`(@OVz~WIV4<#S}u0V^e3neJ`zhS*Yp$71!e8?CP7w;A0IR7JR|~kYDid z`ll75Br1Yx3m`<5+j)qCp>;S0L_B+Wm_qNiaLq|COPOwn^3)`{W+ce>?xoex%)RX7 zaN`bTI%%z0Q$7(X7u|N*jCw${fIZ}(^16}X__MDa8^yiT=n1VapUwjJyOjDZN*nX9 z*2QmFgdl(>`}PxX58jnUVY-EqPlnqAO|V+Z4qsV(ta=5NN%}BE)DhUasFw!ZfWfiT8O1attLXqm2f5spFw&{MtEJ~f5MnZsg7Bcl@+<+n-my`7!6 zFT_;i->3Ir^4EiAuR?|JZTUmsy6-)b-3H5{Zel4dapdvquCJVWRDTu9G5H0uQvBV$Q1aqXI{>oa)z-yQ0D|+QoFU4 zt<0XM9Q0AgK3$SsiUpc%WlqDwx6$?bazh=J>^gAxFeZbR-fer9rp?XFV)_zwQW687A_G7WvYCUkv#J~$y3f6sZ}$1$o|Sp;)8>0e_I?kSTN|dL z>rY0M9T@{Jz4>_F^r5K5g)ZkCh1FYF*3=zhL|fcXCznSD;apMatgV8C69Zi72>gSP zvj_YvJz5@PNU2{-m^6xrJjTnPct7p1$SbBHe{<9Py&L3`F#-hf3<al2L;=Z;PA~ryhDvn;MY_yQ&%$DX`PAma7Kp<{D4k#s2<6yJSZ6gM z8))I~FP^;L8*?qm)K|$q?PGEh{A1hytW?P|DJhz`=$Sg7A;Ve#Y0~*m;llSXinga( zkz%F4%$tcC=kNSx)Y4;!NaLcEZ%^>mt=N)pdp!710o2bd3XubMy##yfPv^Tm&2%8= zN;nv}IRSfr_1+aJ!UIT`NsOS65NwUptfdsD{rf8?o6yp>)oqMPAYH6g{xD~ z)-4GvQ|WhPS~LxOc^?QIJ#dn5y#5WGyZz!znSp_GwcQ<6YnJ$z`=PKqc`bu}eU6Ns zPpWxwKsOof8h`OAY4UQU|C*KbdNbrj#lGd<@v<#YM4HkP-#r;`a1{Q@<>~fr77U5q z5WEnASl1n7?{~Kz%9bjXu2_mPvF^Le5O1(Dst_mxItCGq*AD|n{geO{M-Wuf!&kkO zp|*PhP`k^uDg5#GDh`^#or`Pp40&EwTDP0kHg;@$49^M~`xXVp(Bu`{jcZ56cRZO-E+w;Q1p z6z%HPk^csTK0u*?>^n7p-__mS{NA6`Y=Rmm6lXu?|8Ld`~9w@##Y$^A8_d& zT4P5R8lhg}AB~Nv*>wf1nrrg<^5o2lXFaC2ljf?OkNjh?Zi%qGVXvqDEiH`9Ob{3- zyuD)ke~TBe(g^-wrQf_Cyd6iKwgI`7Jcw3(&8N9Fys}@T(*Dc^8%y0J1p3@zjJfbA z-^_^0-weJCOrBQL@67TuQPKbIpOtB}3d@Bl&Pl?OfAy)JMssncG3M$@`7#$q^ z!e?usm3dzMy4j5ck`F!;>h%;qn!YN=4u+Kg_ZV<7H7 z)aV5oO|RmIJ3?NhU6&t~sJN{@Lt8N3s@+`*-d4|eC6XP(NzgQE#Gv;oA{?766FTPT z6O91K0ZhP$LKcXqd)_qW3}_jj{KQ>lD#(ok9z~gln)TFgEJV%42>(BPlpQGQRsd(_ z1ITJ{wmV@D^S&Yxb3mhuDI2r!W!*uj`OYwQK|lH^bM zAwyk8D`s*^`0D~8srjoo95Fx|hVpUsblD6_a zxPDRizpRp-3wD$do>3t!IJs(tb^4#h<5GhPtCaBDHZ#kO=fLFMyg}8;bo=1-fj75B;h<8l4 z;#tt&b+G}G#EBk+bpo``=i!^sDv(qlkjBnXwp4C`z5Ll;AEA3~wbLUP?3D=AfM2~k z1zTmRj_NO6cjz!{np+S4(boIirf{I)(WuRtGMa7DTd=5=eV6YKt#@r#KjcKV#q4Lp z9xTcdsQzgE)}6_7;3Lqx_84sa5rlzcg@msXr>-V$?S%WZ4x45Q0rJ&%s}_ngSo|1%|YJQ_VB2)2Hh=|9XSaH#pgZH2vms6u*<~sg`E^>c=!1 zLK1jGO2J{MY6IM?O|~8| z_~EkU=gCoYPB3O#ki!AIzI8p{e;-uNQw=mlQHGagg$+h?jbnNWUoTF+xtK&>>HBR` z2K@AK9&Z26Nb%Za@2R`U2E0PLiw6=0Vf#Gh!YCAV5fFPM@F)!Ns`k*W;c|A-!R>h3 z;mOijRNZg0Ow)#)rsLtvVLU|p6uSivzjdCK*FsTFM&zp_Gj<-1xn;rOO)%OE#(%C0 znKrKF*`sryFg;GaS_KZX*1|#hNNCQ?Z!IMfXq9V*52cd#2VW8qR31>3oo&f?*@YkQ zRJR~NyfGZR;#L5|WX8s8R%3ooZ*tetid0SMlQE?}>~Pe`>B{ytL7y=t#=iZc>O|5* zJWgQBdV?XxG1Sh;V85?@ZYgU{N46f&$lyHlaQ3zKmmMA7j+Vk)Y}yNqeWh(a+%G3^ zZ=QQ8UoDpf-aOsf^=yWJ`zc?v_a@G#hg9(Da#;z5=xS=Q9fC;K<4W zCu8zkI=UT#;z*7h{7+&`pxh>_art7nF@bCl(^9^#$78s;bHdy3W>R}v7B;=*MtW0p z^R2XDHpJKhlpnF>Ncf<#I)}Z~V*|>_s zbGo`OuTJ(c_CWD%Q`ditjthhk6}S+Be2!$UgK7)d?v3ByB@bb>f5DkXwQ#}bX8L&W|txo2>2<;)X7816cOYs4CeuN@z$Zm zn-$eXxBGo!fa%>U3+exQ^&%8+^!(rTxNDkM^2adKlGO0FE{i-8O~vHJ-*J2lcX>Lo zzlBKH=s#?WL;>*Kgqkf596hp+E(jk*Z_ko+?frAkc|$w)(*bo} zp;iP(j$oC!^e|=i%{<-YN5hxGKavC(&Z=MaHs8e-bxb6mFwG6>&t7MNMD0w@94aFD z7nr{|-2A`yOUj^@7RAG94^)fLr%PlS8p5#o`0^SqUG|_S6uR|}=LLyl;89bEt!!)q z-5tW@P6t<&@mIsjZv$1!wLzPZgyNtfRg znTiUj(jm#e!q`pcv{^S#I5_~A(HOb`^ff0*8qfpaSP@{hIwmbv?#*9q$SmUQn70m! zeWSx2ea<$8>bV;~adDa6oUOi^>zZT%DVRE4#ci5QBW}5Pe}mvnZ5sXz9)*&a+z=Hb z>faEI*HIWE%p&XHYgPvt&8@%7Bt0Cm%cs{g>l>F>cAzU(K+i5NTg~}JUTaarHaBtd zPh)vMIdL&kalXz$L|NjC9RFv)ECU+QuO zn*NkpU)sW~KHe{}tu(>xg+J$&n1emr`HZPCTx`@IbGB3CaC=$NnNX8V;Q|+PVOd%i zvKl}!K={TJpu#hQV89XM3P0;sE`3WLoIQky%r5yjABx`NQ}_DHqY}C9^cUw6UxaBk zy&QQG9y6McOM<5sIoo#FtfRL#H#%|+s=7z9Es{U`7w@dyT7YAl=kIebJq3mwn1r8y zG;%(%e_3-fsN!ZNAYfr5>@H=uKUS04Tdvb4ixMx%eP76+r^9O?xycDU2|*S$c%zH$ z$a8YMp|oUtYXvSfUjXS$Ww=AY$?*;dJ_3H)Jk*=F=~p1q5d%Hj#%3_ZF0gD@1~&Nk zbS3k5`V}cBQ^DN4r=#c1exngV0dDb8A0vfQz`C(=U%Wj7DmUTAbM3@{1y;TS3aP7X9Z zx!A}W+NJph)mRkKcurln%DY8!l+N}tdD`_jjrS&}5wc%66I=H8efoC<@#6B9kzqkQ$=%K`zb=>-xJ-9v&D{2oh6XsCd#7}&im21Gt z>n4B5{i-s(ns`>(JL%GYgO86t!$t3)D;{@IX$idiuheoLndZe5GIpr}dZ2tKa~!r= z9pJVE`}*X=2QYzXl5&~W`>~Ht^6ZX8gqo--GIx1d=Jej_Xd53-j*J)Z3?|g)sn$E@ zQ9(+S_K~NYMb7r4si2Hhz&{;}zf@eRVXe5evKtepP}+#K|CT6KgXc#9pj;-P@FCu0 zbQ){E@3Q^ORA8SRtNJw>#0s=+(Lwg?K19S!Ng&$Z_4GsykMXeU$^;^9@drYRyxl*& zfFl7#(+x=j)t!~$<@NOQI5|QxBUc+6;pG;Z#_CT)Hn|e@IN6GS#>o;j9q)tFbl5FE zOT%od&SuaKBhyl^m%}?8?rukpuI1hLhv)!Xf3dlyA+@MU!OA<6-PqvrZuUbG{lRU# z4A68GM(6jzkf~{#1Di6(Jj?m&@hgHC@9rXvHiqapdtdn545f}lj!X1fbn(y6cIvK>e8AL|^mHB>tWI8XjtS}D4+mgvxz-Sz2p6FZG8JW4*}qZhR7 zWhix;cWSn<8;*1~+_QeulFSL!U*5Iby4zprFaCa)jjZvs)ZlRgCtLTyuxx2-)^iZh z)4i`*y0dmwQ*I)h6;US57shi zM>*F_u7sjXzrrhJ`1s66_GmyYP-`NKz-u)nl&x<2J)EQ*M9^BG>{(|5p5pT_mx{)O z!s67s=IOl3t-8y^jopNI40`@_0?oTFt~!8tB^ zrDBS7045jni9i^g&u<)cFRRxVbJ-5qDgw~*o#30hK=nM0l(L)Zh+sH8qXCGa*M~ zCQJq2E|;dZ>fg+Y#En&1-HnRXQykn$;44%gRRV5!Z+W@HsKUtG?(D4%2m*q{7dc67 ziJ#H)dhx{vy=MUj0ZahG0NQWP;pFJ}GQ7Q0@?H-IfxzPbNdMr725523@Kxsvw>kQ} z_2-Pt$3xY~m3>lVTjoAO%BlAb5~56)vu+>PhK(Z5wSKfzoE+=iYwF3u&_w~fUtPMh zEB#VZUUUsaARP|1^Dp<+wY!XoNnQ&VRc**NEG(%{fuKHi9{O@mkj^e=cFu6bz=`_q zRHDSpu&bVCr6cL_WqXLK-P~{^Dk7cw=l(}D!N?9b>D$?MI}Uo7(E{6B2a`Rw>n$e#F~X zia6{q!*E9E)D~GgXJmd-GG*)!^=}0omWB^R52c1~^5HOj_HLcq9kPEg?4*^@MZiiv zC6-LkV~2p^4_9@z7g|V?A3gol-j!`7SHlnH!$oBuY9eB(I^H5Ob2EaW?DOe0SB~^~ zK&_iOT~ibMZ;^yQNlr`z0--6;%`29H6bq5G6cL%|P?MQ;zD_=VMRmak&My|FF$!K* z^UMcz%>^9~nTOh#>msjKTSREbFY!9Nu1~L!_E!BnCE)Gg{RcFD(a!+uz^?KZUM&j!=#>d3_}pzjc5#slZwPg; zWlbQm*t3JTCxvlx1YgVLV%9Jfr7|X%BQz@0PaM;@dPW`$p0zhMM(cOFX`O;S3Gm_o zo#SN_EgBD1j#<@klVqSECV9@!0a^&ek0JoNPhG#7WNN|4_!j{cvA&|@)qbvCtCj@} z$Kbt}$8H#xvVyiTaV}%(5;yzRJjt`b5n7%K`fTdZ6zo#_v53Wn!XN ze9XzYAL4-aEDU5?S>h^Qr=Z4dkVR0@06!fb%7LMn*n4^y0o}oWrl%3=0?3DX&?a2j zD+a7zO^!^_pNE%_&);r2t7^Sf;;Sl+5V@N zPcd^TXiTv1(T!dcP=g{u!JvHbNsBrK7FTU;wl=(?g**<`@0?EB8-2$9MPp=fjZ9aA zWs|J2D1Qqltt*71pvGhjkltcMBVU5`-@?DHmrk>7xkEBFI|zC+a6vc1yjt0wN$CZi z_rg|b0uy#edvjorwHA&iP<~Jyx!_;Hea3wG&*AdWG6z`w`4R_mQR;oL2cgC>fO zu0uG94ycaT4d;Hb?PBlh-#S}ZZD68&{59Fs6Eu_-MJNXI5vu*}eq&PdzOI?K7M$9Z znjyh@J*JZ;^D=<4__RtrR@}V=1<8>19 zJz{9zg!1;vKo}3A)z0q@W=B8Wjdty4WZYNQC;Vck{!S04Bf#f6s7cV30O#h1&~IJ^ zW1JKkfMiDij+7;?(;FFBKadZtZt*CqUmPSm50QdZsh02DpqV9->S0*L7;|%d?=7EQ z`rz74;J6WQ+D4fHdz~x!ajDHu^wsz-v!lvZ@4wawq=L-pOi_tV7R{swpx!7m*1NlBM@2*Mrz_EaN<81olw1Iv9Xn*s_FEKxrXR}I`^+C z-iCb!Hi7heO8w#bQFvBEH|xz(9|xo4Lz5D$ib(p*0f|wjl?;m`$hzG)%9X}r7hB~N zWRoVo`BU6dNf`EWHTgu60t@NtXSzkyJ}bW9tLG=*66w(C8W^5s5CV6625J!)K4*kD&1o@VM{LGDmFO=oASBpb4KWY z2s>(^^F(#27=Xi1gGW+5I|<~f)nE!$urdZxYh1kB7#}Eq$^sTI8=o8?bsrhS^cXaq!gQ=kjsXskyQ$zD>cg9@rQVO>kmnPJ$ zi>>Gp0Tn!8O%C0e`BDSE@QzXQipF2i-Zp{j&Y_Vhu~%SbkDJN$aD}STANlS#d5_(~ z@%52v338hP3pztLKXX@!p84D<&LJbk5Y-!nHsbXbTL>U4MUeADl{aDmfF9oNFKPgR z6v5HavyKboN%oQRiti+XyB0LyNZ|x>C^{?PwI^8~Q*8aIu5-CoNcleOWqR^;9M#1w z-(nxk8GSwQwlYJ2_ufJu0w$%XaGg|vfYP)fk-HPZV1r|55`K`el9IY@71M0LFb}#Y zCt2F7i2L$}sY)rl&mFYt0YN~Ha8gf}aQpV_MC?l`X7p>@Kd)@Q{P(gCG6bcsk6{*d zVCb?ed!wEF4#phoTk-OtM#V3B+Uy<$!iD7NfIc9~3#@x20|V^{VQ~QP95(0GOEiSi zR$UdW_OzCi90*gKkRZ&1U=Rg70c<|Y=PdCc-=C>3SCQmbrOHUrBW@ zfF;r(2z^gZiLP4tPYxd?ZO7bn)9!+~B^R)9Qv>yz zUSRm4tKw%5(8Q>#Wx=QAAmn}|i9F)O=DFLBFVbg|6Dv7Mdcbxlf$aeGXfXI{&Hd!g zJEQ1LgN{~$QP{}LI<4gv|4ROUqcuT{!?(m|yt)LtAf(bZ<${lN6A)rGmlhDpsndhk~TRR`sa0dnIJZkpq!%VGg*_+7i`Jjm!(i&mzezQ`q!$UF$_G>D=VFE``w<|_ZLES-jo?op~4TvN#7_U zJhlZDzi#A;PJ3Ffqy3*sbVW)b1f~-)q~T3w5b?0mob2%Gj1`c zLFW}J_d{T!YzMM-TNC)b&RoKA$EP9Zt3l9)tmKdE`NuvY`@VHrYs+<~2wFeBwlxoZ z?;=oC3(69$G5Ek_%LVTZ9(9;22%)WT`O6z~IoanT)0zPj5WS64{5eCEimvi1T@k*; z3BnjWAU^x~F;i^WRn1Ro3TB>9X$S6Md=DkVM!EXegByTz?~j&20v?P7fPBb@R)s(R z%5Q&3=*}|dC}#lGo@=9w0*a2nNwz!4)BgU7OdSIQQ;_OhTrh)$|^XBU@Xe3 z(#zLR5xz)YANh;(I>Cp+AbvI5k;ieQ8s*u$JF7{ct2^TM>Ji#c3u6fkVLZ@D|9m_z zD5q}pW;wND-lIOT-YZby&1(Zj&t#<3pfbAk*BxPr9Jxr2`I1`+S5b3mEFZR!ly-sT2~=C-LfhJdHP zqm@9XtRF`$oS;HSsQf3jz0WkHIch?(QVV7b%ccEY#+6$ET#Kzzz_m+$tKYog4~+K( zXtRakYz5GugD$zMfBE(^ao6$~!(74|OmO+Q|M%ER0kQN-Dh7 zRxC^=)Skz)Ud=lPRDOfqmeX^qOB2kC2xy3Y4^~JDmzJ52WaOUc+4bxc7k!H+&Badx zY~;7=qbqKv;`>iV8I@%Gm^$iTX`j!{DA9=iV77m^o*C>58jUrReR(#f=k&zRxXw`! zjVLKpPV8ly5lz7G3#c{xQXiq|uR9+4u!BR_I;~YbXZEh;oIfc>=dD$?bF2VJg8m&BuPkw6ou$Gr!&ZSB^4l1gH-m?-~A zEJL8tx{@ii?!KP}l-F4kmEJ*`y%B+Gs-VMd%;T2G7tGZXIe*9T8DnQ_2W&gV)Z~QQ zZ3pjcqCAN78St-4s7tb!8*a~=llr$Ur z09%ZCZTg+-U?jc?3d$6M&A2zEpKON!1!jwaD4;|)v5GG%9XtSEco>j@*JI8rZrzUy zTJ);_q@VsfINjV5e;@@5wh>9_!(LqwJcFXa(+-4u1@JdO?E$^vA%$CB`Fmy65d;29 z*GFT5;$Dmq&s-{5UYjHO`hm^K5z!$8zd#im?~~~YWyg$e>9s1@d}0SC{I=%x)g zR2>EF{P6GvA&>jlAB2SxNaI)g&Woq-cTy0SxCw!m#1Bf}K@?!#d5?Jgz)%Hv3~vk; z!Qog8%Yw}<-l}_;+1*Amo z5^;(@wU;GcS`NKlPB(SM9$pq*FM5o6$1JHRQooK6dL{765a13tB8q$k11}kOycD($ zICL#`@V+Pr~S?QDs<1(+r2l-HpR&rzlCZP z5T1h;6p;xqM8=E8$5Ms;6x=grQ75@Pm2KQM;bosToAt2#!j5QiD2T;R4DyGqKW8!mDt>5Tp0R>zgfMhAD%u?{3or>Nbtw2E0q+8)DtGbSlNLmhhzhPW}s4m~A z*F56i1%So|vOqk6g#);B%4Msf-K$6}8N*>JMZ z{RO^^2ER}aZi*m70zK>)Q(%}3bpA+0GcJFGHx7W2eu@LRIVGknm(;j^?Jf->ZoBY> z3Umh!Rg#~~hO{z-k2r6^ytyjBc*p_*B0OPmz{3~#x&am!k(I?!^6}36#_?ftwn)oX zY#fLnxJwOb0>b(-MscpeODIuboEO#N5mvLsgE=!Vx%9a_m$|%pUEOe7SL&9dT(X6# zn)YLWCS;xO#V7Cfx9;iQgJ8VKkHcU84ZNZSBYcSK3x&`28l>mOIyI6WCm$E!&5Zr* zTjO8n23tay(3aDjiAqXd223U@5Dxqy&=4ob!+I4NBkq3o)6ohN<9VZ^S6|46-p~DE zeAMsqT9)vM=#!F*)~D9*FUB8BAAw|=ezx8XS&a#kF4&pkcp(d`@><=) zM5R+9W9)h#1L98A4q96jJFasuLVkF;M2&gTPbA5{uoP1#l0eYkG;O)PF0 z_sZQ{@d>`n`tR?%!|VjVusU7sUOQ-CdMl?iIjlR`v=pw0-$zUH&Rgog4n%LQU!&8ym|S z+LU2oQF5n*zz-qNrvh^zHgDbKVMP)DF%w@Wh3ked>wF%@^Bs8_qDR7XWK-t|NMP`i z87n6}%N1Kh=L+k=B2alGOyJG z?*=v8c)S$4*U!&9vTVY5w1Jff;lUpOjO=9D5k-6F4FenfbJ)i?HwCtj>$oY&v!QH% z`1ci6+5RJf@`HWuFeI=Y`QeMZ7CxmNv$cAJ9CGl{S;);o=kE2@8CqZJPdSH9usMVu zcs!$@Fn|uplDn#`2MHOCl$m zYnz;o7-_JIT-YMo`t(r)A8xE9HJdbII}qk4@CR91@WX&710hXBqxHgYtjhg&262yp z=|AY*m?HWzV(^fAP}|b);!5`1ArEZA3(NUHyHp4{5xAM{16I6P+t|G}MXEH+DRr4X zCn?)B>i#rp0PGs_fh!85x$~i-wKhjIS}v4LwM)e++gIMe2L3JnGnUp9^nd{pgc1l< zz@Iy(8}@(5HvW%$kpSal2`5km+X6vELxYA9!~KvskGS4LkL0lE|Idve32Vf)d!E}Cfh*ZG>diaI~KYY(Cc#{{pFDc^;dVNMf4s-^*U<`N{5G~n=kO` zMtCj~2|Z6<_m0?&|NpA{>ZmBcwQax_1V*}L3E%aK~hS(WattVK`BuIX#{0x zq+x(T=?;mJ96E-Q9GD^A&F`FdedqiC{PRAG<-l@a_OtgL*M05%+}GxG!>a zfh2vgU=Iz{)XLNbd-_`Pf6TvW)M=l?*%@sW7mQur-D&A>dGv<8_E}PPl2_o)u(yl+ zT-l1-7eEvMYpD1L%;d{k9(xBty^2jAa^wjz;LJG~FT_?(zUIdHDtx;K401YHyUWgL zp-5wM`uZg3LE>Q&4iuoV9rRV!zz$i1p=S8oYMTMy6bUIfPlPeGCg`uX;5#i zfNTdtoi;|ZSPNv4G3ekOI<1S-9~y410HC$tf@z;%{AUe^st%9i)qpLTr^8fP=~Xm8=i4ILomZaUaL|t<`~G@b8tp z1&Y#l$RG<`k7?3-(EIdXeF11Q)~o7lZd@mNM)d!CPM(W#OLaYZJ?gjAqx=b$BR5;Y#NKATDNi5z#LO@3m2PW|pwJBtpXsvH zpq5VVsrqLg$Y{pno(nHA*HSAVtAmawU9jdPr^y6Hi!P)+lt3k`)x~iyw2=4F`vFiA zer^u8rVs5)7V(O7dTP}g{oq3)4$6>EoT&vK4YK;veR|GU00@bJsLU^*k>M58kd^f0EH|N z^IDI%4>_*3n7Kdj1!nn_gr&^@wbdB6b-fE$o3Q;Ykd0`DOa7K3jP^ydMR#HCs32RU z>Y`{Yy?Vp3m8;vNv(NMGBm$k6OfbAgF!>?4_9rRJff5?gZpaA2bSzd7G8P3Qk!g+sG`k)rRl>X;xsKQ_2G zMy!yv4RF>4Lfeor5~*E!bpq*{o$#6l^TWN0N8I;Xz2z*V3z0}SAk#VJNpQcy>u&-$sbBxw%;q z$tQ;xBJT`qr$>sV{i1)d+o<-jeH50e&s=E>1Y|VMy14B#{oxa(uVjN0zPhFalF`;F zD5g)P`Jr>oAF{WRuL-?eI<5)CP{i@op#=2u3Y<4Olld@ool;svFO?~;4(_i8HOq6j z@ty81_l=VvioU_o6|V0H`)#byok(`+95OPDUzw`nCNpH;#kIA1nfrlv`)w1{*&%98 z0y+QEo0Gg?=%bIvQ#!Tup%=5^e(83tPciv=t9vpM7=Cc00j=I8KSL$l%ER##L_bGf z$z9dp|3Y}HiLbC}SNvW)t`me5S{(h6M}SX1Pt#=0U`AYS(g^1bbjNkHcwxk7YMV%*_&t|P?_g8V5m}rH>H=L5u zN;1O~X_q5WKf@%FzXD*a$Rh=$$59Qwb9H$MsZ&HRV3k?0G1|G`pgT z2Oq}g;m*jCI1e3`TZ_wUq)6I?gA>y(`9{uUmPJ1EQoX{}in|!|q1UdyMOJ5L5Qxd< z!TXX=uiA>K;x1)ppJA%3p;`B{j(;2~2FDlWwu#KfpR@`epuXnFfG_qOlw}+E-U)ey zY-I@(N=E|M>`mN~y!}4g0HNEBJGsA;L|{;lyXP=pVNiH7= zPrnIKTQa%qSs{M_z!dZxpSiaiKX#WEBK{fXcYmvK%|Oam zp=VsYS>oH7oZW!Uk&Ma+C!(Rg65&`Cm{A+Mg6x<9E$Px2LMfA}_~&9ZyZzLb{2_Ty z&R$Os7X+-o(qgMISHv>+4SlaX6SoK!YQ&0K6Vw9)D?0`E$ab92tQS}w@nCS-9k8^G z9}D97o}c~IocfoNmsbr-8!})&iPE$_a7ch~8Vn_27gD9$+pQ#5OXu-HMCfjNef%{% zBw-!4{lML7F3ib3Nd?5Uq>Ne^RBD%dJ5NN%N8WGaNK+d3%Z}(7S9U1C!2ITuO)j z6PdrEBz)j#(%iav;iR56dUdy_;?d<31MRXXC0n6B;r=12MMALZ%b-d)QQl6Fhr||9Km5#5{?^5DpeSfhTo6UV`b|{% zt)?dLW7g%0c!?q`5@u^L`gY+$<(*x-MOz`~bH8@DhYHgAr1oVbu3 zaD{22Xm_Ay2^=Sgtk_JNHAnSVqDU7Bpuyr*FxS1@_U;`T8J~l_Bj!j&BlA# z9q7?T!tf(mtv%3Q*OX>lm~z~?N)MrFYiEaB8JtgcDt?&6tE0vxDvCSYo~Mnx3tEuN z$e6S6Um8!)!fpSe5>42sHKSHB({Vgn-j#R7*VKl_E!&ZGmXtN%T#6$e5O9Mj)^$e& z-@Gl_J|@UW@rg3sPWDbvf)rx0snst%Q3s{9m5tjP(LX}TNbtS414nn>j&o8jEidz# zA>s3F(VEMx!fSi}CvUD%oq}%fH&`SpJP4_&so%bx_q^^Awh)n!@E^%H@R|0rBf#mC z=g~M9(j$a8IjRkQWY)Km0$IAJx418sBt1m4p(^af*Xt1`j z0)1}5nGM|Ll%!Qlgy^&{*vLMu3?P8%GYdJ{zkByCbZ&7G^tsjs!UG5EV@JEo%ZrQB z_?7I90XzF>hk-17eot~XUqr-Wi<3F=$w~MFr!rfcOw7(3;@B;**>NhXy1Ke|5{yL-8_5V z?OK6C`g2N(lRy&c7p9{$cid64Y;ab$p_mJ1~WV)pmYC;DW|vCPaR&3YgM_r7B|6jE(I6x5aJ z&em+ef3KM<+ht8tlvIZSdc>j+I^t2D7V>trA-`u>l(TVtzb2q2-nIUjHKEk{lt0oAm5X*=ZA zM6PjhaXs%(Z*UmO;a6?8%T{atN}slBbOFI}2YR6RXjSAR~Ua*e=r| zV4u!K+2c=Yf~nT$Ey9*m|4*YdpG-R>SYP)fDb}l6sbcIc6>j*Nx* z`CYxeG;#MPIPToZW#Z6G1^QQ>WI4G5k2~*9v`cO*lB>BobnX3cuviItmEzQRu*Qt` z4y)u{wFt)$L~zmK&6kzGOnj}jmoHx=2z*B7kEW}ejVigl7oz7Q$NyvZa0XV2H#er4 z;E9QexIq=RcO5P7s79m_nrXVCR#sMw)f8l8WaQ+$e86ZfNVRa=*mr2KC2l6?h&k`u zViGr!Xe9i?`(`F==AT(N53Zl}@-l2Eo&^QB2}ic=S>_ISQiqQ?bUI}PTC6SmiSS|& z$}<0eoL8V(<4T!?v$>w7r6qW5z18X=JsG!Qp|(%{cTUASVl}IS^um;e`lePq;TZzK zMn*<|l27FW_7vb~RBm9ks$%K#7WW@%E!pGBd$7|8iaKAm8}In11a2KJ4j)T|msj;| zr^LnvCdHqj9ZtrpF}?YDd7ONF)y75p`$d7A#o3%*i&o;dt4K;|A{L{-cL{>;g)N*f z70Dz{!;bw|)E`oJb!z6<>k$Ro?p8i?4V3$R zDArg&SU53vG5+Jn7oDy~MWcpr#&K$i-T}8H8G;`~XGa8mq$rLTemG}l?z!!=YU8n? zQclp?a0*^1FK>Te2;DiI%~~NUX_bw%?>851cdQ(D7J2<^;Bm-NyhPgmt3TJ_2l9E+ z1qIUF2PA1l+IHf1V@6d3N^Z5%7tv?8a>#FQ@V42X|6tuxkYsD-?6vurvgS@o?~=P1 zkcSARtdYmgKR$H54F7Nt9JK*tNLGJ;&&$h$-n@Bpr;EF!Cq;CtvEgX86zeXQe7ucB zN*r14kI?3F4+*KT$VNr1P-6xM$CRXOAL>sCSkOU&`npfQo*d87*0RaMT+M26xkzbi zcVBh=*f00T*w6&g3}%8I{u1PAxopUea6{XH!vRf;x1O2V#^R!_NQ#2Iyu=Tt_t}Pd zy*~OG-lM7BhTvaw?LusOd6rPnyr_!Z-w}oY?1}$M)HyJ0s4bapESdhJu!T`sw%yS_ zBaUyL%`GX3jfeok1F+nxDnrB&Lv)+#6w(WBLB!+O*lzUrac6d{4E|uk4a7f0ilon` z#pzCBM~5m-ko1lg00PY%NI@hgQ3vM)!3s; zxb4XFMG5@mGDmmOKJ+)o@E*?Z_Q`R*Qj3<&Nqt;x{FQ?=E)T9Qy?`s)>w|?4-@otlVd=OTX2oc44=wL; zeS>@AGwIBSH>OqrP(uOn?NBia0twd}^Io6Z!XhQ-reKNNA}g45QK;((YhClvQQpUf zr>)m6AZNB*J}nZM6QoqUVstTBzjUmB`sXch%)nlB19CN%SzN#iJG`^A^Y`!HM00ftM3oB<;*kLe zr^d$Pn^SclQZzL+O;Q8_Z2{;_78VvZwynHPl3u}!dlU_RPMt9qzoXi8;?0nR^J?!o z`Rew@(RIk!3!z4jTT$LjcLE(@&pEEWaWO(^?M?e*T5Nou`U-Px9}YhJZJ9AxAGAn(A2wqU{>f51vxCpKx<={aidu5WA7El|%@ z=6ui;X!2Ec%~85`$&az;#B{CB_tKu=m-9Lk_#GISgGB5oQBhu=4(y_ElDgxyU-!JW zrcYJ|vx{Rv%s(HW(n4|FCVr$On1+=#{o}{7=e^0mj)30A-X8qZ>U-MHumVHvW9r1- zkK4+vr(xJC&dsx^Nm0?d7ARDbt$sEkbhh~UnMB|$nk^9KQUD4Z&FM7JxniA$@p{4c zLz@+}1#w$*Ptq&>G`qv_U7wzqd4USdc(nCdRQ(sC5f9mnm_mJGxV)dAAMiuzfCHO& zotf(+qocGmGz`(o=($%!rl894J$Sfe%+zL8TJye7bnqRUEa-!V>IDJDF!Y`}4!H z8Hfy-5&(j1beX8)R)767Ua(bqCATk6rv8cI0|vKK_BLGlM-#;bqetYX&x7`(BhK=9rd1s?oDsC^LlJ3G!!a2q|GxlJS&%&H4M;X7=t* z<3~-vM9pC5#^me;lF|crI@Ls+v|-vM=tjb3o##@|)5hSF!E6ni_;5kzmcLuXiyh7mKGN*Qjb@d{Bn!r11pyy`4N0rKRCI!do8Nm~8~aOke1^@1 zzu;`c`fserm#q63KoY*}ZpNw3?EDMfv7J1#sX+~VtL`f_*B!CW*F=!*@iEaD&Uzh~ zT6$|Z_2=Ot581a`>5r|+mgt2qVoxNLI>Bx?5&Z5&`I-0h>N>$xJ`0;^5ZjKC$QN3F z4kEAQn><+0#EE?IXXqI`iw=~1BbWAdY~S~MSFlRy*2Q9d(?&=uyF<8)W_{a->6s6G zl0U&9udW1m9lEfv`M0Ft=7ktv0bC#lK>V4KynllsZc<@gE zB$5y$VIL5wZwOrOF$u^i6cKtOo&m;IBf;-*!(Q#-w@2UyQ|YVc8=6F!IzY@3Tm$z> z*w0_>se#47&3hubE6@Htxc|~pERGDa0Cmvz7#7LE z!@r+7^?(l9_}_}!+S>M5wrZmXgM))0J4&P#-_Rn58w0T$>|k~~ASz5;4WB+uii`7@ zZ3-j4aJi+e&EKzb??X{ZiI$dDe|I-285y$#+}_vMH^rNw#&KbBkwqrZs02+x&!1`0 z7|bJDTv#XtU(p5%I-uB#fZUE!wkE)Du5?ionGJ$rDBj`WDeBB755FxSAW-Pn+1Ys` zcwujKNH0g-L+d3N)!Ff~taJ#c+!X>Sx0UWZd{`PLa)pAm{uIA9#a1FCBLjrwLO_E5 zv|-`D`aL4zD$JUXuSDE)iJF$yf9d+mzK&Hm>R{Yys?Nu!(PM6Y9=AR=WJ5?!PHv5) ztK;|yF3i~}&bzK5Er1;U5R|W^V72wb?^IV z1G1BM?Y+$ANuVajbEU~^ZFF^?&f*t;O795)CrVF-Z66pI*g_GC9}zHsYAKe?1qDEH z#>NnWB8igGveMWMb@Ut^O-V&%Es`?glBS71EQvNO7&&p{-MozzeBR?O#?119Mh^WG zFsd-mg?707|(7x+u=!K~XjNft^U`YHMPWRCke4Lz|yu6wk z8qv|wG;u(NEd;0rrPncMUKn$(TFwYLP4k&{_^R>f(XTSw?o>^?t?34zjd268#PRV! zyK8^av;XMmC_W*fFGCjNScx3x;NWOHoQs4CJn#9^98N(8R2QkKkGEq(sN(>06h=zt zkI#D9H=`AT9|FimX(99q>wR9{zRu3P++5Yik5`8fv03*41`!K5C=4I~xh|-%uz@0w z2Lm5qVPy0rDM{RE^Z{fHFf84Cjg#y!VmO2)O_jJJdSPMVu3ADAlW1R%p`GXLHzg>1 zegquA21KeK;a~$hmL9MvjyqvsV0iTC5mW$d3y9PZWe(lv<_^HGB9?nomSqacYavaT z<0VnY*TciZm&45iHiY*FQru9h<9RVJ6jfBfQkeoZ$A}d;^0rD$#Ssm0+7m;=1c~Uy z>3}U4_m#<7PptNAmQtjtWMpI{kg*{<~6ERe|IzKlT+?6EiI(Z)ofk1$Ql^2GMiAgfxz!@_357Du)2xnaR zytBItG_8(K30riuwB}{oz)8W0|8I{0i{t8kA1tYmkiO#Y-@k{YK_=Hx5l`ST8GS~R zggM#t0W5kKP-YyTgTCxri{wLTBTA)!I@b+yPy(z0{VLixP|yGu$d{~knRs4mq-X;O zzGBW%sFe_7;)AD9C;&Vb!AG_PIO~f4)i-i=lN-*jaeIpY1RDuH&54 z$+RsoZ+J_=#tQ{E0}H$)hwxq*V24~IC0zr4IiHQa?{8^2`;LlZSQ;BWROhn=fRwPk zR1hA%A8+Q$JX5CQO|k;Lr~ZZCvgx8%00tEla=M#gVqX|TNzN#gTUh7}0voUdsnEP1BWSmGoAZ4*BG?1_+oy;7P@NzvN&B#>QMw;ENip1{TVc zaa0_dxgokbZmIX!6uy4_3J{>0mez6`F)vdn|6hNp(A=- z90GyZr6=KK(o-hx6$d^z0SZ4kK6VzF0QCVvBL!@1oD;KC z_M2;Y$i}R!EHga0sW1u%uw5dhjZjrr?~%q$W^d}d!$ z_#J3N0Pb|*lNPu!MVrO0c&sLRQfL3yq>-6fT0{*RNhGAE^Eu>rp3TF<1H`lppu%_= zWSaoo=Ha0)?85$A$0OI9uJ_?UD)pQ>`1R|TNQw&(=_4j42H`O_DvDXe`46CnU27L< zE1$~Az5Gj0A{Fa%HB=LUMEZl@NOTslYY~n02?-O2cs#Fh#me=wuUn00!Ly?-@9^M> zGyJ(mKvNhfJm?^wIxC#V%4oO^g^WZL8onB%z_Ix2u#|3J=NrsofB%$PN7C|)m)S

6f(YRMb*ZxRMgb)uuymK z9~9DiA9|k)(vyK~aM;XtI#6!c-_|?Kl;2tRSP?`(B}K$gSXh|ZW4o8$-hQz~9UUE7 zGDl!471&DQCWDy!Gq8%EV%d*o+h!kLG!;3Y#xK1~Dr`Z+p34?h&QCQo zdcQsX1i1I9LwjZAx5%%W+`|9KPfUt|G&w~t{^DCZp42qX#I?3{|H(&=z>|G6z&nju z_d$s__QUeE)5({6dHZV{-U0spc;LxQ%m!}vH}9Ex8592GgAA;tMHd%$TSbIdveaW< z8Bz;4e*pZ3r2#uM4(9*Y>nlLy)%fl7_nI1`8y_ace%e~=Fvxj=(tEVntS<2A1-i*~ zv&wl4dd^4}cV>a6=Fl?W3?PADj+QJ{Vf(B05M@0uj5v};MuRmBx!G&XTJzJfPT*M^Q)5}IsjNw8&PxCsT)KFLbeMA z)$oV_v_$im01*27EH;!EEUtYY(0)|BBPmJnX(X7vRsiCN>3He=cO2>N8>T;=g-SRL zSMKF<2@CH72JdDZz;*%kLvjePWmD(1W(Yaja0^*8CM~_BoV|@AY*NLcEkdS(PE)e( zgY6KyIKWo{#ORw}C$~(=$SC2xZUkt^=h1|eP+MEu>M3vVKCspR!xo>+gPResiHMLo zJ)9Rw>8)(6uRk8M%bdA;X@rZ1zp<$o|{WC1$L3vV2yYKfUKW9 z=}H!M>gw(WaN_sSkl*4pvp;~Pmpwb)ZE0x%M1!!{9!M`>yP^nslbU*1{#HHMqr&*k z-|&*;<8wRwJFBFm1md1K67C=`-_-eu;~Xw9S3cIWQh*7o)-Oye2Y zD3S5s%N?|r0>Y$#3z5JYzbr^6$?P7h^C|Ivjrjgucr3H5>;?D`jZ@j#&AKgK9v+v0 z=~?$l;C<0dxGjwA?c2?}bQj^@u2J2KPz8+Hyg~?J0u$Vo?G4DpP1*esm_==lO&tJi zKq0#dElkYfwlQ9L16vjmQBtzCR?;|aLx7q4ec#qq2T`>Wvy?su%O~OhKMd53TUuMEz%O^#Ga% zphF61a04rH>6f`+M)AMJxzhQG`2VX__wV;!1>efK(_lgCP$ipBEJUi}Yg C<~w%) literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/fyfzmss.Dab1-ETk.png b/previews/PR239/assets/fyfzmss.Dab1-ETk.png new file mode 100644 index 0000000000000000000000000000000000000000..7c32623e0e0fff839fabf61e59a4a1ccaecb2950 GIT binary patch literal 76849 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 literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/hvyhqaw.CgiryX2p.png b/previews/PR239/assets/hvyhqaw.CgiryX2p.png new file mode 100644 index 0000000000000000000000000000000000000000..dcf01fb215f2661df913f4ee9a962e601431555d GIT binary patch literal 13822 zcmeHuc|4SD`}Zi~CQFMH*-|vOP|9xXONJ1#BqmArealX?-%?SsjuIkE_T3ak$S$%@ z_H|6wv5om1<9VO=_x$tx@q7Px?)!b;`|OYLnJ(9PUgvpS$MIbb5A}65nHf155eNjc z)3L%k9{|^HPsLl>c5ogjA#Uc522-|Y;-$uekkbni`Ag@ zMdHH)A81dUHl;h5vgeJOV@BC)C+8QBJ70Sg?ITKp@)Ur=2D5EB_4 z^`2H{Kp@y+_-GLb2K1kJdD;d~3d2qDxWFh_Chd!sTT#Q|l`6Yy6OJHw8&w{EWMZ*9 z{B}o;ZJ0`t_gqhmfx5bS4Skr(_{lvva}fdT7W{wqqx{Rh8Xce=dBiTPD@P~_AXb;I z+C(Ytth1Y3bN@ug5jZZu8+XCJlQsBPczSwzYaAR$%F!2-0ih)#SBvb%>LXpN7Bz$& zbF0_-2V8MM6kcr5T3?!WZ19vEexr@D-PY99l&UBIN4bbx;k#Ds@SRM;<2U17gXYZ3 zIgcv@uD{iaR#^YUnroUr8b;4!TIoah!hzZDHq=|4?npJfM~6V17Np~hxOC~#Tu;tc zX~RjT&GuD zS5{S36^!0!)C+$8{!=2{PhtIMxSsst=Oo`@Bm>Q~PD{&7$v~$_>07Dci^$a$g8WFt zg#e#;3E>xqKh2S79=u`GL#L&sh3{j|+D_`>pv>DUY9o_Eb~Xew{*az-&rn#+j4`-$ zsb#VyA*%Bo!tJRq{*qxvdS2iu?v+sz+_cvsc4xk=vywPzFOHB_C3{%ns(xpMbt z1fdinvA(`Ort{ZG9V<%q#^(o}ot-hyg(DDNPbMcsqTTAoaBE!n8<--y?EkiLP~NTypN!kY4` zd+No^F+mdK&E6K?9k(eRTDlf3+NIpGaJRN(RCy$8;Lp7xqS6axV=UKvq=UBBoRx%(wWlj-$(B_K$gx$iX)kELA;V)xiV&GMM{`_Fufs07)0H<_RbA@;F?ItCU zgJFC02bIexwbu;|4IeXkAYWDL{&dNIrN(gACzZ_;{ zMl7YkgMWR>Umke`^Rv{KI6Rn!BR3;{+Evb^OCA{v^vw81gCM|qeq`ujVS|xrMYmew zRikn(DkV$Ld5nM6H1bjJMYxDo1J({Q2d3=F55k!b*C5jbdW*YW4wAu zGWB(PeV@mF`gKfaegn@|L&$bR66y#dEQsJ}zp-?|XP#JiHd@QNA)Q^g(*zga+lcsC z{YZg9NH00jAS*L-gGkvS?j=b{NDO(lp^#~Mfuo1214ylHZU{B+4)vLl`&}kAO9P6* z6T;M=?{Z9f3qoLa(2u}7oRyVjfQF>;1>)IL4j;Tl5YDUeXnrXYr!(n@*}7^;Ps^9f zgJKy*gx)b24<`~)aSGoXPfNzGmPGcI6MSdP-1bDggkw)01_uZ5=+UEm>jwC(>O=K=A-fo;vqcbmC#iRvjN3?t zYLp`Fb=O=23X=4mf60@7e*O7-G5=SWs3k{Wb>DFXW1BNciyWg-1J=Y~thNE&XTGVmcv9EuolTf^*1CzQF<; zZBI|nUCc@}?7)l12hdoRx(wahf2^~+yU1^Ovez=e`Ns#V7cX9H@GwJKNnt0m*A6l< z=qYTBC%D#>hfsE|T)6@uic9{so1foCaj)e-d;3!&4Wu4MBaU*F_0h*-!Q?rN9&&ZQ zZ~2w=lfGidUZ@N%IP%&l?U&i6`8TH9U*{-(o$o6g*w%2ZUNyeIf4_y!!puv9rdx$j zK^b+et)pW6-^OrqapC>npTmzSeR7BTId?+&l|j6ub3gp1o+5cgM{v28No?@;Sft`+ zM^uSZ-_k}~Nbp3{3%I#R>0sxiR1l$mINn69 z@zdcS3JN^7*B7S%B~|$?uMv;Sdf9n(QV3I&H6lI)&hWi)P6eT40FADw-39RXg*SyGWDW`HygF;8BAE~bx6;$wWJb80yBdwrO5jMhu}#lWY$Vzt-1vY+b7!sPuly(~a@AwHzedoC3KIOT&@pqK zMyVO-w%0q1MQl7?X1-(6x3dtlKxGaRuv4-6Dy_+ zno5dKC-{(EZTIg*I3I{Ww7U-v4dmKv`S4D_;w^SB;}I%$>~k0Tmv3r#wHnr3tXuLY zGTZu+#F-IA%4~a-8jv%|y47zYCF*i@P7TT0a3bu&`DjB~uB@(hlM?HAP*z@?-qu38 zdl5O*nO>utJMRj2J;mw7k&h z=&SQmRgd$xzTGAb`BFt0C_1Q(@o4Q>QK&3b){maq*&<>pyzFaiY5CqbNfP>&2MG7> z#k5R%!^@-9L2m`vsKj}|gG)g3$v1-h+7Igx;EJrr#80MO2-(>VY^7JaNLdn_={D>- z-?qILrKgy5k6BxB+sYEirRw1zHc_*JlWAW4_8CD-(O7x65HqvB@y2LFG<7*oxaF44 zA4e?SESzD&T&=+96=Ploeux?Op`|oX>ohx?tPw$@#oqG z=$4iiC@!<}`G^OzSc*&#sq#L`zt>`BI6%%F)_ujDeq=5Wx6@}}a0en=7 zO3eYVboWKmuo*}u)GS6y_G}N~{ZRafyKl=DG}9P?Pq!2C!F+{PvUg>v1veTaU8L9A+70BK=R!_3U=F%#%iC9Zf&3h+zy8d}IR%m+& z@)=)Vy^yD5IZsDKisu>Ar#q{dt`AnkJ{c#|tXy5+!Dkt9P`e<4V=evd(K8?+4Suky zQ@(#h{O!XK4#9C`;7<&r~V?4wTNQu!HbXWyV6(U+Q$E>Dy+JtUgR?(0v=@zcycf{nMRH!wiM(Uv&Vi zqXjR`_U7T6UI?4yUW+rR05naNI*7*ri7{S=mji9z6oUk%>AY=gc4lVzYL7X98CmaH z6lpMe(bxrEYmpg7Do#FUUH|#vAz~%5W_7NYI8<2*ht{br2G@Bmqd0&MjLcH;wCv2= z=v%FcaYQ8i>LZN~T;_iGK~v*Tl&t?QC;tg9`WN>t{tkkF7X(yCXYck(hGI@`uEJmk zzv{hjSVi3VDaa6~87=r3V#P2uw--n2xKVT2g|ePUp@!e+V87$GJPB!%X79fJJo4-9 zsde|5=jOwx@4T`JLoMX^n9gjoLeLRj5Y7IX33Ln%yR^lsV+=UY-B7EsrA{CS>CwEz z$==09mwG}!gMQyM*YFhMoA1dPc*?H|_mOlR-tKqIW9E{~E+`Pk?^4a8H#n770W>32 zRerfeibTZYva%co%iP21Sw+RfaBKaJP==OJe2|vHW>1(fU;-Dvim$oZ_?%tXct5vn(JFoU#7p!3Z4LO}*{5NzA7|#};j06DcPV)zl}1-c zNqFla)4E}d%kR1G_CHh+{#&A;|AWawH)wZACbU$?b4cs^SzC)TaB*?XC2Ia;(>?Lj z7q$juld*;0$AUy<8?oBZieFcF+7|h3IR2{K;xmAve<2?JIQf@*{pQNHOmZN7= z^79w7-sf(vmEwXv8%``(oqmTqefl^k7%(Pw2US#Q>o2z_RK*x%#YbmNPWl}^Ew6i` zy+Zf&v)T%k_073FstM*Sx+}oH&#S3uv4INA4PF;jSjx2+IM4;h?}fa}9?`(rjadC1wBP^UCZi7}xr$SJ>FWeDvI#AMNkZDwT z+?sdm2b5Dh1YUoCKW2NB1H>!yBD>4zne+q~&I@+>H9}OwPWnqwvmJV-5KEqiHFKOX z{q^~f-XC023m;WaojPTL30jS<6 z0yAD+{R?1lJ=AKqF4sX2)29zBvkeE4hVWa%BwhH{_>NoS^Hacn$4TsdbP9UQ2%04PDg_F_YxdFcWa>0D?2C{^rE(K^_;3>mpXFDy8HzL!hB74IVZcS@lgk4|1 z-^|n@1Hu@w&uq(db3>@J0@vK7gJ{2_vcDEsShZVd4~OE?R{>-ilUUWScGcKx9$M(k z@^ZiLSyy)N@Tmv;w%F6Ksl@9{LeDoXF_DGwhlrnUjEfc;0jrSnP4d>V1Ieqsc>lSa z-S!L?6cF#JTjFs}l9ez63(o-ri)~A9zv+ifNBi~+Ih(@>J5_#5ekU9-Mr7$Zx1S$X zqkMqBgCmSg%P}wYnKea36wifpLYF^Swl>`%P`bD_;96Ril9>ru3D(`iYYT!<&hZutMW@AFqm+LT{r}DLX{I+uie3}0 z27z{T>;=!QL)LuQ)SzRA9jU?gybU}z7 zo4}DLNxvhJ3%%yGmkm5Z!L_1GA@*f9&>N09=H$pMj6bijP5UEbzw|?;9qv`Wz_mVG zc%}L`;{|q-+W(DC;BhmG6+zTXKbdq+j=VJ6)05~P&Pki1bbOVM8vImYLGs>dRPDKa z`;St$9kwl!%lvj_2|(6C@-%2o@&yg_p(N*Ze0qOF*JDy~V9`=r=La#L1to-=sV0g+ zcy~k%k3}6je`{lDqC6@?@#{_!Gy}-^??rqJxQXt3#hZ3WBV!e>b4e~3hYP@Y)ic|F zz9P!HM_>BU)+HMQG{niw(nK>haH$ah@^P9h$tC zkQTl}-hNyxpj|2(JkmQi*0H=XYp4VZpL3*#J=l!Y4EN%K9EFuY%WfdtlVwjeJP`5Wp8M zTre^+O7!kAgN_*np3jYUa+}&DiyA=sECnjLIMzU#>6&7wsj^PCGh-R!-5KFEKrc_V zDc;GW(i!mKa1^ofq9QNI_5-D^#9#ccqfsmEsu|ee%`ghfF_iy`Sja~6nqqBE>9Bw8 zNYF|uFUr48Rnu?eE=PS7Z^(5TV_1NR2@c=jUXb#B6Gw59Gh_R_zBp!xrdq@Y0-ZIJ z)M%}m!FToK*cZjeKy_cql!nCHqYqD=!c~j;f~Bsze7G2FcOu1a0jdC1`W%29jVX4x zBFB3Z(pAp(quK1jR@p2H!>?QP(}^EdexCOB zGtcO(=#$k3#ry97LCh}TM0`!P^<72rLeoSZxaZfMQc0+*c6JlM1^Ma-T21kT6GzG)Lsi;3ov_aY;2&v=o^-@frUQA z4WNFw={JuRwntb?H~4gqcwOOMEhOAjjxDvSy9dJL0=Uf#H6`JCCx}uSl^;OQ4_bYX z0VRJljBUn0;C->pja;qvr=Mn`o&UvBmsm8Pj2w8XjqS^5m(J zSL_Bpi7}juXO}I`4Ex=8Pwa4)3nI=_hz^B44sGJe#aO>vxAMqkMMXsw6&0101Gw{5 zAr$ESvs43_d(1~~3KVtq&m(R|#>P(qvy^^bF*17aHS5ZIkOHRqYl6v}-Q7k9+>P&9 zdinSSZ!D>+b#`@W+QxsJHelix6?Gvk4CNB+?Wy|zp=YzR4v-+pCr>ib3g_HNxEaRh z13r#nhHhq5FIg^pQY+%lFAOy7a$H+?zXzd^84mfo!uyn5IzAzVmE#4_!kJm}@j z$+;x|rQ|{O)nc^T?Cfk{4Xca2{bl+c=V7L8?^#)#*Gy-7yMC!?F&jJ*R^CrMCYqsf zkFw_bAA)9l51jEeLuM}Tuo&i8m@1j#=V@MNV{dbnr-xwlz09 zIypJHxbQTd48y6wgg0$$nCDxXo8`P`jW8GtxbC-ZrN=J63s8CU<_*XJ+W-+b#4H1M zwq-;_TA-BZ2&Q&Ob4Jq_bwY>T@UUpO7_E2v;9%9w#)D#0{APTn_Ur?&8~Jycpev(H zpIb3-{nw9t>pIl#X6S2!y>#MvV&Z(hF9_r(mc|-b-+$*kbm&lf9F0Kg4fCDftfg8t z9)B6F<}>2me8Q_33{ni32e}q9GBQ(bSkg{g7_Rw7{=2^~K zu6|jACK0OD2gORnyritewXa|TT1!sc$T!^{==_ZVQOx$a_v){5wu?s?j88K0Aui~h zP!3=nfoz#${GN0!Gc(h{P&!9VL*voc>v}nEC7SB$_Ums#d7&p6@GQa8G&s1Xzt!|h z$&d??K;SMbA8oe|fPUO?Z*~q2URkfN4#hQr8=X_1Lvbo1w2R(Jq<_qH^^0WVo?j}< zCl40UjexfkINXD~)xzn_q_Wymo|;-`O@uR3|9t)I=lXgF>V(OPAvKP@qS!hQPtPkx za#)Y9j*e%qUQJ8tKrregN_P;EcOxQnl4QR-N#guhn~2ef)FyBK{qx?^$7dVu6*%@Z z?)mgPf_f+yFm}r3Y|t`9f;om8-lnD5Z@rn#WQUkpSr=)7P9L?CNF?&a36+6fx_iQM za$8Vu6z*S2mN(;;#(wSW@0b0+XOu5;0$x|{#_aAF!t(NgCxvJ<^w4Ousi~=+UX&-^ z!UPTig+hr(>>d@Pj#KoR6wi3Eq7)GZDc9lS>l`hutw)|ECntlR+nS6T$SI{}8mOx5 z>knyMAWMR;SoAtdDo%%=pC5$DTZMkmIO9_Ndx^ERHEQ7t(a7A~{PN{MZW;`Rg~|q^835h$Y{s#Nj~AMXMQSn~u1%8e~L7M1VOJ z6C2Aa|M0;D35iUsUt6M#VWHpNtLFJP?mm#e{p%-Geiw`1KSW1I2i2d2jYmgAxHG+pWx$NI11Pm60wHw@W*Me zw)G#60*A{bv|^JL0@l7cS6vkVx7c0smW|EBi`TAQGdE9|`w7BxTikg~H3I{KV9E|E zD}>?fL0*MG1}3IM&j8Ytmn5{@O6@p(0%~L~A&OVgnCW#|+Lz*_n_<@_vVWBHIXQ%t z*&KOJ=k=zf#JKvQgPq+kX}+_NjNSBynQEJw&=S`nedof_5@t2p-oAYsEu;rVAb^xJ zn3`+M3cd^1lqOm1+FVNCi~UwtR|iffz+PWS{h;M$xza5!FAvr0VHGUylA%2~F%lHq z*%mJ^uazD0)_ds45*B9Vkw418k+Bc@$%HirGtCK3q(x)kmD);LaA#+XX zdg<;9ANd%zH&xN``eAP`uXlRRLuV{1x>p^QzE~?yyGe^;YUbT}$KjAcjHdsUN3-3H z$KwDhgq=%_kKcq4EBzEc;Xx0F>NuT`GF6`DGgIQ-7G>a$7d&9CrPcWH%f3@my90@A zv?jtKc89L4c=fKqZbfoQfkEGMtMJ(Vd!IjlwrPHu1g!;K>6d8YB+gzvAt1oS#56WG z<}8^|H}W7d686jmw0`jSKVHgJJ1HcjnR8%OIq!ye9H5cf+S>Xj+>RGG$3{oN!8Ov? z2MM0eh2c}koln={Pd1!=e0+R;ONU&d9z6K^?b{hqQH7A5z`(%mkBd-*9r&ejgZk90 z2ipb(vRG+wtsb64=*Ep3-3N~<23IxE&|EyRuR#%W7x)a&fV&pd?rVfn#%U@Y`1>gNlptP zV~kE%5#xL|L(b>ZU}hNe-EV8}{r$7|^<8`a@$I#)D_n-xc;4rE-uteQ4`s`NPRWn|@S!wygKqhbpOy{q{@B)g=wf z4<|^u9POFm(c2Q(ajndV6$ulq3!~Vx`=U3&#HM<4CYkxfla-5zFWKN(ieUvI_g-^W2){@V!G+ zGDEnuP{MD_3Lem8$6*M8w{zifmK#WzXZQE_$EmoCw`4!Zl>~baR3{#}Y;J5^mCM8g zu?h3;tvP+K(lTuez4~C3q}j(1A_^;aZYi2=vhyEpIfKOta>;_x5AsV_dGFjZ3;V^F zy2MkApX3vTOUi^HqXS-sZo?ENLBHz4ru8i4j6!U^~@$=)_ zB0X3+cBkl2Oom+nM!=~r@*A^d;CT;s8~IJJ2>c-`+qW5;xOCpz+ndTnZ;hDvcrS7E znYH4%vu9`DGm@!W*x!%XB-_y+2dHUq9W!6OstDYwzFfzk;P}jE6&082QU!zxA_Ha0feFqiA^fT{od;WnXnmwan+(0p1JqphxP znk^KtC9yuWu#A)UxBGJBWe#8X{mi+_a&hlMxst&%sg{8%xLKY;yqoLXEC*S}+Azm# zYl~cVcn!ywVvZ&=2fPZ0hpSB$ZuZz?$U;6Z#JkX5nVx-9=_PW^m~V@8vaRu5H$@ne zValVd;-KE&e|2k0A7YmfV~KXWu`9}Sb+NGbuV%A^-Mgguvm?#O`eK*^5v7jC#`ouC zIKHKh*)pN3s+htQ=E&gS^{$F~=60`aj3bjCm3@DIESt zmat1i`}e@_A%ZsFdf;C-Az)2Ji|1w77akt5fuv<3s=Lp--Myf(p<$i$(a~Sh1pL|k zM2+7vGBW%JAaCv4Bbxg8#i>VY!*ney>dWp+i{soqJXj1ukm2PoAMX@vNuf|?J9P}4 z_n0Qxv$*``l3?!eyPziGpq~72aU9%1X=A8mfA1sHr3NY{+MKp9UNk|Usg8_{obDML z8}nxc49NO-{A$kcWD7cHsx_4>(aTUboVxNiTc)R`4yET-x6ypvkk}074A!1Kd)BQv zQ|oHi3Bw`6L=YQJnI@h)IX?Q{T_IVl!|#^=`hvu+&X4X2>eT`DCrWQ`kmY}gP_9nY zREw?5%g<+U>Wq+Myg^3Y%*txMPnj6d`08wDx(@7*Key|C<~9tT`#wx;fJqis?9WQa zl`!)2{W{?Il-)~BOREe#fwEXt71=S?+n6GP72;_8ZH|fk@1q1$6fb?xL ze+l03?J<3OO#hO}y5`8;V7O1PinHj`71EycYh_X{2?70as;Ul<6l+}6bqyr7<~zIx z68%|g6cP>wO!rEuT)Zc*9sKsjvSx>%G04xk|KMJ4=2=11({VX?-ZZK1?adYXQF2%; zwv)vQo+zGY2n7?kLNDj06#!0&n?o(HwCB64v93F1TOXfou#gWL%?3=*v@7snGY9}K zEe8Hm zT1CU6E_S`W>EG$w+@7&C8Lq7;(!EO3z9vWoAzt5$29zIP7|m_A_ck`X-0<=YncqN- zTV4%2;FSg1i}#wy=mL9oS;mA6KqDfZRP%Ld!;mO5g{^M?JMJIPEn zHMNP3Rx>O%aaQr_O5g@3jEpK5c{3AldSDHa??ObBv9#Cu`E!HX(=~eHvXxnc@YQ%b z7#+BQwPFnWq#pU4;#Otpv;NhoddCD}qUD8ib901+IbbfHHOV@_wK{=TkSYuEUcVOA zjWoUWzylp^7_s#Ljn@z50xQ9MyP8MGv!5cWF$<$6#H&+ZO7(3H$ZKD@as^NA$7_b^ z{#?#jp{lyz=DLXO>g*b|SdBZ}-N5Jb(?x*ixx053db%w+VLV{tCBsJO5{`B z-Q9s(!V{@-FX;4x(!oXRJD^3&bPTNU!UeYQvkS&zUv#y`KmxEI&$<_?6O&0)e|*g zWyzwE;m{0ONZ-B^bpvAzydR31r)GO!kUZXW-!3bdk7MHZjGThtHBo=B=X~@^iy5mW z*M)f|Dc^sBbv9tt?8OIFeD|$A7(M^B&IogHWINBb=~1494pYvoVFBqp!e+ z|Cvg;KX-}!4JyAu<-df=zk){eEr9=70QbsHsu5?@KncUpeMxtL)JoHp zsM`XnQSk(0Atwn^{NPqV4Zx*)+f`rD3BUu~+w+|@#euf0V(1xIbr9w|rG@3%!WnHB ztqpK>%OA;*dhg-=aJj&j^#iY8zvghZh3R$!bppM>T5;~HS`ks2pPwHS6JwrA0=e!0 zV0fRM)a-lW%9?sxJ3Fy3T_YnSUtiy*+_xJ=b#o2{&5fFnb75jha?j27f?Agu{(`wcBW|D1#uepBcLCjhrU zp#9RN!J$JSCIF*TimmKRz!;O^MUId$rvJo0P^-RqOGGIiL$2&|b(Puq0#P}*O<^CT z5i~AW&@ng~89e`fdWu$7R`zvb>sss0E$ZzpdM1`ntcKO5q@0wfYmPSUVfJ|~UF*jt zTkcygb@)Yg_8FMSbP8B9sE^aE>6?m0~F(T z`bar4l36q^&E}qjVq8UL9e6A!O{6IM!M>0ueA!ICXj8tT;%-|Sv+T?pNaa{Z%r;~=M)`}Qj z@1tU^t$!22^8u`b=Eq5Op=&m8z$G3J@PY!;a46c!VQB0VAjsM^y8C9HuoqM4*DBCd z83rIPB43m0MzTs+e^me8^1AzS!Tgyn1N@HShTdEuf=C(gr7zUd3*Rv2gL`t+{gn^h z5DW;oov)7%$&ix7lH|PBeQKt-)rexwJE6tF{@syq%zlj6b6|CWP@>QPW>i{k(yGW4 zP%wg{H+>S6m5pSxU^<1;H&{X~EG(=i%)Vc^;h3$SoWi+(SeYHjW9umm6;By)H7 zv09=jLZ9DXgI=@QGy*%>vKd~7FBO@b~IK3MfcW;96 zQ?qS{97A`7%8*y?jFvih{zO1el^Ppll#24z?D5dLklX8|>V_Czg>u43w^YjtLDbjT zci3G3rV=5kGO?%7e!OepKG2k1le8CyMWS9H9^GUk9#aC^1*z_n0=eUVg_w`OZ0vhZ z1e-i4M@vQ|+P?AKzkl=DbBb$Me{y2prNt}|5 zTaQGjij@?_amDI&+O(2*B%%e9xLqAUz!alyQFo7|kF zjX)w3cD&esk(pHN$z}x1^n+114kz#!m#d)7`xGW7Nt@V*LUGpIdY}}q=|9dHs+Y%4 zz5~Gv9Fj;GjcJ(uV~E`*Z{SPih7xtY3W+{-^njT^2V0#O0&vh{r0n-ukY;RLrx~z0#17Q&2j#07Eu63mjiyPRPXk>PcZps zj@jHcx2)pniv5CxdGf)Z-~aaWhnyr)+Do&&SHQg*Ys(8+y?(pO#m`7Y&HjiiZBv6O zkzb!%eavlMl45r!3)1WQlmillTwjDeVS7Wh$t>u`x>_;ZY zE`zxyg@{>2y?;HkH~niZa)Q{ z7`*E{(gep*iOkHh&i>Nj&8!NP`Fg9~PmhR#5ge5SjSeRxWeVXKK>C^&e6xB@vf+h{Z|q0VNwV`F4d3Q?$HyuH6$?h+`g` z(-x;I#WhrYpxAq^A7z3*;6PV@@+sMCo=p@&A3+j+`V@J*mMY*-wcR~EP0<8iB@T1p zGSs*;{Z&S2cNU!o8tw1r)n9&$S9PmU?uY1|dqByCl3P~uDCM_E3VfB9mj^0sL3l_77IgJkd#_Ug3-IS8*tGna6U}s( zBbowXaq7_?S%xj9R*CZZVpTkwpTQn({FJN1 z$%rSm4^7#{7~n$6MQ#U(0n@m%Sz&JcQq2}9^#Pb|0~V&r~O*TKqI<&q`-2pNK%R3|T}mB)gW0gCsQg(}bBTwskMM8v?T z#O(_02~WGX$;jB)*f7;>ugtZ)=g*(h&w#D~R>vf<7zVMz5oQ}wEs(L`j6U(84HdBk znZ&rEh$U{6kegjDx3Dx{LaaAdL$>rpLUWSVh6Gh;4 z*xA}vLvu?hH1psX_UorJ;a%M5Ec|W?r%c)t@vUs4RtU+vLO)K!YD(zY(4O)^8Mic? zmKCE`F@Jwma`R|s(fmUrr2vrSL1*!w0nX!9c|f0Txl3jM(UTw(Lh#rJ^hJkf$dngVx`ol5x*#YsrZqz!}KzwOAS znjGiK4J_r*?C zfP~#QK|^A9)~ByVqqHvcRYdnyUQx7vW46AIniw=*h^F8K!&X2zj^k$mbM|^BK-MWf zww10m5x8amdR0u(h)XDr;da@{3)`9*`2f%%rl{m*{6ah11btsd!wYf?g4JGArIOHY z17uMe>Wc?y@maQc!;zZf257>llRTUq>ys11=MgxAEXL|za^R5W;_1GOV~ZQ|Mq%mq@!u5{#=&B*fX4rkcFSALO|Il zMo|NQ8DbK4$dt!+RW|`_`cWb2`WF@E@m%O>13Us)e@deTj<#eY=jN;xwy&(5g9YNV z;88r=)N8wnqY4!iiylxuy(TYcd9A{_Z3nxahRXr`^0P$buAc{n3n{k^9*(--XiKUE z6};IzC359d*+yNYyT#rT8p!?)1?~SZYJ^#WW8f=6r)00E*6+?hT;GxqdUblu&i|hu ZExSr;UYOeGL?e?p^^?hunY!n1{SSygYoq`G literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/ievlkku.5DNJaCuT.png b/previews/PR239/assets/ievlkku.5DNJaCuT.png new file mode 100644 index 0000000000000000000000000000000000000000..450196afd89ebd88a0958bef51b21495be0696c7 GIT binary patch literal 59963 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

jIyf%0Stml#JQOzCp|{Z) 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 literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/index.md.C-gmTcRS.js b/previews/PR239/assets/index.md.C-gmTcRS.js new file mode 100644 index 000000000..0fe9ce310 --- /dev/null +++ b/previews/PR239/assets/index.md.C-gmTcRS.js @@ -0,0 +1 @@ +import{_ as t,c as a,a5 as o,o as i}from"./chunks/framework.onQNwZ2I.js";const m=JSON.parse('{"title":"What is GeometryOps.jl?","description":"","frontmatter":{"layout":"home","hero":{"name":"GeometryOps.jl","text":"","tagline":"Blazing fast geometry operations in pure Julia","image":{"src":"/logo.png","alt":"GeometryOps"},"actions":[{"theme":"brand","text":"Introduction","link":"/introduction"},{"theme":"alt","text":"View on Github","link":"https://github.com/JuliaGeo/GeometryOps.jl"},{"theme":"alt","text":"API Reference","link":"/api"}]},"features":[{"icon":"\\"Julia","title":"Pure Julia code","details":"Fast, understandable, extensible functions","link":"/introduction"},{"icon":"","title":"Literate programming","details":"Documented source code with examples!","link":"/source/methods/clipping/cut"},{"icon":"","title":"Full integration with GeoInterface","details":"Use any GeoInterface.jl-compatible geometry","link":"https://juliageo.org/GeoInterface.jl/stable"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":null}'),n={name:"index.md"};function s(r,e,l,c,d,h){return i(),a("div",null,e[0]||(e[0]=[o('

What is GeometryOps.jl?

GeometryOps.jl is a package for geometric calculations on (primarily 2D) geometries.

The driving idea behind this package is to unify all the disparate packages for geometric calculations in Julia, and make them GeoInterface.jl-compatible. We seem to be focusing primarily on 2/2.5D geometries for now.

Most of the usecases are driven by GIS and similar Earth data workflows, so this might be a bit specialized towards that, but methods should always be general to any coordinate space.

We welcome contributions, either as pull requests or discussion on issues!

How to navigate the docs

GeometryOps' docs are divided into three main sections: tutorials, explanations and source code.
Documentation and examples for many functions can be found in the source code section, since we use literate programming in GeometryOps.

  • Tutorials are meant to teach the fundamental concepts behind GeometryOps, and how to perform certain operations.
  • Explanations usually contain little code, and explain in more detail how GeometryOps works.
  • Source code usually contains explanations and examples at the top of the page, followed by annotated source code from that file.
',2)]))}const u=t(n,[["render",s]]);export{m as __pageData,u as default}; diff --git a/previews/PR239/assets/index.md.C-gmTcRS.lean.js b/previews/PR239/assets/index.md.C-gmTcRS.lean.js new file mode 100644 index 000000000..0fe9ce310 --- /dev/null +++ b/previews/PR239/assets/index.md.C-gmTcRS.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,a5 as o,o as i}from"./chunks/framework.onQNwZ2I.js";const m=JSON.parse('{"title":"What is GeometryOps.jl?","description":"","frontmatter":{"layout":"home","hero":{"name":"GeometryOps.jl","text":"","tagline":"Blazing fast geometry operations in pure Julia","image":{"src":"/logo.png","alt":"GeometryOps"},"actions":[{"theme":"brand","text":"Introduction","link":"/introduction"},{"theme":"alt","text":"View on Github","link":"https://github.com/JuliaGeo/GeometryOps.jl"},{"theme":"alt","text":"API Reference","link":"/api"}]},"features":[{"icon":"\\"Julia","title":"Pure Julia code","details":"Fast, understandable, extensible functions","link":"/introduction"},{"icon":"","title":"Literate programming","details":"Documented source code with examples!","link":"/source/methods/clipping/cut"},{"icon":"","title":"Full integration with GeoInterface","details":"Use any GeoInterface.jl-compatible geometry","link":"https://juliageo.org/GeoInterface.jl/stable"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":null}'),n={name:"index.md"};function s(r,e,l,c,d,h){return i(),a("div",null,e[0]||(e[0]=[o('

What is GeometryOps.jl?

GeometryOps.jl is a package for geometric calculations on (primarily 2D) geometries.

The driving idea behind this package is to unify all the disparate packages for geometric calculations in Julia, and make them GeoInterface.jl-compatible. We seem to be focusing primarily on 2/2.5D geometries for now.

Most of the usecases are driven by GIS and similar Earth data workflows, so this might be a bit specialized towards that, but methods should always be general to any coordinate space.

We welcome contributions, either as pull requests or discussion on issues!

How to navigate the docs

GeometryOps' docs are divided into three main sections: tutorials, explanations and source code.
Documentation and examples for many functions can be found in the source code section, since we use literate programming in GeometryOps.

  • Tutorials are meant to teach the fundamental concepts behind GeometryOps, and how to perform certain operations.
  • Explanations usually contain little code, and explain in more detail how GeometryOps works.
  • Source code usually contains explanations and examples at the top of the page, followed by annotated source code from that file.
',2)]))}const u=t(n,[["render",s]]);export{m as __pageData,u as default}; diff --git a/previews/PR239/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 b/previews/PR239/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b6b603d596933f026dfecf98550bbe4d0876276b GIT binary patch literal 43112 zcmV)0K+eB+Pew8T0RR910H|mH6951J0UBrk0H^f;1ONa400000000000000000000 z0000Qh94W4P8=#fNLE2oicCLERzXsMC9Sl=Wtg7rQD zHUcCAhIk8uJ^%zD1&nkDAX_XBaRL>&)ao+mHU!|MHg&0Sk(r3xtq{uU6G{_q3_WZd zz$4~nWdHwvQc@X1lj_qJ0YMzwArDGrm?4A}aeA@jS5;H51$Rmqq#B7?95rGNFI6|` z(duP%6x?sdXY}Y#s9rZs%E9gt*iIp=b<@Jk>{j<_xevtcR7&(U5-;uTq`#Y&E@}{k zxXD^Fqqte*BDqT}Zi&Gk#Mf|h=y0-}o&213t9j~q$RXM{YPjder~HLJ8%==k(;qKy3K{IUB%xm zDsIE$bp1=}X`05gnzX6aJxy{j56_L zLQcd%;`&~HJsDrJW_a4>d&hA{Nt%hyNLF?&qFj~s+^=YLS&kL0B0b+-|x3)hD5eTXjF;sBks*LGK6BDNMxvx zf|hib=bz^O@zGfYh`X z_yO`CpzH1h+3#A#v=GwJw%XAHfK^=;*-mAPcLQr)8z=5K2SAKwOuZg zEIkBx`o`Ma`R<)3hruP|mFgw)`p0S_K~j+b?7%_r`0alX==Lw2eWm@}R*n6=;Qq*3 zgvu!-in6Wl*KJF!mcAwXgKW+4g1zXOC9($XS*BwO$ukGY(S;jc#uVfiBn_PL z9Gx%6j}LO$Xpo}@NZ9}=jhoPDs|l{gAK(NKBzH-rqDI;jfpO2xNouqwb3n(O_lR=g*F`__{ zCV;vqT-Ou6uDVuNcvXwB-~Z3-2Glj5Yn(!_nj(_#_qR6Q{LGqGytKz5;ul#&WWNkz zTKgGmeWFo+e>2sb&2?Mrm>^IxYKr&-V%lA%6A2YxFl+tVGMsLH*D6{~fMBy*BXBzW zBnd6Xy`0QJ1R^kvW){y9Qr3Z44`=gow#u+mI(@chHuo``2U)y8*mE)mS>~#VdGXdn zG6e#d0zsTC7=?ukXHlpu4qY?I6kst0l9>W*PL?Kvab+_;J`>7eg^E}S5tERxS~AwG zm+e(K@rsL-ShIFy1po^||78yZI0@h)fExhr19%w_05S^5qJW$OkedL;qlhwKNnQZp zu>k-}N~l~qk=?#|LGk+VKSlC0wv6T!&$U1S02lx;{MHxqAAjRkfLs#zs&_9Q9vsKU zTm6F6fkEhp`_o&GuQ5KhYq$rFe-Ojx{F6VQebG-#-anqd{l$V$Ki&B0Z*IjO(EFZ1 z9-o{(binlw?J~Ogp$#7cMgT`1)T9ahe?JB?+7B7Oy*(X)z5+2c{tbVrx(WR|D+tM^ z)tG^g@JD~EH-E}_nf(0sPa^;Pvmf;Pm;XX#@#KB%%4%!qYV`5g2J4C8i|+fT{AB-3 z+4ZYy-FD&U2A9>Q!@u1>MvfMXUDY#;&8Rs8$5&?W2XNCYBz`gOcl6f)IKfoPeaydm zqVHS%&wcjGJ6~Aizp^X;hxWC-uVp*gf1k4brR@vrW>kFIwmFm6=)MbUoEb!c6i}u<)j0k$J^p=<&RBHpZiHcw0VT2q-9N#uT(7~ zGrJycUNI?Yc?G9vVztEZbri*lmo?2E7XcHiW=e*?zxa9FA;w3=i znFcJr%KUrV{1JPXK(jc(U#48<^T07*f;%-b<{X;LH-vxo$E~lidxtMa?8M8b0W`Xt zO=H&n*<$(g=APx8UB`0zt_y&=xoDr6Hvh)$W%Jzf5v$0B_UH8MP5}OZ?dNI+H<;hD zdIa<7a&CYd?Z2rN_a9E5?XQOhdE-A@eq(;ba)|k-#lPlX&}#mV_ITs0S$899GFukj zPxhD_i%q64dHb@W5sqxfOSg@$(o*23U`vxO16QUj*?9OLq;$TAVqHoENWWY;1tkp~J%dh0CT6zxqA$*)mzPgO zOux8<0fX;ONzTwa)KVv$wCt3djzqe5l0d<+&i#%7_UQrc__%5=!a}eosAvF*=nB1Q zM=9t*0Q2R++V130ZFHgCQ@|TX!^x-=4%UlMR&M&=`T)RiAqs z-n%~T(OaIl47utIZ`o*Mo?Q@~JP_RCN#xceAlGgTol;PO%V=^^6v?O9A35*yPw*s$ z+9T3)&z~h*SZ3R2F9)?aeV#;MXVzM%S&wPn+vtx@9x^PP`=pYqbGmf)?$)pJB&IQB zX;TY%U>_LIqM-f*o6&dgx+P8EP-SA!E+0M%#!vXAi;t4q#UJ@E&?jz;rYEe&@SZ62 zWFQ`z_pLq@+piN|b@j||#cb)7d*d8?FFHSMmwtD9mKl7<{m*dde_sE2>@lVs*)sew z|1Ng)4&}4msFBij&rvg@+rrrG&@VRQpW#;h z1-touxffRFPvh5O3&%arMHjB*pR@TQucdcrtCkC|gsW!zSF=X1{TG~9(+5sQARz}H z`X9K3U(FxvjnBXE`^UbxefjsNzql)#{LEJ$%>5Wy`%LNgpa1r8*%Rl#%Wma2g#crcxI$;zV9*hYrn~R zYv`BXVe#gh%V9PE(9gzSTzrcZ{`dwk!n~UY;RMfV9|rQM@zw74~{5b0M9=-uRaSte#Cn7<6!<{t_^eW{Biw}A7Je9?n_s| zr;mq@d;xs)q>(0qlTS(S&Oz7H#Isqj@U-d9B{2W#{)tb4U!RHHE`j`6U+Dv2$#e2& zF<|#|?><;(^T-QJKVJrazx4A<5X4{p%P`hWVdP~2UW*LFhQ<8YfnzCT%@ z@nJJ{()FJyEIaru8Iu{v&7qRa3~v|9Uo5#>oGM)M%{yLF2EM`xmVh^KtWN87-F?HJ`@Own>TRGr-wFS-{d^;r8Je#DwRSC%u!@kjASGY7r>~cuOLHjpIIDLb+i!xolsaoU6Kv^TOKG^Ez zh{V^~f%tK5yjXnxNBUfpNRKAX48Enqm&NH+EVuH}wKPk0`+gJ&5{jQb7Eb|YyxHk* z(&g~`6g6u7PEYJ3!e70gVC)kC|gOm%HYi3saDJGgpl)=}tQ#^jfHw}$c)z@XgDhf@mxA9L-i4iC!P?rSb( z*8SfJaQoz4`ad3abGHUyoD~HWi1EMpZYY2Pc#l2h9$^U_aI>Hg+8{SU-x8q@Mvp3~ z$p}%B@sy~c=cL$fy<}mfuqwv`3hVODSy%8oD<%Yj?TS*$#|O+q`H^zWSXU{VyQ}4O zwd%#{^>r4Y=nW_7PyD?~?DzQS(+B` zuLtZww$}o;J24*vueo%20oW~Vnf>_y{hj_<_|xv%)or_P8O1gw4*t_WP9K?r>Ub&m zDEX-bs0C?+vNLQ_Ea`wGJ$^}pED*Bo zHmJcx?7^5YV9JC!D^{jD#3s!y!y)VIwnO{IO5a)|P4u00zSpnFLqSDRlad#eNO-uE zd86Cl3PUOs0JOWZFJSZp#H*QetzY@L_F znjt%f)7FgGCH%U2%r<$m;hG7%frnO4*8wsa1R<6kk1^6zWfe*_i}3Dv?Bu(drLFHw zT)rDGX}IKrO9Gy95L{yr;9x(w2D!`ps~!(<8jH5t%Q?t84O{gvOg|31K;x-kd(A#@+df8PTyH}M)}}V&bLzH!7GBrg8!~Y~ zUm4AEm+lc>P0o*BUt~O^hKJz7X!Kn*5vr{kflLq1;x>Qgj6ZhW-tN=?&TmiVt=2iL zn5Vr?4W-SV4=LToz+iJf;_TuYdod4_4nhAWC_xV}{rOJ+CMu4>e@*M(jGruHPu0w@ z#f@6uF(`Mnzc{lqkWV;?j0zZD2wbh$Z%8SKBOE{<)q9g_-s8qYhJwth3vLq*D+*RZ zc&z(vFu!dV!yGhrflanAzpZXuIg4<}&c0#pm>XX?~gzx#B;mpQQ4S2YDe zG`gF?7In};|K^PA+y>Vdt|q~&U)BsISZExKP^oEXvM4Gd4DhujQezi#eDm1BIX7sD z=rrENTZLJF8>Ktgwj*4Rp<}hs!EwsErUf&)gAqiG&r#7?m3K_P7uH!r1=_IgydHF| z|G}*+?!Sdy4KgCJ79BB;hjgOtcykGCimmP-m33UY;T51ou!{mDZd=5eUStQkwN>u8 z7k>)~5OrJ%O3Btf(;fJq5NpSjWF!(~5U!fB*@#GTt@3IMAz?GY!C2 zh8>$T2NoXv5u_&uK||tlQF7?iQ*E*_aEqa0bn&3p$U9^sCTTT%Ly+l>G@GPku}|q3 zp{+V&xE7{bEf+{6&M9&Uo+6By70&SoBbL@9rT*m^2WCB zOqXDC<97jJY;U(sI)d7U-$19jp7msVF zG*}bLiB!y#mIosg=95?zlV^1TcYO059wd7OmJSPxALez^VMhRmM!}Ve{9Cwi@hn-T z?;IdNyg2-kXooRZ1Ajc^VNxdr=0qmx$xgSr!R^$;L^;HO_#!E6)3@qTvLVKv#HjP= z;#mkTE6m)|HkkMrTT`sLd>uQP&X;?m^~nrb8ig9JcN70EDW6U9*4YIY_dEh)od|Yu ziHFfPGsM8}bp4LNT!iZlw#mN0r&op5Oyxt&K`t)%YxORixK&FB`7X8wneS1p&_E>A zGb5<-{;GWcmYonF9eA3$R;J43c(cOg*GS?rOn{@+W4OS;BZX7{1`6zrduTn}T~%x}R&| zqnv!!`6Ohx_8A#s;3euY@ji*-P{vd0;|%#Q{P_dI%7L_YPwV=!C5@IG2xsw+zng~5 z7yPvf*H6l+kYZ(jF#xcNb6z_OH+(+qO)qYwH~ihrIJXVDV8L}Vvsm57bh{m*#(p=| zLXPas48EXd(z9Q<#4r#&QR1bjf%{qfzo18RuuR{M9v#v?xUy+_u(~+VHH37euhpeod4r;)JF)*IG4~ z!)u-mUOD+MkPO|)8X8FbFeqV?k4Q!cVNHrP%US3m*vLX`5KhAL8+%0UWF%j^Sg%sA ztOK!uBc3jABvPgA|reCyEiN%S*T*IN>l|hUsP8=_$F7o8o|cam>Cq>k)UFR7*%#(riI%_Fn3 zE~*)KPt5>4AWY+_h6H((de6;p_1|S!@<|qmsC4TG{Q@CaT6EbbSH4sqEt_pgNQ0|u z|DQTn5_Da=3SG7H*4MJ>blfnraCbyZBQzT7x2mlOD{z4>*Z|DTX4ho*@vAdSUikl` zYN(R8P6HNYaP`GaCcd^zlQ^`O(F~CulHfsv>mP<&bad)*!hox%3jbQujAR5>?DIKSgrO0$D3Iy|O3zkXqs&$JQNh=L)aZ0aTzLm9|D-EL7#4{4A&P8r9 zf525A_=?`?ur<=tDNOG>-3OtNH!EkL34plg9D#$Oz}Eq7XJ`m~I_9jNekJ z(FrWm^6E};($4Ns@goXDQZq(2I;l6ScOIU*HlI;pNJuLwX?BU^OXARhe(4(EJ z`Jr@n59Odpwiix-?_yNGI8**pntKTT4TO|gb$-;gdSXWL9EWwLz9RTf^SQM`NoGNi z8}lMEF|yh^xs#RF?<9{eD;O+K>0l)HIxe!rg?&KZw?emeQ}Sx+Ez3x!W&daA3h&4e73<$pE3^KsKkij_aBHsNG1n*Gq>R;!-%qJ{VtC9s_ds>Y0pRu2G5EqH zKC*#S?T>~iN5H?-#FRC2lsfV3b7Y&vt4E(Xtg=d~cQ&+e{@((q5wYA9Aq;Rk2a3AJ zwegu<^yRL5;MulUt3k#285Q8N12c3JgK)uX>5un*`ylAnlQn>olLqq}j(_rKnIiol z+_AJ8S!&H&$4JMIJSkAa4qN&&-2Hn^TVS8_onvgW?SO{}EjLt#oZytUZb=0)aWu^@ z#pb6O5xso-a?uf^0;}^bIU>oKkjy;BIpdIr=&2A+N~EXOWz()%BjN?JpzKhz5sJJ>HL= zw82IIPM-~TUc7h3W!&f$b)Jb=d>~JqiSAiRThB!f?XCxz1l_%IQ-v1?C?Bp7%)F*OJ0z@yqEz+=WM=ei*ZAH zzJ8H5?>a4seuL@4^zBx9ybKd#iB%8H59d?OUdVf!acjRSr8nu%NZwVCDI3byABa}{ zPQ!S+Y2vq;JukGy$P9|PnliBrF4q(SX8Fl=~bez+M6>%^N zr--ioAQ@LNIJQQF%7?3~!WwLH!{hnJev8ks{bjfO@)p$&X2+Pnk@xMuuKlW<2K=iI z1va(s&fBa%rMtzQY#wNlJh-a0uyz8Ld>;uGQt&9jDN#F$jS5LwT>B~WFM>~vq_KIF zgCx|{gW4$Q$ntdbJSoxZa#?O4YSg-_tF@^t$KHOv;^k>PJ0#=O)@T!R@wsZ)(WBd2(?_pSTA) z(X1)I*fLG(L0W#uHXknDKU@fP7bNim(c-|whD1$X!$PA+N9~A&vNMR-GRd)^jI8!> zVm*wCNZMHxhfpm-aqE!j@K|Nj*>G??p_XJ0wW>6qh^-6MBCQ}+LssLF_E(MaIQ#zN zCp!8`UQcjWp9;AOG_GQLG5H6*it`q!0C4yK*&@_`nIi{ftfhK)L0-Zu3rj%J9nb{Z$RX$}AlN zEZh?bdvUewkDm?%TTp*|a92c~`4P^yfx;r-AuY$rxNKkHy@Nws6tN%zFX4IJ<{I|c zybWsnD}*|3lzdgM?aD_8HQ14l8(+{L*A`8QAiHdt-!H$;8A{kzW6HkjXMMuy&_Gly zmRQwbMIOI@Ef(icmiOP7}HWh{Imt{F-}Bqld@1p(6?Czj6}oiC>>Y)V0w9l^ulm*qe5_V$JP-^y3^mg=i!lCkHR#2{U zI4yF)Fr!&|kyg-kt|emK#WC!#Y~3II+aH(#Wf~A{PR2;X;+iOoHY5igH7{d(hlLdj zvn>AJW6`Avt37$y+&*EzigvkfQ_sVvB8f4n-w)oIo1qsNsopN|-=DeHF)bb54gA`n z)J!c*PrObQm6ET?!BgbM_TU7NoICJ1T!$?B!K!=oV@-m><$3*?38lZ9PE3FH9wA$< zm5nandT2PQI`Xvjk%StlRxX4$$=gQs_2K!D3m`5;x<_|jasc-EnHsk}(lKAw*N_aV z(OzjMoI>!K#O#llK6FX-(n@At;ht>2MN|Qj&p$9$e$61`L56%jaWVY5Ef&B+J2X=~aN_{RD5*#L^^rrI2n7#nZ+4S{70oZ8q zEUyv3k{6IEITJV1hQzbvkZ!FUX+Y6~Ap$Ls&WE~E6a18Cv4e!*D+J7-Q`6Gg%~{-N zx_PuGW#TBt+tG{J4UNi+FBA?l5ZnvsvS!)CFkm8UzLCh8h2<_O`w`jYE>ZEjJyUZa z4ydrXcn2xF5Vxl=rg2L=58{AW@tNGs;UPO*lG!lR0o~l*y-$-W>JDW^EFja-+XrXz zjBxQVHPNmePDd3D$UkKQD_Qle_`H3Z#V3>kz1gLNsBL|lvI<~fsMDsVF{-9juYGAh zE?F` zg4+4{k}F=kMU8{J81vWK>#Z>XhZhA$eQHaC=cwMSqorsRfrHVWjz7%yHR3PBJI+4f zukNDRD{sAz9r%kII9E+?o*Q~@9^&SXRf}G`d$jX+vFSc$AYvo<79MzS&eUycJo_lE z^JV)IJNS(5u1%Tp&DlEDMa|XEtH+xiOQvVkP?|?$h^<_`%9IDF$ATryM%( zJxecB8VG^pO;vmglDFN1^Te++Y3}8a7 z*@8&>4}k+er?tf}`iuz`961MVcgY=vXBgFUguhs+$+eYEZn6dL!X}9zXc%NHD$(MK z+P2cS-^=TMjFaI;LZ9x>EsY!7T2){~4TeRM`@4!3Nk%nkehW-L&_$)zGdGPQxuw4s zw*P|1Qw0o0vB0uu&z1HfBZg0>m+%>5?BcEejpPVM#}ZPr>JnW>5$P_-^z5+-76>vf z!wqC%2a4}!t2VYx&g(nZ8mfG8M1OQd>5r}}e=n6GRpKlVoM=hTL99I~yhG^isO=6% z%2Shkgm`L9!-7FdWB)li*u-l=*$4H)zkEN<@{6WFf#{=nzT2BaKvVFPQi3;gj=zf+ z9olK;rwe+dLD(S_*vwr4v5pag0QOeK{^%kr^}2t+V-Z&=KXBjMOrFJ;^zFO*{f*cG z%TI`vmA==`ub6+r49w?pBnMx>cZl?js&JqdbZm6u7+!PO+=3Hk-D`jHhBkMd;@#Hl zF8+=g{D2(d7Ntr>MvIvL`Vo!!>=)6>(KIHsWo&ikq@7K~44&+u;-l&f~J6DUdak%sYTCMT;EdXb0f@nWcKF${Xn-^*6rooHlM$oQM^vy-_(`<+Tar%46?H zlV)w|W6V-uwEqhaCRC&)vY2U5fuCyQmTUdW+h|-W$^}MROzhQdq0vh12+2iS%ynYa_zEBHVHF0sPvRt`xc~wO|nV8-A)sl zE#SJCinFNVMQo#`06@eKR?d=$p#oInaiEdgH=rw?Aq1HC+Qpj$*v8slZ>>o|vPOgz zp{XW8crRlh76H_;ITY9Z_H2u)Sc@I5g@s*u#RNn|OtHw9?3!Td9MPArt!i)gQVVJ( zv_Q$O_>K2o$b$r0g&?G)b(5#9>WuwPJ4VykOp1XxYAX<*c6stc|{rYNNW6zCp=2N{^ zz1E3`3Z*^g3H7Q!H~p1Xs%A{hZ)KowO0}jFQq+^_dRgg0g1;D@i!RX4Z9_vS?9PwB z-uDtWe`H1{5nO!P_-MS^2$3&~e7!!xmhP!r~vLVpW~TjJ!I0fvLLYyo-IaST8q%YIA!0!PWii0p!L> z+t~Wm1JV)Tk52QwT8@sewl*yu1=_r0xuZa~rPgn%G*jXVEzG)2+Nx!T^w9P9&j$E& zn-#_=|BOj&bQ{RE-vs}xa$yJv&d<|3*7<}=$gU{#bn9YL5SYkmXXT7PtgA>on9@k~ zkpI6=*HtX0J!v!?8wSdebu&BuPRjt!8WhizPEV>t`1;)R3d6(nxK&rGA#2{y6!kY> zky;CoIe)N9mO0UVC1oFxr+}ZaZfibThaw%ZUY3mw;aM+oD1p$o3R$vnJ3{ zYcv@o!1(LZF#B~a_@x;L(plHvH3c{|d6G@6gWLJEqUyJQ`eo@E69nndIJz>qTP?#< z8lAD@#xh>N;oqt)G=Dnx*)G?i$zmn7_QTJauAeKDOCG{MJ)61DKjT@Jxs^R*=I5w4 z8?cbszzu?#Z?abv{|d~tyjI7m`NyUSXxx7HPvTPE)a{$IBSb-n$-*Nx6k#I0o-*|8OB!?6JOo%c6+CC>Ib6e|~(Rbjt-hDZlX z^~0`RGV7iS@*1O&(4h!paRhnZ=D~=_HrK2HcJ&&RoO~-~Fw=683l&c=T|>59o!(5t zuA>mbA8tBy@G9VT^Zo}`-i_<{^CazWq4=13gc#=StK?%o{0T04an@rq#xBd%VY5in7@Lt|UiBmT$(o0|x1{MkKapZ$%c@B* z$N?Dhb+BsTX&G1Z)|5CgGc56RB*NAdO%rBL3@S!~gqjO~FI&UWB%1~eZV4(UL;P@Q zv`F)_P=|ln#)s_@7}7?OmP<@+j+7!=L=Q8Fp3Ld$GuxYtU!(mrXZ`_)QS;#POKQ$3 zx6jNlN@U4U+Qx0@yW zFRvyNzuEEK9WkW+l+W9cpqY4e@b{IL0yDOmNms)K5{s;cHyXVgXYf%=Oy zyfhxujM7vzp9N8Yynw1eP2rYsZv-A`jP%lS(YivuqL3&TR4CdM?SoE0muc7Oc<4Og z*6Et)`sgO=R_gB2z0ITb4qy~9W|%(AB32t)gR{lSaB_Wt{#}K>zG!`i0oGu`aKdoK z{oGq%yyBOe+*B#1%NpNo)app*>AA_FWKi%>geNmFB|7{Ca>aR?9$|VzXWrCR(A3z_89Rv zU4BwITY1{7xTSupnWwgwwYS7u>b>Os(EA^K*=Lhaw2#ndm(PUH1)n!W4aS;CCUS^% z#Bt(f-#O9*=`87)p9=TW|5reNU};bhc_9QHf)5D};e^zMjD?&G`5#4*H>P+~wowWw zos|8Q>y%HSh){=6N+>t9IgA>v6}~OvpQjkPGfLCz5ygqR9(^HZb4))KOLL>$i+#V% zWn1dD_Bfk3T3l1yskrxaE-z1jDgeGWvD%I)z!@)r9ch7}Ru70V{<|^&b=G%n64MY5 z=4E1x=<_^CM7Tn@W8bJXku7mn2Ue@yyNl5E7FbffK6SrtD$9cw!?2UmV^#ta7{Tw%O8Oo8r>0AE5`u^xLUnxq3r zs3Qfle?B1r8uY5V?#y)ku28EPSCKVXV1osgb-{=X-@5}7z`SOJZz95>?YCk>4q;$+ z9FYL@VF0l^1|6N3gmhrLkZM$r!#G3{4Z)mk9Mfe<)nq|dA=;S57(yTm$+Qh;%-YhF z488+TO7zre!slOzcVf1)IjqF2RinSo4^$VqUDIkh82rFc-2Mdft)_*N)|L11&F}Hw zJps?JQYC!a4Y?>tXWV@^SQ`8mzRHz4GCYU&Dg_1)$u-p&%IEpFMYuTha6P`1B^$ZY z_!NvnawfFkwR_5Zti1;)Cz-g3QOcgm85RMWpNF{4?+LFWx%<^?)u2z(vPbu)ezP0A zOT%b%U}JnjaF!Rq!4spHJ*o*{f*B^5+#a$Bzc84^!0#-G$h$-I#5ByoWtfIZ?z{_3 z%gBP1^NcI!qNq=igq=5J?jeMm1Ex7Dj3G)+q+zF?0~1@j?kc$@e4 zN6azBJ!PN==FlLq$9Rl6bfftjJXZr}rj8xc_}VbvTO)?93Fn~GX*ey9<&Bh9RBM{d zjfLk23%!1{Wzzl3>(uTCTHy~C22B#%Am~gU&vWRAZk@At5~lsiB7|VIQn8%9(9#K+ zNZ{+H8V}iQar^b&ozEobFo@pWWj534!BiyHA5WLssv96gXx29e2l_(;1L<4|v}XrG zCDTG`4BYIxmY(Fc4 z#XE|wR2;84u2y7!)E=61vv2FNhr!9+LH|&;ZRs5p(y9YruDF1Nx@}syj)ZO4ZNx5d zzt3mw?@p|FU9|>Z!EWb!Vws(Sp&{1#z%a(PtB7%*;?cqZPb8NFRs8H~_s~6X-tX;| z4|}w1FQ1Rd!3OryegeBR3cxi>K=lLy1o$9~3fUAOjAO@%4uT-XVn~Myvcf#I< zVA3th>5wpc>D!mKWX=_;^ju5(?bS-8o-Sz~wK41z{ZWTrukRi0ZVg8=C&OI3{8&$R z`j*q-UP~**vGw)e$!!VAh(dvqBu;HP z+pdX3oKG)W|8N%mK;Dqk4}zx}Tg-SV=x4m-qx2U(8Juglzj~$iv#HlO4u!87kC>n@ zS}!JXoQUz{&T^W;1{+Y=VDmM-1H%v`BccCJ?NNX=1OFZcCC2y~*XK)a4hU-( zWK%{TfKE$(&2LK^ufSSPhJtY1;KsT9vYgHt)Vp4EkylxdMW?wk;R$HDho7A}1N!|wrqv4W6vO3Yh8OF@MMG@L z8tI6xI5ItCAYQ_vps=_7Zn7jeeiFMuV73_1_!(O z_9btIag)YTkPS#Xm@Hbp{K%w2>1IUgD4fmmycn{182Fw?fQyW~DiR!C8rgD`q%Y#r z{li`g^OAX$DPuF`(O#O%7)vwmOp&HcmE+p)a89U~#FP&p7oy8ZtmMFnA|Gjv^=OJ9 z2nx7YJ1EjFSXa82RDxEyeCA8KpiiCC2UKGnl|wWG7khA<<=_%Fz zpCP#ej2ji<Zu#Hn)Q;+#o{-vw*bjj{d9T z*95ifAiJ!x%KH4gq2B?0;op3G7zb@F2u)xcVjO*q1e=z}=N4eGNOEJ%_&PLB({;Ya zX|#;13HrQ=Bcscykv=Cw&Dt@uxusbtMH6{dq5)`aseLbvtdeD~<95W9^_(->1c*l> zby{M{tC<^v{v2o$)N-xX46N#T^Vc>%rmOPcbj^N>$AynFh;YyhPs>BlN%|;&iDfmsJjrfvO?8&*!=y&)KF(7i0(zw6POsw(CQ`1VGgS-iM*9NT|v28;H6 zfpv>pGFC&-fygAmF=D{gCWt1GQq^B<915@X|I7E-LRT&nWn?gx{d)5%q^dSs4tVe1o9UKNc| zMR}7=Q@+o+@l`mR6=3<*CO!I-FvDU7)>SNj7lKkG4g3x&=i)|!lteHBVG+hH)PH{J ztaoSEU89MiZNtoRzDdRBwQ8;#Zo9Fz zM)(`?_`8uKQqjOH%|r8h?n(K!$r>?K?i%~A8RQfAcEILVO`^osp;}_ndc)=*d4CzX zrF~1tQ^ZX^w&=nnaGaA}JyB-hXQ#s9B5ZADhuPjd217xG*2YBxX=0~bko2jU6_lIi zja!Iy|LB-L^|)mB$*Rlv0sBljOq0%&nP?ykJV+XF<@4P;Ajeb&M}Fo-!!>rWV4;8o zTW0%zB`=^&YwZPqnL|vy>M7Wf%B!hBS8E*jDd3-hrCqFRrrkaIzb88+I)?i$@a15p zMx&k2*>TBK@nO{w69)q1SrRwOG7>jmUwDZelpp{(lT^DL5<#^SCgF5+qBD&5EC{IY z%6br{(OAxg_Z(!0B#Rx`eTc|{V}e9*NEJDo*h}1!j3!A{LRMX}(TOsPcwfox80B7> z=+A2C!l2(5iwz~yaa-%_Mloh*-~6|(^ZZ(2v#ee<+W`?AKK*-K_aYDA&$;6N(Hv z=LZwUd~jIs8iHNc36M@F6=?T1;LXn*A#X~>{5B#MJ`ANSl8A+y$S^fpyEv4k;%XJ` z*GmDiiKQZ82t8ZpfR{~SS7j94BXSW>3F+oSck(DPG_prMW2^DRKIcps7lEjfPyX%O$3yTc0q70DF1s(nLdCz9k; zd0GCf76d*nRK93U?Z(6M;7 zx91UF%GyzkDYOZXH98ErZ}9dOVzH9u9lK9oOuk55o>Q3uC{?!KZDym50}kyI0P-s&`XD2x4{TQ9JBT^*MF#VcOz zv4$=_*2O|2DXS#hiop#@B+nibw7{PSLbKDa()jK`4PON|KlC%<#<`xSid$U2|1_OE zN&?$FlO{(GJbJj7-SlKU)Aof62S>x5M9pDWcKtZkDmYl><*3A!BtjF4(x76Hm+DDU zZSwx{5kwKM05w3$zjG4^n$XU2pTbct{gi#nF<8wbHS8 z9{kdE&-{JO4-)}7F5xlcSdw{SHz46mO^E+6gAl@XP181zOK4!o4OJ3(-Y|4kR%A0m zXxm71vp(&M%vPz@leAx&R6~R;Lj!AVwskoADboNOnF?FyB?ugdH?11-5|n3I2*tf~ zp?qJ2M>BQ0#_Vhrwzte7mG2uHMj>T(2Gtk}yIZOJxN;(?X}7cqTaxefYOVfcpn7I( z;UIdB@7-%gLsm?+q%$pLza9z)R{XY38JaI&tXY?vZFuXBPPfhxt(JOiGk+pK%Bv$T zR05q#Wh+S$^-QF1H|p7O0~#Gza&oa_U!I}-T>3w%I=VEQ3M6ct5QCK2)cat!l-6-qT_f5<2k<0{RvWIDHXI+zxU zS|bV9hR8*dxCg2Fl9SHdSe6PhB>SN$;tk6v@ ztu>OQOj_l}v|^HvvPK=q-TN<7xOB}_%STTn=lPZ%yE8E!9$t*6U1z0X%Kt0Ax!0xz zaV3YwhRt!#4>_lbrdH{cwGgqQigB|zy_Nypc>jdT{k#`DgMR8OEu^HeZLLo-V`!HR z=Sh@=e_{8iXe5gunsP{uxp0d-9~t8VV_Z03KpDL1uL#;i{x03y@#lQ-){vN#r^vN# zrN=|~_WN}&g1nz|p_G^wFuI}n@ow5Lmt$!^=32NCMXB;#aZ{dk64WS&K_;RQ?OKTj z!cvE0ORT7?t%pM;mgm~MY9P36Nix^kt#gL&o4|tD>gmc;`7VsxZ`nF?#WpV&qqv_( z?YI7%tE9$%IPGzaca9wFiwq+1mLo8JaxdJryp&=FmW{vEqa=FFKROHhnZftOkizxs z;ApE^;}fItF1b8GB$uYEbecRl@bX_8{G#LAznyv+;I>rsKNJO|Dr%*<;)uvL)Nf&yQz(4^x!qw0<%YR z!5WCIo>N*Xf3aVU`_iF5v@D*2cj(K_7bvN5i%)6aafxI1BE7lOo~CdFkyRgK)2ZT@ zB?c#0N#Q7jBS>C!``xVH&pA9a!=${6D9&u7^;leRy;wzB(v#THUD|OADO%TYm`{Br z2AG98I1e*1>tJ-!Bzv1K*X{Or(K}r|h+t??c2BV#H<;3HiF~^&LtqO5jkw%0qcWJ+ z>UCL`69nd)jWQD&9~MU;T1iJe?eBeaVu=<&Qx4xj4yVS>?MUVI@U<^oNI9=d`!~!1 zb7$P>iR3%>0+`M&jyCOP4$ME{Tl7S;T1+NaX`E0#-dO@I7bg08e`%C?!^P-ay~Wdh zO9idivqNqAz{nq60}mi0sN+Ex7%jXe}40~TS2rzG{e$_371~qM|#}0 z3s2_X`HI@LHH>|y;>aaE zDP?Utj%^0r?s{*mwkZm$edOuoJJG2nS4cm8+?3N4IG45~V*s1xni9ZBea>Vp}B_? zwaY6a%c#v%W=tstQi>ZJ2_d!Sl&;b!9(ZGwo;0_n8nu>eGoy5ts;dm#g9PYIac8|^ zWviVMUC2rI&fn#m#p2qPH~Y^%nxz-9zaKudZ;HU+-=Akup{@mBP2YMG9+;URd?K7q zQv23AL94oEpUBK8$^tHfaH87o5E+vMoeCTL_@)QOD<7GY3t8;(2F2^$+g_8cN-Zsi zE+HZ5^&6*nL}aYWY-HI$>P@zD3!1i6#EaDTJPjc(*((a%gfIVvkWO&&-mFgHWjaiK zQZ}VtWRC!0#iWcf7{B zLMbuM^FTjdooen^S8L$sW2=}PRISNK#3V}S$C?Qxsf_Ra{q0yQQb)sRoQ*LU?W&6! z@{Gn%X6x%oLn?nr;#&1xdaJ++nxR*AKxc?I7}>^9>cUU5{Qd#p|Dr46hmH)XO|vAJ zS6heYd-E75vgV^l%?-Mu`1z$+2YuU6vX|e~c^(1tA>KeJR3;R7ezD`df_rc8F89wy z=BSkBEteZFzDKZ9ZoOfGc2dw#GcIz&kf2Lr|Nh&B{AyKy#j-0>;%KtS@ z#tM{e#2{$fpT^>~ANvJ@eqhRc{f~Jy0kI0GlV|ePi!g6Bu6%3*T`!&Zt{EU|EL@-q zI$C-`>f?gzV5#P4oVnCm317fu-bp%13^uTcTS&{HN>NfwuXPy&t-8^at7F6NVCJ?N zH}q7ptWZ2#TU}9L<1(MXeK}k z2Qp&u9Cx#;9c|jzZP#&MsxL`0Iq8qN3L>-6o74Q|WbKshp6?S11{kPDJmUQA4xM!~ zOELt1A$pzKmN~^br>skFwM|=-xDLzA#*{cP4$wh?-9rPM7>96g(W2X;XWL4eL*d^PgA+|wiAAof3PTT|B=&gUW!i%K~V7SwDFpy zW&ykm<{)4E+@CjAd|^1ke^x8&eXXM=5cn?#)$Q(ygM*f9rJl%)aqoYBPC&o@Qu?;`$mx;=bQ@UQ!*q?8Kl#Q3GPRbi=rD36+2y)FUYAc_(lE0jRo(G3($HB-k)HU%~ z6$8iUY~L7X+$bsL!BQ(j&MEaFX|;uoH+py2<2mwAZ6#m$);+&xruY~Cx7X@n9FwSX zYo;)#&ctuWr235(-K*0xZm!>e(x4VX`Ua?j5|ZoD^o_74AAkm$u8Mgf-hUi95JUwB zH|dapZJ|QgE{cpZ>`~pe>MuN8-Cn^@hsG@?J8%Vu4PWSCewVp4;j=Xh0b^EInCIPNSbSoVx{Y=#_vfzS*&Ivy`8%O< zdh2x}C}n}o&jB-|4Q860kY9l^{sT{O#uZrcXD^0Oo6jqE+H+57v15Tg-m zt?e&T#JprMhdoB9dy2-Q8_p(=SuUDjBkv#G@%{ATnP*}(rEg3gDGK;i=VpuEUdr;g zvxVL8O2UR$s)ar!xqKVf{_?=vz`@|K=KDuXe^*yHY`UWLzzr`Ykb8Lz*N#rsC?j^8Ct=%=~y{EM_@1 zFgj$ftL^i>s%ky?|Fs@Hi0_ZTI93jU>jrQ# z56BO|-4V6s4ZyFvdLPpPq)N2saNr>0;BGv&f27+s!kzJz?V?hh04HcT;mlbsdZ>=% z#$<`sZm<3OoBPuxS3}iaStdhUf@2p z3t<2O0z3#1Gq#IPoFt>ALe8-7r9VA7x%d8%G1%RHDSnyQ4q3f z8ykF|)EbPg{&jwdbTXP*G}v`#*C(f1Mim|G|4e8wBT;MPpzEy|Fh*u&Wnd z=s=K5t6!IF(4=WHAal>LA#(8)kLe8X++iw7>Z}C>hc?DZxnv@gY)YyJX(jzYV?_Z&Sa>VGcVE}BI8zVa^6}8$5Xk%*`Fr51O z9>IZQFVK!5yKCO1)^*RjHM)OS$7qM+9Wge6H$rePkPhXwz!qb!>Hf}6_vzr14fjp` zfGwX2^k&mX`a`%R=-~@GroWy%P`fqqNL?-1@h-y|KP&S$SNgMdA=06=3>+%HpI}C0$(_+-i;f>a1!C za8T{RbOi}49RYR+sMybWWL-DZdOv?X33B2S_lJa&2CLEFG`no_i9fK* z6wq=RgfR0PE5-w%w!e4JoxP$2T-R#EZ2+G$`o` z8bQjJ;8pGhX2U-~tyE-Rb571brvcun>m!;w6zHzfd-T8At@c}_KK!24He*Z8vG7*# zzZn!2{rxox4x8&=?l?9CW~^2}kbR9u-5MtRSzj524HL) z=fY{nO((Z+JDqQM58i&0Yg^|G#y9uWx18g8I_#Db&x5vO>xR`f5ynZGkvK^+FpGe? zN;%_A0&AbKMhR<29BxWtr^EqgTnlk`5yMG(xn+vdIZeW$RN9J#JA)75ySKrP2nwh| z1V!l3v-GmG@D`O`Pd9pPwkyaAfX|}0(Qg1H6^f~2cZ1_C9-!zYAbKI2{w2iIakkn?BA$O?|$)uF5p&NhAa+ z-`bK3x_zJ(rZ>~jI|6@tsNJ)6E!N>jYEdv2Q&2?9SxYCx^DWDx5a}ozQXjXALGBmG%S^k>w4`Ohb@EF>haIk1kkm8o zv+7zq{(fBmIHaAio$UehoXCmf+4+rf5{HYNXx!tIWpA7UNgibNP18CGLkC=n5F~XL z$W81MFC4cg!5gh$u53D0hNVCthP?-JuPdWL&LAA)^fyJ2mqr?%jD(9B*#G9m=TRQpm9Mn6EL>X zOrfPjSbxH7)VM~yb6nI1zufX}2%HZsuBoDnamH(!A^sE?vj926b== zUd}}CM;wTY$UzwX|G{jKmo9yncxgVrN;@lY2s8EL5hHbd`q)iel#phImM4A_eBL~! zM*wM{_Roo(_mBqUT9LJt3aq3}J3o|DgJf?}sRW3^Hg!2AQmIkhOm2qBPIyE{-4O zeKY0}@jxj|!r;6QX>3V0l4v5s7HjSxquXyp`o{-bPi9}yJ{8g)bKar4NA2vH$}QHbLXSQsu5|hNEGFOlMNmuh@z%)p}wtN-+zYTNwPQIBENFmW1)3w^(GV z&OlA;m}Yr7RBqT~Tu|2<iR(Jwo$_(W847J>QcmktcxZTMV=q% zos$h&AJ(Z1nM?cco+Fk5vz}xBXz$Q(aU80L`RqzJ%;?~i?T=Kz;Sfy6uzLvmZvNR| z(;HOF(M9kVOxam)yJL`x{h|`zVB z84EBnOhlu6=w0JsOp>A)O6y!mSaaO=Q)!rH8|z5N#esD2C`;5nqBbA_lW`QoxZ@!4 z!rVHn61jw!F^bA%QW6^P(#Ve}rb5MAm(42YpL;)u2d)9wX@ zmP7%AL%&_w`gVs}W?p=*eZaygE+vmT<(O%7?O(dAkqH5<7#Gx_fJH-4q>=J7wcg9R zB{*6`@2!fC5gjwU*1jwvZ_wAD9(?rYd|qcv9k z2XloX+E&v4ywbHQbI)mJh=pA6f)#-_qq2Yb9qbC*Fp&EK_$BVefPPj(YF5NeifT93M2}al^*@`9?VWnN z)$VDP0H%(n@Xa?<7C#3&rqX8hfKneC#+IbRvaLp~Evi~SWxKX@Z^)Kb{_rfw*(*aL z7BU{3&+5YoZ+dN#tlmhGB-WmD*Nqmm5v{d88D*TIBu*3OYprBbP_e{JOan|yG&7B& zVl24ij4&l!#yQ}4JrO=*yl&`znlyuED6Q2D;T8_^`bjasu9z7Mt}IS8i?P>bFjO$G zQYK{-6$zX4kdu;r#;7hR))u{l7!8$*UUG4CgEYwnCaH|8@GkztRXFJ`H$gEMXsn%b znc&%{!Ezog}In^4%~mlM;xZK)_xENDSSb6xBd*Y~1HY?Ft5Lg*`s?sbkDl;j z7q^W26`8T9SY13QA~zm$GxHQwBJm_e6~8s|UeGR6xg4{H0v?5+qdHXDkJz(n zN7VN>%FwS>8@@Df4Xo*s?3y$qUWdgEI^L&} zG-AxQ$_dYFcU^xvAff6N^ohg2&Ns}3Q>p$#$%m#8$CV9E(L znq*B)KQdbl6%0=-Qnp0nKYWjEjybRSseL4hvauhbsBCus7XwOq|mBgwZ_Hw8VtkE1Z8VLqUCHHZE{GL6Ve!P*MO zl=s~}({@tFB%a7a@>L(440th*ew^q}p~v0`#GAaQX5Z1iK~|)J9)-A3>`*GAn3R@fr5<)9V^kKJ`l%jdrQ7lyEiy+u5OH5v zk0sT7I1q_xh1znSH<6@R42<|nx7%@BqzeM=dPrJPNa>YtVq1tdDEvB0W8ABup`{61LZYVtBBZjf4=vK>-IYWq%vaIh5E9 zuZN+OBqqVbRa*n!aT3My>>Mr=eqs8jonLNEoU~mFUBsRgSXC}EhEp+G{ya~~;i?6? zou+0Rv!aqBSYd@7R@jT?4O2NdZy=qEih-5O)a)pmX#mIFgx$ucz0UuERb%HA<4ARO zB8Ajj&K>(^Lxg%ysy8}att7JUp)>-);8kjdLFnQO-3ru`@HY|i=l;8@VrITgf5-%% zQT?HN>nz6jMW`vQOY)_`8>(8q^QxwSgGYf+cKKZ@wt~(}FIc$Twl6`cjok6%>&!dL zq6UWQGx2l@aNdOZc6{@NDh^K=)4{)pvnLkvyA&M|J6tygmIbfHWKKUv(d0?8o7tq~Ac5Q)CmrHZ$|BI|jt$SWK@h~h z$})rs&?F$&gMx%}a1Q3<9GoLd-e5Z7Gi*h9$1FIjX;}1&vL8B{X#|05Bjk95PF4YY z7yC2;BYB$+TT32~>41H0n$Uny9hrtgal5;#OIBBv8?kUV_QZd~u$XygAJ%1g$3HTfF0mlgYn(&M zlY;ZBnl#;wJ==pZZ!@+nvut?@_wkXfxrGHrYSFVxz;f|0T*u|H4XO127ZvKKt?R|h zsR}Vz3F2^Tfbl3EE>mAwZ?qDe?K-;^$B|Va%u7T&YPUOCea1UR(j>Z$h6L23DWCE7 ztY*u3s$|BXaRUY3C&?W}1%HcrSwL-3W(5JY0j^iXJNgx81bj((+%cUc`cF4VSK?3a*ei3GJ+7E#1 zmpf-eFrj zwbv(q9CQI}Q3nZ|x)pFMFpb^r8CxS%mEXNar8w|?E&HqBnQ702VL7HMvgFEmZAhPL z%o8sk);LTj4yRL*z!Vd^RV(ufO~|T@V{<%6L3QF2wQnTA6jhAER8-Mk;@)?%IB;we z;xfV{aFf)98Ok8OcTFc!Q(*Qwlf8`bIdL!M6oysLwy1OHP8I(qb>=_U|5 z+1NRG``dAB1G%GjP4&EoMCuQ&@AH~CE}6#Kw{1=4*nKC-`B&@hEt}SQC`2*-r)1+u zWFap~MSz+^ea{8KVS>{MY2uk~Q!tSlHy;CVwl;=ExB^Yhh~p-MmZmj}Y*>FUl#o@( z&o1W2MTr~K$Jp5*OHn?R&>3urxVljqnapaoE_SySH97AI%Q!w9Nk8=GSmm;&12H^O z%A~Q|l%@w4dTb#D9WfN3BVds%5;cqCjKI8Qb=|0{EfGG#Fu};a5>+OseYIlObX#xv z{`S!Kl60-8mceiEAz_#}mik)Jjg<9$M6N-&JcTor1?y|$KdmCQN`BLJTm@!;Ckdk% zyj}f%M9@G`vCa0>#>;QxWm(CZz!^l$xO*7NJo7&F1~D$WWJ1vtLXgL(6@xS+l#+bv zFa!|@`x=%n2qJq@9tKe7s|X<-t;-=_CgXI71vI5fX(xl7t~xq-hB~VJkUW;`dF@mq z>h!aLF0?M}m}3L{v{|+j&ZCck*FV>^?^CtO70WA_Ee-rzTmEsbO^S!SH<-1HWm{yu z4XA7*Lgy{>9S17s;9$@MTe@Si3c{+#b!FT|R7WJu6vq$*JbWzMMq?v{p|33Ivun&d z2>=MML)6WFUb-D|QUe{dS%fu>%)NkNDl}D##Ix&7mWh-e13(rRdEcA*7NtCJSO7D@ z8E<3D+ikv(fL7A^O+LHM0)vZ9?a7VyDio?-yv;+Zhpitmbm6zb`AG3BqU{^mQmqiq z%1`cxFE?r8>j^R1f=ZJcjZK1U!5Jz`=G}6gM%XhRsVPU*l0@4Dr(ZX*z`2yyQox0F zS|{qKIvf*M{tP-;M!Bq0v8}qW1wD}1v%VR>>2|zPdyBJOsxydX{Vq- zjxwrEfipb}aNq(97Z|X4$J@{{Yv5VIqO#M2rl!+m?y94#o0u=1|!|EhBi1^ZMK!L(fe;jfM2v;kR(yYEp|J4 zB$_$%Xh9zB$RY12CnS4(y66SRWEupf1w$6yfWtKe!?q%yl?iE+t>3s7`%pgP4a5^3 zUoi1Tx92JgV=>cD+-tSj;lmY1YjQrj-c{kke>@ot7aNAFvJ0J;rf9I2=5z_iNDca? zUR!79(;JMvcMsFx_i+uxD#T#@=lx{}BWD6|!VNf!$^&d6@}LCAiaft@E&f77G(?Va zvnUdxTk&&B2}c;KaQ~}>&2B38Fnkz{Y{zU~@x*G7*bOxwaJ`1Ye?4LlK_@0-Ji5^S zA>uttvPi>{4$~+kP}U9N7(GR9^;pgIf+zxk(50lEcIAjMs&K|I-Oj6Z45KrQ4{raM z?hiZl+TlUBb71i7Zl@^wlznFaGn-!md8uZS_4@be>9YnqY|m8G%laa~mi(x-v&bU` zb2|lt@w1;gGqepd$Bc-B|J_Z`)Ad@Uy4QqmlVx@{GlQ9YQxZ(A`!BCuCD8KT^S2tL zSQ+6Y#KWNpFggNG#c&nv=bm;`g#DZ*9x;-~bSzAscG7qg%25o^1qO$OG^xPQwz%i! z1=a0i9Zm}YKIk*$)bArX6P}Nzbtevcsy$j-LZM|YK<2R4NmIoT)`bBDobc?@H90*V zPvolhS%*$-@j}&PXbq*p;f@MEA3>FeBJ+>(U^E+}ppV@K$(a^C?q-bd1-rje(HQs@ zmzB7NfZo#sE+c{H%ABL2mx)!ghx~5w;f^fTu`edWd`WeP|VHy!KGl2_za}}Q7 zujwy3%-(aHMfV>_^y{S$V_+$0L=xF8ANK#>*H&c9UyjF;3u!z4wav7y;pWu0b3)Q1 zwDU}){82xbcI^}RX3!Q+v?`qbOH*(z9P{DP9`_TgMv04YmL^dg1%XdU;JQX-Nsglo z`^y-E$mLClvF=RfC_+%>c~KTx5lUH_^!kXS(x1m%3iFd$IYP<}d%j0`#!kU}^TkWj*>cU_({#oHguY|%0u8iq3r(z5*| zCH;vMb`(=G2hddvG+fmO{`U^8LesA8><+dDzN9hFJtlbe-HL)}nE%0$o|N?BChKiI zw6vt2NgWAnoy|hUuNQ?F@+T|Wez|SN*k(&T9iqUsVeVmhki1R7V;*Acj%#L!4fL!w z>*5(-rdg37u!E2X5IN>J4W`1h2(2u@V-~98{-$I{19NXC{H=ImijYTeUf3t!3J1dD zXTeIW!mM*fz)^XC9PJ4W4%Y(Vjc7!|6I+O3rTYjIg8e{|9X1k8S6Fi$l4jYVn1Pg9 zCU`0ggQ1X1Vd&`O4|0XX4-dAiWamWDOO%uZj!P`%GuL#l#GEQ9wT0j7bWy60rmBsn zp6Ph@&G~vJsUl zE{W$Ub49~$kJs;}SoS6OM3SPNV;>+JwbZ)b$o(Z^%Zbb3#m}67i75?8u5*oH9I` zES4MxFY{eK{V3QQu+*M`Y({JpsnRI6@N89% zNbI)S=r&P8G~0)fp9W!d``CiKLER^c&G+BmW#M(ysb=RlJJz_;gLA#Uy#rtI&vkn; zu@qu6p{#xO=Rn1;ErieNtk^V;+l9jDJs}qy3KP3ut<#n{E?UJZ0k*w^+_`^#w^JLs z`Aq(dJ_&O7$@q*?wGvW_#3&JR zR<`tzU@WzidlZn+jEEJp{pt`&vRZC)#+6_&$%L7JR(To8kbNI1^Q2J`Gmk*sIi<%?;hIOQ@>7dJ!>zy_oW{q~5b6`E zQ?dzCo#cdcC@#)k&R*9Pxc^FZ!!=U(%-ialCOUSmvO?4+7C73*msu8cA*8p|ZHFS) z^L-b!EIHw`0^Kf}I>h&oX>=_#T8a=wv=JjZ)^oeP#C(+FH5FYAZ`~GewWOhqGZsa0 zN>Fpdi-KFU)z0rd(%A*!+VTxPd7}~vZa7%cqb!bb7H@CR!5P`-1G|3y^J%a1!qX(rxQf~mHR#z=tej(cJaTyJsf&iC&0o}d!s)JoN z%j|gL* z(6T4km#*rO!i>Xz5Yk@QHRvQ%~fF3WW zI%`~fRzkJU36B4XTgLFZ7%D$rC&oFKBoM>P#fks=4Xw&CHF^C=C&$^QPo2ND-)c$H zvKVo;KI##=d(#7l*3*@pI%{yw+ zv9l|N)6rU1?FNH2t}TtLA+|Rf1UUCnbbvU8V^A~JazKfmwATIYBZu;e&F;~4q|GeAevmA zEKlXZThT%O`k6zTn(b~;d#V})iY4A9fft0sSd^P|K(UGHf9_2;LxS6ZiW$dbQFK}Z z!zvqqu5mIG(ic)-o4}H}vjk&^Ma!_ax_flA*%;N!NRmFfN{&OOjm9TH^oNnoD#4zW z#F`op+=Kyr%1CNxyhL`ooAg;4B}2fown~FPebf8FJ|#pHm0^h0DnHBx_6F_AwYk*T z7D{WuFxMH1`~9Qd2Hy@EzeV|^SmyJ$3I|O$hr6WfcD84vo+DTzR3~xj3RUGqLu|tC zfWTB2wUdu*z3LIZh=K~wylmUD>>Bv%p-{9b4XJ4ZgfmqSY@!P4FWSwZ-vQCepUhkN z*!Id0Q%qjFgx476?9EqTpKJa{hO3^6Cm>c&i*3`Kj6H6Dyd1?0QH) zFQQ63FUvigW$8xPD>AU8W}HOjde8p2tG$^7At)p^y&Pl4yc)S?lC@0l1x(>ts$;u85mIQ>>#MPg9F3FYMzh12ARoM1$?T~YdyJ8GgDiiu z-ar1-ME#2?A3MCSp8V%G-C(y#vgvAsv=ST9PD|c$qZeKU=+rrGkAAdLyr&9TKYgd8 zx=Lbn0^hH+(dw1!_URiu<#SH*K4E>I9zYK{B#Xi^ZL<{QL!vO-<0D$XWmc>M)rryp zOtO_e=AiZf^h0NhiQz!iF-#3yfM>7>m*Rrea)-#ai0@&KR1#B8pyEhVhd!9ILnmVg zwD%+gS~j$8OlUM{uyHUL2BsKd8%K>yVhmw;;Ebzh(u{>r#1MvnKsOj`LT7!y`cXMy zlz{(gykGkX3k%1AHU2LtZCq6QN$-qdzkwM^mAAN>Inn@yxio*9xjzyMQMLnK5WtZ= zVR*rTY#3Iq`#`j8wT`(X-&NeUT~>5%I7Wr$;1-(RJQeP4M#u$qRENx+g)|x5> z#@dK5Z=k%78HQktQc@vf499KuyeN?r!?G03ay-itjwFdwo*;M*CpelUof%1zyd;Z) zz>owsF97Xe;@Xa#ob|oc2eYZ_L1< zK}P&Ofwev>DQ@=Sm==m%Q{XjXqB>7KBHa7``aq;Oc^%x#2>S)LChea_=28$-t?IUp zu0*=}G%UK9hI3+Oz@k$(7bi(ukKcr#Ih4lnB^GK9EJ_YGFEX39NZvnBKKT6GLcUeB z8N=#Gr6!9TE5P1;++Q}zc);Vv@jFjJ%*wgEBA%Yp@?-?f+REs=sJ z0kshwZ(lh+A0HMT3#F=>YeR94mg>5fRsRo5y%_dow}{@b5$VfQ8Wk&2k#s*zj!`(x%sl2 zuA(2xC4Z8Eh?AXVD0kuKA!u$@p0Bdda)GE`A7rlgH6{14HZAWK-yT?M;dK6e;Y`en zu5Y~@4|nTb;X-Y_KRw><$c;a_o{Gww;hTdwNj%*!+qXe)R&n%=dlXd|90+ydYB(W- zR*QCSO1Aw;y!J^}9`%c@bDN`H;}BJKluZOvbB;S?F+OH?sVT8#LO$>hE zkdutm+VM;s+0EH>yCn-NgYW!xezGN}~aXqo6rB(NK zyS;iqK-FIA$t20DdI{}cVAV|U2N8AGceD<0PFoJzm&V+arNajkK}Mb9j=9bPMq)0m z$4HFyRZpmGSCxj4S#@N!GlCI z*lEs>(rWs#Bs;b3A;4;n|IgV6z^Ta3#uSftRS>LZ?YuT05ewve=zH20cBe06`_Dyb z5=G&l#jzIN6!}akLE3(i#nfi>4S@!rdAL||Q*KaVg+T4dq$o9=HOVAOD{ZRsB^z40rYS51m)Q8`1(5~;W z6-F$=&%Z~=_}l+gV>FeL4eKNxba-^|RQ5`!k&IJzNRp(Br^9^GSUt6vq#MaC7c4m- zgkq;5BqY(n!J|)D&Ws9V`S&J(SqdZQ&I`MkcWR#%cF1cg=2!8%!&3(?gE=uY-Km?g zYEq%!rovif?5UAK1Z|Y>rg2izAWYIUA8;X9TjX&_X<4MGc4cWM%ZqueRW-|L_Mcn? zv@=Hg*q8*CY&D)tt-=3raNWs z<)tCC;_KauJ{il9gfN1xbKGzO#|QK_ueT`JP7>{d9|*d`^Uw|Z)w+#iySfL1b|&A_ z9Zk=#$sC|IeWw9`ccMeO+ZXwmUmM@3m-B~QLqyUi^!hgIzZ%KbI;-*7DjwE{`zR<0 zeso5q{-E!%9a&4CwVm4h zKt0I-(hm8)#)EiY%?jEu0&&DG$=&JO;m1WZ&`Vm3+QI68Xg0xEQ9wQdlI&`-(1HCi zCoE>MREWWrXF6CK|7!7CExiE(DE-&sIH%>>9rPC&AdiwfU)N^|@(^;oW9%F)L!f@- zuem{oRht!`Q)8to+kyM-xaI%kM2e~XN1`Oto{n4VL@vOJF@&1uiZuY}M^X8mbM%l*-J@fEe`)*cd3+4dqP$7LZK;@&KEU3g{C7|eE5?qRdOxyx4i2#Ofy5@JZYMG z*wk%kQ)(s5%>5dWh7L+IC61zwjn(_ye~!hrofEY|wJUNa9CY}=auicw%26Oh$kE=I z16r|jiLMLq;nL$6Y|LNp2rmqE|L2doOdnhMRv4Rje}#M~7rU$cl;NNYdxNtX+eR2v z?8TBvec<%1m>Vq7@dW%S=z(T4wgFGKHo)I!hU#Iq*#B$?3o&2i@Xq^JeF8gsU3e-D z1ub(kbpBfg`MQ_+yQO~bm!m7PFHM@GW~{Zx4+%M{(}>a_0OP^g?scLz zs1S9@WYF>XM{SAX2FRe$%%L1k9+lwbyi<%bJ|9UzdY)$NT*StT9w|bgmmS^uxD(Fg z-t|vKNFJ4-t+D$ty6aTTv?wh;I)y_7j-6yJ&c@m3#o0K!R_c)w&g#s^VH6FB)Jw^^ z*_QyJgGjKlm+__eVnXT7D7UwhCGeQV-80|aMx}9^Y|P^5qiD$KZI1T)5^b~NEE0|; zhGG8O`6ho-*?m78-lKSh8o6~~z~lUQ{cmr4!J2=3H1qPMPYJdq0OfeM+I061l=rza zgJae%eN6uZrqg3K!tWWM@u!R_7&5sUAnRvpHU)kgs5mf1gpgVQ0`|7&#n(LpuN!!(*UOjfdNEBqLJEo}_E>5z*JZ#H$ z9R~#@u%5!ajop>t6HU$Z1NP){#w=%9pu)Uvl{%Elm`Eu3&z862h&4tHd6*dIjPp^g zOx%gac3lGn}2sQH*LR4c5fTIEaBo#xwg-_iq)>lUQpM258DTOPQ5F? zwfK0Z)OKR=;ExiMtA_ZR;?{>X@IlCC{-RG2d5-&|-P-%$%uc)gueoM^+Z7wfd)-Z+ z9lZYY`MOD>691XWNsS~AUb_gpN5?iUR%IOESL?M(*+1uwRsY@CzBfC3mp3w-fnEnK z>6u3zx~b(_GvQ6zj-2vKPpBsv3Ne)G>*oC_E zgD?u^jZH`t9LI$oF(--Qglxl%w#}$$g2iiEf>{SClBA)8@r zjU>WptfMt16*n2ff{wWFnWk|aN3oA1!C(Y&RCDN4?6o6lmSY))rYR~4Se!%|MMvOx zfeu4++>T9?Ax9E~)4(l>V}p}XB$xT+r6>aBOaR0Z4kqlH+y-o_*{1i$U50jj^e6EI z_i4~383IeF!O5WOYH6*e|L(f0g7F%p{WB>}^j~0OL%n=5nq6JBYK$*Y6m*D^b3h0MazKL0}5@Q4} z+`imDNN4fhU5LEc`4C0{5IVJ7-?5l9OUHlpV!6}@D6}pCeXeQkJ8iZSY}knwa5mtw z-i|ll-u{kA+|<^&@XAZo0*{7Gf_{?Yy*@J{*51Wryr$0L(oDu2=$BQMCifTzlr zbsH46cDz;oq%g3V>w(A0mvtLIena(I`IF8tZ%2pVxf0Vb2UlYnX16??XW5D4Fo;G- zXl+dDNO9ZY#Px{nPLoNQqK|h6SZ5r;o-nOC=4{5~XgwtRVyJGho1fGuc{=b+|2o|cx*frOQ>h~J}-bLS!2~c28D^H zVWyE4qdM0ui;VO?`>Q=>l>&6-wS7du^!9Cc50cz9Yb*I2VsXC^1- zG3XPMp&twG(@VST0?VYuP_+I(`L#y0P)B*uj$B{Xwi>&?;dTr68D+xqK~#!(`O zB>L@sLu=7%ui@3w-d%s>k0IoGj$CK9^10kVDmjpyAz|RBp-^9oN6mp~Uw0%qmDbk$W%fH6K*H|PGdXknvUhYG=`2NoEFfQ_ zI1B%Ha)Ay27qf^S;`R@^$p|bK3>2b)6n@NxEJVpHF+I;$aag z*kM9H8L_|Dmxvz{-yuE%8sLA#=@9-Y%8aOez-ny|fr#_dHsArN?{TKiWEYpn zfFg?bcTJ9LUPgR9?W|8>x}Zc5oXzt5u%Lg8Q&N_NX&WQ;47xmq&^5&vjA+Dyjw;YV zwQQVMa$u{EPLe1LTwM_PUQfG-iohv0gsHab6XcqvB!Cba_I+%2HNytIB8S%z>sy6w zR+5d0wU1caNxUsdDU>eqGj~L`<%YlnEq&aV z*fTxl3fom#QPo}7nAIW*dtHjH&^o6>$_J#zQJ)!J^$UxNU+FTB;6r(6xC;B`>umeM+ZiAKd$-_Da4c#IxVJ*VNWTgQI!`!-TWKil zMAqT-)}Am%?y@7QPJU|fIh@cWO^<~<{uGk&#ACTt?{4y|qH_YD3l7Y4ZM(6Neomka zx(4~%?1Uy&f$_SQ4#{$$36bv|Cot4oW6-b=vUJV#G3XBtUd*+^e&1S~IPRGflMaa$ z;KfIGlItf&1T4jDC$+~uqjAT)B1oK7o{|Y5fNXaiP@;~-O)+gGH9t@XJEc6vVh%1r z7wKvQw5K(35^D1%%XT_tNL`EJ=_C(>9Y=9dK3ozMg9&d4ze+_lPey_dm+)wV?Vao))<4WjL>vsT)QBjqy> z<2YMh^$ktRMdNQEceanKW!oCsqN-qQlZr)|AS;%lsJ76PZ?-70OyYW?sRMs5rEX|) zHFz>GYI~QO-p27qhi`A0EDxps__rk!&2|#&eMUL`g2IcOMVyjwhP~?1CSu1|kZ;>{ z8XI9ME?aq(s=8stLv<&FQiafy3|R<`QqFgjm31wV!z0$9bo`{SQU{NNGnp6rHb^`v z+02Yi*)x4o*10~gyvX#;miF}7=+Ub(#t42lL^%qQySAm*86;v?@0Wg)Z&OB`m>#yP zmekWqsj972gLa-ptLkj51C-nbuq8Ecra|AeL3&VO8%{?mcEmVc@Tk@UJ3zgIL8%7@ zT)P4OHq)g%Q#rlLKqD<9zBcOiV(Tn>lR?meGZqV(evUyCr8SabvELF11^03>uDzC3 zDaa8M#&B?^TyS#Ge4vLd?|au_rysEd{XhjAf+vuK;2pXA^lS-Ugl7VZh}!KaCeAAz z2gZrk27ojAf@!s3?c7dZ$}OCxHzvfOK+C96T4!6OW^i57j;NAi>n&Aww;s+%G){cp2A#!b&7feHu6;a|@mgA@`+P>dm4V~lFGRQFd zJ$lo9q{#l#3l4?gn3hR@DoBg45U7_yWVMnp|G-lKVKC7TQ{io3X<3v~0)1|k8{Gzb z)@E7|^5**J@A7Ra66JSZ`u@(%Y)ray{yD8v=C$s+*|5lYs~T*pnLbT7z?R&=s}}C= zZj{>X`fk@2kIzupaP1~5_NU!111{Op_)0$0E}1Z00(erytjn%A*JYoOznFvAKiMo6 zj23y(aQ9NEu^#@1zIk5_7d) zx(W{|w>|@@hw@(5Pqm_-0Ah4DZ363tYAnDJXh#%80>>>PbuLOY&9;Mk#mO@~>Us=% z7y;q_r(?u1_4W{u!K>yll}7D^epsydg3@%%BGD;;yMngqyzpRe0X>*zc^Jf=HP`-OpsRmCd2b zx?tttaA%$&haa@h#V>BQt=DNN&0W(YfnU7#o(G$Evda14khiHJYn&*JQgMCl_e_TV zLp{9qYRxgL;r z&K@jJhX$LuEEK(H-@pUxpU!m59s8Yb)BF?0MQKIF9!ibol}}&j50BKb`D~KDB>#)! zXVVZ7^bpv%`{;w0FvuG*NipVFXG_IG4M)t3=l}Z;?BMeunnY((&6Crn&zN5SGxEOu z@P$8jpIWM%t>T&Tp+!lS2C!vBHw$-T3!z_A!wjYfa`21 zAQ_W9mTb_Q)qu?Y~r3j$=M3OTt>P)i6r}e=i zmTou%affq`?MN{d|5=}~VBvuOODZKz1(dZGy+&_G^vP&5mJH;H2NAA<@6W4V$T%!S zLnwH@76{g;w9~5n5E<1FA~q6d}%ckpq_*vD}P!n0gxzSdSVl{CzR>GA3^yh**Q zdQUS0;KxbOpw>21?SyIU!EMzSZ~qpgiski7@np-I>MQO$g6K>}Ks2JCL^%ws7@a@& zs#bJzbgDBMVSvozV0+m45ltW{m6;^4X3C za=mGu6VvAA$yjbR?w0vwjXGwVVVY4iW7mwL8N3-qGZW1yn&nI<&|ap5%lZ1o%z&jY zhrs830{*xgh@}|}KAAViTb}{n%&s@+U8#pacSn2s58-10Q%EN8v@YE1SgRmaoG?eU zpt5{W^>J`C?dZg4OhX4ozAWA&YN*~oU#m?6QDg&;pf5W!)HP4z74)^rh*+h44tNF? z;7qxSvp;bjLK6(I#j$z`bvI2VAB%)zpS-kmc4<1^LSL3mmSS(>G4v;y(ej1#zrbrK z+R%pSXhT(SZ<9O_{X5CSt|fIk?M73O3`>LOOnW1CKGnI`D2|A8S~D1r&jG8alvBH4_e&sC7KZ>LaU7GO3vwZ zo*kTTrT{~6O7Yt&&%;+$P4^e_soD}>6&Nng=Q=>>H)x1!*uMbA%l=H+`sacbLI@^B zYNmV2i7VMpp1k2a>YY7r9ClRL4_u5r*H4BP@se)RI8O6Cn|K4}w1}>fD^^XRNi$Va z7p1-PLZYPDC}U9D=NR0=aUzXGbFxiyW?V|MygwEJ5!klNilat8hFI0M8mYD;{^fYY zp;{~KYC=_6VJG$hVx!TP;>1vJebI5Td)YXfQm}IJ7b5pM{&=-J{CDVC_)q6geo^YV z34Ecg{k|iMt{Ar}`4$msN?KV7w&m=>KOx(38d%LPHSc$TCl|D5s0?KP4mdMbrpT-PlG}R?zvb z2CO7XL~Zok|w|b1CgdBE}^|?OD=VGv0|KM z5dMG6JrT`!D*Q{(JuUk@@)zWP3K|NEsw5r59y+W=`aU$CtB^`fhsoTb)v6S7y+&g+ z+g&cZ!`!9UDMVs<{%&0zx(kwuFno{aLW1gPS{XnY};g8r(Kh1-=d2y~&41{W93UILB;8UktmviPqr2^4oPB zyguG6-+=SyeAy*}|CG83#z%|0_T9$Gr_05_F6k?*^^)*J9qgE51x=vH8)%sQUH@e6 zQ9AfvPEoiw1F7OxKSd?_Q{hA=CGfBK^W|g9CuGL^*%f~!d~A`KA1Cg~4vY|h!bpsK zS|7fLD**Y0J&GCz1e&M&IRVqhu<7@v3Yh=$X2{c5-Wsnepbl4{6z?%IM*%4W5wsZH z2ZwH^k?Zs}LL(E?TP>)PU|9fY(W598&bO9?6CYI+LuLbZDJg%jo^v|P-YN~bP6PAG zPV*Oej_VCh!{KO9Q`KN7jK=Fgez^r@{RowKfvAM4gaRQ* znm9@dxs;FX?}Py2;LFRtI~x_yU{?K4-j{5c@sY`- zG;BQJ$l*9iN;&0-y9C2BG~&CNP0=%lV<@s?d%OfS+1K%{X^9sBRaP~v5c4@TMDE>5 zj{M5s{kJS}JxFRvh~lh{m^xDSLl6+mH^+)jHD2O&AJ)VRq(tYErT1DzM^{9-tHb z)s@1jY)zJERFqKuI@kS=(q$Z%JhWXL%iz1HsyZ7N#xtSBrFJl{^SmnJwV8@+-O)mn zwg+vg7Gro*%=K`h43|OgfX<>X|Ovb z&%$n_&N|v-diuOme*D!P!g|2Pcxmo2)hY%ZJ zjUWgkCg9AA!W5zqKr6*@pYewXg643VT;rgD8_>i?$zxR!X5wz#gPE9lFn)kgF_cHP zY1g5x9%)MizNn(8yqmp@ z5SEp0KDeOS4fs}CVc9EJ2+7j)GjIRX+H&;C7bVwO+-cBUw$gvhZxVS=%XETIIHZPLc1 z6H5ZaL`c4oLU{b}kt-b%8x)YbGQ-DBfs0oN=k1^p2%b0Nj1o>l0$s-73OXV(2{K)q z3?cSr(+YE7;=~r6g~esJJaqHK)A!f$;Pt7kGeY4=G@dVK@y#$&J|?q9uNgx_fE(fk zn#72~9V&rB8@+{U7mdHEYP~g4!nOM+E}bXi)n+l^OSMtdt-(iNf57aJM5jgf{h_xk zkw^Fgrv@ViNq(Qt9I3jNa858gXj}r{rtwHg@Xi7&=P+I9q4p}_%_k=rpncP-nvzLE zYlR4i$X7s|aYVb*Z+vBlhM0@%a2IA`ddp*{cFWQf!yynsjosE7f-R{M*KR2i+h`lu zK{~s`@uH&25cq@FDw*|}$$l`IRMEW`))(>$r^Qw8+bou7u_aubm+jiE%Rk$$%&f)T zgn@chOTAd$ZFM9q3O$W^=fAJPJ==pk`!E+sS3}Z!H{GqYcDLV%CWl5ke*)%1^3zdT zu|~hxLm>;_Hs0mUS3Dk5>+8oC-0pES6b^YB9#1t;_thir$`v%+mOQ==s#@1$6L>)< z!RAcD&l$tbUX|7cv0z~rc@G8?#2LTTqgU~E@(1?obVvxss)1B4{*IgW#&Cq>$ES!d z5Hxsj@HNZTb|}jR`Y7U4Tl};iR|_P3Xi+$wVxA-0y%SyX(teySqUC#?&UU_bB-q=| zPV~5V2@jX$uuZ~{M*ZXd&8b+il}SD%tF$bVB%whxP;HsTVVnRJ8Ba@K2M<)$+dD|! z+_L6rapBB3BI^V$V{dyEgib(h>w)XPvn4ZQ>aJ6$cmQhp!3o{$pb zYWhe=klC9_mCGrx3W%@~M2d`wfII}zP)dLS1EFF7tf{7B!zgHjQU%o&T?}4%3dDnk zEt5V|htmh2g>2{XhoF5Q4X)jzn!Az=966-+#iRRuzz+^AUwbE}I@V}dNX)@Yoz8hf z@utu80=u*9PxdRMti7)g@tewRpG_>S;xs@4jCsvu$cv-pxxu%=uoxT~%E+sESy^&h z?jy|fx}8p!6GTarmEKm>+pUN^*J*>EG;7+BVv43AH4@)T+X_@&^F?JVn;A@G4wKQb zYyU(l>*YjPGlO$!_J-TVkZfj@=^kZsVKowMmamRfmWCvRr<@Zlx6C_Qt7~(09?j0$ zL)kX4G*2BKAV*M#s}$C?Ox;jDx+sdOYxve3q9(1RXb9EjoP;vg$FMm#0wETt9CKOC zOofKYKM3!a$%fr7S&~GC849jH;CNA%13D#>1kf>m{{u^0yv zj0poNe>It4O~xCrF{$IR4k&|$E)_pr2lVEsr&f!E7lXMOA^BojJ+H-py=vPjn3&Yw9uou!|o5`#z zHnz**uefJhI40--A_LJ!M>wL7-Pi?0f{ra16I#rSDGTPGii6m{a{F$wWu-=}274zg zK0EnZly|-_0h`N&8Hx-A)LrHx!Upmr>==tEDQgdlHDKKXuCrn~mJUkXyIV!bftt%s zPZ*cm3}K7o(P1YD#*BEYKx$>ms9T`^axEt2rKRuYZH*2k^jM#3d}!4JKD=%_t&$JuE77zK!=*38XL-mVG)t9d! zZc^V~LcO$qniz#`jy#7anX!;0pN&oe#p%{o4f?$$e91A1Za^_0K{goem@S7plniwO>Za zYVt8i#wvnsTA{ijNs*ABj)B(mnEgky%k>qujXW8HS) zy-)7!3yU@6j@mgRHPhDXrzDa70qpG&-{Pe@`HomIiup*}fX|jtb!;}W_tM?pquTz) z>DqE#7rUT+K(IQe{uDz%7Loi0Ay<)8VMM{rcIKvyC)~u#< z(Sp7cn!lN*-I6oq_BlhoCb@cqud|Lut9CrjnDgLk!|!;!ocFNfd^j_;567gEn9p_? zG~n+nH4MOHAfBeqB5{ zrz`PA;`i_#v@6oWm8FJAVLbXn0gZ0q4N($gL# zmLv9Ga1v>98`RZ|+L@(=^f7a4 z;2sk*+M(H#6;OvVlI6Nc&Cq%bu^qexXfNmpx6 z3)L2_u98`RX45rTK#2G!v!0Z*&3d?>+fJ0G3s5L|0Nk>JVgLXD literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/inter-italic-cyrillic.By2_1cv3.woff2 b/previews/PR239/assets/inter-italic-cyrillic.By2_1cv3.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..def40a4f658cf8a9f7029c98931f5c9ff5a00910 GIT binary patch literal 31300 zcmV(?K-a%_Pew8T0RR910D43K6951J0MIl50C~{>1ONa400000000000000000000 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 literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/inter-italic-greek.DJ8dCoTZ.woff2 b/previews/PR239/assets/inter-italic-greek.DJ8dCoTZ.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a3c16ca40b2a8f454c34cfa91996ec99ae2e4aa0 GIT binary patch literal 32564 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 b6r&82^QQ+ZZ1?Zre-i}g|91_a`#}W>14e7b literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/inter-italic-latin-ext.CN1xVJS-.woff2 b/previews/PR239/assets/inter-italic-latin-ext.CN1xVJS-.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2210a899edaeb06655f7bc50e7f94444da140b94 GIT binary patch literal 120840 zcmV)DK*7IvPew8T0RR910oVut6951J1HHHa0oRcL1ONa400000000000000000000 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̍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�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

l(X_I+GK&R zpZv6rUCvOiOW)8SLV&5<(q6Z$bq3Ukwf8@wvq-m0Hwf)^lQ*A}1V}+(E_^gSwDcCS z>q|@HHjdVbrrBf4$OtpJ%3?#v>oQA`7KMO}Rssa^*hKGK<2>{Q9ba`_M#-@io>=yM z1n+qdbL;$CIUl?V^+K7dgtpI1X1f2(eXk?!9u>y5FW%H~I;)m3uh)K>MJ2ghkAN}1 z-jys|kk;-;^+p8sk!d_S-OuaOAFa|Wpx+4E5|*<>Ac9sr3$*FjUVe%2i2 z`L#Q=SO==azQdtV9kDaN`&FJ{6D&SAkqajSk8ybWq~D`hA=M z91emMl>snTEJ217m5CWJda50*meNPq$UY8FVmnzjT6CmLb1TK~u@JglXgrvim0~<_$*(n)_ z`wPj{qL=jf+4GOSOocmmiw;IH{NRBguA;? zdDDV9Tj83dXC#s9QKX_fQ^T?AGh9DaCI?GZ-y{fj8+^p5XnTYD1 zz<4%cuxY3@T&0LiI$`2_YuWb(Cr$NqymhisSzP|*)}@B@<_WncdloPVKyGOkSK>8; zN<(@$vz|6Xs&^voR^Tp_7Pbn!BK`+H0jG! zM`f=2kYcRqoC$-KZ(*0iVDsC3A{R=2kZe)sU%WwGdK!fHdCmf^B&`2)bMfk)u3x-u zF5dh5%QmbyP<#PZ7f`%eT}+f?iMCmXEpu!FAMgRDHq`{PrNi>Gg6?4$vu;F$-pQb6 z*C-@~o-bV}Imd`gnmXya;2IZ(WU_(CJ=D`rC;@UFM_%QNvWASCgXZ76KfypyFFd;l z(BUkU!%q+8&JE+xu${B0noi6*)KP-^EKjLhn*2w{xl=!if82Q1oCzdP&AZfbidx7s z>Xu|{1*N+tinepF_t1#lX1-WN;i%?aVnu#0dwL}>yz>p}kXsw9T_en$plnN-t{iID}<&2g~U9MShGQq4_KmUX@q#RDS3N_IgNDkV!$ zX~Mbpgx28JM_p_$1&1P>Dfn{`BAH54Rg=S6sTWArdS(`72{lp z-0QmFHpmn@ol>EYi5rwMX|vAM+G;WDbt*-JpiU%tV_q&1i~qipN`magQUmy0X;RIL z#d;?@R(PD;#y7N4^roWEcsb|5jCL#jq-7#1BqO2q1=AgOq6RZJlKQQwwvkES+ z4!6n|WtuW>4mIEQz5+9X!BWJ)5JnM_V5f{wB*9+rY%0inj?8k7diOQ|1vpk}_eVCZ zhnn<}uy$2=tZ7G+JL}KR{^j8M^>KL{^^j?XLgm18`-OfCJWaA#KcnzwGxtRkU+>>8 zyTirT?W4%_)#g(0AM$wt-E3al4-UPmG})%3=qa`HDBd1xmX*F$W7*mvg# zGAX>;)G{(Q3mL0PMut2bg)+8C*FDwmHt_2-mySn306+o@q=b7vi#*(H?3A7JnD$Q640?v7U&+zzd?ByGcvh**_^u{O%hz9Q2Jesc6`g}0g;h$U< z48vX2*IQu}ii%2U%QVsO^tsjDCrABwn>8T0w;#}e0l#nvG{?}#J;VX(+A(KL1XK#~ zM}MAG@&(MLVpu6)ZT1gYIVkYYlE>6QY>wKULu-CN8R_?ivgv?v6FM^;d7f-BqB-Kc zE!?X~*Bw&D0H2CG2%|5fX7d0Z`3cu>a-C_~7?6ktitz?G?^z*AB_(xyz&?thSf)&L z89IbK&x-a!aGb!r`*OUIG8*z8m~)Ggge`i=KhaHs;V5$A2ZrXBJtl|;zkbj6-k-kG zXZF2J_wuc?lyXLI`k+{oKu6OpB=(#S_zr*51o5287Vr2N2LH z^-jj)=GZ)1Kj8Pvx2wI$!er%_~=|TxDU* zT=*XM{++CSYk10oAiuhIKj&P7)A$d z+Wu+4_5MlMUtdCV*lMSv$|u+>EsAVS=`fVfis`Gu)D4+&YR#O3)(+fUb1Gv6yr9M` zuL?qh+7jc7xd0JdRRhT&Au0i_3#WM?bkL0^!(-n}u#^Snj397BLdr@(6KJ?AWzFb{ zZg>eVl}hXe*=kHh>Hm4Lm(z-@a2v{^AiE%nq6lyBWaX`@kh6707DG0mAVDmcx3P7k zHlPq-D}h@ys?cXlTOO;vAnI$al!$v6r$OGhWp(_rZsQ8jw{w_w58eIOmNX7Y>(SZf zL|{XpDhwCPwfB%le7ny_uiRs|iJ^tdmINVi;(Hqzi*@*-;7ma{rf*#-Avdn*r2soB@{-)5`GuBXd} z_5aM+%W1<@xb;li;yh^=ZRZW1X}s0b$=TF!8xSB#)NM-F;t?{`Ed#U_xJ2EdG`?s{ z%w?FR#)~|^oMt%$uERBJUCtu6NK z8dyp4x}JuQOAQn|>3%fLQV$(%=Q+Uivz#ELzB+OF40}@ZeAyn&=8m7OL3xafE7xFu z7@H*i=e$(kyv&n;)Zg)>Eg{Ca;-RTq)CC4RFK)XPMEr=}cm*$!^Km#U942FYBo_mA ztG;*o)suOXw2+i``-xz!gy9|OzwTze?CG+Zbjk=u%d_8+d9N)P>vY(y?QN1? zQZSuCcG9{uI4Z4Yw$I460nd%fdXi3j!!gcw=G^ODK%-v22X-fZU|ZvY<7STtb+HBa zY`U-Z&9HDC4f_HCkDk$*w5Od)M|aF}A0{%|%Q8}z=y@1hGzPFT5T{ldsYXhg(3!0b zr{u6BmJh@_Q@-mbV@i@*cd3x-@hKPKHRWl&-a;Dq~R>_b=XBLK$?3VZvdmO zM#0r(qeoH$PP<1jk~Q%C?jSyXHu+v!lJdO7Wg?g!L%A3O9{Gl z)B*{O0HMbIZPXl@POEN37I}hkPc4=?UQ`sr1jURa;Ee{Oo^Cpflt!ukNeM&rn}HoV zwZGXDZYTj@qj4F$?0wjYIn}V*`Co(&g2vkA)lcwYcf8tLS|;{2y4&+tt8tv^6yp>5 z7xZdZ`ef`OD1x#cemQNFxa*xUh%y7)ufS^SgN;t;CRiO3gV$fpWCUb;I+SdT8uI*h zpxcWAGT>`WHq@839UDLG+I`+aHh}*;_J1?;%0GdplrJOb^1BPQDyJZ)3jzVm;s0fx zID^+o0FVJyt!gEUvWfslNE)20qb$oKy*zD*+RBa&eHa)h%0-rt)a-#6n#l@bklSEX zFRQd|rmi}v2kJJWz{}L<(=2_Y@D)x1-?A*6lt13X+}6N(^ZI4F0juy$DFC`xr=k#n z>O}bQ1XO*pk~7YO@R9HGxJeIse@|#>>_V&#cIYlkGc~fDTXhM`w*I9@Il_he z?~OK->=u$KK%fqet~5Dt7{`pY07u3frs4A$6sP#|z#IGj#fJb0fB?$QjNa;f#HSX| z4FJID`MJxo_=DPL`l$CYql;zy;nhz5caUz}okw)^pnW(tKjewdC4z$sD4oy+ z_*c7%$i-bUGtdehd&`AYjAr6TT{1O4J*WZqsaoQkhOUhly33{g931MeaJR<+Z3&3E zc#OKc)`DNO@vT2;Ct-SknEa?#i(k;myxg8tUejK{8y_C{sE$KvVF5xcw|7|cQ8lLG zjj?r14}i39Lqwp(yJl^1dECNWH%vX-2A*$40^rTqr@FhpFx;LSxCzz=>x0!cekN5k8mlkEP%Swz~*euS$E zuBbMliUCLgD-b0_AUOx=pR@>b40wuRK91_s_+DQUH1`xuj#s-LzHEPFSUqd~f$0DS z1K8&ZJ123HH2iB?e~ou*;(PQDizsUM@aiy&#rkdhV4Mg&u-aK%0-eN7 zIlHc)Dr{U5okmx1bMTB+h3lNqB{I<8`|)%_{GzMld*E(DB*j+!%j9#b;axJ`s&7sP zn&h?c9vM+mA1T_R5)_*F81*&8^&VbqMTkcdu;Pn*BLuFIk^SK}70p2aPT(oQ*LFN@ zxmIUJTm}LXrsbyrgj5SLMB;NCuPeBPfJB*Zi-zPNZxjb9SP&1KI!FLYk4l6;HcJ8* z5t5OL>r&vL(m~vSj66L9U zIM^ly2$p(wd4gH*!l(!pO)`OGj<{r77p!zq$)JTM|aR4aD zUQF`;2}^Z|+R=17Apm9FS!`#bJi0NP#wt|JvAc2l=^8>^)py(;^SqQ-8;_=_B`vmR z;xT1;{Wh7tIilqgjel4Lp}d!N(y1`9VfqCokrf?Q^dmWb;Ofk14S!3wfkG$>-P>p z{oYznc>f=9cOlEHFdAV%7_tgk9~Om-Mp7PiP7@{j256gcNr-?b2sSDXBZnBpD(zU7 z%f>~f>vF!2v9c1QF#(11;C`OA^?&XJLy3W+y=&w~`JxBdeetVvhQUb8z`{ZWi%4y( z0&Anf7ykI0^?wp4K`J&Kxu*K{#N^ip=sZ{1yX#%?nn59&EIv^j#|xt=V|Wq&z(u$LUxOm zVr1o_^>dPfssd)&x+=mC1a|&UXZc5x?WH4tE(k@Rrbz`j)=^RCU741#V_x>!tkDoc zAh$S654`gnzYkj!(1!&cW*pVLdH(;WYPJ3Mi*&uSs*B@KuT&ukllvla3ECrq(@aW)h;KxQ;M39KPmU=FI5LfuJU1JyF*${$g7lh zG4Jz!pVpHX+ieeg-|uxcXE*K5O$CLHFpko0dQ}ql2mfDxrLFHi6KP~XXgcB!uxQMZ z##+rAEs;z#Mp~k8q=ZW%D3dNHMboEgQ-|S^!|FX5%-p(ZRx_x7_&T!ueRxaK8Epu1 zkYiZ{5sM>prBC`V+iF&Wnw;2rz>{F}KM;{=Nj9Um&C?Ll`G=h5Xnst({nAa0*GwXk ztN%TMCMSk(nm^}33$sEnIW9PO2toQHA|@+KUa75s(1cJ$=t!VT4>cq0I0%yn(+IN( z%v)gDGId1OQOtID>`2Pq*xhJb7}Q1_(~Ff*cdLX@7KHd$$dJ0xksH1|Gyy zcn4qLXZBA`)>iC_qi_xTPg7-0|GC*T9yLf|K|OB|c=aBDy8E_VI+;CJhyX#|cXYp@ z6{VV-tJ}EQYCK=we*N2I5I`_j^8ys0L)zbf+q1&XZ#oPB7SKmz~R`@3SfHKT3}r`Hf%rL>wPqIA6Q_E3eS3xnZzwZ2tQQ zt8LlfCEpGz#Ax3a80aE#6 z|MlHhQ2y$LS3chPT`d2#rpoz_=uACuw{RWZy`W3Jzq5smA z6Jl`k%E|5UQU6x$phx(8xArKX?e@-GUf5~zLwD~C)S**5+xX~xwSU}se&_IcEG@cVE*kps2ngK^Mgfc z^jjo`FLlzU0gYZ{K7=F^WW3x8Vk!v0r)FawYu=`@!S}#>Mm6|i08+P_qoxBM>DAzW zg&V`-rwijG1Q)9$6CykcmyRWqXQ{#`NA3sq@zc(wE2q&#Y$u@<+&o!hbNRmvgM*7l zKtzU^th|Dvl8Po(9lCVuQPZd2fI&lsjTkp++N}8tlqClS77iW(Q64gid{hM(SlEh{ z;we{wPe4dSOsZN9ITbZ69W#ptRyIwV*|lip;M9hx->@5KlLtQd9dW=aA|g9zQ6801 z8*Nb$x)_eh_#28Cj6s6(LAy*yOmb40joFcPsn6m5S59VScH~GE$_HXqa3vI`Fhwt6 zX{))H>O>WlwhZO2qN=T)!dk%=jcQb9c7F3(-j;6fnl`k%|F)t>21mFfVq^~*Pn9=H z%>*K54gqMjm+Ke_>zxD&>|BM(=4<;*(dBIVO10X;rrvC(we)0Kg;!udMQmThbmcGm z3hvi-JH5jwm$}wO7pHJbp#ktd3#fKT@-eKgWSb?h zi1!+59)+{zSLj~d3;tRj2y4wsI>aP6=ZL)I%@UcaEB>rb+N3W`h|;a~w6=Ji*%MMnUvHQeX6hJivRP}9 z(LdAYVV{K@GHX?2BiCA}Y*!UEg4yMu^>>;HZMhUp-$e|XTIo>GuTqGPM%CLY^%2^* zMYGlWUtY42Ib9LAF~~;cj|l* z%~IoXO@~S)$zD`dfdjJ#=|=2Gb3}ieggA@{3GdArzMXrrjph&fG;6>*lnAD1tCFzB zC)E)EO)hm}VM}uFSu1&y`8{MpIP1x6{fx>DkGZMQx7~j#2~D9QbPUC06qM97Hy>=c z$tdkX!8L$mlbh|_1353W$$+AG4}y2Al` z&Rx-dmiFkFlH}-0V0WwMt=cKwc%C~2@8u(sc`AhBfS6nrI`nphKb#sCq*3hCy73|{ z5I?4o7Q{8100Yv~$b`aXDHnTWQ2A8IXOjsMx~7v^yV4$x&MDtP|MU%FE0-F{oHby~ z_p~S0ZvLkoX$7+#;~TG&USR6{WP4*uo4AeK^eBJu0f@f=zbT=^aA{w50RKIn-mi$8 zzvsWuPu9JivFB^uR(AhD^pKOBnFV#Odt5gwF4;WW-3FbLN(}R;s5PSISEEQ{wqLb= zsBPEf4{_2#sz*B?nF_^uM6y3ETq|GX=~S00bcvPjQfW8ofqHd`>t~B?j7fx4v)lj2 zY)9QahRFC-n`?*<&--KRhj4u8|`iTFA3P#lU@uAmtZE&&4o39IYjPcf; znga`Kmwe$-=Ot0|-H490?VB4VKiA@2{2ik5y9u6`%{7^~>2!naY20@99Hu1AYPwk; z*4ize9Q$TGpI)~M9*Oq2>BIjeF($W&%KOH)iKNd-o8_dZ*qh|;`Poo@uALfzxI)vh z<@2Xwd^eh1O3_HAD9@dcB8zPD$fpd&lu#BqIjTsl)J9cmKfc3~&4oRQSDb0v;#<9ffxX1A$;Kkw*@c)5(0_@!gQSJ1y_lkL6AWyJwR8T zIHE~WgY3Z&Lz8K=>9j7QS+yk z6ovSP(ZCgm?MgfhJxEXh-uVV#|ay0|zTl>z(>F)9aR8;c1wj`ncjRMttB4q3`m43PmDcp+kq z96A6jmb?XS0JfDr3M(F90}6tJqlCy1p*2a<4hV#Yih&zXD94Eggn(k;`J4;H0U;A2 z=75FZ-~-~lwrOju78;Qj3RVbklw`y8wl6T=>BopU5gpAh?Vj~}R!gj!hG9ckFXS*Inq+!8P1V{-N<&(e?;0iD?aN=!X zN3)?aCtaq~qQV{zR9cu0o1^Dq@R@a@qYC|9gw|r80>Th+oM8YXirX~8R+Lt3Y`&5X zQ`f(-D)R6%MPQ3?^jh#_ak4hf*U)dM!o9;r+u>ZQ-eAy}ZSE&mrxA6B6C%1e=fs|D ze@$-GsI6 zhwju}j}D4&qK8k^Ub`}UO??eHd^_}k8h#XaEp_;v@LI(1$K+=z@7E^po-ZFaZ9m|7 zB#7U2?IF{>BOd>!otX9EQSRwI6N@$~e==DYhpI$>G=vMUc+mmj)$$hz|U$|=V? z(vPQHu5aFdVDw#H!T3Aav(BLW_Wc*;3Tr=*>;JU=toi%bRub|aoMC_Z)Cx)b+|#pb z(uo(}^5DiVFJBW^qRJ1R)6RIe+wcEs%Vi`U<1dSL^$(lw>dY5ckKQOeJA3#xe9^sd zFFE7t+gl(1b)_TA-!Z@w2LJ%qzE}1o-{0Bz8v>t8?EYcT-Hi}v4sExKaNhjbbl~Bo z9Pdl;{c_31i*WtQI(-uM+-!~+1h4K?5=_9}$-X~;V|R6Pk3+>h_C+6f?^WNMhl2b4 zcOy{suM7T}^e8;;s#1LO{ZIw!vS$1%H9 zo-zjYZbx2m6`3cr|C!7j03Zv)JT{$_v)U0f_SA2c@rr=mdg~5V|Ds{}0Y9k_${P9_b==~;CbQ!g1U2IZX zjaFK(4+22?WgwRWs*tW_dvbH-;ab*nfG;@tF~iTXa5`+-=7|p^PU%BdIV#`C%b03Znryy}R3Z zB~UjqfMhOhL-_v}#Qg8?-(;$JG?P}|V=ESHOMVDIZM6JwiUt8rMc}~_!*Oys)L{dc zw);=^6HsyDw!PYZ1 zH%(}98+0^f-n>bsK&M_7TQ$$97`J1^Wc)x3R0XX`fI3Dcu62=5zb3w_j=GL}=C&Pw za&6Dyu*rn3o*60Q~Q`GpV zs|?vShC|pCi<5J(iGxV{CNsi+EX*}>(yXl#QD4Zp2Cx|_pnfFOBgb&hb}K{N8wezk zX??ZpYy_D>moy7(B7G^xc5scZ#umB3R5m#?k_wyZHoK;7U#iz(yOmpWvsAQ}4la~; z;u$HDdROF(cc?uf6aLz8bJsCFaDgS#B|7f#?9Y8`$l>-Jq&$Q_0qf zb6mbVqJ!Ud88PjW?5MB9@fSpUn#NxH*o1}s zeKuK~`c44bmuVEJ*Ir|n28kgSV=y%L;k%zzk6{7^{ahm}#+QZR7Txl(>WF!mcCFvj z%r*#gC1WWiCn+YPs`#>NtykP6%M7_Gs|nLn7)4ia{604+V=@rQ$Y3hm3%5qotQtm| ziF0*T$dRO7QsRq=BzQ`g)49QP7p|uT&)L zC}vW>lq8oUI(qL?wUiTPlXmLuInveXe7oO7(k(BaZOZ-0yc2v_8nG{|tsz}zmx^{* zk$y}>V*h4oWt6d^^v0CgrqOIP>q#n?jG}0gL-|zWD4+KIv2T}H=jJYS>UQBqXKayE z-^&f74CLDOn3=EJ+ihAwQOhV*=sL_QJtJv-`eQiXl?P`Dm)gT5Ghl_@Rn1l>foyN> zpw4XLXucIZzdM*nx+$aw@%5b43ll(qY4<*&Yjs0&{v5~p?X)CbBHJT<@@!_OEcRGQ zZOc4yKf9zYo>CUJi{;-v6pwGAi62|H8X`_zkzOz^Wzc?29S=*HDExB~)i2pd+|mDE zKWPx;)Vyui*zr zDNdxikY=1qbU6Hj(xX2)bHE=>%)%kQkTQm;r!U#@7oWdiBrc?R6(%x z(jT20UvSY^u3BTz>yaywF64vXJIDPj_YM3-|2ELoP z?OjE6so)(AUE7`CRyoI}H(r>=5-EGoC9*zjMO_h@Uh2#!3OJdxeRMC6ueYr@^RcRH z-Rr8B6Q0_!*~+0>r?4xhNJ%Ob@*QaYdgMe`T5CCbO|`{#;ion5!cqGw_uU0=l&fTe zj06LA^=FcxXAjPPFsuA(2%-<^>MWDS5G_tFO3*Bw(>(ovdwBCwa!M^98xetGTS=m zT$In$WMNfuAzhb9$`3r0j*@ljkH&M-*DQ7vakjO-KHf7sg2i;E<@QQHFUV^oY&}Hr z=g;NNTuV>WM&R=?nOOx@ksw{r^RBbW^H5)t*SpRhMrTxQVX;1td?;ZoF^_~UTbicr zG!na zcc7dYp@WU>fp|u(A-cMaI_v*K1@#}m zgQtJ~v3Oono~q;Cs(O#({dJ!AR(HtlWMX-oZ+IH2rbA0|nT*7-4wbxWRTXKZu`zGF zLk{7gh7&kLtDoQiazUA+SZZpQ5HsmC=KRsH)(RDC$C!17K7zDYm9GkdL%L&bxG~{ZR_5usaIRN8w4`sjStHZZ#{NgQh#X z|3))t9Y~A-i6M5RF!ufphaY3NhN((t=TR3IEh}FHhj96NYidyfaSlYk&k<87UtCwG`1Ss@44k>f>3LpRKi;~c?$YyLZ!X@;+_GlO1x{i81XCg$J66dUpqKq6reIpqC?9;p=^~xMQ9KZkT8_2DFpI*GEwmo#czIn!)}1S=e_SXbkCkP-qIpgLS>R&H-H?Gp10W*W zRPh4iyS+Sn2c+`=cz9CZl|K2w4O?C*ER!o&n{U4Q{nlWZ-=4AJ?tME}7SqhDaH0($ zeU#bpPuU;!A@kU2aXquvlAix~uFdcopEhIH;c=#Q#qvtx$w^!`e#bKPefn3KtRa1R z=7y{I9k%L0Kdoynm1a~IwMA0e9<*7#C)`#a8?;e8+i#^A=F(h#dimh=-YZyr3&1zB zQO3x?-~gmu!t~W?Nw;@jw8TpvYKH$OAOEc|wYH0lZ7D6m+BylQj{O@BztStOJDtie zUj6OJ|0&L?XTR-zP?e2*=fk$)vlCWt`@k{bq)o52BLgP~;M#min4W=`SE6s&NB=@y zT7uReTYX^g0K6UIF1Zh08QDKg;;HxS`4RiVtaXyKs!55_aob}4{^-%h|6b;7dK-|N zYBaf9)#nKwt1-E6zz|omT0$LesHY9A;mRncM5Zui6>sF=bLefZ4nNqnLTu7W{4mpN zNwoSB4tK?#0)uq7j3Z)@I3fW@wrQD6$0C#Tg|Z+>InD3)7#ZY4+OLE24$Skp{0o#w ze=MJ$$P6_s+A~8RHgsp?z{iu=M6BV1-~5IJbD7_M*@HCUZ2DN(ea(~7r-M&RR8JmS z!d&T(_0Ni*4?Zt8K7&8zR*jI-o^x?0KlK*-QH9Np+<31>u6U-A0m2qauxW8^Zd~ z4)o^tV~4$t>YEz|@_63uTZ)5sE6#tIoB!EhrEQg|MsYNLRwkw@Q?cChLv!TyJ6zoQ&F|J(y$-fpJm0Oy{J9I+1r5yse&qAMp1$7Ss^+~k zU99WJ=JMaUe@|?$swlV0)=)QRd) z&2dy0GCR$;?T4fdd`s)Zdo_GEB_NSVOjJhTgr`L`|FkoM0)&qHtAtn2B|^Yoemwij zZp-=bh^X}%U(LuRBfD~5B{t;TriM*9fr@R#?9El8YSv~sLay9e%-nMS1K7f@>1MMO zr6TwmvxdWA)s%>MY&j@@o2sWzGnv$HXAcDMHw7e9Zb=e_kc`$KDX~>T*jN5xl;#&S z7dZ%A4w1->363IKQwtRusDCm3&poEtI(%f~rc)=kY#SQiQ+h=3?L^(0E#EY^z1z5< z?e%y6-Fo6DobUfXwLVm~xGa!+C}>LnXK_VnrRATR8vG%02Ivq5glU$4AUCQrc}*Di zm%L5C=d~(HUW4ii@}|VVcTxFzK8`n{#Awm=m;WJOFj@ z96+JL*7y_w^%xEtJg8ZYX_mJMld;8wREBr(f$<6Xk{<#Pp_|WzjX0a9&W@*bMg}nQ zlo^}mw<#Pdlyt8Xv@{%1t{sjBA2>#|N}Nh{D(D(*q`7HLn_NPQm${An0fTCvmU6EL7Tm1AGF>^EFW)mVp?b z<}^86o0ZLKM^ieL*Wh5vKAQq-i@!03?v|;1cg9u5+0mzg@!r8Hdb#S^Rgc}KsrOm} zyLpg2FfC(hRzn4k-CUD&rgCC5k6Ap4BNDZG@gQFOXG(2!waNTe>ZN8j@sw=7G9PPo zqvlK9bBq#7+|)@^*^T3a!M$5B9aG5No0eofVaEmWy#IZfgWA zt|sQVQmoCQH2Xg%Oq&%?(7Vf14BAvzJi_AL;!yxy`C=9sSae2(dDa`~EyYQ{B-4WV zXnN1@(V_A)`rBmLm4mYRf2mKgIaE=bTsqU6qg5|@)zq3Y)=c$uQYZVLy{pI+aOTFmL0(POsY~fHeIb3n?=O5m*|32OG&b*od7S{o!A}lh zwx8{?>+yjy7O>DGY+Bgo><#&O^x`qU+KsZpG&rnPFVQmi9082BKAbwjI`F@ zI=y#B#Vi$FMSk35X@5J`~Fk$Opi#^v39+nB17JVrRHV#$JgVi0@8_N;D*h%lm7uo$PupxW4>+sxgK> z5B+cS_32O3|9}4a3)od=&v4J_DgR8l<)!y8Gp;@%_3@W$Uiwn{Md`P`TJZ9XSH#zi zW?TXw1xVk&x51=w!wm71Q^f}+EwvR`|CNHkR9udhkSz0_X{$sKl*?d9wU|*2AtY95 z05hM(V#Y>0FYalNYqN+tgL^gQO>T7+RI65m1iA1oW>9co3AWGQ#3LTD-&lsQFD`@_ z8rolfdQ|2CRy^dehlM;wkJ7P_#lb@3RV~jSM!kjGHI2VuPBs>4ZNlT_VjQHy?l2dW zbKML56uN$#iok$s@$hiV+N9G0T`EnU%jRY+sspV9cj5D?*r@=0H%v1Od3D8aA)R#q z2oRt^fcU%nwRgDawiK~207ftC5Q%84LKLD^a2t6>62;OyjEfBUH5Hw%s?bvRSV6T0 z;g(c1d%wF4oRjmTxmGzwW(zl44I3=bV%BpN3e$+EH+ouH;#6^Cie5I;DZEl?Y%EdN zm7}c@tWj&CitcMYJ~bbcedhC5pheD)rLt=9gxBgDdfMxS(gT>5dvk?;_K|7Mh{swi ztC!40(!fzXezR+3 z>%8Y}EG+~ZRjMBF%K43OG}DEHxkHks2C%O4GQNIFKC<(g4St-!MU|)a5LY)8Qr#r3TH`VVaiNyjc*~#obdigdGvy zdxeyIwbXGP>6mSA(plSxYkbrPcH;73PTY6M8H0BXXhxnuQ_CZeKM^+cTQKRu^L=rK#u_l z!hN4Q_o*Fs&sbg(OvqjMTrC~>(FQpx7@IIxc%B7Mc4V&<3}R!HkZ(ju7#q@=pfO|mF5i1A22sv5zxw`YZcG?Qip9x(i}&YmFo;;h|ahO z1`MXU`e3og4Bu4qJa$*!hfZ0cb{Rr#B@3zZVg|JgS^%H7b)8WWkhBR=i#LoEWD$8< z1gFT7X4#$|^Te@V3Kt~eK5HWvaka49PKP7QN(PmTvOpE-4*ysE`$85%J3^^gJjRVkfm z9ea*3i7hNtJ5$PN_cp2cbVU2=po0G>jx81fl=Clw=rrGY`_s>Ox=%tC)ijrn^oG#i zYLu&|BPxDHbBvsy7m-SPwN+zoI^4MDHsr0dy})lxC9A?Op`f;)W>4N)TW2LfHU~61 z!tpyrf#s@B$JW@JC)I-W{d0T#*K5DjzG=6P=@_l6hH1 zV7Iv`4YK!5F+a`t=3PFfK*L_-dtMkMLo$iYUBlye7$?0?zu!QFC>bql`etX};H)YU zS7gJ3c{v=TDpE(Jsuc=qlFIrg3=a$zXR8H?w2EuTSV*OPuOu5wd(FtLUwAGZC0pZ@>_L z?;(F`sy7MkK%4#qgsdHpSb%Tm3C5`X{J);ZWcU&Fa7R zGMN0Pu>E(rf$hSyDIgrFn2N~}t?w#}a?Oo>&Y&-6EdEG;FHxJA%&l@<;`G_zO>f_7D{acCP_B2N6fLJ3)9bvI`V|56TL zBX5lXt~_|8kqc@G6BWN>WGMg&R;*VGEoPkpuf-v2evJLcNP>dQ;FbJpk$eSjuHPc# zO`H%-g-8Ic2PiUOK<5j(H(gMfsRAMh801|l0zkUZiB$~&lz@(nOpTa9yQgtPi`w%{ z_l4)sCQE1-&{Y&db3rA5Wv3p7R-$hW}-zBH?z9(1d%gcq zgRe^h^HjIcVg!3cym_}JGg}<~x%%Ux7QfeW!y?r7cNv8yLY3*>x`0Yrz>%CkzFPUH zp;3178ev1_Gp_Xf<7tMDNW(f;_O0QWNf>AZ#AM)sQ3OrgS@NDNCY?E_!q^Hdv}d10 zXk9nM_vFRZ(@f(TwSwz{6M`yiB|~1eLqJbEnq8(5mSYuUSc+u|@smO0e6zT+829H) zG82s9?^DIb2F403i%cEEYDFyntKINUr!hU1WrAr>g19<(Dvz*m35C_BN;4R7CICnw z%lXw+WvX9}@=Y3rK(oYq6U!lslNx%BZ0`E9I_vJR;Xo?Z+=M(`L3PFQ+m$s*BH{r4 zVI?wJ%YYr4iM-suGT-ci{6mUKmu0J0vQ;!rsqS=PV6c_$h+zz&oYG7Ft&*nWWN2SK zceS}?#P9~H33qb)%H(;tO*?rBnZQqSBz>z`B<0qow$_Hv(&E%jWTbG8^i0P=f|Lxn!Lr}n4zE-g zR}{Pe%(BOn>u>7p*C$YLDT*kBG#3O69@03yg$bGO(GyHRN6 zF|k3iRfaHNX)l%(&Hj3&);~PhlO7o9t718=Dm^t5AE>LEIY>8DI~XkI=639C@;CK> zupi(&&o_rKibCmU_xGDVgiH)QEj4+e(n3o@c%kNTInU=l{Cz$hbkM=p*kJTIMiE9r z|K%|15`$A91$g6u>eT!`*aEhrZNJ|e%Hr!+x^C{mehH9~(9ZpSq~KqG787>c5AMxw z;*B6rVCslM2Bu)jzXk%4B!y(lHI5ZUH;^>QFtjQ;1~2e@v&K?jNCx3WD8M!%at%{O zw2(nih6U(MnV!>|h-M3?p7aL*rLu?DM~BBpFP)zrGlV+2x-jng-jea_H>YNXPMth8 ziE-CBu+faTm}tki<#k2Hj*}<*Hmzvizk!Gxx6h~*atbpusVqUQ!}GVN6Xp>SGvFcG z(1dzaXG~63YSL{yjJ|!8&eum-%k#^`np!+$p&XTXRHU#T&4|K&`wWYji!Ca`m6|Pf z#PFx>9&Ooec(;LN^0QE@Etzddpbi+_w7Rgq%A<1=e{+gL2{?0v$KZX_$#c+Q1|caH zpaUX$PN$#n5a}DC0Gn}mMTogNy%sy%6)dIR87n1Yf_UdbEv(l{YbkAn0T~3-tBsx3 zuZNR#+amf{R#Y{vkU-p>no$eGD{sY#rZ|KcKZ ztg~KdCS~A`lx_V0i3A^?Y{Q-Hfx|5tZMvAa=EPfr{y~OYfQ9(J-p|kgKAv*?7#!HJ zMPN0H#XiRxAI>ATV+(Sy1zVD!M=zaKaox9UM<$fb2Ep-i5ETB`;N3!p3$!(x45NCQ z^_51_*-X2BjKa}?&QO}db2_$lEQX<}CWm7ZymXVLZLHd9GJeuF+7D%h-NY0jFy=dM z6bCM{FijDO-{{+ND-`c6Q&ao=R^eWOqhibKLY!15NA0qi`4KVv?&4u;W=S!V zUP#4-_>zT>in-wb3k`=pif3%Y6QhTAt>e^3-*hDwa#5ZijSoyM;u6}Z5KJPQjgF2V z*?kLwT1stP^_$#h8P=c z@V_{ktwQBqXQ^t_h~F^f8AWkWQ$*g#Dhrj8n=9Mq$XUh7T)0u9U6y%{@|wK<6;X=N zvdB_qu4oX-gPN{Q28gi($j0q-!n4pKnbDtm`!%l56?V31Au*X z&ZPN0{+3VY?0hI95QPO=1b(F9bZABjYJsdnMZz}<nqNY8YfVo zUN%mju5pbT);rx*#iNB9Mi!Z|CECNTE~3lJ396OcHzqvQg0DLq|Mi(R(Y>CDb?uwQ zu4TOzPG@RG=k5VtYXNUej)L!t+-F)(pxMJKam!CK5m91eRX(x_SVgE+ zERw2#Q-a8IoJ_b?E(Gb;dD%!}*U@|FDcj_*t*M}Sui$dZSqpi#7v z7t=PnKcN)-L1s|%Uh#+N<83`P1Rb_!xucX-T9TVcAiHo*+-h^#x%_tw}; zugMD*xNI^-8tG9c>9*nAEHf3(Wk!sO!9b5z+rDzVc6^QqlsMHPZz8CuWB+pQ)NZ+) zZ5ZiHI;kq5mz6I#mYpq>Gs$zMxX(!Dqm+{?;(e)efz@1E?KF3WU9;SL=tce9cbfPO z-ow3kTiy%gQ+A!xUC9=1bde)R=y}s0gO^?cE>{OrI?SHa=CE81h&?yPM;%jX$@ z?Oj~Ut=NZc6UDGqDS~DoXcJ0C{y%)96ll4U;r*f;Es)8E-D*w|DGuqJPWO6Q_Ko6# zDe*=#486r7thUJ@#@MVoH}pHQRzb#Wm7|-BLSFi6>UuxmGCADg5l?v*1Z}C|Wa)?} znOa(4qfj|wL-p^MuC6y3Z=)|7H9xIG?-$kYdw!>~Z@s^_joYhq?a2$>yirrR%S`7@W zwBt6s4tWAnLC$j>;ETb5iY&6p*5TsN59Gww5meX#Al&u)=@99%?Hi2iZZR zWDQXaBA!rS9J)Ka)ln$YaacLtk+P2uB7iMyFb+1b2^jn5jI`X52ehr8s)AvOyxj6u zKOzR}w)_vX63>S^+PkI`jK}&y8UD&*Pd(8k!jzEqa!|O`d{*J^Y&O#WKS~wLW$?SP zLoU8a+x)h!h)wE9nmo_fYD;J34MI`C%w3oq5sL^`1?k)qYnf=8UKy^?evv4$;1Xz= zs>kyMZXDd2^PE0smut+y9OyKAj-2bs>2lcThnh3!BKVtAl^l`<_r$RhpvSyz7a3#2_WJ%) zODB{-x#cR@kd3Bln%Yc7Y6|VZ(cNuZ6NNKPtWXgh+4h9FwZfo%uQeYL&m&xSZl4UFM4zfxy2_!du*=ej4t-t9T<_clR1+VD^l$vR-If zvIx&vF3i*vRrlsK16=P773?w=b{0JoGcL&>s8FWT+yp-{>nlvec8-C97>Dh(Lq#xfNqZg z_Z_GuhjA>7tl90XOp!d)QPa9;5#?(-K*cr4v^!0P)2i@+c$SI8T~9#nzTSdRgkk6NeW2E1OhaY&iKQ+EjE??C!9XtQPO9Ov_Qq<-}z+D%S(`g6s$uU z(xmQNh?7Wa6p88`P4hU#L3#DIso$M@ztd$Hw#;CbJ{=h7>p3_MN@Y{X&0-MqEm;_Q zwyvo%i`676jTwDYq=}O>BdQJ4Y_*OwMl%@Ssdb&-J{yx5#cg&^v=8OqZf*@{98qp_ z`q*83r&@XEG_c5~5Ze0Jr6MBxt?9q7Gb<@Aj!DqqtLLiv!Y)|BDupVgSlt#8rfn>i zE>O(Tby=)MUt#K_X@F$OazW|JV{hXQwsdsV3^hc z#4$V0YpsH++RT#5&lA=B${Zi>MpCU>Sz9h3`?x)yZ#IWoX;z%Z%;7%WbbPyy3ks$j z?y8d98xd#bZP&{d;?RxR3+hHz;Yz>=57AUbVJ@;IdL;~fek-Q-Q#Ykv;)G2Ynmy?S z(;+U-aU6w+k5~%4h`hWLa_g8WOqLY6;duS^Y{g49YhDVoP%GyhTJ*r1hjeBoVdki- zq*;j3O2KppBh4~i-29~+eU1p@suW9@2S3d}@U5JY_eKaNVJ3nxVO8rJS(Zqq)@*W| z$%!QWNSvXn3{z!DV36^zLAhL29pphTRlh!7tz%~>%|dB?y`*$o_?T4cUir&6db`{2 zd9nPOuA`&;BRWu{G`|Q)Gc}sjyYQK39 z)s9~Lw1j$Nf8aR7PlnXdG$~beVXmT)CC(-)qA0{J#S|^YNdG9>i9Z(6;L3Xv(tQWX1x(=GgHVT0nS=+)39}w}(?JhhY#i=*jm=C}HA29xpG* zX`|R3EcVHzkz3Dt)wpbGcSinv;1*YLn@xiVhCia=kD!m=Z}nTdM|7yLyx|CVsZtOa z4qN?X$Tm*M9S#?bP=zgEq<s=E|XHGWfUgU`j+;uDBZfzB=M<; zX15-$YcX%NxC?bscB*XB9DI*gl1cWn0~>$1ejYXzc^6GE4d2P zlNG8RsrnC4J!ArPlSo|zt~$$A1tk!SsnDQ-0or5GtRKd94I+DKiHMJ%+L7MBxEKS< z>e!}=T#0?p?2Wx6)BaBf+1Yy#GiQncSFX-{t zt*T+jHyDy^&1h1{FzYi4B)-;oroXlIlf!EtK;6df=P-VMH`V_+s8S`^Y`z{SAq86@ zUuL+r$Ht=8K-Q5Mp2i4Lg1+{p-WKaQYF<9)S3E`k&0?%QIv?1it;*4clZn7Ya*4c+ z^Z)JBeqgjM&ocF_>+@4YQEM)eI)o5LA&GKoJmh8&krqV#f}}}ecv2(`=fQ}n31)*vFv!{M#cVg?AbJNg19C(rJ){3WUA2hTnpwJ4Mm8OnUk9+_*Wy&l5Z69&Gq$s z?(cXy8vp)H6809(Tdf|zmRalGAe5!QTX$@8zZ4fGEYQVUXe=@c8bjN; zoJ|f~%E-6Ww<}kIni2E*(WW!ip@R|1K#u#fZH{X+db7SH*^c9SU_yo@3r>I-P#d%; zg~R}=MV%n4YBbKloN2=QY|>_M%j zD_jte+WPa0E$ImmXMJAaA?F|hBFsSm zx+7yD*PS?I>^U1aZw;8|G!|m$^ia(vA%Ytu5JBXd4OvxiZLL%&s#Gjh>ctQGGcf7f z;hugTO!X$W9c(be|Y~YfrIi7?l8nQeO24%?6d|zr)gnVrM zsfBvI4=-deJf8eOW_+}XW>Ym!fb75E?T;U0Wka5f zGXELH?fq<&ni_>oj7mO(eIC)@pv;8kP##Cphe80Qc$ue9d|M~sggQ4Rq23*ao^cTd@?*Od16+*H?owBa z?GcB0h(pu?OBaB=aa3?IGP>;Hk~Mc5$cUmrMkgd4lN)Y#N9JUwdsIAy5D+lL7Q-%M zQp$|ey%XSk*A1FbX1bu1KWeq~c@)O(REt!cvYE;|#p~#tc_{hDO89Cr!!I*1G;RgU zI0a^z_TOG)x&wk!1|`KG`W_Sn3?>^pA&kLqH7J$%{sjlq3*=}zJ^7}>Iud5xtwDO( zUvba|>zUe+cz@g9*FqEn)g9>pR-Pn^0xn0<{V<_rJ~;#w=UG;vI}c(r7+`j#S_Ds` zp#FsR%A(f^2hE#ZIIo8WdfgBmc3nrx59;X<%1tJVTmgk9!BR*V4J}b9@~40p(h?hh zWre*5S0S7F-Z#L~#a~O`=&8_Qqxa;bJ>u3{eR+6xlJ%xTd&hi104(B$m~6;^fQBIi zVdBZ66bl2NG0QE*ATW?!tAOcMU_`fo8`#GUdN zO+^luYRfW^qR6T&I}Vr@H%Ld=YEmV zZ_uB0Edtih)oYycLs4fR=cb7!0~Ha%d+{BZ)^XQ-A$?r7%%}344;9j;IJ9dRHh~JGec~s zYZIRe*})gLS;Os{*g-frtZa3ST1`{cKrw$WG>wbO@R4Y~9@ZBzGLQ$9`Kw`DTSeBHL%o9qA+$W6&6tt2k93+8N zj>32#=R-^_XRP1>ki}6p35?(0KlQ^BlKHlO^{NMS5|;y!XIk{{!HTd}{@U|cZcp;T zc1w_B+I`;1H`+V?mGDPrEm=R~9I42S9{8|Vj+%Y5Ew{7n(d5xigP63uMNt1?drd(` zmToDiCc-2u%kFk7%SI`K&csZDs6|+XQJ=&p>w%K6Ju^@$N1^yk<&Ihc1PT-gS-fUv zDvDJ~B7$&zl%Gkdl%TM3UQSqGLFka*v5O^m=Tpn!n{>|m=4ge3`m|`LQeTLCKv&Bu z!2pDBb8DCvA4uZax&h<`9?Y!*fj7Jn0B?Awyo=>nZn1USVmzU&d$k<4DhpuL;upex z&QE-I-O1T>^mr&1?XQrYB!3H*UOIiT3nKpb)bQ!CZ+W<_?!~i;TbV9r;}kjxKBTn} z*3PrMY$R~})hN^?=yGt1W&)?hEHwD89K}Y}z7wxWp%hB}KF8Ub3T#rv>&`F^iQ0-D z;}*yCfieds!q~^JKH9Ru(pQ)u2@Ed^bd_WkMTF!HhNP3dJUo)K>_D>fC76v>`;!P# z>9u@ryOu%nb%oS-?);S`-5q&YNb-rY_&G$GhnGiRUKGM1N-i^ zE95OJ`cm?o7xdp?kTTL$-8MAcZJ)FhMRWY(B1!qf7)AVt7{D22!K$JpG_7V27>+$H z&XhC;Px0eDPmShCkiUX~Lx!~Am+o9+Ekkx#qp)Nl)#MSVO#+b!MA)>QK!?rt3CJR% zRNQ!?cdoW4^;c_e7UflKv(|okWP9AZI-c-1nVYx%10Jao%S*4m4rSnKD_;IK8~N+2 z!rH#8+lPf@Eh;`};qS-bMaN-A zG5mA+sbesRS;{<@T(ma2ZPbH%Qk+n@bmjpTuWDdSP`%8OC>z#Lo zC-CPAJ=|+=;^WisWJ&FFll3A&;e zrSb_e&sB0^g}gl;idMCf9h_A{TW%T}@>u;yfMDqHWTpRM?$B?Hgl?juD8R;zE`6!H zObbwyWW;kUjW<^Mjhw@P%jujffMQc&igPW5MP&#n1qPpJ)yeTZ%>l2sG{!eumXoYJ z1T@lW#0I{vLA5NXs(H0bJl}QmkSw6d&?A$Z4oFTwDI3wl=#wE`-~~u91!L3^!es88 z+}~kaK-Hj8plkA^l_467un{qc4yN=>kt?po_(W{^ubjwKAWc`1WxA+m^RGShRzHwHo$FZe=aFOYRf|N2eBH03R6DSR7b@;>T~^Vkdc zkj1Bn<4ntnd+H6@BN^IFEB;z1R=Y6uRsK|cPk^9huUDcfUVlN@LK1gRSgE^p zZE1{|?y%`}sQ!Wct8nJd{DhA~I6bm|j6IBk8=W5AKd|>Q!%niy8S?w;L&-k=pOA%w zihB*(%Hip7{twldn-+Tb^uLgepMm$|0-Kqez~P==TEyzLDCKX4#cWE>P3qW~)^vpkAJnU!{IY||CMq5lT&=t7X{Fmzr@ z1`9aB3I1?`bKP`1gx0;77dfV}_Q@ncluG$}e(-N{!;0nXqD-undY5kAsAI%5;W4(i zA3m6vc<>->2Ye{`^VWyo-14@5ez0#B@MLH#8=Y2^Pt1LR1q%k{@nbodVDg1&s;#!L zf+lI028A1d){EaS-Ya0kp(Q86E*PzK^_&c#!ayj=$kf^dC3J-*` zs)yZs;(aO0&@=}u1_4rRb~Yi4F~JKpLR$zVaR8857ZDNC?1B+wYb`G8cZ=J z=ycvl>r2qGi-CC(`sBun8zo~ zsUT^(rpUS|$)+Uo97>pyD2NY)9OG&Co^by=pQ7rz4C9VbZc~_z8CpV**_a_X3ToCX zWwI6`%Ll6U1~cy4BiopP3>j9c$$%aizdZXy%E*f14{a83Af_S2L}#+WK)gh=38L(5 z%$msZ*)_UO8t+{`a5xP`k9LdQ&&n7*`yMpQ3Hi25;3c1&8TahS}p$*r$TgeybaKVZ^TIhAsr@aj+|1sIp?wOIel}L6qpB z8d{eOmNL9txz{#fAuH`_wvq~bmlj*5RDyBJ)QYO9#saofFybu69yiktS{m3{jgVu< zL=ihGXw*}8z~yo~x=%0r1C7Z}i1a-lfl=`7|C>?;{xQJx1<-~3i?rLa$2&Ykg1t7* zRgefBgB^(hbeKG~8LXmqI|Lx=s!bT3tkgwoQ&~loTZRkASOI(m{!Gn-?UI)c7y8h*HLQ-#*m3_AVItp#Wz6fYdrU zLSil#a|nf$cQd~#iT-9RfvI0H^OaKbmYUpLf2KIi*jNuF-_Ywda6yXvrtB)~V(DWR zk4cIg9{Z1V#|(N-%J#*;lL&9Li;T*;1F<}hyok?hHw);Z_h((TmYG9cxe>aeBPy@j!224UEbk^(o z0Cp-VM3yn3N*qut3LnLX20}Fju!Idwj=9KLuWJO9g(0$#g`LPkmelh>Qe02q88c{C zNJeJsr+B+=DksaXtI0@KE=ju=DROp42AK4SerI;oG(%_Np=TR1(?B9mkw!khUat2+ z3Mg}erib+Hbt$JB33HKSA6)vFT=KAo6iMOFo zu8`$=?DyxgbM_Hf&~j^1L5kz~{WN$eAP=-RWgD$H$V~HEDtvzoYTJpkOr}O0ltI!Z zCzAh6c5l;;^8YH-gSfcWZ1w~b_Q4F5wyCR3DUP!87`EA?NKI?!Qw8Xp;QPX`B#+zK ziq5glCeWJ+%%vbWn5fVqV8BN}+@ou?#O1zPvdqw;ipXw>Bki;gO2{zUNdtfg9mbqWGIk7*t>;@aUo)~@E7Bj?t83N3&U9)W2e)@mIW!&3mV+{iPdQdAKb zvZu33J{a0mB7zBRTbdPM4JYt59`;fM8pW}3BHEsUV2!@U@cO{$J0=JGzI@!P_ra0# zlA5%K@K08bZ!<=@sL2W%aX|SWzFPWHbd6lY2%eP^v+|sTk(Ebu^BTWigg8~7jnb38 z&U6fFkg`Z%t+`Q?1QFg85R&vfY-~Ref&)Ap;R@?9SAb$xp)d+@@t_RvE0E>AS{7!pXcXRi!y7D#Jts8C5Q1AU^&1P79rkTEM}KfB0yVE7*2d|&EZp{X0! z#0}Ot^|W_nK(V6+Ne9`Lg#itw4A2bG@fZ*hi%pD}Lk+y5##08E{niXD^c{Kxf2+Z!sSDzzr38M?|EnrdLyV>JTqBAI+yniXVLheJsze@nsXHIdQ{}BMf^;$ zHKlD4HVq1@>c>K@|6s8s&`R_mA5|6s>r5`ag4{hFL#}s@qJNgwMtBD|Ft!WG#CBXl zCd)h$ye|TVX-aj;%<#N$4NZkCt74XMyj(0-?TE2LjWw(lu=94%ZH5$2*LeIv1YQ`_ zK_NLJ)I+I90^@ncL>z7z#;BIRVDUD){3X`)Wqtl*!&WZGQ=b&qjB)Mj`kpmQCdDvJ z4wP&~>Uq37f!39y8&r5lo?^@7wDBbz55$xJ?%RIgJ2ih!i7*aIPirtR3K-7-MAJg^ zDmYr~syaC|gMvjQ`OaqUM@_@LsqXoQ(&_n3W`1KC^zx0+XKar|-+IYhbr<5_h+3#@ zZI4U@75u;e-Ve*)O#e^EAMLn#D@>^n)cCgR$vW!eFw%N;!aS!rU>cEl{9f4;;xlE2 z1dsf`aw#<9iFPv?%y$h-X2!D2YbdB;SyiFmkNb%dcErT;o?#~?=Q6Nvh7=B(ZmppK zWO0#IN1CHXLaBJ6=4uT6EUefX(!a|h@d>V!OiCP!qQG)eMJ!=7Sa*mPr);qu(>9A4 zCCn7fVFvIe$HTqzfbhr<-yv^OQ2pJqF8>v`15gIIThO@`U+q4fA7L0vS2Qr3`R_C*0r*H_Z)uxhH9~LBer@C|6w)9jF(8 zNoflsxtxZ?P}21i56sDB+0fR>VE1Gkyd#*&;Lob`%4^RKK%KZ(g&5#9_|-w+ zEmqbN3lJj?d|e`$&5*@+F?+Z^_DU$H*swt2i^lH;&WE-8j<2(j@Z(eU#vjQ#^-%|j zZJUN>n{FtI>jKZS?Fbec01im5Juj9R1Aqx~#k4c_>O2aWED9VaF!c<} zGk6_Y%ul$Qb=juSGKH=Zd7E2vh7jE&J3$zpZ$tkkCIi_3@>O)Tjjr0oB!z`0bK%&| zP1V}EQ%zVAM(HJ4 zm5jvpcLIi`dQ*%$Gj7_#^fon2^t8APebl3^tg35!Uc;UncWc@9K^MG~dTg=I5iq#S zml=jFkg&9a^U8-e;Xz9d?aH&``EoqtN&P1*`^pMzkjh-d#UMFfONmR`=p^);G#lDx zw#I{~HR@Dq=p)$&K)wNHq%>4nL|S~*u%l5#v!U!A0kssZ20qsgHx{pInKBN8T-^ z`#=s$Nh6+w#O@nQWsSOMA#tgd&sFUo9H-?6%$Gl(dMmO7%FiA;l>h}ijjYFV z(()hR1qS2k5PdwGPQT@X6!GJ$7o8QQo2Mj!=d%hu4@?@2FO6@%Yg#xgN6%U$f+^Z+ z`GaU$ML!OAEO+`#&AvGWUj#MgtLeIja;l&#wUwZ*KY$U!uq)MqA~WRDxwu45UC=_m zfI)uAzM#2K&ZHv9_rJSluHM~=x{ z$7?#1zwxjLM>rNE0^xF}8$*{w$W|qZqx5+<&X6R<^94bmYvrgUILqbe(#)HNnb!j%P6&RFRXSBdU+J^rjnBjdA+7Th?aUL*da z{_Rkxm5tMNt^MvVBm>uXn@5|D;3pvzXIfAn1t;J)&A-GE5@t`0y+9=gyQl=;&nr!x zxYtqj&a;y9U3C>sH;&O*Oq7LK$eCBnSLz@_9H#3h5@{aga2ysj3&No31ZuMX%;l@q z-4`zjAVw|F&VIU+O@d}Mo3xj61Yur2lckRia+FL%Ll=>WjN_OHLpXtgCO8WS2N*3X zBn7EuW{(UY5>txfB#ywcf^BAaUXW1nEUzS-j3Aq)j0By!EGXTUMNT@RT4V{B&kjA*A*gBq%6~%zR_bR2HIr z;mE>-o}wu!_EZYZ{jW$XRQg)mGAcRemw6sy)eIl;-o7rvMZU-+c_JI5*G69b-@ zL(FzFHp+@L7DeEa4J_2)7)ocJK{H}bnn5jER(d|l>P!6Jq06{wipS!5$iMv)tz3&c>OeRyeBOOW+pGu4Po5+K3W=U&WlaKc_wAD zc~+q=O8UBm{`tvXRE<&bWn`q|@L|`TUJy`~I`77|J8?KY!N+13N@WB6G%{YnV3Lvd z>|tpe*(5sQ9MZkOP@r0h3C^T+T*!;EVgrO^B|43o$%;AOV|P5cj1(x##IRyh_{@w& zs3f}CY}D%zlFfRxNh4sjx`L6zpj2=Y$D>(oVBPX1-MHgkt%3kWWVe!(G+kFw=>EZW zjaAbtnkq3gU8=0Df6b7{uIk^9ig_pct#g0M+fLVys+x(-UQZM3{RGd`B+ z+;atChB!%mOVjk9jSZ$l`;&N-AZt+S1j6|8<))6ek-j=#JEd){<*^cb>rWs5+*&xL z(k6vF&9x1Q_TfX!+WYO0%G}(7@_L1F37BMK0hIZLce5bv>;B%t2>XOc1~g~iiYP=JRam;MW#vXtx4+$eeK#SVoxgX(DLz?12G~%=*)DJxTya zFj||8#xHAFcRG;gA}1rq#oEbKj7p3QF&L7%&bVI!BV5iqE~FTzV=D{V&?y^>CiC*x zsqBRG!hW8}hJ`QLEecLAmyKv70!uE%mDFbJc8yoCf>84Ytln~XAMjj6;C$SFlg$Rr zkOWEN*cEXNO)-nR29$N0y)0|HpCN4zd3Uqap^(eC^yd$L`*}?8FeGCaVa&*RKN}~( zz|e%*J8({h(l-iu+@34izGO>qUO?Or)6vikqtK6&UGvKb+du#iI%B!U^orLoyy#+V z4CIP!sH|^lprTcfSs-Bi>p{mXr}7GM)!T!ckIkV8!OYR60DarorRVVXcDuPT%&hDB z1Y3Tpuc8$I|LwlPD!4@pwqBXwxp(&+z@aME$UGCKzCi6%! zEGp%f2m6d8h5_rP=l5?A>e|@lYt;>~9WB`ZuWts2MPz?;n?sl1yZ06#JpA>q|A1gh zaNA|t%Pfe5RmvAvs{*xR z7~oSqoQCJu8G9vJS`UeA3ltz} zU@EEMOCCm{x-F>mLg25rf>qrd{5qegd+_3CBOK26ub_nw=xTr?9x&li`%e*_X5xkX zD|h61pLZudzz4YlKMCcToEgvOF`NZj=hPVd=T*H6WJAdJ_CqkZd}jY@G_aembKRx^ zpg=(Z%24;f{p`7pU;xy2kPnc?$6zwv1YkZHn+4!t^91j7ozlIaRkwmFy%xNqw}90l zE^s=`uKxu?Is^Xc&EW6)AQXSy?Z7qXnX|~1=RWV)3F?m2A$NFPM-8?tXN{R|rfwc< z2Mc#YeDLa+X2$M+LAX)B#AVlfo)9GtZ!a!sD$rc(iv~Fqx;(26;;nZ>fmS5ME;oG=Tv5RH3 zJEAWRmxmw^66HG%Ap{2O;iB+&X^Jt98ySsZY%;zW@~wt18) zcAC>Oc!6m<-7owWo@8h2K8dlb+e?wQ9w3bA5-Niapt4G}$`Z+ge-54i&1D>C?J%S(|Em zd+U{2NN3PEW2xXN)YI9l%T6Yb!a+WTJjb*69EvDt!VT&dnrf-#sm(n5`ACSrL{!e_ zbIEuTm6SQ=w!w?HBWj&~QQ$cxY&IPMoplUObC)X|vF*n>#tF`F;o0#5%&JNmA0R%5 zKyW16h52dwfhIuo$T(B0GIi{Z;`WhLtkq^I3{G*WVZ|$18RZM#9$~gp3m&F(^R69H zppa9&z;j*8u;am@?sO1Gx)nm3ZCF8a%yGdf1f^(l0z0SDw9*MK*}qk&exi9InaQB8 zc4#S7abw>{mYsGwts^W%Qm=&Qa)9F;xyo_U>Zv3bE$o*<$}72pB&VgUB(^``Qzhzb zC`UhCQj$OakGh=|fOR*UtJQLSy#0?G6mEVRRo;tdTiJC*vRI${7rp z-MUSr!lr+QKa1Lcf)4Wb;RQ|J90cZaYH*hmcuIJu7k)WQ|Hs?G6((INe?5H+LG^}^ zO^8qFcRsx~!9mfYL($|(>A*Z8x{;@pJ#uFXk;`25Gz3)2wxetzST&hwa?E$FZ+R5Qg)7+1!hM zWZ~bwvH)OhNYnzTZrJ!mcZdunm_Ob%>E019!s20HEB zQ=^>r2lTCOSz}>4#$PPhoi!3PI12{>B=CLFj2ymH7K9JNC9U$_i$f{Ae}6EHiD;xC ztq`{y46Og|{U)86{ck#j4r^Mo?lt7TpXC*1!xp;ufV^*DJZ^~&_=7D2S5;( zUODI>4=40_Yqlr9H6KfVVQ}ksNXw-8{tQHF^XcZbo+RD2W_t3AE|ebQ_}W;yJ{#vq z+!V_0!z5#UQd_|0>h1IC!L;6q>C%=--~Z;ar#+fsR(~?FW~9} zN5AE>)2Hjfc+{AkaX9_%8p*V=tgV#oWqk~=3y$yiXlZ*xeTix{^XsJ=bX2jVkm@p| z8Dg?-ahT1arp;WzeO054Ct|21*c9Xn%{En$;XpMzvYd@fi)mj+HjOd+0B}?y0&;~C zsySC?%F`80`3h01h0$o&k}n^%(i0a?*6m#Zo7&n6rAIrp_+5b{gS0o8aXN5Sl8(Ak ztWYl7bTXVhj^nEWMSAkK&MNu4E?mvfRYr4l6Kco*?tFbn6?ht2W_mTMR5J>eBtfFo z<|`fBg)Bv(X2j`>qnlz4xx*4g5thlWpM9c+p5YWYMAj)0F{SUA>Z%r4S=x^lCt-0} z&r}Vg*m!h`B#Dw$q{tXP3lmF0B+I_$z4H zEIn7EaqqNW54ncAQ7aQf^-kZ-pjp&eTf3(IZ>z!;cutxhvWZGnUFujZR4+GGtaj_XilvHU_Od2X@hngqErI{T% H00000K--!s literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 b/previews/PR239/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..36d67487dcf5fbe3dc6d0a6b01cf4d29dc997765 GIT binary patch literal 16272 zcmV;BKX1TyPew8T0RR9106&lb6951J0Hgo_06!c61ONa400000000000000000000 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 G0RR9|PM1{x literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/inter-roman-greek.BBVDIX6e.woff2 b/previews/PR239/assets/inter-roman-greek.BBVDIX6e.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2bed1e85e8b20cb3903206a6cace251c52bdd8c3 GIT binary patch literal 29920 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 literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 b/previews/PR239/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9a8d1e2b5ef22b97801781478d477685dd6119f3 GIT binary patch literal 110160 zcmV)XK&`)bPew8T0RR910j^L06951J1C_)80j=5q1ONa400000000000000000000 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 literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/inter-roman-latin.Di8DUHzh.woff2 b/previews/PR239/assets/inter-roman-latin.Di8DUHzh.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..07d3c53aef14e7e3aec6b11684395f2833e0b3d5 GIT binary patch literal 67792 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 IZR%D40KZ@npa1{> literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/inter-roman-vietnamese.BjW4sHH5.woff2 b/previews/PR239/assets/inter-roman-vietnamese.BjW4sHH5.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..57bdc22ae88555c6217307e4064a642f83d642b1 GIT binary patch literal 14072 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 literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/introduction.md.FQTtykEQ.js b/previews/PR239/assets/introduction.md.FQTtykEQ.js new file mode 100644 index 000000000..68fcb53ae --- /dev/null +++ b/previews/PR239/assets/introduction.md.FQTtykEQ.js @@ -0,0 +1 @@ +import{_ as a,c as t,a5 as o,o as i}from"./chunks/framework.onQNwZ2I.js";const m=JSON.parse('{"title":"Introduction","description":"","frontmatter":{},"headers":[],"relativePath":"introduction.md","filePath":"introduction.md","lastUpdated":null}'),r={name:"introduction.md"};function n(c,e,s,p,l,d){return i(),t("div",null,e[0]||(e[0]=[o('

GeometryOps.jl is a package for geometric calculations on (primarily 2D) geometries.

The driving idea behind this package is to unify all the disparate packages for geometric calculations in Julia, and make them GeoInterface.jl-compatible. We seem to be focusing primarily on 2/2.5D geometries for now.

Most of the usecases are driven by GIS and similar Earth data workflows, so this might be a bit specialized towards that, but methods should always be general to any coordinate space.

We welcome contributions, either as pull requests or discussion on issues!

Main concepts

The apply paradigm

Note

See the Primitive Functions page for more information on this.

The apply function allows you to decompose a given collection of geometries down to a certain level, and then operate on it.

Functionally, it's similar to map in the way you apply it to geometries.

apply and applyreduce take any geometry, vector of geometries, collection of geometries, or table (like Shapefile.Table, DataFrame, or GeoTable)!

What's this GeoInterface.Wrapper thing?

Write a comment about GeoInterface.Wrapper and why it helps in type stability to guarantee a particular return type.

',13)]))}const u=a(r,[["render",n]]);export{m as __pageData,u as default}; diff --git a/previews/PR239/assets/introduction.md.FQTtykEQ.lean.js b/previews/PR239/assets/introduction.md.FQTtykEQ.lean.js new file mode 100644 index 000000000..68fcb53ae --- /dev/null +++ b/previews/PR239/assets/introduction.md.FQTtykEQ.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,a5 as o,o as i}from"./chunks/framework.onQNwZ2I.js";const m=JSON.parse('{"title":"Introduction","description":"","frontmatter":{},"headers":[],"relativePath":"introduction.md","filePath":"introduction.md","lastUpdated":null}'),r={name:"introduction.md"};function n(c,e,s,p,l,d){return i(),t("div",null,e[0]||(e[0]=[o('

Introduction

GeometryOps.jl is a package for geometric calculations on (primarily 2D) geometries.

The driving idea behind this package is to unify all the disparate packages for geometric calculations in Julia, and make them GeoInterface.jl-compatible. We seem to be focusing primarily on 2/2.5D geometries for now.

Most of the usecases are driven by GIS and similar Earth data workflows, so this might be a bit specialized towards that, but methods should always be general to any coordinate space.

We welcome contributions, either as pull requests or discussion on issues!

Main concepts

The apply paradigm

Note

See the Primitive Functions page for more information on this.

The apply function allows you to decompose a given collection of geometries down to a certain level, and then operate on it.

Functionally, it's similar to map in the way you apply it to geometries.

apply and applyreduce take any geometry, vector of geometries, collection of geometries, or table (like Shapefile.Table, DataFrame, or GeoTable)!

What's this GeoInterface.Wrapper thing?

Write a comment about GeoInterface.Wrapper and why it helps in type stability to guarantee a particular return type.

',13)]))}const u=a(r,[["render",n]]);export{m as __pageData,u as default}; diff --git a/previews/PR239/assets/ivowqmu.Cx40vhB3.png b/previews/PR239/assets/ivowqmu.Cx40vhB3.png new file mode 100644 index 0000000000000000000000000000000000000000..f60db5413a1e287580ee1d0bc1c479ecb43276c4 GIT binary patch literal 15689 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 literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/izslanu.Cm_V2Vs0.png b/previews/PR239/assets/izslanu.Cm_V2Vs0.png new file mode 100644 index 0000000000000000000000000000000000000000..528e61b4a2116b49a91eb4dd8e7375bc85be7c2c GIT binary patch literal 207758 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 slXQK9t*N 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

7gcoDKhuGx6Qa*U|KrDXb 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

%UJr;Ypf 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 literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/jsdldah.C3SxJ3x-.png b/previews/PR239/assets/jsdldah.C3SxJ3x-.png new file mode 100644 index 0000000000000000000000000000000000000000..5261ec3dce1f5a67175259f7346801f4e899593d GIT binary patch literal 23728 zcmd3OcTiN>)-NhbJBlzmBO^!}TTn@oB?m{LMS_ANl5|Ltm7GCDnUMjsk(@=6k|att zBRPX)ksO=cG^yX(2j#+AFW$+J9=ODbfGH`~wXQ4Lw2m zx2rTXv^g|1d;D;_;fXARVJ7^s?{^iY-)N}lzl8GC5E>c|8p3Z1S}rluea@jwd8Hz2J)IbKE=UtUj9syL$jjpB^{Gmwlk-`(d@eN@m_$BFUuQ> zf`W0|)ttInk!n)#@kDuN`vr+=SLrRc0YX-Yb}@gs=Yq8z^G#jdJv21(o94VSK!%SH zEhqdf_OKuP#qkm&P}p`_0Y^ilk^2AhKTI09$)~n8HEFm3!5U2PO|Qt`^1TtMhgPHi+}Y{>Gd{e0;5+w@j$L};%L(V+dsUf*-4@y9D=9`v9@(T;EliCg4CXyXH^_{!(&7*BAD0>*B zbLxa@^F2L2{_$gKyq6mhh?rX)3O0-gkCLz-O$wG>d%(W&t%fJt1HOV7W8Wab9qVxQ zTIEEUh=>S2eNwLEA^EEjWq=yH&~2I5p_AIkE!%8g(0++ww?*~;*4d5+O>P|=6z$X# zw(ib<^ym@$)||iXLmlFeCoXynpI|50&3|GNsGI7&`+;6XpnOTJ$I5=Tc&xDf7M(|H zw=;FK%QV`m!nI;Pu;Toq43{Pa8Q5u^6#wTD6#-Bx$p@4B24kK3BaQu8oxa{l3hZA_ z7x0=7AjG*%rq2&m3CuZ`IFl+?x-GL84OtgeEqgPIOjBbQ#^fr89`NxMkAzv3JH~mH zH1X2VBrK-=&RCeA4?OoK7s3Uzzto6a-v%_UdBKTs_XpAxz}FUv`#s9@DU4a!D5|%g*@9Al27_j^6NnUkp5kT z6xHYfCh3j4v*kre9bg4wHGlT59S;zw`07-*>>tX)!lJG3*uMV=*JZ2Dco)lT+qKD8 z+5B_v1<%~~kpm2Q-wbiywLUPF@qlnbk*Kqp|F;h8iqJGNGCF_$0o9J? zaPN00WA&g06oH8o+sBr+%M%T<7xfeEe z0(X})9xJ>71ubN?-_$9cXiY7WdFVb>D@hWcaj9Yrr%lnV@^Uu# zM^bJrKf!Br%CM5GS-IApOTJOSZR6xpp?5@_}8b==eSw8W(@i1_Sq*f=@?v@e*LPs)E@ER^I94nX)>zU7>D_ z$+0jqKRU!JIo8R*ChbzteqGnPpxvf&bLG%_O00e`TbFUjXl7Adai0^P|M9DoZ(p9C z5&5w2f1$U(6#N$HmqEqEw!zAcAD^rfxV*7si&T@ zY+E+}`2`__csX9S{6mGgw$L4ota7nD(~+XedXiUo1C_~W7md%EmutFDZC-ymN*?g0 z0xj*`-D|0Gn-lPTaY80FKk#JS?J^0cXO}JG@oc@>ROwx@5LzQ+q1AjE9B94e9c$~E z2+~q8oYLzmwrE*TH|o}=+{)|V<>{`xMX%OE@f1>yx5EJu*M;G9&D5;?mP?*%OO!FW zyylCMGExLD>iTrf`H6e-S3uL|J}

7Znv%jXBrM(t18{%4c@`4af8)3kh7vagVzd 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 E03rEqoB#j- literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/kbbskga.BT_oJ_KS.png b/previews/PR239/assets/kbbskga.BT_oJ_KS.png new file mode 100644 index 0000000000000000000000000000000000000000..98b078ad76f8d2eac43aff6769d8f58c1cb977f6 GIT binary patch literal 70949 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 literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/kbzwnsa.DC3TvBOO.png b/previews/PR239/assets/kbzwnsa.DC3TvBOO.png new file mode 100644 index 0000000000000000000000000000000000000000..924b99908e5a85c7b17da33f9cc1caf8ab1a67b0 GIT binary patch literal 31376 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 literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/kojydpc.3UVIT8DR.png b/previews/PR239/assets/kojydpc.3UVIT8DR.png new file mode 100644 index 0000000000000000000000000000000000000000..108afaca3e42a78e15b258393e9fe9230c62acf8 GIT binary patch literal 14090 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 literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/krkgpps.4wfjCtJV.png b/previews/PR239/assets/krkgpps.4wfjCtJV.png new file mode 100644 index 0000000000000000000000000000000000000000..8fe6ad743afb44ed39c73a4b4bcf1bc84e886a39 GIT binary patch literal 66660 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

  • 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ⅅnf_vB7XR*HMLJGe-E>6@ zaz^ii^A5bL*$Ho=QA1=HvfoWq7+dZ_vk!36Sz1DEqxeuiKR-p~Dpk9)a|Z9f?PRDL zX?;}Ta{u-Vft25*w5-g`q-8gjUOKi#V$44lM@q`tO((Wn*&TbvQ9{Jixb%4!b%yxs znYsv&SL*VuTjyD=UNQ2BUXPs?vAGvUB)HT)&>Wl6h>;6~&42*MxpxYlBrjp|iKO8b zyT!bZKm#%*^XhjP3V(uv@lkXwq#cY){%Cb)WrM&PAU+k>S{&%V77{26w6z zD&WuK`W*mQIe2ivuLQ{HbhR8f_0zM*(DE@^i0HFF{i?}rt>`OvvX-*gR8=zbA+N!G zSi(a)vw+?%eMXJC3T{#HdkmFDD!nCf9hC91<>I0LiB_*|`SRtZnxy%7&k0@4jlTUD zVzYm_yp*qN*$5f_+tju$zEc%L**)Y5)S=Yavu{4e18WK{8_d2{g2$MO@5##2%E~P0 z#MkX6N8Fob{ohVwzC=nlMMaG#amQ9({>kde9-BU8tx&02UCX1!)-_-ljokTmvChLX zqC2u%PnEl{e(Lz%y@rgjE}WXm{H9xJw3wobe1j-1wr8j#<||=)Lpo%@8V^ zy6}DztHM^~iF`%nv9(<^dbjmc$W!?_@Qoa_GaYvY?u{Dc^{@%7# z{5h^-om!qPJDwtaCC`>`F&SI6F#c-UnDyZ%nuUOc0C+Wz^^^J%2fk%-A~y>f_XMQH-4J5O}WZyjJAx-cjCvF-L;9#JN+g_ z^|rn}*-~At!B|<|3hc~1CHn^}n|i9Ka2u$e8ee3M!gxI+qxJIr@o?S>Bu07B*KO|j zRRhc{=#$to5*|K@B---1a+UYs%-#D+?%iYihFtc@CyG=M!?M5O!S;a2d*fF_7C;Uw zom!52*D>4@{V5&8VwwBgBf3dd#?ZVw3)|Y)8ZUH%Tq>CO*m5%@|K7b zxxf!SMt=R!$w%p1^#bLpLoY|q-gX%AJB&g9&uX9S0E{?ZJ*I~-;yrr0G9fiJiWj*2 z)GnjGzU7Z(9=N4lt;m3SyVS2P4C3)e*u@7;{k>k)?EDtc&bvJB_i_h$({S9l>>n~U zmp^9eOSRB!hi7SI(=Jus7w=8YSTk+w77anuLDVM&CTAY#$D|V&laUx7ziNpOOWf3X zLQD<4ids5LZ++(R#KlNy@#&2p&YlVCX!ngTe@gGitvvp{;gfui=~Dl`WbBEVy>tr> z&pSUbBQ>wrG3}jOOzgg$lP=nlHT!JUCFg1D*BhmX9M)ns2e9wqr!}@}Lee}WC0l*v z!`I(mIn&=VJj=-GN!`+(?6av%U2X|w08cgQ!VxI$z<41y*Ho*1e)-bNcT*s5P0&JI zbiCQ#V8T$-jvLP9I&kzT{bo#?NULZERQ>Hm#zZ zY7Sf6;^y8A<0^m_=YKr`CPlw_W5dUJymLI$gq=_o&ixUdw0=0B(lEwqFpH{eFHDY#cfGlyEaAenk+07kgs72QiF5UOILdT^TRR{^UI@BiYo}|670g4 zm(?V4T;E!J6b}$aMBqK<=Ay=-m#jK99Nd3jSudkz-I_te+1D|1{7)zP>b@g_+g)mM zvNdE!ns!rbFqeJL$<^!bS9hH4p99ZpJ?m=k>HF>3%O5k7AI?ype0GixqaJ3$!*W_3 z?~dZAP9M}=Z_tPDZO~)`TkFEX*uI_FqEX07gs`wfHVKu>4hfzp9BsCS3VWktFdir@ zENfhgRE82N6dW*uqpdPzUfKNblmj5UQ?Y#HxRBJ57N5R!$&0j+Ci92-i)O-`|G~V9 zzZiA#2Vnt_<)%McX0yaK?KxZx9c6izJ6TM|m&RrOLP`rxVoQFfVfbsj=I1AG>OcLk z(b;w}{^;Ti&$<_P$3ch?xT+{i=YCbQmpyRl>oqu)JO^CSR$za^B-0|68{ODv?RA)_ zrX_}x_w*Q!^O?VlSX5W#DzS<2kKG=-r7cat+Izq3+e2?&3OLu zv&AV-wAbP1mdJpSnaFkV;P%wj#}$5N)$Z=%t1bA{S9j|>6A9@|vvwn=V#VqS1FVi% z51+kFmu(Y9z1a#EbpO%kp6WD^WPD@P1JG0cyfy21UzPclSK=P=-gsz_JD|+)={6R% zpu=NkH1$R@AlQr<$(hwh4<8=Ove33P>v;YZZ(LkJ;2LAx@Rpf&U}y>E-t9*SuZu6Q zoK75D-4-69fys@5K~s>~+`;?ldm?x4WZdti*C%%M`?RL--_?xW9#N%v7qukK`^ZB! zYkL=exN-6_&ol3gRV=n^$U=N;|9rK^X|Z5__~7Grx3uSSDPj_-Tep}5yGTxG`td^_ z5|6H~oV@%?wMpreA0qjN2W2isV~^c)FlZWgjc?enPuFg=w8&(6WyIOnjsF?G^YmQ_ zj07`oRHJg2_wjqid!-90XrOuHiTIWWdE<1IBd8P^a(xNvDy;cTN`II(7itaWi%Kw% z)YX@M?R9Jh1?d&atOY3*t8h+ncIKq=uJ{YXp~ru;kS7+Kb^N@4cw@YZ{7pD|ENuA> zD7W+5OsAW7?g$oiM3M9L>pz8%B8!Cwsh`o^f)O$*GWmcky^DKpnxdxt!fn2tadx-9 zEoI({%454lo->8)R8mpVQ_A;A>gXg%q3AlMT%~Puu<2HxwWzb!m5Qq9O(S~^&rg3F zSD@Cg&?w|uE6-72JW@kdPdK%;i?7`1&!(!~z9Unkdg>jS0CL>2$jdyXLPkbrPp{!| z4O>TZ8lWszQJ03K%C!}k#FFhGV@@ZR}2wQ~;f ze}n4xYW@tHKbxs}a$fzSV_;6kT!nC7&yn-rkWsUSo=SK)0wzB?zq+ohli7N6ebII) z^6&8FyRsz9XjYV~PA~7eqDoHFEv>CzM{5xThM%`YIT#Yny`%R!%`#67PT`L`!)`Rq zsEfKVPk``ahAzw(YDoU=^%WOdJ5-zY?df&ddKlVs#$QLTuJ*zF_uJUJb=;g6QZ1qK14n{p% zUE_sAH$Vwef}I1B7=7^%hM}uOp=;mrQ0r}4dV1Nf;RnzT^Y3*{0@ml?FiMQdw_D70 z+T3a_S+WiCD6;XT`WD$Po?)ouUb&l+XjVxk8q7w(n?U;MQ$CsRAPusz_rEH_6 zr=M&%OH&rOJZt#31^QDzgl%Wt1gpm=8uOv#>XVF;MFnUJJ|XMijw1}C5+xio729(~uj$CJpE`*FkZYAJc2uPVYc6}1YnU(j-V-K*kaWUKkBFM~4E(^oJro=YbT0L(0y!Q&;W?Gmizk3l=t}iZLEb&M!T;Wyv z`q*pzHB$Tgh0`-1kDtd0X?+GhB+uwBAjajL5lbeg4LA@5N%&k6$J>u5#L ziM;}=B=9zhEzn`iWI#)ZAzGk4draT*-BE=ikb}4>tMDt)-5W~sD8+NuP%=i1G$o66 z*&QIR9d4+>+$JT_bfZ^j_`ud;bqP%Br+42y{0)jyuS{1fWY>O*suFMmL>67NN#EgY z0pun{_!?kTl$hBoQs7SDc%+>2fkh8$IuQ|HFGIHJ7WK6q7k*V?_T->&xU~By9xuWF z#nD9kCUl*>Z~kqff~OY0y8Q0Yj2TWwk!}C(c5|}Q;;n*valy&7t6&u2@Q@Pjt1{)DUQFL_vUHM2F*c zY3a?EJo%XpmL;J*kif6cF+HasaFpW=d#aDPuYU>iXk4!Hd)G{2{&xG-=6+Yg$gS<>M>DXc7=h zmwjT#pMKm2q5y-^5zX|qxmK+29W?{{d0{LwQ3zZ5koW=SU>=J1Ca~{fVV4wwe@S9A{|!Dx%n2{sn4jVP5jpZoBLTQn^x$(P2puX;D(;kC5;XI<3)A+QPQ)`BnA{ zy8--PpM#4@DVJY$(Sx-mVCQ z*P_q3!!-k-`bN3i=Tn+KIlkN$MU^`I|Lb|>(F^+G!?pxb&@tsV`}^qXzDJC}jSRB9 zJgw=b7=jp{`%+P%Zctovi-oIpFqMEIeaph{o<+Y2{1rh1PogK&K)8YaQpJ7rc9oS# zV6Itp^;4zpZ#TYWKslyRfm40R_Z3`0zn32-ak0B?l zu=PNAG|GDN_;LPAb3v^1-s8RY+hdHp24B2fuZBHgBIGj#U5GYNe+(QN?7TqTMIQ%KJ0 zAPjYxmvhX0PtKjfzBClD$FfW;a!k9otB2!fKzf44eR8sq%Hi8hgaCO}uF+p@s0lpn zBe$z^Ic((1c$+ImW}NJT6+nNyX47cHsK%t1Ev0I%64P9o>kq6zAlWp8O zJ77*lV`dv(Jya@Zpv5?s^t!Q8kBhn2+%`L-tf%*C!|qR$SR4lvh%$Uw3r_jQGZ!(j zSNDiXNGPXGSuV}vpc@$*Z^|#Ewyak^b?TJQ@|Jh2wwvPu4aKbf_n6;kA6t!QJVeoG z8hvOiqyLU4URq3#7S^7kO!e^m&jw7mqP|mCq1c4Lsp|B*=Y}C!^7>CpOHXt=h89E) zKgxLi{O-_BX^JvnLQfV~*104`y(-<-hI<~JJeQaMYepLeA`&Ql`!R1o)btvTvmgD? z4iE=**J)gABnZmR(;Dh3CFtjS?q_b@vW2kb^80mOyKi0mz(?VT(K-g+{cKjMf1G(p zZ5*ptizB6J-6}J5wSQYzw-xGyf|(>ep7DB6x5eH@Mw(Z+j(0`780&x5e)pRlXsV|`uXx*=Vi$3N=#xD6wN>v#_MbDIE zhNV!+F?6Z|l)wDHl)5g-o*NMMTNf&dJ9H7~h$}#*o)Qs>0Mg^%lP1E`J%F44`)ibe zXQr#uIv(PRg461aU=Iu$43floIz5O;C6{)1YYOuv2iFO1oGk_Z259x_%KR}kokqhL zHb`1OqAHwP%xK(r_}bFg*3?$dWg4Kwmne)nUlf-7ueL&O5h+g^gmJ1wAn0t?zxH~J zs(r`Py^h~7@uE7O3qz7$D0*k~83un$PiL8b3}bokO1pqL6QN(>Nb(b3tkl!dNz%?d zU;ayC{7TRI_<@K>J6+=EU)Fw$)nNO7cG^7u+ zv^eU@X2pgAc=~Li1=t+{RfeXfwWtMJZFZb>Dfh5=?#w1;7n?sqWF6#Qf+$913F(hA zP(eXp^YV&&5tS&8PL_E`1HH&J%{HIH=8KT4DC-&!L-Trjdj4Oa^c~XS$D^DmXuer! zRSQ=sC!Z`cnR_UQdZzUXx=JsO=>C*_w>|hnecNO4Jz3dK0 zh5KMBlvy_8^ATV2XZL_Utkyp_HipyKbFokLJx&cghAQ26m??C`Iiqby-BfB^@5jut z@a0+P#Fv-1{@*JkK2wC49U2Pc2A89I3h`gyCHduNH%6)i__J~)@7~SU@p&Mk2u#mx zJsk4`!8q<8hBMMv?MzPZ&0XHs8B(dc84gj)Yx|t4xK7k zfc()%HMpc*o^LfF37_JTAHc#l_hrzEJE1^sy!Hpcj9qbwj~cKsoX|$c!h4|6`(xw$ zmX%&ixIX^~-@h`~j^0L7y|-+NR?`G=$FOrR=eCT)q*+^1EJjcNKGMOuBAdsnspwtt ze{kCK<>J21)~;(rYC`7&eFi>Kc$)b}V&*ZAZtsk}{j9#|dR=Pw?92?%+sn%v<_OZ@ z-?0FGqGX_+!%>rnYN)PO2XaNv1*Z^WtUZ^hnB>G^@TUIa2b!(k+2xcIYeizWirv7j zGBq;i3ud5mVVN5L|;%zNq7y0Yy}be_B-3+1?&S|wFq_}&KM@7I6d|g>vvazcwmJ7r(A?gdzR+7$@`|Z!2&Ys6C$H(A=OoC zz$e`zM^;)Iel%a>HD7@ETHkkU*pD00dS=0kCAWWIAlU@4|F+3jMi}ix42A?4Wp}jw zu1IA8_9t0YUU?Nvz{GtQgJ|r(tQ3vT08l2_;>*izr|9WywPpf=l&A(1ETc4$29zEw ztD+lxe9sB=PAJfEP`TEvn?ak=J!K6f3>fPjNgwo4BM@r}@#BM2Kv|6rcCX1Kv@8YElzMTty>_@Eku@Os$rIfiQ^g;TSwHwct!M+#)~iagB_@rg z4po$GH}b^DYC!Owm~P8BQt%J&(5O-t7ypWWcO;(CNwiUIBcIgJL;XaRMymf4uoIs9 z1w>E%O#J(M1OcJA&)}$QjPTN5o+DFon$)9CvPH*b?xEN$U;3U6#xc_0m!7p|<(Ge9 z-sJLEAF43Pm+O@g5C~ke`egyso)%Xjh0O-T0`>td}yIiB+o40r8{qtyww zLLE+tY&R#7ILs6__-^oiwFnpp$lMSPJxrY-A;Pq!`-lFTqOE0?iBVC;;Gf>UU5PM@ zW#c1XzrxR@wrQ$^54jm1f)j8tmHeR@+gC7{G@l~e8@6s80TwY4WXMF3usSeR>s@BK z0Q|H$U)2(^z|b^HeD$_ zR^N;>wT4w4ln!UT1JCdzFz$EsItV2xnoVLDY3$au6+XY*zoevs;@4b1oQw&65)UqHxAn&tI$*d*(`!U0M z5;{P+LV>M>yVV*B-%STacU?|zQ<9sn<|ov~^5 zJk0yN`@hVC7rEox8`jX83)6#|m=v`e960pC*ggvElDN3D3IgYaO&B-JKWGFZdpLb2 zp>b@jI|{_l*^?g-<^UP0k&jA)vgrqz-kynZ7qAB+!or*uJ-#pgIiF{SK|N7-eW0!U zL}37#PE>>Kh@!7b3*h}c5DmaqY)N;S&;~vJ^y$-Rz}|SDWvJ{iRA#W!kh&R$Rd(PJ0bT4AwXDTmC0snge#|vW zNhOoXxBJt-VHvX=A6TWZ<9g$LN)-L-RdX!Ts-YBG$MgK3z#XcK|bsqemn0 zKXtzo5OQ8Iib)VfZEe$1OT!@C+=G%F0>#XXjF~3JwY&lX(p5*c;WL2> z0L%{|;0$qmu&_ogB);@0Y9$nqKlDYn;b#y7heZ#-ra+H`&79Y=v!|$wg4DaEE5!>V z$zp)t*fkno8fJ%fM<=xv;~JCvaml7(+)@M;Fb> z^~osD0=eK5*zj{SaC9K>Y}oQU%(i0yfeDi$Y(2n5?I=I&7!D{OV65uk7arng{$KSs8hzLY!t8@&g5Fb> zfP*hv(Dh#8Xc;O}!t51Y23q7tQy0NggM;|f;sd=w`6|jeQB?!!YRR2=XW+4WvAv3_ zIo(-+RT5E$GTWz{ zjLw4%M^K4~?vqOHj#0>bg0J%cEV5Z-;HlEt2xkM_MyR%MBLBy1m_-Hteen&J5TPw< zjN4WBV&!uXZ#TBorgdi-w~o1^p2Y9(HFdZfwZz+fHolCGqktH<1hyM7+?x0P2tN7A zXZrFFIOxwa53>TWvp+xH(9Ti}_!YYvJ?$B8?;?6Tm=5ZI=vrUjPtkbMGSFn9SJjiZ z^o+tWsew-M8|4izf+38Z5rw?F11$MuQnLik&{u zlDZRxmm3Z;EH8m&{KF?+jK0bnTi@#Ze_Vh7-tH_+`T&q2&Fd4zS^qVib}_W0#^6Zc zO5?h`0a*@mgcE)CWA4SobRUAQsK&YjphCV-&J#r;i(e;`+}{KV2)qiTG4h|>F@%vw zG*`-}@vZs~V?hLgwU$r9jwK9uoO+52Wp5EKNmu$VqD&ZnpuI=T?hz&vKsG1*I6!{? zG)_bbD5dZnF{+VLP~gEa`$!zKZJRfzV5){Lb7*R6>ic(q%7?#X__Cmt3s2ZY{aBnu z!?qZ7@aGLs5#$_K#5ek@Q?Pk6ihr!WsS~>QC&~|p=n6pRJ^QC2dzFaF5-ouhzm0l= z%O<=URJ`Xdojrd5(-O$wfZKwVh&iJ4e+pmBb3TGEw?B8YlN=v1pGjXh+!#KLPkWb@ z!$S(GqPh85`EtGi28!?AzyDg|{vBzMTS!O+h#XK*bjY}$=;u7%fN}Eg>%4>g0Javw zOT1irlcBc12r~-{cbJ>~DwMXiEd!RR2&5RAV+@<>6m(um;kp_(AD?7ZgrO@rwu!W}r#I7xDt0BH2rm;oo(mS>lh$nuW;>(f**INMKVWI92C^M)FtBK$ ztBcmF+Pn0heF9&r0#}_N%B={^0)g&wJ>QPX0t0-rg}P6xU1J(4QT`&X6|5)(q4?Va zmJ-08DeOyyUsZO;M>m;uq)x!Lq!-MpWFkZ-HN;bhHzIVqHABd%D%rlMPme1Qpiz2S zTIu}9<4|gp4(%;OA$j&*lX_K87DjWa!!8A&E(?N}PP~j@&O&Dn96;dzag7X^>tmn^ z=;G`wuTzkwvAH_>$ij`?z`2m|?#0AtllNWt8e;hja=%E0Q%u;Zf&S?X&;k%Gik34G z-2j#6TNi*)OT@S3A-g@5J^Gjn?0~5)wmbjNqC`AULqnr}_ztUY57GVZQxe{;tQ=3{ z>Uv$A^@N3)nM(~xu!b7q)R0wO78D#@cW28HY(+TW&?3@n{xC*iax#!>pkpwDWeh2& z@cv4G|Dj92Bl}PXLyR+f9!xC`qmpngk1MiV@cQIl^yS5lN2)PvB)4tbB@m9_vYTey zn!-HXK+*wrOd1AlY!#uy?0=|UJ{mZPOoMg^-NncMpCS?R4D=&Hk8wDCkn-lxAyZ(x zB?YP+&SlsOw+uKR9GG*+FakwVnBF||Xf45g+$|T-=&nQ&eN$bHog`hUZ0m{`uE(QC zpIPvm?m@wSd0C9&-ff5ch+Z30K)qx8z@$xpfEC}~sn@EEojw;B(JR9FBF`cR_^t;a zee?}qz)?VS=>B7@v@wKNlH?1L5<@JAKOJPOYfFp#gV@sU<|4hiyqu#bWQ(-?M0X#UIqOYJX`GG z-Y_MjpN3ijpYxs*?RmfD$&=f=g#5(vmI}X3MrsQICf#@?!&IGpi({cT)To<-vZ(K) ztizk4UfIv?4oS)AzuKJm2duWXS~tG+61tCu#Lgkf4Aq~)e$ka!GCTWyB+kjHU$I-6 zM7H3hq#eXCZ9S)1B_HkMXctRuQGwXdPWtX*+SFB4+r^1ARVKZ7rD)!&biYf+@oz(S zly_zy+tDjEK^TV8CO@NpkXX96DZddR2v~Y3Uj`jzQ@CY89f{`Q$lw15$QH7I#f%1L zWn*IwzS^bBa+C3|NeisRmQ;QHCd|y?v`HkcFV{4d|L%SIm7(7RDeJZx@F3G{g4Ze| z13V~UG}0U!iaH#L+8zbQ{ZeZ8IR}ONXxtKL?Dhk|=f2Tf2IwX{>@}$P4fmHNqSN_< zVO-eZ#7oaCdz^u=Z20+xPpgYDqmcTfK_HT{@3^4_r!SloKG z(KJJc5ZF1D9FRi&jGhXu1f3ScO8Q4@mcmi1D@tvM=f?G!oOG7sV`pc_bYm-i{KX(n z+GAt}qZcQsyO2MmXu+H``}GvcN)vVJhrTtaQ zQMU&*fdGM>D0=rEeR2Y*=;W^a0T*20OI~KGs(w{gIFpf!qcvVFY8o&r)cVS#1KuU+ zhE*8#94`Fb%*;$kW-Om!d_01O^)QWqujzD`i-qLxnuErsK#7xa3_utM$89+uM5kLS zOCe*O_rUM_lCT$}!HDdhw)BlC4ZT=ym)+Mi_F{|71Y!j?IpH{Be@;uQwq&aO-OgzB zMa%@&uvRk(YZ(m6RmM{+LMoA@8;GG#BrLAg>cL~%&dY(gqrpK(D-VVl@8oF1zd1{S zLsc0dNdDT*m!^8-Y0Q}-Zg$}wMXCM&ULt~EQ>q0iB@hp zqMxTI>@G;lU9cq-R?IX;*L3eptv;gc8bw~zA!`Kp-quV|N=bC#ifb_t>6h<0f0~_DBcpa*ISJ(()Vb1S@l$;6VRTU|$pzuVVe+5A>?WRS#Jq-=HfVnGzqXG|Isf7^#l6C>?q@N-` zBnZ7=PF;f;VR~15gDtW2_DUieK5<^_?_lMkU9#V}%GJh8r5o{caamz%wAJoS7CRmGzu>Gi0SEq$HLBD4M_p+afEJwEGuBM; zbQcvDgW(Oo74REM=C8a(32!c*RdVwtdv?e7fdRi8f5R~NLs$Fo?p1zIC2`#J9`jWogZ{y(5=czJr3E)ItBhF+)L^G5quXpsYo4n zIuIm%3>ctNkdAgl)DD~Zz-_8)mjm80K4K8SZ%FFjf^3g?iI(y!D1bmg0Uo(50WiDd z;__528TItggYSN$Tl~OR{fgrJQWA&U^FR5w0_J#;iCWtF=- zo*i7x8nIonxcEM=#Md=qc6?sHr|VEK*V}z^uh9Vu%UD-e*U3p{isv#IaES0a_pe}_ zylv;syz*uNs)tOd+`QVm7_+L7NHA&PX^Dmx+sJy&1smYEtaVGM2axTxKeLI1ShO>5 z2$-?pIg^kfh`9R-?ANY*K04gMr3UK^Jc&aUSI2W+5+v-WZr{bJ)RL5x*L8K7XpxDN zfRxLSrgeU}80Mx3Tu1~&flbj!z`x9*3I_D9INj2M`lwljS8$ilHZgm3^0HuP!tXKgn8F#TwZXd!YxML8qK$@>gXuMH#$?W@4$gXVrW*jwT;JR5f*Yc!ot4B zs|69n-bn#5yNBISGlBQo2<4J@*;RBbx->Ub_2|{he||nUe`OFeCG@Ul8joX;RWW4U zHJ8gUnSJRleETs#UtILmUHpm{H4W@dD|H&63;XrgN7?Cc8^oMmWn~GRCK%fQ2fr-V z5pj>=u!@nC2F{@G2edD{1@z$Ky-OkQut91oGaK83#xt9WE0bhl4YW!$_D*xiEDvVx z-S+J7?%cYy_Swnyf81CL_UnUqz9aGe4>0fF+4Bd)N&?ykHqp2B!YSG46c(C~Q%Y+t!Djx%;g+#LIfA8fxV0b|SEXd_#zJHa=?u)U1eot>aVq69?SxA11YLDIQ5 zS4Zc)l?;Ls%J&h%rVbfxth}GO?=|-`<4i)BQP$UZmddgI6B~V*ypL?GE!w4at8=t< zQ^-@`9n2K^`@R1KQ#n^ON4|f5n-{QZSGQ`G2~PS#(&WC5a`(5!*-~HtE@nq3Bm=6K5U1D z)JtaO@NYGi45c1%d5ZauB+ua zw5Gti3lNbIKz59ZQ2PD@)3RP-E&&9q5Cu)(Z5RR(N)TEK70^4b?ENp}3)&3%nIvfcig22975*gi{P3=LZ_ zW*=@&tbptYT1qcm#8glkfkr>-Yr!6ZF}m)=r2$y4DHrSDu`B1hi9`KLPT`msVAbg%*v}ckyxttiC%Qjx+uM$$>+a z3ok=1CV<7l)j&`08zL-GCX7fGrEWBkL1luzVIbZgl0`o*wGd44FYajvIwSWv-!!{$ zz#Iy|^~yJ#F?j$@`F&FV)dO>9RF`I$sIU%sfl7%OcAzf8FwS2D^?haNNq1$^UQsme z5CY=;qT|6%#~_;Et5s{)V#h-xaP95evEgo*qU{204OtYy1oi*=?Oi~DLup*Y$d}>Dd^};IU-y2>Fh?@d&|9*NkOoLa{)|mP})1reTcH@7{&dcu8BY10En4`&dUwENx_`r=TuG-3WXI z^8uy4U=NWUyANP56079VZCFbU^)W5%TliUCXr5t&izZTA3ZA|9_5H`jqra$RLL_kYKZp{^nOx4^%-*Bqa!_XDYD zdS(WYxS~KffzcP#b16>|&nx1EIeG2ctpGAWn!$|4Sw8M&XsDOHHHW?FC1QI3I7Z>Z z2YP{V(eAM!nT8mfVw}SpnqFG^u;(XIg82d)%1wOm0uJL-?rEz5PVj8l5T`34EG+C} zrugORi4qTI;J~HE2bEE5p#sIJ6UK+Y!NVLV_8UtjH=dejilSHRrt*U){?{J?rYuUl z%i{gX9@a8Mg>im$%!&z^>z`yX`A5i5avKa}(%YRbCIbZcLX){GT({>?26Q=};tDK2 zP=qkyk$+oWliGcB!P>7Ws*1Gmg@1JrW_<s(Zap`v zzqs*OD6DUW`un)!4_t$c{~P8E48Sfs!GU7%oSB;o3kd;ghseqZC=-$$!%SA!k`WBVzn09}O6{U&6k3<^2(Z?vOS0au0M@= z40Q`uCnsSPuDf8g;P?mXqz=d3?WkC{`Xte-$;u|KqiZ=^2cEojg8~Pw^gz=TYsxjo z=k+9#AWDl$!YdaF9AsVqk@)hPpc25uJha9im&&0^SxhW|cva~4Bze%FoGFN-@dg<} zB#XWX9H)^{v5mP7(uPRzBNSD36keDe!)kZ3HI;4r3VtdCNTYsh!OBK;XG6)b9KD&v z*WcvdU3gNjkIsE;0JpD;jSaEih4U^%}jB|m=#6$z-e=#c@EvGu=iZ{H;?4c&M$ zC4l9#ZSW0c8EkM2Ks)<(2skASz$}Gk)wm znvyl@%GO0If&t=XB0`Ogaq!Bx(r7VOw+^R6h!nZ@GBA^B^r|wd3B}u_q(pIZ-C(a= z&^0kKvNhn=TJBaR6W0@v@yniR@0vglD-nfU`?l3*FUgjG!~X!JGaw&=D2AdDG`jB^ z7Rr@UufIa6F*`T+Vay#*j))GEw(ki*Cs0)T;n5~Flr*pyt#V%~u*KIrTuY%_O6ogb?`5Ivz2;DITwP^T`@Mp<71ec&Hg;#*a+I8PAj0YHl*f>OC z5D*s=vmr=m#(N)Qh7wirj)PQ5#LvZZ9gm|!Lyy2$)6H$?l*|R7+w1xG9OU@qeg$5~ z8&`uBi4yViKIui%swiT1WKn;S%K$R+&;Ep#B?)z|M8yHuaIIZ{1z`UUp2LMP!PQu9 ze(Tl&Kw)(elyl`-9geVAx*ru)fSM3dp=;p5DqtF_xY*zv>plD9KSYd7y|i6*P=JAz z;#gP=DiaE0$VW&XmEcmLc0gxm8OiDf6(g4#K+(6qK#&ozE}lO zsW^5~B_%${Zl0OGtW}@SyuiE5x5#-OcMItdk|%LSAcb=2#zhOWT^7mDv_koURv`>y;B1*DpGC<+Ubfq)%8zq`Qxc{Ls+$e=5n z&{`b$vnVENi~TvJ1qTC?ES)wfrSQ($k|vmmubxcsv2$MJ=E_m24`{rv@H*Qa3o-MX zvAlLC6#ELH$wx}}R$8-p=I2icdXbfs;v;ChriRzz&>ELTtL}k!fl(HOP7+Z!XuSOs zz`+M7s=6MXxl>$*+a!USQnib^l1{WjGy zol>=+{oPReCnZ%@SBt^r1WyEWLmG*iY$*8|Wq7W;G?TxG0`?Sf-Ff)%JvFo&7_ZN` z+~!m6{v!2P!%8YD4gjYDf%`{o?0@14~ zK8y!U;^3w8gLAWbexh{s6&`t7zSEI6Cj3cgb#LlVVgaJFePWF-aa!QrTme{jBLSL%ku+f$n>@xg;lU~-d1ubrB_2b)VilW=D! zAv{J0{A8x?=7(#gnwNPOwmOIh{xel!S|bnAEhMVC7cS)MXM(g2KiY5cETlgNkh3Oq zASA($`tu7e8y7HMT}Pof7h1p<2lNht{af_v6;1?1W}~C#3hZ=w574oCx!(X#f26u` zdrUB4c|l_ihQWz0IkLTs^CuI_0u_}v=CDKhJp7{o0zeahq)YC(?+<9Rra2i&e+h~; zwGF0}(TAh&+)ABB!0me8GN@*n z8r*z}mhGV3|8W7P$b+bK9P6|Cu?SWYUvwSvY4u5Wt<=2ST*EAr(;wz10l8LF8AGff zLoOBD8w>pB?p+>;;RsCDoYemp<+PPH1iEm!l;P#Lr@!GOMw(Egfn5Nb21GRgmzv-= zGk9-y&NCZ*X!@&a^#U?d{rMn1cDi9ILMskpHP-WD5y?pWYthz{K9H)5f#af6L4|9S zvfPf(~UK?Iq3hSBN{pN_w$Zs;C4Nn;Hd06WHCr2n;?F9pSGB^}~K@=k0$Qp& z@TZD;osi0Bnn>fC>0mG~4w9g)Ja&NDob{s;3Y(eORO9RpxC-FBh2gxVw(`LZV`QX` z%0cSJe1hb|vuV>2@;;xRGC2FkFuzB}L6OyRMM@T??I3`cS?>5WuvPGSP|!Lxm)_C_ zYRDoOqUiVSQOI*M`_b4Vku>Q)tJs9y$3H@Vut|BL`y%ezW6VR;$Zrp(qy{t3{UEty zwmM+q%<=0=u2MAMm!Xg0#YeE__*x7nsj`>2hPNzUIE{V#hG)C|{U}$AX|{7)+6_!2 z2<%ekLOUEC)O4_j3(-ow`4Lurc(HNEbva?N56=|O!!<(t5sjvakCI`U4gZFbkpFVw zR|E713gt%*!Bn)M_$0X3!<08d*118c4^*xwO_4dpFz3W$gR2e-1>$Tf|NAg_4p0{& z5#!MizaHcVwR*s_o@|j1Kz9Vj&YxueVP+fg&d>!->sPgd5(v#3UdkfUxQ`e5TC1BT+l9TuxSU#QYG@5yFyMbG$I!W*h({em25m2nPsB6c#2$p@uO~_qTS|E{pO=bM> z1sL$zAK=Vi~}yZl=EAju;K^jM5(0Drnc;D#A_G%64RF1E892y){F zl#B|p+Cc$kfh{*Tg`|MFDk?gF@h>))pkYMWcPQNm)gO#4HgI!eFOX@kROew`UC_tz zM=M9~1Vo7vfu*44mj)>4;ErJ3omXbjGbqTR_{v0&tO|SwL})m0Vo@amJG_6-mRX)U zdXz9Im}xqF3)J+MUjwe7nuKYkrd}&PB!vSfAt3?({{?1njEOg9flrUMD92y{hV?8Z z4>Wne2tk{PB>S9v;~fNe&{D&cvBHcSgE6>?lv$ov5cp5}*Jamj(QiQq23Z0O+${9V z4Oe#`1#nwvfof^uZ~D5_3IpxGIT*xuxNy+%n~BRa*Owa))Ymk-qp@*Kg#kC7K$+z; zLrJ{yAE9NLxN^PRNxcwkr2jlDpQpF?4Cm{QxYJDu%2bDzB>amQo2j2Ko9CS(uZfP0bqHPv% z%&E`~O*U2_1g6TkK?SduZlnpO*j0tN#$NOqs7Yt_8Rq4jI&s zWln6y-98PI@(s*YeSN1`pP4PI#uz}3S9gB?DmYwIWWxhcX4Q?qqJ!6jV9c!Q2?HDA zz_V4tQs-wAOark&z*gRxoKZA-(i0j1VnoXO3%&W;HEVXq=@Jalf_nCoP9od30SMhm z7>P8V>6H?n$4Ckfo257~0B8w?dEx_fJ4}p>o|%inz%7B>55}vh0Ca0SQ-ICh4{MXU zn7sLX=Yt&w#>d~`E(XA24%2XCVsU&c{3=X^E9Li*eqx$QVgt(#j6ZmX7Uam*oBXpA zzXnW-=#XXd(H5$cUwKRlfVaI)NJyUyrt+P3-y`OsM5J@h#e73wNcq?ytH-}nnO z8m0y+Q#^mQlMS&Qi1FN&&_|fiazVe*ObvNrmh%x?SZQ1s`KjGm+nanmh8nzsx zrGWy7P~r2oK6mN)?Dct0L7)*7u z3eCZ6B0s+kD+T$rqPk>=29WvDHk46dAkE_F5nC3H9_2=0;^%KbVX_~UH7UaHr)I)l zH%3ie?n@J$N4Wwq*#KaQ=13Sl9*z>`Phf)KW#0Uq@s{i_M;P!(iO&!N=kFhG(AaNS zrLEq7`@sXk`P?&8B=9zh4%%27%jD!>3WXl)De@E-+22ckEgGM2zy65RAXOI09NU3% zPdpF~iC|HZ9<4|C5mZON2>A@ufpUK}G$5@29tuX@3UI18IHSW~LPkKs0%n94OD!i{U8-%W%*E z|IYsS(K6;<8Xz}^NN^3r5I85WQ|N{p5%5vNeCyPb!{c2bV#q=-eCI-e*PB(|%({f| z2K6UizHqp}%7LGBs>tJAJ;IAV89VPLbN)BxKNpc=q`~9EktbdYP3Dy-p8~}Ofheat zjV|jNGrFDV8T2zYp*MDaBzHby-~6BIK_$kvIBTn=Un|qS-UlW7u&xgXz&Tv%J?>i{4!a1A(uYI}E4e?r%zm$|{JMPA$EUA>uQ|Aa2!_< zSQGPZ3xzFqhyU@a0}vq-+*K$UC3yrnwIzA(9Dc0=o`r)$$h&W!zkG>mdM$L}RcT4d zgSw$tB_&Z!r$2%$j^91TLl*ryIT?>Igg+3Z4eYmiO42-v;w3aZoN(m>qX*t-2#6UH zBOkES4Qih2XP1?r)qI+r4eMl-MQK39BsjF*k}CPIAPAXGK@Yv%ZTwEqO~u6nGsZ9w zZ!_-%=NZn9l?9PCUv-fttD)4-)3;!~##Z>6-iAa$IE$@DY_2bpC zd|Cd>FqQa=+~&6TVQcHr`x)5Fo7CDC;_c&e_P)o33*J_d+`5+M&TZ3c$FS9R_~Q*= zC;BUg02n6v(6J)*<94%L5ozh~Yp*TBEDD07f)_WKbxK5^3EL?5wXP|+nztmwQSq1gmaFKN7Vf!f?UOj@1B;Df7br#H|yJf7Lyg{F%*(xxS`>1 zZ)A`MEE*=+YmaT8P8@YV9&p+b?J`+3&rDZ|oZU|`o~|Rw`QchSN*inx61oaz5hm&c zy%r<_%+QcxP=tlux~2GakC5h3;{S-b@$%=&_O`ZO@A2(zQhaCNVT4i~4)u^_5pT+! zz<^`lz>io#!6db{U(}^i612KEr}H#6zXB_0OlAW90#2O4?H@iseWYV=y%u!GH^u(c z&`n1${?^eJVP&WH`w?^Uc||)|4d(;V&l9qiEPB8=5$njlm?O+iU!RRNc%VApzlhoZ zw+H0D)0jm{EQzld7QTj=(Z|)LgRXm_2zrm;Y5noxQ%qREasZ|E{TQRKIT|HWwG7+9Iqp`#|++92bJ#@9G>E*W7t94{ZA zjuOjGK-Ft`pgD-n9J=u8eCc#8q8|Op{K2Xoo}}uYQK+G{wb?X}=GuIJ^XKQwidF^Z z;vr)mxSIUMycXLF39;v?irx=;OwUSZZk~`$)Ro)y>~!$;>&OrQ?T^8ZBCSB~JvfnI zt7sl=>E$F10e&C_xm~)n24jdU6Exdt1-aT_bjG~P$;kny8h@=rI^$L=EG#6x3#iZN zI1i_P9~~7TKEFj&eADD4rnOe<(3UCKjbH+_9~zree`aDz9E}WJ6=L>mEXGAv!QP>$-m`Ko*H%7V13d;r z{X};zEo4!2HZUUuXa3*WASkD?#D0y@zNvD2(!lU=J&={)vzXtp?l@3VkwC}>J3mC| z2`*z8b>WnrY|QfeUCp=kRpI7P#kBoY`3VuO*d-Y(o*_IPH8pFB7AlkaUECG)s&)8N z1H9y;j#^kaww?TjK4tIx@hi18H3STBBjCAKE`8E;9V%F2g2b4f8TfrN;gD8WDLr#W9>>{1Zniu~J&EBgMy=`r3N*q4@ zS8ho;GZm@AneZ z$!aYaMnes*v6=fEtHA@N6Rvg3MZP|uy`2JM0@~gT>h+S6Wl;Sbi-!#Q@$Z)P-9jOc zwgZ9~Yy#RH9VyX_HD1UQGQBx*p zHxAX+#R?;8(5Y)U-XT^AVXdtS;ZynQHO?o1=_Ai#1qjxD-n*ecfS~{2!T7*{b;^)| z6Cg|gISW@0C@8>z9!pyC%gg_uNHrFo@RQlT9j@^T)1h*)zL4_E$Y>D9+-6#bjYJw1 zlap(KW(R*Ds!&l$a2MRu@46Q+gxF*uB?U&t7E16I1a~0l=Nuhj0NXTBx!qDM7j^E- zmoU_xpwm&@Z=uwY@pTSq^CcD(Tr@Da^|Tp#_|V1$osm6Jb+^GbEr3)|J2WlPrf5% z`nc0*Vu26i;}5Y}6OdzMBsVsA;K;O@zi)+6qWHQSPn+|>d?+lOUsza}oyAhITOlF+ z7ha*DCd{-^gc=$e0uqTQ{!n7xT>%rSL3W23>NsFqwdFjaHAMQj*sQ#ji~N0j+}PNd zjg^&LyJ=(0yPg7j0|bIGk=4XHvPd0pX+Rx3WY0hvWkOjhw@&jYx(b5rhq=&=8#`yi z$Kp2Qi-L@ik)gFYvh(xjI}z2axT~l0itzXf3p?uSg53r0!8=h%P!P+rthKAkva)Wt z2TnV~#S<3PkVhyfL#yWuXH$urZ$ygxfy~J zll|~ju}>YYh6~{4b&Q!et1LgcF(bzjc9$V452ge7yHmHYm$$bHYEf($^1@mJcxt+z zFYJ;0p)5M;s<;{dQ7Yw*fVOo^WEgeHWM9QK6m(J7-im?3l6hd|koY=8zOZG|#ceKl z9VnPt|I%QELO9NyaMmW5&9xoD5KX>%OB%BAWiU1mWm;jAVLs{uOsG*4w80p_TfXF& zJ*iUsC{Hwo$6R1~?jCz#)6SmIjHJp~VPsSFX%|X=i=2Dzy!R@P^#D7Z;2W|$b;>~L z_2M6JsPEmqdl}yoD3Y^-19my!jeTK$unpxM-twlUS8^B}N6mp8XL9V=HT14FeIVh0 zxoUvGKo|?c^%S`60}#pwTwtZ>aza6G$e${+zBCd04pFe8Skn7V0GntEgj6nj;-@a^ z|6O6H4`)1kwzeYub5|E-ud9_4b#P*00t9&@o_W;j+-p2vqS>mLdAlvmSho=W2zB$P zj~@lTIoM22qT5h-Nj*sNZGg=uX*KVn!`O~P{1r@9ZS6V) zq|$F2FIqLq<>0g)q4nlGQ$J8;I%5G?jD`5J7QXnWX@szjs56pLzba(1>JX;}5+*YCuuOJ`C14gLAh z+B%KIK~%};4Sr(~g_I6hi;ay9Uhz^*S&2a7L6Jrb!8G1wg4GsZaO&y;HL!(E_;N06 z+)^0+9>9JYnAKHeScflSREQRF|JC0`M!9&p;-!b!=FD_f5$`Dei{Bq zMp@4vKmLwwyx@HkG9I8)(Q$Ev?l%8y$% zZB=;waufH})Zm{#*|0noF{%?&*Z(Okz=A4|ycZdH^yJAEI6Fl&o~#nqMxZ=Y+i?_I zZ^7FH+8tO?3akg6Az~tace(SIJq1e&#DYVE=3DBEhkv8h+4K9(iPYAwBO_w5$S|`+ zjy!{H^_Se-uyPZ7FvJlOPz5qGs$!S(sZ+v8n|>Q75nys{m~Za0f;ib}q@jBZhHVhs zc{=ad^CIcE2$#(97Zb-SmNuN=?&0_Z6H=<&@kJNRN_PT3*hG0B6}R8-AhCQG-YfX? z^r>vRkyP|yq&)W#&RGRL$W57c+9$k^&3iS8p{4NUA62mUeh?G00FjJXAm-;cw3ZLR zJ+Je_69akmq9#i-Gd`5+i$AQ@Wxc>tar2=TxNtC#=!6Mstn-rw*AC*?pFh7NQU`A^um9Y6-Y_@CFJAIA?5~3lF}k$XOcZ+MdklnA1N=+e!q>P4 zQ;g^F6fSmC;^Ym6Ez!jh{&VG5d|(u*<^ZC@sVnmv#tg}#&mnNcF^m9} zw)RgXo|+SIGY1EqiXlt`0nY{+UbrBy0DR6JRkQCj2GTXB-L72&l*CWeC-zN(frj|+ zy25+dZ>G53sztgZt}T`iqHe+GKha|)d*ZMabM#?NCC2K?@~q1Dh|HT4+hg#<-W{^H zzJXFEum#MTLW}MA3INkWxj;u0r@Rpv-e0*Qt9wdUZXOlod%-_Lf&BDZwRV&TiV&<$ z_rLV~?Xh-sW{2Z63By&_HuEqsco;o>>f-6Sh>4rcF8d5iE31AWrtg#K28QnLbDb+e zz}r_iQ%ti#9p+X;^=4DTNg~B^{NZP+WCgVYAI>Oi4p0l~>Nl9+bE{!)X=t~L9g)x8 z-abwj??gk1<4FHD*Nnd^ZkK|%;XVZZ%NUO?=tWk;sG?8cT3vY6U0cg~HNDoKgAN%H zS_loSuK)2P*G$Ia;zhCen%F?K0sQz=K9jpQ+rP}sU0m+_%h_R_Y`E7$Onb`T$IT6$ z9vT$8ZXqU;ubbY&F)dQ3U&nm6r)nD z^&e@-%_v)ug!0qsh~x3kv=+K6B8Is}QB&)Rc1;U!><)Y&j;wu# zlbv46f+uxdyH?ewBoF%s8@^otIQ@ctkcuXx#{TQAU_isrweExhtLdGixs-z^74cf$(5jUyI%9` zsJQ6rYL;uoAXKp`H;>;N7P1v+7Qkwi*mv`!bhPEG3wBON_K-;Dh_>Cd>dSpFS&_1d zC)dy*1*$^2QS{xrz_M63M?%zc&M8bn?lxL>xSD|G?(DoJUeg|UrI65gvkZ@>GNeIi z#&S%-)p;;Ma4dAKUKa~V8|0)YUT$d98JV!i8R|n+2!00-;sK!Y0^J<}ph(n~$CF7E zR(HH>-y{ysH$u1wPgvK0Nqw6{58%4n0$bqW_WyBp=5al)+xvf#k|aeE8WbvNlO(B- zR6;6gletJ_OhTqala!LALa3BNNTw8(Bt%IeBqbz6gE8~>{j`7QpP$#+=bY^7^9=XB z?zOIUUDwk2ejS?Kap&U*GWe-!L6X955zndeKxatCg1J{{Vbom|QJ)mV@M5=I%Xs{y z8?&ZP9mm42EqdLxYuBRzZS;p4N5=oWFs(snTt9$hYKy~x0EuU+$cqyrZPjs{&%N9}qpXLbEwUI4%~l}q%7>D0HJ5wRsfU)Kp$ zoy4WED9fmWVP9qBpqel*V&Cw&OP4Ul*3;u3R zKp4_w7DiJ#Nl9gH+EfNWd9bX(;ZG}>A&E?nvD#ee{J%eDu;^tpqk+tSzA{{a2H4MlZe!jwHC_Ewu?pxD#4gCv4OaZ#3DQEG zDh&u%O~BS)!*tEe`mQ@MoLPWpqN6M5dQX|sm3O7kyLYGpwOGhl`@+@PbE@4ctEy~G z!%9(&foQH2Epb)8o$NvI$O_U?!+|jq*7K?@TYmrEI6`+PmR@Cd?wm|Z^QC-BpgHu^1tp6?Albi6d*p$bx()0gmm43e-na5Z`3z;p@KUtY=$Bd@n;;$J9N#FINwBUjv zi*RNdz4|Lxw#=B(OU`nbs`XUgJ(~bZ#pT%Cyoyrl(WCW1#q4@l3gtJ?OHc|jaRY`J zHO*}{6KS3Z`f$WadvLc>{TGGXwvUHObiDaOZP2mqa$X~ocwaR&^P+46zva4Jak-) zPjfsQ?f@qwqH5ElP+Gu60*XBZOCTVi@a9dKc_(k{gFqUlFLRX-0Re6LeU%xRG+}ts zqDvw51lR@MrW@bZXG)@;dAvQ!(59ng^{%w!AX>C;D?ifJ0Q5{3;x z!4}3=rjH$AJr!zzR#Y10>6I%9NxEe9l+S2maT(GFu>}5kJ1tZ0e-9zBOB2i*qQ3-H zQW6V}6O4kk@mKN0sg;0@JZ-Zk2Ms)P0DmzvgFjPTA91921@Ohad;Jt-ZrJR0SUfA^ zD-!>$-%IAx+16-tWrG6_n2k*$uVKMy1)^z|?Ghlk4kH8dze@|kqwG+IqpnD*Gwo78 zbJnaIH*VZFO2E&CgR)jzoGx^KT$M1?9Ql}znw19K4!x*PIM(JtejvGqk%Co~FP?cY zRjjoXuOOFrOIL1@aa1b2k!;e=sYW{j?77?9J_ZBTT* z>Cn=ZD-YEUqtb%qE}o6zQ0dnPR@Iz$O#y{LOvp+TQ)-$h5MULe0suok>#csJo&d<$*weHVU8OrEmO~AAX zraMZRO5bbyVvUQIFEOcAc>DhS!H*{TfinzjQ=IOP6WYf59tyV|Kz-D;W%5A3#~r1w zeR78~W!uRuH`6ZyJ~hAYG=Ma_XU>rINS}{p?OwcM#c#+r2f+;e`u>9|%FdujW~eE! z?vzQB3}@O1{@J1v&ii5pCf~oWUKMndn^`hrLE5jJUNKMTlALTVs7{@WopFE&>c_JvqlD2{j*N%^ z3WzFA>U(xeRK0y2bM5+XmtXH1EOsyW$A#EqGhsr}g3RRP{^EG;6?QcIOp|5R-br}7nlA&)pmm;6CJ7K&}tps4G8>1jpbY#QD4f&5j zes0zWQblonB2<+RnT7$ViHWUgm#oKCRUJEaAGRyoOXBm=H=jxx6Nx)gRe*J707be%R z1(uVuXboB(YYLg2AtTi_HDl0q;c}n%>C;ze@9+#jMh`|sWs*VWG(|MLdIkLq7%J1n z{8f4=eDV!V*$rr0@zqrWu+B?&)NR>%^VLVv=dIsg#kNfbFa%^1r(L~Rh=hP~lWb6L z?lE<;ykIbraiuF ze#$cK!Ub@DwYbX_#m}DoMgY-9I#fkVk~|)>(BQzp< z=>L#9$B*6mhcOCcnAXL1HW@Vv66t%a=i$4El;oz(|B`-_jI+8CY<4Vk7?$pQnE`$r zzLS#6MNX=z={)3}sF#@cIodKUFK;WQD6GnB-PU<|-Mn*WGpVNbm{bOzzAND|k$2hs z$`b@v8_vr7&rIQZ*Vs5HN@QwL5NC}tGs9PhxiVED4=q@Ea5Xi3Ufu2~?oM4@8BL%1 z8(r^@^KpGE{|%^i&PWm8f*vy0$;lgv5f+21@vy>(Ci{7o*Ke6ed;B$99^|MGek@_2 zwz(5c_29zOr`#{TaP9Q#hMKA>EQ|WOZqcMus`5&ve;$E0HU0X?{)3aZk^Vjv)Zo~X z;;Vl{#{Q}+4S^KQMgtFAytrYI?4&+ZD)N3jIDJET`_m^+R#u(S)Y5uUTM*FR_`+_~ zZTado2rx-^4=SIRwmo+n#~C|nM3 zNFfi-eeq(fkFp0e91cN(x&QHl+c;7#%~{ECu8uk8@qMSwSh{3CBiGNIDucM!;GNBg zt4S&MmC{qYG24u+H~JPBT%*1KLyZo|EqC$-vLKGEFP}eqWzVS^_P~M@o|1TBNu__y zQ77Uk;OVZ22+aP}*{G?k&HwV^Rv@s;Aby>7WO(im9@dm^$GyTC%E(BRcxa)frZy|%VNsD3 zWw_(qxe4tVg`#W_@n|*%bvDVJ<>iCF3|_zgPToCUcenKs!&&Lur=Q?~tYe_$BBM31 z=;LABiwWnqKRc4r=pikL$YsL@}V>>Q#SArgsN$ye^apT$J#~Tc<%m~IiVx^~N z`IniOzNn|(R*_G=Eo6bEifv%|YrejRC=N1c1A|(BoyVE zw@llIs{n{m@l{&v4BRq}ET%v(Ty2!qLW?{DE0k)7Qp-dysyDG|_8bl0fnQN5bpQrG zynmlsW+@@$Cy0C0=X%2@Ugowxqn#ssRHb`_TG3ZDnle5*XB$bo=3P0VtgP zb|xX@NS}UU;^KHEFx%n)0v9K2+zTb6De!iC|3x(%BlchENlG4;`kC6N3r(jxvLxpE zZGHo|q20i0%ag-j~rqaRTFD9#pH-DVCKUK$1mXx5&%7O6n4SJkecs!HIP*VYM;f_=JxU6;Sm%DsD z{bhqeKkd7Rz7(a&KRtn~=tNSQ7GJG^=Qd*o>;YJR1_LD~J^??)px?MDl36#r!j|)) zexl=hY{_^_%i4K;gbHObPq+%VVx^lKO}Npk>m}pjVq!!)It9y1VG?it!93yGwIou4 zW5+^>DTO8Xd!L&wthzMPz`$Q&)>-#kc-!0gB+;!!7uYY5{F=GzV_E}RU0-b5CL#U7 zV%Z@muLgrf$PJklf0z4Aiv1bfX{N=*QVZe^L4;?hJxi}x98}I$Q~Nf76Q6V7V{2>n zrvs2Af%V?kOyB6`I?&XCP_3A!fs>Vl;?73Ah?mm4wa9XL6wZu=%8*tB)lH)4$-TDDD& zZo2pC{rg|MoRLOG=4T=g71nWNl^e0cJTIG9FicP~3t`GGSn^O2sd3Fl&gyuX*|(Q! z-7i*{q^FEoi&9cEsMB(97T?fA7G*t-hEcZQ*kp1BKySGjj_cNam27bK?@R&U zsPymDsS=}$g1tDA)~(xj%YEZ}rAZyt2L+f_M-6JP$~n75-RXehJuIOfnjI^W*Kn&5iJQ~a)<}rEa&WW}rlqpp-p+M$yE?=gW7VlR_=NLH&GtX#c0D3M5 zN|s5)h4212?L{mOuuF1{>)%e;IeT%K0o6b9tTs@p-qnGw(n&abx-DJ$`$cu!Sh%W! z?4Ki5e;ZeMxd z$l}6J8+iApoziVtjugXzFk~~^BX|K!Ck0C?vG6#(Ec)HB;CSNE%GKiRCsAH?X#43L ziW=8fJ2l0|qpVVO*9jFyHI9AAOpbW=DT^*x_1I!8KB%i=caF8#o>Tp}?hkw##v$Sd z;FVpSBmEAoS8neI$oiZ0t`ASJOcV!cU{Xc9?>tXslSXZAt>d(5pH9sGeOtG|blrQE zDHVh%ubG@^#ttj+mpZdLpjD#m-prfDPpOzMbMiV(>q)dVL#AahB zH)D?}G1<|fvQ5ynH=1|htf`YHH<#W{O)6Eb-a(=E@B6?}TaQuv-wua%c zQ|+IyK9~ww-^!JC%b6%CVCf?v#JT9(+uNsl{(y}q8?@a=HI;aZ+#H7s!a4bb3xW?w zn($ZyE@$0Un3sgT>|KVK(J5Xyo&lJpV?^|eEo37>M4M3YnIcYPKiF}8GFXFD>2YQ3 z=r52KUwUtVZFTrCyb5Us*^3ldE(Kq42s5WiuAco=84{ZVp@bBki5V16TcE>>9`$v{ zrt8HZGdkjFI&h%WR|{#ul@AquokkW4`GtK>l1F9cN^PYo-$1=*5Ma3q1efd{1lNrc zmji>mpFG-j@rE-1voN;)G;IB|n3;5R+xS!NfW7{9uPtk;AEyg;18L|=v3VZdzpoWD ziA@4DzkyPkE&oGEIEi+Se zWdlGMwsPoJ^7pM<^B{!+a_sVT5rkxsiPDm1qFM@k16Bn6@bd{fiNM`(6+zo=l9}YL zoe)&ea()`@viy9ZQD4sZ;Y)kdn*pFR{JKAUAbC7_q;b)p&(I5+no3`JlU%qpMrwL( z0l?cM-yzlP*96_}p)4+gAj|TKio#dkiB8LR?BCy~<0p5y;RXhdvuBsox1yU8V>w9( zRd&ywMb%f|!;2tf!$ZAH@wGi9V{Xn@dPqh^`X^IUQxP=|iS1J8E(q&U3JCsx@rmBQ zXOA}+6dW#b+ED5e!vuLyForO32*Z?&ziJ$da1^LcknIR758hnM7*p?xh9p6jPFtlHtA+jb`%z_=66LsWR;6e*xzgEkgGz zrfeVqWLr-eVpZ}aIfILJ| zJxzb^L3yBhGJDZ^_44J~Dtn<#+i;?vU3C{2GplJt-O(~0yl*hk2v5{n4;PwW?(TEGnR(-dd?gVxtz8M23Ef2OcsS~AM$kkeGEry2QIbX)HSoT3p+g!B znLZZY<`2RGcGP}MbLbLed4IJ^IzTPqp_fcYk@X)xzv@wCC5?KOR(}|VD645sOREFM zzZ7R79WH|h(Kq~cCH6cUp=S~wFg}tG^ZOj!>snsxjlSe5J*QN_5jbR%yn%pu_t%$u z%Nb73=z}!p<1^-MD1z$XqiVz0Gme9Dauczy3ayGOnV9G(ngCJ#h`qJ=s{JeE-3=ep z*yeRy#nq0X0ryw?IL@D+hi)7>uifi{q1+kMUObYVE?H@Phfq&5l`^o?-+dCox9vGz zFn+Ai4g>|=di9YRUA2js7Bg4}EY|;EU6!Ee;7UdTv8J6~X!q*P8x!oSf-I+sWYiK# zSQ~v>myq2fCk>wQRMB!enj3rjNhxPfoG58Yp5m~1%yV`BQ`!n-Dk1#i97L=&m zd2;GvX(_w4k$3-K-4&Q0w_klEkF*T3Uxji3Y7?W-kAK)`#`LH;L%PYyxlcbo8YZGh z$4$R5P3a4-3R{r|?c*0JjJBX=W22Mrq^0RjJJ{hr=9&<`itR|yB{v~q5pRcfD=iQf z$)-(ajrw-TS$8O0-u&IL$3<_$9=uW+5lOy3PCcIhwqpYIEt; z8`23xsuju?gb$52TlL6qk&vJh*4GT18wcZ-{5;C`9EeB-^1A#b;+YxlpsPebYF|C01=)sW2C7mY1$SNY|y#eJ35I} z{ukxY#!NuxUx@$v%TQ)T(Z=YKS1^%YdYOn>G!ci%Zq9mZ*Q~(+s((UI)Qur_B=E&Y z7AdoP#2vu8t?dtyo%q@Yy*O@&9rzb~twB3yWqEXc|G0~ANrO)inwT&*R8w=@i3j*V zIj1{wX4n!cXgnq-OTI1INO~k;nReueklMGgm@N3wqZ!HNcHZj;X^8{o=}q@nzh{L3 z$C^}e_OW=u@GDjqsI3clG#kHd&hIZ@&Sz$Vlti7IwZhF!(^7ZPpw8<$mOGG%p{27O zFv;GYlfD!26vsU%cOVDfHrZ|5xN+XR8tTT@^8umw9MHvBX0)Hg-J|PE3Bhidcgq!AJF}lI}(a9$*Nv`uKinj>tx4H`BvP|5&n*ftb1tq+0i#X z2R`57b|}0CKOt#pX^vTXwlGVM5`_`j2HsH>9z$4yDjsL$Wvhhv~-6bou2p91a+xuU(bXZVFa5SDhyT?b_=34AG zqbUa#NB<-Uu;j>I*CL|(+ZOp3j^2oeL7y412i6L#BR5v*)Ua^{b60V6$Y?Hn_E)gz z2Hrsy-qm^DJo^eCtesbf9GarRWl_y=2!sz&?ommFGjCpLeJiGxMW45si{ovf--ruZ zL`OmJmfABbbl0QJ*dN`$dw0cBds)GCh`8j`#n!u?9??U?+}APDad$+aIbjrrx6zct z<{O+crUM6?FPzdu(sl3Usl!CMKu1hZAKPofNfk}ti1V0@qvmiwSxBjwdi3b>=U0D| zX9VYN-qo}E?$=&RUVFv#K$*E+TzvcXDPxVb1xe5W>6WL%?mckXv@I2#v0n+hrDh#g;*q!^AMwB`yN@H+;7Elac~=KfDqeKHOrhsOab(;+K_`My$tGt0Ft? zm6%JB|M|-o&SvP7ek84I`RfZ>N#Ml|#YzG2rhSQ`eLFHTVYo>4GXOYVg(MN!3PJ-K z8I(#JF3lM-FE4a#Goj0z?gJ$%^~qJ;ojb$Btvqtq>V1VVHb2|D$f}cun%an$5xrgp#`^E5bg-8W}uRw47*lXO>Z59Y9g-z4w;ztWV{)`#ev~@Md!rFhTm1bT6+4_ zseN>Vv%)cIZJ}W^tZ|TBc4^?2Xmy z7-D4rL(50?HA3DoYhKG)E`jevxI9`dGP_yN?=nU}mcxv+6caUyz|Qyp6-p2^7gfE1b6IX+|h zfzNG-naER5YEHA}D>?{o?%cZN$qt|-XQvQM z0qx4LPNdz(DUdj2b~kPuR1Q8FvtX%kH*h{cUa=Gjh+Jx+k6M#uVhiam9iNMYMa|;Y zPoKvBJvCZlZk_x$bSL-6<@>-U64{&q2Hmfgyn$_(R6kfrR(a_D>#Htt(skJ8@1y)W zd-M0RR$8qsE&gBEjoup@OLLM?klUr#y<0S0;oDeDt%PpXF>Dh$Dlx&g&>&|ekQhzD z50`;i2Ygh66+^9Xg&Qw}2?e6(9sEtAu58&6eO+CZ-o4>SZFo^%uV~3-PD?XeyImcOA=A)Uno60kO}7`6H!M)!o@gRn>j-qyH^S?U@a)4hG&TTP8Z!b;|!dAV^(y5#RRdNI&SwE~&?=(cRxWK;RV z&q(!5eQZxWNKHwRl9t{RAt|^r@Lf{)ycd=TJUmBTjzXR6Ire!kFo&5_?;%HX&Kbo2n4)G&RtK(Oi&@)jEBYh_)nksLS0ZD`R ziILImvwaK}v-)9wS5;YrWvY|z^pwSZIxKYQI&NO9Kcf0i01cn-TNgw}|Hkr>eago( z6ZXxUG&*_se6S~@4;(Oqa)MxW;gwJa4PL=mzs(4JK;wKp`^V*GmOLdVhyS=+yg9x0 zo3m;sj*+!;a(HzS8m;8AykAYC2_$m7L`F#5Vx|l$SyLC+4U(|Xxl~qae(bjB(UfX( zl26W*4+_y^p3(1o=iU|_39=p4lNMdxV8}cG0&$Vf4>S&c&>?gFJ+o@qzmXP>Od?!f zvh&5Xc}OditO1e0pv?InN=8Z+13Q};z7p%%z+gRW4>wOK!D5w|gum&w>d4X+D|Urc zvq2503Vic^LTk_++jyHC%iJ85Qf?D%?!Ys7p=ZLXg-sVl8Y=J{xoBnwN^Pl7QV?Y z(eVx0=gDM>rBA-O5fSp$dpi4UpB;{APpXPi^%w2f65jr$Ij0m?&8`_Va%8Vn#S1{a zfEpAO#EG!Lu+t7MdpkGVTS^lb=%V^oK#Vxv(~RlUsqeTkpnn509Fx_SiH?lcDX`DF zd^|lJJt)dyYS_Swa)ST1_M0IR%m6+;)Dvwur(t1jO>}Ci_U3=3waXxNFlacn@jqbE zoQ|ZDHCu6zlI;DNOMO{2lpe(FmGMct*4}B91O!neFLrkLd=H0% z2TSQ*O{r{*-@W_Z^XI3hp8$qL6O1U)Ww^xnL`PUUQpv-K;137yh^)rDvPKyYMs z2WkUU(_*se*_F?)PT}4L3>?@w=o;GtTBi7f(7`j4H{E%ET@8fV)xNiL>wL{?NR^4~ zZhMn=6---Hd)mI6L7|$0gj& zKYyr_EMpD+-z$mi8VyZFOD$v~m*v-1*9mWzo;^o^g^MZ4aGKGy-cq48l^J((%0|Rkbaa5YC7+ zD&a=KD{oBW0hgXsRD7bXb^O87`=N2}*loAXh>ee*XxgRlPJ-DCeP#3x^@C>{Y+zg) zU4PC3NVfeGUafS%z=OKDtGTVCfLFC39o{yk- zQ`y_Vl2^2KR5isR)eqGmpWx%j0bFOagt!cy}k?%C*;@W=EV$!O> z(3znjmye;wTZ%2)jUl?Ma=F~%<>SW(*baDdc2Ss^#9Il%SAPdV5Eh<2e}2o$s0ri~ z9G`!#%W0zzT*PI{Bu48vP#ute5BUF3DLaTEj=Ia2E=9$q#rvSS$MW-a-|ff1hpq6Q z`rBOYv2s@6_8fIryki!$HOUjMgir3DD`1q}zYh^d5yMs9Go%6gA+gBvugy=erx8|j zN_+I^XLs-JVj+W93RZpBA1++&E}KzUaZxm~TSH54_PNy5S*^+Sc5RNCucuU8E)W+}(7;O@8URHL z#bE=fo|`8h@KM$#ewmsK&7ao z?J7P~zoPS>jJ)+~{(#n@GCQ9a~to@;slvgz0ba%qET;b_S!Z(q@8IU)` zeyhw?`<8txG4MWjZm-Y2)hd^AV^bSN?DfqzR}gNP6 zL#vFTDO@UDmbw}hLBxVMt78C_f#|a5TwUKhFD=9F5H@d4PJ56_`MlY^!C38p4ow&w zivt~}Pv19Zhz@te^vo~?y&*#|5G3bY0h$3*&G4lRPriL!EjFSED#KF z-8(m0g=c!zSt9dKciz}iJ8qW^+h!r&q9CyoQ||wFat}bl3fxM2)Z8niz1iOT}o3M8_p7 zR=_c@n<8O{!%`A+fR`_K-G9M;)~s2;2^fE%9tHw-f<9|*{{HoA=?4x8VmQ!?5$O~c z;uFks!(H@ZIELXP?)Fi=vDPIf94CvS0tiS-!?pz?KXRmp52q7@-Er5ENu)JAygK7iK|vjiLGrVW z=8tIIP>eBu{mg|6e)YRXhM%t#Rehj844JMFje9f$NzG?-FSBNe027QM2)xM$gNnE@ zMN768HYr~Vw|Y2^c=$kU^I94_a?zQUp*++NU^G~-<|PzErZmGN;F|KAS9~P>;CIpM zQAf-n-|4t%v{v*j@_6!16V4)PuTQ?__e04Aq=()Wgo+oRzKfG$aibR-Mx!@D&Zes( zO*SJU8NRt30teilXFkSj5w;_I64*^=Ok6(#ErM@?a*CrGO-oD`EL=#RkD1C;W~06@ z#?!c0&z{%-eV`!wjobBKTEE3RdaUiQrDeRl%KyYv3Tm%4YXS@lUe>*38fO7ro*X|8 z0z$!BAIuo2HNi>Ru1q<^?%D8hz?2GcYQpN(M1f)8tDJXa#8guRxki&a{bEZP2Z0)b zUg%{GQBjMjDEPl>-<6{h9owoFMsngZDRC43h~=V|M;t?Yi9rgM;FHk*!DEJ@dqyIU z3==3CL~7hrrIp^$b4QlldO}G}Si}XathCgx_Um-k17fh7rKNwED8PIdSdGh9t@_K5 zUzO2fy9MzAEdr<);eKAqg%#(-Y+K;?x<_sR%0*gNR|nj-@Sf4Gv1>^c$K|xX?5U(A zW(K2170gSIUQblUkguOuYBDy}+Ejix-6gy@*ZcUu>LpS)@}Lebi)NXl8sT7U1|jB_V0A3JTMIDJq?qf7!1ZHgG z5*bhY2R+N$_pNdW)f11|k&8~JH zK5dcmH@8@0l|hmC$!|R^l<_lGnm6VR+kYgHl`_hI_sqLscN4r&m z^@v)NLkS80D9M83^Srm2Ml5AOCJsj{R;;l48B5ytmN2&#q)Ets3Qu1}L!->ykhnvl zcclAe1;`%=!u6F;z?wT38E*hydzu5T_Vvi0VwlquBaHp%en zZrz$#IWynMn8iM3j6EZqK7V#xJhiuFB946(jXuL7zaaGO3TQY zJ9{=Q^0jH%Ljy&N(kq+NotI9WXtC|Uf&Xyr3%l0*zJmpOlB2x zs_$rhGa&C=7HbTOGQ>V5Wo319-+NV6ZRkEHEMI<-HhZfS=V+n9^3sfK6Kv1@ej$7d z>lys!Qt_YBffD*1gDkgcuWwPlb0>ORxo(#U2OpuB4YL0b)c?;C0_n9rH>CP#XyjqS z@U{7?Oyz3l@pS0u*TzhGc5&5V7@BWQ^n~J8##vK%P@X_aKp}C&zN6qcR7?YNSAaH< zu@L{!WITTS*g$)crmC76$GVp)IRHK_@gtty*exx+X5W}iQpN%}(VKG6B zuM*7wNHI!W4FGl9joR0*7rlp=MLUI5CNk0i`g_=q&x;Iaf)LG|`FKGP0kin^epkuY z#^U~(i_M)NfF5%bd_#%doZ>M<09F)qwRZO1RjPKBimnY4`f!t|@|J6%~sN z<3YQ@WgUyBN=!;Ighq*2B<%tbDOr4-6U5hf1bp!Tv=~d)15gV-kVx zeRHXrO6>+pSylNE`(r&G9WR*74=5J8GgQzu`0a;JK>yt_pc;00v`ze1`*0a=h+pE64pDhAzl z_V(8f)kq~(G+O<2#`yQGeixhskE7PXs2Xlg!@te5=gkvs0mzU3{BGVlbnxJ41`;Z| zLJ(K6i`mfAs;iP|bwOVg-t+z)KVCA}jqEfnAWd$;gl_u4n-h_byz#m|Xf%7I7=x!9Bc^ z?%h8g|8@oQ&8<-7PCw&-O7I;ageelwnpdEdyzV*nWP1|UV(aJ|gG_P5{TP>=e>nR1#yPyC8pa zgvcQ4O$vNLa%#+A0t$9SMqa#d!A5*x58GeZo$6}yL4zjFm~rvS6(*>y-MF#OTCKAc zj~+$t+J$2bCRa1}cCMVPPJCvRO|TpOmfHqB?UI<1a(>;1S#pIWY|igogdoeu7goUX zow#Ac_iG`A8-0Coa|&iQ0%xww3JI0h#zH}0IfSh)L* z6vt7a!5z4TmzVUyE=#5G4B#X;$XSt3kxbV1wb@tm|Co9w&3o+ zlP7lxD*RcWe{MRhq=qlRMTM(&1nN7eLlx$zjL6KR!N@C?bd}bawz1?9?^Q z2zh*4ldQDHCG2=l^GZy?>wTwBSB@>Q=GIVoBH3a=?u&^@EKTY_*0y+m^}pY`2a)KA z0OcX`4V>pReJBSA;iW(JCz!2QAM1Cpz;!d^9lBk~$@O)GAsi{2A2csowd!z0Y0V8FNQ?Ksf5W~9-sUS^W(=b_blP?b@tNDJk1whjul5=TDOc~vd{nm9hBc9Di)(Y^gPgQB9!`5U$cY%Tmj*eg?Y zv_wDb?`>@gqtzVGZ5(8paFwD?Hppqt9O$XLOe16=POyL*T77BHS|==0#9*Q6d0rmu z0gxdQ1oXMT;cA0(Y=B#5J!-vOic@ImJ)ZyJKTF>Fx7nJTnCvi>aoNA)n6mRcxKyjhp%OXob3QOlB&IX zi|>_{h31!e1>~g%lY9qFnR1s-f}0AB>2rJc4Mt=HCQPg94a35>SXo`y8Uq|QGT4nk z!cJ4vSeI@%a%8bVcyWFD!$ZQ6?p~@qnX0_Q9FJFu5!g14IvrrG zYKS1iOUmCh*o{L!BKZbDpq@>(w^|B&iSrr&dO>Cz?1u%JDg>LSXWY2K!m274nznnt z&s$1_hwsU^fDor;r3uI{h7Zrew}xoT@(~!A^x#3l{{7oO*}0bQ3J+&HJtmu~%n zJj_BP1Oq6`Ym8y+;?(y0lAL#4LO7b7lG3wX2svu>=mhMdedccKg)!QW&`^AYAVJW{ za7tHNtL2pJl#V5gopu)e;(~xqe3%+B^6Vmri@=s#1V_5C;Nem+mFahU+nX`L>4vW5 ziVk{9R?Y9XU}YR*_}=!@bA2sq)LN{#R`qNSeiei{BKXdo+dsDc!fYO3i#LDg?%i+A z&%1@_yoUU^cmICa`eHc(C*)e1mLPO4I6PVqdV4Nef?{Mb1-NXG7WG(et|}K<@$g|p zSlIAk!{8rXubNO9YP;*M#{_HZsk(ciFd#*(Tz#|j#tjdyn?C%}qaD{O_pGI6O>v^e zaP=s+jEj$VW23GT?nKWtNq1%kO-gh`(=wF+cRl<(YJjJYA19Vtu7i(C;dlLw_{v6v3eXA1efRYPyaNFB&NeqNFn~xf#9k0?qKOxTJ(Pw3V02VSWjKBqJsTp? z?~|)xJWK2P?Z?Efl2_hb``x0Vf$j6cunOrZn>_S9fB~BYma5B%7AL?%0v#-i#6$^h zgL&1pT{RCmlkXYi{rItw_yW~YviH25Ra&PK6BU(}gH5|Uo?>s$FZ;K>{e|9EZmp^l z^E|jtj$R7h{}q-|y&~$l4b%`S!5E}K_$wUOLl8VgI=aPD%ElTpeb^o3!z}TWS_c^m zZf|P~W&kjJ=gu9bkf!yBA`rxpdD#xQee2e?Wurd9Byailt$1}VL_Dt8V!7G?8zcYk zci&I3R_mxg!obO+Zik`^XNxAs2Ei281pXgy^^XSEx8ah&kx!1e@3!E%en5c;-le5ksD-=-FjA3|4k<*DYMl`DUNjs!R*^mDltn)az9g`D z8a;t&nR_O{dVoj@Qe@Plk&zYuj+O$}kO}td*Q^=Omz4LkE6ML|ZDro-yUzeFsI0v1 zY5>{dm{=UkZ>TdtsPlz)WtyO_p|Oe_!c%2^kIUEi)d}t0o9Z2i^xpSl(r|0HKkNCFX&AWHaPtJ!~CX(PB%gXA(J6>oQ zZxvcc8f9>1iJws)QIn_=46ZJ&WN~KnxL{9fS4Bk!9cmGm`)y9wODgHjF!+#%PurC~ zbC8=0_Yr-|N-d-k+EsIPwq)|t`8!QIp=ZrVNrBoXVG=dG+cpbvTmW+dl9QwN?nTlU z2)rfas^)f;64ImrmGS&x2t55pIs--{M-oFJ<}ui9HCv4=$Y8dIA5;pgWpL+X76l?% zBF!w+A=J!{y7U~xM+*&gn4GB4yyc#jwL2jwNGjNk1Sc)PKPAA|6#teadCPT%@!=|d zaKl1a_Uy&ZL6-PXF-4PmUdrVm&_EDM)7#+k7Ik{mq}Y5uBh8JCX}c@0)%v&;m<%Y5 z@*q3=JNann#jb*2;U}KsX>xPtK7*V@<_|X=fttv|9ho?@Trjp&h|ED>f zdiGX|ljp2i=xmhUn!F_1fG(02QIw(qdTVmjgVb%&q7g6^tEzTzxr+Zz#b_XGhwi2E zQ(vc0R^bH>e)#L;>j`r_N%mkG8uVMFj%br6LHE$>O!RrZtZZTG6Z_8>%uGyxRV^(h-Y;bi#tTAPdvWR<%EqN&gpn2O#wO=M1WDiTm3jXBz#rA`-n~mK+oFCw zeKAENa)*S3uH$`QQ{la9cekWf;ka1SEa}#7V3o9h-D*?47@c?q$BZr8c5E=bSM$f| zy8Z|_2$*qH&b%3>vin+nYxu5R2q|DCy|o&^K3(JOeQ3-U*#}?0!vhCT1HPc9=5SI| z>l%Gp5ROZUL9!=Fddg=VlkuoF{ykBynK~l;AXDgDd0-F>*~7{ z9ycn#D>kgc_a@QPN1gMHFk2{2Lc;5qa}QMv#y)YDiJY6o*i@}m-9tVE{9<)}^pGK( ziqdPf_P{+dr_mi-vMB2@#Scf(1Tn#z*D1FL8(5F5g@!NQB|x1dL5g8{`Jdoy_2}L` z&JM-=LPQ&LhD_j<@Lm}q5LoYPZ!dqiY=T-yE_;>cj<;m$lrY^WR(9mR!^Bk{V^ zv_<(^+a;R13C^{&} zdd?ix_UMm)lYhatp=Ukr_CeG~rNXT{*x4P481Hobg$c>{)Tssat&YW-Lwoe-K}rS# zjKEzv)3z()5)>6D3_M~pJdYz8ItiGdh`6x)i|b*BI_mC4aFM?)v{!swT)%a*IA%}H z%#!Bu@44m92N6Kzr2E66I{smeldclVf$Q5(QB5!|488dgc_~3S-L1w{5S$ML2iv&2 zyW^-7GwI6KzkgV2ZbyF}^!QPY!v@Mo)bMYu+^rHFDb%T#G2ELqtIwQxUq!e&{{ED- zs~Oc@Rcsc?7jlIlNp8KH&38P}wUd?%+wQA1u3(G0Nd#n>1%Lgvby&mV5Y5eWl^D{{ z;M`Pbt_4H|%5|8aI8}cwtoMGtb=D=a`WbnTkcqB6@+zf3*|bhs#KzH1rECZ ziDI+%)A!}ZeYN|SF)QFC3b6U}w^A8!bSOpC13u3g@+dzaZnoqZIamAZA7S`l`}CW# zyztzKQES(&W0gX3kG<=mLmme(C>E_@7CqKNCvZ{ap};II0qepF$ft47#f$5akQq%d zU&UV|QvrO&qh>58&J;U4P?uzyO}H{}z~huk3MQ^FoC$9sDJv-%PDN#GY@-%(6wHw- z0ag>_tX0?N6S}LK!PAt++K(eYIbg19lK;m`$o6Lts8lpE@+OGef8#U9dJM z=_NKwxA%`F7rG0=WNE2V6G>rT_ZLS#Q(Bv-MmXwXON1EGQf;RXxC{@D>}Z$G z?92s0hYqQ;9w7umtfiFT5oBci!^VBUS^xZbnMW46bDjS8gD<_mlijx`d_sGMag-`_ zlqxTC7mRE6{=akPguA&=Tfa~p@UW%^1tYpkdWYOHrS``+HC`+Ce*dgt2iS6&02qN@s?y zsMk#Fz#Vb|3;M9S7BSf#ruO{Jtx}Q2%T}($KPOnbsUiNr0qPTg5)hD+bF#ZXOdVZ@ zj&{O?V>JEB8bG{VX3hknu^}b_`Z}fiELd=@yqwZ!4~Zw^mXyPa_*LQ}jG2TLsYyiP zvT}15edS=cmj3%EY}#ZNR^;vFyCHB`UF4H6?gnXEe+-E8Ep+#kq8K|| z*6{Al8>CU!!uO5>L!vYVk|vc9|0?up1ATcqLv%D?mNE0BV3Vzoe;-$Gw&O&tD8?r8 z1JiW(l3@dPM@=n#_NaMG16 zn>Vv`d2X)7?+>zhnB)lmiVSxu>k_n&lOlVLeBPqk^I){RG`>!|karV^1PLYH_0CTl z0_)qj>~@@eC|?dxkZDKIzk|6Sc{1i0U2+V~f-DugcRvdzly;%aaLgD#TJu;e%N2r- zA(Ry!tP}E`q_z@`CMyS7&dl@Ux}ZW@~OYRU&uZ3+_xIw@_s|c2#&8(d98! zYNSzAR9LtWZWFu>;x(_JoI2t0a$_cpwA4zx)gNH3q>ZX-Kx~P4TjV-&g=iJt_Otj` z(Lw!1Xh-oiYK-0(=;lJ)`|5h> zsgvZpb;AI=zukbtY>`(v%~#*Of6r`#(8$P;#1E`b4p+f{U@2S$D5O-oC{h2L4M*xr zIyl+Y6>|Hz)YR8JbkG9~SEvOccY=(OP?F`rrRdi^l(4G?s)k&bgB*g;^XHK)BmASN zP|0Kn83fDQWI%;yxbn(z{>R@oHQo60+p0qu!=%`#?0*CG753B^6#aw*u}fn6VuM!H z8w{4ndq^t*M;vt$to35h!Z1g{W!kjiu;7O*yK4xr0s(a2KI1WCn%=zeeQ~`rZQsg7 zL8!ee@;O`^`#;eo?oLcDhcCbcm%c9+j*6oXx%%ZzMHr&;A!{h9XtSCsW&`}Gn|S3@ z`(o_PN4Mim_o<#{o?jZnL&Y<@y~c2-V?xBl5cy#L_-Mw(1iMj$oS7$+E3H}_dSb-& z9-Z%iLI5I0x^Wh~BakMOiXiP~t*NNIVeF@=e50M69lcA8$th*?K9!oC@m#13MFED4 zmx(F`(9xpvb;xurS3iln*4Ga=*&J@FMA^5xy;hP!-r3Ob4N*TiclQw$ ztXwj%XxT zEm?B2veM_j6rdF0(WFT`E&3UZ968pv zi`+8j#fcS-yf?z*<}qVOjq2^ud?zVAJ)0=iXV-Lch8Z(LcmwQO;Cfe;uh2#i9m&An6)d#(y`di06nfg{%APheui_#q^MPzj-jvHbZ2IcdqYTHfi$ zkBg&L$XTZ-XYKaDFk9rHcHj zxITeQ=;TSco%4qi;>ihmfGX9C(@)4i4odnelL*?`85tW>&VgYDJsy@yv3gFw|Mi(6Vc)V88UMUQ8W>&*wMT-sUS;yxwvR;n;JyXVl^Od ztp%S%Q?sC*Pr}Q)CSNm?{s*lJ@JsxZ_f8r}g%2c`+1^aT&Zy4x`KKd=YPrTQJUMgM zXqBEo%{jhcnX+mz!`C>Qp!QH3(fH{VZ?_JCPgB#%(W9@xN@NuP0tUK7&6+urawD6n z5YC>7nc>3C?@xCA9~WTr=3hi^YCA$A43DutAD7j}^cIdBYG0Dm05rrtit)ap1!S^* zu-Smo#U&XM(y9Dz<+Ep7AYHLj#80~GL93o5;p^wm6kXOsVu3VpFVj!dH|&|G|B@i&VPDf zF+yF~Brt51!>q&0DTA!Iw)^+*GY^r%6qv(&jR!&v;8ccK0_P%h=+$enn;XZrARIwY zDfnN;){r562o$M>z`Ws8a0xU8y-bt}4NMc7UcDM&YD%*Gys8Q=mgpbhEGI!?xo#bh z6T6h*EwpDs_WzVix>;K11=k3_HHluChiJ|ahDIA1(K?n03ZHqSxEM6^jn5C3D|e=* zdnwPB-eqm=5d^OYL&(y(bnm}^wkU_4#|xva%NPA9+r4}CaQrb=3r&uB>|eGZ(=kL#O0^hqRa{h5LBprsayLLsfy?E3d;ruH zu_1pq6%WWA_4NS#<#6^{_D`NHU9?C_a_}&@3OGy@Bv7F!{62hGv1-+NZ}06t293i$ z81-Iuc6@O?El66F6*Th_Z(f6dOb&gi4|D0dKJui-6#vi>XCxDaRQ$3{oHm4Xu^j)E z1@scBF&0uL<9gW*@Vw{0BwZrrLOa+-^)Do9eTLyWfv#3od0SZnT$CB@x)R6{V)w(X4|_hX zSqCT}j$!mVdU|iES%DLX^$?~9>FWo!R(Hf+8*>FfrqAELZH25#*}x(W!e>ToYIW`U z^XE@40Fo>TJ$yHI|3X(+hOLPHodnk+)(XK5ez=j5tBNs^h$D$>W&d&+sQYEtTDY?$ z8BuRL0OPB)Ea8Cx5ysT?w!2|s&-ME_E)d`H6Jy7Y<+vS)SI5PRGpM-flfB)%ZH+RN zTr6^5=&WH*QCrad@&^yTaMFJJ`t|JN_du#dN5YOQeGPQuZMWV~vs}Nf3J`wRBUy~v z?r2T~p=B$L7OVvSue~=9%X$CazAy6>GF7I^6p~a((y&e0NJvOhNkmA4W)&IJU{+}| zCrOf_R6-?5+Jqzx3Q1CFr0ITra{rFw`SbqgdH#5g`#QeIK798M*Y&yH@3qc#u5+DB zU+$D`!pF{x;>!0VHP3HjAgLck-7$DPXDS6Ie;9fA^F&GPQZ5sx*yUCs>thWN^B1?q z9R26gEABwJmOJ>ITG8xWxtRQ!>sPLzS%kWz|9TAUix&%Mc_TUS8R#N*Q^pF*1^ee+ z;0bd`K=oAWJh~q0AIn)&K>rdz^8M4Ned_&$nSZ8rpcerzgmLooSi%b+lC~ttnTG`& zPRB*i&h8hFomE!)`h%0ICzPnc@G<8)edf$BB_-l?2h7cZ@skM`WSw_;d1Y#RlF=ha z_Vc{mMPw!se|aEI!z^uLhDb(z_cQE|CJiMem4E%Jhf?6>LG%t9&NXI`zVz#+Oj)X@ z7Zw=!&*-Cqkdsf4{o+OUu8-kvgfPCqf_yHZWwBIR%K4pW*_(ObzpGt12I$O!3W$Hg z-lPMMkF)6Hk&RCO)2LTcv5SOL-_Mknfq|20OdEMoli zdGSo`zUT43sri&jcNU!XX!tqHxrbZo=uTy2;dH>7y!`2NKLeLm`SmO2%xW`cyn&=HujAuy+%Xtiw{*CdcfVLRC?qwH;79+RrH(k=}+D2=t8qa!|%BS(!2p>HVY=e|Y5 zkD7Y6HQX=u5IjG%+iQ8fQgT+c> z_!FfFI{*(4L{8CJ49^%9dLru!tc74eR_n~SEwq|rHyuXz*?DIig_>+{0E@hNY>f2| z_O>uH+nf67OnKk(eSi~ffO^MNrIym#;Cj~@V}8DHEGFaM;)M^rDX)xyu>YPxmra1`~W<0+S8{( zrQ$!oFGU0agi`=v&-zU58Mh%C7Ai~5YE3m$OB_VSOSiOpm!@PPy!eB+WZToa9(-%R$!Tpp`4t(Ht?bShu$0FV~(o| zas#@sJW5RG=CQ|S?b;@^6=P3KqV1n;svFj$N7FhUCT%w*v4Yr5y%Y}15>jcamZ(V& z8PaX)wF8tV+>22e=m=0r*daw=AF56Hfx)j)f$pTCjseL`O-)ddl%!;Y*3K@| z#t!XE1>$q`C^8t}0Xm{Q{Qoj!amfB86c3^p9du1Bgw5W9PnK3VOP+BkGRI(rMX%~3 zRMH-=N#OG#|{tXXR(4TXUqAb~r-+r)ks zhSF9{3i%zwgNo~W6*)U*J+N$h_IylDE!$Z>Zo&vZzD8D!S#8>MNltQ$1V(~!z%sh{ z&=E04cl&Z>o@Hlq$R9p@NRI+I_5`GDWp!Owj{Y%zpJ-~oeNr<)=woQeb~ZY(Tm|38 z&_2rVdRE0Kh360gnAf65i1B_IV{mVhZXk{HK*q>3Wi%rq7vM(kvSgPsY)0oi`J*Y^ zoK6AbL%Rg_Qvfd@<>gLo+p^{AyE9{vUp^uAKL%v&0QmJQ$Fv zij`>~moXuX8j+@9Vc~}C;`n4vmq1MP~E9<0Mk zjauif`-Db*VqyWD1BuyTh6O+p(XD>u4{kBAsiJ~O0UGE!q5UR+O9(7HY%&-Sk0Hm% zx{bZXQc3M}01u~rs{2jrCO6kU(&MYTAPP6#!K@RxA@+dgV1UM>!9?uDs?v1L&}%f^HydqpDcbsoj`? z+6@Eqh6dC6Kd2IQbe;nCNJ3b-7TN6>Oz#e_il5ch7{lZ6<37jJ1<2dtW7=BEDlBJ4 z#RTf;V?6SdyYao+>6P%p3>>rUDQ&R?UW~!$48)y1`wnyB{f-axa0Nzop#A&v5DF3G z^y3ohwc=!kW!Qr8nXjSbOKy|;tgN9Ca^}oxBO`=T+n6-vsYyx2-$_I(RpNKCM9p6v z0m(I0ct3Yzl-Kj;Z^ETa>5Jg|L71RY5$m}LJ`-qsZO9llU2|QiK!bwv>-xX6`d2{$ zZ0w5QEF;5`PPtba}@3p4xDC?*xa2sw|qjGYD ze_6PDV?L@h&(;i20x0}X-vt3;_0PqjqC2q9hlfW`d;QPM>)a0j68m|yJX!-Y%ChUu zuf9o2=2vs6_NZG2DIi!n)l@F-(AizAjTR$qi!6z;RvxFV?Cfq|zWkXY z3$s*4Gd|qeMz8sL`-8sF6M}9^Byre4ek!{>uU`i`(2Zs~gDrodO)F>&8sq$n1!1aE z=hpAu4pQ$m2X>avW5s)e(Ws1f;R>NX$edb_FDp1K%mnzz%-)KOb-G;ie9pR0kvS+9 z-%k&uu5ly8paf~pB0+_RjQLtVuQ&gdf`~`)tX%pyv+3c2|5|vsAiAZU8a&gl2NcwkF=00u^S3IdSj)gAi?b~+n#3=E<=Z}A49*gWF>iTtZEi}WUPc}>xF!i=iT~dY5KnQ;M z>=^^gY(y(YdWC59`-(~H3=MHTgkVazeEC4S`P87hhY^B8INGl%pqdd>3X<-pL82b5 z&B_5;QzuVGoR~GzKe8+BBmyD`j$|Arv~e~D(lq)m8^ew;Hic`?nbR`!=SWG(rdB@& zn&2!+GFHu&Bo0+YMT%fW*v|Mb97z7Ffjm6WpZ=>0ARMuwX5^H0Oqv~QG1JBfgvmhd z4bM_>+C?vAia0zz-ua!{?Q-;tA)0QEj4a@mC4Yvs_gvTVlpk!3;q-S_)?-*))7*_o zwNUnig@$4tH5QmlgS6=RVyP66hC{G`4Z()+N|8@6H^V-)PMI5iF2HKj!mj<(uE73ICE5GQil+v z>|o6B9ap`PQ8 z$Q(y}zm4zdUG)ohql)Tiyq~gB%26l}WnM4bJD_QJntiv7S|P|8PiJ7L+_R&}6ARCz zqCy6F2)3x4EUigps3C|8^bhVb8hbfV-i(F6tT9VrFBV+`C1m9t9#CayoOE=0`j=58 zfO~w}m(dxa&DVrE9~;7Z6dla8IEyE4aIm)9?!}Xa+Nm+Ns5s!TzzuUg-o2v>)&Aiz za%S#tc$>o`+a%8A`?iwua>+r1AcUT0Wr2W0!ou_nUYqVG^XkgAOkUZC$_4*O87w{F zdSP$5jYpnOJG7DVfkF$$%-PxS!ipCkX@CvR8^Zu7#lZf@6n;YKdgsnZJmW(0Ms5*5 z+>^+xBnI#-xVt?-eW2hWfaHbCEOiJv;J~3nj9PSxUY7RntmFK6hoDnN)cEH3s@2u` zc7}cWPxmuysW6{)W(h*9SE~^kE&)rEQ`rZ|DWtiV?c7uRZv>Si%t@;M$?q8`qeYz}Ouv6{EXr2%Y~RCar7(XTFI6`LVT=yC21F9b4j80g zY3bt4^MG%tt+hpvOSnPr6wtUJT3r^2Ef7R&}dXP^3#p|`iqILFU{oDqv-Ahlu= z2m~NW3xz`s?zJ~*#EuPGi^7C!uB7xIoN#+v3+L%MOX;>%&z7f}#3NhHreyE_{oM}E z!!#Ncju9GScpRWf3xW!4+OyXji8zw3WZU-n^HYIC-cK7*s9dYt`-_iD`(e-!2a*w( zm<#zfsSaH6ci!#M$nmE#(Gz7oe-4qruq^I5hKBEhO^Oy85$yhU@c8aJb)$95#0IY( z#upCY1FN9w1(n9AmpFK1#1rq?q2;Hu^xuDBYvztFpNQYMfShiOq~es(biH#t5zOw+ zejM{yH4F^rg_#Q0f{@j&MMhSzb_rw%W$Dvi zGPLgmd3h`7KSC>hu|-Ag0(R8MvxXWa6>pvK;o`(~Lp7wUdEYcWsHOSKaeidHPCxQ= zD%#so7x%TD*-EKcW5O4}RGtZUg2%FI)evQ+(HXT|Ov}R&Bc-HX)SE_ir%19;;R5&^v0g} znBvK}$2`S=R5#;q)6Y?k;~M(3lO0Fqj}`%zr04(4Tuu*q0V5Dq|D_kM>GYvWFE{!Y zceFPNpslOSC!#msw}M0^A3Nc>UzVXU9atXF<=hH(Xd0A{e$#zY{E*X2zM#{X6>0DX z1pA~@FDRCZKln-vO&MS3V&Uc;9^TQAXUYV9a%j#v?jwsxGJQ-oGI7&-Kc#Id%SE3( zo20C4%Rz%`82>wgMjh&LR@wzX3pu~-Qz9~x!oKM^xaDGHz0JLo|LpD%iW2I119>AMc&nidvFj)xR%Uj3j~G^7HFJ?Gs=;M-EMpQgP>WpMo245A-8sCLQ2 z_CMP@-M+t-lKn!=$?9Y|V*Ziu)HH|+T>EV!eX#aiSYd8{RaF#Y$)|-Y$w>+D zaCAE!6;&zJr1oy&{$>0r{0G|osY>)Q(7j}*EbS>0Ju(;8Zi|vubDfBD6;)N~N-y5O zcScqYQL`dPqM9&~l%#O2cjSm{Rb@D_5|F>Af{lrGY>z=1wX_+oy_HBSA0{C|Uz{M$ zsQ)kriL~=2dTeNKq-8;BW2pCdcbF}_@bDmb=+X9I#iRu%KP`mIg>xoa@Wi)&Y=aJH zz*F?zx5(avc{m`fS`-u&<#hIlYH}e*JTTHGfsbjA(vM_SFZ+oo2)C#Np@jaP(6xI; zEuRyg3mTbXsW1_$xPETm?xQYA;@3wbK{vqKTxQk3w}*Ivji5JjfjX52wSUN&p&S}_Vgq;S?*ewVD|;? zoG(Gr>TRJGN|Tq?LZXZpJXh0La1NBo9+mP*%-je=AIi-z3F6gQV#mToUojSqW=< zztNp>QqZYzabQSs+6N%tZ;UR!3Qt7b+ifdj4;%o<=VWKQH`iR4cfs&uuU>m^p^PqW z{W=RKj?!O4dSL1;?0FfJO9>q^^76br&v{T^>losIE#CRz&SFjN&2&qRgs>u-VKa)6 zgCw^m#aA+xR#p#Sqmfq3+%uoKHE93Y3^n{XQ;2`k2#v z5JWB<`wGkiZ||)>V95%b3?-6sHHt$BkF|^-`m`If+^veLqw&`-*ehmJTe==Q^I~j3 zR=>V|nSuZs^NKhAxxC-a5uo}!IxL3A-sR{2W_5Qst+r)1{CbqQ=*s0H(!iGoRT7ZN zzWpas0DvK-x!d9}X}Ahp{9n>BIJ6N6PcR{Ne|Pbq!+LzbaJ9}~UNK2%Ui$cuuwk;M zPZwqrQg0{DyWoto3@oX!qNS1))j33t!F`#ohc*(sK$r`%Qo_Sc@nCShr%C{z;W1ZM z98n-u-|>{Mdb+y;XIdEJ8e?Vk@S7sRkv9j>gu`)vl}DE+48ym17ue&xW6O-V5zljS zVs6}6pf>No`12+HZ7rWOXfg`hQd?6}(mwk9j~3wQf{QfR!6HHH+1nn)`Rq9JFdgWr zh%F?;UGK&~_&;c7TNxlbfAjpZg#X4cZ610VVcF&o#uW3*|czl08nYKpR7avhjL}BwY3L$tRd-- z*G5Aq70Mqv8Xjy1zWCB>@X(LSVl8;pgQA(sq+h?KZOE|8x%^_^oc&iG2 zPyLBk$G&5 zIN1A|ffe>yd_RlV?{K$=q(UqV77x<>%2`1!3imx%f8gQ&XqFNB2Eo;X8DF)^M$p)S~k);7U!c8M7QVpYN%8+$-+TcsTwa1^17|o3v;^|6{~oUPm{AssPp? zE@mP+%J;FG2vqKI6`4CZI*j%F_FkyI@1GhTQ}}Fq9mRlYYm`Jq$4Mw5{6(mjxQ`BJ z^N=;zR~KoP`i?%8X&kp@8Tvw;oI+WsAv)B_s65k=I|b%vx@XXwe3I*|9q*O48>F9{ z#TbE+kt<>Zbhor^BqY98Rr#sEDUj>jfCc(yz!mZfTfRFpjABi^{~fPR`ouYpejyV9 zeYXFk9Y-X9MV)@1;-(dY7j?{i=+LKldcyoYk(o+8&9Y3hxcr==XP<0v=ngu32Y|dQhg;!Mnz|?iBW7P&`o%KzvbJQRhcSE|xo$eBn4|599&*#uROy z&8ad5SBwe^3R;kk@pI-USEHgv=61jW|z)Q3b<^}EPr$23O2xDoI6-TWOM8o z7_%`unMRtLnzOliY5vH(8|&=bTLo!2P12-mm5zE8qd>K|LzD4Fh<@yOGU; zkmrOe#N24>K`{>`LeR9C0`RIr{m?1`BY4so}^P6*!1%j;f@mGD6`N~EHnfGYt+ z^pYzeecH8EmwP~+>PONlCi!36pJYrmh?uhWAyY)%K{`Eq&WnU%__wzpNBPGD;K(-# zWez%gqV$5x$1{BUcD1{DsO_j2q<3yjHw{>)5{Z=;E?Z1`Ub9bL4F|#S0ayY_nTm>j z|HCcxmNt+l6eK7S(RuFGi@2mWqky^-hHXo71Vh4YaFOUuU`gK<7ADs$ii?fSeDQ)k zWPu5rkr0qB0hSmD8WC|Xepxe`%P08UL%`;EG{zm&eQJ8r!~F3ES@E=t3^*!~&lZjt z2kXr+B~ZYUG^9>BzM$KZ_$01sgmDxy#L^TpPan)Z1AvI3(g;H=^1U* zQe)+|y*m2dU7rTq>PuQT?hOoBAEhsu#BQIJb2lH`xOCn#9Y>Wh7SAlg$Day%@vEh* zH6*xanrLFs@uV=%&&u|8U)>(=e-h#nUj2KI-oyIWOZl+H={?KhheF|M|IS?Q!9{Q# zp%+rzOJ+|E=33s_Qu`(&wH4OS30gV1opx1@i8NUUj#85?S{deZ}U4tE;tz zmOJOnyJ{Bdr4u^h?fIP4Zzics{le!-u=%ZE%9Bb#>FZq>0yXjz-;!`~qRW zp1`gT)NZW-4XZZ3V)?S*LiniLKd#(HD_SiLN*0Du#_1X&g?3qnmI)q`EgIAaylO8$)iL7qOAEFVdsvpY&6{MXTr)R z`#sZe1LRFJA?df-G9Zf~4WpGSZNaw?)-V=)&-O1zNqzz{v>#)OfwIS5G{4_b03@CF zOx&Bb7Dd*@g+57|KCg@w*V35h|Fd7E``ns_hU~1YU~SKbdJ%PvZ$zT<`7{>;dL2$( zxn>Qq@FCr@x#IP%?yN*(Vs%=8-Kl_^mo9DMToTy5WV`q3W$NeleC1ZMJkjUHLCT$`2&~TpQ7j`E9Lhz&(u?sp{3Xi>0m9V z-@Y>%AF)oZ3}@Ln$Y~feVGy!cuU%{5Gpdc>oMK03KW=8FFB zg5vgj=g*fg`vgr)(Edrjt*(~&J&R?#d0*@nyBYfqMK*}YAElp-8gDfxr49?O+qn8E zI+&e979hw`2&H8Sm#a{!Cf-S}*o|cZsdstn_HX6o0pZ~(W{8}@YmJ|YQ-e=%{)m`~@n-}LtNtrwnc{tjVxA$6d!A~HR+ zs7oVq{04Z*f|rsS-mRBAwKyiP*gi*d(~ZMQ8*vV`WjjY$-C9n&03Bd_HaHdH#y_i3 znfZ+vkA^6rHi3@&WRnCOMWa?b!!KmbN9!h`8lvGuJ=5W~RB!o~EphAQPBCb1@~vOa zkod$xw2og+PQR8!(`q?SuTl%irr03)^|x51UJU zsF8}w zb9)aMU~PgFQVxcP-yJ7AI#t8+gm_w%9&Koe}0q2V{jM2LB66Um`NKXXV!Akv(QTq3SqNzcit zrbujboxSURfqVV8SJ3t{GU0po?hUqnfO|!#{qlqJYTvEj#e~Zr0Z)E8vsUq2_aCf* z=)mg(k8aE!1%~Eusx7MC<*8Qff*b|nuN?64v~>Kb{~&tkVuF@gsl+cZTtm6~G9e;= z2O5PD($d6j;nlx?TdGXE?4FVF1yzk;FtR$JipfQ!^AtW;qv?eeNgeGikWU3v zk2K2wei}3={o~FY_0MY~nh5pw!+++=OXCFh4JPP!At^80>A&4R48i6R4a~-F#OrS@PVIZU7zT#vi5(ya{V*@E9Gm{aqKSad(Z{-mF@#S(`Q_ zK+9nH^5tk@SUMVi8uxK)^kKli+_(cHM7mwN{}kEeZ^u0eXu52fUqRKHNke(C)QrcD z9{tsrBqwmtP*aGrruLqPu7##Z{kmQ=!108^BYyn_Y+mS)x9r|?!O0VhQZ~p}eUv}c zFVG&h)&lE9JpSkYn!jh-sm#+sK`s}1_`}j5mSZzgriBrmNRC}b`v>e%zXqhVUMZ;Z zsEoc3Lq{o0WN55tT-|zRtqInAryTcr!j&SHFsyriiGXWAF69j5ZJlA+aSsC&5*j60P_uWJRgYMOR#^D?UTzFtb8 z<=kbn1a5oNo(sl`p8Q*Drhzz}xCLVvS;JtR30LBvUde4nxSCnJN6~2y)mIdjHG2m% zCsb@xqrzU#T7dzHOFr;wYpbwtlK5t_HQiG*!fy*d+|jtJ19~jUXC%Jl1ZzPpx^+fh zFC^GZn@LPF*`XvgK6J9^(Hw58*%By4x*{tUFV18bSGG5y9(z@RUa?r;qA;7t1wde5 z2;#JUUgE=tuVYH?RuF zAFuPd6)Z0gWl)q(Jr^c4*;8NtwXp0=xWA>VqTVuGpk_6<-i3WKfU3q5i=?Ru3+N;2 z$|Y9bOoTSP>^kR^DQ}F_HWB?#V_bMAG*j=$_+%q&g7Ey48?JWusRgdj%@Nvd@b$d5 zVM@`t-RcMBE!6r6=j$RfU!XH6=p7YL#%L$w|K#_bxUptCD`o+ZX=C+_qE(sSoi=S6 zJ2hWtb`>RgKN>B%Dhm{%5->EJB;hTQl{n4l&a=wVav8z76;PcuX+PJVYMmOKEw|>zyNca3B)HD1!OMUjMC|5f zCMH35g(zC-T5KAXLYEisR>goRbdvFdtzWVY`Pxqs8Z@xwmMv`5oGb3DQ-%{r_qn%> zqE&)^fECbHWdjTvT-&bY34WkM3e5Zqcit~-Bvnzg^0ffuJO*ktm(*_?q0svY1tj-{ zZ~Q}R>z-XXUpnyN^sIlih*F}e3V+|r5o@B-b81KKN~+agbKc3(5y}S6gjCOgVwML; z!(7ku@PVR7r{@ZHIOx?@4NfF$*|NS2zPc=QctoxXUjfXn&xT%X7`U1A>v_eB{<-F{ zJBlA}xbZ#g`0-mbqmh8_T6PtVkzO|rjC#lrF*$QNwvdghh1LN!)}#y==GgolP_MLo zsM8><&sx>gs$Tc`Dkbb|5k3UuCar(QE^Tr&n{=yE-i+f8rO**T?+Vc6&5bkc>@T@5qU`vHrf|q)Fc{X4obcLb72Ng2z8!DPFXolWEhAg=X7*^}++rbdmeywG#3GGTY{%*T#1ojw}U)4y92Y;A<_T=HyfW|!OTZ`wk zaUf>C14dL?f`^aF`a4@s+`ssqZ&g5I?ApGaTfu+f7PCD-Ay2V09nc1&2&VcYvsqjJ zyz(N~LS<)BQUcG4+CzI!a}6gNo90h^N47tve3=-Sy#*aelMjoK^DV=@^HLSx(Bd?4 zt++zUpi-Q=?)K;FQ8!QSffUL5;`%e89Jb1{{*sK#mw6u^J$i(uj3I|cl22gvSMPB2 zhOOWy^f~KyB|8wJHchj4(sN8?hNhL?Ug_b3M$zi~d6 zOZ5mtzqc*C4bze^P=_}ov6JuaS(YC-aDa=#pG?CG{*{p=j?_*zr}-x9kT>yw7DNVd zOCK8_hn%6jqI%}VFMzZNqycr4H}&-rA2Os4wDPkkx!{Xkv}uagxN&8JdnFlj-Y)@O z&^FB?t}c+if9={gp@p)qTd%Z}ZKA!A7D!agU!vLb^q$XvkI$KU_F&5PZf|dg?H0-*&- z{qpkg^1(+qn*28;p?i3ovG*4yuUNam;jOSF8=;=n-4DG;M!)`~{JF?{d03%IeW5k+KS?gN;3ZU*I>_@{W8X`c`^Z6t5Ljw3@{szo5~Uq=q}i# zRn0R-ifmK`Rsmb&T%I|nI(_p!;_>XxS3vwpCl!Q!`H4=u5NBn5IhpkZrz8$p=9kqL zSE)QnHpG8EgoMv#b{BK``E&Wx&3|p5F~Ss7&YPE>9Y^o@adF0Q4yPhWXJ(-W z$l(9wA23bN{bLjr^`2y|kA5eB_=A!rQk(v8DHvts#pXl~MECAOnt(>(D4??oBIQt? z)8fBL7_9yPxPAfg%ykvo4A1=2RD-LSqV5zlVPgZ zqFh-yr2E`RgQIUZDaO?4iuM`^P{oK7Al~gG!-I3hEmYPaeM98HJRZ&M#ve}?((@ri z^GtIqh89d7*+}n$U!k{-E^kiu}R_KyH*vDO5XLQ%doq9p5@%<(+p=5(ePBie@LIpCI7b+K_ zWeC}_Pc9TwQdsSSq*`zt&ZXl~%TW_{4ghfWW|b;b*qz zK{uIRdgYtDa@2rDKpg@Jmn!gzl$fw===0aFVJTlQKQJ0YFFGWZ%8kgvwXnWx)MGBI zE7>PVdwj_~i`{CY;HHTor6VRF?}Umzefso??Ku-(6&DK{A0UVEJ9o*=D*2o(j@wSv zVAg2Ivux6b$phbDdiefeVj z(~c@}M)W$Yhjrh`$0!?Zk5i2B{|g_iR(RQuZKT8&>UP!^Vo|`^)3}-Oof?Ty0Y+oQ zN4EC}KU$^k)MmuyGFM~Kqc2B*D>b1SQO=aaOP4GGjMFpaOTY$h{J=}eFRL7pLXPy) zQFdG#^_KGm6qIbzOQaLz=9Yfu1B?n`loyCYe9C*>os3P(%F0q}GNepnRz>CYD*cb< zu^}2Rto~(kg`r05)+o-2==|nx-5OkzO=8wY8hFXZ7ycBY1;RoT_bI2=BIa>&u%9`C zi|oe*nKP$=-3VS2RUf0~V(f$JcHX=v&7-d{w?nBw|E0{Sx9HJ(8X&^N7>Q`Y1V5)J zn}}Sz);6jHAr~R>qGFF|ECkmr7NX6=VrXEk)*76Z``WII(~ra}>R%ieknrSvpE4w; z%8`=D?VJf4U!fcLehIlN-5wa6Jk%`?u_vlZ1`)ju>X^nne%y~4wb0YK6Ekx-lcj_R3(5J6f?B~zL|4fLF3 zQuteuco%)Yh{mJ^^Z>~>GcdN~f3yJFck>cbxbgqp9F^N{zwd>ahFUH~(tR6p>+4ow!WGMm%kVUaLdCl$n`rZ`2}RsU{orh2X*E>2 z8&Ks+{6N`gVib`i;rw|s&@B0G)1EU7>?5>YzkdDvdGmgzbhJ-SdMVTb_>PG6?du9o zRNQ>R4IN5ExW@xJ7Q(j3irq`p=8GQnVB|lKjEH@XbyDrqK9$mMI@=hO*A?qj@jw+8 z#|H(?o-jv>#cad&%@LK9@|81Y4YZ{8Ji4Af1oaSU$HL;WQ@Pw2Y7Dv{NZM<=GVzQ3 zkHCFAJ15Otj}R1?*QV$$OAa#s{x54YDy|0e9O4M1K3ON2e--pnv|KQqDCSd_6|Q-+ zo{1F-C)Nrk5K`cbkF_17nM;TxCqdS~kFy-upGmYtW*2WJ{(K-r*|C)ug0clZ{6xfU zN;f(O)ZmQ31P9I*iLOd>BtOxyChGx3|Azj#;SLV2gdS*Y5Md>rrT$SCql_@Az;hbB8Lhxd=+6tZ?1S^<*W0 z%@!r8PK z|6x&&d3%Rb8Lcg;tc=29s;x~@!SI%Cna<(?g?V}Rx8+`it^#;cO}Kqdzc4wqVs|^! zDOHR{kW16#}EH zsyg~kvsDk}2N7~v@7OW)ep-4uM^&2%mon95#y7=!rtb2n3l^H2t=W1Ri%||xrN080 zo<6;s>c(yJfU+tEl;OSB5hFzxAAnOk;P8C$?g_@yl9B-^3C^7(;eM~` z(=LN&F0?ZGeZamIbqc`(ILI6!0F3WR_(W5u0`r22j1Wv`nVg!eze^=3?df%-%rPnL z4x`_QOKXdFaTqMeAUHw*8}TWILT6muXYK(I-77tf+d>Y z*4H<5-UT=$6M?`qPg{}ex{~jROkq=$W zUY}#<)23sZjWm9JonBP!R!7jE9#Uv8fwl?-Ix;jgmb)ajJRY zvp6YiaM+H{s4KQ+-Me>pb~+^OnAk>cam5gVYy1uYZ&ihvJR?o0aob-V^VkjTe9W|e zK7tAcniFw5q0{G(N4od%E~t{u^S1}vGYdl}3>|pky`90?TSlgA>LOA+r*ml?rOq*r z`b)Gwd@IYJ0D_!d*R5Jrwyv$DtPIW+RRo2<&PyKdzcedE)i#NRTvU=M$0+RGYWl2V zhv=7({<(s-ZPu!es=+&9W`s>j==4w?aAeKo-Qd#%4Rh_tVynBt;Ec|tl@Ymxjs-iR z?DYMN*%pii39U4e=ygP*m?^UBYs!@EU@-{PlLuPxe-YY-T3jD!PTT%sBDpv^Zil5^ zzX2+?(XRsQBqwh$PPJ_evS2u4-n_2vE4qkGgp*P8kl+h;gQTH3kz-DUUkrS|eD&%} zR&<#!(Q|Te*omFmmN?=)v2%pjA(WD2Kf7=^9>iaSDnzkoPoG{fzo#VnyCS=+smHYb zY(;oTPlOk<&IMHuKOGwRwB^46hs!P<(?XhqKQnTy(3#uMj!%W6`U8KdSsnu!!?pRz zQ;=yb=_R@0o(GCXKBV~|6Atp)6)SF$gb2TgI1E0V05}n$Vfjb_ENw{h12=&kNjZr9 z;G#c_>k8TtqSL7(sh^-^_%GZ6{8NU_l0Wkt6&p7VXjc0(&gyRHuKItrOAvas1o5mdzo@DmSxXn7 zB?NeKNlwZ!lNiq*u^DuaO*bsaIYjvf_Tb6;gvyG{ydd#~q(WNap_I zTGCJWaQTd-AI)^59~yDM$5`>$kt6Iz5net%b+xs_^Ja%=x&Hx9Or~z&HFt1LT zS-Oiv#)35G(Pr}W2*0N^jvU{PVybrdr4&?fEE{PRILq)}KY3Y0UJE*!4HS!cF#*B;m z$@K}+RRt>(>J*UY5!X*Dh>f}g=}C7N81eW#GJ;qnIp0VjEfqu zpZZZ&<)9`+A+j+?_;KJh2ataP0hqYHqR*=26h^&j9Z&TeAtSn)faY}}o3p8bpz>fX z%)hh!>g?BDLD^fD>(J0Au&`d9dskLkI(}eN7m?INg6!U`*I=Oa>w{lyrAxU3n`vq3 z#@6T9=id0u94C@U)h?%4`@uBh_2_6nZ|}_K&mVld@|@30T;}BSPa(G-ps2#T1#|7Y zMy!3p9Sk+J=9Q(&6M%Q*-UgxHYfz<|l1K47WVr^@G0fS+@x)oZrGeydVL#p>f_>e? z^8s*sq-{FQ8zfzCRDW?y6c`IGqtIB#Kr~>_9#Npm(7p>D9UCFV5aq->*OqcMy=UJ{ zHy@N!N^WKN;n{J<)r~cLd{}sAb$7^g89Y!H5T4_I;J*NCH)8~$juLB;#7T+NCVo57 zi#Uu
    U)kcWaB^0lwATp>#5*|XP08VDp)KmZfLOm5q7=n~`7oiQF33JDM_d0iFh z%2I_}?a5&bGb6>&;6;C!5hB>R6$taCOxI)MKr^I`@+|&H+>(RyVyR3}E3k#MIhmv( zAZ?}-=mjG-rqWpA(OVR+3kL-3<1o==P}uNb#-vGG&HW1s3wMH#L)<@W?yICUpB-l6k=2WImIMFgpK3CanaRniSrFk7NmEo4#f zB$}0cp{lC)E?>6DfwM(Gk?0f?uPD9B*Ca*|`oM6q9!i|*3rDljqv2QG=I+Opz_T`8 z(n}UjajrN#0z+R7#dvQ7PPg=rkI=c4fLuY~ev%7~J1SG!D`An9f^;QouQG*AZW7w4 z8&IT_?VfPs&Yj&zsv*#!>xBiQVIF_BEpO@}3bZB);EV+gL63=km8$Z6k?YIneA5hT zJo^bylVkj6^5lwN>QlOj%oI8wz}bQ-W~#!jpGWIhHzj(_6uD{u0PkLMBQ32Oqzf!AHFsQ| z=r&gzdPsA$6X5=fUGW$KywLAb+Q96c%af)PvsB2NFuMeJW-j5U;u-0`H&3_hAJt#_u|(xpE6JEYG%hlkSfRoZxW zSx)8`JHRB)MHo}!1oghE5nM+{O$h$0SMzh^2wLFKVvvXcdV1n;mIiCqxZ1u96l2(p zvYpD3m!Kv%bH-url;;p|g8dV7mvhBof?^WBo&yF|yPrw@bjwfylF7{M5f?P{B_N{i z#)*`zd`Oxr(8QX1nr)CwJX7f*QtHogz=t(Y`UxOz?0eM3%F91rUzJ4t9l0ukFb7vf zL>6GKygd7_D)Q$l2EaTRMZY`IU@uxpJcDa{Y}T8Slh?q3k}@-UEJcO`I`mnXI@wIA4 z4G$OY;6e%sm|biG#Ke3*GDwVWlg&E|b##tuPxDzq%J!8ZWs7v;3>D0q728J*Gdb33 zJ{)O&!{8Z&7SJM1Es9FMMsrQSm8OUGRSz39=mgJ}3Ia^I>8bDE68ZaXbz1&FG+O=z zJ5)PeO9U?4B(0;4KLUPcsJ%TLLT)ZTAW%rcYySN7aGv0}MIHkG#fbLe-*R0_eo2ap z+mMf=K|WPV>w_#45r!v z)$&sTSyyr^=o}<5EsT9m`yd*!C`N$GzbP{V&Ybc4a-QG@Y9Wx*E>J^x37a%AeSMd` zS!^wh|8jP{z&h>7SJ_q&ZsK1KE2O(cD71{Fg0mf&KZ|Yl&9q>hiIaNhI472g4e?3& zTc1#mF1Fis_tjPf{%Co5b>|w{g|lr25q_Yi)8u+lvL}}L&!G@{nPADF8UZvJnw(G9 zCv3b(cLJtkn2FG|5^BYXnH6cIS0|_Y`8ygzGI7T{CY*yKvueC8RXD*XXC(^FQdE_q zl9OtodU5$0x82?Y-Jgv{uZj0hO$vivzy9Rqk=S4k$Q^kcAWrQi^^C5?Z2F{Yz#8Xv zLU_~Zz4r|j1l4rEX-Q^xjgseRisElj^fD1{%M>Nwwd5=>U>(wjKWk}~8uUK@)@o7X z(OFVr#cti$Wu!JxIE~|x(O2~;#@do1OlRsoN!ne0M@v}Wm6IQD*OkwJ;FQI95zqmY zI~FP~n@7a!BB#N{w{>4HX~Vl#tI;iUu#z;#iQ;_)u_k?NCYhz&cJ7XP`{C`|nerww zcXw}Kjtp)QOR0$)BNi~+`+6+T!R#a6UTB{*F~d1rXszwGJXB9|w?wiDLOVITC(sK* zFzM7^Ek;a0egD34u$p$VNpW6YM&V$Q%^+$@D2!@kh}e6FSV0iP2O$`1&8BX^7z z?e$(HT$J&4gG{5-cjeJc<^{qpUAsN%?H^QW*64G7*bN^tr0n-_P)AwWxXc|J6dAg_ z9uuSO^6N4}ABXP-7#@(&5I{mXLrB%s+#27jtH?~AjR{y+vl8WjrH^yhl7ybxLDN#Z ziT2hB2h8lY&<&2d4YYH89*4;F11kSQ>y|ZO{7ehG#6qwsZ=$7zi=F<@GlN^KT^Eu58#brr^~pq4&!$3Qi-+Ue%SABmbPGX`(iY zzsl;aAgvuRV9B2dfZJuZr==|y+}cS!wBu=K6%;VaN^k06)bR%tX%Vk{nx8PQ4yWK9 zt}PNt%@K~L;?h$6_?w<@i;K1G5_ym4$AXvnejPpFaC3dDgW2gNSETwLG5tY}ny=m9 z>Q1mnN~<5K(V@YQ#GAxGWwcTsPybb)TIEQrjL6-FWDm<=D8{z7PXBsjKD&6hos|Mc zZ;`NL!P&1{YrBY)#_;Duu|&NsU0%CyO;rDW{b*kOI(=gJ+a()XdpE9`!Ul}LoMxap zX#%%iv{Z&>h32tP$moD*l(WxZ`L+?tg%Xm%1u2__-X7eK_5A{2HR3&%R0L;()!uYO z$5rn{j>S+guVHmg18seeIv0vAU@6!w31^UQ+S=3;ehIba=J| z)@PTF>?{VQVv&$;&K9!PlKlfIP31~+nB|;H4)rL0ZFRRa;tZcip55QNNz-*BawAhF zT>XyLqt08dXwO%^L2+>y;!0vU4c2zvkwMg36L(LBd{l&hsw-LA*D3aiuT;kR=ry(b z_>1t*O)xHZ5v+iaJfB&jE5QyR#ek*0Su`T0em2$DI}h#vQ!+1!oK>!YyquS}R;(Dc zF)5rbdyb0&ivO~*OKYMW)I--qt&TJRf>9?lHy;^@Nfai#+{$ks`f?=vbjqr$rb${hsfwzktOS zncvcnC7ck%)mzu&gw$O))k->0te5ngPpnLratp^dmb!lNCrzE5^&0Q2?m|FBM3g69 zbct0=QaeoiWRC-LIb_+BD8ZRPX&Y%-& zIVbWT7_Mz|o3oF1wP#xAgRxCJS8X|M-l#JXzOB*kvm55&rD5N*HtZTZ!}^RnmxflK zBG=ZO%L_L{dI(!mZ$4oZoed3*AKqUVfA6BJS^grMgT#51KVv?vKVJ(M+{WgXNz6d9 zE050VE)Xy3t^ba(>XfnHZ&zMBwzn?8=C>kt(IHL?{2qwU`8Dp*s#Ba4vm}&=qP>|v z-6S=_MwkBkT9?g%sI2CS8!HAFD@q1`b&+NlL}yeH&TK{f=Ov{QbH#rMu~xEaXsT=N zTGk0$-*FV(mA`Pw^$Se1f z4CmtVT(5qz)Lu=r8?Etcm-o0MZbt{c^l*JOz1}$Rbf$&*(3>=3qu%G`kDUC85u47w z8`);iIJ>#xX}4NJ)?faRy(P|jaw}c1LTd)!9TPX`7Nmcvx#>Bp+lH*91VNCE%L=G6zk*u+Hvd#cSEzOpF&5ejBw$7l%Dfy@4P(hW% zt~KJjTx*Pw>hfV3=I^HtC>{Q|?#=Y(XMOmLLL_&&6TdPfq5NQJ zAkjB&#fE0p2I=8fnVebtI$e8XZD?3>t-d2;0g`{TvATbBT7VLaIn>;E*z~!9_-cH? z^OeT@{3^$sppA^FUh$o5A}`+k@sJdg(!FDAukUa6m@s^Wcz5MVd=cdHlVX#4d*xQ# zF^Wc(Ey*r#GKu zj=#8arTd6+%t5ql`}?SycKfTeC->h9bl-iKf9r{Vs6H}_u71@627`eCip4c&aKiw_4h8YU>oL`B2n0V~>=y)Ln-)JD z|K;$uO$bELKkmUfs@pFh5P=E5{E9&QuJFGHTv#F*xBL({uJDFF)iGvo z2h;ysWT^HfQS9_5;(8rX$!~e~v5N}4_MnNe2F1g#v}@~R3g7L8rS!;8z{JOAWvifN z)53@%t+b_Xw6_FPP*9M9{~jue`+jr_tg#cKs@`=c3&^+YPAa1!@c6}?a}2J^SFc`u zvaK2waYCbMJq5G_v7Duu5LCivL*>1fc>Z%I+eRnbO_;)_EEZer_?qNhi!_AidD}JF*x(ko#!+%G7>H4YF_F+ z_gq*p&UZ5Ht=dCYKR0rmso8jLEM_Pm5!2_-SiItQzO|#HATKX3KYxkVhnzA)C^$7V zG!*GxTnH2DKhZ`e`_1-O)YjHUL_}mb)T9UPtn6DKm1nNfO9n$Ejk7GxjEusuvpIEA zYn6h8Q_k%fk*I(b6l(-E+7ONTw%25F{-0_OcqZ)6Vpt#Z@&ctIPr{Fcgao{%rXdtm z`IHx%I12#ZY(iXZQ=}G(Pu+qs*q~krTJpP*3+GZpO^l6IX3MvP9l3fQrZAVJ(u3s} zQE*R)Y$K<1KNUJRKUDAIYh-LJclK;sYwM!yDTKpI)nG2VkU%R<5TT=IXlSUet_~Xv zc3OMxa9bCi7-@OC=DwiyYlH4mACLB2SY0vn#`j`ZB%U3TmlCGwJm9?ZsIu5@F_=$f zxj&dsOIw?y%pfPaRhKcd$M)Ul9M7pdueMC~An}T-td}k{_7rb5l+k=wsy|;Jo z-U5oRv(`k-(fIXA6JmE~=WA?fSs9apr7_zJ2;m0iAFo%8M55wG@Gt`Pw;w5LuMNzL zJtw4bD|JTc#{TTJK2*L-SLY|&lH%fgbRUI6i8Cl(pRbENVfKpt6h8DV;bSBJd;IFs zOvxYLLb7qpDR?q48|c!x@9miuJv}{8ZX%?tR=b_EjZ91&l*OTrp04iav4K)dJH*8& zQtCO;to~#llQY22&L(DNUBfkDu=Ze{BI38h(*EsOq4p&#kBE}@>f%I8iZ00)c1Gaf zHTTG;u)$x5{)t8TFNF|)59Z$j$p1%7Q@ASsojZ4^Jq6iCMJpHO002eLdyZcT1+Kxb z$ECWwJQT_Yb?z>=$hf_(hDOz^!`gt4D1Ci>D=TI1*?ymeQCC1}v>NPifij+;*~drY z#{Ja{4O^ZbklAP@tSOnwDy&dmf@UF^y3~tGFy;kP^iji zMa-ohlWgl)gExv8YHhfryi4atC^?(9aLJxM+Ylw=&`0oJ*)PB;t>I$>SOBnW6fvOX z{Z%%L#wNJ+7E|QWT{-qE^CJ?;=R8JFpa`W&N&ifig-br(bCd!gOsCWPSW5*^g;`2Z zp+@VG=WjijO-qSet#?pa_?+!OQ+W2Zf$#83jpC9LNl8gj-|@GWyrcDT%4-h}xm}h} zp8LAzAv})YAsGGF7ojruhN?o@xyZHLIB5>)u$DtI$Q}~O-QC?4!Q42ziPfoW-0DOM zj#1K=X;DC(uaidZN#uO?WvEyTjIlmS21}Seysf9Zo8q_7fN$PwVtH$L@@$7?m?Df< zoKzsIf36hLV=(6ash^xSQ)ua9&r)*FL!7ZD-)BBwFR&fFPO0100*&1<~rZCDJI=cbDb zIVU;k^XGIFacSfG%IL->)P(eb%q5Jmogxn+B_Ta?#@$)nwj*hNzEUemCi5dJuc)Uf z1+TKc@=n8Te0qAC=@W6nthw$cb$#HasCn4iFAw=T+QMlR~?i^6{Xxcu~SfL+WxHI zyz*M6xJz zTmy)ZrnB>uAaVH{%=fMXXNEtdXLWzHQG-2(TOSe)6*_ljY7=03h$<9;30>T3OFU~4 z*s^;DFYr1uV64IzvOa9{uCA`mPE%`Z72tqpo!eorD8_S^xWFeKw<~N|@uC<~;HE8v zwO(4lm||ZS5r@;(u6wjw{P^+Xjq8qZyLUkx9L>th^IV=CFw=!=>c#AsQ@#gBhVTBh zrQZJtg!l_e?7yG;pGly?9hA%UTie>ope9wBXJ%xSj=y^{e~u6Ig8uQZVx?@>8m)vz z*pT)k^bQnhObPa~dK$mr0Lwbwfxsv9Tc&{+LaJXZviNy23TNB;bR0+jc_ zeePXC)yjo8+dkl%dog`wKs&bX+{ZC-&cT>|*FRP$R&RBtyQ!%OCK~hyyQ_KH? zaNlwM{P|r%DoqAUZlG2{q#9LhwE=HnWekjf1riFxq;jaVWug1hbQhFd^E}5Nyz*rC zimifn@*DaL2IjXs@DTXJrBD%NkjZ>V)?;12!H3B80f7CE&dx%=m3dHY^!b1G_V$)# zj5dlsKX`UBkH^panvqeghYrTp_Or}AghL|0B3-<sshlPSVfFmPyS2=x2V!> zdXz(4SFVGu)Y|6yMj0bm?Jqm;pc79$fYuP*yY@Zem#az?^Utihwp%F43NcQI?< z;HAM}cMN=am~B~fyCP^S+_BkbSQlvQfGZMLqt4jV zC)=b6%Y&edF*Ds9SHfq0IL$C6U_LCq-dC2RgY_S&zBYu}x3Gw&1B*qdr+-wr#sx=8 zcXPn*ui{_+U0nan;`$dcvHxBKsTcSvmzI`*9NQ}c-Tr;|@g}k9@p01}yPD;>A<5&% zfw6NW6`E2y(^KG}EC}b!9s4Tga`WaJ@OZVLrBhQ0%kL_AcfxwqHK%xtAejc?@UDF;9jKoB*p2@vWEe#`E6w!pap zkD=m?#bKqAuUS|qf~*fcVTEJTC6fD?RLoR+X5IBOoC;=Os@mD!zBC$*evi*891IaR z$u1gwL#{Z4E`9kgfinPRdv9A?xWPf08}%>K#V)XiG!=j+HR0X6!PG;y9kyZfh3l*^yyYwo&2sECrPGVVl;#bu$N;Z0vbMIivhpV*41UMhKGeF3EC?a1F4)Cx!TOTduEdzCvXpGXxS!+aWtP{U*R zroTUvTh#A`!9m44E(A`faqK+Y8F&YRD8E};PJsCuSxZU^PR&WB&taMCJq46D)G|T& zdudI8Q|^dHv#Xm!_DULPwY9ZzJl+3T3GS*2IMzDez{;vu4ZQq;sy?u|HAMYolVvef zvLk~FuvcNv4ykP^SEHA@NC9%mo*33ssM0kKP`?emucP=?O84L)LFNCIGUqAY3UvvL$U;ixy|IA?d|2rlh zmlpu06ShF`9i6k=i1VYSt$Ibx4vVJ$3|+~SVOct)HiVx5QeWAkKss&-mhE(jj@V` zTAw$5z?6j3^Eh%7iio_N+j_5=sp5O$vSaLK8-Qw{#DR^(@#+Cq)-9|?h8WRDaPmr>0zM732vK{ zwFOU@>H+ePJc8?}zwHk?g{g4_H3{js8)0SCspWlmWF)#fZvtFxF!Gyb3i>E*ZS)ao zToL0aB)}fe*Pc=Q8NDqsa}#=Qy|m& znwwwIPxu%CkBFu7u;Y=-!N|_STSNbcNJaM+d;Jut2f=cLKvBA|Kgc?6_@d6QgoQ@M z6dQ6&5`jQSPPPY34&v{3X(f}_mwM1Cc&XCa3&@&Hjh7&Q211pQks)-(?s9wXdiIY* zjTC&NW6s`*7g~IZF$tLN_aN3NaFg) zt%BI)t#U=y$oZSlqJz+BkK(OV@n2mZ5M>QKrm;B=EC$EG05Y+eeQbY<&zNx0uNXJ? z<|NG&*NcEtsXL}NcO8(qF-&5;IL;E?5t( z+uA;ZtcEX6E-8Uz!WW_!GtvfI1=NR>gm8PL7EF{3v)mgT?QEPmY4!#T;vDN!qE434!DzuKDO+jj>z+0|${Ace75YLQ`z z4)}oeB=41LKdZ#8neNY1`8{q}*2)-`CHeH=*_(5N-@w*uxN{1j^EH0GCcbpORx zY$m@4BC9yR#x3QKP0M`gV8?KJd@@Zx4Vq%12GO9!LPNwSDLMHtqZ)WOYciWPNiCsK zfs7K4G;lj?lgWkemCP!9mz4$j1(FE&{&EmQu-*HhaR+53`3!uW}C<4-QEd8jE{W5}vpfauL8bN4d{PG*zI%|AF*Bb#-s2%V%W)s5jH?1_tm4|82N561 zpXz~JsnN|j#2+}+39cNdL=WygN3K-+3L&0PKo<%)gnZDc#L=Y8r2=AuvUi5|rK!nD zsF2Y9qXe#(L%e_fnB8?KV<{^1H1JVF_n-cwBg;zNW597PW=g3}Yb`2iL%5a$OQtNeT;|$Xu zWO9rFr)BA(G%u{8^&TR#2j5I7!=n7@Z8Gw%aoa0hN+B(iNQTz3)oP-7A!~KYP%ASt z^V=f(!0&Ti-~ekm!LwCgi2RE9b`xTxP`_#r>DaCq?Arh^ORvN!t%z%b5I8O=sVz|k zg~q|HTWLY0l1Elfj@p%bbR#4dH*si;iBepq!$XfE`5nm)+vHvedh+O%*G*krD^My& z+{9!-DM=Wq_e0yc*BQ8n28?H`XF zRrv*etNuk=WS{QN?h2`_6L{0e-d$V%aiesOfOcE)Q%SLjQ(o7p^K)=m0%v1-`surI z7z#4W4UMki28A7YejkE(BCLjok55-e$GXth+k1IsVeD84WDZhbxUf$1>S>B8-iV2ZLEGR-MRH!R~wEr)6aYh*{@PpPpl`%*@OH zSR4zvq@f`xdl12%h7AsHjNJBdcRv--$i5;Kc}P?=^xZg2RE=HEg)N(BrGZnX!!(Ax zgW$#wtcq#BPo_^rd5S#7bl`H|M%Rc&%Koc)%`*2=2?SPMq%`p9-mb2iu?477lKY-4 zEG#4@CZ?pM)Y#2KiU5}j7ugf|q^-T3Qh3W2tPvoSb#-;g25EZ7TwGln>gzczqr<~V zZ{PkJ-C&(ee7mLa3^YsZ+O_Ld&2V{nd1(6Mi|>Gk0)vOnkLc)VFdH6U92}{O{PN|? ziXUs0KE;9an>UNsKjFeI7FlL3^4vWht_41!si~;~h5(;+b)A78$-PlK0#OVoQWFys z-aChA^u@*c#>Q^<&HW^f7?DR)k_^&ZnXIb2oBL9*AXp z1pPp2Y#hB^)Y8%dV=TeYouxF9|YWxva+(^;9xM0!bNxk zp8(OGq0!jWf|W8r-6lLaP+3(~1xb&;zdyuCH=Ue{^3F*=6a&X@8y*=B#A4gert5$A c*H-zW*fTGGY@1vM;)u{x*SVN=;d;>j0+Po8zW@LL literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/pkevosp.Dig-DWOQ.png b/previews/PR239/assets/pkevosp.Dig-DWOQ.png new file mode 100644 index 0000000000000000000000000000000000000000..13977e4c383123ad09e0fd376ba46fde6ea9986a GIT binary patch literal 11901 zcmeHt2T+sSw{KJw6e&jqj?(0)V5A)tDbhqmAP7hiL`qbUA|*)gD7Iq(3lT(`3W0-C zlwK1N1u@cVfDk&;5?X+eklYpj_s+aGZ|2RLJ9Foq|BRnAFp@9(+uz=6t^F(O{y9?v zfo*%XArJ@wBg4}c2n5f21Y*-|zK!q~9U*is{MvHG*x)pR!~OTFIx7x=*o!bat!EXS zJVTCpa-JTs%2`n&ZhY|YqD?&7&sAe#ISDITwsHRpVp@Kl{J!INo(X z+eofcwn^ROtfZ&E=VG>(NaE#v`kt!$SDkiPMGqP9=@#uG-5D#*QJPVzTw&HTDhewV zD&O~Cz1cl7-#t{-jHe~-)*6^d^`jxbj`?myAZ`S23k%x-b6gVC<3k{Xv3q$C2tJfB z%%0}}AAAtK<2HP%xAi34`-(>ffjDt4S{UBo;QzU2~tAz)b&YeHs z+0mim+4Ei}Vr^;3qrCn>puNmL>h&}Dnai`{+M!D}gtboU`l@o|{6h`Dar>xsx{X6X z=l8^;X(8i@Yinz)JlK;Tsc!}x5m^;?_{G@cYJ~FD;fIy;g)8JB%E)8gfra|>@2t;T zS%uTWC}ESh1f_}}Z&qGn2eS7aP@>E3~xkFAyX3^@{2Kugc3qM(ScXOJ*FE>%*T{C{YCQqci>G zi*}SXYn1!<7l$!~_2nS^VoJ#3xT0;r=+HfBQ)Dg-hh~qV7pmM4h(YzOCwu#r8j_ipm-p(`;1@Bp)GWzB*eY!heJWj!}N*$---j?xnpFxTE+K4WD1lu;=n55>_>p%Q% zGXhazBHT70r!#+FG1pmaDc0D}Z!tfT{tnwl??y+B{&=+eXhDn`C47-50g^kJPtTC; zMXsQ?ygr4*5tRw7udOh!sE7y-%MF?v17mh)8VHh_fzINm?rzucEqednXKt|O{Q2{J zr5IXxY6NpRfN`<0v5|aX=(@W%_fk4|P4YklrqOP_~~1UxHZ zsnvi~XX~2MIkaKZmhEm4J*~-6Y=#5AtHi4>)-RwwH#^&%87moJa)&7>MV;*4*tDHQ z`y!|^8X6|^aq{v+Q;I9yy=lxBVtaD7SU7g?e$JjfdkSJ^x?1*KWfu0KG_MbYOavTx z>7c8iFf-qm>Q~-xaF3rF5`Z>0_c9}h`nb4xdY(nnXZyb7S0j$x6Ov{RjQa8O^P7DV z7k4udeio%Dwq<&HT2pJUam~!}%W}(9a$kd6pxKwXq1wvA&m*lJ9ZPx=*E_-*} zUivHBGAk1suV@!I+F};9){eEH;3MSBQo{=pVE2pu;G6udloA<+a$g*8G)_?RswUv^ z?8&S&Q>00fYHmhGMvy2k0+E5`k&&Ycu?K~|{k$MiIt%>9zb87?$C@A;6OX#KXPS_j z?%usy?l*y783^0Fd9#rA(m9%f7y_~SqTbZ!O(1Q+!O}9$0t(VKlI^*3bNznJ4ngDq zyHamS4d2n*TX&+2jnQGV#X`EQKXFTQwL)ge>L0qTw{xFvFOxCxNK$h-Ms1*M>g_w< z^8P-^CP>Gq)uDS6DM15qW;zV`%F6N-)M*>O$#2b3?8PRb3zdPht#|8U#7lk0zQGdZ z+m%vb38DCDM;>vtaA5i2N0i|HBccTjs`+{Ucaf95VN=;z@yh5_i zMQ6QWz&C708i(;T9gx4Nqm2LpA)%&cC|+(){ZKDujC26dWTrKL+WHm}C+=M~G+!^x zAre?bF4M8Lj$AHGoArGgM2S$tEs>fdmoErzK_EY~#GCxmqGBR7?7@Rx z7JjfvlQsiT9hLp&%^P9}7pr-ASfUcpks-}Fy8w-vM?X<@jG%XVI!$$C&)!9$Q1HOJ zUG@G~06&uIzCPWzSaAY~F{b|rN?csk(-0{jrBzl`wDh(0{!Te-YisX;DvbnUalc9L z>zPfraX8$aJ9i%Ito``*Ts~-~=Q`wwI$7KF(4;}TvZn0GfrizM=?prC*Q+u0!H^de;NCa=r)7ay(?<9VgS z=f;yTQirdcj_l&@urBQII&;Mgc}zvcU;QE)o#q9+AxNkBXtS0j8XeWDFD9`2NCutV znr^^Z)a5Kr=yDkFYCvD3qULINH4`%y<$X!?+J%LMCL7;jnEEww%j?%2mJhr`)c;Mi zJa8iO)vH%IIXP8T{URq#b>MlfX%T^_$@IrMQ$9swp9Wj0NUy_@tkrY@6G)yPEw3S$ zJi2lwsoZqYn(Nux`@5>=1ypuLMMZ5Zs0>&Ob93_v>Af>;f19UUpn!ntJ~aZSvU5M5 z`@S&G!R6V$!uoHeg#fj&ZMX!-&}cO?QBl!MY%ke_%PyT^qh(EAVlA$DdpAk_)_PGX zff(olu{HGRPWqXcwQ35p8eT(C=xd%p?CztoLh=yF6~@ACb;r8xEv>ENEkc(`u6+U! z_1=9Yia7u2+|oduhS7#NO2i5o2yt_oF6V3Og9i_0y4pSRt5tO$atF{CZaZ`N@(}QD z3lzVo!i557BO)7^D%r1D8;OJEr38<}~*HHV^uJ`4>3VG|8MT~bs6nbvsrho^>GCYaoOeT6B*-p z1t51#4@Be#U=g~~43lC0mS)<=!dK^{Y_$;xpYJ>}k_SN_fzndqNh+{$48cJ>WMnvh zy1li~rE!mnTgy{kUFJ+7$&bHTm&58}LizlLW-lZ>fBqbUXN&_k1#*7WyT5FHq&{lO zGVQog6ePeaOYhxd{$ugxgIMm5va+jK$5G>}z{>uKV%#rO^9$Ad52Ko2A@(c8eudb- zhd1*pSO3pkJv24D*=On^V1hQB@w<2Lj8Uk%$I`l>%nuI_kECRP!SUwJ6>>!YTp-W_ z7%E$8GY-2_j6i&x|G#lFrq)AI#kGY5LRAoLAYL1YNab{1C7!cRTcJ^OF+{G*@#X)C zrE!r-j%^`G_;wdAsDq1>gu$0*WbDT+)k?GH9->)Sntw8qGtp0$Q$we+$A}48*zu+m zJ4?&O;fKn3j@4^`!b5;%*4*NyRZQnOC1!w}PDHbPEiK#2CsILcBPqEDm?tn8&&DU)!-O_ zot9*AJpN%AtQ!g$v**|~0ART*T-F1`%M7_bEJo-l_OOw%5dlUnV7?!Ij%-uL!{K4|o@_6=iTL!E=Lc zZEgDuXE)e!Qt(t7ffI>x zU!5D0jCEm7PfdY^Kpxv~kd#$crv9#RX21$iVrj6Tj8{0g07%@;O}v5Xy#<7ll9F2E zzjEa!!&6fMrkkAVL6W5WCCI}kXEq8Zz251;1Ec)vhq1?eoNs)fS`T4)&#A5u{83?Z~~4LHuY+rCOZYX=ANklS(&1ESPa z=S0tuhSqTnfd5S?nwF?j_XM?TI=MQ?NuXgs|1G)fg*GRSF5uO-51qu3c1}HZ>3M&d z)Jd3;5uNn}`p+Dsh}hUaO*pm*oR@v4t{;X36_n-n0`R#zwPhF~apU9TY6HRP}k*(qV{g43}Lu9_w~SKU|q9Y%URho0IcBb>4?d_%xaoOZ%T$T>Nn5 z%Nl*UPhh=|ux^K%i~~0H*Khk43S1y+!eI4xiHbHQsVU=%F4aUIFpe*pp_F1M+AIBW z7JI;J2B)cK&45baut|lk&8gZ<5DVN$j4#TOhndMk{pEf_lE*s=qS!13>1rL5Mj+hd zaFb4Ko0dmXprGV&|8;tIzI}NChJuG+N;`7(+g$yU zwx!+Cw}Gr>-CaIoUwAXKiF%aj{r-83$z|^o!|cbw|b4-tg~+94)zAM zW5>W(4VmHbnc<2!T7etYUEmLLv;Rf%^bC1HtT+se73x&!KuFDIG1dvT2v&|a9$xP1!ZNzSiD^xer>8M z=bZ4yECoG22{AoGs7uLtJTgAtcHI7W{kPjof1nRRAp8T)b^YpUgt`or+v;lQe^7TQ zKgsO{vC@NTHGAwMGB-0bGbhIrG#$;rnIE&oh^%`vzoM0f4-cY3yo zSC9o7*8qg{9Wh6B&~`uq9gRr&i2OrYPGIj#a%GT>wRNntZsh3Kr{vZ7+IvFzaNzul z&_fFY#A66r=4ts!!*g~eo{6AuLQ3hZlsA)oiHe}Ha>$f*GH3NMM?KGIYHA9}U2T zG5lPcv2wtOYt-B=>FppT4u8H6N<{MUfGOxc;EbBFoxAfKLeTp!!)#8|@JuR*K-^U2 zs!**O6Ul{;dT{o!Noni00ReOhtC1o>+)t;|EwfA=K3vgXu7^X(p)ycX-DmKrffT64 zjc@cHZsTA7w7E$*M8n+^!WhyrMdBQ2Z)sy2vz|eVNz{6G)a*d>Ko||gsDYJ&S$?Im zOSFM%@bDeqU#hXgRMSDltFSV346a3;j#|r#s(>kd`t*shI6;F-vO*=xTj!L`6c8;? zLRxblHEC6T3UMr0HV5lleiKb(P>rFma@#YYmSticp@d4a26?sDY!IfIRmm!_sC59Jj>aVUrDV1yPMWq{4O(d{9hd?#CS!} zs2dh9Zk6Y)DeA}4AHzoFu3-AhuD86>L*ifo0yG+6u;$~_IoP(P$@Zj|FE4V>Jd+oH z!YK}$1pYoNUrK#)!M6=!6)bmWlsn{ucH!BjYyW%?#-fJamV699 z!(SdkKSU2>|3fk5JV1;{?X@52xflV-KQDc(UKvQTc$=3O359kMA3QipBpU6D2){E2 zT>-Sjs~fYPbUTL4as_o!Wyf&P;HZsrTy2yTV+hSa=t{d&ptyoOtCU~|8+Tt>ghyrw z^fp~12-M64I*L_nL)gZ~xHI)n$GD zJPr#07@BNA4=jkGu$N2InEeyS6DQONjK)@34GwFu9y%8Q!f`(fxp27U-9kW{p)^`X z;@Gtgd;~LI$$<-)AcY@+X8!hFUd7xe{>5saS86d58U=Jr6duAtlD3_s83THugKxtD zgILqVBV%A*%$we-62AR;0k*?MT+G40^=Uc)JFo$$APd?FYQBUX4w_q>Gt(ybV&~ZY zkJ-v-xfnQ>XR784)7EGDU`E^<@4^YY5`zgJxydVa@X&(p)j>`|%HeNBqNYS+lOf3T zWI_}Npl6tcP2FzjlKSjB`0=Lah?{G(CkGVo7KT=Faj~4vR-Y+iw~^CyS1t(pNF0Yv z$X6r|tnLHS^gqSo9loS)6BC2PMMp=crt+vOj!qL+WKP}H zf~cgdQ-cze9F7ApieHCFxlrWR3LSTl<lGQ2#cBoKZ}GfiH5>Eh|pwaZ*QNh!(PY>gl83CB7Q%1 z&1z!NnR0+U1lW|bPT^?B8{M!(<4yOZc!U^t13uoF$gA$;OjF^`F~0JY9dW?@(eH5;ZwnO3_&uXTu@n ziatU4uc!k}9YgIe2WE5SUOIH>d{>PPv_lG;ESsjketo&~?RkS(7ddH~%2$3pL-jNc zYr+zxyFO{QGDB+j{sE_)A@X@bf-8+vk(^OdvJ8iew;C7nd5!>}`bLbtIq)0;0}cpK zwdo%>2{}{D`%U%r^-=C1e=7$4y|Kn5@yG$@q1G9#_Ff2gICPRMDj4HQVVAEaU*{H$ zFKCwj^7B7u@hzAy4@CIIl+Gf_;5X#15ZG(eixXfvL`6>Xa+|Nxq_ji*QIq17)iVJ2 zi4fH*x(i?TA#v{QncVc$UK8738Vgk(KX*qt0}Cn0@t{TO_4aK<#A4WbYB}4YjoI#7 ze$(G|S@rPQ?V|ITBY&9)>wkXLaA`s4Z@w*G4*u2i<&t0LrNTWt=CxGEGOgWH^0ajc zq2`I5&4LMGmo)oUd`qR^;}a4_COE6BtMJ+E>}*}#8J2XumzS5a zvNA4iVtjnKAuB5jHv;fOL`3BN={KdNE32#OY0We$weI-~6mEeL9@5Rjdd0!JpEg&~ z(vo;Aw0*mTgoM4LBXwpbeETw;u5WI&{CvZhFyXtJni?TuX=LCHi9~9fudlCP&AWM4 zwy?N3ASfs(Fi=%RWtZ6ig`!L>Uu14QdD80OE?HSwyrVQU7~%;8jtV0!`uzn3Zwv;e z6Ls7W_zZ&)QXan%TPsacNli;*GMR*GbNan!8a&Y7)tV>n6Yf!zJ2>rQc^G&jQK8H`{eTSGK0aWt*r%MlfP(ZXIDt_R88`7 zb2}(Wo0|GI=4-yInm_>PUtCo5C?-ZyQj)&3g!Mq4&|p0^Nzcr5adFA4tgJkDFr$4E z2xDw)ti4hx9*=+jUO38@Z#8#VTPCg{oXMq$TCa0+bN#jA8qS)U0=I>mWaAnDn%30R zz=X21vkQ`s=^2W0@NUqzeBvDIZ)l)9@volcfBT>8jrm>T-Nx_5)&L|UjPy-U=bgM1 F{U7^&kc$8S literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/rleiuex.3sfpQl2i.png b/previews/PR239/assets/rleiuex.3sfpQl2i.png new file mode 100644 index 0000000000000000000000000000000000000000..e91a0338ce96758af988cf0cdbdcac3336f74241 GIT binary patch literal 65364 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 literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/rzkakxn._0R9BbFk.png b/previews/PR239/assets/rzkakxn._0R9BbFk.png new file mode 100644 index 0000000000000000000000000000000000000000..6752dc80d3da3267f2b9254ee93cfb56f90c9876 GIT binary patch literal 30821 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 i6_FPm|D}K63u4kOJ9iLJ?r`~LtTevA_U literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/source_GeometryOps.md.D_V6MfpH.js b/previews/PR239/assets/source_GeometryOps.md.D_V6MfpH.js new file mode 100644 index 000000000..363b65baa --- /dev/null +++ b/previews/PR239/assets/source_GeometryOps.md.D_V6MfpH.js @@ -0,0 +1,85 @@ +import{_ as i,c as a,a5 as n,o as l}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"GeometryOps.jl","description":"","frontmatter":{},"headers":[],"relativePath":"source/GeometryOps.md","filePath":"source/GeometryOps.md","lastUpdated":null}'),t={name:"source/GeometryOps.md"};function h(p,s,k,e,E,r){return l(),a("div",null,s[0]||(s[0]=[n(`
    julia
    module GeometryOps
    +
    +import GeometryOpsCore
    +import GeometryOpsCore:
    +                TraitTarget,
    +                Manifold, Planar, Spherical, Geodesic,
    +                BoolsAsTypes, _True, _False, _booltype,
    +                apply, applyreduce,
    +                flatten, reconstruct, rebuild, unwrap, _linearring,
    +                APPLY_KEYWORDS, THREADED_KEYWORD, CRS_KEYWORD, CALC_EXTENT_KEYWORD
    +
    +export TraitTarget, Manifold, Planar, Spherical, Geodesic, apply, applyreduce, flatten, reconstruct, rebuild, unwrap
    +
    +using GeoInterface
    +using GeometryBasics
    +using LinearAlgebra, Statistics
    +
    +import Tables, DataAPI
    +import GeometryBasics.StaticArrays
    +import DelaunayTriangulation # for convex hull and triangulation
    +import ExactPredicates
    +import Base.@kwdef
    +import GeoInterface.Extents: Extents
    +
    +const GI = GeoInterface
    +const GB = GeometryBasics
    +
    +const TuplePoint{T} = Tuple{T, T} where T <: AbstractFloat
    +const Edge{T} = Tuple{TuplePoint{T},TuplePoint{T}} where T
    +
    +include("types.jl")
    +include("primitives.jl")
    +include("utils.jl")
    +include("not_implemented_yet.jl")
    +
    +include("methods/angles.jl")
    +include("methods/area.jl")
    +include("methods/barycentric.jl")
    +include("methods/buffer.jl")
    +include("methods/centroid.jl")
    +include("methods/convex_hull.jl")
    +include("methods/distance.jl")
    +include("methods/equals.jl")
    +include("methods/clipping/predicates.jl")
    +include("methods/clipping/clipping_processor.jl")
    +include("methods/clipping/coverage.jl")
    +include("methods/clipping/cut.jl")
    +include("methods/clipping/intersection.jl")
    +include("methods/clipping/difference.jl")
    +include("methods/clipping/union.jl")
    +include("methods/geom_relations/contains.jl")
    +include("methods/geom_relations/coveredby.jl")
    +include("methods/geom_relations/covers.jl")
    +include("methods/geom_relations/crosses.jl")
    +include("methods/geom_relations/disjoint.jl")
    +include("methods/geom_relations/geom_geom_processors.jl")
    +include("methods/geom_relations/intersects.jl")
    +include("methods/geom_relations/overlaps.jl")
    +include("methods/geom_relations/touches.jl")
    +include("methods/geom_relations/within.jl")
    +include("methods/orientation.jl")
    +include("methods/polygonize.jl")
    +
    +include("transformations/extent.jl")
    +include("transformations/flip.jl")
    +include("transformations/reproject.jl")
    +include("transformations/segmentize.jl")
    +include("transformations/simplify.jl")
    +include("transformations/tuples.jl")
    +include("transformations/transform.jl")
    +include("transformations/correction/geometry_correction.jl")
    +include("transformations/correction/closed_ring.jl")
    +include("transformations/correction/intersecting_polygons.jl")

    Import all names from GeoInterface and Extents, so users can do GO.extent or GO.trait.

    julia
    for name in names(GeoInterface)
    +    @eval using GeoInterface: $name
    +end
    +for name in names(Extents)
    +    @eval using GeoInterface.Extents: $name
    +end
    +
    +function __init__()

    Handle all available errors!

    julia
        Base.Experimental.register_error_hint(_reproject_error_hinter, MethodError)
    +    Base.Experimental.register_error_hint(_geodesic_segments_error_hinter, MethodError)
    +    Base.Experimental.register_error_hint(_buffer_error_hinter, MethodError)
    +end
    +
    +end

    This page was generated using Literate.jl.

    `,8)]))}const o=i(t,[["render",h]]);export{g as __pageData,o as default}; diff --git a/previews/PR239/assets/source_GeometryOps.md.D_V6MfpH.lean.js b/previews/PR239/assets/source_GeometryOps.md.D_V6MfpH.lean.js new file mode 100644 index 000000000..363b65baa --- /dev/null +++ b/previews/PR239/assets/source_GeometryOps.md.D_V6MfpH.lean.js @@ -0,0 +1,85 @@ +import{_ as i,c as a,a5 as n,o as l}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"GeometryOps.jl","description":"","frontmatter":{},"headers":[],"relativePath":"source/GeometryOps.md","filePath":"source/GeometryOps.md","lastUpdated":null}'),t={name:"source/GeometryOps.md"};function h(p,s,k,e,E,r){return l(),a("div",null,s[0]||(s[0]=[n(`

    GeometryOps.jl

    julia
    module GeometryOps
    +
    +import GeometryOpsCore
    +import GeometryOpsCore:
    +                TraitTarget,
    +                Manifold, Planar, Spherical, Geodesic,
    +                BoolsAsTypes, _True, _False, _booltype,
    +                apply, applyreduce,
    +                flatten, reconstruct, rebuild, unwrap, _linearring,
    +                APPLY_KEYWORDS, THREADED_KEYWORD, CRS_KEYWORD, CALC_EXTENT_KEYWORD
    +
    +export TraitTarget, Manifold, Planar, Spherical, Geodesic, apply, applyreduce, flatten, reconstruct, rebuild, unwrap
    +
    +using GeoInterface
    +using GeometryBasics
    +using LinearAlgebra, Statistics
    +
    +import Tables, DataAPI
    +import GeometryBasics.StaticArrays
    +import DelaunayTriangulation # for convex hull and triangulation
    +import ExactPredicates
    +import Base.@kwdef
    +import GeoInterface.Extents: Extents
    +
    +const GI = GeoInterface
    +const GB = GeometryBasics
    +
    +const TuplePoint{T} = Tuple{T, T} where T <: AbstractFloat
    +const Edge{T} = Tuple{TuplePoint{T},TuplePoint{T}} where T
    +
    +include("types.jl")
    +include("primitives.jl")
    +include("utils.jl")
    +include("not_implemented_yet.jl")
    +
    +include("methods/angles.jl")
    +include("methods/area.jl")
    +include("methods/barycentric.jl")
    +include("methods/buffer.jl")
    +include("methods/centroid.jl")
    +include("methods/convex_hull.jl")
    +include("methods/distance.jl")
    +include("methods/equals.jl")
    +include("methods/clipping/predicates.jl")
    +include("methods/clipping/clipping_processor.jl")
    +include("methods/clipping/coverage.jl")
    +include("methods/clipping/cut.jl")
    +include("methods/clipping/intersection.jl")
    +include("methods/clipping/difference.jl")
    +include("methods/clipping/union.jl")
    +include("methods/geom_relations/contains.jl")
    +include("methods/geom_relations/coveredby.jl")
    +include("methods/geom_relations/covers.jl")
    +include("methods/geom_relations/crosses.jl")
    +include("methods/geom_relations/disjoint.jl")
    +include("methods/geom_relations/geom_geom_processors.jl")
    +include("methods/geom_relations/intersects.jl")
    +include("methods/geom_relations/overlaps.jl")
    +include("methods/geom_relations/touches.jl")
    +include("methods/geom_relations/within.jl")
    +include("methods/orientation.jl")
    +include("methods/polygonize.jl")
    +
    +include("transformations/extent.jl")
    +include("transformations/flip.jl")
    +include("transformations/reproject.jl")
    +include("transformations/segmentize.jl")
    +include("transformations/simplify.jl")
    +include("transformations/tuples.jl")
    +include("transformations/transform.jl")
    +include("transformations/correction/geometry_correction.jl")
    +include("transformations/correction/closed_ring.jl")
    +include("transformations/correction/intersecting_polygons.jl")

    Import all names from GeoInterface and Extents, so users can do GO.extent or GO.trait.

    julia
    for name in names(GeoInterface)
    +    @eval using GeoInterface: $name
    +end
    +for name in names(Extents)
    +    @eval using GeoInterface.Extents: $name
    +end
    +
    +function __init__()

    Handle all available errors!

    julia
        Base.Experimental.register_error_hint(_reproject_error_hinter, MethodError)
    +    Base.Experimental.register_error_hint(_geodesic_segments_error_hinter, MethodError)
    +    Base.Experimental.register_error_hint(_buffer_error_hinter, MethodError)
    +end
    +
    +end

    This page was generated using Literate.jl.

    `,8)]))}const o=i(t,[["render",h]]);export{g as __pageData,o as default}; diff --git a/previews/PR239/assets/source_GeometryOpsFlexiJoinsExt_GeometryOpsFlexiJoinsExt.md.BtiH8and.js b/previews/PR239/assets/source_GeometryOpsFlexiJoinsExt_GeometryOpsFlexiJoinsExt.md.BtiH8and.js new file mode 100644 index 000000000..88f619662 --- /dev/null +++ b/previews/PR239/assets/source_GeometryOpsFlexiJoinsExt_GeometryOpsFlexiJoinsExt.md.BtiH8and.js @@ -0,0 +1,16 @@ +import{_ as i,c as a,a5 as h,o as t}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/GeometryOpsFlexiJoinsExt/GeometryOpsFlexiJoinsExt.md","filePath":"source/GeometryOpsFlexiJoinsExt/GeometryOpsFlexiJoinsExt.md","lastUpdated":null}'),n={name:"source/GeometryOpsFlexiJoinsExt/GeometryOpsFlexiJoinsExt.md"};function e(k,s,p,l,d,r){return t(),a("div",null,s[0]||(s[0]=[h(`
    julia
    module GeometryOpsFlexiJoinsExt
    +
    +using GeometryOps
    +using FlexiJoins
    +
    +import GeometryOps as GO, GeoInterface as GI
    +using SortTileRecursiveTree, Tables

    This module defines the FlexiJoins APIs for GeometryOps' boolean comparison functions, taken from DE-9IM.

    First, we define the joining modes (Tree, NestedLoopFast) that the GO DE-9IM functions support.

    julia
    const GO_DE9IM_FUNCS = Union{typeof(GO.contains), typeof(GO.within), typeof(GO.intersects), typeof(GO.disjoint), typeof(GO.touches), typeof(GO.crosses), typeof(GO.overlaps), typeof(GO.covers), typeof(GO.coveredby), typeof(GO.equals)}

    NestedLoopFast is the naive fallback method

    julia
    FlexiJoins.supports_mode(::FlexiJoins.Mode.NestedLoopFast, ::FlexiJoins.ByPred{F}, datas) where F <: GO_DE9IM_FUNCS = true

    This method allows you to cache a tree, which we do by using an STRtree. TODO: wrap GO predicate functions in a TreeJoiner struct or something, to indicate that we want to use trees, since they can be slower in some situations.

    julia
    FlexiJoins.supports_mode(::FlexiJoins.Mode.Tree, ::FlexiJoins.ByPred{F}, datas) where F <: GO_DE9IM_FUNCS = true

    Nested loop support is simple, and needs no further support. However, for trees, we need to define how the tree is prepared and how it is used. This is done by defining the prepare_for_join function to return an STRTree, and by defining the findmatchix function as querying that tree before checking intersections.

    In theory, one could extract the tree from e.g a GeoPackage or some future GeoDataFrame.

    julia
    FlexiJoins.prepare_for_join(::FlexiJoins.Mode.Tree, X, cond::FlexiJoins.ByPred{<: GO_DE9IM_FUNCS}) = (X, SortTileRecursiveTree.STRtree(map(cond.Rf, X)))
    +function FlexiJoins.findmatchix(::FlexiJoins.Mode.Tree, cond::FlexiJoins.ByPred{F}, ix_a, a, (B, tree)::Tuple, multi::typeof(identity)) where F <: GO_DE9IM_FUNCS

    Implementation note: here, a is a row, and b is the full table. We extract the relevant columns using cond.Lf and cond.Rf.

    julia
        idxs = SortTileRecursiveTree.query(tree, cond.Lf(a))
    +    intersecting_idxs = filter!(idxs) do idx
    +        cond.pred(cond.Lf(a), cond.Rf(B[idx]))
    +    end
    +    return intersecting_idxs
    +end

    Finally, for completeness, we define the swap_sides function for those predicates which are defined as inversions.

    julia
    FlexiJoins.swap_sides(::typeof(GO.contains)) = GO.within
    +FlexiJoins.swap_sides(::typeof(GO.within)) = GO.contains
    +FlexiJoins.swap_sides(::typeof(GO.coveredby)) = GO.covers
    +FlexiJoins.swap_sides(::typeof(GO.covers)) = GO.coveredby

    That's a wrap, folks!

    julia
    end

    This page was generated using Literate.jl.

    `,19)]))}const y=i(n,[["render",e]]);export{g as __pageData,y as default}; diff --git a/previews/PR239/assets/source_GeometryOpsFlexiJoinsExt_GeometryOpsFlexiJoinsExt.md.BtiH8and.lean.js b/previews/PR239/assets/source_GeometryOpsFlexiJoinsExt_GeometryOpsFlexiJoinsExt.md.BtiH8and.lean.js new file mode 100644 index 000000000..88f619662 --- /dev/null +++ b/previews/PR239/assets/source_GeometryOpsFlexiJoinsExt_GeometryOpsFlexiJoinsExt.md.BtiH8and.lean.js @@ -0,0 +1,16 @@ +import{_ as i,c as a,a5 as h,o as t}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/GeometryOpsFlexiJoinsExt/GeometryOpsFlexiJoinsExt.md","filePath":"source/GeometryOpsFlexiJoinsExt/GeometryOpsFlexiJoinsExt.md","lastUpdated":null}'),n={name:"source/GeometryOpsFlexiJoinsExt/GeometryOpsFlexiJoinsExt.md"};function e(k,s,p,l,d,r){return t(),a("div",null,s[0]||(s[0]=[h(`
    julia
    module GeometryOpsFlexiJoinsExt
    +
    +using GeometryOps
    +using FlexiJoins
    +
    +import GeometryOps as GO, GeoInterface as GI
    +using SortTileRecursiveTree, Tables

    This module defines the FlexiJoins APIs for GeometryOps' boolean comparison functions, taken from DE-9IM.

    First, we define the joining modes (Tree, NestedLoopFast) that the GO DE-9IM functions support.

    julia
    const GO_DE9IM_FUNCS = Union{typeof(GO.contains), typeof(GO.within), typeof(GO.intersects), typeof(GO.disjoint), typeof(GO.touches), typeof(GO.crosses), typeof(GO.overlaps), typeof(GO.covers), typeof(GO.coveredby), typeof(GO.equals)}

    NestedLoopFast is the naive fallback method

    julia
    FlexiJoins.supports_mode(::FlexiJoins.Mode.NestedLoopFast, ::FlexiJoins.ByPred{F}, datas) where F <: GO_DE9IM_FUNCS = true

    This method allows you to cache a tree, which we do by using an STRtree. TODO: wrap GO predicate functions in a TreeJoiner struct or something, to indicate that we want to use trees, since they can be slower in some situations.

    julia
    FlexiJoins.supports_mode(::FlexiJoins.Mode.Tree, ::FlexiJoins.ByPred{F}, datas) where F <: GO_DE9IM_FUNCS = true

    Nested loop support is simple, and needs no further support. However, for trees, we need to define how the tree is prepared and how it is used. This is done by defining the prepare_for_join function to return an STRTree, and by defining the findmatchix function as querying that tree before checking intersections.

    In theory, one could extract the tree from e.g a GeoPackage or some future GeoDataFrame.

    julia
    FlexiJoins.prepare_for_join(::FlexiJoins.Mode.Tree, X, cond::FlexiJoins.ByPred{<: GO_DE9IM_FUNCS}) = (X, SortTileRecursiveTree.STRtree(map(cond.Rf, X)))
    +function FlexiJoins.findmatchix(::FlexiJoins.Mode.Tree, cond::FlexiJoins.ByPred{F}, ix_a, a, (B, tree)::Tuple, multi::typeof(identity)) where F <: GO_DE9IM_FUNCS

    Implementation note: here, a is a row, and b is the full table. We extract the relevant columns using cond.Lf and cond.Rf.

    julia
        idxs = SortTileRecursiveTree.query(tree, cond.Lf(a))
    +    intersecting_idxs = filter!(idxs) do idx
    +        cond.pred(cond.Lf(a), cond.Rf(B[idx]))
    +    end
    +    return intersecting_idxs
    +end

    Finally, for completeness, we define the swap_sides function for those predicates which are defined as inversions.

    julia
    FlexiJoins.swap_sides(::typeof(GO.contains)) = GO.within
    +FlexiJoins.swap_sides(::typeof(GO.within)) = GO.contains
    +FlexiJoins.swap_sides(::typeof(GO.coveredby)) = GO.covers
    +FlexiJoins.swap_sides(::typeof(GO.covers)) = GO.coveredby

    That's a wrap, folks!

    julia
    end

    This page was generated using Literate.jl.

    `,19)]))}const y=i(n,[["render",e]]);export{g as __pageData,y as default}; diff --git a/previews/PR239/assets/source_GeometryOpsLibGEOSExt_GeometryOpsLibGEOSExt.md.BX97MBsi.js b/previews/PR239/assets/source_GeometryOpsLibGEOSExt_GeometryOpsLibGEOSExt.md.BX97MBsi.js new file mode 100644 index 000000000..2f1f59f92 --- /dev/null +++ b/previews/PR239/assets/source_GeometryOpsLibGEOSExt_GeometryOpsLibGEOSExt.md.BX97MBsi.js @@ -0,0 +1,31 @@ +import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const o=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/GeometryOpsLibGEOSExt/GeometryOpsLibGEOSExt.md","filePath":"source/GeometryOpsLibGEOSExt/GeometryOpsLibGEOSExt.md","lastUpdated":null}'),e={name:"source/GeometryOpsLibGEOSExt/GeometryOpsLibGEOSExt.md"};function l(h,s,p,k,r,E){return t(),a("div",null,s[0]||(s[0]=[n(`
    julia
    module GeometryOpsLibGEOSExt
    +
    +import GeometryOps as GO, LibGEOS as LG
    +import GeoInterface as GI
    +
    +import GeometryOps: GEOS, enforce, _True, _False, _booltype
    +
    +using GeometryOps

    The filter statement is required because in Julia, each module has its own versions of these functions, which serve to evaluate or include code inside the scope of the module. However, if you import those from another module (which you would with all=true), that creates an ambiguity which causes a warning during precompile/load time. In order to avoid this, we filter out these special functions.

    julia
    for name in filter(!in((:var"#eval", :eval, :var"#include", :include)), names(GeometryOps))
    +    @eval import GeometryOps: $name
    +end
    +
    +"""
    +    _wrap(geom; crs, calc_extent)
    +
    +Wraps \`geom\` in a GI wrapper geometry of its geometry trait.  This allows us
    +to attach CRS and extent info to geometry types which otherwise could not hold
    +those, like LibGEOS and WKB geometries.
    +
    +Returns a GI wrapper geometry, for which \`parent(result) == geom\`.
    +"""
    +function _wrap(geom; crs=GI.crs(geom), calc_extent = true)
    +    return GI.geointerface_geomtype(GI.geomtrait(geom))(geom; crs, extent = GI.extent(geom, calc_extent))
    +end
    +
    +include("buffer.jl")
    +include("segmentize.jl")
    +include("simplify.jl")
    +
    +include("simple_overrides.jl")
    +
    +end

    This page was generated using Literate.jl.

    `,5)]))}const g=i(e,[["render",l]]);export{o as __pageData,g as default}; diff --git a/previews/PR239/assets/source_GeometryOpsLibGEOSExt_GeometryOpsLibGEOSExt.md.BX97MBsi.lean.js b/previews/PR239/assets/source_GeometryOpsLibGEOSExt_GeometryOpsLibGEOSExt.md.BX97MBsi.lean.js new file mode 100644 index 000000000..2f1f59f92 --- /dev/null +++ b/previews/PR239/assets/source_GeometryOpsLibGEOSExt_GeometryOpsLibGEOSExt.md.BX97MBsi.lean.js @@ -0,0 +1,31 @@ +import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const o=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/GeometryOpsLibGEOSExt/GeometryOpsLibGEOSExt.md","filePath":"source/GeometryOpsLibGEOSExt/GeometryOpsLibGEOSExt.md","lastUpdated":null}'),e={name:"source/GeometryOpsLibGEOSExt/GeometryOpsLibGEOSExt.md"};function l(h,s,p,k,r,E){return t(),a("div",null,s[0]||(s[0]=[n(`
    julia
    module GeometryOpsLibGEOSExt
    +
    +import GeometryOps as GO, LibGEOS as LG
    +import GeoInterface as GI
    +
    +import GeometryOps: GEOS, enforce, _True, _False, _booltype
    +
    +using GeometryOps

    The filter statement is required because in Julia, each module has its own versions of these functions, which serve to evaluate or include code inside the scope of the module. However, if you import those from another module (which you would with all=true), that creates an ambiguity which causes a warning during precompile/load time. In order to avoid this, we filter out these special functions.

    julia
    for name in filter(!in((:var"#eval", :eval, :var"#include", :include)), names(GeometryOps))
    +    @eval import GeometryOps: $name
    +end
    +
    +"""
    +    _wrap(geom; crs, calc_extent)
    +
    +Wraps \`geom\` in a GI wrapper geometry of its geometry trait.  This allows us
    +to attach CRS and extent info to geometry types which otherwise could not hold
    +those, like LibGEOS and WKB geometries.
    +
    +Returns a GI wrapper geometry, for which \`parent(result) == geom\`.
    +"""
    +function _wrap(geom; crs=GI.crs(geom), calc_extent = true)
    +    return GI.geointerface_geomtype(GI.geomtrait(geom))(geom; crs, extent = GI.extent(geom, calc_extent))
    +end
    +
    +include("buffer.jl")
    +include("segmentize.jl")
    +include("simplify.jl")
    +
    +include("simple_overrides.jl")
    +
    +end

    This page was generated using Literate.jl.

    `,5)]))}const g=i(e,[["render",l]]);export{o as __pageData,g as default}; diff --git a/previews/PR239/assets/source_GeometryOpsLibGEOSExt_buffer.md.BIbTaNIz.js b/previews/PR239/assets/source_GeometryOpsLibGEOSExt_buffer.md.BIbTaNIz.js new file mode 100644 index 000000000..0703c9d6a --- /dev/null +++ b/previews/PR239/assets/source_GeometryOpsLibGEOSExt_buffer.md.BIbTaNIz.js @@ -0,0 +1,31 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const d=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/GeometryOpsLibGEOSExt/buffer.md","filePath":"source/GeometryOpsLibGEOSExt/buffer.md","lastUpdated":null}'),k={name:"source/GeometryOpsLibGEOSExt/buffer.md"};function t(l,s,p,e,E,r){return h(),a("div",null,s[0]||(s[0]=[n(`
    julia
    const _GEOS_CAPSTYLE_LOOKUP = Dict{Symbol, LG.GEOSBufCapStyles}(
    +    :round => LG.GEOSBUF_CAP_ROUND,
    +    :flat => LG.GEOSBUF_CAP_FLAT,
    +    :square => LG.GEOSBUF_CAP_SQUARE,
    +)
    +
    +const _GEOS_JOINSTYLE_LOOKUP = Dict{Symbol, LG.GEOSBufJoinStyles}(
    +    :round => LG.GEOSBUF_JOIN_ROUND,
    +    :mitre => LG.GEOSBUF_JOIN_MITRE,
    +    :bevel => LG.GEOSBUF_JOIN_BEVEL,
    +)
    +
    +to_cap_style(style::Symbol) = _GEOS_CAPSTYLE_LOOKUP[style]
    +to_cap_style(style::LG.GEOSBufCapStyles) = style
    +to_cap_style(num::Integer) = num
    +
    +to_join_style(style::Symbol) = _GEOS_JOINSTYLE_LOOKUP[style]
    +to_join_style(style::LG.GEOSBufJoinStyles) = style
    +to_join_style(num::Integer) = num
    +
    +function GO.buffer(alg::GEOS, geometry, distance; calc_extent = true, kwargs...)

    The reason we use apply here is so that this also works with featurecollections, tables, vectors of geometries, etc!

    julia
        return apply(TraitTarget{GI.AbstractGeometryTrait}(), geometry; kwargs...) do geom
    +        newgeom = LG.bufferWithStyle(
    +            GI.convert(LG, geom), distance;
    +            quadsegs = get(alg, :quadsegs, 8),
    +            endCapStyle = to_cap_style(get(alg, :endCapStyle, :round)),
    +            joinStyle = to_join_style(get(alg, :joinStyle, :round)),
    +            mitreLimit = get(alg, :mitreLimit, 5.0),
    +        )
    +        return _wrap(newgeom; crs = GI.crs(geom), calc_extent)
    +    end
    +end

    This page was generated using Literate.jl.

    `,5)]))}const y=i(k,[["render",t]]);export{d as __pageData,y as default}; diff --git a/previews/PR239/assets/source_GeometryOpsLibGEOSExt_buffer.md.BIbTaNIz.lean.js b/previews/PR239/assets/source_GeometryOpsLibGEOSExt_buffer.md.BIbTaNIz.lean.js new file mode 100644 index 000000000..0703c9d6a --- /dev/null +++ b/previews/PR239/assets/source_GeometryOpsLibGEOSExt_buffer.md.BIbTaNIz.lean.js @@ -0,0 +1,31 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const d=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/GeometryOpsLibGEOSExt/buffer.md","filePath":"source/GeometryOpsLibGEOSExt/buffer.md","lastUpdated":null}'),k={name:"source/GeometryOpsLibGEOSExt/buffer.md"};function t(l,s,p,e,E,r){return h(),a("div",null,s[0]||(s[0]=[n(`
    julia
    const _GEOS_CAPSTYLE_LOOKUP = Dict{Symbol, LG.GEOSBufCapStyles}(
    +    :round => LG.GEOSBUF_CAP_ROUND,
    +    :flat => LG.GEOSBUF_CAP_FLAT,
    +    :square => LG.GEOSBUF_CAP_SQUARE,
    +)
    +
    +const _GEOS_JOINSTYLE_LOOKUP = Dict{Symbol, LG.GEOSBufJoinStyles}(
    +    :round => LG.GEOSBUF_JOIN_ROUND,
    +    :mitre => LG.GEOSBUF_JOIN_MITRE,
    +    :bevel => LG.GEOSBUF_JOIN_BEVEL,
    +)
    +
    +to_cap_style(style::Symbol) = _GEOS_CAPSTYLE_LOOKUP[style]
    +to_cap_style(style::LG.GEOSBufCapStyles) = style
    +to_cap_style(num::Integer) = num
    +
    +to_join_style(style::Symbol) = _GEOS_JOINSTYLE_LOOKUP[style]
    +to_join_style(style::LG.GEOSBufJoinStyles) = style
    +to_join_style(num::Integer) = num
    +
    +function GO.buffer(alg::GEOS, geometry, distance; calc_extent = true, kwargs...)

    The reason we use apply here is so that this also works with featurecollections, tables, vectors of geometries, etc!

    julia
        return apply(TraitTarget{GI.AbstractGeometryTrait}(), geometry; kwargs...) do geom
    +        newgeom = LG.bufferWithStyle(
    +            GI.convert(LG, geom), distance;
    +            quadsegs = get(alg, :quadsegs, 8),
    +            endCapStyle = to_cap_style(get(alg, :endCapStyle, :round)),
    +            joinStyle = to_join_style(get(alg, :joinStyle, :round)),
    +            mitreLimit = get(alg, :mitreLimit, 5.0),
    +        )
    +        return _wrap(newgeom; crs = GI.crs(geom), calc_extent)
    +    end
    +end

    This page was generated using Literate.jl.

    `,5)]))}const y=i(k,[["render",t]]);export{d as __pageData,y as default}; diff --git a/previews/PR239/assets/source_GeometryOpsLibGEOSExt_segmentize.md.C7teKqJd.js b/previews/PR239/assets/source_GeometryOpsLibGEOSExt_segmentize.md.C7teKqJd.js new file mode 100644 index 000000000..ecd9353d1 --- /dev/null +++ b/previews/PR239/assets/source_GeometryOpsLibGEOSExt_segmentize.md.C7teKqJd.js @@ -0,0 +1,21 @@ +import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"Segmentize","description":"","frontmatter":{},"headers":[],"relativePath":"source/GeometryOpsLibGEOSExt/segmentize.md","filePath":"source/GeometryOpsLibGEOSExt/segmentize.md","lastUpdated":null}'),e={name:"source/GeometryOpsLibGEOSExt/segmentize.md"};function h(k,s,l,p,r,E){return t(),a("div",null,s[0]||(s[0]=[n(`

    Segmentize

    julia
    import GeometryOps: segmentize, apply

    This file implements the LibGEOS segmentization method for GeometryOps.

    julia
    function _segmentize_geos(geom::LG.AbstractGeometry, max_distance)
    +    context = LG.get_context(geom)
    +    result = LG.GEOSDensify_r(context, geom, max_distance)
    +    if result == C_NULL
    +        error("LibGEOS: Error in GEOSDensify")
    +    end
    +    return LG.geomFromGEOS(result, context)
    +end
    +
    +_segmentize_geos(geom, max_distance) = _segmentize_geos(GI.convert(LG, geom), max_distance)
    +
    +function _wrap_and_segmentize_geos(geom, max_distance)
    +    _wrap(_segmentize_geos(geom, max_distance); crs = GI.crs(geom), calc_extent = false)
    +end

    2 behaviours:

    • enforce: enforce the presence of a kwargs

    • fetch: fetch the value of a kwargs, or return a default value

    julia
    @inline function GO.segmentize(alg::GEOS, geom; threaded::Union{Bool, GO.BoolsAsTypes} = _False())
    +    max_distance = enforce(alg, :max_distance, GO.segmentize)
    +    return GO.apply(
    +        Base.Fix2(_wrap_and_segmentize_geos, max_distance),

    TODO: should this just be a target on GI.AbstractGeometryTrait()? But Geos doesn't support eg RectangleTrait Maybe we need an abstract trait GI.AbstractWKBGeomTrait?

    julia
            GO.TraitTarget(GI.GeometryCollectionTrait(), GI.MultiPolygonTrait(), GI.PolygonTrait(), GI.MultiLineStringTrait(), GI.LineStringTrait(), GI.LinearRingTrait(), GI.MultiPointTrait(), GI.PointTrait()),
    +        geom;
    +        threaded
    +    )
    +end

    This page was generated using Literate.jl.

    `,11)]))}const y=i(e,[["render",h]]);export{g as __pageData,y as default}; diff --git a/previews/PR239/assets/source_GeometryOpsLibGEOSExt_segmentize.md.C7teKqJd.lean.js b/previews/PR239/assets/source_GeometryOpsLibGEOSExt_segmentize.md.C7teKqJd.lean.js new file mode 100644 index 000000000..ecd9353d1 --- /dev/null +++ b/previews/PR239/assets/source_GeometryOpsLibGEOSExt_segmentize.md.C7teKqJd.lean.js @@ -0,0 +1,21 @@ +import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"Segmentize","description":"","frontmatter":{},"headers":[],"relativePath":"source/GeometryOpsLibGEOSExt/segmentize.md","filePath":"source/GeometryOpsLibGEOSExt/segmentize.md","lastUpdated":null}'),e={name:"source/GeometryOpsLibGEOSExt/segmentize.md"};function h(k,s,l,p,r,E){return t(),a("div",null,s[0]||(s[0]=[n(`

    Segmentize

    julia
    import GeometryOps: segmentize, apply

    This file implements the LibGEOS segmentization method for GeometryOps.

    julia
    function _segmentize_geos(geom::LG.AbstractGeometry, max_distance)
    +    context = LG.get_context(geom)
    +    result = LG.GEOSDensify_r(context, geom, max_distance)
    +    if result == C_NULL
    +        error("LibGEOS: Error in GEOSDensify")
    +    end
    +    return LG.geomFromGEOS(result, context)
    +end
    +
    +_segmentize_geos(geom, max_distance) = _segmentize_geos(GI.convert(LG, geom), max_distance)
    +
    +function _wrap_and_segmentize_geos(geom, max_distance)
    +    _wrap(_segmentize_geos(geom, max_distance); crs = GI.crs(geom), calc_extent = false)
    +end

    2 behaviours:

    • enforce: enforce the presence of a kwargs

    • fetch: fetch the value of a kwargs, or return a default value

    julia
    @inline function GO.segmentize(alg::GEOS, geom; threaded::Union{Bool, GO.BoolsAsTypes} = _False())
    +    max_distance = enforce(alg, :max_distance, GO.segmentize)
    +    return GO.apply(
    +        Base.Fix2(_wrap_and_segmentize_geos, max_distance),

    TODO: should this just be a target on GI.AbstractGeometryTrait()? But Geos doesn't support eg RectangleTrait Maybe we need an abstract trait GI.AbstractWKBGeomTrait?

    julia
            GO.TraitTarget(GI.GeometryCollectionTrait(), GI.MultiPolygonTrait(), GI.PolygonTrait(), GI.MultiLineStringTrait(), GI.LineStringTrait(), GI.LinearRingTrait(), GI.MultiPointTrait(), GI.PointTrait()),
    +        geom;
    +        threaded
    +    )
    +end

    This page was generated using Literate.jl.

    `,11)]))}const y=i(e,[["render",h]]);export{g as __pageData,y as default}; diff --git a/previews/PR239/assets/source_GeometryOpsLibGEOSExt_simple_overrides.md.PL-RH0TF.js b/previews/PR239/assets/source_GeometryOpsLibGEOSExt_simple_overrides.md.PL-RH0TF.js new file mode 100644 index 000000000..821c4e635 --- /dev/null +++ b/previews/PR239/assets/source_GeometryOpsLibGEOSExt_simple_overrides.md.PL-RH0TF.js @@ -0,0 +1,46 @@ +import{_ as i,c as a,a5 as h,o as n}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"Simple overrides","description":"","frontmatter":{},"headers":[],"relativePath":"source/GeometryOpsLibGEOSExt/simple_overrides.md","filePath":"source/GeometryOpsLibGEOSExt/simple_overrides.md","lastUpdated":null}'),t={name:"source/GeometryOpsLibGEOSExt/simple_overrides.md"};function k(l,s,e,p,r,d){return n(),a("div",null,s[0]||(s[0]=[h(`

    Simple overrides

    This file contains simple overrides for GEOS, essentially only those functions which have direct counterparts in LG and only require conversion before calling.

    Polygon set operations

    Difference

    julia
    function GO.difference(::GEOS, geom_a, geom_b; target=nothing, calc_extent = false)
    +    return _wrap(LG.difference(GI.convert(LG, geom_a), GI.convert(LG, geom_b)); crs = GI.crs(geom_a), calc_extent)
    +end

    Union

    julia
    function GO.union(::GEOS, geom_a, geom_b; target=nothing, calc_extent = false)
    +    return _wrap(LG.union(GI.convert(LG, geom_a), GI.convert(LG, geom_b)); crs = GI.crs(geom_a), calc_extent)
    +end

    Intersection

    julia
    function GO.intersection(::GEOS, geom_a, geom_b; target=nothing, calc_extent = false)
    +    return _wrap(LG.intersection(GI.convert(LG, geom_a), GI.convert(LG, geom_b)); crs = GI.crs(geom_a), calc_extent)
    +end

    Symmetric difference

    julia
    function GO.symdifference(::GEOS, geom_a, geom_b; target=nothing, calc_extent = false)
    +    return _wrap(LG.symmetric_difference(GI.convert(LG, geom_a), GI.convert(LG, geom_b)); crs = GI.crs(geom_a), calc_extent)
    +end

    DE-9IM boolean methods

    Equals

    julia
    function GO.equals(::GEOS, geom_a, geom_b)
    +    return LG.equals(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Disjoint

    julia
    function GO.disjoint(::GEOS, geom_a, geom_b)
    +    return LG.disjoint(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Touches

    julia
    function GO.touches(::GEOS, geom_a, geom_b)
    +    return LG.touches(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Crosses

    julia
    function GO.crosses(::GEOS, geom_a, geom_b)
    +    return LG.crosses(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Within

    julia
    function GO.within(::GEOS, geom_a, geom_b)
    +    return LG.within(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Contains

    julia
    function GO.contains(::GEOS, geom_a, geom_b)
    +    return LG.contains(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Overlaps

    julia
    function GO.overlaps(::GEOS, geom_a, geom_b)
    +    return LG.overlaps(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Covers

    julia
    function GO.covers(::GEOS, geom_a, geom_b)
    +    return LG.covers(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    CoveredBy

    julia
    function GO.coveredby(::GEOS, geom_a, geom_b)
    +    return LG.coveredby(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Intersects

    julia
    function GO.intersects(::GEOS, geom_a, geom_b)
    +    return LG.intersects(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Convex hull

    julia
    function GO.convex_hull(::GEOS, geoms)
    +    chull = LG.convexhull(
    +        LG.MultiPoint(
    +            collect(
    +                GO.flatten(
    +                    x -> GI.convert(LG.Point, x),
    +                    GI.PointTrait,
    +                    geoms
    +                )
    +            )
    +        )
    +    );
    +    return _wrap(
    +        chull;
    +        crs = GI.crs(geoms),
    +        calc_extent = false
    +    )
    +end

    This page was generated using Literate.jl.

    `,36)]))}const o=i(t,[["render",k]]);export{g as __pageData,o as default}; diff --git a/previews/PR239/assets/source_GeometryOpsLibGEOSExt_simple_overrides.md.PL-RH0TF.lean.js b/previews/PR239/assets/source_GeometryOpsLibGEOSExt_simple_overrides.md.PL-RH0TF.lean.js new file mode 100644 index 000000000..821c4e635 --- /dev/null +++ b/previews/PR239/assets/source_GeometryOpsLibGEOSExt_simple_overrides.md.PL-RH0TF.lean.js @@ -0,0 +1,46 @@ +import{_ as i,c as a,a5 as h,o as n}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"Simple overrides","description":"","frontmatter":{},"headers":[],"relativePath":"source/GeometryOpsLibGEOSExt/simple_overrides.md","filePath":"source/GeometryOpsLibGEOSExt/simple_overrides.md","lastUpdated":null}'),t={name:"source/GeometryOpsLibGEOSExt/simple_overrides.md"};function k(l,s,e,p,r,d){return n(),a("div",null,s[0]||(s[0]=[h(`

    Simple overrides

    This file contains simple overrides for GEOS, essentially only those functions which have direct counterparts in LG and only require conversion before calling.

    Polygon set operations

    Difference

    julia
    function GO.difference(::GEOS, geom_a, geom_b; target=nothing, calc_extent = false)
    +    return _wrap(LG.difference(GI.convert(LG, geom_a), GI.convert(LG, geom_b)); crs = GI.crs(geom_a), calc_extent)
    +end

    Union

    julia
    function GO.union(::GEOS, geom_a, geom_b; target=nothing, calc_extent = false)
    +    return _wrap(LG.union(GI.convert(LG, geom_a), GI.convert(LG, geom_b)); crs = GI.crs(geom_a), calc_extent)
    +end

    Intersection

    julia
    function GO.intersection(::GEOS, geom_a, geom_b; target=nothing, calc_extent = false)
    +    return _wrap(LG.intersection(GI.convert(LG, geom_a), GI.convert(LG, geom_b)); crs = GI.crs(geom_a), calc_extent)
    +end

    Symmetric difference

    julia
    function GO.symdifference(::GEOS, geom_a, geom_b; target=nothing, calc_extent = false)
    +    return _wrap(LG.symmetric_difference(GI.convert(LG, geom_a), GI.convert(LG, geom_b)); crs = GI.crs(geom_a), calc_extent)
    +end

    DE-9IM boolean methods

    Equals

    julia
    function GO.equals(::GEOS, geom_a, geom_b)
    +    return LG.equals(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Disjoint

    julia
    function GO.disjoint(::GEOS, geom_a, geom_b)
    +    return LG.disjoint(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Touches

    julia
    function GO.touches(::GEOS, geom_a, geom_b)
    +    return LG.touches(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Crosses

    julia
    function GO.crosses(::GEOS, geom_a, geom_b)
    +    return LG.crosses(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Within

    julia
    function GO.within(::GEOS, geom_a, geom_b)
    +    return LG.within(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Contains

    julia
    function GO.contains(::GEOS, geom_a, geom_b)
    +    return LG.contains(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Overlaps

    julia
    function GO.overlaps(::GEOS, geom_a, geom_b)
    +    return LG.overlaps(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Covers

    julia
    function GO.covers(::GEOS, geom_a, geom_b)
    +    return LG.covers(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    CoveredBy

    julia
    function GO.coveredby(::GEOS, geom_a, geom_b)
    +    return LG.coveredby(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Intersects

    julia
    function GO.intersects(::GEOS, geom_a, geom_b)
    +    return LG.intersects(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Convex hull

    julia
    function GO.convex_hull(::GEOS, geoms)
    +    chull = LG.convexhull(
    +        LG.MultiPoint(
    +            collect(
    +                GO.flatten(
    +                    x -> GI.convert(LG.Point, x),
    +                    GI.PointTrait,
    +                    geoms
    +                )
    +            )
    +        )
    +    );
    +    return _wrap(
    +        chull;
    +        crs = GI.crs(geoms),
    +        calc_extent = false
    +    )
    +end

    This page was generated using Literate.jl.

    `,36)]))}const o=i(t,[["render",k]]);export{g as __pageData,o as default}; diff --git a/previews/PR239/assets/source_GeometryOpsLibGEOSExt_simplify.md.DqcZcvcS.js b/previews/PR239/assets/source_GeometryOpsLibGEOSExt_simplify.md.DqcZcvcS.js new file mode 100644 index 000000000..fb6d1f2ff --- /dev/null +++ b/previews/PR239/assets/source_GeometryOpsLibGEOSExt_simplify.md.DqcZcvcS.js @@ -0,0 +1,29 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/GeometryOpsLibGEOSExt/simplify.md","filePath":"source/GeometryOpsLibGEOSExt/simplify.md","lastUpdated":null}'),k={name:"source/GeometryOpsLibGEOSExt/simplify.md"};function l(t,s,p,e,E,r){return h(),a("div",null,s[0]||(s[0]=[n(`

    Address potential ambiguities

    julia
    GO._simplify(::GI.PointTrait, ::GO.GEOS, geom; kw...) = geom
    +GO._simplify(::GI.MultiPointTrait, ::GO.GEOS, geom; kw...) = geom
    +
    +function GO._simplify(::GI.AbstractGeometryTrait, alg::GO.GEOS, geom; kwargs...)
    +    method = get(alg, :method, :TopologyPreserve)
    +    @assert haskey(alg.params, :tol) """
    +        The \`:tol\` parameter is required for the GEOS algorithm in \`simplify\`,
    +        but it was not provided.
    +
    +        Provide it by passing \`GEOS(; tol = ...,) as the algorithm.
    +        """
    +    tol = alg.params.tol
    +    if method == :TopologyPreserve
    +        return LG.topologyPreserveSimplify(GI.convert(LG, geom), tol)
    +    elseif method == :DouglasPeucker
    +        return LG.simplify(GI.convert(LG, geom), tol)
    +    else
    +        error("Invalid method passed to \`GO.simplify(GEOS(...), ...)\`: $method. Please use :TopologyPreserve or :DouglasPeucker")
    +    end
    +end
    +
    +function GO._simplify(trait::GI.AbstractCurveTrait, alg::GO.GEOS, geom; kw...)
    +    Base.invoke(
    +        GO._simplify,
    +        Tuple{GI.AbstractGeometryTrait, GO.GEOS, typeof(geom)},
    +        trait, alg, geom;
    +        kw...
    +    )
    +end

    This page was generated using Literate.jl.

    `,4)]))}const y=i(k,[["render",l]]);export{g as __pageData,y as default}; diff --git a/previews/PR239/assets/source_GeometryOpsLibGEOSExt_simplify.md.DqcZcvcS.lean.js b/previews/PR239/assets/source_GeometryOpsLibGEOSExt_simplify.md.DqcZcvcS.lean.js new file mode 100644 index 000000000..fb6d1f2ff --- /dev/null +++ b/previews/PR239/assets/source_GeometryOpsLibGEOSExt_simplify.md.DqcZcvcS.lean.js @@ -0,0 +1,29 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/GeometryOpsLibGEOSExt/simplify.md","filePath":"source/GeometryOpsLibGEOSExt/simplify.md","lastUpdated":null}'),k={name:"source/GeometryOpsLibGEOSExt/simplify.md"};function l(t,s,p,e,E,r){return h(),a("div",null,s[0]||(s[0]=[n(`

    Address potential ambiguities

    julia
    GO._simplify(::GI.PointTrait, ::GO.GEOS, geom; kw...) = geom
    +GO._simplify(::GI.MultiPointTrait, ::GO.GEOS, geom; kw...) = geom
    +
    +function GO._simplify(::GI.AbstractGeometryTrait, alg::GO.GEOS, geom; kwargs...)
    +    method = get(alg, :method, :TopologyPreserve)
    +    @assert haskey(alg.params, :tol) """
    +        The \`:tol\` parameter is required for the GEOS algorithm in \`simplify\`,
    +        but it was not provided.
    +
    +        Provide it by passing \`GEOS(; tol = ...,) as the algorithm.
    +        """
    +    tol = alg.params.tol
    +    if method == :TopologyPreserve
    +        return LG.topologyPreserveSimplify(GI.convert(LG, geom), tol)
    +    elseif method == :DouglasPeucker
    +        return LG.simplify(GI.convert(LG, geom), tol)
    +    else
    +        error("Invalid method passed to \`GO.simplify(GEOS(...), ...)\`: $method. Please use :TopologyPreserve or :DouglasPeucker")
    +    end
    +end
    +
    +function GO._simplify(trait::GI.AbstractCurveTrait, alg::GO.GEOS, geom; kw...)
    +    Base.invoke(
    +        GO._simplify,
    +        Tuple{GI.AbstractGeometryTrait, GO.GEOS, typeof(geom)},
    +        trait, alg, geom;
    +        kw...
    +    )
    +end

    This page was generated using Literate.jl.

    `,4)]))}const y=i(k,[["render",l]]);export{g as __pageData,y as default}; diff --git a/previews/PR239/assets/source_GeometryOpsProjExt_GeometryOpsProjExt.md.CF-5wcua.js b/previews/PR239/assets/source_GeometryOpsProjExt_GeometryOpsProjExt.md.CF-5wcua.js new file mode 100644 index 000000000..7e3861f42 --- /dev/null +++ b/previews/PR239/assets/source_GeometryOpsProjExt_GeometryOpsProjExt.md.CF-5wcua.js @@ -0,0 +1,8 @@ +import{_ as e,c as a,a5 as i,o as t}from"./chunks/framework.onQNwZ2I.js";const c=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/GeometryOpsProjExt/GeometryOpsProjExt.md","filePath":"source/GeometryOpsProjExt/GeometryOpsProjExt.md","lastUpdated":null}'),n={name:"source/GeometryOpsProjExt/GeometryOpsProjExt.md"};function p(l,s,r,o,h,k){return t(),a("div",null,s[0]||(s[0]=[i(`
    julia
    module GeometryOpsProjExt
    +
    +using GeometryOps, Proj
    +
    +include("reproject.jl")
    +include("segmentize.jl")
    +
    +end

    This page was generated using Literate.jl.

    `,3)]))}const E=e(n,[["render",p]]);export{c as __pageData,E as default}; diff --git a/previews/PR239/assets/source_GeometryOpsProjExt_GeometryOpsProjExt.md.CF-5wcua.lean.js b/previews/PR239/assets/source_GeometryOpsProjExt_GeometryOpsProjExt.md.CF-5wcua.lean.js new file mode 100644 index 000000000..7e3861f42 --- /dev/null +++ b/previews/PR239/assets/source_GeometryOpsProjExt_GeometryOpsProjExt.md.CF-5wcua.lean.js @@ -0,0 +1,8 @@ +import{_ as e,c as a,a5 as i,o as t}from"./chunks/framework.onQNwZ2I.js";const c=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/GeometryOpsProjExt/GeometryOpsProjExt.md","filePath":"source/GeometryOpsProjExt/GeometryOpsProjExt.md","lastUpdated":null}'),n={name:"source/GeometryOpsProjExt/GeometryOpsProjExt.md"};function p(l,s,r,o,h,k){return t(),a("div",null,s[0]||(s[0]=[i(`
    julia
    module GeometryOpsProjExt
    +
    +using GeometryOps, Proj
    +
    +include("reproject.jl")
    +include("segmentize.jl")
    +
    +end

    This page was generated using Literate.jl.

    `,3)]))}const E=e(n,[["render",p]]);export{c as __pageData,E as default}; diff --git a/previews/PR239/assets/source_GeometryOpsProjExt_reproject.md.Cm7Q7Ebj.js b/previews/PR239/assets/source_GeometryOpsProjExt_reproject.md.Cm7Q7Ebj.js new file mode 100644 index 000000000..ffaa90130 --- /dev/null +++ b/previews/PR239/assets/source_GeometryOpsProjExt_reproject.md.Cm7Q7Ebj.js @@ -0,0 +1,44 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const d=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/GeometryOpsProjExt/reproject.md","filePath":"source/GeometryOpsProjExt/reproject.md","lastUpdated":null}'),k={name:"source/GeometryOpsProjExt/reproject.md"};function t(p,s,l,e,r,E){return h(),a("div",null,s[0]||(s[0]=[n(`
    julia
    import GeometryOps: GI, GeoInterface, reproject, apply, transform, _is3d, _True, _False
    +import Proj
    +
    +function reproject(geom;
    +    source_crs=nothing, target_crs=nothing, transform=nothing, kw...
    +)
    +    if isnothing(transform)
    +        if isnothing(source_crs)
    +            source_crs = if GI.trait(geom) isa Nothing && geom isa AbstractArray
    +                GeoInterface.crs(first(geom))
    +            else
    +                GeoInterface.crs(geom)
    +            end
    +        end

    If its still nothing, error

    julia
            isnothing(source_crs) && throw(ArgumentError("geom has no crs attached. Pass a \`source_crs\` keyword"))

    Otherwise reproject

    julia
            reproject(geom, source_crs, target_crs; kw...)
    +    else
    +        reproject(geom, transform; kw...)
    +    end
    +end
    +function reproject(geom, source_crs, target_crs;
    +    time=Inf,
    +    always_xy=true,
    +    transform=nothing,
    +    kw...
    +)
    +    transform = if isnothing(transform)
    +        s = source_crs isa Proj.CRS ? source_crs : convert(String, source_crs)
    +        t = target_crs isa Proj.CRS ? target_crs : convert(String, target_crs)
    +        Proj.Transformation(s, t; always_xy)
    +    else
    +        transform
    +    end
    +    reproject(geom, transform; time, target_crs, kw...)
    +end
    +function reproject(geom, transform::Proj.Transformation; time=Inf, target_crs=nothing, kw...)
    +    if _is3d(geom)
    +        return apply(GI.PointTrait(), geom; crs=target_crs, kw...) do p
    +            transform(GI.x(p), GI.y(p), GI.z(p))
    +        end
    +    else
    +        return apply(GI.PointTrait(), geom; crs=target_crs, kw...) do p
    +            transform(GI.x(p), GI.y(p))
    +        end
    +    end
    +end

    This page was generated using Literate.jl.

    `,7)]))}const y=i(k,[["render",t]]);export{d as __pageData,y as default}; diff --git a/previews/PR239/assets/source_GeometryOpsProjExt_reproject.md.Cm7Q7Ebj.lean.js b/previews/PR239/assets/source_GeometryOpsProjExt_reproject.md.Cm7Q7Ebj.lean.js new file mode 100644 index 000000000..ffaa90130 --- /dev/null +++ b/previews/PR239/assets/source_GeometryOpsProjExt_reproject.md.Cm7Q7Ebj.lean.js @@ -0,0 +1,44 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const d=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/GeometryOpsProjExt/reproject.md","filePath":"source/GeometryOpsProjExt/reproject.md","lastUpdated":null}'),k={name:"source/GeometryOpsProjExt/reproject.md"};function t(p,s,l,e,r,E){return h(),a("div",null,s[0]||(s[0]=[n(`
    julia
    import GeometryOps: GI, GeoInterface, reproject, apply, transform, _is3d, _True, _False
    +import Proj
    +
    +function reproject(geom;
    +    source_crs=nothing, target_crs=nothing, transform=nothing, kw...
    +)
    +    if isnothing(transform)
    +        if isnothing(source_crs)
    +            source_crs = if GI.trait(geom) isa Nothing && geom isa AbstractArray
    +                GeoInterface.crs(first(geom))
    +            else
    +                GeoInterface.crs(geom)
    +            end
    +        end

    If its still nothing, error

    julia
            isnothing(source_crs) && throw(ArgumentError("geom has no crs attached. Pass a \`source_crs\` keyword"))

    Otherwise reproject

    julia
            reproject(geom, source_crs, target_crs; kw...)
    +    else
    +        reproject(geom, transform; kw...)
    +    end
    +end
    +function reproject(geom, source_crs, target_crs;
    +    time=Inf,
    +    always_xy=true,
    +    transform=nothing,
    +    kw...
    +)
    +    transform = if isnothing(transform)
    +        s = source_crs isa Proj.CRS ? source_crs : convert(String, source_crs)
    +        t = target_crs isa Proj.CRS ? target_crs : convert(String, target_crs)
    +        Proj.Transformation(s, t; always_xy)
    +    else
    +        transform
    +    end
    +    reproject(geom, transform; time, target_crs, kw...)
    +end
    +function reproject(geom, transform::Proj.Transformation; time=Inf, target_crs=nothing, kw...)
    +    if _is3d(geom)
    +        return apply(GI.PointTrait(), geom; crs=target_crs, kw...) do p
    +            transform(GI.x(p), GI.y(p), GI.z(p))
    +        end
    +    else
    +        return apply(GI.PointTrait(), geom; crs=target_crs, kw...) do p
    +            transform(GI.x(p), GI.y(p))
    +        end
    +    end
    +end

    This page was generated using Literate.jl.

    `,7)]))}const y=i(k,[["render",t]]);export{d as __pageData,y as default}; diff --git a/previews/PR239/assets/source_GeometryOpsProjExt_segmentize.md.DOG0-rtA.js b/previews/PR239/assets/source_GeometryOpsProjExt_segmentize.md.DOG0-rtA.js new file mode 100644 index 000000000..92742bf54 --- /dev/null +++ b/previews/PR239/assets/source_GeometryOpsProjExt_segmentize.md.DOG0-rtA.js @@ -0,0 +1,31 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/GeometryOpsProjExt/segmentize.md","filePath":"source/GeometryOpsProjExt/segmentize.md","lastUpdated":null}'),t={name:"source/GeometryOpsProjExt/segmentize.md"};function k(e,s,l,p,d,r){return h(),a("div",null,s[0]||(s[0]=[n(`

    This holds the segmentize geodesic functionality.

    julia
    import GeometryOps: GeodesicSegments, _segmentize, _fill_linear_kernel!
    +import Proj
    +
    +function GeometryOps.GeodesicSegments(; max_distance, equatorial_radius::Real=6378137, flattening::Real=1/298.257223563, geodesic::Proj.geod_geodesic = Proj.geod_geodesic(equatorial_radius, flattening))
    +    return GeometryOps.GeodesicSegments{Proj.geod_geodesic}(geodesic, max_distance)
    +end

    This is the same method as in transformations/segmentize.jl, but it constructs a Proj geodesic line every time. Maybe this should be better...

    julia
    function _segmentize(method::Geodesic, geom, ::Union{GI.LineStringTrait, GI.LinearRingTrait}; max_distance)
    +    proj_geodesic = Proj.geod_geodesic(method.semimajor_axis #= same thing as equatorial radius =#, 1/method.inv_flattening)
    +    first_coord = GI.getpoint(geom, 1)
    +    x1, y1 = GI.x(first_coord), GI.y(first_coord)
    +    new_coords = NTuple{2, Float64}[]
    +    sizehint!(new_coords, GI.npoint(geom))
    +    push!(new_coords, (x1, y1))
    +    for coord in Iterators.drop(GI.getpoint(geom), 1)
    +        x2, y2 = GI.x(coord), GI.y(coord)
    +        _fill_linear_kernel!(method, new_coords, x1, y1, x2, y2; max_distance, proj_geodesic)
    +        x1, y1 = x2, y2
    +    end
    +    return rebuild(geom, new_coords)
    +end
    +
    +function GeometryOps._fill_linear_kernel!(method::Geodesic, new_coords::Vector, x1, y1, x2, y2; max_distance, proj_geodesic)
    +    geod_line = Proj.geod_inverseline(proj_geodesic, y1, x1, y2, x2)

    This is the distance in meters computed between the two points. It's s13 because geod_inverseline sets point 3 to the second input point.

    julia
        distance = geod_line.s13
    +    if distance > max_distance
    +        n_segments = ceil(Int, distance / max_distance)
    +        for i in 1:(n_segments - 1)
    +            y, x, _ = Proj.geod_position(geod_line, i / n_segments * distance)
    +            push!(new_coords, (x, y))
    +        end
    +    end

    End the line with the original coordinate, to avoid any multiplication errors.

    julia
        push!(new_coords, (x2, y2))
    +    return nothing
    +end

    This page was generated using Literate.jl.

    `,10)]))}const y=i(t,[["render",k]]);export{g as __pageData,y as default}; diff --git a/previews/PR239/assets/source_GeometryOpsProjExt_segmentize.md.DOG0-rtA.lean.js b/previews/PR239/assets/source_GeometryOpsProjExt_segmentize.md.DOG0-rtA.lean.js new file mode 100644 index 000000000..92742bf54 --- /dev/null +++ b/previews/PR239/assets/source_GeometryOpsProjExt_segmentize.md.DOG0-rtA.lean.js @@ -0,0 +1,31 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/GeometryOpsProjExt/segmentize.md","filePath":"source/GeometryOpsProjExt/segmentize.md","lastUpdated":null}'),t={name:"source/GeometryOpsProjExt/segmentize.md"};function k(e,s,l,p,d,r){return h(),a("div",null,s[0]||(s[0]=[n(`

    This holds the segmentize geodesic functionality.

    julia
    import GeometryOps: GeodesicSegments, _segmentize, _fill_linear_kernel!
    +import Proj
    +
    +function GeometryOps.GeodesicSegments(; max_distance, equatorial_radius::Real=6378137, flattening::Real=1/298.257223563, geodesic::Proj.geod_geodesic = Proj.geod_geodesic(equatorial_radius, flattening))
    +    return GeometryOps.GeodesicSegments{Proj.geod_geodesic}(geodesic, max_distance)
    +end

    This is the same method as in transformations/segmentize.jl, but it constructs a Proj geodesic line every time. Maybe this should be better...

    julia
    function _segmentize(method::Geodesic, geom, ::Union{GI.LineStringTrait, GI.LinearRingTrait}; max_distance)
    +    proj_geodesic = Proj.geod_geodesic(method.semimajor_axis #= same thing as equatorial radius =#, 1/method.inv_flattening)
    +    first_coord = GI.getpoint(geom, 1)
    +    x1, y1 = GI.x(first_coord), GI.y(first_coord)
    +    new_coords = NTuple{2, Float64}[]
    +    sizehint!(new_coords, GI.npoint(geom))
    +    push!(new_coords, (x1, y1))
    +    for coord in Iterators.drop(GI.getpoint(geom), 1)
    +        x2, y2 = GI.x(coord), GI.y(coord)
    +        _fill_linear_kernel!(method, new_coords, x1, y1, x2, y2; max_distance, proj_geodesic)
    +        x1, y1 = x2, y2
    +    end
    +    return rebuild(geom, new_coords)
    +end
    +
    +function GeometryOps._fill_linear_kernel!(method::Geodesic, new_coords::Vector, x1, y1, x2, y2; max_distance, proj_geodesic)
    +    geod_line = Proj.geod_inverseline(proj_geodesic, y1, x1, y2, x2)

    This is the distance in meters computed between the two points. It's s13 because geod_inverseline sets point 3 to the second input point.

    julia
        distance = geod_line.s13
    +    if distance > max_distance
    +        n_segments = ceil(Int, distance / max_distance)
    +        for i in 1:(n_segments - 1)
    +            y, x, _ = Proj.geod_position(geod_line, i / n_segments * distance)
    +            push!(new_coords, (x, y))
    +        end
    +    end

    End the line with the original coordinate, to avoid any multiplication errors.

    julia
        push!(new_coords, (x2, y2))
    +    return nothing
    +end

    This page was generated using Literate.jl.

    `,10)]))}const y=i(t,[["render",k]]);export{g as __pageData,y as default}; diff --git a/previews/PR239/assets/source_methods_angles.md.B9lhXIGg.js b/previews/PR239/assets/source_methods_angles.md.B9lhXIGg.js new file mode 100644 index 000000000..5c17fafc8 --- /dev/null +++ b/previews/PR239/assets/source_methods_angles.md.B9lhXIGg.js @@ -0,0 +1,124 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const l="/GeometryOps.jl/previews/PR239/assets/pkevosp.Dig-DWOQ.png",y=JSON.parse('{"title":"Angles","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/angles.md","filePath":"source/methods/angles.md","lastUpdated":null}'),k={name:"source/methods/angles.md"};function t(p,s,e,r,E,g){return h(),a("div",null,s[0]||(s[0]=[n(`

    Angles

    julia
    export angles

    What is angles?

    Angles are the angles formed by a given geometries line segments, if it has line segments.

    To provide an example, consider this rectangle:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie, CairoMakie
    +
    +rect = GI.Polygon([[(0.0, 0.0), (0.0, 1.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0)]])
    +f, a, p = poly(collect(GI.getpoint(rect)); axis = (; aspect = DataAspect()))

    This is clearly a rectangle, with angles of 90 degrees.

    julia
    GO.angles(rect)  # [90, 90, 90, 90]
    4-element Vector{Float64}:
    + 90.0
    + 90.0
    + 90.0
    + 90.0

    Implementation

    This is the GeoInterface-compatible implementation. First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait. This is also used in the implementation, since it's a lot less work!

    julia
    const _ANGLE_TARGETS = TraitTarget{Union{GI.PolygonTrait,GI.AbstractCurveTrait,GI.MultiPointTrait,GI.PointTrait}}()
    +
    +"""
    +    angles(geom, ::Type{T} = Float64)
    +
    +Returns the angles of a geometry or collection of geometries.
    +This is computed differently for different geometries:
    +
    +    - The angles of a point is an empty vector.
    +    - The angles of a single line segment is an empty vector.
    +    - The angles of a linestring or linearring is a vector of angles formed by the curve.
    +    - The angles of a polygon is a vector of vectors of angles formed by each ring.
    +    - The angles of a multi-geometry collection is a vector of the angles of each of the
    +        sub-geometries as defined above.
    +
    +Result will be a Vector, or nested set of vectors, of type T where an optional argument with
    +a default value of Float64.
    +"""
    +function angles(geom, ::Type{T} = Float64; threaded =false) where T <: AbstractFloat
    +    applyreduce(vcat, _ANGLE_TARGETS, geom; threaded, init = Vector{T}()) do g
    +        _angles(T, GI.trait(g), g)
    +    end
    +end

    Points and single line segments have no angles

    julia
    _angles(::Type{T}, ::Union{GI.PointTrait, GI.MultiPointTrait, GI.LineTrait}, geom) where T = T[]
    +
    +#= The angles of a linestring are the angles formed by the line. If the first and last point
    +are not explicitly repeated, the geom is not considered closed. The angles should all be on
    +one side of the line, but a particular side is not guaranteed by this function. =#
    +function _angles(::Type{T}, ::GI.LineStringTrait, geom) where T
    +    npoints = GI.npoint(geom)
    +    first_last_equal = equals(GI.getpoint(geom, 1), GI.getpoint(geom, npoints))
    +    angle_list = Vector{T}(undef, npoints - (first_last_equal ? 1 : 2))
    +    _find_angles!(
    +        T, angle_list, geom;
    +        offset = first_last_equal, close_geom = false,
    +    )
    +    return angle_list
    +end
    +
    +#= The angles of a linearring are the angles within the closed line and include the angles
    +formed by connecting the first and last points of the curve. =#
    +function _angles(::Type{T}, ::GI.LinearRingTrait, geom; interior = true) where T
    +    npoints = GI.npoint(geom)
    +    first_last_equal = equals(GI.getpoint(geom, 1), GI.getpoint(geom, npoints))
    +    angle_list = Vector{T}(undef, npoints - (first_last_equal ? 1 : 0))
    +    _find_angles!(
    +        T, angle_list, geom;
    +        offset = true, close_geom = !first_last_equal, interior = interior,
    +    )
    +    return angle_list
    +end
    +
    +#= The angles of a polygon is a vector of polygon angles. Note that if there are holes
    +within the polygon, the angles will be listed after the exterior ring angles in order of the
    +holes. All angles, including the hole angles, are interior angles of the polygon.=#
    +function _angles(::Type{T}, ::GI.PolygonTrait, geom) where T
    +    angles = _angles(T, GI.LinearRingTrait(), GI.getexterior(geom); interior = true)
    +    for h in GI.gethole(geom)
    +        append!(angles, _angles(T, GI.LinearRingTrait(), h; interior = false))
    +    end
    +    return angles
    +end

    Find angles of a curve and insert the values into the angle_list. If offset is true, then save space for the angle at the first vertex, as the curve is closed, at the front of angle_list. If close_geom is true, then despite the first and last point not being explicitly repeated, the curve is closed and the angle of the last point should be added to angle_list. If interior is true, then all angles will be on the same side of the line

    julia
    function _find_angles!(
    +    ::Type{T}, angle_list, geom;
    +    offset, close_geom, interior = true,
    +) where T
    +    local p1, prev_p1_diff, p2_p1_diff
    +    local start_point, start_diff
    +    local extreem_idx, extreem_x, extreem_y
    +    i_offset = offset ? 1 : 0

    Loop through the curve and find each of the angels

    julia
        for (i, p2) in enumerate(GI.getpoint(geom))
    +        xp2, yp2 = GI.x(p2), GI.y(p2)
    +        #= Find point with smallest x values (and smallest y in case of a tie) as this point
    +        is know to be convex. =#
    +        if i == 1 || (xp2 < extreem_x || (xp2 == extreem_x && yp2 < extreem_y))
    +            extreem_idx = i
    +            extreem_x, extreem_y = xp2, yp2
    +        end
    +        if i > 1
    +            p2_p1_diff = (xp2 - GI.x(p1), yp2 - GI.y(p1))
    +            if i == 2
    +                start_point = p1
    +                start_diff = p2_p1_diff
    +            else
    +                angle_list[i - 2 + i_offset] = _diffs_calc_angle(T, prev_p1_diff, p2_p1_diff)
    +            end
    +            prev_p1_diff = -1 .* p2_p1_diff
    +        end
    +        p1 = p2
    +    end

    If the last point of geometry should be the same as the first, calculate closing angle

    julia
        if close_geom
    +        p2_p1_diff = (GI.x(start_point) - GI.x(p1), GI.y(start_point) - GI.y(p1))
    +        angle_list[end] = _diffs_calc_angle(T, prev_p1_diff, p2_p1_diff)
    +        prev_p1_diff = -1 .* p2_p1_diff
    +    end

    If needed, calculate first angle corresponding to the first point

    julia
        if offset
    +        angle_list[1] = _diffs_calc_angle(T, prev_p1_diff, start_diff)
    +    end
    +    #= Make sure that all of the angles are on the same side of the line and inside of the
    +    closed ring if the input geometry is closed. =#
    +    inside_sgn = sign(angle_list[extreem_idx]) * (interior ? 1 : -1)
    +    for i in eachindex(angle_list)
    +        idx_sgn = sign(angle_list[i])
    +        if idx_sgn == -1
    +            angle_list[i] = abs(angle_list[i])
    +        end
    +        if idx_sgn != inside_sgn
    +            angle_list[i] = 360 - angle_list[i]
    +        end
    +    end
    +    return
    +end

    Calculate the angle between two vectors defined by the previous and current Δx and Δys. Angle will have a sign corresponding to the sign of the cross product between the two vectors. All angles of one sign in a given geometry are convex, while those of the other sign are concave. However, the sign corresponding to each of these can vary based on geometry and thus you must compare to an angle that is know to be convex or concave.

    julia
    function _diffs_calc_angle(::Type{T}, (Δx_prev, Δy_prev), (Δx_curr, Δy_curr)) where T
    +    cross_prod = Δx_prev * Δy_curr - Δy_prev * Δx_curr
    +    dot_prod = Δx_prev * Δx_curr + Δy_prev * Δy_curr
    +    prev_mag = max(sqrt(Δx_prev^2 + Δy_prev^2), eps(T))
    +    curr_mag = max(sqrt(Δx_curr^2 + Δy_curr^2), eps(T))
    +    val = clamp(dot_prod / (prev_mag * curr_mag), -one(T), one(T))
    +    angle = real(acos(val) * 180 / π)
    +    return angle * (cross_prod < 0 ? -1 : 1)
    +end

    This page was generated using Literate.jl.

    `,27)]))}const F=i(k,[["render",t]]);export{y as __pageData,F as default}; diff --git a/previews/PR239/assets/source_methods_angles.md.B9lhXIGg.lean.js b/previews/PR239/assets/source_methods_angles.md.B9lhXIGg.lean.js new file mode 100644 index 000000000..5c17fafc8 --- /dev/null +++ b/previews/PR239/assets/source_methods_angles.md.B9lhXIGg.lean.js @@ -0,0 +1,124 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const l="/GeometryOps.jl/previews/PR239/assets/pkevosp.Dig-DWOQ.png",y=JSON.parse('{"title":"Angles","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/angles.md","filePath":"source/methods/angles.md","lastUpdated":null}'),k={name:"source/methods/angles.md"};function t(p,s,e,r,E,g){return h(),a("div",null,s[0]||(s[0]=[n(`

    Angles

    julia
    export angles

    What is angles?

    Angles are the angles formed by a given geometries line segments, if it has line segments.

    To provide an example, consider this rectangle:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie, CairoMakie
    +
    +rect = GI.Polygon([[(0.0, 0.0), (0.0, 1.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0)]])
    +f, a, p = poly(collect(GI.getpoint(rect)); axis = (; aspect = DataAspect()))

    This is clearly a rectangle, with angles of 90 degrees.

    julia
    GO.angles(rect)  # [90, 90, 90, 90]
    4-element Vector{Float64}:
    + 90.0
    + 90.0
    + 90.0
    + 90.0

    Implementation

    This is the GeoInterface-compatible implementation. First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait. This is also used in the implementation, since it's a lot less work!

    julia
    const _ANGLE_TARGETS = TraitTarget{Union{GI.PolygonTrait,GI.AbstractCurveTrait,GI.MultiPointTrait,GI.PointTrait}}()
    +
    +"""
    +    angles(geom, ::Type{T} = Float64)
    +
    +Returns the angles of a geometry or collection of geometries.
    +This is computed differently for different geometries:
    +
    +    - The angles of a point is an empty vector.
    +    - The angles of a single line segment is an empty vector.
    +    - The angles of a linestring or linearring is a vector of angles formed by the curve.
    +    - The angles of a polygon is a vector of vectors of angles formed by each ring.
    +    - The angles of a multi-geometry collection is a vector of the angles of each of the
    +        sub-geometries as defined above.
    +
    +Result will be a Vector, or nested set of vectors, of type T where an optional argument with
    +a default value of Float64.
    +"""
    +function angles(geom, ::Type{T} = Float64; threaded =false) where T <: AbstractFloat
    +    applyreduce(vcat, _ANGLE_TARGETS, geom; threaded, init = Vector{T}()) do g
    +        _angles(T, GI.trait(g), g)
    +    end
    +end

    Points and single line segments have no angles

    julia
    _angles(::Type{T}, ::Union{GI.PointTrait, GI.MultiPointTrait, GI.LineTrait}, geom) where T = T[]
    +
    +#= The angles of a linestring are the angles formed by the line. If the first and last point
    +are not explicitly repeated, the geom is not considered closed. The angles should all be on
    +one side of the line, but a particular side is not guaranteed by this function. =#
    +function _angles(::Type{T}, ::GI.LineStringTrait, geom) where T
    +    npoints = GI.npoint(geom)
    +    first_last_equal = equals(GI.getpoint(geom, 1), GI.getpoint(geom, npoints))
    +    angle_list = Vector{T}(undef, npoints - (first_last_equal ? 1 : 2))
    +    _find_angles!(
    +        T, angle_list, geom;
    +        offset = first_last_equal, close_geom = false,
    +    )
    +    return angle_list
    +end
    +
    +#= The angles of a linearring are the angles within the closed line and include the angles
    +formed by connecting the first and last points of the curve. =#
    +function _angles(::Type{T}, ::GI.LinearRingTrait, geom; interior = true) where T
    +    npoints = GI.npoint(geom)
    +    first_last_equal = equals(GI.getpoint(geom, 1), GI.getpoint(geom, npoints))
    +    angle_list = Vector{T}(undef, npoints - (first_last_equal ? 1 : 0))
    +    _find_angles!(
    +        T, angle_list, geom;
    +        offset = true, close_geom = !first_last_equal, interior = interior,
    +    )
    +    return angle_list
    +end
    +
    +#= The angles of a polygon is a vector of polygon angles. Note that if there are holes
    +within the polygon, the angles will be listed after the exterior ring angles in order of the
    +holes. All angles, including the hole angles, are interior angles of the polygon.=#
    +function _angles(::Type{T}, ::GI.PolygonTrait, geom) where T
    +    angles = _angles(T, GI.LinearRingTrait(), GI.getexterior(geom); interior = true)
    +    for h in GI.gethole(geom)
    +        append!(angles, _angles(T, GI.LinearRingTrait(), h; interior = false))
    +    end
    +    return angles
    +end

    Find angles of a curve and insert the values into the angle_list. If offset is true, then save space for the angle at the first vertex, as the curve is closed, at the front of angle_list. If close_geom is true, then despite the first and last point not being explicitly repeated, the curve is closed and the angle of the last point should be added to angle_list. If interior is true, then all angles will be on the same side of the line

    julia
    function _find_angles!(
    +    ::Type{T}, angle_list, geom;
    +    offset, close_geom, interior = true,
    +) where T
    +    local p1, prev_p1_diff, p2_p1_diff
    +    local start_point, start_diff
    +    local extreem_idx, extreem_x, extreem_y
    +    i_offset = offset ? 1 : 0

    Loop through the curve and find each of the angels

    julia
        for (i, p2) in enumerate(GI.getpoint(geom))
    +        xp2, yp2 = GI.x(p2), GI.y(p2)
    +        #= Find point with smallest x values (and smallest y in case of a tie) as this point
    +        is know to be convex. =#
    +        if i == 1 || (xp2 < extreem_x || (xp2 == extreem_x && yp2 < extreem_y))
    +            extreem_idx = i
    +            extreem_x, extreem_y = xp2, yp2
    +        end
    +        if i > 1
    +            p2_p1_diff = (xp2 - GI.x(p1), yp2 - GI.y(p1))
    +            if i == 2
    +                start_point = p1
    +                start_diff = p2_p1_diff
    +            else
    +                angle_list[i - 2 + i_offset] = _diffs_calc_angle(T, prev_p1_diff, p2_p1_diff)
    +            end
    +            prev_p1_diff = -1 .* p2_p1_diff
    +        end
    +        p1 = p2
    +    end

    If the last point of geometry should be the same as the first, calculate closing angle

    julia
        if close_geom
    +        p2_p1_diff = (GI.x(start_point) - GI.x(p1), GI.y(start_point) - GI.y(p1))
    +        angle_list[end] = _diffs_calc_angle(T, prev_p1_diff, p2_p1_diff)
    +        prev_p1_diff = -1 .* p2_p1_diff
    +    end

    If needed, calculate first angle corresponding to the first point

    julia
        if offset
    +        angle_list[1] = _diffs_calc_angle(T, prev_p1_diff, start_diff)
    +    end
    +    #= Make sure that all of the angles are on the same side of the line and inside of the
    +    closed ring if the input geometry is closed. =#
    +    inside_sgn = sign(angle_list[extreem_idx]) * (interior ? 1 : -1)
    +    for i in eachindex(angle_list)
    +        idx_sgn = sign(angle_list[i])
    +        if idx_sgn == -1
    +            angle_list[i] = abs(angle_list[i])
    +        end
    +        if idx_sgn != inside_sgn
    +            angle_list[i] = 360 - angle_list[i]
    +        end
    +    end
    +    return
    +end

    Calculate the angle between two vectors defined by the previous and current Δx and Δys. Angle will have a sign corresponding to the sign of the cross product between the two vectors. All angles of one sign in a given geometry are convex, while those of the other sign are concave. However, the sign corresponding to each of these can vary based on geometry and thus you must compare to an angle that is know to be convex or concave.

    julia
    function _diffs_calc_angle(::Type{T}, (Δx_prev, Δy_prev), (Δx_curr, Δy_curr)) where T
    +    cross_prod = Δx_prev * Δy_curr - Δy_prev * Δx_curr
    +    dot_prod = Δx_prev * Δx_curr + Δy_prev * Δy_curr
    +    prev_mag = max(sqrt(Δx_prev^2 + Δy_prev^2), eps(T))
    +    curr_mag = max(sqrt(Δx_curr^2 + Δy_curr^2), eps(T))
    +    val = clamp(dot_prod / (prev_mag * curr_mag), -one(T), one(T))
    +    angle = real(acos(val) * 180 / π)
    +    return angle * (cross_prod < 0 ? -1 : 1)
    +end

    This page was generated using Literate.jl.

    `,27)]))}const F=i(k,[["render",t]]);export{y as __pageData,F as default}; diff --git a/previews/PR239/assets/source_methods_area.md.42EUHlu6.js b/previews/PR239/assets/source_methods_area.md.42EUHlu6.js new file mode 100644 index 000000000..f8c65c212 --- /dev/null +++ b/previews/PR239/assets/source_methods_area.md.42EUHlu6.js @@ -0,0 +1,87 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const t="/GeometryOps.jl/previews/PR239/assets/pkevosp.Dig-DWOQ.png",e="/GeometryOps.jl/previews/PR239/assets/dytnfok.CULn5saZ.png",y=JSON.parse('{"title":"Area and signed area","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/area.md","filePath":"source/methods/area.md","lastUpdated":null}'),l={name:"source/methods/area.md"};function p(k,s,r,d,g,E){return h(),a("div",null,s[0]||(s[0]=[n(`

    Area and signed area

    julia
    export area, signed_area

    What is area? What is signed area?

    Area is the amount of space occupied by a two-dimensional figure. It is always a positive value. Signed area is simply the integral over the exterior path of a polygon, minus the sum of integrals over its interior holes. It is signed such that a clockwise path has a positive area, and a counterclockwise path has a negative area. The area is the absolute value of the signed area.

    To provide an example, consider this rectangle:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +rect = GI.Polygon([[(0,0), (0,1), (1,1), (1,0), (0, 0)]])
    +f, a, p = poly(collect(GI.getpoint(rect)); axis = (; aspect = DataAspect()))

    This is clearly a rectangle, etc. But now let's look at how the points look:

    julia
    lines!(
    +    collect(GI.getpoint(rect));
    +    color = 1:GI.npoint(rect), linewidth = 10.0)
    +f

    The points are ordered in a counterclockwise fashion, which means that the signed area is negative. If we reverse the order of the points, we get a positive area.

    julia
    GO.signed_area(rect)  # -1.0
    -1.0

    Implementation

    This is the GeoInterface-compatible implementation. First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait. This is also used in the implementation, since it's a lot less work!

    Note that area and signed area are zero for all points and curves, even if the curves are closed like with a linear ring. Also note that signed area really only makes sense for polygons, given with a multipolygon can have several polygons each with a different orientation and thus the absolute value of the signed area might not be the area. This is why signed area is only implemented for polygons.

    Targets for applys functions

    julia
    const _AREA_TARGETS = TraitTarget{Union{GI.PolygonTrait,GI.AbstractCurveTrait,GI.MultiPointTrait,GI.PointTrait}}()
    +
    +"""
    +    area(geom, [T = Float64])::T
    +
    +Returns the area of a geometry or collection of geometries.
    +This is computed slightly differently for different geometries:
    +
    +    - The area of a point/multipoint is always zero.
    +    - The area of a curve/multicurve is always zero.
    +    - The area of a polygon is the absolute value of the signed area.
    +    - The area multi-polygon is the sum of the areas of all of the sub-polygons.
    +    - The area of a geometry collection, feature collection of array/iterable
    +        is the sum of the areas of all of the sub-geometries.
    +
    +Result will be of type T, where T is an optional argument with a default value
    +of Float64.
    +"""
    +function area(geom, ::Type{T} = Float64; threaded=false) where T <: AbstractFloat
    +    applyreduce(+, _AREA_TARGETS, geom; threaded, init=zero(T)) do g
    +        _area(T, GI.trait(g), g)
    +    end
    +end
    +
    +"""
    +    signed_area(geom, [T = Float64])::T
    +
    +Returns the signed area of a single geometry, based on winding order.
    +This is computed slightly differently for different geometries:
    +
    +    - The signed area of a point is always zero.
    +    - The signed area of a curve is always zero.
    +    - The signed area of a polygon is computed with the shoelace formula and is
    +    positive if the polygon coordinates wind clockwise and negative if
    +    counterclockwise.
    +    - You cannot compute the signed area of a multipolygon as it doesn't have a
    +    meaning as each sub-polygon could have a different winding order.
    +
    +Result will be of type T, where T is an optional argument with a default value
    +of Float64.
    +"""
    +signed_area(geom, ::Type{T} = Float64) where T <: AbstractFloat =
    +    _signed_area(T, GI.trait(geom), geom)

    Points, MultiPoints, Curves, MultiCurves

    julia
    _area(::Type{T}, ::GI.AbstractGeometryTrait, geom) where T = zero(T)
    +
    +_signed_area(::Type{T}, ::GI.AbstractGeometryTrait, geom) where T = zero(T)

    LibGEOS treats linear rings as zero area. I disagree with that but we should probably maintain compatibility...

    julia
    _area(::Type{T}, tr::GI.LinearRingTrait, geom) where T = 0 # could be abs(_signed_area(T, tr, geom))
    +
    +_signed_area(::Type{T}, ::GI.LinearRingTrait, geom) where T = 0 # could be _signed_area(T, tr, geom)

    Polygons

    julia
    _area(::Type{T}, trait::GI.PolygonTrait, poly) where T =
    +    abs(_signed_area(T, trait, poly))
    +
    +function _signed_area(::Type{T}, ::GI.PolygonTrait, poly) where T
    +    GI.isempty(poly) && return zero(T)
    +    s_area = _signed_area(T, GI.getexterior(poly))
    +    area = abs(s_area)
    +    area == 0 && return area

    Remove hole areas from total

    julia
        for hole in GI.gethole(poly)
    +        area -= abs(_signed_area(T, hole))
    +    end

    Winding of exterior ring determines sign

    julia
        return area * sign(s_area)
    +end

    One term of the shoelace area formula

    julia
    _area_component(p1, p2) = GI.x(p1) * GI.y(p2) - GI.y(p1) * GI.x(p2)
    +
    +#= Calculates the signed area of a given curve. This is equivalent to integrating
    +to find the area under the curve. Even if curve isn't explicitly closed by
    +repeating the first point at the end of the coordinates, curve is still assumed
    +to be closed. =#
    +function _signed_area(::Type{T}, geom) where T
    +    area = zero(T)
    +    np = GI.npoint(geom)
    +    np == 0 && return area
    +
    +    first = true
    +    local pfirst, p1

    Integrate the area under the curve

    julia
        for p2 in GI.getpoint(geom)

    Skip the first and do it later This lets us work within one iteration over geom, which means on C call when using points from external libraries.

    julia
            if first
    +            p1 = pfirst = p2
    +            first = false
    +            continue
    +        end

    Accumulate the area into area

    julia
            area += _area_component(p1, p2)
    +        p1 = p2
    +    end

    Complete the last edge. If the first and last where the same this will be zero

    julia
        p2 = pfirst
    +    area += _area_component(p1, p2)
    +    return T(area / 2)
    +end

    This page was generated using Literate.jl.

    `,40)]))}const F=i(l,[["render",p]]);export{y as __pageData,F as default}; diff --git a/previews/PR239/assets/source_methods_area.md.42EUHlu6.lean.js b/previews/PR239/assets/source_methods_area.md.42EUHlu6.lean.js new file mode 100644 index 000000000..f8c65c212 --- /dev/null +++ b/previews/PR239/assets/source_methods_area.md.42EUHlu6.lean.js @@ -0,0 +1,87 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const t="/GeometryOps.jl/previews/PR239/assets/pkevosp.Dig-DWOQ.png",e="/GeometryOps.jl/previews/PR239/assets/dytnfok.CULn5saZ.png",y=JSON.parse('{"title":"Area and signed area","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/area.md","filePath":"source/methods/area.md","lastUpdated":null}'),l={name:"source/methods/area.md"};function p(k,s,r,d,g,E){return h(),a("div",null,s[0]||(s[0]=[n(`

    Area and signed area

    julia
    export area, signed_area

    What is area? What is signed area?

    Area is the amount of space occupied by a two-dimensional figure. It is always a positive value. Signed area is simply the integral over the exterior path of a polygon, minus the sum of integrals over its interior holes. It is signed such that a clockwise path has a positive area, and a counterclockwise path has a negative area. The area is the absolute value of the signed area.

    To provide an example, consider this rectangle:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +rect = GI.Polygon([[(0,0), (0,1), (1,1), (1,0), (0, 0)]])
    +f, a, p = poly(collect(GI.getpoint(rect)); axis = (; aspect = DataAspect()))

    This is clearly a rectangle, etc. But now let's look at how the points look:

    julia
    lines!(
    +    collect(GI.getpoint(rect));
    +    color = 1:GI.npoint(rect), linewidth = 10.0)
    +f

    The points are ordered in a counterclockwise fashion, which means that the signed area is negative. If we reverse the order of the points, we get a positive area.

    julia
    GO.signed_area(rect)  # -1.0
    -1.0

    Implementation

    This is the GeoInterface-compatible implementation. First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait. This is also used in the implementation, since it's a lot less work!

    Note that area and signed area are zero for all points and curves, even if the curves are closed like with a linear ring. Also note that signed area really only makes sense for polygons, given with a multipolygon can have several polygons each with a different orientation and thus the absolute value of the signed area might not be the area. This is why signed area is only implemented for polygons.

    Targets for applys functions

    julia
    const _AREA_TARGETS = TraitTarget{Union{GI.PolygonTrait,GI.AbstractCurveTrait,GI.MultiPointTrait,GI.PointTrait}}()
    +
    +"""
    +    area(geom, [T = Float64])::T
    +
    +Returns the area of a geometry or collection of geometries.
    +This is computed slightly differently for different geometries:
    +
    +    - The area of a point/multipoint is always zero.
    +    - The area of a curve/multicurve is always zero.
    +    - The area of a polygon is the absolute value of the signed area.
    +    - The area multi-polygon is the sum of the areas of all of the sub-polygons.
    +    - The area of a geometry collection, feature collection of array/iterable
    +        is the sum of the areas of all of the sub-geometries.
    +
    +Result will be of type T, where T is an optional argument with a default value
    +of Float64.
    +"""
    +function area(geom, ::Type{T} = Float64; threaded=false) where T <: AbstractFloat
    +    applyreduce(+, _AREA_TARGETS, geom; threaded, init=zero(T)) do g
    +        _area(T, GI.trait(g), g)
    +    end
    +end
    +
    +"""
    +    signed_area(geom, [T = Float64])::T
    +
    +Returns the signed area of a single geometry, based on winding order.
    +This is computed slightly differently for different geometries:
    +
    +    - The signed area of a point is always zero.
    +    - The signed area of a curve is always zero.
    +    - The signed area of a polygon is computed with the shoelace formula and is
    +    positive if the polygon coordinates wind clockwise and negative if
    +    counterclockwise.
    +    - You cannot compute the signed area of a multipolygon as it doesn't have a
    +    meaning as each sub-polygon could have a different winding order.
    +
    +Result will be of type T, where T is an optional argument with a default value
    +of Float64.
    +"""
    +signed_area(geom, ::Type{T} = Float64) where T <: AbstractFloat =
    +    _signed_area(T, GI.trait(geom), geom)

    Points, MultiPoints, Curves, MultiCurves

    julia
    _area(::Type{T}, ::GI.AbstractGeometryTrait, geom) where T = zero(T)
    +
    +_signed_area(::Type{T}, ::GI.AbstractGeometryTrait, geom) where T = zero(T)

    LibGEOS treats linear rings as zero area. I disagree with that but we should probably maintain compatibility...

    julia
    _area(::Type{T}, tr::GI.LinearRingTrait, geom) where T = 0 # could be abs(_signed_area(T, tr, geom))
    +
    +_signed_area(::Type{T}, ::GI.LinearRingTrait, geom) where T = 0 # could be _signed_area(T, tr, geom)

    Polygons

    julia
    _area(::Type{T}, trait::GI.PolygonTrait, poly) where T =
    +    abs(_signed_area(T, trait, poly))
    +
    +function _signed_area(::Type{T}, ::GI.PolygonTrait, poly) where T
    +    GI.isempty(poly) && return zero(T)
    +    s_area = _signed_area(T, GI.getexterior(poly))
    +    area = abs(s_area)
    +    area == 0 && return area

    Remove hole areas from total

    julia
        for hole in GI.gethole(poly)
    +        area -= abs(_signed_area(T, hole))
    +    end

    Winding of exterior ring determines sign

    julia
        return area * sign(s_area)
    +end

    One term of the shoelace area formula

    julia
    _area_component(p1, p2) = GI.x(p1) * GI.y(p2) - GI.y(p1) * GI.x(p2)
    +
    +#= Calculates the signed area of a given curve. This is equivalent to integrating
    +to find the area under the curve. Even if curve isn't explicitly closed by
    +repeating the first point at the end of the coordinates, curve is still assumed
    +to be closed. =#
    +function _signed_area(::Type{T}, geom) where T
    +    area = zero(T)
    +    np = GI.npoint(geom)
    +    np == 0 && return area
    +
    +    first = true
    +    local pfirst, p1

    Integrate the area under the curve

    julia
        for p2 in GI.getpoint(geom)

    Skip the first and do it later This lets us work within one iteration over geom, which means on C call when using points from external libraries.

    julia
            if first
    +            p1 = pfirst = p2
    +            first = false
    +            continue
    +        end

    Accumulate the area into area

    julia
            area += _area_component(p1, p2)
    +        p1 = p2
    +    end

    Complete the last edge. If the first and last where the same this will be zero

    julia
        p2 = pfirst
    +    area += _area_component(p1, p2)
    +    return T(area / 2)
    +end

    This page was generated using Literate.jl.

    `,40)]))}const F=i(l,[["render",p]]);export{y as __pageData,F as default}; diff --git a/previews/PR239/assets/source_methods_barycentric.md.BiNAbdvJ.js b/previews/PR239/assets/source_methods_barycentric.md.BiNAbdvJ.js new file mode 100644 index 000000000..8fcc33d0e --- /dev/null +++ b/previews/PR239/assets/source_methods_barycentric.md.BiNAbdvJ.js @@ -0,0 +1,415 @@ +import{_ as k,c as n,a5 as t,j as s,a,o as h}from"./chunks/framework.onQNwZ2I.js";const l="/GeometryOps.jl/previews/PR239/assets/cwpogcp.pAYw0Yqf.png",m=JSON.parse('{"title":"Barycentric coordinates","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/barycentric.md","filePath":"source/methods/barycentric.md","lastUpdated":null}'),p={name:"source/methods/barycentric.md"},e={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},E={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.692ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 4726 1000","aria-hidden":"true"},r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.357ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 600 453","aria-hidden":"true"},g={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.357ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 600 453","aria-hidden":"true"},F={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"14.876ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 6575.4 1000","aria-hidden":"true"};function C(c,i,B,A,D,u){return h(),n("div",null,[i[14]||(i[14]=t(`

    Barycentric coordinates

    julia
    export barycentric_coordinates, barycentric_coordinates!, barycentric_interpolate
    +export MeanValue

    Generalized barycentric coordinates are a generalization of barycentric coordinates, which are typically used in triangles, to arbitrary polygons.

    They provide a way to express a point within a polygon as a weighted average of the polygon's vertices.

    `,4)),s("p",null,[i[2]||(i[2]=a("In the case of a triangle, barycentric coordinates are a set of three numbers ")),s("mjx-container",e,[(h(),n("svg",E,i[0]||(i[0]=[t('',1)]))),i[1]||(i[1]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mo",{stretchy:"false"},"("),s("msub",null,[s("mi",null,"λ"),s("mn",null,"1")]),s("mo",null,","),s("msub",null,[s("mi",null,"λ"),s("mn",null,"2")]),s("mo",null,","),s("msub",null,[s("mi",null,"λ"),s("mn",null,"3")]),s("mo",{stretchy:"false"},")")])],-1))]),i[3]||(i[3]=a(", each associated with a vertex of the triangle. Any point within the triangle can be expressed as a weighted average of the vertices, where the weights are the barycentric coordinates. The weights sum to 1, and each is non-negative."))]),s("p",null,[i[10]||(i[10]=a("For a polygon with ")),s("mjx-container",r,[(h(),n("svg",d,i[4]||(i[4]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D45B",d:"M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),i[5]||(i[5]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"n")])],-1))]),i[11]||(i[11]=a(" vertices, generalized barycentric coordinates are a set of ")),s("mjx-container",g,[(h(),n("svg",y,i[6]||(i[6]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D45B",d:"M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),i[7]||(i[7]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"n")])],-1))]),i[12]||(i[12]=a(" numbers ")),s("mjx-container",F,[(h(),n("svg",o,i[8]||(i[8]=[t('',1)]))),i[9]||(i[9]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mo",{stretchy:"false"},"("),s("msub",null,[s("mi",null,"λ"),s("mn",null,"1")]),s("mo",null,","),s("msub",null,[s("mi",null,"λ"),s("mn",null,"2")]),s("mo",null,","),s("mo",null,"."),s("mo",null,"."),s("mo",null,"."),s("mo",null,","),s("msub",null,[s("mi",null,"λ"),s("mi",null,"n")]),s("mo",{stretchy:"false"},")")])],-1))]),i[13]||(i[13]=a(", each associated with a vertex of the polygon. Any point within the polygon can be expressed as a weighted average of the vertices, where the weights are the generalized barycentric coordinates."))]),i[15]||(i[15]=t(`

    As with the triangle case, the weights sum to 1, and each is non-negative.

    Example

    This example was taken from this page of CGAL's documentation.

    julia
    using GeometryOps
    +using GeometryOps.GeometryBasics
    +using Makie
    +using CairoMakie
    +# Define a polygon
    +polygon_points = Point3f[
    +(0.03, 0.05, 0.00), (0.07, 0.04, 0.02), (0.10, 0.04, 0.04),
    +(0.14, 0.04, 0.06), (0.17, 0.07, 0.08), (0.20, 0.09, 0.10),
    +(0.22, 0.11, 0.12), (0.25, 0.11, 0.14), (0.27, 0.10, 0.16),
    +(0.30, 0.07, 0.18), (0.31, 0.04, 0.20), (0.34, 0.03, 0.22),
    +(0.37, 0.02, 0.24), (0.40, 0.03, 0.26), (0.42, 0.04, 0.28),
    +(0.44, 0.07, 0.30), (0.45, 0.10, 0.32), (0.46, 0.13, 0.34),
    +(0.46, 0.19, 0.36), (0.47, 0.26, 0.38), (0.47, 0.31, 0.40),
    +(0.47, 0.35, 0.42), (0.45, 0.37, 0.44), (0.41, 0.38, 0.46),
    +(0.38, 0.37, 0.48), (0.35, 0.36, 0.50), (0.32, 0.35, 0.52),
    +(0.30, 0.37, 0.54), (0.28, 0.39, 0.56), (0.25, 0.40, 0.58),
    +(0.23, 0.39, 0.60), (0.21, 0.37, 0.62), (0.21, 0.34, 0.64),
    +(0.23, 0.32, 0.66), (0.24, 0.29, 0.68), (0.27, 0.24, 0.70),
    +(0.29, 0.21, 0.72), (0.29, 0.18, 0.74), (0.26, 0.16, 0.76),
    +(0.24, 0.17, 0.78), (0.23, 0.19, 0.80), (0.24, 0.22, 0.82),
    +(0.24, 0.25, 0.84), (0.21, 0.26, 0.86), (0.17, 0.26, 0.88),
    +(0.12, 0.24, 0.90), (0.07, 0.20, 0.92), (0.03, 0.15, 0.94),
    +(0.01, 0.10, 0.97), (0.02, 0.07, 1.00)]
    +# Plot it!
    +# First, we'll plot the polygon using Makie's rendering:
    +f, a1, p1 = poly(
    +    Point2d.(polygon_points);
    +    color = last.(polygon_points),
    +    colormap = cgrad(:jet, 18; categorical = true),
    +    axis = (;
    +       type = Axis, aspect = DataAspect(), title = "Makie mesh based polygon rendering", subtitle = "CairoMakie"
    +    ),
    +    figure = (; size = (800, 400),)
    +)
    +hidedecorations!(a1)
    +
    +ext = GeometryOps.GI.Extent(X = (0, 0.5), Y = (0, 0.42))
    +
    +a2 = Axis(
    +        f[1, 2],
    +        aspect = DataAspect(),
    +        title = "Barycentric coordinate based polygon rendering", subtitle = "GeometryOps",
    +        limits = (ext.X, ext.Y)
    +    )
    +hidedecorations!(a2)
    +
    +p2box = poly!( # Now, we plot a cropping rectangle around the axis so we only show the polygon
    +    a2,
    +    GeometryOps.GeometryBasics.Polygon( # This is a rectangle with an internal hole shaped like the polygon.
    +        Point2f[(ext.X[1], ext.Y[1]), (ext.X[2], ext.Y[1]), (ext.X[2], ext.Y[2]), (ext.X[1], ext.Y[2]), (ext.X[1], ext.Y[1])], # exterior
    +        [reverse(Point2f.(polygon_points))] # hole
    +    ); color = :white, xautolimits = false, yautolimits = false
    +)
    +cb = Colorbar(f[2, :], p1.plots[1]; vertical = false, flipaxis = true)
    +# Finally, we perform barycentric interpolation on a grid,
    +xrange = LinRange(ext.X..., 400)
    +yrange = LinRange(ext.Y..., 400)
    +@time mean_values = barycentric_interpolate.(
    +    (MeanValue(),), # The barycentric coordinate algorithm (MeanValue is the only one for now)
    +    (Point2f.(polygon_points),), # The polygon points as \`Point2f\`
    +    (last.(polygon_points,),),   # The values per polygon point - can be anything which supports addition and division
    +    Point2f.(xrange, yrange')    # The points at which to interpolate
    +)
    +# and render!
    +hm = heatmap!(a2, xrange, yrange, mean_values; colormap = p1.colormap, colorrange = p1.plots[1].colorrange[], xautolimits = false, yautolimits = false)
    +translate!(hm, 0, 0, -1) # translate the heatmap behind the cropping polygon!
    +f # finally, display the figure

    Barycentric-coordinate API

    In some cases, we actually want barycentric interpolation, and have no interest in the coordinates themselves.

    However, the coordinates can be useful for debugging, and when performing 3D rendering, multiple barycentric values (depth, uv) are needed for depth buffering.

    julia
    const _VecTypes = Union{Tuple{Vararg{T, N}}, GeometryBasics.StaticArraysCore.StaticArray{Tuple{N}, T, 1}} where {N, T}
    +
    +"""
    +    abstract type AbstractBarycentricCoordinateMethod
    +
    +Abstract supertype for barycentric coordinate methods.
    +The subtypes may serve as dispatch types, or may cache
    +some information about the target polygon.
    +
    +# API
    +The following methods must be implemented for all subtypes:
    +- \`barycentric_coordinates!(λs::Vector{<: Real}, method::AbstractBarycentricCoordinateMethod, exterior::Vector{<: Point{2, T1}}, point::Point{2, T2})\`
    +- \`barycentric_interpolate(method::AbstractBarycentricCoordinateMethod, exterior::Vector{<: Point{2, T1}}, values::Vector{V}, point::Point{2, T2})::V\`
    +- \`barycentric_interpolate(method::AbstractBarycentricCoordinateMethod, exterior::Vector{<: Point{2, T1}}, interiors::Vector{<: Vector{<: Point{2, T1}}} values::Vector{V}, point::Point{2, T2})::V\`
    +The rest of the methods will be implemented in terms of these, and have efficient dispatches for broadcasting.
    +"""
    +abstract type AbstractBarycentricCoordinateMethod end
    +
    +Base.@propagate_inbounds function barycentric_coordinates!(λs::Vector{<: Real}, method::AbstractBarycentricCoordinateMethod, polypoints::AbstractVector{<: Point{N1, T1}}, point::Point{N2, T2}) where {N1, N2, T1 <: Real, T2 <: Real}
    +    @boundscheck @assert length(λs) == length(polypoints)
    +    @boundscheck @assert length(polypoints) >= 3
    +
    +    @error("Not implemented yet for method $(method).")
    +end
    +Base.@propagate_inbounds barycentric_coordinates!(λs::Vector{<: Real}, polypoints::AbstractVector{<: Point{N1, T1}}, point::Point{N2, T2}) where {N1, N2, T1 <: Real, T2 <: Real} = barycentric_coordinates!(λs, MeanValue(), polypoints, point)

    This is the GeoInterface-compatible method.

    julia
    """
    +    barycentric_coordinates!(λs::Vector{<: Real}, method::AbstractBarycentricCoordinateMethod, polygon, point)
    +
    +Loads the barycentric coordinates of \`point\` in \`polygon\` into \`λs\` using the barycentric coordinate method \`method\`.
    +
    +\`λs\` must be of the length of the polygon plus its holes.
    +
    +!!! tip
    +    Use this method to avoid excess allocations when you need to calculate barycentric coordinates for many points.
    +"""
    +Base.@propagate_inbounds function barycentric_coordinates!(λs::Vector{<: Real}, method::AbstractBarycentricCoordinateMethod, polygon, point)
    +    @assert GeoInterface.trait(polygon) isa GeoInterface.PolygonTrait
    +    @assert GeoInterface.trait(point) isa GeoInterface.PointTrait
    +    passable_polygon = GeoInterface.convert(GeometryBasics, polygon)
    +    @assert passable_polygon isa GeometryBasics.Polygon "The polygon was converted to a $(typeof(passable_polygon)), which is not a \`GeometryBasics.Polygon\`."
    +    passable_point = GeoInterface.convert(GeometryBasics, point)
    +    return barycentric_coordinates!(λs, method, passable_polygon, Point2(passable_point))
    +end
    +
    +Base.@propagate_inbounds function barycentric_coordinates(method::AbstractBarycentricCoordinateMethod, polypoints::AbstractVector{<: Point{N1, T1}}, point::Point{N2, T2}) where {N1, N2, T1 <: Real, T2 <: Real}
    +    λs = zeros(promote_type(T1, T2), length(polypoints))
    +    barycentric_coordinates!(λs, method, polypoints, point)
    +    return λs
    +end
    +Base.@propagate_inbounds barycentric_coordinates(polypoints::AbstractVector{<: Point{N1, T1}}, point::Point{N2, T2}) where {N1, N2, T1 <: Real, T2 <: Real} = barycentric_coordinates(MeanValue(), polypoints, point)

    This is the GeoInterface-compatible method.

    julia
    """
    +    barycentric_coordinates(method = MeanValue(), polygon, point)
    +
    +Returns the barycentric coordinates of \`point\` in \`polygon\` using the barycentric coordinate method \`method\`.
    +"""
    +Base.@propagate_inbounds function barycentric_coordinates(method::AbstractBarycentricCoordinateMethod, polygon, point)
    +    @assert GeoInterface.trait(polygon) isa GeoInterface.PolygonTrait
    +    @assert GeoInterface.trait(point) isa GeoInterface.PointTrait
    +    passable_polygon = GeoInterface.convert(GeometryBasics, polygon)
    +    @assert passable_polygon isa GeometryBasics.Polygon "The polygon was converted to a $(typeof(passable_polygon)), which is not a \`GeometryBasics.Polygon\`."
    +    passable_point = GeoInterface.convert(GeometryBasics, point)
    +    return barycentric_coordinates(method, passable_polygon, Point2(passable_point))
    +end
    +
    +Base.@propagate_inbounds function barycentric_interpolate(method::AbstractBarycentricCoordinateMethod, polypoints::AbstractVector{<: Point{N, T1}}, values::AbstractVector{V}, point::Point{N, T2}) where {N, T1 <: Real, T2 <: Real, V}
    +    @boundscheck @assert length(values) == length(polypoints)
    +    @boundscheck @assert length(polypoints) >= 3
    +    λs = barycentric_coordinates(method, polypoints, point)
    +    return sum(λs .* values)
    +end
    +Base.@propagate_inbounds barycentric_interpolate(polypoints::AbstractVector{<: Point{N, T1}}, values::AbstractVector{V}, point::Point{N, T2}) where {N, T1 <: Real, T2 <: Real, V} = barycentric_interpolate(MeanValue(), polypoints, values, point)
    +
    +Base.@propagate_inbounds function barycentric_interpolate(method::AbstractBarycentricCoordinateMethod, exterior::AbstractVector{<: Point{N, T1}}, interiors::AbstractVector{<: Point{N, T1}}, values::AbstractVector{V}, point::Point{N, T2}) where {N, T1 <: Real, T2 <: Real, V}
    +    @boundscheck @assert length(values) == length(exterior) + isempty(interiors) ? 0 : sum(length.(interiors))
    +    @boundscheck @assert length(exterior) >= 3
    +    λs = barycentric_coordinates(method, exterior, interiors, point)
    +    return sum(λs .* values)
    +end
    +Base.@propagate_inbounds barycentric_interpolate(exterior::AbstractVector{<: Point{N, T1}}, interiors::AbstractVector{<: Point{N, T1}}, values::AbstractVector{V}, point::Point{N, T2}) where {N, T1 <: Real, T2 <: Real, V} = barycentric_interpolate(MeanValue(), exterior, interiors, values, point)
    +
    +Base.@propagate_inbounds function barycentric_interpolate(method::AbstractBarycentricCoordinateMethod, polygon::Polygon{2, T1}, values::AbstractVector{V}, point::Point{2, T2}) where {T1 <: Real, T2 <: Real, V}
    +    exterior = decompose(Point{2, promote_type(T1, T2)}, polygon.exterior)
    +    if isempty(polygon.interiors)
    +        @boundscheck @assert length(values) == length(exterior)
    +        return barycentric_interpolate(method, exterior, values, point)
    +    else # the poly has interiors
    +        interiors = reverse.(decompose.((Point{2, promote_type(T1, T2)},), polygon.interiors))
    +        @boundscheck @assert length(values) == length(exterior) + sum(length.(interiors))
    +        return barycentric_interpolate(method, exterior, interiors, values, point)
    +    end
    +end
    +Base.@propagate_inbounds barycentric_interpolate(polygon::Polygon{2, T1}, values::AbstractVector{V}, point::Point{2, T2}) where {T1 <: Real, T2 <: Real, V} = barycentric_interpolate(MeanValue(), polygon, values, point)

    3D polygons are considered to have their vertices in the XY plane, and the Z coordinate must represent some value. This is to say that the Z coordinate is interpreted as an M coordinate.

    julia
    Base.@propagate_inbounds function barycentric_interpolate(method::AbstractBarycentricCoordinateMethod, polygon::Polygon{3, T1}, point::Point{2, T2}) where {T1 <: Real, T2 <: Real}
    +    exterior_point3s = decompose(Point{3, promote_type(T1, T2)}, polygon.exterior)
    +    exterior_values = getindex.(exterior_point3s, 3)
    +    exterior_points = Point2f.(exterior_point3s)
    +    if isempty(polygon.interiors)
    +        return barycentric_interpolate(method, exterior_points, exterior_values, point)
    +    else # the poly has interiors
    +        interior_point3s = decompose.((Point{3, promote_type(T1, T2)},), polygon.interiors)
    +        interior_values = collect(Iterators.flatten((getindex.(point3s, 3) for point3s in interior_point3s)))
    +        interior_points = map(point3s -> Point2f.(point3s), interior_point3s)
    +        return barycentric_interpolate(method, exterior_points, interior_points, vcat(exterior_values, interior_values), point)
    +    end
    +end
    +Base.@propagate_inbounds barycentric_interpolate(polygon::Polygon{3, T1}, point::Point{2, T2}) where {T1 <: Real, T2 <: Real} = barycentric_interpolate(MeanValue(), polygon, point)

    This method is the one which supports GeoInterface.

    julia
    """
    +    barycentric_interpolate(method = MeanValue(), polygon, values::AbstractVector{V}, point)
    +
    +Returns the interpolated value at \`point\` within \`polygon\` using the barycentric coordinate method \`method\`.
    +\`values\` are the per-point values for the polygon which are to be interpolated.
    +
    +Returns an object of type \`V\`.
    +
    +!!! warning
    +    Barycentric interpolation is currently defined only for 2-dimensional polygons.
    +    If you pass a 3-D polygon in, the Z coordinate will be used as per-vertex value to be interpolated
    +    (the M coordinate in GIS parlance).
    +"""
    +Base.@propagate_inbounds function barycentric_interpolate(method::AbstractBarycentricCoordinateMethod, polygon, values::AbstractVector{V}, point) where V
    +    @assert GeoInterface.trait(polygon) isa GeoInterface.PolygonTrait
    +    @assert GeoInterface.trait(point) isa GeoInterface.PointTrait
    +    passable_polygon = GeoInterface.convert(GeometryBasics, polygon)
    +    @assert passable_polygon isa GeometryBasics.Polygon "The polygon was converted to a $(typeof(passable_polygon)), which is not a \`GeometryBasics.Polygon\`."
    +    # first_poly_point = GeoInterface.getpoint(GeoInterface.getexterior(polygon))
    +    passable_point = GeoInterface.convert(GeometryBasics, point)
    +    return barycentric_interpolate(method, passable_polygon, Point2(passable_point))
    +end
    +Base.@propagate_inbounds barycentric_interpolate(polygon, values::AbstractVector{V}, point) where V = barycentric_interpolate(MeanValue(), polygon, values, point)
    +
    +"""
    +    weighted_mean(weight::Real, x1, x2)
    +
    +Returns the weighted mean of \`x1\` and \`x2\`, where \`weight\` is the weight of \`x1\`.
    +
    +Specifically, calculates \`x1 * weight + x2 * (1 - weight)\`.
    +
    +!!! note
    +    The idea for this method is that you can override this for custom types, like Color types, in extension modules.
    +"""
    +function weighted_mean(weight::WT, x1, x2) where {WT <: Real}
    +    return muladd(x1, weight, x2 * (oneunit(WT) - weight))
    +end
    +
    +
    +"""
    +    MeanValue() <: AbstractBarycentricCoordinateMethod
    +
    +This method calculates barycentric coordinates using the mean value method.
    +
    +# References
    +
    +"""
    +struct MeanValue <: AbstractBarycentricCoordinateMethod
    +end

    Before we go to the actual implementation, there are some quick and simple utility functions that we need to implement. These are mainly for convenience and code brevity.

    julia
    """
    +    _det(s1::Point2{T1}, s2::Point2{T2}) where {T1 <: Real, T2 <: Real}
    +
    +Returns the determinant of the matrix formed by \`hcat\`'ing two points \`s1\` and \`s2\`.
    +
    +Specifically, this is:
    +\`\`\`julia
    +s1[1] * s2[2] - s1[2] * s2[1]
    +\`\`\`
    +"""
    +function _det(s1::_VecTypes{2, T1}, s2::_VecTypes{2, T2}) where {T1 <: Real, T2 <: Real}
    +    return s1[1] * s2[2] - s1[2] * s2[1]
    +end
    +
    +"""
    +    t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)
    +
    +Returns the "T-value" as described in Hormann's presentation [^HormannPresentation] on how to calculate
    +the mean-value coordinate.
    +
    +Here, \`sᵢ\` is the vector from vertex \`vᵢ\` to the point, and \`rᵢ\` is the norm (length) of \`sᵢ\`.
    +\`s\` must be \`Point\` and \`r\` must be real numbers.
    +
    +\`\`\`math
    +tᵢ = \\\\frac{\\\\mathrm{det}\\\\left(sᵢ, sᵢ₊₁\\\\right)}{rᵢ * rᵢ₊₁ + sᵢ ⋅ sᵢ₊₁}
    +\`\`\`
    +
    +[^HormannPresentation]: K. Hormann and N. Sukumar. Generalized Barycentric Coordinates in Computer Graphics and Computational Mechanics. Taylor & Fancis, CRC Press, 2017.
    +\`\`\`
    +
    +"""
    +function t_value(sᵢ::_VecTypes{N, T1}, sᵢ₊₁::_VecTypes{N, T1}, rᵢ::T2, rᵢ₊₁::T2) where {N, T1 <: Real, T2 <: Real}
    +    return _det(sᵢ, sᵢ₊₁) / muladd(rᵢ, rᵢ₊₁, dot(sᵢ, sᵢ₊₁))
    +end
    +
    +
    +function barycentric_coordinates!(λs::Vector{<: Real}, ::MeanValue, polypoints::AbstractVector{<: Point{2, T1}}, point::Point{2, T2}) where {T1 <: Real, T2 <: Real}
    +    @boundscheck @assert length(λs) == length(polypoints)
    +    @boundscheck @assert length(polypoints) >= 3
    +    n_points = length(polypoints)
    +    # Initialize counters and register variables
    +    # Points - these are actually vectors from point to vertices
    +    #  polypoints[i-1], polypoints[i], polypoints[i+1]
    +    sᵢ₋₁ = polypoints[end] - point
    +    sᵢ   = polypoints[begin] - point
    +    sᵢ₊₁ = polypoints[begin+1] - point
    +    # radius / Euclidean distance between points.
    +    rᵢ₋₁ = norm(sᵢ₋₁)
    +    rᵢ   = norm(sᵢ  )
    +    rᵢ₊₁ = norm(sᵢ₊₁)
    +    # Perform the first computation explicitly, so we can cut down on
    +    # a mod in the loop.
    +    λs[1] = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +    # Loop through the rest of the vertices, compute, store in λs
    +    for i in 2:n_points
    +        # Increment counters + set variables
    +        sᵢ₋₁ = sᵢ
    +        sᵢ   = sᵢ₊₁
    +        sᵢ₊₁ = polypoints[mod1(i+1, n_points)] - point
    +        rᵢ₋₁ = rᵢ
    +        rᵢ   = rᵢ₊₁
    +        rᵢ₊₁ = norm(sᵢ₊₁) # radius / Euclidean distance between points.
    +        λs[i] = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +    end
    +    # Normalize λs to the 1-norm (sum=1)
    +    λs ./= sum(λs)
    +    return λs
    +end
    julia
    function barycentric_coordinates(::MeanValue, polypoints::NTuple{N, Point{2, T2}}, point::Point{2, T1},) where {N, T1, T2}
    +    ## Initialize counters and register variables
    +    ## Points - these are actually vectors from point to vertices
    +    ##  polypoints[i-1], polypoints[i], polypoints[i+1]
    +    sᵢ₋₁ = polypoints[end] - point
    +    sᵢ   = polypoints[begin] - point
    +    sᵢ₊₁ = polypoints[begin+1] - point
    +    ## radius / Euclidean distance between points.
    +    rᵢ₋₁ = norm(sᵢ₋₁)
    +    rᵢ   = norm(sᵢ  )
    +    rᵢ₊₁ = norm(sᵢ₊₁)
    +    λ₁ = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +    λs = ntuple(N) do i
    +        if i == 1
    +            return λ₁
    +        end
    +        ## Increment counters + set variables
    +        sᵢ₋₁ = sᵢ
    +        sᵢ   = sᵢ₊₁
    +        sᵢ₊₁ = polypoints[mod1(i+1, N)] - point
    +        rᵢ₋₁ = rᵢ
    +        rᵢ   = rᵢ₊₁
    +        rᵢ₊₁ = norm(sᵢ₊₁) # radius / Euclidean distance between points.
    +        return (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +    end
    +
    +    ∑λ = sum(λs)
    +
    +    return ntuple(N) do i
    +        λs[i] / ∑λ
    +    end
    +end

    This performs an inplace accumulation, using less memory and is faster. That's particularly good if you are using a polygon with a large number of points...

    julia
    function barycentric_interpolate(::MeanValue, polypoints::AbstractVector{<: Point{2, T1}}, values::AbstractVector{V}, point::Point{2, T2}) where {T1 <: Real, T2 <: Real, V}
    +    @boundscheck @assert length(values) == length(polypoints)
    +    @boundscheck @assert length(polypoints) >= 3
    +
    +    n_points = length(polypoints)
    +    # Initialize counters and register variables
    +    # Points - these are actually vectors from point to vertices
    +    #  polypoints[i-1], polypoints[i], polypoints[i+1]
    +    sᵢ₋₁ = polypoints[end] - point
    +    sᵢ   = polypoints[begin] - point
    +    sᵢ₊₁ = polypoints[begin+1] - point
    +    # radius / Euclidean distance between points.
    +    rᵢ₋₁ = norm(sᵢ₋₁)
    +    rᵢ   = norm(sᵢ  )
    +    rᵢ₊₁ = norm(sᵢ₊₁)
    +    # Now, we set the interpolated value to the first point's value, multiplied
    +    # by the weight computed relative to the first point in the polygon.
    +    wᵢ = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +    wₜₒₜ = wᵢ
    +    interpolated_value = values[begin] * wᵢ
    +    for i in 2:n_points
    +        # Increment counters + set variables
    +        sᵢ₋₁ = sᵢ
    +        sᵢ   = sᵢ₊₁
    +        sᵢ₊₁ = polypoints[mod1(i+1, n_points)] - point
    +        rᵢ₋₁ = rᵢ
    +        rᵢ   = rᵢ₊₁
    +        rᵢ₊₁ = norm(sᵢ₊₁)
    +        # Now, we calculate the weight:
    +        wᵢ = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +        # perform a weighted sum with the interpolated value:
    +        interpolated_value += values[i] * wᵢ
    +        # and add the weight to the total weight accumulator.
    +        wₜₒₜ += wᵢ
    +    end
    +    # Return the normalized interpolated value.
    +    return interpolated_value / wₜₒₜ
    +end

    When you have holes, then you have to be careful about the order you iterate around points.

    Specifically, you have to iterate around each linear ring separately and ensure there are no degenerate/repeated points at the start and end!

    julia
    function barycentric_interpolate(::MeanValue, exterior::AbstractVector{<: Point{N, T1}}, interiors::AbstractVector{<: AbstractVector{<: Point{N, T1}}}, values::AbstractVector{V}, point::Point{N, T2}) where {N, T1 <: Real, T2 <: Real, V}
    +    # @boundscheck @assert length(values) == (length(exterior) + isempty(interiors) ? 0 : sum(length.(interiors)))
    +    # @boundscheck @assert length(exterior) >= 3
    +
    +    current_index = 1
    +    l_exterior = length(exterior)
    +
    +    sᵢ₋₁ = exterior[end] - point
    +    sᵢ   = exterior[begin] - point
    +    sᵢ₊₁ = exterior[begin+1] - point
    +    rᵢ₋₁ = norm(sᵢ₋₁) # radius / Euclidean distance between points.
    +    rᵢ   = norm(sᵢ  ) # radius / Euclidean distance between points.
    +    rᵢ₊₁ = norm(sᵢ₊₁) # radius / Euclidean distance between points.

    Now, we set the interpolated value to the first point's value, multiplied by the weight computed relative to the first point in the polygon.

    julia
        wᵢ = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +    wₜₒₜ = wᵢ
    +    interpolated_value = values[begin] * wᵢ
    +
    +    for i in 2:l_exterior

    Increment counters + set variables

    julia
            sᵢ₋₁ = sᵢ
    +        sᵢ   = sᵢ₊₁
    +        sᵢ₊₁ = exterior[mod1(i+1, l_exterior)] - point
    +        rᵢ₋₁ = rᵢ
    +        rᵢ   = rᵢ₊₁
    +        rᵢ₊₁ = norm(sᵢ₊₁) # radius / Euclidean distance between points.
    +        wᵢ = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ

    Updates - first the interpolated value,

    julia
            interpolated_value += values[current_index] * wᵢ

    then the accumulators for total weight and current index.

    julia
            wₜₒₜ += wᵢ
    +        current_index += 1
    +
    +    end
    +    for hole in interiors
    +        l_hole = length(hole)
    +        sᵢ₋₁ = hole[end] - point
    +        sᵢ   = hole[begin] - point
    +        sᵢ₊₁ = hole[begin+1] - point
    +        rᵢ₋₁ = norm(sᵢ₋₁) # radius / Euclidean distance between points.
    +        rᵢ   = norm(sᵢ  ) # radius / Euclidean distance between points.
    +        rᵢ₊₁ = norm(sᵢ₊₁) # radius / Euclidean distance between points.
    +        # Now, we set the interpolated value to the first point's value, multiplied
    +        # by the weight computed relative to the first point in the polygon.
    +        wᵢ = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +
    +        interpolated_value += values[current_index] * wᵢ
    +
    +        wₜₒₜ += wᵢ
    +        current_index += 1
    +
    +        for i in 2:l_hole
    +            # Increment counters + set variables
    +            sᵢ₋₁ = sᵢ
    +            sᵢ   = sᵢ₊₁
    +            sᵢ₊₁ = hole[mod1(i+1, l_hole)] - point
    +            rᵢ₋₁ = rᵢ
    +            rᵢ   = rᵢ₊₁
    +            rᵢ₊₁ = norm(sᵢ₊₁) ## radius / Euclidean distance between points.
    +            wᵢ = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +            interpolated_value += values[current_index] * wᵢ
    +            wₜₒₜ += wᵢ
    +            current_index += 1
    +        end
    +    end
    +    return interpolated_value / wₜₒₜ
    +
    +end
    +
    +struct Wachspress <: AbstractBarycentricCoordinateMethod
    +end

    This page was generated using Literate.jl.

    `,35))])}const b=k(p,[["render",C]]);export{m as __pageData,b as default}; diff --git a/previews/PR239/assets/source_methods_barycentric.md.BiNAbdvJ.lean.js b/previews/PR239/assets/source_methods_barycentric.md.BiNAbdvJ.lean.js new file mode 100644 index 000000000..8fcc33d0e --- /dev/null +++ b/previews/PR239/assets/source_methods_barycentric.md.BiNAbdvJ.lean.js @@ -0,0 +1,415 @@ +import{_ as k,c as n,a5 as t,j as s,a,o as h}from"./chunks/framework.onQNwZ2I.js";const l="/GeometryOps.jl/previews/PR239/assets/cwpogcp.pAYw0Yqf.png",m=JSON.parse('{"title":"Barycentric coordinates","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/barycentric.md","filePath":"source/methods/barycentric.md","lastUpdated":null}'),p={name:"source/methods/barycentric.md"},e={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},E={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.692ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 4726 1000","aria-hidden":"true"},r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.357ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 600 453","aria-hidden":"true"},g={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.357ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 600 453","aria-hidden":"true"},F={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"14.876ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 6575.4 1000","aria-hidden":"true"};function C(c,i,B,A,D,u){return h(),n("div",null,[i[14]||(i[14]=t(`

    Barycentric coordinates

    julia
    export barycentric_coordinates, barycentric_coordinates!, barycentric_interpolate
    +export MeanValue

    Generalized barycentric coordinates are a generalization of barycentric coordinates, which are typically used in triangles, to arbitrary polygons.

    They provide a way to express a point within a polygon as a weighted average of the polygon's vertices.

    `,4)),s("p",null,[i[2]||(i[2]=a("In the case of a triangle, barycentric coordinates are a set of three numbers ")),s("mjx-container",e,[(h(),n("svg",E,i[0]||(i[0]=[t('',1)]))),i[1]||(i[1]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mo",{stretchy:"false"},"("),s("msub",null,[s("mi",null,"λ"),s("mn",null,"1")]),s("mo",null,","),s("msub",null,[s("mi",null,"λ"),s("mn",null,"2")]),s("mo",null,","),s("msub",null,[s("mi",null,"λ"),s("mn",null,"3")]),s("mo",{stretchy:"false"},")")])],-1))]),i[3]||(i[3]=a(", each associated with a vertex of the triangle. Any point within the triangle can be expressed as a weighted average of the vertices, where the weights are the barycentric coordinates. The weights sum to 1, and each is non-negative."))]),s("p",null,[i[10]||(i[10]=a("For a polygon with ")),s("mjx-container",r,[(h(),n("svg",d,i[4]||(i[4]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D45B",d:"M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),i[5]||(i[5]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"n")])],-1))]),i[11]||(i[11]=a(" vertices, generalized barycentric coordinates are a set of ")),s("mjx-container",g,[(h(),n("svg",y,i[6]||(i[6]=[s("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[s("g",{"data-mml-node":"math"},[s("g",{"data-mml-node":"mi"},[s("path",{"data-c":"1D45B",d:"M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),i[7]||(i[7]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"n")])],-1))]),i[12]||(i[12]=a(" numbers ")),s("mjx-container",F,[(h(),n("svg",o,i[8]||(i[8]=[t('',1)]))),i[9]||(i[9]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mo",{stretchy:"false"},"("),s("msub",null,[s("mi",null,"λ"),s("mn",null,"1")]),s("mo",null,","),s("msub",null,[s("mi",null,"λ"),s("mn",null,"2")]),s("mo",null,","),s("mo",null,"."),s("mo",null,"."),s("mo",null,"."),s("mo",null,","),s("msub",null,[s("mi",null,"λ"),s("mi",null,"n")]),s("mo",{stretchy:"false"},")")])],-1))]),i[13]||(i[13]=a(", each associated with a vertex of the polygon. Any point within the polygon can be expressed as a weighted average of the vertices, where the weights are the generalized barycentric coordinates."))]),i[15]||(i[15]=t(`

    As with the triangle case, the weights sum to 1, and each is non-negative.

    Example

    This example was taken from this page of CGAL's documentation.

    julia
    using GeometryOps
    +using GeometryOps.GeometryBasics
    +using Makie
    +using CairoMakie
    +# Define a polygon
    +polygon_points = Point3f[
    +(0.03, 0.05, 0.00), (0.07, 0.04, 0.02), (0.10, 0.04, 0.04),
    +(0.14, 0.04, 0.06), (0.17, 0.07, 0.08), (0.20, 0.09, 0.10),
    +(0.22, 0.11, 0.12), (0.25, 0.11, 0.14), (0.27, 0.10, 0.16),
    +(0.30, 0.07, 0.18), (0.31, 0.04, 0.20), (0.34, 0.03, 0.22),
    +(0.37, 0.02, 0.24), (0.40, 0.03, 0.26), (0.42, 0.04, 0.28),
    +(0.44, 0.07, 0.30), (0.45, 0.10, 0.32), (0.46, 0.13, 0.34),
    +(0.46, 0.19, 0.36), (0.47, 0.26, 0.38), (0.47, 0.31, 0.40),
    +(0.47, 0.35, 0.42), (0.45, 0.37, 0.44), (0.41, 0.38, 0.46),
    +(0.38, 0.37, 0.48), (0.35, 0.36, 0.50), (0.32, 0.35, 0.52),
    +(0.30, 0.37, 0.54), (0.28, 0.39, 0.56), (0.25, 0.40, 0.58),
    +(0.23, 0.39, 0.60), (0.21, 0.37, 0.62), (0.21, 0.34, 0.64),
    +(0.23, 0.32, 0.66), (0.24, 0.29, 0.68), (0.27, 0.24, 0.70),
    +(0.29, 0.21, 0.72), (0.29, 0.18, 0.74), (0.26, 0.16, 0.76),
    +(0.24, 0.17, 0.78), (0.23, 0.19, 0.80), (0.24, 0.22, 0.82),
    +(0.24, 0.25, 0.84), (0.21, 0.26, 0.86), (0.17, 0.26, 0.88),
    +(0.12, 0.24, 0.90), (0.07, 0.20, 0.92), (0.03, 0.15, 0.94),
    +(0.01, 0.10, 0.97), (0.02, 0.07, 1.00)]
    +# Plot it!
    +# First, we'll plot the polygon using Makie's rendering:
    +f, a1, p1 = poly(
    +    Point2d.(polygon_points);
    +    color = last.(polygon_points),
    +    colormap = cgrad(:jet, 18; categorical = true),
    +    axis = (;
    +       type = Axis, aspect = DataAspect(), title = "Makie mesh based polygon rendering", subtitle = "CairoMakie"
    +    ),
    +    figure = (; size = (800, 400),)
    +)
    +hidedecorations!(a1)
    +
    +ext = GeometryOps.GI.Extent(X = (0, 0.5), Y = (0, 0.42))
    +
    +a2 = Axis(
    +        f[1, 2],
    +        aspect = DataAspect(),
    +        title = "Barycentric coordinate based polygon rendering", subtitle = "GeometryOps",
    +        limits = (ext.X, ext.Y)
    +    )
    +hidedecorations!(a2)
    +
    +p2box = poly!( # Now, we plot a cropping rectangle around the axis so we only show the polygon
    +    a2,
    +    GeometryOps.GeometryBasics.Polygon( # This is a rectangle with an internal hole shaped like the polygon.
    +        Point2f[(ext.X[1], ext.Y[1]), (ext.X[2], ext.Y[1]), (ext.X[2], ext.Y[2]), (ext.X[1], ext.Y[2]), (ext.X[1], ext.Y[1])], # exterior
    +        [reverse(Point2f.(polygon_points))] # hole
    +    ); color = :white, xautolimits = false, yautolimits = false
    +)
    +cb = Colorbar(f[2, :], p1.plots[1]; vertical = false, flipaxis = true)
    +# Finally, we perform barycentric interpolation on a grid,
    +xrange = LinRange(ext.X..., 400)
    +yrange = LinRange(ext.Y..., 400)
    +@time mean_values = barycentric_interpolate.(
    +    (MeanValue(),), # The barycentric coordinate algorithm (MeanValue is the only one for now)
    +    (Point2f.(polygon_points),), # The polygon points as \`Point2f\`
    +    (last.(polygon_points,),),   # The values per polygon point - can be anything which supports addition and division
    +    Point2f.(xrange, yrange')    # The points at which to interpolate
    +)
    +# and render!
    +hm = heatmap!(a2, xrange, yrange, mean_values; colormap = p1.colormap, colorrange = p1.plots[1].colorrange[], xautolimits = false, yautolimits = false)
    +translate!(hm, 0, 0, -1) # translate the heatmap behind the cropping polygon!
    +f # finally, display the figure

    Barycentric-coordinate API

    In some cases, we actually want barycentric interpolation, and have no interest in the coordinates themselves.

    However, the coordinates can be useful for debugging, and when performing 3D rendering, multiple barycentric values (depth, uv) are needed for depth buffering.

    julia
    const _VecTypes = Union{Tuple{Vararg{T, N}}, GeometryBasics.StaticArraysCore.StaticArray{Tuple{N}, T, 1}} where {N, T}
    +
    +"""
    +    abstract type AbstractBarycentricCoordinateMethod
    +
    +Abstract supertype for barycentric coordinate methods.
    +The subtypes may serve as dispatch types, or may cache
    +some information about the target polygon.
    +
    +# API
    +The following methods must be implemented for all subtypes:
    +- \`barycentric_coordinates!(λs::Vector{<: Real}, method::AbstractBarycentricCoordinateMethod, exterior::Vector{<: Point{2, T1}}, point::Point{2, T2})\`
    +- \`barycentric_interpolate(method::AbstractBarycentricCoordinateMethod, exterior::Vector{<: Point{2, T1}}, values::Vector{V}, point::Point{2, T2})::V\`
    +- \`barycentric_interpolate(method::AbstractBarycentricCoordinateMethod, exterior::Vector{<: Point{2, T1}}, interiors::Vector{<: Vector{<: Point{2, T1}}} values::Vector{V}, point::Point{2, T2})::V\`
    +The rest of the methods will be implemented in terms of these, and have efficient dispatches for broadcasting.
    +"""
    +abstract type AbstractBarycentricCoordinateMethod end
    +
    +Base.@propagate_inbounds function barycentric_coordinates!(λs::Vector{<: Real}, method::AbstractBarycentricCoordinateMethod, polypoints::AbstractVector{<: Point{N1, T1}}, point::Point{N2, T2}) where {N1, N2, T1 <: Real, T2 <: Real}
    +    @boundscheck @assert length(λs) == length(polypoints)
    +    @boundscheck @assert length(polypoints) >= 3
    +
    +    @error("Not implemented yet for method $(method).")
    +end
    +Base.@propagate_inbounds barycentric_coordinates!(λs::Vector{<: Real}, polypoints::AbstractVector{<: Point{N1, T1}}, point::Point{N2, T2}) where {N1, N2, T1 <: Real, T2 <: Real} = barycentric_coordinates!(λs, MeanValue(), polypoints, point)

    This is the GeoInterface-compatible method.

    julia
    """
    +    barycentric_coordinates!(λs::Vector{<: Real}, method::AbstractBarycentricCoordinateMethod, polygon, point)
    +
    +Loads the barycentric coordinates of \`point\` in \`polygon\` into \`λs\` using the barycentric coordinate method \`method\`.
    +
    +\`λs\` must be of the length of the polygon plus its holes.
    +
    +!!! tip
    +    Use this method to avoid excess allocations when you need to calculate barycentric coordinates for many points.
    +"""
    +Base.@propagate_inbounds function barycentric_coordinates!(λs::Vector{<: Real}, method::AbstractBarycentricCoordinateMethod, polygon, point)
    +    @assert GeoInterface.trait(polygon) isa GeoInterface.PolygonTrait
    +    @assert GeoInterface.trait(point) isa GeoInterface.PointTrait
    +    passable_polygon = GeoInterface.convert(GeometryBasics, polygon)
    +    @assert passable_polygon isa GeometryBasics.Polygon "The polygon was converted to a $(typeof(passable_polygon)), which is not a \`GeometryBasics.Polygon\`."
    +    passable_point = GeoInterface.convert(GeometryBasics, point)
    +    return barycentric_coordinates!(λs, method, passable_polygon, Point2(passable_point))
    +end
    +
    +Base.@propagate_inbounds function barycentric_coordinates(method::AbstractBarycentricCoordinateMethod, polypoints::AbstractVector{<: Point{N1, T1}}, point::Point{N2, T2}) where {N1, N2, T1 <: Real, T2 <: Real}
    +    λs = zeros(promote_type(T1, T2), length(polypoints))
    +    barycentric_coordinates!(λs, method, polypoints, point)
    +    return λs
    +end
    +Base.@propagate_inbounds barycentric_coordinates(polypoints::AbstractVector{<: Point{N1, T1}}, point::Point{N2, T2}) where {N1, N2, T1 <: Real, T2 <: Real} = barycentric_coordinates(MeanValue(), polypoints, point)

    This is the GeoInterface-compatible method.

    julia
    """
    +    barycentric_coordinates(method = MeanValue(), polygon, point)
    +
    +Returns the barycentric coordinates of \`point\` in \`polygon\` using the barycentric coordinate method \`method\`.
    +"""
    +Base.@propagate_inbounds function barycentric_coordinates(method::AbstractBarycentricCoordinateMethod, polygon, point)
    +    @assert GeoInterface.trait(polygon) isa GeoInterface.PolygonTrait
    +    @assert GeoInterface.trait(point) isa GeoInterface.PointTrait
    +    passable_polygon = GeoInterface.convert(GeometryBasics, polygon)
    +    @assert passable_polygon isa GeometryBasics.Polygon "The polygon was converted to a $(typeof(passable_polygon)), which is not a \`GeometryBasics.Polygon\`."
    +    passable_point = GeoInterface.convert(GeometryBasics, point)
    +    return barycentric_coordinates(method, passable_polygon, Point2(passable_point))
    +end
    +
    +Base.@propagate_inbounds function barycentric_interpolate(method::AbstractBarycentricCoordinateMethod, polypoints::AbstractVector{<: Point{N, T1}}, values::AbstractVector{V}, point::Point{N, T2}) where {N, T1 <: Real, T2 <: Real, V}
    +    @boundscheck @assert length(values) == length(polypoints)
    +    @boundscheck @assert length(polypoints) >= 3
    +    λs = barycentric_coordinates(method, polypoints, point)
    +    return sum(λs .* values)
    +end
    +Base.@propagate_inbounds barycentric_interpolate(polypoints::AbstractVector{<: Point{N, T1}}, values::AbstractVector{V}, point::Point{N, T2}) where {N, T1 <: Real, T2 <: Real, V} = barycentric_interpolate(MeanValue(), polypoints, values, point)
    +
    +Base.@propagate_inbounds function barycentric_interpolate(method::AbstractBarycentricCoordinateMethod, exterior::AbstractVector{<: Point{N, T1}}, interiors::AbstractVector{<: Point{N, T1}}, values::AbstractVector{V}, point::Point{N, T2}) where {N, T1 <: Real, T2 <: Real, V}
    +    @boundscheck @assert length(values) == length(exterior) + isempty(interiors) ? 0 : sum(length.(interiors))
    +    @boundscheck @assert length(exterior) >= 3
    +    λs = barycentric_coordinates(method, exterior, interiors, point)
    +    return sum(λs .* values)
    +end
    +Base.@propagate_inbounds barycentric_interpolate(exterior::AbstractVector{<: Point{N, T1}}, interiors::AbstractVector{<: Point{N, T1}}, values::AbstractVector{V}, point::Point{N, T2}) where {N, T1 <: Real, T2 <: Real, V} = barycentric_interpolate(MeanValue(), exterior, interiors, values, point)
    +
    +Base.@propagate_inbounds function barycentric_interpolate(method::AbstractBarycentricCoordinateMethod, polygon::Polygon{2, T1}, values::AbstractVector{V}, point::Point{2, T2}) where {T1 <: Real, T2 <: Real, V}
    +    exterior = decompose(Point{2, promote_type(T1, T2)}, polygon.exterior)
    +    if isempty(polygon.interiors)
    +        @boundscheck @assert length(values) == length(exterior)
    +        return barycentric_interpolate(method, exterior, values, point)
    +    else # the poly has interiors
    +        interiors = reverse.(decompose.((Point{2, promote_type(T1, T2)},), polygon.interiors))
    +        @boundscheck @assert length(values) == length(exterior) + sum(length.(interiors))
    +        return barycentric_interpolate(method, exterior, interiors, values, point)
    +    end
    +end
    +Base.@propagate_inbounds barycentric_interpolate(polygon::Polygon{2, T1}, values::AbstractVector{V}, point::Point{2, T2}) where {T1 <: Real, T2 <: Real, V} = barycentric_interpolate(MeanValue(), polygon, values, point)

    3D polygons are considered to have their vertices in the XY plane, and the Z coordinate must represent some value. This is to say that the Z coordinate is interpreted as an M coordinate.

    julia
    Base.@propagate_inbounds function barycentric_interpolate(method::AbstractBarycentricCoordinateMethod, polygon::Polygon{3, T1}, point::Point{2, T2}) where {T1 <: Real, T2 <: Real}
    +    exterior_point3s = decompose(Point{3, promote_type(T1, T2)}, polygon.exterior)
    +    exterior_values = getindex.(exterior_point3s, 3)
    +    exterior_points = Point2f.(exterior_point3s)
    +    if isempty(polygon.interiors)
    +        return barycentric_interpolate(method, exterior_points, exterior_values, point)
    +    else # the poly has interiors
    +        interior_point3s = decompose.((Point{3, promote_type(T1, T2)},), polygon.interiors)
    +        interior_values = collect(Iterators.flatten((getindex.(point3s, 3) for point3s in interior_point3s)))
    +        interior_points = map(point3s -> Point2f.(point3s), interior_point3s)
    +        return barycentric_interpolate(method, exterior_points, interior_points, vcat(exterior_values, interior_values), point)
    +    end
    +end
    +Base.@propagate_inbounds barycentric_interpolate(polygon::Polygon{3, T1}, point::Point{2, T2}) where {T1 <: Real, T2 <: Real} = barycentric_interpolate(MeanValue(), polygon, point)

    This method is the one which supports GeoInterface.

    julia
    """
    +    barycentric_interpolate(method = MeanValue(), polygon, values::AbstractVector{V}, point)
    +
    +Returns the interpolated value at \`point\` within \`polygon\` using the barycentric coordinate method \`method\`.
    +\`values\` are the per-point values for the polygon which are to be interpolated.
    +
    +Returns an object of type \`V\`.
    +
    +!!! warning
    +    Barycentric interpolation is currently defined only for 2-dimensional polygons.
    +    If you pass a 3-D polygon in, the Z coordinate will be used as per-vertex value to be interpolated
    +    (the M coordinate in GIS parlance).
    +"""
    +Base.@propagate_inbounds function barycentric_interpolate(method::AbstractBarycentricCoordinateMethod, polygon, values::AbstractVector{V}, point) where V
    +    @assert GeoInterface.trait(polygon) isa GeoInterface.PolygonTrait
    +    @assert GeoInterface.trait(point) isa GeoInterface.PointTrait
    +    passable_polygon = GeoInterface.convert(GeometryBasics, polygon)
    +    @assert passable_polygon isa GeometryBasics.Polygon "The polygon was converted to a $(typeof(passable_polygon)), which is not a \`GeometryBasics.Polygon\`."
    +    # first_poly_point = GeoInterface.getpoint(GeoInterface.getexterior(polygon))
    +    passable_point = GeoInterface.convert(GeometryBasics, point)
    +    return barycentric_interpolate(method, passable_polygon, Point2(passable_point))
    +end
    +Base.@propagate_inbounds barycentric_interpolate(polygon, values::AbstractVector{V}, point) where V = barycentric_interpolate(MeanValue(), polygon, values, point)
    +
    +"""
    +    weighted_mean(weight::Real, x1, x2)
    +
    +Returns the weighted mean of \`x1\` and \`x2\`, where \`weight\` is the weight of \`x1\`.
    +
    +Specifically, calculates \`x1 * weight + x2 * (1 - weight)\`.
    +
    +!!! note
    +    The idea for this method is that you can override this for custom types, like Color types, in extension modules.
    +"""
    +function weighted_mean(weight::WT, x1, x2) where {WT <: Real}
    +    return muladd(x1, weight, x2 * (oneunit(WT) - weight))
    +end
    +
    +
    +"""
    +    MeanValue() <: AbstractBarycentricCoordinateMethod
    +
    +This method calculates barycentric coordinates using the mean value method.
    +
    +# References
    +
    +"""
    +struct MeanValue <: AbstractBarycentricCoordinateMethod
    +end

    Before we go to the actual implementation, there are some quick and simple utility functions that we need to implement. These are mainly for convenience and code brevity.

    julia
    """
    +    _det(s1::Point2{T1}, s2::Point2{T2}) where {T1 <: Real, T2 <: Real}
    +
    +Returns the determinant of the matrix formed by \`hcat\`'ing two points \`s1\` and \`s2\`.
    +
    +Specifically, this is:
    +\`\`\`julia
    +s1[1] * s2[2] - s1[2] * s2[1]
    +\`\`\`
    +"""
    +function _det(s1::_VecTypes{2, T1}, s2::_VecTypes{2, T2}) where {T1 <: Real, T2 <: Real}
    +    return s1[1] * s2[2] - s1[2] * s2[1]
    +end
    +
    +"""
    +    t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)
    +
    +Returns the "T-value" as described in Hormann's presentation [^HormannPresentation] on how to calculate
    +the mean-value coordinate.
    +
    +Here, \`sᵢ\` is the vector from vertex \`vᵢ\` to the point, and \`rᵢ\` is the norm (length) of \`sᵢ\`.
    +\`s\` must be \`Point\` and \`r\` must be real numbers.
    +
    +\`\`\`math
    +tᵢ = \\\\frac{\\\\mathrm{det}\\\\left(sᵢ, sᵢ₊₁\\\\right)}{rᵢ * rᵢ₊₁ + sᵢ ⋅ sᵢ₊₁}
    +\`\`\`
    +
    +[^HormannPresentation]: K. Hormann and N. Sukumar. Generalized Barycentric Coordinates in Computer Graphics and Computational Mechanics. Taylor & Fancis, CRC Press, 2017.
    +\`\`\`
    +
    +"""
    +function t_value(sᵢ::_VecTypes{N, T1}, sᵢ₊₁::_VecTypes{N, T1}, rᵢ::T2, rᵢ₊₁::T2) where {N, T1 <: Real, T2 <: Real}
    +    return _det(sᵢ, sᵢ₊₁) / muladd(rᵢ, rᵢ₊₁, dot(sᵢ, sᵢ₊₁))
    +end
    +
    +
    +function barycentric_coordinates!(λs::Vector{<: Real}, ::MeanValue, polypoints::AbstractVector{<: Point{2, T1}}, point::Point{2, T2}) where {T1 <: Real, T2 <: Real}
    +    @boundscheck @assert length(λs) == length(polypoints)
    +    @boundscheck @assert length(polypoints) >= 3
    +    n_points = length(polypoints)
    +    # Initialize counters and register variables
    +    # Points - these are actually vectors from point to vertices
    +    #  polypoints[i-1], polypoints[i], polypoints[i+1]
    +    sᵢ₋₁ = polypoints[end] - point
    +    sᵢ   = polypoints[begin] - point
    +    sᵢ₊₁ = polypoints[begin+1] - point
    +    # radius / Euclidean distance between points.
    +    rᵢ₋₁ = norm(sᵢ₋₁)
    +    rᵢ   = norm(sᵢ  )
    +    rᵢ₊₁ = norm(sᵢ₊₁)
    +    # Perform the first computation explicitly, so we can cut down on
    +    # a mod in the loop.
    +    λs[1] = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +    # Loop through the rest of the vertices, compute, store in λs
    +    for i in 2:n_points
    +        # Increment counters + set variables
    +        sᵢ₋₁ = sᵢ
    +        sᵢ   = sᵢ₊₁
    +        sᵢ₊₁ = polypoints[mod1(i+1, n_points)] - point
    +        rᵢ₋₁ = rᵢ
    +        rᵢ   = rᵢ₊₁
    +        rᵢ₊₁ = norm(sᵢ₊₁) # radius / Euclidean distance between points.
    +        λs[i] = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +    end
    +    # Normalize λs to the 1-norm (sum=1)
    +    λs ./= sum(λs)
    +    return λs
    +end
    julia
    function barycentric_coordinates(::MeanValue, polypoints::NTuple{N, Point{2, T2}}, point::Point{2, T1},) where {N, T1, T2}
    +    ## Initialize counters and register variables
    +    ## Points - these are actually vectors from point to vertices
    +    ##  polypoints[i-1], polypoints[i], polypoints[i+1]
    +    sᵢ₋₁ = polypoints[end] - point
    +    sᵢ   = polypoints[begin] - point
    +    sᵢ₊₁ = polypoints[begin+1] - point
    +    ## radius / Euclidean distance between points.
    +    rᵢ₋₁ = norm(sᵢ₋₁)
    +    rᵢ   = norm(sᵢ  )
    +    rᵢ₊₁ = norm(sᵢ₊₁)
    +    λ₁ = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +    λs = ntuple(N) do i
    +        if i == 1
    +            return λ₁
    +        end
    +        ## Increment counters + set variables
    +        sᵢ₋₁ = sᵢ
    +        sᵢ   = sᵢ₊₁
    +        sᵢ₊₁ = polypoints[mod1(i+1, N)] - point
    +        rᵢ₋₁ = rᵢ
    +        rᵢ   = rᵢ₊₁
    +        rᵢ₊₁ = norm(sᵢ₊₁) # radius / Euclidean distance between points.
    +        return (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +    end
    +
    +    ∑λ = sum(λs)
    +
    +    return ntuple(N) do i
    +        λs[i] / ∑λ
    +    end
    +end

    This performs an inplace accumulation, using less memory and is faster. That's particularly good if you are using a polygon with a large number of points...

    julia
    function barycentric_interpolate(::MeanValue, polypoints::AbstractVector{<: Point{2, T1}}, values::AbstractVector{V}, point::Point{2, T2}) where {T1 <: Real, T2 <: Real, V}
    +    @boundscheck @assert length(values) == length(polypoints)
    +    @boundscheck @assert length(polypoints) >= 3
    +
    +    n_points = length(polypoints)
    +    # Initialize counters and register variables
    +    # Points - these are actually vectors from point to vertices
    +    #  polypoints[i-1], polypoints[i], polypoints[i+1]
    +    sᵢ₋₁ = polypoints[end] - point
    +    sᵢ   = polypoints[begin] - point
    +    sᵢ₊₁ = polypoints[begin+1] - point
    +    # radius / Euclidean distance between points.
    +    rᵢ₋₁ = norm(sᵢ₋₁)
    +    rᵢ   = norm(sᵢ  )
    +    rᵢ₊₁ = norm(sᵢ₊₁)
    +    # Now, we set the interpolated value to the first point's value, multiplied
    +    # by the weight computed relative to the first point in the polygon.
    +    wᵢ = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +    wₜₒₜ = wᵢ
    +    interpolated_value = values[begin] * wᵢ
    +    for i in 2:n_points
    +        # Increment counters + set variables
    +        sᵢ₋₁ = sᵢ
    +        sᵢ   = sᵢ₊₁
    +        sᵢ₊₁ = polypoints[mod1(i+1, n_points)] - point
    +        rᵢ₋₁ = rᵢ
    +        rᵢ   = rᵢ₊₁
    +        rᵢ₊₁ = norm(sᵢ₊₁)
    +        # Now, we calculate the weight:
    +        wᵢ = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +        # perform a weighted sum with the interpolated value:
    +        interpolated_value += values[i] * wᵢ
    +        # and add the weight to the total weight accumulator.
    +        wₜₒₜ += wᵢ
    +    end
    +    # Return the normalized interpolated value.
    +    return interpolated_value / wₜₒₜ
    +end

    When you have holes, then you have to be careful about the order you iterate around points.

    Specifically, you have to iterate around each linear ring separately and ensure there are no degenerate/repeated points at the start and end!

    julia
    function barycentric_interpolate(::MeanValue, exterior::AbstractVector{<: Point{N, T1}}, interiors::AbstractVector{<: AbstractVector{<: Point{N, T1}}}, values::AbstractVector{V}, point::Point{N, T2}) where {N, T1 <: Real, T2 <: Real, V}
    +    # @boundscheck @assert length(values) == (length(exterior) + isempty(interiors) ? 0 : sum(length.(interiors)))
    +    # @boundscheck @assert length(exterior) >= 3
    +
    +    current_index = 1
    +    l_exterior = length(exterior)
    +
    +    sᵢ₋₁ = exterior[end] - point
    +    sᵢ   = exterior[begin] - point
    +    sᵢ₊₁ = exterior[begin+1] - point
    +    rᵢ₋₁ = norm(sᵢ₋₁) # radius / Euclidean distance between points.
    +    rᵢ   = norm(sᵢ  ) # radius / Euclidean distance between points.
    +    rᵢ₊₁ = norm(sᵢ₊₁) # radius / Euclidean distance between points.

    Now, we set the interpolated value to the first point's value, multiplied by the weight computed relative to the first point in the polygon.

    julia
        wᵢ = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +    wₜₒₜ = wᵢ
    +    interpolated_value = values[begin] * wᵢ
    +
    +    for i in 2:l_exterior

    Increment counters + set variables

    julia
            sᵢ₋₁ = sᵢ
    +        sᵢ   = sᵢ₊₁
    +        sᵢ₊₁ = exterior[mod1(i+1, l_exterior)] - point
    +        rᵢ₋₁ = rᵢ
    +        rᵢ   = rᵢ₊₁
    +        rᵢ₊₁ = norm(sᵢ₊₁) # radius / Euclidean distance between points.
    +        wᵢ = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ

    Updates - first the interpolated value,

    julia
            interpolated_value += values[current_index] * wᵢ

    then the accumulators for total weight and current index.

    julia
            wₜₒₜ += wᵢ
    +        current_index += 1
    +
    +    end
    +    for hole in interiors
    +        l_hole = length(hole)
    +        sᵢ₋₁ = hole[end] - point
    +        sᵢ   = hole[begin] - point
    +        sᵢ₊₁ = hole[begin+1] - point
    +        rᵢ₋₁ = norm(sᵢ₋₁) # radius / Euclidean distance between points.
    +        rᵢ   = norm(sᵢ  ) # radius / Euclidean distance between points.
    +        rᵢ₊₁ = norm(sᵢ₊₁) # radius / Euclidean distance between points.
    +        # Now, we set the interpolated value to the first point's value, multiplied
    +        # by the weight computed relative to the first point in the polygon.
    +        wᵢ = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +
    +        interpolated_value += values[current_index] * wᵢ
    +
    +        wₜₒₜ += wᵢ
    +        current_index += 1
    +
    +        for i in 2:l_hole
    +            # Increment counters + set variables
    +            sᵢ₋₁ = sᵢ
    +            sᵢ   = sᵢ₊₁
    +            sᵢ₊₁ = hole[mod1(i+1, l_hole)] - point
    +            rᵢ₋₁ = rᵢ
    +            rᵢ   = rᵢ₊₁
    +            rᵢ₊₁ = norm(sᵢ₊₁) ## radius / Euclidean distance between points.
    +            wᵢ = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +            interpolated_value += values[current_index] * wᵢ
    +            wₜₒₜ += wᵢ
    +            current_index += 1
    +        end
    +    end
    +    return interpolated_value / wₜₒₜ
    +
    +end
    +
    +struct Wachspress <: AbstractBarycentricCoordinateMethod
    +end

    This page was generated using Literate.jl.

    `,35))])}const b=k(p,[["render",C]]);export{m as __pageData,b as default}; diff --git a/previews/PR239/assets/source_methods_buffer.md.Wvk7coQv.js b/previews/PR239/assets/source_methods_buffer.md.Wvk7coQv.js new file mode 100644 index 000000000..dde6ba167 --- /dev/null +++ b/previews/PR239/assets/source_methods_buffer.md.Wvk7coQv.js @@ -0,0 +1,11 @@ +import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"Buffer","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/buffer.md","filePath":"source/methods/buffer.md","lastUpdated":null}'),e={name:"source/methods/buffer.md"};function h(k,s,p,l,r,d){return t(),a("div",null,s[0]||(s[0]=[n(`

    Buffer

    Buffering a geometry means computing the region distance away from it, and returning that region as the new geometry.

    As of now, we only support GEOS as the backend, meaning that LibGEOS must be loaded.

    julia
    function buffer(geometry, distance; kwargs...)
    +    buffered = buffer(GEOS(; kwargs...), geometry, distance)
    +    return tuples(buffered)
    +end

    Below is an error handler similar to the others we have for e.g. segmentize, which checks if there is a method error for the geos backend.

    Add an error hint for buffer if LibGEOS is not loaded!

    julia
    function _buffer_error_hinter(io, exc, argtypes, kwargs)
    +    if isnothing(Base.get_extension(GeometryOps, :GeometryOpsLibGEOSExt)) && exc.f == buffer && first(argtypes) == GEOS
    +        print(io, "\\n\\nThe \`buffer\` method requires the LibGEOS.jl package to be explicitly loaded.\\n")
    +        print(io, "You can do this by simply typing ")
    +        printstyled(io, "using LibGEOS"; color = :cyan, bold = true)
    +        println(io, " in your REPL, \\nor otherwise loading LibGEOS.jl via using or import.")
    +    end
    +end

    This page was generated using Literate.jl.

    `,9)]))}const o=i(e,[["render",h]]);export{g as __pageData,o as default}; diff --git a/previews/PR239/assets/source_methods_buffer.md.Wvk7coQv.lean.js b/previews/PR239/assets/source_methods_buffer.md.Wvk7coQv.lean.js new file mode 100644 index 000000000..dde6ba167 --- /dev/null +++ b/previews/PR239/assets/source_methods_buffer.md.Wvk7coQv.lean.js @@ -0,0 +1,11 @@ +import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"Buffer","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/buffer.md","filePath":"source/methods/buffer.md","lastUpdated":null}'),e={name:"source/methods/buffer.md"};function h(k,s,p,l,r,d){return t(),a("div",null,s[0]||(s[0]=[n(`

    Buffer

    Buffering a geometry means computing the region distance away from it, and returning that region as the new geometry.

    As of now, we only support GEOS as the backend, meaning that LibGEOS must be loaded.

    julia
    function buffer(geometry, distance; kwargs...)
    +    buffered = buffer(GEOS(; kwargs...), geometry, distance)
    +    return tuples(buffered)
    +end

    Below is an error handler similar to the others we have for e.g. segmentize, which checks if there is a method error for the geos backend.

    Add an error hint for buffer if LibGEOS is not loaded!

    julia
    function _buffer_error_hinter(io, exc, argtypes, kwargs)
    +    if isnothing(Base.get_extension(GeometryOps, :GeometryOpsLibGEOSExt)) && exc.f == buffer && first(argtypes) == GEOS
    +        print(io, "\\n\\nThe \`buffer\` method requires the LibGEOS.jl package to be explicitly loaded.\\n")
    +        print(io, "You can do this by simply typing ")
    +        printstyled(io, "using LibGEOS"; color = :cyan, bold = true)
    +        println(io, " in your REPL, \\nor otherwise loading LibGEOS.jl via using or import.")
    +    end
    +end

    This page was generated using Literate.jl.

    `,9)]))}const o=i(e,[["render",h]]);export{g as __pageData,o as default}; diff --git a/previews/PR239/assets/source_methods_centroid.md.CPAUzyVU.js b/previews/PR239/assets/source_methods_centroid.md.CPAUzyVU.js new file mode 100644 index 000000000..32151a8fd --- /dev/null +++ b/previews/PR239/assets/source_methods_centroid.md.CPAUzyVU.js @@ -0,0 +1,93 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const t="/GeometryOps.jl/previews/PR239/assets/ibdeule.BD0hVfse.png",k="/GeometryOps.jl/previews/PR239/assets/cgnfnmo.DHcwB147.png",o=JSON.parse('{"title":"Centroid","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/centroid.md","filePath":"source/methods/centroid.md","lastUpdated":null}'),l={name:"source/methods/centroid.md"};function p(e,s,r,E,d,g){return h(),a("div",null,s[0]||(s[0]=[n(`

    Centroid

    julia
    export centroid, centroid_and_length, centroid_and_area

    What is the centroid?

    The centroid is the geometric center of a line string or area(s). Note that the centroid does not need to be inside of a concave area.

    Further note that by convention a line, or linear ring, is calculated by weighting the line segments by their length, while polygons and multipolygon centroids are calculated by weighting edge's by their 'area components'.

    To provide an example, consider this concave polygon in the shape of a 'C':

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +cshape = GI.Polygon([[(0,0), (0,3), (3,3), (3,2), (1,2), (1,1), (3,1), (3,0), (0,0)]])
    +f, a, p = poly(collect(GI.getpoint(cshape)); axis = (; aspect = DataAspect()))

    Let's see what the centroid looks like (plotted in red):

    julia
    cent = GO.centroid(cshape)
    +scatter!(GI.x(cent), GI.y(cent), color = :red)
    +f

    Implementation

    This is the GeoInterface-compatible implementation.

    First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait. This is also used in the implementation, since it's a lot less work!

    Note that if you call centroid on a LineString or LinearRing, the centroid_and_length function will be called due to the weighting scheme described above, while centroid_and_area is called for polygons and multipolygons. However, centroid_and_area can still be called on a LineString or LinearRing when they are closed, for example as the interior hole of a polygon.

    The helper functions centroid_and_length and centroid_and_area are made available just in case the user also needs the area or length to decrease repeat computation.

    julia
    """
    +    centroid(geom, [T=Float64])::Tuple{T, T}
    +
    +Returns the centroid of a given line segment, linear ring, polygon, or
    +mutlipolygon.
    +"""
    +centroid(geom, ::Type{T} = Float64; threaded=false) where T =
    +    centroid(GI.trait(geom), geom, T; threaded)
    +function centroid(
    +    trait::Union{GI.LineStringTrait, GI.LinearRingTrait}, geom, ::Type{T}=Float64; threaded=false
    +) where T
    +    centroid_and_length(trait, geom, T)[1]
    +end
    +centroid(trait, geom, ::Type{T}; threaded=false) where T =
    +    centroid_and_area(geom, T; threaded)[1]
    +
    +"""
    +    centroid_and_length(geom, [T=Float64])::(::Tuple{T, T}, ::Real)
    +
    +Returns the centroid and length of a given line/ring. Note this is only valid
    +for line strings and linear rings.
    +"""
    +centroid_and_length(geom, ::Type{T}=Float64) where T =
    +    centroid_and_length(GI.trait(geom), geom, T)
    +function centroid_and_length(
    +    ::Union{GI.LineStringTrait, GI.LinearRingTrait}, geom, ::Type{T},
    +) where T

    Initialize starting values

    julia
        xcentroid = T(0)
    +    ycentroid = T(0)
    +    length = T(0)
    +    point₁ = GI.getpoint(geom, 1)

    Loop over line segments of line string

    julia
        for point₂ in GI.getpoint(geom)

    Calculate length of line segment

    julia
            length_component = sqrt(
    +            (GI.x(point₂) - GI.x(point₁))^2 +
    +            (GI.y(point₂) - GI.y(point₁))^2
    +        )

    Accumulate the line segment length into length

    julia
            length += length_component

    Weighted average of line segment centroids

    julia
            xcentroid += (GI.x(point₁) + GI.x(point₂)) * (length_component / 2)
    +        ycentroid += (GI.y(point₁) + GI.y(point₂)) * (length_component / 2)
    +        #centroid = centroid .+ ((point₁ .+ point₂) .* (length_component / 2))

    Advance the point buffer by 1 point to move to next line segment

    julia
            point₁ = point₂
    +    end
    +    xcentroid /= length
    +    ycentroid /= length
    +    return (xcentroid, ycentroid), length
    +end
    +
    +"""
    +    centroid_and_area(geom, [T=Float64])::(::Tuple{T, T}, ::Real)
    +
    +Returns the centroid and area of a given geometry.
    +"""
    +function centroid_and_area(geom, ::Type{T}=Float64; threaded=false) where T
    +    target = TraitTarget{Union{GI.PolygonTrait,GI.LineStringTrait,GI.LinearRingTrait}}()
    +    init = (zero(T), zero(T)), zero(T)
    +    applyreduce(_combine_centroid_and_area, target, geom; threaded, init) do g
    +        _centroid_and_area(GI.trait(g), g, T)
    +    end
    +end
    +
    +function _centroid_and_area(
    +    ::Union{GI.LineStringTrait, GI.LinearRingTrait}, geom, ::Type{T}
    +) where T

    Check that the geometry is closed

    julia
        @assert(
    +        GI.getpoint(geom, 1) == GI.getpoint(geom, GI.ngeom(geom)),
    +        "centroid_and_area should only be used with closed geometries"
    +    )

    Initialize starting values

    julia
        xcentroid = T(0)
    +    ycentroid = T(0)
    +    area = T(0)
    +    point₁ = GI.getpoint(geom, 1)

    Loop over line segments of linear ring

    julia
        for point₂ in GI.getpoint(geom)
    +        area_component = GI.x(point₁) * GI.y(point₂) -
    +            GI.x(point₂) * GI.y(point₁)

    Accumulate the area component into area

    julia
            area += area_component

    Weighted average of centroid components

    julia
            xcentroid += (GI.x(point₁) + GI.x(point₂)) * area_component
    +        ycentroid += (GI.y(point₁) + GI.y(point₂)) * area_component

    Advance the point buffer by 1 point

    julia
            point₁ = point₂
    +    end
    +    area /= 2
    +    xcentroid /= 6area
    +    ycentroid /= 6area
    +    return (xcentroid, ycentroid), abs(area)
    +end
    +function _centroid_and_area(::GI.PolygonTrait, geom, ::Type{T}) where T

    Exterior ring's centroid and area

    julia
        (xcentroid, ycentroid), area = centroid_and_area(GI.getexterior(geom), T)

    Weight exterior centroid by area

    julia
        xcentroid *= area
    +    ycentroid *= area

    Loop over any holes within the polygon

    julia
        for hole in GI.gethole(geom)

    Hole polygon's centroid and area

    julia
            (xinterior, yinterior), interior_area = centroid_and_area(hole, T)

    Accumulate the area component into area

    julia
            area -= interior_area

    Weighted average of centroid components

    julia
            xcentroid -= xinterior * interior_area
    +        ycentroid -= yinterior * interior_area
    +    end
    +    xcentroid /= area
    +    ycentroid /= area
    +    return (xcentroid, ycentroid), area
    +end

    The op argument for _applyreduce and point / area It combines two (point, area) tuples into one, taking the average of the centroid points weighted by the area of the geom they are from.

    julia
    function _combine_centroid_and_area(((x1, y1), area1), ((x2, y2), area2))
    +    area = area1 + area2
    +    x = (x1 * area1 + x2 * area2) / area
    +    y = (y1 * area1 + y2 * area2) / area
    +    return (x, y), area
    +end

    This page was generated using Literate.jl.

    `,57)]))}const c=i(l,[["render",p]]);export{o as __pageData,c as default}; diff --git a/previews/PR239/assets/source_methods_centroid.md.CPAUzyVU.lean.js b/previews/PR239/assets/source_methods_centroid.md.CPAUzyVU.lean.js new file mode 100644 index 000000000..32151a8fd --- /dev/null +++ b/previews/PR239/assets/source_methods_centroid.md.CPAUzyVU.lean.js @@ -0,0 +1,93 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const t="/GeometryOps.jl/previews/PR239/assets/ibdeule.BD0hVfse.png",k="/GeometryOps.jl/previews/PR239/assets/cgnfnmo.DHcwB147.png",o=JSON.parse('{"title":"Centroid","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/centroid.md","filePath":"source/methods/centroid.md","lastUpdated":null}'),l={name:"source/methods/centroid.md"};function p(e,s,r,E,d,g){return h(),a("div",null,s[0]||(s[0]=[n(`

    Centroid

    julia
    export centroid, centroid_and_length, centroid_and_area

    What is the centroid?

    The centroid is the geometric center of a line string or area(s). Note that the centroid does not need to be inside of a concave area.

    Further note that by convention a line, or linear ring, is calculated by weighting the line segments by their length, while polygons and multipolygon centroids are calculated by weighting edge's by their 'area components'.

    To provide an example, consider this concave polygon in the shape of a 'C':

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +cshape = GI.Polygon([[(0,0), (0,3), (3,3), (3,2), (1,2), (1,1), (3,1), (3,0), (0,0)]])
    +f, a, p = poly(collect(GI.getpoint(cshape)); axis = (; aspect = DataAspect()))

    Let's see what the centroid looks like (plotted in red):

    julia
    cent = GO.centroid(cshape)
    +scatter!(GI.x(cent), GI.y(cent), color = :red)
    +f

    Implementation

    This is the GeoInterface-compatible implementation.

    First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait. This is also used in the implementation, since it's a lot less work!

    Note that if you call centroid on a LineString or LinearRing, the centroid_and_length function will be called due to the weighting scheme described above, while centroid_and_area is called for polygons and multipolygons. However, centroid_and_area can still be called on a LineString or LinearRing when they are closed, for example as the interior hole of a polygon.

    The helper functions centroid_and_length and centroid_and_area are made available just in case the user also needs the area or length to decrease repeat computation.

    julia
    """
    +    centroid(geom, [T=Float64])::Tuple{T, T}
    +
    +Returns the centroid of a given line segment, linear ring, polygon, or
    +mutlipolygon.
    +"""
    +centroid(geom, ::Type{T} = Float64; threaded=false) where T =
    +    centroid(GI.trait(geom), geom, T; threaded)
    +function centroid(
    +    trait::Union{GI.LineStringTrait, GI.LinearRingTrait}, geom, ::Type{T}=Float64; threaded=false
    +) where T
    +    centroid_and_length(trait, geom, T)[1]
    +end
    +centroid(trait, geom, ::Type{T}; threaded=false) where T =
    +    centroid_and_area(geom, T; threaded)[1]
    +
    +"""
    +    centroid_and_length(geom, [T=Float64])::(::Tuple{T, T}, ::Real)
    +
    +Returns the centroid and length of a given line/ring. Note this is only valid
    +for line strings and linear rings.
    +"""
    +centroid_and_length(geom, ::Type{T}=Float64) where T =
    +    centroid_and_length(GI.trait(geom), geom, T)
    +function centroid_and_length(
    +    ::Union{GI.LineStringTrait, GI.LinearRingTrait}, geom, ::Type{T},
    +) where T

    Initialize starting values

    julia
        xcentroid = T(0)
    +    ycentroid = T(0)
    +    length = T(0)
    +    point₁ = GI.getpoint(geom, 1)

    Loop over line segments of line string

    julia
        for point₂ in GI.getpoint(geom)

    Calculate length of line segment

    julia
            length_component = sqrt(
    +            (GI.x(point₂) - GI.x(point₁))^2 +
    +            (GI.y(point₂) - GI.y(point₁))^2
    +        )

    Accumulate the line segment length into length

    julia
            length += length_component

    Weighted average of line segment centroids

    julia
            xcentroid += (GI.x(point₁) + GI.x(point₂)) * (length_component / 2)
    +        ycentroid += (GI.y(point₁) + GI.y(point₂)) * (length_component / 2)
    +        #centroid = centroid .+ ((point₁ .+ point₂) .* (length_component / 2))

    Advance the point buffer by 1 point to move to next line segment

    julia
            point₁ = point₂
    +    end
    +    xcentroid /= length
    +    ycentroid /= length
    +    return (xcentroid, ycentroid), length
    +end
    +
    +"""
    +    centroid_and_area(geom, [T=Float64])::(::Tuple{T, T}, ::Real)
    +
    +Returns the centroid and area of a given geometry.
    +"""
    +function centroid_and_area(geom, ::Type{T}=Float64; threaded=false) where T
    +    target = TraitTarget{Union{GI.PolygonTrait,GI.LineStringTrait,GI.LinearRingTrait}}()
    +    init = (zero(T), zero(T)), zero(T)
    +    applyreduce(_combine_centroid_and_area, target, geom; threaded, init) do g
    +        _centroid_and_area(GI.trait(g), g, T)
    +    end
    +end
    +
    +function _centroid_and_area(
    +    ::Union{GI.LineStringTrait, GI.LinearRingTrait}, geom, ::Type{T}
    +) where T

    Check that the geometry is closed

    julia
        @assert(
    +        GI.getpoint(geom, 1) == GI.getpoint(geom, GI.ngeom(geom)),
    +        "centroid_and_area should only be used with closed geometries"
    +    )

    Initialize starting values

    julia
        xcentroid = T(0)
    +    ycentroid = T(0)
    +    area = T(0)
    +    point₁ = GI.getpoint(geom, 1)

    Loop over line segments of linear ring

    julia
        for point₂ in GI.getpoint(geom)
    +        area_component = GI.x(point₁) * GI.y(point₂) -
    +            GI.x(point₂) * GI.y(point₁)

    Accumulate the area component into area

    julia
            area += area_component

    Weighted average of centroid components

    julia
            xcentroid += (GI.x(point₁) + GI.x(point₂)) * area_component
    +        ycentroid += (GI.y(point₁) + GI.y(point₂)) * area_component

    Advance the point buffer by 1 point

    julia
            point₁ = point₂
    +    end
    +    area /= 2
    +    xcentroid /= 6area
    +    ycentroid /= 6area
    +    return (xcentroid, ycentroid), abs(area)
    +end
    +function _centroid_and_area(::GI.PolygonTrait, geom, ::Type{T}) where T

    Exterior ring's centroid and area

    julia
        (xcentroid, ycentroid), area = centroid_and_area(GI.getexterior(geom), T)

    Weight exterior centroid by area

    julia
        xcentroid *= area
    +    ycentroid *= area

    Loop over any holes within the polygon

    julia
        for hole in GI.gethole(geom)

    Hole polygon's centroid and area

    julia
            (xinterior, yinterior), interior_area = centroid_and_area(hole, T)

    Accumulate the area component into area

    julia
            area -= interior_area

    Weighted average of centroid components

    julia
            xcentroid -= xinterior * interior_area
    +        ycentroid -= yinterior * interior_area
    +    end
    +    xcentroid /= area
    +    ycentroid /= area
    +    return (xcentroid, ycentroid), area
    +end

    The op argument for _applyreduce and point / area It combines two (point, area) tuples into one, taking the average of the centroid points weighted by the area of the geom they are from.

    julia
    function _combine_centroid_and_area(((x1, y1), area1), ((x2, y2), area2))
    +    area = area1 + area2
    +    x = (x1 * area1 + x2 * area2) / area
    +    y = (y1 * area1 + y2 * area2) / area
    +    return (x, y), area
    +end

    This page was generated using Literate.jl.

    `,57)]))}const c=i(l,[["render",p]]);export{o as __pageData,c as default}; diff --git a/previews/PR239/assets/source_methods_clipping_clipping_processor.md.Ci1IQvdb.js b/previews/PR239/assets/source_methods_clipping_clipping_processor.md.Ci1IQvdb.js new file mode 100644 index 000000000..3ec0b2217 --- /dev/null +++ b/previews/PR239/assets/source_methods_clipping_clipping_processor.md.Ci1IQvdb.js @@ -0,0 +1,508 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"Polygon clipping helpers","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/clipping/clipping_processor.md","filePath":"source/methods/clipping/clipping_processor.md","lastUpdated":null}'),t={name:"source/methods/clipping/clipping_processor.md"};function p(l,s,k,e,E,r){return h(),a("div",null,s[0]||(s[0]=[n(`

    Polygon clipping helpers

    This file contains the shared helper functions for the polygon clipping functionalities.

    This enum defines which side of an edge a point is on

    julia
    @enum PointEdgeSide left=1 right=2 unknown=3

    Constants assigned for readability

    julia
    const enter, exit = true, false
    +const crossing, bouncing = true, false
    +
    +#= A point can either be the start or end of an overlapping chain of points between two
    +polygons, or not an endpoint of a chain. =#
    +@enum EndPointType start_chain=1 end_chain=2 not_endpoint=3
    +
    +#= This is the struct that makes up a_list and b_list. Many values are only used if point is
    +an intersection point (ipt). =#
    +@kwdef struct PolyNode{T <: AbstractFloat}
    +    point::Tuple{T,T}          # (x, y) values of given point
    +    inter::Bool = false        # If ipt, true, else 0
    +    neighbor::Int = 0          # If ipt, index of equivalent point in a_list or b_list, else 0
    +    idx::Int = 0               # If crossing point, index within sorted a_idx_list
    +    ent_exit::Bool = false     # If ipt, true if enter and false if exit, else false
    +    crossing::Bool = false     # If ipt, true if intersection crosses from out/in polygon, else false
    +    endpoint::EndPointType = not_endpoint # If ipt, denotes if point is the start or end of an overlapping chain
    +    fracs::Tuple{T,T} = (0., 0.) # If ipt, fractions along edges to ipt (a_frac, b_frac), else (0, 0)
    +end
    +
    +#= Create a new node with all of the same field values as the given PolyNode unless
    +alternative values are provided, in which case those should be used. =#
    +PolyNode(node::PolyNode{T};
    +    point = node.point, inter = node.inter, neighbor = node.neighbor, idx = node.idx,
    +    ent_exit = node.ent_exit, crossing = node.crossing, endpoint = node.endpoint,
    +    fracs = node.fracs,
    +) where T = PolyNode{T}(;
    +    point = point, inter = inter, neighbor = neighbor, idx = idx, ent_exit = ent_exit,
    +    crossing = crossing, endpoint = endpoint, fracs = fracs)

    Checks equality of two PolyNodes by backing point value, fractional value, and intersection status

    julia
    equals(pn1::PolyNode, pn2::PolyNode) = pn1.point == pn2.point && pn1.inter == pn2.inter && pn1.fracs == pn2.fracs
    _build_ab_list(::Type{T}, poly_a, poly_b, delay_cross_f, delay_bounce_f; exact) ->
    +    (a_list, b_list, a_idx_list)

    This function takes in two polygon rings and calls '_build_a_list', '_build_b_list', and '_flag_ent_exit' in order to fully form a_list and b_list. The 'a_list' and 'b_list' that it returns are the fully updated vectors of PolyNodes that represent the rings 'poly_a' and 'poly_b', respectively. This function also returns 'a_idx_list', which at its "ith" index stores the index in 'a_list' at which the "ith" intersection point lies.

    julia
    function _build_ab_list(::Type{T}, poly_a, poly_b, delay_cross_f::F1, delay_bounce_f::F2; exact) where {T, F1, F2}

    Make a list for nodes of each polygon

    julia
        a_list, a_idx_list, n_b_intrs = _build_a_list(T, poly_a, poly_b; exact)
    +    b_list = _build_b_list(T, a_idx_list, a_list, n_b_intrs, poly_b)

    Flag crossings

    julia
        _classify_crossing!(T, a_list, b_list; exact)

    Flag the entry and exits

    julia
        _flag_ent_exit!(T, GI.LinearRingTrait(), poly_b, a_list, delay_cross_f, Base.Fix2(delay_bounce_f, true); exact)
    +    _flag_ent_exit!(T, GI.LinearRingTrait(), poly_a, b_list, delay_cross_f, Base.Fix2(delay_bounce_f, false); exact)

    Set node indices and filter a_idx_list to just crossing points

    julia
        _index_crossing_intrs!(a_list, b_list, a_idx_list)
    +
    +    return a_list, b_list, a_idx_list
    +end
    _build_a_list(::Type{T}, poly_a, poly_b) -> (a_list, a_idx_list)

    This function take in two polygon rings and creates a vector of PolyNodes to represent poly_a, including its intersection points with poly_b. The information stored in each PolyNode is needed for clipping using the Greiner-Hormann clipping algorithm.

    Note: After calling this function, a_list is not fully formed because the neighboring indices of the intersection points in b_list still need to be updated. Also we still have not update the entry and exit flags for a_list.

    The a_idx_list is a list of the indices of intersection points in a_list. The value at index i of a_idx_list is the location in a_list where the ith intersection point lies.

    julia
    function _build_a_list(::Type{T}, poly_a, poly_b; exact) where T
    +    n_a_edges = _nedge(poly_a)
    +    a_list = PolyNode{T}[]  # list of points in poly_a
    +    sizehint!(a_list, n_a_edges)
    +    a_idx_list = Vector{Int}()  # finds indices of intersection points in a_list
    +    a_count = 0  # number of points added to a_list
    +    n_b_intrs = 0

    Loop through points of poly_a

    julia
        local a_pt1
    +    for (i, a_p2) in enumerate(GI.getpoint(poly_a))
    +        a_pt2 = (T(GI.x(a_p2)), T(GI.y(a_p2)))
    +        if i <= 1 || (a_pt1 == a_pt2)  # don't repeat points
    +            a_pt1 = a_pt2
    +            continue
    +        end

    Add the first point of the edge to the list of points in a_list

    julia
            new_point = PolyNode{T}(;point = a_pt1)
    +        a_count += 1
    +        push!(a_list, new_point)

    Find intersections with edges of poly_b

    julia
            local b_pt1
    +        prev_counter = a_count
    +        for (j, b_p2) in enumerate(GI.getpoint(poly_b))
    +            b_pt2 = _tuple_point(b_p2, T)
    +            if j <= 1 || (b_pt1 == b_pt2)  # don't repeat points
    +                b_pt1 = b_pt2
    +                continue
    +            end

    Determine if edges intersect and how they intersect

    julia
                line_orient, intr1, intr2 = _intersection_point(T, (a_pt1, a_pt2), (b_pt1, b_pt2); exact)
    +            if line_orient != line_out  # edges intersect
    +                if line_orient == line_cross  # Intersection point that isn't a vertex
    +                    int_pt, fracs = intr1
    +                    new_intr = PolyNode{T}(;
    +                        point = int_pt, inter = true, neighbor = j - 1,
    +                        crossing = true, fracs = fracs,
    +                    )
    +                    a_count += 1
    +                    n_b_intrs += 1
    +                    push!(a_list, new_intr)
    +                    push!(a_idx_list, a_count)
    +                else
    +                    (_, (α1, β1)) = intr1

    Determine if a1 or b1 should be added to a_list

    julia
                        add_a1 = α1 == 0 && 0 β1 < 1
    +                    a1_β = add_a1 ? β1 : zero(T)
    +                    add_b1 = β1 == 0 && 0 < α1 < 1
    +                    b1_α = add_b1 ? α1 : zero(T)

    If lines are collinear and overlapping, a second intersection exists

    julia
                        if line_orient == line_over
    +                        (_, (α2, β2)) = intr2
    +                        if α2 == 0 && 0 β2 < 1
    +                            add_a1, a1_β = true, β2
    +                        end
    +                        if β2 == 0 && 0 < α2 < 1
    +                            add_b1, b1_α = true, α2
    +                        end
    +                    end

    Add intersection points determined above

    julia
                        if add_a1
    +                        n_b_intrs += a1_β == 0 ? 0 : 1
    +                        a_list[prev_counter] = PolyNode{T}(;
    +                            point = a_pt1, inter = true, neighbor = j - 1,
    +                            fracs = (zero(T), a1_β),
    +                        )
    +                        push!(a_idx_list, prev_counter)
    +                    end
    +                    if add_b1
    +                        new_intr = PolyNode{T}(;
    +                            point = b_pt1, inter = true, neighbor = j - 1,
    +                            fracs = (b1_α, zero(T)),
    +                        )
    +                        a_count += 1
    +                        push!(a_list, new_intr)
    +                        push!(a_idx_list, a_count)
    +                    end
    +                end
    +            end
    +            b_pt1 = b_pt2
    +        end

    Order intersection points by placement along edge using fracs value

    julia
            if prev_counter < a_count
    +            Δintrs = a_count - prev_counter
    +            inter_points = @view a_list[(a_count - Δintrs + 1):a_count]
    +            sort!(inter_points, by = x -> x.fracs[1])
    +        end
    +        a_pt1 = a_pt2
    +    end
    +    return a_list, a_idx_list, n_b_intrs
    +end
    _build_b_list(::Type{T}, a_idx_list, a_list, poly_b) -> b_list

    This function takes in the a_list and a_idx_list build in _build_a_list and poly_b and creates a vector of PolyNodes to represent poly_b. The information stored in each PolyNode is needed for clipping using the Greiner-Hormann clipping algorithm.

    Note: after calling this function, b_list is not fully updated. The entry/exit flags still need to be updated. However, the neighbor value in a_list is now updated.

    julia
    function _build_b_list(::Type{T}, a_idx_list, a_list, n_b_intrs, poly_b) where T

    Sort intersection points by insertion order in b_list

    julia
        sort!(a_idx_list, by = x-> a_list[x].neighbor + a_list[x].fracs[2])

    Initialize needed values and lists

    julia
        n_b_edges = _nedge(poly_b)
    +    n_intr_pts = length(a_idx_list)
    +    b_list = PolyNode{T}[]
    +    sizehint!(b_list, n_b_edges + n_b_intrs)
    +    intr_curr = 1
    +    b_count = 0

    Loop over points in poly_b and add each point and intersection point

    julia
        local b_pt1
    +    for (i, b_p2) in enumerate(GI.getpoint(poly_b))
    +        b_pt2 = _tuple_point(b_p2, T)
    +        if i  1 || (b_pt1 == b_pt2)  # don't repeat points
    +            b_pt1 = b_pt2
    +            continue
    +        end
    +        b_count += 1
    +        push!(b_list, PolyNode{T}(; point = b_pt1))
    +        if intr_curr  n_intr_pts
    +            curr_idx = a_idx_list[intr_curr]
    +            curr_node = a_list[curr_idx]
    +            prev_counter = b_count
    +            while curr_node.neighbor == i - 1  # Add all intersection points on current edge
    +                b_idx = 0
    +                new_intr = PolyNode(curr_node; neighbor = curr_idx)
    +                if curr_node.fracs[2] == 0  # if curr_node is segment start point

    intersection point is vertex of b

    julia
                        b_idx = prev_counter
    +                    b_list[b_idx] = new_intr
    +                else
    +                    b_count += 1
    +                    b_idx = b_count
    +                    push!(b_list, new_intr)
    +                end
    +                a_list[curr_idx] = PolyNode(curr_node; neighbor = b_idx)
    +                intr_curr += 1
    +                intr_curr > n_intr_pts && break
    +                curr_idx = a_idx_list[intr_curr]
    +                curr_node = a_list[curr_idx]
    +            end
    +        end
    +        b_pt1 = b_pt2
    +    end
    +    sort!(a_idx_list)  # return a_idx_list to order of points in a_list
    +    return b_list
    +end
    _classify_crossing!(T, poly_b, a_list; exact)

    This function marks all intersection points as either bouncing or crossing points. "Delayed" crossing or bouncing intersections (a chain of edges where the central edges overlap and thus only the first and last edge of the chain determine if the chain is bounding or crossing) are marked as follows: the first and the last points are marked as crossing if the chain is crossing and delayed otherwise and all middle points are marked as bouncing. Additionally, the start and end points of the chain are marked as endpoints using the endpoints field.

    julia
    function _classify_crossing!(::Type{T}, a_list, b_list; exact) where T
    +    napts = length(a_list)
    +    nbpts = length(b_list)

    start centered on last point

    julia
        a_prev = a_list[end - 1]
    +    curr_pt = a_list[end]
    +    i = napts

    keep track of unmatched bouncing chains

    julia
        start_chain_edge, start_chain_idx = unknown, 0
    +    unmatched_end_chain_edge, unmatched_end_chain_idx = unknown, 0
    +    same_winding = true

    loop over list points

    julia
        for next_idx in 1:napts
    +        a_next = a_list[next_idx]
    +        if curr_pt.inter && !curr_pt.crossing
    +            j = curr_pt.neighbor
    +            b_prev = j == 1 ? b_list[end] : b_list[j-1]
    +            b_next = j == nbpts ? b_list[1] : b_list[j+1]

    determine if any segments are on top of one another

    julia
                a_prev_is_b_prev = a_prev.inter && equals(a_prev, b_prev)
    +            a_prev_is_b_next = a_prev.inter && equals(a_prev, b_next)
    +            a_next_is_b_prev = a_next.inter && equals(a_next, b_prev)
    +            a_next_is_b_next = a_next.inter && equals(a_next, b_next)

    determine which side of a segments the p points are on

    julia
                b_prev_side, b_next_side = _get_sides(b_prev, b_next, a_prev, curr_pt, a_next,
    +                i, j, a_list, b_list; exact)

    no sides overlap

    julia
                if !a_prev_is_b_prev && !a_prev_is_b_next && !a_next_is_b_prev && !a_next_is_b_next
    +                if b_prev_side != b_next_side  # lines cross
    +                    a_list[i] = PolyNode(curr_pt; crossing = true)
    +                    b_list[j] = PolyNode(b_list[j]; crossing = true)
    +                end

    end of overlapping chain

    julia
                elseif !a_next_is_b_prev && !a_next_is_b_next
    +                b_side = a_prev_is_b_prev ? b_next_side : b_prev_side
    +                if start_chain_edge == unknown  # start loop on overlapping chain
    +                    unmatched_end_chain_edge = b_side
    +                    unmatched_end_chain_idx = i
    +                    same_winding = a_prev_is_b_prev
    +                else  # close overlapping chain

    update end of chain with endpoint and crossing / bouncing tags

    julia
                        crossing = b_side != start_chain_edge
    +                    a_list[i] = PolyNode(curr_pt;
    +                        crossing = crossing,
    +                        endpoint = end_chain,
    +                    )
    +                    b_list[j] = PolyNode(b_list[j];
    +                        crossing = crossing,
    +                        endpoint = same_winding ? end_chain : start_chain,
    +                    )

    update start of chain with endpoint and crossing / bouncing tags

    julia
                        start_pt = a_list[start_chain_idx]
    +                    a_list[start_chain_idx] = PolyNode(start_pt;
    +                        crossing = crossing,
    +                        endpoint = start_chain,
    +                    )
    +                    b_list[start_pt.neighbor] = PolyNode(b_list[start_pt.neighbor];
    +                        crossing = crossing,
    +                        endpoint = same_winding ? start_chain : end_chain,
    +                    )
    +                end

    start of overlapping chain

    julia
                elseif !a_prev_is_b_prev && !a_prev_is_b_next
    +                b_side = a_next_is_b_prev ? b_next_side : b_prev_side
    +                start_chain_edge = b_side
    +                start_chain_idx = i
    +                same_winding = a_next_is_b_next
    +            end
    +        end
    +        a_prev = curr_pt
    +        curr_pt = a_next
    +        i = next_idx
    +    end

    if we started in the middle of overlapping chain, close chain

    julia
        if unmatched_end_chain_edge != unknown
    +        crossing = unmatched_end_chain_edge != start_chain_edge

    update end of chain with endpoint and crossing / bouncing tags

    julia
            end_chain_pt = a_list[unmatched_end_chain_idx]
    +        a_list[unmatched_end_chain_idx] = PolyNode(end_chain_pt;
    +            crossing = crossing,
    +            endpoint = end_chain,
    +        )
    +        b_list[end_chain_pt.neighbor] = PolyNode(b_list[end_chain_pt.neighbor];
    +            crossing = crossing,
    +            endpoint = same_winding ? end_chain : start_chain,
    +        )

    update start of chain with endpoint and crossing / bouncing tags

    julia
            start_pt = a_list[start_chain_idx]
    +        a_list[start_chain_idx] = PolyNode(start_pt;
    +            crossing = crossing,
    +            endpoint = start_chain,
    +        )
    +        b_list[start_pt.neighbor] = PolyNode(b_list[start_pt.neighbor];
    +            crossing = crossing,
    +            endpoint = same_winding ? start_chain : end_chain,
    +        )
    +    end
    +end

    Check if PolyNode is a vertex of original polygon

    julia
    _is_vertex(pt) = !pt.inter || pt.fracs[1] == 0 || pt.fracs[1] == 1 || pt.fracs[2] == 0 || pt.fracs[2] == 1
    +
    +#= Determines which side (right or left) of the segment a_prev-curr_pt-a_next the points
    +b_prev and b_next are on. Given this is only called when curr_pt is an intersection point
    +that wasn't initially classified as crossing, we know that curr_pt is either from a hinge or
    +overlapping intersection and thus is an original vertex of either poly_a or poly_b. Due to
    +floating point error when calculating new intersection points, we only want to use original
    +vertices to determine orientation. Thus, for other points, find nearest point that is a
    +vertex. Given other intersection points will be collinear along existing segments, this
    +won't change the orientation. =#
    +function _get_sides(b_prev, b_next, a_prev, curr_pt, a_next, i, j, a_list, b_list; exact)
    +    b_prev_pt = if _is_vertex(b_prev)
    +        b_prev.point
    +    else  # Find original start point of segment formed by b_prev and curr_pt
    +        prev_idx = findprev(_is_vertex, b_list, j - 1)
    +        prev_idx = isnothing(prev_idx) ? findlast(_is_vertex, b_list) : prev_idx
    +        b_list[prev_idx].point
    +    end
    +    b_next_pt = if _is_vertex(b_next)
    +        b_next.point
    +    else  # Find original end point of segment formed by curr_pt and b_next
    +        next_idx = findnext(_is_vertex, b_list, j + 1)
    +        next_idx = isnothing(next_idx) ? findfirst(_is_vertex, b_list) : next_idx
    +        b_list[next_idx].point
    +    end
    +    a_prev_pt = if _is_vertex(a_prev)
    +        a_prev.point
    +    else   # Find original start point of segment formed by a_prev and curr_pt
    +        prev_idx = findprev(_is_vertex, a_list, i - 1)
    +        prev_idx = isnothing(prev_idx) ? findlast(_is_vertex, a_list) : prev_idx
    +        a_list[prev_idx].point
    +    end
    +    a_next_pt = if _is_vertex(a_next)
    +        a_next.point
    +    else  # Find original end point of segment formed by curr_pt and a_next
    +        next_idx = findnext(_is_vertex, a_list, i + 1)
    +        next_idx = isnothing(next_idx) ? findfirst(_is_vertex, a_list) : next_idx
    +        a_list[next_idx].point
    +    end

    Determine side orientation of b_prev and b_next

    julia
        b_prev_side = _get_side(b_prev_pt, a_prev_pt, curr_pt.point, a_next_pt; exact)
    +    b_next_side = _get_side(b_next_pt, a_prev_pt, curr_pt.point, a_next_pt; exact)
    +    return b_prev_side, b_next_side
    +end

    Determines if Q lies to the left or right of the line formed by P1-P2-P3

    julia
    function _get_side(Q, P1, P2, P3; exact)
    +    s1 = Predicates.orient(Q, P1, P2; exact)
    +    s2 = Predicates.orient(Q, P2, P3; exact)
    +    s3 = Predicates.orient(P1, P2, P3; exact)
    +
    +    side = if s3  0
    +        (s1 < 0) || (s2 < 0) ? right : left
    +    else #  s3 < 0
    +        (s1 > 0) || (s2 > 0) ? left : right
    +    end
    +    return side
    +end
    +
    +#= Given a list of PolyNodes, find the first element that isn't an intersection point. Then,
    +test if this element is in or out of the given polygon. Return the next index, as well as
    +the enter/exit status of the next intersection point (the opposite of the in/out check). If
    +all points are intersection points, find the first element that either is the end of a chain
    +or a crossing point that isn't in a chain. Then take the midpoint of this point and the next
    +point in the list and perform the in/out check. If none of these points exist, return
    +a \`next_idx\` of \`nothing\`. =#
    +function _pt_off_edge_status(::Type{T}, pt_list, poly, npts; exact) where T
    +    start_idx, is_non_intr_pt = findfirst(_is_not_intr, pt_list), true
    +    if isnothing(start_idx)
    +        start_idx, is_non_intr_pt = findfirst(_next_edge_off, pt_list), false
    +        isnothing(start_idx) && return (start_idx, false)
    +    end
    +    next_idx = start_idx < npts ? (start_idx + 1) : 1
    +    start_pt = if is_non_intr_pt
    +        pt_list[start_idx].point
    +    else
    +        (pt_list[start_idx].point .+ pt_list[next_idx].point) ./ 2
    +    end
    +    start_status = !_point_filled_curve_orientation(start_pt, poly; in = true, on = false, out = false, exact)
    +    return next_idx, start_status
    +end

    Check if a PolyNode is an intersection point

    julia
    _is_not_intr(pt) = !pt.inter
    +#= Check if a PolyNode is the last point of a chain or a non-overlapping crossing point.
    +The next midpoint of one of these points and the next point within a polygon must not be on
    +the polygon edge. =#
    +_next_edge_off(pt) = (pt.endpoint == end_chain) || (pt.crossing && pt.endpoint == not_endpoint)
    _flag_ent_exit!(::Type{T}, ::GI.LinearRingTrait, poly, pt_list, delay_cross_f, delay_bounce_f; exact)

    This function flags all the intersection points as either an 'entry' or 'exit' point in relation to the given polygon. For non-delayed crossings we simply alternate the enter/exit status. This also holds true for the first and last points of a delayed bouncing, where they both have an opposite entry/exit flag. Conversely, the first and last point of a delayed crossing have the same entry/exit status. Furthermore, the crossing/bouncing flag of delayed crossings and bouncings may be updated. This depends on function specific rules that determine which of the start or end points (if any) should be marked as crossing for used during polygon tracing. A consistent rule is that the start and end points of a delayed crossing will have different crossing/bouncing flags, while a the endpoints of a delayed bounce will be the same.

    Used for clipping polygons by other polygons.

    julia
    function _flag_ent_exit!(::Type{T}, ::GI.LinearRingTrait, poly, pt_list, delay_cross_f, delay_bounce_f; exact) where T
    +    npts = length(pt_list)

    Find starting index if there is one

    julia
        next_idx, status = _pt_off_edge_status(T, pt_list, poly, npts; exact)
    +    isnothing(next_idx) && return
    +    start_idx = next_idx - 1

    Loop over points and mark entry and exit status

    julia
        start_chain_idx = 0
    +    for ii in Iterators.flatten((next_idx:npts, 1:start_idx))
    +        curr_pt = pt_list[ii]
    +        if curr_pt.endpoint == start_chain
    +            start_chain_idx = ii
    +        elseif curr_pt.crossing || curr_pt.endpoint == end_chain
    +            start_crossing, end_crossing = curr_pt.crossing, curr_pt.crossing
    +            if curr_pt.endpoint == end_chain  # ending overlapping chain
    +                start_pt = pt_list[start_chain_idx]
    +                if curr_pt.crossing  # delayed crossing
    +                    #= start and end crossing status are different and depend on current
    +                    entry/exit status =#
    +                    start_crossing, end_crossing = delay_cross_f(status)
    +                else  # delayed bouncing
    +                    next_idx = ii < npts ? (ii + 1) : 1
    +                    next_val = (curr_pt.point .+ pt_list[next_idx].point) ./ 2
    +                    pt_in_poly = _point_filled_curve_orientation(next_val, poly; in = true, on = false, out = false, exact)
    +                    #= start and end crossing status are the same and depend on if adjacent
    +                    edges of pt_list are within poly =#
    +                    start_crossing = delay_bounce_f(pt_in_poly)
    +                    end_crossing = start_crossing
    +                end

    update start of chain point

    julia
                    pt_list[start_chain_idx] = PolyNode(start_pt; ent_exit = status, crossing = start_crossing)
    +                if !curr_pt.crossing
    +                    status = !status
    +                end
    +            end
    +            pt_list[ii] = PolyNode(curr_pt; ent_exit = status, crossing = end_crossing)
    +            status = !status
    +        end
    +    end
    +    return
    +end
    _flag_ent_exit!(::GI.LineTrait, line, pt_list; exact)

    This function flags all the intersection points as either an 'entry' or 'exit' point in relation to the given line. Returns true if there are crossing points to classify, else returns false. Used for cutting polygons by lines.

    Assumes that the first point is outside of the polygon and not on an edge.

    julia
    function _flag_ent_exit!(::GI.LineTrait, poly, pt_list; exact)
    +    status = !_point_filled_curve_orientation(pt_list[1].point, poly; in = true, on = false, out = false, exact)

    Loop over points and mark entry and exit status

    julia
        for (ii, curr_pt) in enumerate(pt_list)
    +        if curr_pt.crossing
    +            pt_list[ii] = PolyNode(curr_pt; ent_exit = status)
    +            status = !status
    +        end
    +    end
    +    return
    +end
    +
    +#= Filters a_idx_list to just include crossing points and sets the index of all crossing
    +points (which element they correspond to within a_idx_list). =#
    +function _index_crossing_intrs!(a_list, b_list, a_idx_list)
    +    filter!(x -> a_list[x].crossing, a_idx_list)
    +    for (i, a_idx) in enumerate(a_idx_list)
    +        curr_node = a_list[a_idx]
    +        neighbor_node = b_list[curr_node.neighbor]
    +        a_list[a_idx] = PolyNode(curr_node; idx = i)
    +        b_list[curr_node.neighbor] = PolyNode(neighbor_node; idx = i)
    +    end
    +    return
    +end
    _trace_polynodes(::Type{T}, a_list, b_list, a_idx_list, f_step)::Vector{GI.Polygon}

    This function takes the outputs of _build_ab_list and traces the lists to determine which polygons are formed as described in Greiner and Hormann. The function f_step determines in which direction the lists are traced. This function is different for intersection, difference, and union. f_step must take in two arguments: the most recent intersection node's entry/exit status and a boolean that is true if we are currently tracing a_list and false if we are tracing b_list. The functions used for each clipping operation are follows: - Intersection: (x, y) -> x ? 1 : (-1) - Difference: (x, y) -> (x ⊻ y) ? 1 : (-1) - Union: (x, y) -> x ? (-1) : 1

    A list of GeoInterface polygons is returned from this function.

    Note: poly_a and poly_b are temporary inputs used for debugging and can be removed eventually.

    julia
    function _trace_polynodes(::Type{T}, a_list, b_list, a_idx_list, f_step, poly_a, poly_b) where T
    +    n_a_pts, n_b_pts = length(a_list), length(b_list)
    +    total_pts = n_a_pts + n_b_pts
    +    n_cross_pts = length(a_idx_list)
    +    return_polys = Vector{_get_poly_type(T)}(undef, 0)

    Keep track of number of processed intersection points

    julia
        visited_pts = 0
    +    processed_pts = 0
    +    first_idx = 1
    +    while processed_pts < n_cross_pts
    +        curr_list, curr_npoints = a_list, n_a_pts
    +        on_a_list = true

    Find first unprocessed intersecting point in subject polygon

    julia
            visited_pts += 1
    +        processed_pts += 1
    +        first_idx = findnext(x -> x != 0, a_idx_list, first_idx)
    +        idx = a_idx_list[first_idx]
    +        a_idx_list[first_idx] = 0
    +        start_pt = a_list[idx]

    Set first point in polygon

    julia
            curr = curr_list[idx]
    +        pt_list = [curr.point]
    +
    +        curr_not_start = true
    +        while curr_not_start
    +            step = f_step(curr.ent_exit, on_a_list)

    changed curr_not_intr to curr_not_same_ent_flag

    julia
                same_status, prev_status = true, curr.ent_exit
    +            while same_status
    +                @assert visited_pts < total_pts "Clipping tracing hit every point - clipping error. Please open an issue with polygons: $(GI.coordinates(poly_a)) and $(GI.coordinates(poly_b))."

    Traverse polygon either forwards or backwards

    julia
                    idx += step
    +                idx = (idx > curr_npoints) ? mod(idx, curr_npoints) : idx
    +                idx = (idx == 0) ? curr_npoints : idx

    Get current node and add to pt_list

    julia
                    curr = curr_list[idx]
    +                push!(pt_list, curr.point)
    +                if (curr.crossing || curr.endpoint != not_endpoint)

    Keep track of processed intersection points

    julia
                        same_status = curr.ent_exit == prev_status
    +                    curr_not_start = curr != start_pt && curr != b_list[start_pt.neighbor]
    +                    !curr_not_start && break
    +                    if (on_a_list && curr.crossing) || (!on_a_list && a_list[curr.neighbor].crossing)
    +                        processed_pts += 1
    +                        a_idx_list[curr.idx] = 0
    +                    end
    +                end
    +                visited_pts += 1
    +            end

    Switch to next list and next point

    julia
                curr_list, curr_npoints = on_a_list ? (b_list, n_b_pts) : (a_list, n_a_pts)
    +            on_a_list = !on_a_list
    +            idx = curr.neighbor
    +            curr = curr_list[idx]
    +        end
    +        push!(return_polys, GI.Polygon([pt_list]))
    +    end
    +    return return_polys
    +end

    Get type of polygons that will be made TODO: Increase type options

    julia
    _get_poly_type(::Type{T}) where T =
    +    GI.Polygon{false, false, Vector{GI.LinearRing{false, false, Vector{Tuple{T, T}}, Nothing, Nothing}}, Nothing, Nothing}
    _find_non_cross_orientation(a_list, b_list, a_poly, b_poly; exact)

    For polygons with no crossing intersection points, either one polygon is inside of another, or they are separate polygons with no intersection (other than an edge or point).

    Return two booleans that represent if a is inside b (potentially with shared edges / points) and visa versa if b is inside of a.

    julia
    function _find_non_cross_orientation(a_list, b_list, a_poly, b_poly; exact)
    +    non_intr_a_idx = findfirst(x -> !x.inter, a_list)
    +    non_intr_b_idx = findfirst(x -> !x.inter, b_list)
    +    #= Determine if non-intersection point is in or outside of polygon - if there isn't A
    +    non-intersection point, then all points are on the polygon edge =#
    +    a_pt_orient = isnothing(non_intr_a_idx) ? point_on :
    +        _point_filled_curve_orientation(a_list[non_intr_a_idx].point, b_poly; exact)
    +    b_pt_orient = isnothing(non_intr_b_idx) ? point_on :
    +        _point_filled_curve_orientation(b_list[non_intr_b_idx].point, a_poly; exact)
    +    a_in_b = a_pt_orient != point_out && b_pt_orient != point_in
    +    b_in_a = b_pt_orient != point_out && a_pt_orient != point_in
    +    return a_in_b, b_in_a
    +end
    _add_holes_to_polys!(::Type{T}, return_polys, hole_iterator, remove_poly_idx; exact)

    The holes specified by the hole iterator are added to the polygons in the return_polys list. If this creates more polygons, they are added to the end of the list. If this removes polygons, they are removed from the list

    julia
    function _add_holes_to_polys!(::Type{T}, return_polys, hole_iterator, remove_poly_idx; exact) where T
    +    n_polys = length(return_polys)
    +    remove_hole_idx = Int[]

    Remove set of holes from all polygons

    julia
        for i in 1:n_polys
    +        n_new_per_poly = 0
    +        for curr_hole in Iterators.map(tuples, hole_iterator) # loop through all holes
    +            curr_hole = _linearring(curr_hole)

    loop through all pieces of original polygon (new pieces added to end of list)

    julia
                for j in Iterators.flatten((i:i, (n_polys + 1):(n_polys + n_new_per_poly)))
    +                curr_poly = return_polys[j]
    +                remove_poly_idx[j] && continue
    +                curr_poly_ext = GI.nhole(curr_poly) > 0 ? GI.Polygon(StaticArrays.SVector(GI.getexterior(curr_poly))) : curr_poly
    +                in_ext, on_ext, out_ext = _line_polygon_interactions(curr_hole, curr_poly_ext; exact, closed_line = true)
    +                if in_ext  # hole is at least partially within the polygon's exterior
    +                    new_hole, new_hole_poly, n_new_pieces = _combine_holes!(T, curr_hole, curr_poly, return_polys, remove_hole_idx)
    +                    if n_new_pieces > 0
    +                        append!(remove_poly_idx, falses(n_new_pieces))
    +                        n_new_per_poly += n_new_pieces
    +                    end
    +                    if !on_ext && !out_ext  # hole is completely within exterior
    +                        push!(curr_poly.geom, new_hole)
    +                    else  # hole is partially within and outside of polygon's exterior
    +                        new_polys = difference(curr_poly_ext, new_hole_poly, T; target=GI.PolygonTrait())
    +                        n_new_polys = length(new_polys) - 1

    replace original

    julia
                            curr_poly.geom[1] = GI.getexterior(new_polys[1])
    +                        append!(curr_poly.geom, GI.gethole(new_polys[1]))
    +                        if n_new_polys > 0  # add any extra pieces
    +                            append!(return_polys, @view new_polys[2:end])
    +                            append!(remove_poly_idx, falses(n_new_polys))
    +                            n_new_per_poly += n_new_polys
    +                        end
    +                    end

    polygon is completely within hole

    julia
                    elseif coveredby(curr_poly_ext, GI.Polygon(StaticArrays.SVector(curr_hole)))
    +                    remove_poly_idx[j] = true
    +                end
    +            end
    +        end
    +        n_polys += n_new_per_poly
    +    end

    Remove all polygon that were marked for removal

    julia
        deleteat!(return_polys, remove_poly_idx)
    +    return
    +end
    _combine_holes!(::Type{T}, new_hole, curr_poly, return_polys)

    The new hole is combined with any existing holes in curr_poly. The holes can be combined into a larger hole if they are intersecting. If this happens, then the new, combined hole is returned with the original holes making up the new hole removed from curr_poly. Additionally, if the combined holes form a ring, the interior is added to the return_polys as a new polygon piece. Additionally, holes leftover after combination will be checked for it they are in the "main" polygon or in one of these new pieces and moved accordingly.

    If the holes don't touch or curr_poly has no holes, then new_hole is returned without any changes.

    julia
    function _combine_holes!(::Type{T}, new_hole, curr_poly, return_polys, remove_hole_idx) where T
    +    n_new_polys = 0
    +    empty!(remove_hole_idx)
    +    new_hole_poly = GI.Polygon(StaticArrays.SVector(new_hole))

    Combine any existing holes in curr_poly with new hole

    julia
        for (k, old_hole) in enumerate(GI.gethole(curr_poly))
    +        old_hole_poly = GI.Polygon(StaticArrays.SVector(old_hole))
    +        if intersects(new_hole_poly, old_hole_poly)

    If the holes intersect, combine them into a bigger hole

    julia
                hole_union = union(new_hole_poly, old_hole_poly, T; target = GI.PolygonTrait())[1]
    +            push!(remove_hole_idx, k + 1)
    +            new_hole = GI.getexterior(hole_union)
    +            new_hole_poly = GI.Polygon(StaticArrays.SVector(new_hole))
    +            n_pieces = GI.nhole(hole_union)
    +            if n_pieces > 0  # if the hole has a hole, then this is a new polygon piece!
    +                append!(return_polys, [GI.Polygon([h]) for h in GI.gethole(hole_union)])
    +                n_new_polys += n_pieces
    +            end
    +        end
    +    end

    Remove redundant holes

    julia
        deleteat!(curr_poly.geom, remove_hole_idx)
    +    empty!(remove_hole_idx)

    If new polygon pieces created, make sure remaining holes are in the correct piece

    julia
        @views for piece in return_polys[end - n_new_polys + 1:end]
    +        for (k, old_hole) in enumerate(GI.gethole(curr_poly))
    +            if !(k in remove_hole_idx) && within(old_hole, piece)
    +                push!(remove_hole_idx, k + 1)
    +                push!(piece.geom, old_hole)
    +            end
    +        end
    +    end
    +    deleteat!(curr_poly.geom, remove_hole_idx)
    +    return new_hole, new_hole_poly, n_new_polys
    +end
    +
    +#= Remove collinear edge points, other than the first and last edge vertex, to simplify
    +polygon - including both the exterior ring and any holes=#
    +function _remove_collinear_points!(polys, remove_idx, poly_a, poly_b)
    +    for (i, poly) in Iterators.reverse(enumerate(polys))
    +        for (j, ring) in Iterators.reverse(enumerate(GI.getring(poly)))
    +            n = length(ring.geom)

    resize and reset removing index buffer

    julia
                resize!(remove_idx, n)
    +            fill!(remove_idx, false)
    +            local p1, p2
    +            for (i, p) in enumerate(ring.geom)
    +                if i == 1
    +                    p1 = p
    +                    continue
    +                elseif i == 2
    +                    p2 = p
    +                    continue
    +                else
    +                    p3 = p

    check if p2 is approximately on the edge formed by p1 and p3 - remove if so

    julia
                        if Predicates.orient(p1, p2, p3; exact = _False()) == 0
    +                        remove_idx[i - 1] = true
    +                    end
    +                end
    +                p1, p2 = p2, p3
    +            end

    Check if the first point (which is repeated as the last point) is needed

    julia
                if Predicates.orient(ring.geom[end - 1], ring.geom[1], ring.geom[2]; exact = _False()) == 0
    +                remove_idx[1], remove_idx[end] = true, true
    +            end

    Remove unneeded collinear points

    julia
                deleteat!(ring.geom, remove_idx)

    Check if enough points are left to form a polygon

    julia
                if length(ring.geom)  (remove_idx[1] ? 2 : 3)
    +                if j == 1
    +                    deleteat!(polys, i)
    +                    break
    +                else
    +                    deleteat!(poly.geom, j)
    +                    continue
    +                end
    +            end
    +            if remove_idx[1]  # make sure the last point is repeated
    +                push!(ring.geom, ring.geom[1])
    +            end
    +        end
    +    end
    +    return
    +end

    This page was generated using Literate.jl.

    `,169)]))}const y=i(t,[["render",p]]);export{g as __pageData,y as default}; diff --git a/previews/PR239/assets/source_methods_clipping_clipping_processor.md.Ci1IQvdb.lean.js b/previews/PR239/assets/source_methods_clipping_clipping_processor.md.Ci1IQvdb.lean.js new file mode 100644 index 000000000..3ec0b2217 --- /dev/null +++ b/previews/PR239/assets/source_methods_clipping_clipping_processor.md.Ci1IQvdb.lean.js @@ -0,0 +1,508 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"Polygon clipping helpers","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/clipping/clipping_processor.md","filePath":"source/methods/clipping/clipping_processor.md","lastUpdated":null}'),t={name:"source/methods/clipping/clipping_processor.md"};function p(l,s,k,e,E,r){return h(),a("div",null,s[0]||(s[0]=[n(`

    Polygon clipping helpers

    This file contains the shared helper functions for the polygon clipping functionalities.

    This enum defines which side of an edge a point is on

    julia
    @enum PointEdgeSide left=1 right=2 unknown=3

    Constants assigned for readability

    julia
    const enter, exit = true, false
    +const crossing, bouncing = true, false
    +
    +#= A point can either be the start or end of an overlapping chain of points between two
    +polygons, or not an endpoint of a chain. =#
    +@enum EndPointType start_chain=1 end_chain=2 not_endpoint=3
    +
    +#= This is the struct that makes up a_list and b_list. Many values are only used if point is
    +an intersection point (ipt). =#
    +@kwdef struct PolyNode{T <: AbstractFloat}
    +    point::Tuple{T,T}          # (x, y) values of given point
    +    inter::Bool = false        # If ipt, true, else 0
    +    neighbor::Int = 0          # If ipt, index of equivalent point in a_list or b_list, else 0
    +    idx::Int = 0               # If crossing point, index within sorted a_idx_list
    +    ent_exit::Bool = false     # If ipt, true if enter and false if exit, else false
    +    crossing::Bool = false     # If ipt, true if intersection crosses from out/in polygon, else false
    +    endpoint::EndPointType = not_endpoint # If ipt, denotes if point is the start or end of an overlapping chain
    +    fracs::Tuple{T,T} = (0., 0.) # If ipt, fractions along edges to ipt (a_frac, b_frac), else (0, 0)
    +end
    +
    +#= Create a new node with all of the same field values as the given PolyNode unless
    +alternative values are provided, in which case those should be used. =#
    +PolyNode(node::PolyNode{T};
    +    point = node.point, inter = node.inter, neighbor = node.neighbor, idx = node.idx,
    +    ent_exit = node.ent_exit, crossing = node.crossing, endpoint = node.endpoint,
    +    fracs = node.fracs,
    +) where T = PolyNode{T}(;
    +    point = point, inter = inter, neighbor = neighbor, idx = idx, ent_exit = ent_exit,
    +    crossing = crossing, endpoint = endpoint, fracs = fracs)

    Checks equality of two PolyNodes by backing point value, fractional value, and intersection status

    julia
    equals(pn1::PolyNode, pn2::PolyNode) = pn1.point == pn2.point && pn1.inter == pn2.inter && pn1.fracs == pn2.fracs
    _build_ab_list(::Type{T}, poly_a, poly_b, delay_cross_f, delay_bounce_f; exact) ->
    +    (a_list, b_list, a_idx_list)

    This function takes in two polygon rings and calls '_build_a_list', '_build_b_list', and '_flag_ent_exit' in order to fully form a_list and b_list. The 'a_list' and 'b_list' that it returns are the fully updated vectors of PolyNodes that represent the rings 'poly_a' and 'poly_b', respectively. This function also returns 'a_idx_list', which at its "ith" index stores the index in 'a_list' at which the "ith" intersection point lies.

    julia
    function _build_ab_list(::Type{T}, poly_a, poly_b, delay_cross_f::F1, delay_bounce_f::F2; exact) where {T, F1, F2}

    Make a list for nodes of each polygon

    julia
        a_list, a_idx_list, n_b_intrs = _build_a_list(T, poly_a, poly_b; exact)
    +    b_list = _build_b_list(T, a_idx_list, a_list, n_b_intrs, poly_b)

    Flag crossings

    julia
        _classify_crossing!(T, a_list, b_list; exact)

    Flag the entry and exits

    julia
        _flag_ent_exit!(T, GI.LinearRingTrait(), poly_b, a_list, delay_cross_f, Base.Fix2(delay_bounce_f, true); exact)
    +    _flag_ent_exit!(T, GI.LinearRingTrait(), poly_a, b_list, delay_cross_f, Base.Fix2(delay_bounce_f, false); exact)

    Set node indices and filter a_idx_list to just crossing points

    julia
        _index_crossing_intrs!(a_list, b_list, a_idx_list)
    +
    +    return a_list, b_list, a_idx_list
    +end
    _build_a_list(::Type{T}, poly_a, poly_b) -> (a_list, a_idx_list)

    This function take in two polygon rings and creates a vector of PolyNodes to represent poly_a, including its intersection points with poly_b. The information stored in each PolyNode is needed for clipping using the Greiner-Hormann clipping algorithm.

    Note: After calling this function, a_list is not fully formed because the neighboring indices of the intersection points in b_list still need to be updated. Also we still have not update the entry and exit flags for a_list.

    The a_idx_list is a list of the indices of intersection points in a_list. The value at index i of a_idx_list is the location in a_list where the ith intersection point lies.

    julia
    function _build_a_list(::Type{T}, poly_a, poly_b; exact) where T
    +    n_a_edges = _nedge(poly_a)
    +    a_list = PolyNode{T}[]  # list of points in poly_a
    +    sizehint!(a_list, n_a_edges)
    +    a_idx_list = Vector{Int}()  # finds indices of intersection points in a_list
    +    a_count = 0  # number of points added to a_list
    +    n_b_intrs = 0

    Loop through points of poly_a

    julia
        local a_pt1
    +    for (i, a_p2) in enumerate(GI.getpoint(poly_a))
    +        a_pt2 = (T(GI.x(a_p2)), T(GI.y(a_p2)))
    +        if i <= 1 || (a_pt1 == a_pt2)  # don't repeat points
    +            a_pt1 = a_pt2
    +            continue
    +        end

    Add the first point of the edge to the list of points in a_list

    julia
            new_point = PolyNode{T}(;point = a_pt1)
    +        a_count += 1
    +        push!(a_list, new_point)

    Find intersections with edges of poly_b

    julia
            local b_pt1
    +        prev_counter = a_count
    +        for (j, b_p2) in enumerate(GI.getpoint(poly_b))
    +            b_pt2 = _tuple_point(b_p2, T)
    +            if j <= 1 || (b_pt1 == b_pt2)  # don't repeat points
    +                b_pt1 = b_pt2
    +                continue
    +            end

    Determine if edges intersect and how they intersect

    julia
                line_orient, intr1, intr2 = _intersection_point(T, (a_pt1, a_pt2), (b_pt1, b_pt2); exact)
    +            if line_orient != line_out  # edges intersect
    +                if line_orient == line_cross  # Intersection point that isn't a vertex
    +                    int_pt, fracs = intr1
    +                    new_intr = PolyNode{T}(;
    +                        point = int_pt, inter = true, neighbor = j - 1,
    +                        crossing = true, fracs = fracs,
    +                    )
    +                    a_count += 1
    +                    n_b_intrs += 1
    +                    push!(a_list, new_intr)
    +                    push!(a_idx_list, a_count)
    +                else
    +                    (_, (α1, β1)) = intr1

    Determine if a1 or b1 should be added to a_list

    julia
                        add_a1 = α1 == 0 && 0 β1 < 1
    +                    a1_β = add_a1 ? β1 : zero(T)
    +                    add_b1 = β1 == 0 && 0 < α1 < 1
    +                    b1_α = add_b1 ? α1 : zero(T)

    If lines are collinear and overlapping, a second intersection exists

    julia
                        if line_orient == line_over
    +                        (_, (α2, β2)) = intr2
    +                        if α2 == 0 && 0 β2 < 1
    +                            add_a1, a1_β = true, β2
    +                        end
    +                        if β2 == 0 && 0 < α2 < 1
    +                            add_b1, b1_α = true, α2
    +                        end
    +                    end

    Add intersection points determined above

    julia
                        if add_a1
    +                        n_b_intrs += a1_β == 0 ? 0 : 1
    +                        a_list[prev_counter] = PolyNode{T}(;
    +                            point = a_pt1, inter = true, neighbor = j - 1,
    +                            fracs = (zero(T), a1_β),
    +                        )
    +                        push!(a_idx_list, prev_counter)
    +                    end
    +                    if add_b1
    +                        new_intr = PolyNode{T}(;
    +                            point = b_pt1, inter = true, neighbor = j - 1,
    +                            fracs = (b1_α, zero(T)),
    +                        )
    +                        a_count += 1
    +                        push!(a_list, new_intr)
    +                        push!(a_idx_list, a_count)
    +                    end
    +                end
    +            end
    +            b_pt1 = b_pt2
    +        end

    Order intersection points by placement along edge using fracs value

    julia
            if prev_counter < a_count
    +            Δintrs = a_count - prev_counter
    +            inter_points = @view a_list[(a_count - Δintrs + 1):a_count]
    +            sort!(inter_points, by = x -> x.fracs[1])
    +        end
    +        a_pt1 = a_pt2
    +    end
    +    return a_list, a_idx_list, n_b_intrs
    +end
    _build_b_list(::Type{T}, a_idx_list, a_list, poly_b) -> b_list

    This function takes in the a_list and a_idx_list build in _build_a_list and poly_b and creates a vector of PolyNodes to represent poly_b. The information stored in each PolyNode is needed for clipping using the Greiner-Hormann clipping algorithm.

    Note: after calling this function, b_list is not fully updated. The entry/exit flags still need to be updated. However, the neighbor value in a_list is now updated.

    julia
    function _build_b_list(::Type{T}, a_idx_list, a_list, n_b_intrs, poly_b) where T

    Sort intersection points by insertion order in b_list

    julia
        sort!(a_idx_list, by = x-> a_list[x].neighbor + a_list[x].fracs[2])

    Initialize needed values and lists

    julia
        n_b_edges = _nedge(poly_b)
    +    n_intr_pts = length(a_idx_list)
    +    b_list = PolyNode{T}[]
    +    sizehint!(b_list, n_b_edges + n_b_intrs)
    +    intr_curr = 1
    +    b_count = 0

    Loop over points in poly_b and add each point and intersection point

    julia
        local b_pt1
    +    for (i, b_p2) in enumerate(GI.getpoint(poly_b))
    +        b_pt2 = _tuple_point(b_p2, T)
    +        if i  1 || (b_pt1 == b_pt2)  # don't repeat points
    +            b_pt1 = b_pt2
    +            continue
    +        end
    +        b_count += 1
    +        push!(b_list, PolyNode{T}(; point = b_pt1))
    +        if intr_curr  n_intr_pts
    +            curr_idx = a_idx_list[intr_curr]
    +            curr_node = a_list[curr_idx]
    +            prev_counter = b_count
    +            while curr_node.neighbor == i - 1  # Add all intersection points on current edge
    +                b_idx = 0
    +                new_intr = PolyNode(curr_node; neighbor = curr_idx)
    +                if curr_node.fracs[2] == 0  # if curr_node is segment start point

    intersection point is vertex of b

    julia
                        b_idx = prev_counter
    +                    b_list[b_idx] = new_intr
    +                else
    +                    b_count += 1
    +                    b_idx = b_count
    +                    push!(b_list, new_intr)
    +                end
    +                a_list[curr_idx] = PolyNode(curr_node; neighbor = b_idx)
    +                intr_curr += 1
    +                intr_curr > n_intr_pts && break
    +                curr_idx = a_idx_list[intr_curr]
    +                curr_node = a_list[curr_idx]
    +            end
    +        end
    +        b_pt1 = b_pt2
    +    end
    +    sort!(a_idx_list)  # return a_idx_list to order of points in a_list
    +    return b_list
    +end
    _classify_crossing!(T, poly_b, a_list; exact)

    This function marks all intersection points as either bouncing or crossing points. "Delayed" crossing or bouncing intersections (a chain of edges where the central edges overlap and thus only the first and last edge of the chain determine if the chain is bounding or crossing) are marked as follows: the first and the last points are marked as crossing if the chain is crossing and delayed otherwise and all middle points are marked as bouncing. Additionally, the start and end points of the chain are marked as endpoints using the endpoints field.

    julia
    function _classify_crossing!(::Type{T}, a_list, b_list; exact) where T
    +    napts = length(a_list)
    +    nbpts = length(b_list)

    start centered on last point

    julia
        a_prev = a_list[end - 1]
    +    curr_pt = a_list[end]
    +    i = napts

    keep track of unmatched bouncing chains

    julia
        start_chain_edge, start_chain_idx = unknown, 0
    +    unmatched_end_chain_edge, unmatched_end_chain_idx = unknown, 0
    +    same_winding = true

    loop over list points

    julia
        for next_idx in 1:napts
    +        a_next = a_list[next_idx]
    +        if curr_pt.inter && !curr_pt.crossing
    +            j = curr_pt.neighbor
    +            b_prev = j == 1 ? b_list[end] : b_list[j-1]
    +            b_next = j == nbpts ? b_list[1] : b_list[j+1]

    determine if any segments are on top of one another

    julia
                a_prev_is_b_prev = a_prev.inter && equals(a_prev, b_prev)
    +            a_prev_is_b_next = a_prev.inter && equals(a_prev, b_next)
    +            a_next_is_b_prev = a_next.inter && equals(a_next, b_prev)
    +            a_next_is_b_next = a_next.inter && equals(a_next, b_next)

    determine which side of a segments the p points are on

    julia
                b_prev_side, b_next_side = _get_sides(b_prev, b_next, a_prev, curr_pt, a_next,
    +                i, j, a_list, b_list; exact)

    no sides overlap

    julia
                if !a_prev_is_b_prev && !a_prev_is_b_next && !a_next_is_b_prev && !a_next_is_b_next
    +                if b_prev_side != b_next_side  # lines cross
    +                    a_list[i] = PolyNode(curr_pt; crossing = true)
    +                    b_list[j] = PolyNode(b_list[j]; crossing = true)
    +                end

    end of overlapping chain

    julia
                elseif !a_next_is_b_prev && !a_next_is_b_next
    +                b_side = a_prev_is_b_prev ? b_next_side : b_prev_side
    +                if start_chain_edge == unknown  # start loop on overlapping chain
    +                    unmatched_end_chain_edge = b_side
    +                    unmatched_end_chain_idx = i
    +                    same_winding = a_prev_is_b_prev
    +                else  # close overlapping chain

    update end of chain with endpoint and crossing / bouncing tags

    julia
                        crossing = b_side != start_chain_edge
    +                    a_list[i] = PolyNode(curr_pt;
    +                        crossing = crossing,
    +                        endpoint = end_chain,
    +                    )
    +                    b_list[j] = PolyNode(b_list[j];
    +                        crossing = crossing,
    +                        endpoint = same_winding ? end_chain : start_chain,
    +                    )

    update start of chain with endpoint and crossing / bouncing tags

    julia
                        start_pt = a_list[start_chain_idx]
    +                    a_list[start_chain_idx] = PolyNode(start_pt;
    +                        crossing = crossing,
    +                        endpoint = start_chain,
    +                    )
    +                    b_list[start_pt.neighbor] = PolyNode(b_list[start_pt.neighbor];
    +                        crossing = crossing,
    +                        endpoint = same_winding ? start_chain : end_chain,
    +                    )
    +                end

    start of overlapping chain

    julia
                elseif !a_prev_is_b_prev && !a_prev_is_b_next
    +                b_side = a_next_is_b_prev ? b_next_side : b_prev_side
    +                start_chain_edge = b_side
    +                start_chain_idx = i
    +                same_winding = a_next_is_b_next
    +            end
    +        end
    +        a_prev = curr_pt
    +        curr_pt = a_next
    +        i = next_idx
    +    end

    if we started in the middle of overlapping chain, close chain

    julia
        if unmatched_end_chain_edge != unknown
    +        crossing = unmatched_end_chain_edge != start_chain_edge

    update end of chain with endpoint and crossing / bouncing tags

    julia
            end_chain_pt = a_list[unmatched_end_chain_idx]
    +        a_list[unmatched_end_chain_idx] = PolyNode(end_chain_pt;
    +            crossing = crossing,
    +            endpoint = end_chain,
    +        )
    +        b_list[end_chain_pt.neighbor] = PolyNode(b_list[end_chain_pt.neighbor];
    +            crossing = crossing,
    +            endpoint = same_winding ? end_chain : start_chain,
    +        )

    update start of chain with endpoint and crossing / bouncing tags

    julia
            start_pt = a_list[start_chain_idx]
    +        a_list[start_chain_idx] = PolyNode(start_pt;
    +            crossing = crossing,
    +            endpoint = start_chain,
    +        )
    +        b_list[start_pt.neighbor] = PolyNode(b_list[start_pt.neighbor];
    +            crossing = crossing,
    +            endpoint = same_winding ? start_chain : end_chain,
    +        )
    +    end
    +end

    Check if PolyNode is a vertex of original polygon

    julia
    _is_vertex(pt) = !pt.inter || pt.fracs[1] == 0 || pt.fracs[1] == 1 || pt.fracs[2] == 0 || pt.fracs[2] == 1
    +
    +#= Determines which side (right or left) of the segment a_prev-curr_pt-a_next the points
    +b_prev and b_next are on. Given this is only called when curr_pt is an intersection point
    +that wasn't initially classified as crossing, we know that curr_pt is either from a hinge or
    +overlapping intersection and thus is an original vertex of either poly_a or poly_b. Due to
    +floating point error when calculating new intersection points, we only want to use original
    +vertices to determine orientation. Thus, for other points, find nearest point that is a
    +vertex. Given other intersection points will be collinear along existing segments, this
    +won't change the orientation. =#
    +function _get_sides(b_prev, b_next, a_prev, curr_pt, a_next, i, j, a_list, b_list; exact)
    +    b_prev_pt = if _is_vertex(b_prev)
    +        b_prev.point
    +    else  # Find original start point of segment formed by b_prev and curr_pt
    +        prev_idx = findprev(_is_vertex, b_list, j - 1)
    +        prev_idx = isnothing(prev_idx) ? findlast(_is_vertex, b_list) : prev_idx
    +        b_list[prev_idx].point
    +    end
    +    b_next_pt = if _is_vertex(b_next)
    +        b_next.point
    +    else  # Find original end point of segment formed by curr_pt and b_next
    +        next_idx = findnext(_is_vertex, b_list, j + 1)
    +        next_idx = isnothing(next_idx) ? findfirst(_is_vertex, b_list) : next_idx
    +        b_list[next_idx].point
    +    end
    +    a_prev_pt = if _is_vertex(a_prev)
    +        a_prev.point
    +    else   # Find original start point of segment formed by a_prev and curr_pt
    +        prev_idx = findprev(_is_vertex, a_list, i - 1)
    +        prev_idx = isnothing(prev_idx) ? findlast(_is_vertex, a_list) : prev_idx
    +        a_list[prev_idx].point
    +    end
    +    a_next_pt = if _is_vertex(a_next)
    +        a_next.point
    +    else  # Find original end point of segment formed by curr_pt and a_next
    +        next_idx = findnext(_is_vertex, a_list, i + 1)
    +        next_idx = isnothing(next_idx) ? findfirst(_is_vertex, a_list) : next_idx
    +        a_list[next_idx].point
    +    end

    Determine side orientation of b_prev and b_next

    julia
        b_prev_side = _get_side(b_prev_pt, a_prev_pt, curr_pt.point, a_next_pt; exact)
    +    b_next_side = _get_side(b_next_pt, a_prev_pt, curr_pt.point, a_next_pt; exact)
    +    return b_prev_side, b_next_side
    +end

    Determines if Q lies to the left or right of the line formed by P1-P2-P3

    julia
    function _get_side(Q, P1, P2, P3; exact)
    +    s1 = Predicates.orient(Q, P1, P2; exact)
    +    s2 = Predicates.orient(Q, P2, P3; exact)
    +    s3 = Predicates.orient(P1, P2, P3; exact)
    +
    +    side = if s3  0
    +        (s1 < 0) || (s2 < 0) ? right : left
    +    else #  s3 < 0
    +        (s1 > 0) || (s2 > 0) ? left : right
    +    end
    +    return side
    +end
    +
    +#= Given a list of PolyNodes, find the first element that isn't an intersection point. Then,
    +test if this element is in or out of the given polygon. Return the next index, as well as
    +the enter/exit status of the next intersection point (the opposite of the in/out check). If
    +all points are intersection points, find the first element that either is the end of a chain
    +or a crossing point that isn't in a chain. Then take the midpoint of this point and the next
    +point in the list and perform the in/out check. If none of these points exist, return
    +a \`next_idx\` of \`nothing\`. =#
    +function _pt_off_edge_status(::Type{T}, pt_list, poly, npts; exact) where T
    +    start_idx, is_non_intr_pt = findfirst(_is_not_intr, pt_list), true
    +    if isnothing(start_idx)
    +        start_idx, is_non_intr_pt = findfirst(_next_edge_off, pt_list), false
    +        isnothing(start_idx) && return (start_idx, false)
    +    end
    +    next_idx = start_idx < npts ? (start_idx + 1) : 1
    +    start_pt = if is_non_intr_pt
    +        pt_list[start_idx].point
    +    else
    +        (pt_list[start_idx].point .+ pt_list[next_idx].point) ./ 2
    +    end
    +    start_status = !_point_filled_curve_orientation(start_pt, poly; in = true, on = false, out = false, exact)
    +    return next_idx, start_status
    +end

    Check if a PolyNode is an intersection point

    julia
    _is_not_intr(pt) = !pt.inter
    +#= Check if a PolyNode is the last point of a chain or a non-overlapping crossing point.
    +The next midpoint of one of these points and the next point within a polygon must not be on
    +the polygon edge. =#
    +_next_edge_off(pt) = (pt.endpoint == end_chain) || (pt.crossing && pt.endpoint == not_endpoint)
    _flag_ent_exit!(::Type{T}, ::GI.LinearRingTrait, poly, pt_list, delay_cross_f, delay_bounce_f; exact)

    This function flags all the intersection points as either an 'entry' or 'exit' point in relation to the given polygon. For non-delayed crossings we simply alternate the enter/exit status. This also holds true for the first and last points of a delayed bouncing, where they both have an opposite entry/exit flag. Conversely, the first and last point of a delayed crossing have the same entry/exit status. Furthermore, the crossing/bouncing flag of delayed crossings and bouncings may be updated. This depends on function specific rules that determine which of the start or end points (if any) should be marked as crossing for used during polygon tracing. A consistent rule is that the start and end points of a delayed crossing will have different crossing/bouncing flags, while a the endpoints of a delayed bounce will be the same.

    Used for clipping polygons by other polygons.

    julia
    function _flag_ent_exit!(::Type{T}, ::GI.LinearRingTrait, poly, pt_list, delay_cross_f, delay_bounce_f; exact) where T
    +    npts = length(pt_list)

    Find starting index if there is one

    julia
        next_idx, status = _pt_off_edge_status(T, pt_list, poly, npts; exact)
    +    isnothing(next_idx) && return
    +    start_idx = next_idx - 1

    Loop over points and mark entry and exit status

    julia
        start_chain_idx = 0
    +    for ii in Iterators.flatten((next_idx:npts, 1:start_idx))
    +        curr_pt = pt_list[ii]
    +        if curr_pt.endpoint == start_chain
    +            start_chain_idx = ii
    +        elseif curr_pt.crossing || curr_pt.endpoint == end_chain
    +            start_crossing, end_crossing = curr_pt.crossing, curr_pt.crossing
    +            if curr_pt.endpoint == end_chain  # ending overlapping chain
    +                start_pt = pt_list[start_chain_idx]
    +                if curr_pt.crossing  # delayed crossing
    +                    #= start and end crossing status are different and depend on current
    +                    entry/exit status =#
    +                    start_crossing, end_crossing = delay_cross_f(status)
    +                else  # delayed bouncing
    +                    next_idx = ii < npts ? (ii + 1) : 1
    +                    next_val = (curr_pt.point .+ pt_list[next_idx].point) ./ 2
    +                    pt_in_poly = _point_filled_curve_orientation(next_val, poly; in = true, on = false, out = false, exact)
    +                    #= start and end crossing status are the same and depend on if adjacent
    +                    edges of pt_list are within poly =#
    +                    start_crossing = delay_bounce_f(pt_in_poly)
    +                    end_crossing = start_crossing
    +                end

    update start of chain point

    julia
                    pt_list[start_chain_idx] = PolyNode(start_pt; ent_exit = status, crossing = start_crossing)
    +                if !curr_pt.crossing
    +                    status = !status
    +                end
    +            end
    +            pt_list[ii] = PolyNode(curr_pt; ent_exit = status, crossing = end_crossing)
    +            status = !status
    +        end
    +    end
    +    return
    +end
    _flag_ent_exit!(::GI.LineTrait, line, pt_list; exact)

    This function flags all the intersection points as either an 'entry' or 'exit' point in relation to the given line. Returns true if there are crossing points to classify, else returns false. Used for cutting polygons by lines.

    Assumes that the first point is outside of the polygon and not on an edge.

    julia
    function _flag_ent_exit!(::GI.LineTrait, poly, pt_list; exact)
    +    status = !_point_filled_curve_orientation(pt_list[1].point, poly; in = true, on = false, out = false, exact)

    Loop over points and mark entry and exit status

    julia
        for (ii, curr_pt) in enumerate(pt_list)
    +        if curr_pt.crossing
    +            pt_list[ii] = PolyNode(curr_pt; ent_exit = status)
    +            status = !status
    +        end
    +    end
    +    return
    +end
    +
    +#= Filters a_idx_list to just include crossing points and sets the index of all crossing
    +points (which element they correspond to within a_idx_list). =#
    +function _index_crossing_intrs!(a_list, b_list, a_idx_list)
    +    filter!(x -> a_list[x].crossing, a_idx_list)
    +    for (i, a_idx) in enumerate(a_idx_list)
    +        curr_node = a_list[a_idx]
    +        neighbor_node = b_list[curr_node.neighbor]
    +        a_list[a_idx] = PolyNode(curr_node; idx = i)
    +        b_list[curr_node.neighbor] = PolyNode(neighbor_node; idx = i)
    +    end
    +    return
    +end
    _trace_polynodes(::Type{T}, a_list, b_list, a_idx_list, f_step)::Vector{GI.Polygon}

    This function takes the outputs of _build_ab_list and traces the lists to determine which polygons are formed as described in Greiner and Hormann. The function f_step determines in which direction the lists are traced. This function is different for intersection, difference, and union. f_step must take in two arguments: the most recent intersection node's entry/exit status and a boolean that is true if we are currently tracing a_list and false if we are tracing b_list. The functions used for each clipping operation are follows: - Intersection: (x, y) -> x ? 1 : (-1) - Difference: (x, y) -> (x ⊻ y) ? 1 : (-1) - Union: (x, y) -> x ? (-1) : 1

    A list of GeoInterface polygons is returned from this function.

    Note: poly_a and poly_b are temporary inputs used for debugging and can be removed eventually.

    julia
    function _trace_polynodes(::Type{T}, a_list, b_list, a_idx_list, f_step, poly_a, poly_b) where T
    +    n_a_pts, n_b_pts = length(a_list), length(b_list)
    +    total_pts = n_a_pts + n_b_pts
    +    n_cross_pts = length(a_idx_list)
    +    return_polys = Vector{_get_poly_type(T)}(undef, 0)

    Keep track of number of processed intersection points

    julia
        visited_pts = 0
    +    processed_pts = 0
    +    first_idx = 1
    +    while processed_pts < n_cross_pts
    +        curr_list, curr_npoints = a_list, n_a_pts
    +        on_a_list = true

    Find first unprocessed intersecting point in subject polygon

    julia
            visited_pts += 1
    +        processed_pts += 1
    +        first_idx = findnext(x -> x != 0, a_idx_list, first_idx)
    +        idx = a_idx_list[first_idx]
    +        a_idx_list[first_idx] = 0
    +        start_pt = a_list[idx]

    Set first point in polygon

    julia
            curr = curr_list[idx]
    +        pt_list = [curr.point]
    +
    +        curr_not_start = true
    +        while curr_not_start
    +            step = f_step(curr.ent_exit, on_a_list)

    changed curr_not_intr to curr_not_same_ent_flag

    julia
                same_status, prev_status = true, curr.ent_exit
    +            while same_status
    +                @assert visited_pts < total_pts "Clipping tracing hit every point - clipping error. Please open an issue with polygons: $(GI.coordinates(poly_a)) and $(GI.coordinates(poly_b))."

    Traverse polygon either forwards or backwards

    julia
                    idx += step
    +                idx = (idx > curr_npoints) ? mod(idx, curr_npoints) : idx
    +                idx = (idx == 0) ? curr_npoints : idx

    Get current node and add to pt_list

    julia
                    curr = curr_list[idx]
    +                push!(pt_list, curr.point)
    +                if (curr.crossing || curr.endpoint != not_endpoint)

    Keep track of processed intersection points

    julia
                        same_status = curr.ent_exit == prev_status
    +                    curr_not_start = curr != start_pt && curr != b_list[start_pt.neighbor]
    +                    !curr_not_start && break
    +                    if (on_a_list && curr.crossing) || (!on_a_list && a_list[curr.neighbor].crossing)
    +                        processed_pts += 1
    +                        a_idx_list[curr.idx] = 0
    +                    end
    +                end
    +                visited_pts += 1
    +            end

    Switch to next list and next point

    julia
                curr_list, curr_npoints = on_a_list ? (b_list, n_b_pts) : (a_list, n_a_pts)
    +            on_a_list = !on_a_list
    +            idx = curr.neighbor
    +            curr = curr_list[idx]
    +        end
    +        push!(return_polys, GI.Polygon([pt_list]))
    +    end
    +    return return_polys
    +end

    Get type of polygons that will be made TODO: Increase type options

    julia
    _get_poly_type(::Type{T}) where T =
    +    GI.Polygon{false, false, Vector{GI.LinearRing{false, false, Vector{Tuple{T, T}}, Nothing, Nothing}}, Nothing, Nothing}
    _find_non_cross_orientation(a_list, b_list, a_poly, b_poly; exact)

    For polygons with no crossing intersection points, either one polygon is inside of another, or they are separate polygons with no intersection (other than an edge or point).

    Return two booleans that represent if a is inside b (potentially with shared edges / points) and visa versa if b is inside of a.

    julia
    function _find_non_cross_orientation(a_list, b_list, a_poly, b_poly; exact)
    +    non_intr_a_idx = findfirst(x -> !x.inter, a_list)
    +    non_intr_b_idx = findfirst(x -> !x.inter, b_list)
    +    #= Determine if non-intersection point is in or outside of polygon - if there isn't A
    +    non-intersection point, then all points are on the polygon edge =#
    +    a_pt_orient = isnothing(non_intr_a_idx) ? point_on :
    +        _point_filled_curve_orientation(a_list[non_intr_a_idx].point, b_poly; exact)
    +    b_pt_orient = isnothing(non_intr_b_idx) ? point_on :
    +        _point_filled_curve_orientation(b_list[non_intr_b_idx].point, a_poly; exact)
    +    a_in_b = a_pt_orient != point_out && b_pt_orient != point_in
    +    b_in_a = b_pt_orient != point_out && a_pt_orient != point_in
    +    return a_in_b, b_in_a
    +end
    _add_holes_to_polys!(::Type{T}, return_polys, hole_iterator, remove_poly_idx; exact)

    The holes specified by the hole iterator are added to the polygons in the return_polys list. If this creates more polygons, they are added to the end of the list. If this removes polygons, they are removed from the list

    julia
    function _add_holes_to_polys!(::Type{T}, return_polys, hole_iterator, remove_poly_idx; exact) where T
    +    n_polys = length(return_polys)
    +    remove_hole_idx = Int[]

    Remove set of holes from all polygons

    julia
        for i in 1:n_polys
    +        n_new_per_poly = 0
    +        for curr_hole in Iterators.map(tuples, hole_iterator) # loop through all holes
    +            curr_hole = _linearring(curr_hole)

    loop through all pieces of original polygon (new pieces added to end of list)

    julia
                for j in Iterators.flatten((i:i, (n_polys + 1):(n_polys + n_new_per_poly)))
    +                curr_poly = return_polys[j]
    +                remove_poly_idx[j] && continue
    +                curr_poly_ext = GI.nhole(curr_poly) > 0 ? GI.Polygon(StaticArrays.SVector(GI.getexterior(curr_poly))) : curr_poly
    +                in_ext, on_ext, out_ext = _line_polygon_interactions(curr_hole, curr_poly_ext; exact, closed_line = true)
    +                if in_ext  # hole is at least partially within the polygon's exterior
    +                    new_hole, new_hole_poly, n_new_pieces = _combine_holes!(T, curr_hole, curr_poly, return_polys, remove_hole_idx)
    +                    if n_new_pieces > 0
    +                        append!(remove_poly_idx, falses(n_new_pieces))
    +                        n_new_per_poly += n_new_pieces
    +                    end
    +                    if !on_ext && !out_ext  # hole is completely within exterior
    +                        push!(curr_poly.geom, new_hole)
    +                    else  # hole is partially within and outside of polygon's exterior
    +                        new_polys = difference(curr_poly_ext, new_hole_poly, T; target=GI.PolygonTrait())
    +                        n_new_polys = length(new_polys) - 1

    replace original

    julia
                            curr_poly.geom[1] = GI.getexterior(new_polys[1])
    +                        append!(curr_poly.geom, GI.gethole(new_polys[1]))
    +                        if n_new_polys > 0  # add any extra pieces
    +                            append!(return_polys, @view new_polys[2:end])
    +                            append!(remove_poly_idx, falses(n_new_polys))
    +                            n_new_per_poly += n_new_polys
    +                        end
    +                    end

    polygon is completely within hole

    julia
                    elseif coveredby(curr_poly_ext, GI.Polygon(StaticArrays.SVector(curr_hole)))
    +                    remove_poly_idx[j] = true
    +                end
    +            end
    +        end
    +        n_polys += n_new_per_poly
    +    end

    Remove all polygon that were marked for removal

    julia
        deleteat!(return_polys, remove_poly_idx)
    +    return
    +end
    _combine_holes!(::Type{T}, new_hole, curr_poly, return_polys)

    The new hole is combined with any existing holes in curr_poly. The holes can be combined into a larger hole if they are intersecting. If this happens, then the new, combined hole is returned with the original holes making up the new hole removed from curr_poly. Additionally, if the combined holes form a ring, the interior is added to the return_polys as a new polygon piece. Additionally, holes leftover after combination will be checked for it they are in the "main" polygon or in one of these new pieces and moved accordingly.

    If the holes don't touch or curr_poly has no holes, then new_hole is returned without any changes.

    julia
    function _combine_holes!(::Type{T}, new_hole, curr_poly, return_polys, remove_hole_idx) where T
    +    n_new_polys = 0
    +    empty!(remove_hole_idx)
    +    new_hole_poly = GI.Polygon(StaticArrays.SVector(new_hole))

    Combine any existing holes in curr_poly with new hole

    julia
        for (k, old_hole) in enumerate(GI.gethole(curr_poly))
    +        old_hole_poly = GI.Polygon(StaticArrays.SVector(old_hole))
    +        if intersects(new_hole_poly, old_hole_poly)

    If the holes intersect, combine them into a bigger hole

    julia
                hole_union = union(new_hole_poly, old_hole_poly, T; target = GI.PolygonTrait())[1]
    +            push!(remove_hole_idx, k + 1)
    +            new_hole = GI.getexterior(hole_union)
    +            new_hole_poly = GI.Polygon(StaticArrays.SVector(new_hole))
    +            n_pieces = GI.nhole(hole_union)
    +            if n_pieces > 0  # if the hole has a hole, then this is a new polygon piece!
    +                append!(return_polys, [GI.Polygon([h]) for h in GI.gethole(hole_union)])
    +                n_new_polys += n_pieces
    +            end
    +        end
    +    end

    Remove redundant holes

    julia
        deleteat!(curr_poly.geom, remove_hole_idx)
    +    empty!(remove_hole_idx)

    If new polygon pieces created, make sure remaining holes are in the correct piece

    julia
        @views for piece in return_polys[end - n_new_polys + 1:end]
    +        for (k, old_hole) in enumerate(GI.gethole(curr_poly))
    +            if !(k in remove_hole_idx) && within(old_hole, piece)
    +                push!(remove_hole_idx, k + 1)
    +                push!(piece.geom, old_hole)
    +            end
    +        end
    +    end
    +    deleteat!(curr_poly.geom, remove_hole_idx)
    +    return new_hole, new_hole_poly, n_new_polys
    +end
    +
    +#= Remove collinear edge points, other than the first and last edge vertex, to simplify
    +polygon - including both the exterior ring and any holes=#
    +function _remove_collinear_points!(polys, remove_idx, poly_a, poly_b)
    +    for (i, poly) in Iterators.reverse(enumerate(polys))
    +        for (j, ring) in Iterators.reverse(enumerate(GI.getring(poly)))
    +            n = length(ring.geom)

    resize and reset removing index buffer

    julia
                resize!(remove_idx, n)
    +            fill!(remove_idx, false)
    +            local p1, p2
    +            for (i, p) in enumerate(ring.geom)
    +                if i == 1
    +                    p1 = p
    +                    continue
    +                elseif i == 2
    +                    p2 = p
    +                    continue
    +                else
    +                    p3 = p

    check if p2 is approximately on the edge formed by p1 and p3 - remove if so

    julia
                        if Predicates.orient(p1, p2, p3; exact = _False()) == 0
    +                        remove_idx[i - 1] = true
    +                    end
    +                end
    +                p1, p2 = p2, p3
    +            end

    Check if the first point (which is repeated as the last point) is needed

    julia
                if Predicates.orient(ring.geom[end - 1], ring.geom[1], ring.geom[2]; exact = _False()) == 0
    +                remove_idx[1], remove_idx[end] = true, true
    +            end

    Remove unneeded collinear points

    julia
                deleteat!(ring.geom, remove_idx)

    Check if enough points are left to form a polygon

    julia
                if length(ring.geom)  (remove_idx[1] ? 2 : 3)
    +                if j == 1
    +                    deleteat!(polys, i)
    +                    break
    +                else
    +                    deleteat!(poly.geom, j)
    +                    continue
    +                end
    +            end
    +            if remove_idx[1]  # make sure the last point is repeated
    +                push!(ring.geom, ring.geom[1])
    +            end
    +        end
    +    end
    +    return
    +end

    This page was generated using Literate.jl.

    `,169)]))}const y=i(t,[["render",p]]);export{g as __pageData,y as default}; diff --git a/previews/PR239/assets/source_methods_clipping_coverage.md.C89Y2dMt.js b/previews/PR239/assets/source_methods_clipping_coverage.md.C89Y2dMt.js new file mode 100644 index 000000000..bb2eab7c0 --- /dev/null +++ b/previews/PR239/assets/source_methods_clipping_coverage.md.C89Y2dMt.js @@ -0,0 +1,223 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const l="/GeometryOps.jl/previews/PR239/assets/kguctvv.Cb0_DiYE.png",y=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/clipping/coverage.md","filePath":"source/methods/clipping/coverage.md","lastUpdated":null}'),k={name:"source/methods/clipping/coverage.md"};function p(t,s,e,E,r,d){return h(),a("div",null,s[0]||(s[0]=[n(`
    julia
    export coverage

    What is coverage?

    Coverage is the amount of geometry area within a bounding box defined by the minimum and maximum x and y-coordinates of that bounding box, or an Extent containing that information.

    To provide an example, consider this rectangle:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +rect = GI.Polygon([[(-1,0), (-1,1), (1,1), (1,0), (-1,0)]])
    +cell = GI.Polygon([[(0, 0), (0, 2), (2, 2), (2, 0), (0, 0)]])
    +xmin, xmax, ymin, ymax = 0, 2, 0, 2
    +f, a, p = poly(collect(GI.getpoint(cell)); axis = (; aspect = DataAspect()))
    +poly!(collect(GI.getpoint(rect)))
    +f

    It is clear that half of the polygon is within the cell, so the coverage should be 1.0, half of the area of the rectangle.

    julia
    GO.coverage(rect, xmin, xmax, ymin, ymax)
    1.0

    Implementation

    This is the GeoInterface-compatible implementation. First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait. This is also used in the implementation, since it's a lot less work!

    Note that the coverage is zero for all points and curves, even if the curves are closed like with a linear ring.

    Targets for applys functions

    julia
    const _COVERAGE_TARGETS = TraitTarget{Union{GI.PolygonTrait,GI.AbstractCurveTrait,GI.MultiPointTrait,GI.PointTrait}}()

    Wall types for coverage

    julia
    const UNKNOWN, NORTH, EAST, SOUTH, WEST = 0:4
    +
    +"""
    +    coverage(geom, xmin, xmax, ymin, ymax, [T = Float64])::T
    +
    +Returns the area of intersection between given geometry and grid cell defined by its minimum
    +and maximum x and y-values. This is computed differently for different geometries:
    +
    +- The signed area of a point is always zero.
    +- The signed area of a curve is always zero.
    +- The signed area of a polygon is calculated by tracing along its edges and switching to the
    +    cell edges if needed.
    +- The coverage of a geometry collection, multi-geometry, feature collection of
    +    array/iterable is the sum of the coverages of all of the sub-geometries.
    +
    +Result will be of type T, where T is an optional argument with a default value
    +of Float64.
    +"""
    +function coverage(geom, xmin, xmax, ymin, ymax,::Type{T} = Float64; threaded=false) where T <: AbstractFloat
    +    applyreduce(+, _COVERAGE_TARGETS, geom; threaded, init=zero(T)) do g
    +        _coverage(T, GI.trait(g), g, T(xmin), T(xmax), T(ymin), T(ymax))
    +    end
    +end
    +
    +function coverage(geom, cell_ext::Extents.Extent, ::Type{T} = Float64; threaded=false) where T <: AbstractFloat
    +    (xmin, xmax), (ymin, ymax) = values(cell_ext)
    +    return coverage(geom, xmin, xmax, ymin, ymax, T; threaded = threaded)
    +end

    Points, MultiPoints, Curves, MultiCurves

    julia
    _coverage(::Type{T}, ::GI.AbstractGeometryTrait, geom, xmin, xmax, ymin, ymax; kwargs...) where T = zero(T)

    Polygons

    julia
    function _coverage(::Type{T}, ::GI.PolygonTrait, poly, xmin, xmax, ymin, ymax; exact = _False()) where T
    +    GI.isempty(poly) && return zero(T)
    +    cov_area = _coverage(T, GI.getexterior(poly), xmin, xmax, ymin, ymax; exact)
    +    cov_area == 0 && return cov_area

    Remove hole coverage from total

    julia
        for hole in GI.gethole(poly)
    +        cov_area -= _coverage(T, hole, xmin, xmax, ymin, ymax; exact)
    +    end
    +    return cov_area
    +end
    +
    +#= Calculates the area of the filled ring within the cell defined by corners with (xmin, ymin),
    +(xmin, ymax), (xmax, ymax), and (xmax, ymin). =#
    +function _coverage(::Type{T}, ring, xmin, xmax, ymin, ymax; exact) where T
    +    cov_area = zero(T)
    +    unmatched_out_wall, unmatched_out_point = UNKNOWN, (zero(T), zero(T))
    +    unmatched_in_wall, unmatched_in_point = unmatched_out_wall, unmatched_out_point

    Loop over edges of polygon

    julia
        start_idx = 1
    +    for (i, p) in enumerate(GI.getpoint(ring))
    +        if !_point_in_cell(p, xmin, xmax, ymin, ymax)
    +            start_idx = i
    +            break
    +        end
    +    end
    +    ring_cw = isclockwise(ring)
    +    p1 = _tuple_point(GI.getpoint(ring, start_idx), T)

    Must rotate clockwise for the algorithm to work

    julia
        point_idx = ring_cw ? Iterators.flatten((start_idx + 1:GI.npoint(ring), 1:start_idx)) :
    +        Iterators.flatten((start_idx - 1:-1:1, GI.npoint(ring):-1:start_idx))
    +    for i in point_idx
    +        p2 = _tuple_point(GI.getpoint(ring, i), T)

    Determine if edge points are within the cell

    julia
            p1_in_cell = _point_in_cell(p1, xmin, xmax, ymin, ymax)
    +        p2_in_cell = _point_in_cell(p2, xmin, xmax, ymin, ymax)

    If entire line segment is inside cell

    julia
            if p1_in_cell && p2_in_cell
    +            cov_area += _area_component(p1, p2)
    +            p1 = p2
    +            continue
    +        end

    If edge passes outside of rectangle, determine which edge segments are added

    julia
            inter1, inter2 = _line_intersect_cell(T, p1, p2, xmin, xmax, ymin, ymax)

    Endpoints of segment within the cell and wall they are on if known

    julia
            (start_wall, start_point), (end_wall, end_point) =
    +            if p1_in_cell
    +                ((UNKNOWN, p1), inter1)
    +            elseif p2_in_cell
    +                (inter1, (UNKNOWN, p2))
    +            else
    +                i1_to_p1 = _squared_euclid_distance(T, inter1[2], p1)
    +                i2_to_p1 = _squared_euclid_distance(T, inter2[2], p1)
    +                i1_to_p1 < i2_to_p1 ? (inter1, inter2) : (inter2, inter1)
    +            end

    Add edge component

    julia
            cov_area += _area_component(start_point, end_point)
    +
    +        if start_wall != UNKNOWN  # p1 out of cell
    +            if unmatched_out_wall == UNKNOWN
    +                unmatched_in_point = start_point
    +                unmatched_in_wall = start_wall
    +            else
    +                check_point = find_point_on_cell(unmatched_out_point, start_point,
    +                    unmatched_out_wall, start_wall,xmin, xmax, ymin, ymax)
    +                if _point_filled_curve_orientation(check_point, ring; in = true, on = false, out = false, exact)
    +                    cov_area += connect_edges(T, unmatched_out_point, start_point,
    +                        unmatched_out_wall, start_wall,xmin, xmax, ymin, ymax)
    +                else
    +                    cov_area += connect_edges(T, unmatched_out_point, unmatched_in_point,
    +                        unmatched_out_wall, unmatched_in_wall,xmin, xmax, ymin, ymax)
    +                    unmatched_out_wall == UNKNOWN
    +                end
    +            end
    +        end
    +        if end_wall != UNKNOWN  # p2 out of cell
    +            unmatched_out_wall, unmatched_out_point = end_wall, end_point
    +        end
    +        p1 = p2
    +    end

    if unmatched in-point at beginning, close polygon with last out point

    julia
        if unmatched_in_wall != UNKNOWN
    +        cov_area += connect_edges(T, unmatched_out_point, unmatched_in_point,
    +            unmatched_out_wall, unmatched_in_wall,xmin, xmax, ymin, ymax)
    +    end
    +    cov_area = abs(cov_area) / 2

    if grid cell is within polygon then the area is grid cell area

    julia
        if cov_area == 0
    +        if _point_filled_curve_orientation((xmin, ymin), ring; in = true, on = true, out = false, exact)
    +            cov_area = abs((xmax - xmin) * (ymax - ymin))
    +        end
    +    end
    +    return cov_area
    +end

    Returns true of the given point is within the bounding box determined by x and y values

    julia
    _point_in_cell(p, xmin, xmax, ymin, ymax) = xmin <= GI.x(p) <= xmax && ymin <= GI.y(p) <= ymax

    Returns true if b is between a and c, exclusive of the maximum value, else false.

    julia
    _between(b, a, c) = a  b < c || c  b < a
    +
    +#= Determine intersections of the line from (x1, y1) to (x2, y2) with the bounding box
    +defined by the minimum and maximum x/y values. Since we are dealing with a single line
    +segment, we know that there is at maximum two intersection points.
    +
    +For each intersection point that we find, return the wall that it passes through, as well as
    +the intersection point itself as a a tuple. If an intersection point isn't found, return the
    +wall as UNKNOWN and the point as a pair of zeros. =#
    +function _line_intersect_cell(::Type{T}, (x1, y1), (x2, y2), xmin, xmax, ymin, ymax) where T
    +    Δx, Δy = x2 - x1, y2 - y1
    +    inter1 = (UNKNOWN, (zero(T), zero(T)))
    +    inter2 = inter1
    +    if Δx == 0  # If line is vertical, only consider north and south
    +        if xmin  x1  xmax
    +            inter1 = _between(ymax, y1, y2) ? (NORTH, (x1, ymax)) : inter1
    +            inter2 = _between(ymin, y1, y2) ? (SOUTH, (x1, ymin)) : inter2
    +        end
    +    elseif Δy == 0 # If line is horizontal, only consider east and west
    +        if ymin  y1  ymax
    +            inter1 = _between(xmax, x1, x2) ? (EAST, (xmax, y1)) : inter1
    +            inter2 = _between(xmin, x1, x2) ? (WEST, (xmin, y1)) : inter2
    +        end
    +    else  # Line is tilted, must consider all edges, but only two can intersect
    +        m = Δy / Δx
    +        b = y1 - m * x1

    Calculate and check potential intersections

    julia
            xn = (ymax - b) / m
    +        if xmin  xn  xmax && _between(xn, x1, x2) && _between(ymax, y1, y2)
    +            inter1 = (NORTH, (xn, ymax))
    +        end
    +        xs = (ymin - b) / m
    +        if xmin  xs  xmax && _between(xs, x1, x2) && _between(ymin, y1, y2)
    +            new_intr = (SOUTH, (xs, ymin))
    +            (inter1[1] == UNKNOWN) ? (inter1 = new_intr) : (inter2 = new_intr)
    +        end
    +        ye =  m * xmax + b
    +        if ymin  ye  ymax && _between(ye, y1, y2) && _between(xmax, x1, x2)
    +            new_intr = (EAST, (xmax, ye))
    +            (inter1[1] == UNKNOWN) ? (inter1 = new_intr) : (inter2 = new_intr)
    +        end
    +        yw = m * xmin + b
    +        if ymin  yw  ymax && _between(yw, y1, y2) && _between(xmin, x1, x2)
    +            new_intr = (WEST, (xmin, yw))
    +            (inter1[1] == UNKNOWN) ? (inter1 = new_intr) : (inter2 = new_intr)
    +        end
    +    end
    +    if inter1[1] == UNKNOWN  # first intersection must be known, if one exists
    +        inter1, inter2 = inter2, inter1
    +    end
    +    return inter1, inter2
    +end

    Finds point of cell edge between p1 and p2 given which walls they are on

    julia
    function find_point_on_cell(p1, p2, wall1, wall2, xmin, xmax, ymin, ymax)
    +    x1, y1 = p1
    +    x2, y2 = p2
    +    mid_point = if wall1 == wall2 && _is_clockwise_from(p1, p2, wall1)
    +        (x1 + x2) / 2, (y1 + y2) / 2
    +    elseif wall1 == NORTH
    +        (xmax, ymax)
    +    elseif wall1 == EAST
    +        (xmax, ymin)
    +    elseif wall1 == SOUTH
    +        (xmin, ymin)
    +    else
    +        (xmin, ymax)
    +    end
    +    return mid_point
    +end
    +
    +#= Area component of shoelace formula coming from the distance between point 1 and point 2
    +along grid cell walls in between the two points. =#
    +function connect_edges(::Type{T}, p1, p2, wall1, wall2, xmin, xmax, ymin, ymax) where {T}
    +    connect_area = zero(T)
    +    if wall1 == wall2 && _is_clockwise_from(p1, p2, wall1)
    +        connect_area += _area_component(p1, p2)
    +    else

    From the point to the corner of wall 1

    julia
            connect_area += _partial_edge_out_area(p1, xmin, xmax, ymin, ymax, wall1)

    Any intermediate walls (full length)

    julia
            next_wall, last_wall = wall1 + 1, wall2 - 1
    +        if wall2 > wall1
    +            for wall in next_wall:last_wall
    +                connect_area += _full_edge_area(xmin, xmax, ymin, ymax, wall)
    +            end
    +        else
    +            for wall in Iterators.flatten((next_wall:WEST, NORTH:last_wall))
    +                connect_area += _full_edge_area(xmin, xmax, ymin, ymax, wall)
    +            end
    +        end

    From the corner of wall 2 to the point

    julia
            connect_area += _partial_edge_in_area(p2, xmin, xmax, ymin, ymax, wall2)
    +    end
    +    return connect_area
    +end

    True if (x1, y1) is clockwise from (x2, y2) on the same wall

    julia
    _is_clockwise_from((x1, y1), (x2, y2), wall) = (wall == NORTH && x2 > x1) ||
    +    (wall == EAST && y2 < y1) || (wall == SOUTH && x2 < x1) || (wall == WEST && y2 > y1)
    +
    +#= Returns the area component of a full edge of the bounding box defined by the min and max
    +values and the wall. =#
    +_full_edge_area(xmin, xmax, ymin, ymax, wall) = if wall == NORTH
    +        ymax * (xmin - xmax)
    +    elseif wall == EAST
    +        xmax * (ymin - ymax)
    +    elseif wall == SOUTH
    +        ymin * (xmax - xmin)
    +    else
    +        xmin * (ymax - ymin)
    +    end
    +
    +#= Returns the area component of part of one wall, from its "starting corner" (going
    +clockwise) to the point (x2, y2). =#
    +function _partial_edge_in_area((x2, y2), xmin, xmax, ymin, ymax, wall)
    +    x_wall = (wall == NORTH || wall == WEST) ? xmin : xmax
    +    y_wall = (wall == NORTH || wall == EAST) ? ymax : ymin
    +    return x_wall * y2 - x2 * y_wall
    +end
    +
    +#= Returns the area component of part of one wall, from the point (x1, y1) to its
    +"ending corner" (going clockwise). =#
    +function _partial_edge_out_area((x1, y1), xmin, xmax, ymin, ymax, wall)
    +    x_wall = (wall == NORTH || wall == EAST) ? xmax : xmin
    +    y_wall = (wall == NORTH || wall == WEST) ? ymax : ymin
    +    return x1 * y_wall - x_wall * y1
    +end

    This page was generated using Literate.jl.

    `,58)]))}const F=i(k,[["render",p]]);export{y as __pageData,F as default}; diff --git a/previews/PR239/assets/source_methods_clipping_coverage.md.C89Y2dMt.lean.js b/previews/PR239/assets/source_methods_clipping_coverage.md.C89Y2dMt.lean.js new file mode 100644 index 000000000..bb2eab7c0 --- /dev/null +++ b/previews/PR239/assets/source_methods_clipping_coverage.md.C89Y2dMt.lean.js @@ -0,0 +1,223 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const l="/GeometryOps.jl/previews/PR239/assets/kguctvv.Cb0_DiYE.png",y=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/clipping/coverage.md","filePath":"source/methods/clipping/coverage.md","lastUpdated":null}'),k={name:"source/methods/clipping/coverage.md"};function p(t,s,e,E,r,d){return h(),a("div",null,s[0]||(s[0]=[n(`
    julia
    export coverage

    What is coverage?

    Coverage is the amount of geometry area within a bounding box defined by the minimum and maximum x and y-coordinates of that bounding box, or an Extent containing that information.

    To provide an example, consider this rectangle:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +rect = GI.Polygon([[(-1,0), (-1,1), (1,1), (1,0), (-1,0)]])
    +cell = GI.Polygon([[(0, 0), (0, 2), (2, 2), (2, 0), (0, 0)]])
    +xmin, xmax, ymin, ymax = 0, 2, 0, 2
    +f, a, p = poly(collect(GI.getpoint(cell)); axis = (; aspect = DataAspect()))
    +poly!(collect(GI.getpoint(rect)))
    +f

    It is clear that half of the polygon is within the cell, so the coverage should be 1.0, half of the area of the rectangle.

    julia
    GO.coverage(rect, xmin, xmax, ymin, ymax)
    1.0

    Implementation

    This is the GeoInterface-compatible implementation. First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait. This is also used in the implementation, since it's a lot less work!

    Note that the coverage is zero for all points and curves, even if the curves are closed like with a linear ring.

    Targets for applys functions

    julia
    const _COVERAGE_TARGETS = TraitTarget{Union{GI.PolygonTrait,GI.AbstractCurveTrait,GI.MultiPointTrait,GI.PointTrait}}()

    Wall types for coverage

    julia
    const UNKNOWN, NORTH, EAST, SOUTH, WEST = 0:4
    +
    +"""
    +    coverage(geom, xmin, xmax, ymin, ymax, [T = Float64])::T
    +
    +Returns the area of intersection between given geometry and grid cell defined by its minimum
    +and maximum x and y-values. This is computed differently for different geometries:
    +
    +- The signed area of a point is always zero.
    +- The signed area of a curve is always zero.
    +- The signed area of a polygon is calculated by tracing along its edges and switching to the
    +    cell edges if needed.
    +- The coverage of a geometry collection, multi-geometry, feature collection of
    +    array/iterable is the sum of the coverages of all of the sub-geometries.
    +
    +Result will be of type T, where T is an optional argument with a default value
    +of Float64.
    +"""
    +function coverage(geom, xmin, xmax, ymin, ymax,::Type{T} = Float64; threaded=false) where T <: AbstractFloat
    +    applyreduce(+, _COVERAGE_TARGETS, geom; threaded, init=zero(T)) do g
    +        _coverage(T, GI.trait(g), g, T(xmin), T(xmax), T(ymin), T(ymax))
    +    end
    +end
    +
    +function coverage(geom, cell_ext::Extents.Extent, ::Type{T} = Float64; threaded=false) where T <: AbstractFloat
    +    (xmin, xmax), (ymin, ymax) = values(cell_ext)
    +    return coverage(geom, xmin, xmax, ymin, ymax, T; threaded = threaded)
    +end

    Points, MultiPoints, Curves, MultiCurves

    julia
    _coverage(::Type{T}, ::GI.AbstractGeometryTrait, geom, xmin, xmax, ymin, ymax; kwargs...) where T = zero(T)

    Polygons

    julia
    function _coverage(::Type{T}, ::GI.PolygonTrait, poly, xmin, xmax, ymin, ymax; exact = _False()) where T
    +    GI.isempty(poly) && return zero(T)
    +    cov_area = _coverage(T, GI.getexterior(poly), xmin, xmax, ymin, ymax; exact)
    +    cov_area == 0 && return cov_area

    Remove hole coverage from total

    julia
        for hole in GI.gethole(poly)
    +        cov_area -= _coverage(T, hole, xmin, xmax, ymin, ymax; exact)
    +    end
    +    return cov_area
    +end
    +
    +#= Calculates the area of the filled ring within the cell defined by corners with (xmin, ymin),
    +(xmin, ymax), (xmax, ymax), and (xmax, ymin). =#
    +function _coverage(::Type{T}, ring, xmin, xmax, ymin, ymax; exact) where T
    +    cov_area = zero(T)
    +    unmatched_out_wall, unmatched_out_point = UNKNOWN, (zero(T), zero(T))
    +    unmatched_in_wall, unmatched_in_point = unmatched_out_wall, unmatched_out_point

    Loop over edges of polygon

    julia
        start_idx = 1
    +    for (i, p) in enumerate(GI.getpoint(ring))
    +        if !_point_in_cell(p, xmin, xmax, ymin, ymax)
    +            start_idx = i
    +            break
    +        end
    +    end
    +    ring_cw = isclockwise(ring)
    +    p1 = _tuple_point(GI.getpoint(ring, start_idx), T)

    Must rotate clockwise for the algorithm to work

    julia
        point_idx = ring_cw ? Iterators.flatten((start_idx + 1:GI.npoint(ring), 1:start_idx)) :
    +        Iterators.flatten((start_idx - 1:-1:1, GI.npoint(ring):-1:start_idx))
    +    for i in point_idx
    +        p2 = _tuple_point(GI.getpoint(ring, i), T)

    Determine if edge points are within the cell

    julia
            p1_in_cell = _point_in_cell(p1, xmin, xmax, ymin, ymax)
    +        p2_in_cell = _point_in_cell(p2, xmin, xmax, ymin, ymax)

    If entire line segment is inside cell

    julia
            if p1_in_cell && p2_in_cell
    +            cov_area += _area_component(p1, p2)
    +            p1 = p2
    +            continue
    +        end

    If edge passes outside of rectangle, determine which edge segments are added

    julia
            inter1, inter2 = _line_intersect_cell(T, p1, p2, xmin, xmax, ymin, ymax)

    Endpoints of segment within the cell and wall they are on if known

    julia
            (start_wall, start_point), (end_wall, end_point) =
    +            if p1_in_cell
    +                ((UNKNOWN, p1), inter1)
    +            elseif p2_in_cell
    +                (inter1, (UNKNOWN, p2))
    +            else
    +                i1_to_p1 = _squared_euclid_distance(T, inter1[2], p1)
    +                i2_to_p1 = _squared_euclid_distance(T, inter2[2], p1)
    +                i1_to_p1 < i2_to_p1 ? (inter1, inter2) : (inter2, inter1)
    +            end

    Add edge component

    julia
            cov_area += _area_component(start_point, end_point)
    +
    +        if start_wall != UNKNOWN  # p1 out of cell
    +            if unmatched_out_wall == UNKNOWN
    +                unmatched_in_point = start_point
    +                unmatched_in_wall = start_wall
    +            else
    +                check_point = find_point_on_cell(unmatched_out_point, start_point,
    +                    unmatched_out_wall, start_wall,xmin, xmax, ymin, ymax)
    +                if _point_filled_curve_orientation(check_point, ring; in = true, on = false, out = false, exact)
    +                    cov_area += connect_edges(T, unmatched_out_point, start_point,
    +                        unmatched_out_wall, start_wall,xmin, xmax, ymin, ymax)
    +                else
    +                    cov_area += connect_edges(T, unmatched_out_point, unmatched_in_point,
    +                        unmatched_out_wall, unmatched_in_wall,xmin, xmax, ymin, ymax)
    +                    unmatched_out_wall == UNKNOWN
    +                end
    +            end
    +        end
    +        if end_wall != UNKNOWN  # p2 out of cell
    +            unmatched_out_wall, unmatched_out_point = end_wall, end_point
    +        end
    +        p1 = p2
    +    end

    if unmatched in-point at beginning, close polygon with last out point

    julia
        if unmatched_in_wall != UNKNOWN
    +        cov_area += connect_edges(T, unmatched_out_point, unmatched_in_point,
    +            unmatched_out_wall, unmatched_in_wall,xmin, xmax, ymin, ymax)
    +    end
    +    cov_area = abs(cov_area) / 2

    if grid cell is within polygon then the area is grid cell area

    julia
        if cov_area == 0
    +        if _point_filled_curve_orientation((xmin, ymin), ring; in = true, on = true, out = false, exact)
    +            cov_area = abs((xmax - xmin) * (ymax - ymin))
    +        end
    +    end
    +    return cov_area
    +end

    Returns true of the given point is within the bounding box determined by x and y values

    julia
    _point_in_cell(p, xmin, xmax, ymin, ymax) = xmin <= GI.x(p) <= xmax && ymin <= GI.y(p) <= ymax

    Returns true if b is between a and c, exclusive of the maximum value, else false.

    julia
    _between(b, a, c) = a  b < c || c  b < a
    +
    +#= Determine intersections of the line from (x1, y1) to (x2, y2) with the bounding box
    +defined by the minimum and maximum x/y values. Since we are dealing with a single line
    +segment, we know that there is at maximum two intersection points.
    +
    +For each intersection point that we find, return the wall that it passes through, as well as
    +the intersection point itself as a a tuple. If an intersection point isn't found, return the
    +wall as UNKNOWN and the point as a pair of zeros. =#
    +function _line_intersect_cell(::Type{T}, (x1, y1), (x2, y2), xmin, xmax, ymin, ymax) where T
    +    Δx, Δy = x2 - x1, y2 - y1
    +    inter1 = (UNKNOWN, (zero(T), zero(T)))
    +    inter2 = inter1
    +    if Δx == 0  # If line is vertical, only consider north and south
    +        if xmin  x1  xmax
    +            inter1 = _between(ymax, y1, y2) ? (NORTH, (x1, ymax)) : inter1
    +            inter2 = _between(ymin, y1, y2) ? (SOUTH, (x1, ymin)) : inter2
    +        end
    +    elseif Δy == 0 # If line is horizontal, only consider east and west
    +        if ymin  y1  ymax
    +            inter1 = _between(xmax, x1, x2) ? (EAST, (xmax, y1)) : inter1
    +            inter2 = _between(xmin, x1, x2) ? (WEST, (xmin, y1)) : inter2
    +        end
    +    else  # Line is tilted, must consider all edges, but only two can intersect
    +        m = Δy / Δx
    +        b = y1 - m * x1

    Calculate and check potential intersections

    julia
            xn = (ymax - b) / m
    +        if xmin  xn  xmax && _between(xn, x1, x2) && _between(ymax, y1, y2)
    +            inter1 = (NORTH, (xn, ymax))
    +        end
    +        xs = (ymin - b) / m
    +        if xmin  xs  xmax && _between(xs, x1, x2) && _between(ymin, y1, y2)
    +            new_intr = (SOUTH, (xs, ymin))
    +            (inter1[1] == UNKNOWN) ? (inter1 = new_intr) : (inter2 = new_intr)
    +        end
    +        ye =  m * xmax + b
    +        if ymin  ye  ymax && _between(ye, y1, y2) && _between(xmax, x1, x2)
    +            new_intr = (EAST, (xmax, ye))
    +            (inter1[1] == UNKNOWN) ? (inter1 = new_intr) : (inter2 = new_intr)
    +        end
    +        yw = m * xmin + b
    +        if ymin  yw  ymax && _between(yw, y1, y2) && _between(xmin, x1, x2)
    +            new_intr = (WEST, (xmin, yw))
    +            (inter1[1] == UNKNOWN) ? (inter1 = new_intr) : (inter2 = new_intr)
    +        end
    +    end
    +    if inter1[1] == UNKNOWN  # first intersection must be known, if one exists
    +        inter1, inter2 = inter2, inter1
    +    end
    +    return inter1, inter2
    +end

    Finds point of cell edge between p1 and p2 given which walls they are on

    julia
    function find_point_on_cell(p1, p2, wall1, wall2, xmin, xmax, ymin, ymax)
    +    x1, y1 = p1
    +    x2, y2 = p2
    +    mid_point = if wall1 == wall2 && _is_clockwise_from(p1, p2, wall1)
    +        (x1 + x2) / 2, (y1 + y2) / 2
    +    elseif wall1 == NORTH
    +        (xmax, ymax)
    +    elseif wall1 == EAST
    +        (xmax, ymin)
    +    elseif wall1 == SOUTH
    +        (xmin, ymin)
    +    else
    +        (xmin, ymax)
    +    end
    +    return mid_point
    +end
    +
    +#= Area component of shoelace formula coming from the distance between point 1 and point 2
    +along grid cell walls in between the two points. =#
    +function connect_edges(::Type{T}, p1, p2, wall1, wall2, xmin, xmax, ymin, ymax) where {T}
    +    connect_area = zero(T)
    +    if wall1 == wall2 && _is_clockwise_from(p1, p2, wall1)
    +        connect_area += _area_component(p1, p2)
    +    else

    From the point to the corner of wall 1

    julia
            connect_area += _partial_edge_out_area(p1, xmin, xmax, ymin, ymax, wall1)

    Any intermediate walls (full length)

    julia
            next_wall, last_wall = wall1 + 1, wall2 - 1
    +        if wall2 > wall1
    +            for wall in next_wall:last_wall
    +                connect_area += _full_edge_area(xmin, xmax, ymin, ymax, wall)
    +            end
    +        else
    +            for wall in Iterators.flatten((next_wall:WEST, NORTH:last_wall))
    +                connect_area += _full_edge_area(xmin, xmax, ymin, ymax, wall)
    +            end
    +        end

    From the corner of wall 2 to the point

    julia
            connect_area += _partial_edge_in_area(p2, xmin, xmax, ymin, ymax, wall2)
    +    end
    +    return connect_area
    +end

    True if (x1, y1) is clockwise from (x2, y2) on the same wall

    julia
    _is_clockwise_from((x1, y1), (x2, y2), wall) = (wall == NORTH && x2 > x1) ||
    +    (wall == EAST && y2 < y1) || (wall == SOUTH && x2 < x1) || (wall == WEST && y2 > y1)
    +
    +#= Returns the area component of a full edge of the bounding box defined by the min and max
    +values and the wall. =#
    +_full_edge_area(xmin, xmax, ymin, ymax, wall) = if wall == NORTH
    +        ymax * (xmin - xmax)
    +    elseif wall == EAST
    +        xmax * (ymin - ymax)
    +    elseif wall == SOUTH
    +        ymin * (xmax - xmin)
    +    else
    +        xmin * (ymax - ymin)
    +    end
    +
    +#= Returns the area component of part of one wall, from its "starting corner" (going
    +clockwise) to the point (x2, y2). =#
    +function _partial_edge_in_area((x2, y2), xmin, xmax, ymin, ymax, wall)
    +    x_wall = (wall == NORTH || wall == WEST) ? xmin : xmax
    +    y_wall = (wall == NORTH || wall == EAST) ? ymax : ymin
    +    return x_wall * y2 - x2 * y_wall
    +end
    +
    +#= Returns the area component of part of one wall, from the point (x1, y1) to its
    +"ending corner" (going clockwise). =#
    +function _partial_edge_out_area((x1, y1), xmin, xmax, ymin, ymax, wall)
    +    x_wall = (wall == NORTH || wall == EAST) ? xmax : xmin
    +    y_wall = (wall == NORTH || wall == WEST) ? ymax : ymin
    +    return x1 * y_wall - x_wall * y1
    +end

    This page was generated using Literate.jl.

    `,58)]))}const F=i(k,[["render",p]]);export{y as __pageData,F as default}; diff --git a/previews/PR239/assets/source_methods_clipping_cut.md.D8NjrBmq.js b/previews/PR239/assets/source_methods_clipping_cut.md.D8NjrBmq.js new file mode 100644 index 000000000..7d4d09979 --- /dev/null +++ b/previews/PR239/assets/source_methods_clipping_cut.md.D8NjrBmq.js @@ -0,0 +1,87 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const t="/GeometryOps.jl/previews/PR239/assets/oafsxip.-VpeHhXX.png",y=JSON.parse('{"title":"Polygon cutting","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/clipping/cut.md","filePath":"source/methods/clipping/cut.md","lastUpdated":null}'),l={name:"source/methods/clipping/cut.md"};function p(k,s,e,r,E,d){return h(),a("div",null,s[0]||(s[0]=[n(`

    Polygon cutting

    julia
    export cut

    What is cut?

    The cut function cuts a polygon through a line segment. This is inspired by functions such as Matlab's cutpolygon function.

    To provide an example, consider the following polygon and line:

    julia
    import GeoInterface as GI, GeometryOps as GO
    +using CairoMakie
    +using Makie
    +
    +poly = GI.Polygon([[(0.0, 0.0), (10.0, 0.0), (10.0, 10.0), (0.0, 10.0), (0.0, 0.0)]])
    +line = GI.Line([(5.0, -5.0), (5.0, 15.0)])
    +cut_polys = GO.cut(poly, line)
    +
    +f, a, p1 = Makie.poly(collect(GI.getpoint(cut_polys[1])); color = (:blue, 0.5))
    +Makie.poly!(collect(GI.getpoint(cut_polys[2])); color = (:orange, 0.5))
    +Makie.lines!(GI.getpoint(line); color = :black)
    +f

    Implementation

    This function depends on polygon clipping helper function and is inspired by the Greiner-Hormann clipping algorithm used elsewhere in this library. The inspiration came from this Stack Overflow discussion.

    julia
    """
    +    cut(geom, line, [T::Type])
    +
    +Return given geom cut by given line as a list of geometries of the same type as the input
    +geom. Return the original geometry as only list element if none are found. Line must cut
    +fully through given geometry or the original geometry will be returned.
    +
    +Note: This currently doesn't work for degenerate cases there line crosses through vertices.
    +
    +# Example
    +
    +\`\`\`jldoctest
    +import GeoInterface as GI, GeometryOps as GO
    +
    +poly = GI.Polygon([[(0.0, 0.0), (10.0, 0.0), (10.0, 10.0), (0.0, 10.0), (0.0, 0.0)]])
    +line = GI.Line([(5.0, -5.0), (5.0, 15.0)])
    +cut_polys = GO.cut(poly, line)
    +GI.coordinates.(cut_polys)

    output

    julia
    2-element Vector{Vector{Vector{Vector{Float64}}}}:
    + [[[0.0, 0.0], [5.0, 0.0], [5.0, 10.0], [0.0, 10.0], [0.0, 0.0]]]
    + [[[5.0, 0.0], [10.0, 0.0], [10.0, 10.0], [5.0, 10.0], [5.0, 0.0]]]
    +\`\`\`
    +"""
    +cut(geom, line, ::Type{T} = Float64) where {T <: AbstractFloat} =
    +    _cut(T, GI.trait(geom), geom, GI.trait(line), line; exact = _True())
    +
    +#= Cut a given polygon by given line. Add polygon holes back into resulting pieces if there
    +are any holes. =#
    +function _cut(::Type{T}, ::GI.PolygonTrait, poly, ::GI.LineTrait, line; exact) where T
    +    ext_poly = GI.getexterior(poly)
    +    poly_list, intr_list = _build_a_list(T, ext_poly, line; exact)
    +    n_intr_pts = length(intr_list)

    If an impossible number of intersection points, return original polygon

    julia
        if n_intr_pts < 2 || isodd(n_intr_pts)
    +        return [tuples(poly)]
    +    end

    Cut polygon by line

    julia
        cut_coords = _cut(T, ext_poly, line, poly_list, intr_list, n_intr_pts; exact)

    Close coords and create polygons

    julia
        for c in cut_coords
    +        push!(c, c[1])
    +    end
    +    cut_polys = [GI.Polygon([c]) for c in cut_coords]

    Add original polygon holes back in

    julia
        remove_idx = falses(length(cut_polys))
    +    _add_holes_to_polys!(T, cut_polys, GI.gethole(poly), remove_idx; exact)
    +    return cut_polys
    +end

    Many types aren't implemented

    julia
    function _cut(::Type{T}, trait::GI.AbstractTrait, geom, line; kwargs...) where T
    +    @assert(
    +        false,
    +        "Cutting of $trait isn't implemented yet.",
    +    )
    +    return nothing
    +end
    +
    +#= Cutting algorithm inspired by Greiner and Hormann clipping algorithm. Returns coordinates
    +of cut geometry in Vector{Vector{Tuple}} format.
    +
    +Note: degenerate cases where intersection points are vertices do not work right now. =#
    +function _cut(::Type{T}, geom, line, geom_list, intr_list, n_intr_pts; exact) where T

    Sort and categorize the intersection points

    julia
        sort!(intr_list, by = x -> geom_list[x].fracs[2])
    +    _flag_ent_exit!(GI.LineTrait(), line, geom_list; exact)

    Add first point to output list

    julia
        return_coords = [[geom_list[1].point]]
    +    cross_backs = [(T(Inf),T(Inf))]
    +    poly_idx = 1
    +    n_polys = 1

    Walk around original polygon to find split polygons

    julia
        for (pt_idx, curr) in enumerate(geom_list)
    +        if pt_idx > 1
    +            push!(return_coords[poly_idx], curr.point)
    +        end
    +        if curr.inter

    Find cross back point for current polygon

    julia
                intr_idx = findfirst(x -> equals(curr.point, geom_list[x].point), intr_list)
    +            cross_idx = intr_idx + (curr.ent_exit ? 1 : -1)
    +            cross_idx = cross_idx < 1 ? n_intr_pts : cross_idx
    +            cross_idx = cross_idx > n_intr_pts ? 1 : cross_idx
    +            cross_backs[poly_idx] = geom_list[intr_list[cross_idx]].point

    Check if current point is a cross back point

    julia
                next_poly_idx = findfirst(x -> equals(x, curr.point), cross_backs)
    +            if isnothing(next_poly_idx)
    +                push!(return_coords, [curr.point])
    +                push!(cross_backs, curr.point)
    +                n_polys += 1
    +                poly_idx = n_polys
    +            else
    +                push!(return_coords[next_poly_idx], curr.point)
    +                poly_idx = next_poly_idx
    +            end
    +        end
    +    end
    +    return return_coords
    +end

    This page was generated using Literate.jl.

    `,34)]))}const o=i(l,[["render",p]]);export{y as __pageData,o as default}; diff --git a/previews/PR239/assets/source_methods_clipping_cut.md.D8NjrBmq.lean.js b/previews/PR239/assets/source_methods_clipping_cut.md.D8NjrBmq.lean.js new file mode 100644 index 000000000..7d4d09979 --- /dev/null +++ b/previews/PR239/assets/source_methods_clipping_cut.md.D8NjrBmq.lean.js @@ -0,0 +1,87 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const t="/GeometryOps.jl/previews/PR239/assets/oafsxip.-VpeHhXX.png",y=JSON.parse('{"title":"Polygon cutting","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/clipping/cut.md","filePath":"source/methods/clipping/cut.md","lastUpdated":null}'),l={name:"source/methods/clipping/cut.md"};function p(k,s,e,r,E,d){return h(),a("div",null,s[0]||(s[0]=[n(`

    Polygon cutting

    julia
    export cut

    What is cut?

    The cut function cuts a polygon through a line segment. This is inspired by functions such as Matlab's cutpolygon function.

    To provide an example, consider the following polygon and line:

    julia
    import GeoInterface as GI, GeometryOps as GO
    +using CairoMakie
    +using Makie
    +
    +poly = GI.Polygon([[(0.0, 0.0), (10.0, 0.0), (10.0, 10.0), (0.0, 10.0), (0.0, 0.0)]])
    +line = GI.Line([(5.0, -5.0), (5.0, 15.0)])
    +cut_polys = GO.cut(poly, line)
    +
    +f, a, p1 = Makie.poly(collect(GI.getpoint(cut_polys[1])); color = (:blue, 0.5))
    +Makie.poly!(collect(GI.getpoint(cut_polys[2])); color = (:orange, 0.5))
    +Makie.lines!(GI.getpoint(line); color = :black)
    +f

    Implementation

    This function depends on polygon clipping helper function and is inspired by the Greiner-Hormann clipping algorithm used elsewhere in this library. The inspiration came from this Stack Overflow discussion.

    julia
    """
    +    cut(geom, line, [T::Type])
    +
    +Return given geom cut by given line as a list of geometries of the same type as the input
    +geom. Return the original geometry as only list element if none are found. Line must cut
    +fully through given geometry or the original geometry will be returned.
    +
    +Note: This currently doesn't work for degenerate cases there line crosses through vertices.
    +
    +# Example
    +
    +\`\`\`jldoctest
    +import GeoInterface as GI, GeometryOps as GO
    +
    +poly = GI.Polygon([[(0.0, 0.0), (10.0, 0.0), (10.0, 10.0), (0.0, 10.0), (0.0, 0.0)]])
    +line = GI.Line([(5.0, -5.0), (5.0, 15.0)])
    +cut_polys = GO.cut(poly, line)
    +GI.coordinates.(cut_polys)

    output

    julia
    2-element Vector{Vector{Vector{Vector{Float64}}}}:
    + [[[0.0, 0.0], [5.0, 0.0], [5.0, 10.0], [0.0, 10.0], [0.0, 0.0]]]
    + [[[5.0, 0.0], [10.0, 0.0], [10.0, 10.0], [5.0, 10.0], [5.0, 0.0]]]
    +\`\`\`
    +"""
    +cut(geom, line, ::Type{T} = Float64) where {T <: AbstractFloat} =
    +    _cut(T, GI.trait(geom), geom, GI.trait(line), line; exact = _True())
    +
    +#= Cut a given polygon by given line. Add polygon holes back into resulting pieces if there
    +are any holes. =#
    +function _cut(::Type{T}, ::GI.PolygonTrait, poly, ::GI.LineTrait, line; exact) where T
    +    ext_poly = GI.getexterior(poly)
    +    poly_list, intr_list = _build_a_list(T, ext_poly, line; exact)
    +    n_intr_pts = length(intr_list)

    If an impossible number of intersection points, return original polygon

    julia
        if n_intr_pts < 2 || isodd(n_intr_pts)
    +        return [tuples(poly)]
    +    end

    Cut polygon by line

    julia
        cut_coords = _cut(T, ext_poly, line, poly_list, intr_list, n_intr_pts; exact)

    Close coords and create polygons

    julia
        for c in cut_coords
    +        push!(c, c[1])
    +    end
    +    cut_polys = [GI.Polygon([c]) for c in cut_coords]

    Add original polygon holes back in

    julia
        remove_idx = falses(length(cut_polys))
    +    _add_holes_to_polys!(T, cut_polys, GI.gethole(poly), remove_idx; exact)
    +    return cut_polys
    +end

    Many types aren't implemented

    julia
    function _cut(::Type{T}, trait::GI.AbstractTrait, geom, line; kwargs...) where T
    +    @assert(
    +        false,
    +        "Cutting of $trait isn't implemented yet.",
    +    )
    +    return nothing
    +end
    +
    +#= Cutting algorithm inspired by Greiner and Hormann clipping algorithm. Returns coordinates
    +of cut geometry in Vector{Vector{Tuple}} format.
    +
    +Note: degenerate cases where intersection points are vertices do not work right now. =#
    +function _cut(::Type{T}, geom, line, geom_list, intr_list, n_intr_pts; exact) where T

    Sort and categorize the intersection points

    julia
        sort!(intr_list, by = x -> geom_list[x].fracs[2])
    +    _flag_ent_exit!(GI.LineTrait(), line, geom_list; exact)

    Add first point to output list

    julia
        return_coords = [[geom_list[1].point]]
    +    cross_backs = [(T(Inf),T(Inf))]
    +    poly_idx = 1
    +    n_polys = 1

    Walk around original polygon to find split polygons

    julia
        for (pt_idx, curr) in enumerate(geom_list)
    +        if pt_idx > 1
    +            push!(return_coords[poly_idx], curr.point)
    +        end
    +        if curr.inter

    Find cross back point for current polygon

    julia
                intr_idx = findfirst(x -> equals(curr.point, geom_list[x].point), intr_list)
    +            cross_idx = intr_idx + (curr.ent_exit ? 1 : -1)
    +            cross_idx = cross_idx < 1 ? n_intr_pts : cross_idx
    +            cross_idx = cross_idx > n_intr_pts ? 1 : cross_idx
    +            cross_backs[poly_idx] = geom_list[intr_list[cross_idx]].point

    Check if current point is a cross back point

    julia
                next_poly_idx = findfirst(x -> equals(x, curr.point), cross_backs)
    +            if isnothing(next_poly_idx)
    +                push!(return_coords, [curr.point])
    +                push!(cross_backs, curr.point)
    +                n_polys += 1
    +                poly_idx = n_polys
    +            else
    +                push!(return_coords[next_poly_idx], curr.point)
    +                poly_idx = next_poly_idx
    +            end
    +        end
    +    end
    +    return return_coords
    +end

    This page was generated using Literate.jl.

    `,34)]))}const o=i(l,[["render",p]]);export{y as __pageData,o as default}; diff --git a/previews/PR239/assets/source_methods_clipping_difference.md.KRJn9sdE.js b/previews/PR239/assets/source_methods_clipping_difference.md.KRJn9sdE.js new file mode 100644 index 000000000..68fd9cebd --- /dev/null +++ b/previews/PR239/assets/source_methods_clipping_difference.md.KRJn9sdE.js @@ -0,0 +1,166 @@ +import{_ as i,c as a,a5 as n,o as l}from"./chunks/framework.onQNwZ2I.js";const y=JSON.parse('{"title":"Difference Polygon Clipping","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/clipping/difference.md","filePath":"source/methods/clipping/difference.md","lastUpdated":null}'),p={name:"source/methods/clipping/difference.md"};function t(h,s,e,k,r,d){return l(),a("div",null,s[0]||(s[0]=[n(`

    Difference Polygon Clipping

    julia
    export difference
    +
    +
    +"""
    +    difference(geom_a, geom_b, [T::Type]; target::Type, fix_multipoly = UnionIntersectingPolygons())
    +
    +Return the difference between two geometries as a list of geometries. Return an empty list
    +if none are found. The type of the list will be constrained as much as possible given the
    +input geometries. Furthermore, the user can provide a \`taget\` type as a keyword argument and
    +a list of target geometries found in the difference will be returned. The user can also
    +provide a float type that they would like the points of returned geometries to be. If the
    +user is taking a intersection involving one or more multipolygons, and the multipolygon
    +might be comprised of polygons that intersect, if \`fix_multipoly\` is set to an
    +\`IntersectingPolygons\` correction (the default is \`UnionIntersectingPolygons()\`), then the
    +needed multipolygons will be fixed to be valid before performing the intersection to ensure
    +a correct answer. Only set \`fix_multipoly\` to false if you know that the multipolygons are
    +valid, as it will avoid unneeded computation.
    +
    +# Example
    +
    +\`\`\`jldoctest
    +import GeoInterface as GI, GeometryOps as GO
    +
    +poly1 = GI.Polygon([[[0.0, 0.0], [5.0, 5.0], [10.0, 0.0], [5.0, -5.0], [0.0, 0.0]]])
    +poly2 = GI.Polygon([[[3.0, 0.0], [8.0, 5.0], [13.0, 0.0], [8.0, -5.0], [3.0, 0.0]]])
    +diff_poly = GO.difference(poly1, poly2; target = GI.PolygonTrait())
    +GI.coordinates.(diff_poly)

    output

    julia
    1-element Vector{Vector{Vector{Vector{Float64}}}}:
    + [[[6.5, 3.5], [5.0, 5.0], [0.0, 0.0], [5.0, -5.0], [6.5, -3.5], [3.0, 0.0], [6.5, 3.5]]]
    +\`\`\`
    +"""
    +function difference(
    +    geom_a, geom_b, ::Type{T} = Float64; target=nothing, kwargs...,
    +) where {T<:AbstractFloat}
    +    return _difference(
    +        TraitTarget(target), T, GI.trait(geom_a), geom_a, GI.trait(geom_b), geom_b;
    +        exact = _True(), kwargs...,
    +    )
    +end
    +
    +#= The 'difference' function returns the difference of two polygons as a list of polygons.
    +The algorithm to determine the difference was adapted from "Efficient clipping of efficient
    +polygons," by Greiner and Hormann (1998). DOI: https://doi.org/10.1145/274363.274364 =#
    +function _difference(
    +    ::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.PolygonTrait, poly_a,
    +    ::GI.PolygonTrait, poly_b;
    +    exact, kwargs...
    +) where T

    Get the exterior of the polygons

    julia
        ext_a = GI.getexterior(poly_a)
    +    ext_b = GI.getexterior(poly_b)

    Find the difference of the exterior of the polygons

    julia
        a_list, b_list, a_idx_list = _build_ab_list(T, ext_a, ext_b, _diff_delay_cross_f, _diff_delay_bounce_f; exact)
    +    polys = _trace_polynodes(T, a_list, b_list, a_idx_list, _diff_step, poly_a, poly_b)

    if no crossing points, determine if either poly is inside of the other

    julia
        if isempty(polys)
    +        a_in_b, b_in_a = _find_non_cross_orientation(a_list, b_list, ext_a, ext_b; exact)

    add case for if they polygons are the same (all intersection points!) add a find_first check to find first non-inter poly!

    julia
            if b_in_a && !a_in_b  # b in a and can't be the same polygon
    +            poly_a_b_hole = GI.Polygon([tuples(ext_a), tuples(ext_b)])
    +            push!(polys, poly_a_b_hole)
    +        elseif !b_in_a && !a_in_b # polygons don't intersect
    +            push!(polys, tuples(poly_a))
    +            return polys
    +        end
    +    end
    +    remove_idx = falses(length(polys))

    If the original polygons had holes, take that into account.

    julia
        if GI.nhole(poly_a) != 0
    +        _add_holes_to_polys!(T, polys, GI.gethole(poly_a), remove_idx; exact)
    +    end
    +    if GI.nhole(poly_b) != 0
    +        for hole in GI.gethole(poly_b)
    +            hole_poly = GI.Polygon(StaticArrays.SVector(hole))
    +            new_polys = intersection(hole_poly, poly_a, T; target = GI.PolygonTrait)
    +            if length(new_polys) > 0
    +                append!(polys, new_polys)
    +            end
    +        end
    +    end

    Remove unneeded collinear points on same edge

    julia
        _remove_collinear_points!(polys, remove_idx, poly_a, poly_b)
    +    return polys
    +end

    Helper functions for Differences with Greiner and Hormann Polygon Clipping

    julia
    #= When marking the crossing status of a delayed crossing, the chain start point is crossing
    +when the start point is a entry point and is a bouncing point when the start point is an
    +exit point. The end of the chain has the opposite crossing / bouncing status. =#
    +_diff_delay_cross_f(x) = (x, !x)
    +#= When marking the crossing status of a delayed bouncing, the chain start and end points
    +are crossing if the current polygon's adjacent edges are within the non-tracing polygon and
    +we are tracing b_list or if the edges are outside and we are on a_list. Otherwise the
    +endpoints are marked as crossing. x is a boolean representing if the edges are inside or
    +outside of the polygon and y is a variable that is true if we are on a_list and false if we
    +are on b_list. =#
    +_diff_delay_bounce_f(x, y) = x  y
    +#= When tracing polygons, step forwards if the most recent intersection point was an entry
    +point and we are currently tracing b_list or if it was an exit point and we are currently
    +tracing a_list, else step backwards, where x is the entry/exit status and y is a variable
    +that is true if we are on a_list and false if we are on b_list. =#
    +_diff_step(x, y) = (x  y) ? 1 : (-1)
    +
    +#= Polygon with multipolygon difference - note that all intersection regions between
    +\`poly_a\` and any of the sub-polygons of \`multipoly_b\` are removed from \`poly_a\`. =#
    +function _difference(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.PolygonTrait, poly_a,
    +    ::GI.MultiPolygonTrait, multipoly_b;
    +    kwargs...,
    +) where T
    +    polys = [tuples(poly_a, T)]
    +    for poly_b in GI.getpolygon(multipoly_b)
    +        isempty(polys) && break
    +        polys = mapreduce(p -> difference(p, poly_b; target), append!, polys)
    +    end
    +    return polys
    +end
    +
    +#= Multipolygon with polygon difference - note that all intersection regions between
    +sub-polygons of \`multipoly_a\` and \`poly_b\` will be removed from the corresponding
    +sub-polygon. Unless specified with \`fix_multipoly = nothing\`, \`multipolygon_a\` will be
    +validated using the given (default is \`UnionIntersectingPolygons()\`) correction. =#
    +function _difference(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.MultiPolygonTrait, multipoly_a,
    +    ::GI.PolygonTrait, poly_b;
    +    fix_multipoly = UnionIntersectingPolygons(), kwargs...,
    +) where T
    +    if !isnothing(fix_multipoly) # Fix multipoly_a to prevent returning an invalid multipolygon
    +        multipoly_a = fix_multipoly(multipoly_a)
    +    end
    +    polys = Vector{_get_poly_type(T)}()
    +    sizehint!(polys, GI.npolygon(multipoly_a))
    +    for poly_a in GI.getpolygon(multipoly_a)
    +        append!(polys, difference(poly_a, poly_b; target))
    +    end
    +    return polys
    +end
    +
    +#= Multipolygon with multipolygon difference - note that all intersection regions between
    +sub-polygons of \`multipoly_a\` and sub-polygons of \`multipoly_b\` will be removed from the
    +corresponding sub-polygon of \`multipoly_a\`. Unless specified with \`fix_multipoly = nothing\`,
    +\`multipolygon_a\` will be validated using the given (default is \`UnionIntersectingPolygons()\`)
    +correction. =#
    +function _difference(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.MultiPolygonTrait, multipoly_a,
    +    ::GI.MultiPolygonTrait, multipoly_b;
    +    fix_multipoly = UnionIntersectingPolygons(), kwargs...,
    +) where T
    +    if !isnothing(fix_multipoly) # Fix multipoly_a to prevent returning an invalid multipolygon
    +        multipoly_a = fix_multipoly(multipoly_a)
    +        fix_multipoly = nothing
    +    end
    +    local polys
    +    for (i, poly_b) in enumerate(GI.getpolygon(multipoly_b))
    +        #= Removing intersections of \`multipoly_a\`\` with pieces of \`multipoly_b\`\` - as
    +        pieces of \`multipolygon_a\`\` are removed, continue to take difference with new shape
    +        \`polys\` =#
    +        polys = if i == 1
    +            difference(multipoly_a, poly_b; target, fix_multipoly)
    +        else
    +            difference(GI.MultiPolygon(polys), poly_b; target, fix_multipoly)
    +        end
    +        #= One multipoly_a has been completely covered (and thus removed) there is no need to
    +        continue taking the difference =#
    +        isempty(polys) && break
    +    end
    +    return polys
    +end

    Many type and target combos aren't implemented

    julia
    function _difference(
    +    ::TraitTarget{Target}, ::Type{T},
    +    trait_a::GI.AbstractTrait, geom_a,
    +    trait_b::GI.AbstractTrait, geom_b,
    +) where {Target, T}
    +    @assert(
    +        false,
    +        "Difference between $trait_a and $trait_b with target $Target isn't implemented yet.",
    +    )
    +    return nothing
    +end

    This page was generated using Literate.jl.

    `,22)]))}const E=i(p,[["render",t]]);export{y as __pageData,E as default}; diff --git a/previews/PR239/assets/source_methods_clipping_difference.md.KRJn9sdE.lean.js b/previews/PR239/assets/source_methods_clipping_difference.md.KRJn9sdE.lean.js new file mode 100644 index 000000000..68fd9cebd --- /dev/null +++ b/previews/PR239/assets/source_methods_clipping_difference.md.KRJn9sdE.lean.js @@ -0,0 +1,166 @@ +import{_ as i,c as a,a5 as n,o as l}from"./chunks/framework.onQNwZ2I.js";const y=JSON.parse('{"title":"Difference Polygon Clipping","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/clipping/difference.md","filePath":"source/methods/clipping/difference.md","lastUpdated":null}'),p={name:"source/methods/clipping/difference.md"};function t(h,s,e,k,r,d){return l(),a("div",null,s[0]||(s[0]=[n(`

    Difference Polygon Clipping

    julia
    export difference
    +
    +
    +"""
    +    difference(geom_a, geom_b, [T::Type]; target::Type, fix_multipoly = UnionIntersectingPolygons())
    +
    +Return the difference between two geometries as a list of geometries. Return an empty list
    +if none are found. The type of the list will be constrained as much as possible given the
    +input geometries. Furthermore, the user can provide a \`taget\` type as a keyword argument and
    +a list of target geometries found in the difference will be returned. The user can also
    +provide a float type that they would like the points of returned geometries to be. If the
    +user is taking a intersection involving one or more multipolygons, and the multipolygon
    +might be comprised of polygons that intersect, if \`fix_multipoly\` is set to an
    +\`IntersectingPolygons\` correction (the default is \`UnionIntersectingPolygons()\`), then the
    +needed multipolygons will be fixed to be valid before performing the intersection to ensure
    +a correct answer. Only set \`fix_multipoly\` to false if you know that the multipolygons are
    +valid, as it will avoid unneeded computation.
    +
    +# Example
    +
    +\`\`\`jldoctest
    +import GeoInterface as GI, GeometryOps as GO
    +
    +poly1 = GI.Polygon([[[0.0, 0.0], [5.0, 5.0], [10.0, 0.0], [5.0, -5.0], [0.0, 0.0]]])
    +poly2 = GI.Polygon([[[3.0, 0.0], [8.0, 5.0], [13.0, 0.0], [8.0, -5.0], [3.0, 0.0]]])
    +diff_poly = GO.difference(poly1, poly2; target = GI.PolygonTrait())
    +GI.coordinates.(diff_poly)

    output

    julia
    1-element Vector{Vector{Vector{Vector{Float64}}}}:
    + [[[6.5, 3.5], [5.0, 5.0], [0.0, 0.0], [5.0, -5.0], [6.5, -3.5], [3.0, 0.0], [6.5, 3.5]]]
    +\`\`\`
    +"""
    +function difference(
    +    geom_a, geom_b, ::Type{T} = Float64; target=nothing, kwargs...,
    +) where {T<:AbstractFloat}
    +    return _difference(
    +        TraitTarget(target), T, GI.trait(geom_a), geom_a, GI.trait(geom_b), geom_b;
    +        exact = _True(), kwargs...,
    +    )
    +end
    +
    +#= The 'difference' function returns the difference of two polygons as a list of polygons.
    +The algorithm to determine the difference was adapted from "Efficient clipping of efficient
    +polygons," by Greiner and Hormann (1998). DOI: https://doi.org/10.1145/274363.274364 =#
    +function _difference(
    +    ::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.PolygonTrait, poly_a,
    +    ::GI.PolygonTrait, poly_b;
    +    exact, kwargs...
    +) where T

    Get the exterior of the polygons

    julia
        ext_a = GI.getexterior(poly_a)
    +    ext_b = GI.getexterior(poly_b)

    Find the difference of the exterior of the polygons

    julia
        a_list, b_list, a_idx_list = _build_ab_list(T, ext_a, ext_b, _diff_delay_cross_f, _diff_delay_bounce_f; exact)
    +    polys = _trace_polynodes(T, a_list, b_list, a_idx_list, _diff_step, poly_a, poly_b)

    if no crossing points, determine if either poly is inside of the other

    julia
        if isempty(polys)
    +        a_in_b, b_in_a = _find_non_cross_orientation(a_list, b_list, ext_a, ext_b; exact)

    add case for if they polygons are the same (all intersection points!) add a find_first check to find first non-inter poly!

    julia
            if b_in_a && !a_in_b  # b in a and can't be the same polygon
    +            poly_a_b_hole = GI.Polygon([tuples(ext_a), tuples(ext_b)])
    +            push!(polys, poly_a_b_hole)
    +        elseif !b_in_a && !a_in_b # polygons don't intersect
    +            push!(polys, tuples(poly_a))
    +            return polys
    +        end
    +    end
    +    remove_idx = falses(length(polys))

    If the original polygons had holes, take that into account.

    julia
        if GI.nhole(poly_a) != 0
    +        _add_holes_to_polys!(T, polys, GI.gethole(poly_a), remove_idx; exact)
    +    end
    +    if GI.nhole(poly_b) != 0
    +        for hole in GI.gethole(poly_b)
    +            hole_poly = GI.Polygon(StaticArrays.SVector(hole))
    +            new_polys = intersection(hole_poly, poly_a, T; target = GI.PolygonTrait)
    +            if length(new_polys) > 0
    +                append!(polys, new_polys)
    +            end
    +        end
    +    end

    Remove unneeded collinear points on same edge

    julia
        _remove_collinear_points!(polys, remove_idx, poly_a, poly_b)
    +    return polys
    +end

    Helper functions for Differences with Greiner and Hormann Polygon Clipping

    julia
    #= When marking the crossing status of a delayed crossing, the chain start point is crossing
    +when the start point is a entry point and is a bouncing point when the start point is an
    +exit point. The end of the chain has the opposite crossing / bouncing status. =#
    +_diff_delay_cross_f(x) = (x, !x)
    +#= When marking the crossing status of a delayed bouncing, the chain start and end points
    +are crossing if the current polygon's adjacent edges are within the non-tracing polygon and
    +we are tracing b_list or if the edges are outside and we are on a_list. Otherwise the
    +endpoints are marked as crossing. x is a boolean representing if the edges are inside or
    +outside of the polygon and y is a variable that is true if we are on a_list and false if we
    +are on b_list. =#
    +_diff_delay_bounce_f(x, y) = x  y
    +#= When tracing polygons, step forwards if the most recent intersection point was an entry
    +point and we are currently tracing b_list or if it was an exit point and we are currently
    +tracing a_list, else step backwards, where x is the entry/exit status and y is a variable
    +that is true if we are on a_list and false if we are on b_list. =#
    +_diff_step(x, y) = (x  y) ? 1 : (-1)
    +
    +#= Polygon with multipolygon difference - note that all intersection regions between
    +\`poly_a\` and any of the sub-polygons of \`multipoly_b\` are removed from \`poly_a\`. =#
    +function _difference(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.PolygonTrait, poly_a,
    +    ::GI.MultiPolygonTrait, multipoly_b;
    +    kwargs...,
    +) where T
    +    polys = [tuples(poly_a, T)]
    +    for poly_b in GI.getpolygon(multipoly_b)
    +        isempty(polys) && break
    +        polys = mapreduce(p -> difference(p, poly_b; target), append!, polys)
    +    end
    +    return polys
    +end
    +
    +#= Multipolygon with polygon difference - note that all intersection regions between
    +sub-polygons of \`multipoly_a\` and \`poly_b\` will be removed from the corresponding
    +sub-polygon. Unless specified with \`fix_multipoly = nothing\`, \`multipolygon_a\` will be
    +validated using the given (default is \`UnionIntersectingPolygons()\`) correction. =#
    +function _difference(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.MultiPolygonTrait, multipoly_a,
    +    ::GI.PolygonTrait, poly_b;
    +    fix_multipoly = UnionIntersectingPolygons(), kwargs...,
    +) where T
    +    if !isnothing(fix_multipoly) # Fix multipoly_a to prevent returning an invalid multipolygon
    +        multipoly_a = fix_multipoly(multipoly_a)
    +    end
    +    polys = Vector{_get_poly_type(T)}()
    +    sizehint!(polys, GI.npolygon(multipoly_a))
    +    for poly_a in GI.getpolygon(multipoly_a)
    +        append!(polys, difference(poly_a, poly_b; target))
    +    end
    +    return polys
    +end
    +
    +#= Multipolygon with multipolygon difference - note that all intersection regions between
    +sub-polygons of \`multipoly_a\` and sub-polygons of \`multipoly_b\` will be removed from the
    +corresponding sub-polygon of \`multipoly_a\`. Unless specified with \`fix_multipoly = nothing\`,
    +\`multipolygon_a\` will be validated using the given (default is \`UnionIntersectingPolygons()\`)
    +correction. =#
    +function _difference(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.MultiPolygonTrait, multipoly_a,
    +    ::GI.MultiPolygonTrait, multipoly_b;
    +    fix_multipoly = UnionIntersectingPolygons(), kwargs...,
    +) where T
    +    if !isnothing(fix_multipoly) # Fix multipoly_a to prevent returning an invalid multipolygon
    +        multipoly_a = fix_multipoly(multipoly_a)
    +        fix_multipoly = nothing
    +    end
    +    local polys
    +    for (i, poly_b) in enumerate(GI.getpolygon(multipoly_b))
    +        #= Removing intersections of \`multipoly_a\`\` with pieces of \`multipoly_b\`\` - as
    +        pieces of \`multipolygon_a\`\` are removed, continue to take difference with new shape
    +        \`polys\` =#
    +        polys = if i == 1
    +            difference(multipoly_a, poly_b; target, fix_multipoly)
    +        else
    +            difference(GI.MultiPolygon(polys), poly_b; target, fix_multipoly)
    +        end
    +        #= One multipoly_a has been completely covered (and thus removed) there is no need to
    +        continue taking the difference =#
    +        isempty(polys) && break
    +    end
    +    return polys
    +end

    Many type and target combos aren't implemented

    julia
    function _difference(
    +    ::TraitTarget{Target}, ::Type{T},
    +    trait_a::GI.AbstractTrait, geom_a,
    +    trait_b::GI.AbstractTrait, geom_b,
    +) where {Target, T}
    +    @assert(
    +        false,
    +        "Difference between $trait_a and $trait_b with target $Target isn't implemented yet.",
    +    )
    +    return nothing
    +end

    This page was generated using Literate.jl.

    `,22)]))}const E=i(p,[["render",t]]);export{y as __pageData,E as default}; diff --git a/previews/PR239/assets/source_methods_clipping_intersection.md.bcPofDGt.js b/previews/PR239/assets/source_methods_clipping_intersection.md.bcPofDGt.js new file mode 100644 index 000000000..7d67e5afa --- /dev/null +++ b/previews/PR239/assets/source_methods_clipping_intersection.md.bcPofDGt.js @@ -0,0 +1,383 @@ +import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"Geometry Intersection","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/clipping/intersection.md","filePath":"source/methods/clipping/intersection.md","lastUpdated":null}'),h={name:"source/methods/clipping/intersection.md"};function l(p,s,k,e,r,E){return t(),a("div",null,s[0]||(s[0]=[n(`

    Geometry Intersection

    julia
    export intersection, intersection_points
    +
    +"""
    +    Enum LineOrientation
    +Enum for the orientation of a line with respect to a curve. A line can be
    +\`line_cross\` (crossing over the curve), \`line_hinge\` (crossing the endpoint of the curve),
    +\`line_over\` (collinear with the curve), or \`line_out\` (not interacting with the curve).
    +"""
    +@enum LineOrientation line_cross=1 line_hinge=2 line_over=3 line_out=4
    +
    +"""
    +    intersection(geom_a, geom_b, [T::Type]; target::Type, fix_multipoly = UnionIntersectingPolygons())
    +
    +Return the intersection between two geometries as a list of geometries. Return an empty list
    +if none are found. The type of the list will be constrained as much as possible given the
    +input geometries. Furthermore, the user can provide a \`target\` type as a keyword argument and
    +a list of target geometries found in the intersection will be returned. The user can also
    +provide a float type that they would like the points of returned geometries to be. If the
    +user is taking a intersection involving one or more multipolygons, and the multipolygon
    +might be comprised of polygons that intersect, if \`fix_multipoly\` is set to an
    +\`IntersectingPolygons\` correction (the default is \`UnionIntersectingPolygons()\`), then the
    +needed multipolygons will be fixed to be valid before performing the intersection to ensure
    +a correct answer. Only set \`fix_multipoly\` to nothing if you know that the multipolygons are
    +valid, as it will avoid unneeded computation.
    +
    +# Example
    +
    +\`\`\`jldoctest
    +import GeoInterface as GI, GeometryOps as GO
    +
    +line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)])
    +line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)])
    +inter_points = GO.intersection(line1, line2; target = GI.PointTrait())
    +GI.coordinates.(inter_points)

    output

    julia
    1-element Vector{Vector{Float64}}:
    + [125.58375366067548, -14.83572303404496]
    +\`\`\`
    +"""
    +function intersection(
    +    geom_a, geom_b, ::Type{T}=Float64; target=nothing, kwargs...,
    +) where {T<:AbstractFloat}
    +    return _intersection(
    +        TraitTarget(target), T, GI.trait(geom_a), geom_a, GI.trait(geom_b), geom_b;
    +        exact = _True(), kwargs...,
    +    )
    +end

    Curve-Curve Intersections with target Point

    julia
    _intersection(
    +    ::TraitTarget{GI.PointTrait}, ::Type{T},
    +    trait_a::Union{GI.LineTrait, GI.LineStringTrait, GI.LinearRingTrait}, geom_a,
    +    trait_b::Union{GI.LineTrait, GI.LineStringTrait, GI.LinearRingTrait}, geom_b;
    +    kwargs...,
    +) where T = _intersection_points(T, trait_a, geom_a, trait_b, geom_b)
    +
    +#= Polygon-Polygon Intersections with target Polygon
    +The algorithm to determine the intersection was adapted from "Efficient clipping
    +of efficient polygons," by Greiner and Hormann (1998).
    +DOI: https://doi.org/10.1145/274363.274364 =#
    +function _intersection(
    +    ::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.PolygonTrait, poly_a,
    +    ::GI.PolygonTrait, poly_b;
    +    exact, kwargs...,
    +) where {T}

    First we get the exteriors of 'poly_a' and 'poly_b'

    julia
        ext_a = GI.getexterior(poly_a)
    +    ext_b = GI.getexterior(poly_b)

    Then we find the intersection of the exteriors

    julia
        a_list, b_list, a_idx_list = _build_ab_list(T, ext_a, ext_b, _inter_delay_cross_f, _inter_delay_bounce_f; exact)
    +    polys = _trace_polynodes(T, a_list, b_list, a_idx_list, _inter_step, poly_a, poly_b)
    +    if isempty(polys) # no crossing points, determine if either poly is inside the other
    +        a_in_b, b_in_a = _find_non_cross_orientation(a_list, b_list, ext_a, ext_b; exact)
    +        if a_in_b
    +            push!(polys, GI.Polygon([tuples(ext_a)]))
    +        elseif b_in_a
    +            push!(polys, GI.Polygon([tuples(ext_b)]))
    +        end
    +    end
    +    remove_idx = falses(length(polys))

    If the original polygons had holes, take that into account.

    julia
        if GI.nhole(poly_a) != 0 || GI.nhole(poly_b) != 0
    +        hole_iterator = Iterators.flatten((GI.gethole(poly_a), GI.gethole(poly_b)))
    +        _add_holes_to_polys!(T, polys, hole_iterator, remove_idx; exact)
    +    end

    Remove unneeded collinear points on same edge

    julia
        _remove_collinear_points!(polys, remove_idx, poly_a, poly_b)
    +    return polys
    +end

    Helper functions for Intersections with Greiner and Hormann Polygon Clipping

    julia
    #= When marking the crossing status of a delayed crossing, the chain start point is bouncing
    +when the start point is a entry point and is a crossing point when the start point is an
    +exit point. The end of the chain has the opposite crossing / bouncing status. x is the
    +entry/exit status. =#
    +_inter_delay_cross_f(x) = (!x, x)
    +#= When marking the crossing status of a delayed bouncing, the chain start and end points
    +are crossing if the current polygon's adjacent edges are within the non-tracing polygon. If
    +the edges are outside then the chain endpoints are marked as bouncing. x is a boolean
    +representing if the edges are inside or outside of the polygon. =#
    +_inter_delay_bounce_f(x, _) = x
    +#= When tracing polygons, step forward if the most recent intersection point was an entry
    +point, else step backwards where x is the entry/exit status. =#
    +_inter_step(x, _) =  x ? 1 : (-1)
    +
    +#= Polygon with multipolygon intersection - note that all intersection regions between
    +\`poly_a\` and any of the sub-polygons of \`multipoly_b\` are counted as intersection polygons.
    +Unless specified with \`fix_multipoly = nothing\`, \`multipolygon_b\` will be validated using
    +the given (default is \`UnionIntersectingPolygons()\`) correction. =#
    +function _intersection(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.PolygonTrait, poly_a,
    +    ::GI.MultiPolygonTrait, multipoly_b;
    +    fix_multipoly = UnionIntersectingPolygons(), kwargs...,
    +) where T
    +    if !isnothing(fix_multipoly) # Fix multipoly_b to prevent duplicated intersection regions
    +        multipoly_b = fix_multipoly(multipoly_b)
    +    end
    +    polys = Vector{_get_poly_type(T)}()
    +    for poly_b in GI.getpolygon(multipoly_b)
    +        append!(polys, intersection(poly_a, poly_b; target))
    +    end
    +    return polys
    +end
    +
    +#= Multipolygon with polygon intersection is equivalent to taking the intersection of the
    +polygon with the multipolygon and thus simply switches the order of operations and calls the
    +above method. =#
    +_intersection(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.MultiPolygonTrait, multipoly_a,
    +    ::GI.PolygonTrait, poly_b;
    +    kwargs...,
    +) where T = intersection(poly_b, multipoly_a; target , kwargs...)
    +
    +#= Multipolygon with multipolygon intersection - note that all intersection regions between
    +any sub-polygons of \`multipoly_a\` and any of the sub-polygons of \`multipoly_b\` are counted
    +as intersection polygons. Unless specified with \`fix_multipoly = nothing\`, both
    +\`multipolygon_a\` and \`multipolygon_b\` will be validated using the given (default is
    +\`UnionIntersectingPolygons()\`) correction. =#
    +function _intersection(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.MultiPolygonTrait, multipoly_a,
    +    ::GI.MultiPolygonTrait, multipoly_b;
    +    fix_multipoly = UnionIntersectingPolygons(), kwargs...,
    +) where T
    +    if !isnothing(fix_multipoly) # Fix both multipolygons to prevent duplicated regions
    +        multipoly_a = fix_multipoly(multipoly_a)
    +        multipoly_b = fix_multipoly(multipoly_b)
    +        fix_multipoly = nothing
    +    end
    +    polys = Vector{_get_poly_type(T)}()
    +    for poly_a in GI.getpolygon(multipoly_a)
    +        append!(polys, intersection(poly_a, multipoly_b; target, fix_multipoly))
    +    end
    +    return polys
    +end

    Many type and target combos aren't implemented

    julia
    function _intersection(
    +    ::TraitTarget{Target}, ::Type{T},
    +    trait_a::GI.AbstractTrait, geom_a,
    +    trait_b::GI.AbstractTrait, geom_b;
    +    kwargs...,
    +) where {Target, T}
    +    @assert(
    +        false,
    +        "Intersection between $trait_a and $trait_b with target $Target isn't implemented yet.",
    +    )
    +    return nothing
    +end
    +
    +"""
    +    intersection_points(geom_a, geom_b, [T::Type])
    +
    +Return a list of intersection tuple points between two geometries. If no intersection points
    +exist, returns an empty list.
    +
    +# Example
    +
    +\`\`\`jldoctest
    +import GeoInterface as GI, GeometryOps as GO
    +
    +line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)])
    +line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)])
    +inter_points = GO.intersection_points(line1, line2)

    output

    julia
    1-element Vector{Tuple{Float64, Float64}}:
    + (125.58375366067548, -14.83572303404496)
    +"""
    +intersection_points(geom_a, geom_b, ::Type{T} = Float64) where T <: AbstractFloat =
    +    _intersection_points(T, GI.trait(geom_a), geom_a, GI.trait(geom_b), geom_b)
    +
    +
    +#= Calculates the list of intersection points between two geometries, including line
    +segments, line strings, linear rings, polygons, and multipolygons. =#
    +function _intersection_points(::Type{T}, ::GI.AbstractTrait, a, ::GI.AbstractTrait, b; exact = _True()) where T

    Initialize an empty list of points

    julia
        result = Tuple{T, T}[]

    Check if the geometries extents even overlap

    julia
        Extents.intersects(GI.extent(a), GI.extent(b)) || return result

    Create a list of edges from the two input geometries

    julia
        edges_a, edges_b = map(sort!  to_edges, (a, b))

    Loop over pairs of edges and add any unique intersection points to results

    julia
        for a_edge in edges_a, b_edge in edges_b
    +        line_orient, intr1, intr2 = _intersection_point(T, a_edge, b_edge; exact)
    +        line_orient == line_out && continue  # no intersection points
    +        pt1, _ = intr1
    +        push!(result, pt1)  # if not line_out, there is at least one intersection point
    +        if line_orient == line_over # if line_over, there are two intersection points
    +            pt2, _ = intr2
    +            push!(result, pt2)
    +        end
    +    end
    +    #= TODO: We might be able to just add unique points with checks on the α and β values
    +    returned from \`_intersection_point\`, but this would be different for curves vs polygons
    +    vs multipolygons depending on if the shape is closed. This then wouldn't allow using the
    +    \`to_edges\` functionality.  =#
    +    unique!(sort!(result))
    +    return result
    +end
    +
    +#= Calculates the intersection points between two lines if they exists and the fractional
    +component of each line from the initial end point to the intersection point where α is the
    +fraction along (a1, a2) and β is the fraction along (b1, b2).
    +
    +Note that the first return is the type of intersection (line_cross, line_hinge, line_over,
    +or line_out). The type of intersection determines how many intersection points there are.
    +If the intersection is line_out, then there are no intersection points and the two
    +intersections aren't valid and shouldn't be used. If the intersection is line_cross or
    +line_hinge then the lines meet at one point and the first intersection is valid, while the
    +second isn't. Finally, if the intersection is line_over, then both points are valid and they
    +are the two points that define the endpoints of the overlapping region between the two
    +lines.
    +
    +Also note again that each intersection is a tuple of two tuples. The first is the
    +intersection point (x,y) while the second is the ratio along the initial lines (α, β) for
    +that point.
    +
    +Calculation derivation can be found here: https://stackoverflow.com/questions/563198/ =#
    +function _intersection_point(::Type{T}, (a1, a2)::Edge, (b1, b2)::Edge; exact) where T

    Default answer for no intersection

    julia
        line_orient = line_out
    +    intr1 = ((zero(T), zero(T)), (zero(T), zero(T)))
    +    intr2 = intr1
    +    no_intr_result = (line_orient, intr1, intr2)

    Seperate out line segment points

    julia
        (a1x, a1y), (a2x, a2y) = _tuple_point(a1, T), _tuple_point(a2, T)
    +    (b1x, b1y), (b2x, b2y) = _tuple_point(b1, T), _tuple_point(b2, T)

    Check if envelopes of lines intersect

    julia
        a_ext = Extent(X = minmax(a1x, a2x), Y = minmax(a1y, a2y))
    +    b_ext = Extent(X = minmax(b1x, b2x), Y = minmax(b1y, b2y))
    +    !Extents.intersects(a_ext, b_ext) && return no_intr_result

    Check orientation of two line segments with respect to one another

    julia
        a1_orient = Predicates.orient(b1, b2, a1; exact)
    +    a2_orient = Predicates.orient(b1, b2, a2; exact)
    +    a1_orient != 0 && a1_orient == a2_orient && return no_intr_result  # α < 0 or α > 1
    +    b1_orient = Predicates.orient(a1, a2, b1; exact)
    +    b2_orient = Predicates.orient(a1, a2, b2; exact)
    +    b1_orient != 0 && b1_orient == b2_orient && return no_intr_result  # β < 0 or β > 1

    Determine intersection type and intersection point(s)

    julia
        if a1_orient == a2_orient == b1_orient == b2_orient == 0

    Intersection is collinear if all endpoints lie on the same line

    julia
            line_orient, intr1, intr2 = _find_collinear_intersection(T, a1, a2, b1, b2, a_ext, b_ext, no_intr_result)
    +    elseif a1_orient == 0 || a2_orient == 0 || b1_orient == 0 || b2_orient == 0

    Intersection is a hinge if the intersection point is an endpoint

    julia
            line_orient = line_hinge
    +        intr1 = _find_hinge_intersection(T, a1, a2, b1, b2, a1_orient, a2_orient, b1_orient)
    +    else

    Intersection is a cross if there is only one non-endpoint intersection point

    julia
            line_orient = line_cross
    +        intr1 = _find_cross_intersection(T, a1, a2, b1, b2, a_ext, b_ext)
    +    end
    +    return line_orient, intr1, intr2
    +end
    +
    +#= If lines defined by (a1, a2) and (b1, b2) are collinear, find endpoints of overlapping
    +region if they exist. This could result in three possibilities. First, there could be no
    +overlapping region, in which case, the default 'no_intr_result' intersection information is
    +returned. Second, the two regions could just meet at one shared endpoint, in which case it
    +is a hinge intersection with one intersection point. Otherwise, it is a overlapping
    +intersection defined by two of the endpoints of the line segments. =#
    +function _find_collinear_intersection(::Type{T}, a1, a2, b1, b2, a_ext, b_ext, no_intr_result) where T

    Define default return for no intersection points

    julia
        line_orient, intr1, intr2 = no_intr_result

    Determine collinear line overlaps

    julia
        a1_in_b = _point_in_extent(a1, b_ext)
    +    a2_in_b = _point_in_extent(a2, b_ext)
    +    b1_in_a = _point_in_extent(b1, a_ext)
    +    b2_in_a = _point_in_extent(b2, a_ext)

    Determine line distances

    julia
        a_dist, b_dist = distance(a1, a2, T), distance(b1, b2, T)

    Set collinear intersection points if they exist

    julia
        if a1_in_b && a2_in_b      # 1st vertex of a and 2nd vertex of a form overlap
    +        line_orient = line_over
    +        β1 = _clamped_frac(distance(a1, b1, T), b_dist)
    +        β2 = _clamped_frac(distance(a2, b1, T), b_dist)
    +        intr1 = (_tuple_point(a1, T), (zero(T), β1))
    +        intr2 = (_tuple_point(a2, T), (one(T), β2))
    +    elseif b1_in_a && b2_in_a  # 1st vertex of b and 2nd vertex of b form overlap
    +        line_orient = line_over
    +        α1 = _clamped_frac(distance(b1, a1, T), a_dist)
    +        α2 = _clamped_frac(distance(b2, a1, T), a_dist)
    +        intr1 = (_tuple_point(b1, T), (α1, zero(T)))
    +        intr2 = (_tuple_point(b2, T), (α2, one(T)))
    +    elseif a1_in_b && b1_in_a  # 1st vertex of a and 1st vertex of b form overlap
    +        if equals(a1, b1)
    +            line_orient = line_hinge
    +            intr1 = (_tuple_point(a1, T), (zero(T), zero(T)))
    +        else
    +            line_orient = line_over
    +            intr1, intr2 = _set_ab_collinear_intrs(T, a1, b1, zero(T), zero(T), a1, b1, a_dist, b_dist)
    +        end
    +    elseif a1_in_b && b2_in_a  # 1st vertex of a and 2nd vertex of b form overlap
    +        if equals(a1, b2)
    +            line_orient = line_hinge
    +            intr1 = (_tuple_point(a1, T), (zero(T), one(T)))
    +        else
    +            line_orient = line_over
    +            intr1, intr2 = _set_ab_collinear_intrs(T, a1, b2, zero(T), one(T), a1, b1, a_dist, b_dist)
    +        end
    +    elseif a2_in_b && b1_in_a  # 2nd vertex of a and 1st vertex of b form overlap
    +        if equals(a2, b1)
    +            line_orient = line_hinge
    +            intr1 = (_tuple_point(a2, T), (one(T), zero(T)))
    +        else
    +            line_orient = line_over
    +            intr1, intr2 = _set_ab_collinear_intrs(T, a2, b1, one(T), zero(T), a1, b1, a_dist, b_dist)
    +        end
    +    elseif a2_in_b && b2_in_a  # 2nd vertex of a and 2nd vertex of b form overlap
    +        if equals(a2, b2)
    +            line_orient = line_hinge
    +            intr1 = (_tuple_point(a2, T), (one(T), one(T)))
    +        else
    +            line_orient = line_over
    +            intr1, intr2 = _set_ab_collinear_intrs(T, a2, b2, one(T), one(T), a1, b1, a_dist, b_dist)
    +        end
    +    end
    +    return line_orient, intr1, intr2
    +end
    +
    +#= Determine intersection points and segment fractions when overlap is made up one one
    +endpoint of segment (a1, a2) and one endpoint of segment (b1, b2). =#
    +_set_ab_collinear_intrs(::Type{T}, a_pt, b_pt, a_pt_α, b_pt_β, a1, b1, a_dist, b_dist) where T =
    +    (
    +        (_tuple_point(a_pt, T), (a_pt_α, _clamped_frac(distance(a_pt, b1, T), b_dist))),
    +        (_tuple_point(b_pt, T), (_clamped_frac(distance(b_pt, a1, T), a_dist), b_pt_β))
    +    )
    +
    +#= If lines defined by (a1, a2) and (b1, b2) are just touching at one of those endpoints and
    +are not collinear, then they form a hinge, with just that one shared intersection point.
    +Point equality is checked before segment orientation to have maximal accurary on fractions
    +to avoid floating point errors. If the points are not equal, we know that the hinge does not
    +take place at an endpoint and the fractions must be between 0 or 1 (exclusive). =#
    +function _find_hinge_intersection(::Type{T}, a1, a2, b1, b2, a1_orient, a2_orient, b1_orient) where T
    +    pt, α, β = if equals(a1, b1)
    +        _tuple_point(a1, T), zero(T), zero(T)
    +    elseif equals(a1, b2)
    +        _tuple_point(a1, T), zero(T), one(T)
    +    elseif equals(a2, b1)
    +        _tuple_point(a2, T), one(T), zero(T)
    +    elseif equals(a2, b2)
    +        _tuple_point(a2, T), one(T), one(T)
    +    elseif a1_orient == 0
    +        β_val = _clamped_frac(distance(b1, a1, T), distance(b1, b2, T), eps(T))
    +        _tuple_point(a1, T), zero(T), β_val
    +    elseif a2_orient == 0
    +        β_val = _clamped_frac(distance(b1, a2, T), distance(b1, b2, T), eps(T))
    +        _tuple_point(a2, T), one(T), β_val
    +    elseif b1_orient == 0
    +        α_val = _clamped_frac(distance(a1, b1, T), distance(a1, a2, T), eps(T))
    +        _tuple_point(b1, T), α_val, zero(T)
    +    else  # b2_orient == 0
    +        α_val = _clamped_frac(distance(a1, b2, T), distance(a1, a2, T), eps(T))
    +        _tuple_point(b2, T), α_val, one(T)
    +    end
    +    return pt, (α, β)
    +end
    +
    +#= If lines defined by (a1, a2) and (b1, b2) meet at one point that is not an endpoint of
    +either segment, they form a crossing intersection with a singular intersection point. That
    +point is calculated by finding the fractional distance along each segment the point occurs
    +at (α, β). If the point is too close to an endpoint to be distinct, the point shares a value
    +with the endpoint, but with a non-zero and non-one fractional value. If the intersection
    +point calculated is outside of the envelope of the two segments due to floating point error,
    +it is set to the endpoint of the two segments that is closest to the other segment.
    +Regardless of point value, we know that it does not actually occur at an endpoint so the
    +fractions must be between 0 or 1 (exclusive). =#
    +function _find_cross_intersection(::Type{T}, a1, a2, b1, b2, a_ext, b_ext) where T

    First line runs from a to a + Δa

    julia
        (a1x, a1y), (a2x, a2y) = _tuple_point(a1, T), _tuple_point(a2, T)
    +    Δax, Δay = a2x - a1x, a2y - a1y

    Second line runs from b to b + Δb

    julia
        (b1x, b1y), (b2x, b2y) = _tuple_point(b1, T), _tuple_point(b2, T)
    +    Δbx, Δby = b2x - b1x, b2y - b1y

    Differences between starting points

    julia
        Δbax = b1x - a1x
    +    Δbay = b1y - a1y
    +    a_cross_b = Δax * Δby - Δay * Δbx

    Determine α value where 0 < α < 1 and β value where 0 < β < 1

    julia
        α = _clamped_frac(Δbax * Δby - Δbay * Δbx, a_cross_b, eps(T))
    +    β = _clamped_frac(Δbax * Δay - Δbay * Δax, a_cross_b, eps(T))
    +
    +    #= Intersection will be where a1 + α * Δa = b1 + β * Δb. However, due to floating point
    +    inaccuracies, α and β calculations may yield different intersection points. Average
    +    both points together to minimize difference from real value, as long as segment isn't
    +    vertical or horizontal as this will almost certainly lead to the point being outside the
    +    envelope due to floating point error. Also note that floating point limitations could
    +    make intersection be endpoint if α≈0 or α≈1.=#
    +    x = if Δax == 0
    +        a1x
    +    elseif Δbx == 0
    +        b1x
    +    else
    +        (a1x + α * Δax + b1x + β * Δbx) / 2
    +    end
    +    y = if Δay == 0
    +        a1y
    +    elseif Δby == 0
    +        b1y
    +    else
    +        (a1y + α * Δay + b1y + β * Δby) / 2
    +    end
    +    pt = (x, y)

    Check if point is within segment envelopes and adjust to endpoint if not

    julia
        if !_point_in_extent(pt, a_ext) || !_point_in_extent(pt, b_ext)
    +        pt, α, β = _nearest_endpoint(T, a1, a2, b1, b2)
    +    end
    +    return (pt, (α, β))
    +end

    Find endpoint of either segment that is closest to the opposite segment

    julia
    function _nearest_endpoint(::Type{T}, a1, a2, b1, b2) where T

    Create lines from segments and calculate segment length

    julia
        a_line, a_dist = GI.Line(StaticArrays.SVector(a1, a2)), distance(a1, a2, T)
    +    b_line, b_dist = GI.Line(StaticArrays.SVector(b1, b2)), distance(b1, b2, T)

    Determine distance from a1 to segment b

    julia
        min_pt, min_dist = a1, distance(a1, b_line, T)
    +    α, β = eps(T), _clamped_frac(distance(min_pt, b1, T), b_dist, eps(T))

    Determine distance from a2 to segment b

    julia
        dist = distance(a2, b_line, T)
    +    if dist < min_dist
    +        min_pt, min_dist = a2, dist
    +        α, β = one(T) - eps(T), _clamped_frac(distance(min_pt, b1, T), b_dist, eps(T))
    +    end

    Determine distance from b1 to segment a

    julia
        dist = distance(b1, a_line, T)
    +    if dist < min_dist
    +        min_pt, min_dist = b1, dist
    +        α, β = _clamped_frac(distance(min_pt, a1, T), a_dist, eps(T)), eps(T)
    +    end

    Determine distance from b2 to segment a

    julia
        dist = distance(b2, a_line, T)
    +    if dist < min_dist
    +        min_pt, min_dist = b2, dist
    +        α, β = _clamped_frac(distance(min_pt, a2, T), a_dist, eps(T)), one(T) - eps(T)
    +    end

    Return point with smallest distance

    julia
        return _tuple_point(min_pt, T), α, β
    +end

    Return value of x/y clamped between ϵ and 1 - ϵ

    julia
    _clamped_frac(x::T, y::T, ϵ = zero(T)) where T = clamp(x / y, ϵ, one(T) - ϵ)

    This page was generated using Literate.jl.

    `,80)]))}const y=i(h,[["render",l]]);export{g as __pageData,y as default}; diff --git a/previews/PR239/assets/source_methods_clipping_intersection.md.bcPofDGt.lean.js b/previews/PR239/assets/source_methods_clipping_intersection.md.bcPofDGt.lean.js new file mode 100644 index 000000000..7d67e5afa --- /dev/null +++ b/previews/PR239/assets/source_methods_clipping_intersection.md.bcPofDGt.lean.js @@ -0,0 +1,383 @@ +import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"Geometry Intersection","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/clipping/intersection.md","filePath":"source/methods/clipping/intersection.md","lastUpdated":null}'),h={name:"source/methods/clipping/intersection.md"};function l(p,s,k,e,r,E){return t(),a("div",null,s[0]||(s[0]=[n(`

    Geometry Intersection

    julia
    export intersection, intersection_points
    +
    +"""
    +    Enum LineOrientation
    +Enum for the orientation of a line with respect to a curve. A line can be
    +\`line_cross\` (crossing over the curve), \`line_hinge\` (crossing the endpoint of the curve),
    +\`line_over\` (collinear with the curve), or \`line_out\` (not interacting with the curve).
    +"""
    +@enum LineOrientation line_cross=1 line_hinge=2 line_over=3 line_out=4
    +
    +"""
    +    intersection(geom_a, geom_b, [T::Type]; target::Type, fix_multipoly = UnionIntersectingPolygons())
    +
    +Return the intersection between two geometries as a list of geometries. Return an empty list
    +if none are found. The type of the list will be constrained as much as possible given the
    +input geometries. Furthermore, the user can provide a \`target\` type as a keyword argument and
    +a list of target geometries found in the intersection will be returned. The user can also
    +provide a float type that they would like the points of returned geometries to be. If the
    +user is taking a intersection involving one or more multipolygons, and the multipolygon
    +might be comprised of polygons that intersect, if \`fix_multipoly\` is set to an
    +\`IntersectingPolygons\` correction (the default is \`UnionIntersectingPolygons()\`), then the
    +needed multipolygons will be fixed to be valid before performing the intersection to ensure
    +a correct answer. Only set \`fix_multipoly\` to nothing if you know that the multipolygons are
    +valid, as it will avoid unneeded computation.
    +
    +# Example
    +
    +\`\`\`jldoctest
    +import GeoInterface as GI, GeometryOps as GO
    +
    +line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)])
    +line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)])
    +inter_points = GO.intersection(line1, line2; target = GI.PointTrait())
    +GI.coordinates.(inter_points)

    output

    julia
    1-element Vector{Vector{Float64}}:
    + [125.58375366067548, -14.83572303404496]
    +\`\`\`
    +"""
    +function intersection(
    +    geom_a, geom_b, ::Type{T}=Float64; target=nothing, kwargs...,
    +) where {T<:AbstractFloat}
    +    return _intersection(
    +        TraitTarget(target), T, GI.trait(geom_a), geom_a, GI.trait(geom_b), geom_b;
    +        exact = _True(), kwargs...,
    +    )
    +end

    Curve-Curve Intersections with target Point

    julia
    _intersection(
    +    ::TraitTarget{GI.PointTrait}, ::Type{T},
    +    trait_a::Union{GI.LineTrait, GI.LineStringTrait, GI.LinearRingTrait}, geom_a,
    +    trait_b::Union{GI.LineTrait, GI.LineStringTrait, GI.LinearRingTrait}, geom_b;
    +    kwargs...,
    +) where T = _intersection_points(T, trait_a, geom_a, trait_b, geom_b)
    +
    +#= Polygon-Polygon Intersections with target Polygon
    +The algorithm to determine the intersection was adapted from "Efficient clipping
    +of efficient polygons," by Greiner and Hormann (1998).
    +DOI: https://doi.org/10.1145/274363.274364 =#
    +function _intersection(
    +    ::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.PolygonTrait, poly_a,
    +    ::GI.PolygonTrait, poly_b;
    +    exact, kwargs...,
    +) where {T}

    First we get the exteriors of 'poly_a' and 'poly_b'

    julia
        ext_a = GI.getexterior(poly_a)
    +    ext_b = GI.getexterior(poly_b)

    Then we find the intersection of the exteriors

    julia
        a_list, b_list, a_idx_list = _build_ab_list(T, ext_a, ext_b, _inter_delay_cross_f, _inter_delay_bounce_f; exact)
    +    polys = _trace_polynodes(T, a_list, b_list, a_idx_list, _inter_step, poly_a, poly_b)
    +    if isempty(polys) # no crossing points, determine if either poly is inside the other
    +        a_in_b, b_in_a = _find_non_cross_orientation(a_list, b_list, ext_a, ext_b; exact)
    +        if a_in_b
    +            push!(polys, GI.Polygon([tuples(ext_a)]))
    +        elseif b_in_a
    +            push!(polys, GI.Polygon([tuples(ext_b)]))
    +        end
    +    end
    +    remove_idx = falses(length(polys))

    If the original polygons had holes, take that into account.

    julia
        if GI.nhole(poly_a) != 0 || GI.nhole(poly_b) != 0
    +        hole_iterator = Iterators.flatten((GI.gethole(poly_a), GI.gethole(poly_b)))
    +        _add_holes_to_polys!(T, polys, hole_iterator, remove_idx; exact)
    +    end

    Remove unneeded collinear points on same edge

    julia
        _remove_collinear_points!(polys, remove_idx, poly_a, poly_b)
    +    return polys
    +end

    Helper functions for Intersections with Greiner and Hormann Polygon Clipping

    julia
    #= When marking the crossing status of a delayed crossing, the chain start point is bouncing
    +when the start point is a entry point and is a crossing point when the start point is an
    +exit point. The end of the chain has the opposite crossing / bouncing status. x is the
    +entry/exit status. =#
    +_inter_delay_cross_f(x) = (!x, x)
    +#= When marking the crossing status of a delayed bouncing, the chain start and end points
    +are crossing if the current polygon's adjacent edges are within the non-tracing polygon. If
    +the edges are outside then the chain endpoints are marked as bouncing. x is a boolean
    +representing if the edges are inside or outside of the polygon. =#
    +_inter_delay_bounce_f(x, _) = x
    +#= When tracing polygons, step forward if the most recent intersection point was an entry
    +point, else step backwards where x is the entry/exit status. =#
    +_inter_step(x, _) =  x ? 1 : (-1)
    +
    +#= Polygon with multipolygon intersection - note that all intersection regions between
    +\`poly_a\` and any of the sub-polygons of \`multipoly_b\` are counted as intersection polygons.
    +Unless specified with \`fix_multipoly = nothing\`, \`multipolygon_b\` will be validated using
    +the given (default is \`UnionIntersectingPolygons()\`) correction. =#
    +function _intersection(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.PolygonTrait, poly_a,
    +    ::GI.MultiPolygonTrait, multipoly_b;
    +    fix_multipoly = UnionIntersectingPolygons(), kwargs...,
    +) where T
    +    if !isnothing(fix_multipoly) # Fix multipoly_b to prevent duplicated intersection regions
    +        multipoly_b = fix_multipoly(multipoly_b)
    +    end
    +    polys = Vector{_get_poly_type(T)}()
    +    for poly_b in GI.getpolygon(multipoly_b)
    +        append!(polys, intersection(poly_a, poly_b; target))
    +    end
    +    return polys
    +end
    +
    +#= Multipolygon with polygon intersection is equivalent to taking the intersection of the
    +polygon with the multipolygon and thus simply switches the order of operations and calls the
    +above method. =#
    +_intersection(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.MultiPolygonTrait, multipoly_a,
    +    ::GI.PolygonTrait, poly_b;
    +    kwargs...,
    +) where T = intersection(poly_b, multipoly_a; target , kwargs...)
    +
    +#= Multipolygon with multipolygon intersection - note that all intersection regions between
    +any sub-polygons of \`multipoly_a\` and any of the sub-polygons of \`multipoly_b\` are counted
    +as intersection polygons. Unless specified with \`fix_multipoly = nothing\`, both
    +\`multipolygon_a\` and \`multipolygon_b\` will be validated using the given (default is
    +\`UnionIntersectingPolygons()\`) correction. =#
    +function _intersection(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.MultiPolygonTrait, multipoly_a,
    +    ::GI.MultiPolygonTrait, multipoly_b;
    +    fix_multipoly = UnionIntersectingPolygons(), kwargs...,
    +) where T
    +    if !isnothing(fix_multipoly) # Fix both multipolygons to prevent duplicated regions
    +        multipoly_a = fix_multipoly(multipoly_a)
    +        multipoly_b = fix_multipoly(multipoly_b)
    +        fix_multipoly = nothing
    +    end
    +    polys = Vector{_get_poly_type(T)}()
    +    for poly_a in GI.getpolygon(multipoly_a)
    +        append!(polys, intersection(poly_a, multipoly_b; target, fix_multipoly))
    +    end
    +    return polys
    +end

    Many type and target combos aren't implemented

    julia
    function _intersection(
    +    ::TraitTarget{Target}, ::Type{T},
    +    trait_a::GI.AbstractTrait, geom_a,
    +    trait_b::GI.AbstractTrait, geom_b;
    +    kwargs...,
    +) where {Target, T}
    +    @assert(
    +        false,
    +        "Intersection between $trait_a and $trait_b with target $Target isn't implemented yet.",
    +    )
    +    return nothing
    +end
    +
    +"""
    +    intersection_points(geom_a, geom_b, [T::Type])
    +
    +Return a list of intersection tuple points between two geometries. If no intersection points
    +exist, returns an empty list.
    +
    +# Example
    +
    +\`\`\`jldoctest
    +import GeoInterface as GI, GeometryOps as GO
    +
    +line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)])
    +line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)])
    +inter_points = GO.intersection_points(line1, line2)

    output

    julia
    1-element Vector{Tuple{Float64, Float64}}:
    + (125.58375366067548, -14.83572303404496)
    +"""
    +intersection_points(geom_a, geom_b, ::Type{T} = Float64) where T <: AbstractFloat =
    +    _intersection_points(T, GI.trait(geom_a), geom_a, GI.trait(geom_b), geom_b)
    +
    +
    +#= Calculates the list of intersection points between two geometries, including line
    +segments, line strings, linear rings, polygons, and multipolygons. =#
    +function _intersection_points(::Type{T}, ::GI.AbstractTrait, a, ::GI.AbstractTrait, b; exact = _True()) where T

    Initialize an empty list of points

    julia
        result = Tuple{T, T}[]

    Check if the geometries extents even overlap

    julia
        Extents.intersects(GI.extent(a), GI.extent(b)) || return result

    Create a list of edges from the two input geometries

    julia
        edges_a, edges_b = map(sort!  to_edges, (a, b))

    Loop over pairs of edges and add any unique intersection points to results

    julia
        for a_edge in edges_a, b_edge in edges_b
    +        line_orient, intr1, intr2 = _intersection_point(T, a_edge, b_edge; exact)
    +        line_orient == line_out && continue  # no intersection points
    +        pt1, _ = intr1
    +        push!(result, pt1)  # if not line_out, there is at least one intersection point
    +        if line_orient == line_over # if line_over, there are two intersection points
    +            pt2, _ = intr2
    +            push!(result, pt2)
    +        end
    +    end
    +    #= TODO: We might be able to just add unique points with checks on the α and β values
    +    returned from \`_intersection_point\`, but this would be different for curves vs polygons
    +    vs multipolygons depending on if the shape is closed. This then wouldn't allow using the
    +    \`to_edges\` functionality.  =#
    +    unique!(sort!(result))
    +    return result
    +end
    +
    +#= Calculates the intersection points between two lines if they exists and the fractional
    +component of each line from the initial end point to the intersection point where α is the
    +fraction along (a1, a2) and β is the fraction along (b1, b2).
    +
    +Note that the first return is the type of intersection (line_cross, line_hinge, line_over,
    +or line_out). The type of intersection determines how many intersection points there are.
    +If the intersection is line_out, then there are no intersection points and the two
    +intersections aren't valid and shouldn't be used. If the intersection is line_cross or
    +line_hinge then the lines meet at one point and the first intersection is valid, while the
    +second isn't. Finally, if the intersection is line_over, then both points are valid and they
    +are the two points that define the endpoints of the overlapping region between the two
    +lines.
    +
    +Also note again that each intersection is a tuple of two tuples. The first is the
    +intersection point (x,y) while the second is the ratio along the initial lines (α, β) for
    +that point.
    +
    +Calculation derivation can be found here: https://stackoverflow.com/questions/563198/ =#
    +function _intersection_point(::Type{T}, (a1, a2)::Edge, (b1, b2)::Edge; exact) where T

    Default answer for no intersection

    julia
        line_orient = line_out
    +    intr1 = ((zero(T), zero(T)), (zero(T), zero(T)))
    +    intr2 = intr1
    +    no_intr_result = (line_orient, intr1, intr2)

    Seperate out line segment points

    julia
        (a1x, a1y), (a2x, a2y) = _tuple_point(a1, T), _tuple_point(a2, T)
    +    (b1x, b1y), (b2x, b2y) = _tuple_point(b1, T), _tuple_point(b2, T)

    Check if envelopes of lines intersect

    julia
        a_ext = Extent(X = minmax(a1x, a2x), Y = minmax(a1y, a2y))
    +    b_ext = Extent(X = minmax(b1x, b2x), Y = minmax(b1y, b2y))
    +    !Extents.intersects(a_ext, b_ext) && return no_intr_result

    Check orientation of two line segments with respect to one another

    julia
        a1_orient = Predicates.orient(b1, b2, a1; exact)
    +    a2_orient = Predicates.orient(b1, b2, a2; exact)
    +    a1_orient != 0 && a1_orient == a2_orient && return no_intr_result  # α < 0 or α > 1
    +    b1_orient = Predicates.orient(a1, a2, b1; exact)
    +    b2_orient = Predicates.orient(a1, a2, b2; exact)
    +    b1_orient != 0 && b1_orient == b2_orient && return no_intr_result  # β < 0 or β > 1

    Determine intersection type and intersection point(s)

    julia
        if a1_orient == a2_orient == b1_orient == b2_orient == 0

    Intersection is collinear if all endpoints lie on the same line

    julia
            line_orient, intr1, intr2 = _find_collinear_intersection(T, a1, a2, b1, b2, a_ext, b_ext, no_intr_result)
    +    elseif a1_orient == 0 || a2_orient == 0 || b1_orient == 0 || b2_orient == 0

    Intersection is a hinge if the intersection point is an endpoint

    julia
            line_orient = line_hinge
    +        intr1 = _find_hinge_intersection(T, a1, a2, b1, b2, a1_orient, a2_orient, b1_orient)
    +    else

    Intersection is a cross if there is only one non-endpoint intersection point

    julia
            line_orient = line_cross
    +        intr1 = _find_cross_intersection(T, a1, a2, b1, b2, a_ext, b_ext)
    +    end
    +    return line_orient, intr1, intr2
    +end
    +
    +#= If lines defined by (a1, a2) and (b1, b2) are collinear, find endpoints of overlapping
    +region if they exist. This could result in three possibilities. First, there could be no
    +overlapping region, in which case, the default 'no_intr_result' intersection information is
    +returned. Second, the two regions could just meet at one shared endpoint, in which case it
    +is a hinge intersection with one intersection point. Otherwise, it is a overlapping
    +intersection defined by two of the endpoints of the line segments. =#
    +function _find_collinear_intersection(::Type{T}, a1, a2, b1, b2, a_ext, b_ext, no_intr_result) where T

    Define default return for no intersection points

    julia
        line_orient, intr1, intr2 = no_intr_result

    Determine collinear line overlaps

    julia
        a1_in_b = _point_in_extent(a1, b_ext)
    +    a2_in_b = _point_in_extent(a2, b_ext)
    +    b1_in_a = _point_in_extent(b1, a_ext)
    +    b2_in_a = _point_in_extent(b2, a_ext)

    Determine line distances

    julia
        a_dist, b_dist = distance(a1, a2, T), distance(b1, b2, T)

    Set collinear intersection points if they exist

    julia
        if a1_in_b && a2_in_b      # 1st vertex of a and 2nd vertex of a form overlap
    +        line_orient = line_over
    +        β1 = _clamped_frac(distance(a1, b1, T), b_dist)
    +        β2 = _clamped_frac(distance(a2, b1, T), b_dist)
    +        intr1 = (_tuple_point(a1, T), (zero(T), β1))
    +        intr2 = (_tuple_point(a2, T), (one(T), β2))
    +    elseif b1_in_a && b2_in_a  # 1st vertex of b and 2nd vertex of b form overlap
    +        line_orient = line_over
    +        α1 = _clamped_frac(distance(b1, a1, T), a_dist)
    +        α2 = _clamped_frac(distance(b2, a1, T), a_dist)
    +        intr1 = (_tuple_point(b1, T), (α1, zero(T)))
    +        intr2 = (_tuple_point(b2, T), (α2, one(T)))
    +    elseif a1_in_b && b1_in_a  # 1st vertex of a and 1st vertex of b form overlap
    +        if equals(a1, b1)
    +            line_orient = line_hinge
    +            intr1 = (_tuple_point(a1, T), (zero(T), zero(T)))
    +        else
    +            line_orient = line_over
    +            intr1, intr2 = _set_ab_collinear_intrs(T, a1, b1, zero(T), zero(T), a1, b1, a_dist, b_dist)
    +        end
    +    elseif a1_in_b && b2_in_a  # 1st vertex of a and 2nd vertex of b form overlap
    +        if equals(a1, b2)
    +            line_orient = line_hinge
    +            intr1 = (_tuple_point(a1, T), (zero(T), one(T)))
    +        else
    +            line_orient = line_over
    +            intr1, intr2 = _set_ab_collinear_intrs(T, a1, b2, zero(T), one(T), a1, b1, a_dist, b_dist)
    +        end
    +    elseif a2_in_b && b1_in_a  # 2nd vertex of a and 1st vertex of b form overlap
    +        if equals(a2, b1)
    +            line_orient = line_hinge
    +            intr1 = (_tuple_point(a2, T), (one(T), zero(T)))
    +        else
    +            line_orient = line_over
    +            intr1, intr2 = _set_ab_collinear_intrs(T, a2, b1, one(T), zero(T), a1, b1, a_dist, b_dist)
    +        end
    +    elseif a2_in_b && b2_in_a  # 2nd vertex of a and 2nd vertex of b form overlap
    +        if equals(a2, b2)
    +            line_orient = line_hinge
    +            intr1 = (_tuple_point(a2, T), (one(T), one(T)))
    +        else
    +            line_orient = line_over
    +            intr1, intr2 = _set_ab_collinear_intrs(T, a2, b2, one(T), one(T), a1, b1, a_dist, b_dist)
    +        end
    +    end
    +    return line_orient, intr1, intr2
    +end
    +
    +#= Determine intersection points and segment fractions when overlap is made up one one
    +endpoint of segment (a1, a2) and one endpoint of segment (b1, b2). =#
    +_set_ab_collinear_intrs(::Type{T}, a_pt, b_pt, a_pt_α, b_pt_β, a1, b1, a_dist, b_dist) where T =
    +    (
    +        (_tuple_point(a_pt, T), (a_pt_α, _clamped_frac(distance(a_pt, b1, T), b_dist))),
    +        (_tuple_point(b_pt, T), (_clamped_frac(distance(b_pt, a1, T), a_dist), b_pt_β))
    +    )
    +
    +#= If lines defined by (a1, a2) and (b1, b2) are just touching at one of those endpoints and
    +are not collinear, then they form a hinge, with just that one shared intersection point.
    +Point equality is checked before segment orientation to have maximal accurary on fractions
    +to avoid floating point errors. If the points are not equal, we know that the hinge does not
    +take place at an endpoint and the fractions must be between 0 or 1 (exclusive). =#
    +function _find_hinge_intersection(::Type{T}, a1, a2, b1, b2, a1_orient, a2_orient, b1_orient) where T
    +    pt, α, β = if equals(a1, b1)
    +        _tuple_point(a1, T), zero(T), zero(T)
    +    elseif equals(a1, b2)
    +        _tuple_point(a1, T), zero(T), one(T)
    +    elseif equals(a2, b1)
    +        _tuple_point(a2, T), one(T), zero(T)
    +    elseif equals(a2, b2)
    +        _tuple_point(a2, T), one(T), one(T)
    +    elseif a1_orient == 0
    +        β_val = _clamped_frac(distance(b1, a1, T), distance(b1, b2, T), eps(T))
    +        _tuple_point(a1, T), zero(T), β_val
    +    elseif a2_orient == 0
    +        β_val = _clamped_frac(distance(b1, a2, T), distance(b1, b2, T), eps(T))
    +        _tuple_point(a2, T), one(T), β_val
    +    elseif b1_orient == 0
    +        α_val = _clamped_frac(distance(a1, b1, T), distance(a1, a2, T), eps(T))
    +        _tuple_point(b1, T), α_val, zero(T)
    +    else  # b2_orient == 0
    +        α_val = _clamped_frac(distance(a1, b2, T), distance(a1, a2, T), eps(T))
    +        _tuple_point(b2, T), α_val, one(T)
    +    end
    +    return pt, (α, β)
    +end
    +
    +#= If lines defined by (a1, a2) and (b1, b2) meet at one point that is not an endpoint of
    +either segment, they form a crossing intersection with a singular intersection point. That
    +point is calculated by finding the fractional distance along each segment the point occurs
    +at (α, β). If the point is too close to an endpoint to be distinct, the point shares a value
    +with the endpoint, but with a non-zero and non-one fractional value. If the intersection
    +point calculated is outside of the envelope of the two segments due to floating point error,
    +it is set to the endpoint of the two segments that is closest to the other segment.
    +Regardless of point value, we know that it does not actually occur at an endpoint so the
    +fractions must be between 0 or 1 (exclusive). =#
    +function _find_cross_intersection(::Type{T}, a1, a2, b1, b2, a_ext, b_ext) where T

    First line runs from a to a + Δa

    julia
        (a1x, a1y), (a2x, a2y) = _tuple_point(a1, T), _tuple_point(a2, T)
    +    Δax, Δay = a2x - a1x, a2y - a1y

    Second line runs from b to b + Δb

    julia
        (b1x, b1y), (b2x, b2y) = _tuple_point(b1, T), _tuple_point(b2, T)
    +    Δbx, Δby = b2x - b1x, b2y - b1y

    Differences between starting points

    julia
        Δbax = b1x - a1x
    +    Δbay = b1y - a1y
    +    a_cross_b = Δax * Δby - Δay * Δbx

    Determine α value where 0 < α < 1 and β value where 0 < β < 1

    julia
        α = _clamped_frac(Δbax * Δby - Δbay * Δbx, a_cross_b, eps(T))
    +    β = _clamped_frac(Δbax * Δay - Δbay * Δax, a_cross_b, eps(T))
    +
    +    #= Intersection will be where a1 + α * Δa = b1 + β * Δb. However, due to floating point
    +    inaccuracies, α and β calculations may yield different intersection points. Average
    +    both points together to minimize difference from real value, as long as segment isn't
    +    vertical or horizontal as this will almost certainly lead to the point being outside the
    +    envelope due to floating point error. Also note that floating point limitations could
    +    make intersection be endpoint if α≈0 or α≈1.=#
    +    x = if Δax == 0
    +        a1x
    +    elseif Δbx == 0
    +        b1x
    +    else
    +        (a1x + α * Δax + b1x + β * Δbx) / 2
    +    end
    +    y = if Δay == 0
    +        a1y
    +    elseif Δby == 0
    +        b1y
    +    else
    +        (a1y + α * Δay + b1y + β * Δby) / 2
    +    end
    +    pt = (x, y)

    Check if point is within segment envelopes and adjust to endpoint if not

    julia
        if !_point_in_extent(pt, a_ext) || !_point_in_extent(pt, b_ext)
    +        pt, α, β = _nearest_endpoint(T, a1, a2, b1, b2)
    +    end
    +    return (pt, (α, β))
    +end

    Find endpoint of either segment that is closest to the opposite segment

    julia
    function _nearest_endpoint(::Type{T}, a1, a2, b1, b2) where T

    Create lines from segments and calculate segment length

    julia
        a_line, a_dist = GI.Line(StaticArrays.SVector(a1, a2)), distance(a1, a2, T)
    +    b_line, b_dist = GI.Line(StaticArrays.SVector(b1, b2)), distance(b1, b2, T)

    Determine distance from a1 to segment b

    julia
        min_pt, min_dist = a1, distance(a1, b_line, T)
    +    α, β = eps(T), _clamped_frac(distance(min_pt, b1, T), b_dist, eps(T))

    Determine distance from a2 to segment b

    julia
        dist = distance(a2, b_line, T)
    +    if dist < min_dist
    +        min_pt, min_dist = a2, dist
    +        α, β = one(T) - eps(T), _clamped_frac(distance(min_pt, b1, T), b_dist, eps(T))
    +    end

    Determine distance from b1 to segment a

    julia
        dist = distance(b1, a_line, T)
    +    if dist < min_dist
    +        min_pt, min_dist = b1, dist
    +        α, β = _clamped_frac(distance(min_pt, a1, T), a_dist, eps(T)), eps(T)
    +    end

    Determine distance from b2 to segment a

    julia
        dist = distance(b2, a_line, T)
    +    if dist < min_dist
    +        min_pt, min_dist = b2, dist
    +        α, β = _clamped_frac(distance(min_pt, a2, T), a_dist, eps(T)), one(T) - eps(T)
    +    end

    Return point with smallest distance

    julia
        return _tuple_point(min_pt, T), α, β
    +end

    Return value of x/y clamped between ϵ and 1 - ϵ

    julia
    _clamped_frac(x::T, y::T, ϵ = zero(T)) where T = clamp(x / y, ϵ, one(T) - ϵ)

    This page was generated using Literate.jl.

    `,80)]))}const y=i(h,[["render",l]]);export{g as __pageData,y as default}; diff --git a/previews/PR239/assets/source_methods_clipping_predicates.md.BJITr_Uq.js b/previews/PR239/assets/source_methods_clipping_predicates.md.BJITr_Uq.js new file mode 100644 index 000000000..3e7fbf706 --- /dev/null +++ b/previews/PR239/assets/source_methods_clipping_predicates.md.BJITr_Uq.js @@ -0,0 +1,44 @@ +import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const c=JSON.parse('{"title":"If we want to inject adaptivity, we would do something like:","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/clipping/predicates.md","filePath":"source/methods/clipping/predicates.md","lastUpdated":null}'),h={name:"source/methods/clipping/predicates.md"};function e(p,s,l,k,r,d){return t(),a("div",null,s[0]||(s[0]=[n(`
    julia
    module Predicates
    +    using ExactPredicates, ExactPredicates.Codegen
    +    import ExactPredicates: ext
    +    import ExactPredicates.Codegen: group!, @genpredicate
    +    import GeometryOps: _False, _True, _booltype, _tuple_point
    +    import GeoInterface as GI
    +
    +    #= Determine the orientation of c with regards to the oriented segment (a, b).
    +    Return 1 if c is to the left of (a, b).
    +    Return -1 if c is to the right of (a, b).
    +    Return 0 if c is on (a, b) or if a == b. =#
    +    orient(a, b, c; exact) = _orient(_booltype(exact), a, b, c)

    If exact is true, use ExactPredicates to calculate the orientation.

    julia
        _orient(::_True, a, b, c) = ExactPredicates.orient(_tuple_point(a, Float64), _tuple_point(b, Float64), _tuple_point(c, Float64))

    If exact is false, calculate the orientation without using ExactPredicates.

    julia
        function _orient(exact::_False, a, b, c)
    +        a = a .- c
    +        b = b .- c
    +        return _cross(exact, a, b)
    +    end
    +
    +    #= Determine the sign of the cross product of a and b.
    +    Return 1 if the cross product is positive.
    +    Return -1 if the cross product is negative.
    +    Return 0 if the cross product is 0. =#
    +    cross(a, b; exact) = _cross(_booltype(exact), a, b)
    +
    +    #= If \`exact\` is \`true\`, use exact cross product calculation created using
    +    \`ExactPredicates\`generated predicate. Note that as of now \`ExactPredicates\` requires
    +    Float64 so we must convert points a and b. =#
    +    _cross(::_True, a, b) = _cross_exact(_tuple_point(a, Float64), _tuple_point(b, Float64))

    Exact cross product calculation using ExactPredicates.

    julia
        @genpredicate function _cross_exact(a :: 2, b :: 2)
    +        group!(a...)
    +        group!(b...)
    +        ext(a, b)
    +    end

    If exact is false, calculate the cross product without using ExactPredicates.

    julia
        function _cross(::_False, a, b)
    +        c_t1 = GI.x(a) * GI.y(b)
    +        c_t2 = GI.y(a) * GI.x(b)
    +        c_val = if isapprox(c_t1, c_t2)
    +            0
    +        else
    +            sign(c_t1 - c_t2)
    +        end
    +        return c_val
    +    end
    +
    +end
    +
    +import .Predicates

    If we want to inject adaptivity, we would do something like:

    function cross(a, b, c) # try Predicates._cross_naive(a, b, c) # check the error bound there # then try Predicates._cross_adaptive(a, b, c) # then try Predicates._cross_exact end


    This page was generated using Literate.jl.

    `,13)]))}const g=i(h,[["render",e]]);export{c as __pageData,g as default}; diff --git a/previews/PR239/assets/source_methods_clipping_predicates.md.BJITr_Uq.lean.js b/previews/PR239/assets/source_methods_clipping_predicates.md.BJITr_Uq.lean.js new file mode 100644 index 000000000..3e7fbf706 --- /dev/null +++ b/previews/PR239/assets/source_methods_clipping_predicates.md.BJITr_Uq.lean.js @@ -0,0 +1,44 @@ +import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const c=JSON.parse('{"title":"If we want to inject adaptivity, we would do something like:","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/clipping/predicates.md","filePath":"source/methods/clipping/predicates.md","lastUpdated":null}'),h={name:"source/methods/clipping/predicates.md"};function e(p,s,l,k,r,d){return t(),a("div",null,s[0]||(s[0]=[n(`
    julia
    module Predicates
    +    using ExactPredicates, ExactPredicates.Codegen
    +    import ExactPredicates: ext
    +    import ExactPredicates.Codegen: group!, @genpredicate
    +    import GeometryOps: _False, _True, _booltype, _tuple_point
    +    import GeoInterface as GI
    +
    +    #= Determine the orientation of c with regards to the oriented segment (a, b).
    +    Return 1 if c is to the left of (a, b).
    +    Return -1 if c is to the right of (a, b).
    +    Return 0 if c is on (a, b) or if a == b. =#
    +    orient(a, b, c; exact) = _orient(_booltype(exact), a, b, c)

    If exact is true, use ExactPredicates to calculate the orientation.

    julia
        _orient(::_True, a, b, c) = ExactPredicates.orient(_tuple_point(a, Float64), _tuple_point(b, Float64), _tuple_point(c, Float64))

    If exact is false, calculate the orientation without using ExactPredicates.

    julia
        function _orient(exact::_False, a, b, c)
    +        a = a .- c
    +        b = b .- c
    +        return _cross(exact, a, b)
    +    end
    +
    +    #= Determine the sign of the cross product of a and b.
    +    Return 1 if the cross product is positive.
    +    Return -1 if the cross product is negative.
    +    Return 0 if the cross product is 0. =#
    +    cross(a, b; exact) = _cross(_booltype(exact), a, b)
    +
    +    #= If \`exact\` is \`true\`, use exact cross product calculation created using
    +    \`ExactPredicates\`generated predicate. Note that as of now \`ExactPredicates\` requires
    +    Float64 so we must convert points a and b. =#
    +    _cross(::_True, a, b) = _cross_exact(_tuple_point(a, Float64), _tuple_point(b, Float64))

    Exact cross product calculation using ExactPredicates.

    julia
        @genpredicate function _cross_exact(a :: 2, b :: 2)
    +        group!(a...)
    +        group!(b...)
    +        ext(a, b)
    +    end

    If exact is false, calculate the cross product without using ExactPredicates.

    julia
        function _cross(::_False, a, b)
    +        c_t1 = GI.x(a) * GI.y(b)
    +        c_t2 = GI.y(a) * GI.x(b)
    +        c_val = if isapprox(c_t1, c_t2)
    +            0
    +        else
    +            sign(c_t1 - c_t2)
    +        end
    +        return c_val
    +    end
    +
    +end
    +
    +import .Predicates

    If we want to inject adaptivity, we would do something like:

    function cross(a, b, c) # try Predicates._cross_naive(a, b, c) # check the error bound there # then try Predicates._cross_adaptive(a, b, c) # then try Predicates._cross_exact end


    This page was generated using Literate.jl.

    `,13)]))}const g=i(h,[["render",e]]);export{c as __pageData,g as default}; diff --git a/previews/PR239/assets/source_methods_clipping_union.md.DlTyWPn1.js b/previews/PR239/assets/source_methods_clipping_union.md.DlTyWPn1.js new file mode 100644 index 000000000..ecc318c2a --- /dev/null +++ b/previews/PR239/assets/source_methods_clipping_union.md.DlTyWPn1.js @@ -0,0 +1,251 @@ +import{_ as i,c as a,a5 as n,o as l}from"./chunks/framework.onQNwZ2I.js";const y=JSON.parse('{"title":"Union Polygon Clipping","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/clipping/union.md","filePath":"source/methods/clipping/union.md","lastUpdated":null}'),h={name:"source/methods/clipping/union.md"};function p(t,s,k,e,r,E){return l(),a("div",null,s[0]||(s[0]=[n(`

    Union Polygon Clipping

    julia
    export union
    +
    +"""
    +    union(geom_a, geom_b, [::Type{T}]; target::Type, fix_multipoly = UnionIntersectingPolygons())
    +
    +Return the union between two geometries as a list of geometries. Return an empty list if
    +none are found. The type of the list will be constrained as much as possible given the input
    +geometries. Furthermore, the user can provide a \`taget\` type as a keyword argument and a
    +list of target geometries found in the difference will be returned. The user can also
    +provide a float type 'T' that they would like the points of returned geometries to be. If
    +the user is taking a intersection involving one or more multipolygons, and the multipolygon
    +might be comprised of polygons that intersect, if \`fix_multipoly\` is set to an
    +\`IntersectingPolygons\` correction (the default is \`UnionIntersectingPolygons()\`), then the
    +needed multipolygons will be fixed to be valid before performing the intersection to ensure
    +a correct answer. Only set \`fix_multipoly\` to false if you know that the multipolygons are
    +valid, as it will avoid unneeded computation.
    +
    +Calculates the union between two polygons.
    +# Example
    +
    +\`\`\`jldoctest
    +import GeoInterface as GI, GeometryOps as GO
    +
    +p1 = GI.Polygon([[(0.0, 0.0), (5.0, 5.0), (10.0, 0.0), (5.0, -5.0), (0.0, 0.0)]])
    +p2 = GI.Polygon([[(3.0, 0.0), (8.0, 5.0), (13.0, 0.0), (8.0, -5.0), (3.0, 0.0)]])
    +union_poly = GO.union(p1, p2; target = GI.PolygonTrait())
    +GI.coordinates.(union_poly)

    output

    julia
    1-element Vector{Vector{Vector{Vector{Float64}}}}:
    + [[[6.5, 3.5], [5.0, 5.0], [0.0, 0.0], [5.0, -5.0], [6.5, -3.5], [8.0, -5.0], [13.0, 0.0], [8.0, 5.0], [6.5, 3.5]]]
    +\`\`\`
    +"""
    +function union(
    +    geom_a, geom_b, ::Type{T}=Float64; target=nothing, kwargs...
    +) where {T<:AbstractFloat}
    +    return _union(
    +        TraitTarget(target), T, GI.trait(geom_a), geom_a, GI.trait(geom_b), geom_b;
    +        exact = _True(), kwargs...,
    +    )
    +end
    +
    +#= This 'union' implementation returns the union of two polygons. The algorithm to determine
    +the union was adapted from "Efficient clipping of efficient polygons," by Greiner and
    +Hormann (1998). DOI: https://doi.org/10.1145/274363.274364 =#
    +function _union(
    +    ::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.PolygonTrait, poly_a,
    +    ::GI.PolygonTrait, poly_b;
    +    exact, kwargs...,
    +) where T

    First, I get the exteriors of the two polygons

    julia
        ext_a = GI.getexterior(poly_a)
    +    ext_b = GI.getexterior(poly_b)

    Then, I get the union of the exteriors

    julia
        a_list, b_list, a_idx_list = _build_ab_list(T, ext_a, ext_b, _union_delay_cross_f, _union_delay_bounce_f; exact)
    +    polys = _trace_polynodes(T, a_list, b_list, a_idx_list, _union_step, poly_a, poly_b)
    +    n_pieces = length(polys)

    Check if one polygon totally within other and if so, return the larger polygon

    julia
        a_in_b, b_in_a = false, false
    +    if n_pieces == 0 # no crossing points, determine if either poly is inside the other
    +        a_in_b, b_in_a = _find_non_cross_orientation(a_list, b_list, ext_a, ext_b; exact)
    +        if a_in_b
    +            push!(polys, GI.Polygon([_linearring(tuples(ext_b))]))
    +        elseif b_in_a
    +            push!(polys,  GI.Polygon([_linearring(tuples(ext_a))]))
    +        else
    +            push!(polys, tuples(poly_a))
    +            push!(polys, tuples(poly_b))
    +            return polys
    +        end
    +    elseif n_pieces > 1
    +        #= extra polygons are holes (n_pieces == 1 is the desired state) and since
    +        holes are formed by regions exterior to both poly_a and poly_b, they can't interact
    +        with pre-existing holes =#
    +        sort!(polys, by = area, rev = true)  # sort by area so first element is the exterior

    the first element is the exterior, the rest are holes

    julia
            @views append!(polys[1].geom, (GI.getexterior(p) for p in polys[2:end]))
    +        keepat!(polys, 1)
    +    end

    Add in holes

    julia
        if GI.nhole(poly_a) != 0 || GI.nhole(poly_b) != 0
    +        _add_union_holes!(polys, a_in_b, b_in_a, poly_a, poly_b; exact)
    +    end

    Remove unneeded collinear points on same edge

    julia
        _remove_collinear_points!(polys, [false], poly_a, poly_b)
    +    return polys
    +end

    Helper functions for Unions with Greiner and Hormann Polygon Clipping

    julia
    #= When marking the crossing status of a delayed crossing, the chain start point is crossing
    +when the start point is a entry point and is a bouncing point when the start point is an
    +exit point. The end of the chain has the opposite crossing / bouncing status. =#
    +_union_delay_cross_f(x) = (x, !x)
    +
    +#= When marking the crossing status of a delayed bouncing, the chain start and end points
    +are bouncing if the current polygon's adjacent edges are within the non-tracing polygon. If
    +the edges are outside then the chain endpoints are marked as crossing. x is a boolean
    +representing if the edges are inside or outside of the polygon. =#
    +_union_delay_bounce_f(x, _) = !x
    +
    +#= When tracing polygons, step backwards if the most recent intersection point was an entry
    +point, else step forwards where x is the entry/exit status. =#
    +_union_step(x, _) = x ? (-1) : 1
    +
    +#= Add holes from two polygons to the exterior polygon formed by their union. If adding the
    +the holes reveals that the polygons aren't actually intersecting, return the original
    +polygons. =#
    +function _add_union_holes!(polys, a_in_b, b_in_a, poly_a, poly_b; exact)
    +    if a_in_b
    +        _add_union_holes_contained_polys!(polys, poly_a, poly_b; exact)
    +    elseif b_in_a
    +        _add_union_holes_contained_polys!(polys, poly_b, poly_a; exact)
    +    else  # Polygons intersect, but neither is contained in the other
    +        n_a_holes = GI.nhole(poly_a)
    +        ext_poly_a = GI.Polygon(StaticArrays.SVector(GI.getexterior(poly_a)))
    +        ext_poly_b = GI.Polygon(StaticArrays.SVector(GI.getexterior(poly_b)))
    +        #= Start with poly_b when comparing with holes from poly_a and then switch to poly_a
    +        to compare with holes from poly_b. For current_poly, use ext_poly_b to avoid
    +        repeating overlapping holes in poly_a and poly_b =#
    +        curr_exterior_poly = n_a_holes > 0 ? ext_poly_b : ext_poly_a
    +        current_poly = n_a_holes > 0 ? ext_poly_b : poly_a

    Loop over all holes in both original polygons

    julia
            for (i, ih) in enumerate(Iterators.flatten((GI.gethole(poly_a), GI.gethole(poly_b))))
    +            ih = _linearring(ih)
    +            in_ext, _, _ = _line_polygon_interactions(ih, curr_exterior_poly; exact, closed_line = true)
    +            if !in_ext
    +                #= if the hole isn't in the overlapping region between the two polygons, add
    +                the hole to the resulting polygon as we know it can't interact with any
    +                other holes =#
    +                push!(polys[1].geom, ih)
    +            else
    +                #= if the hole is at least partially in the overlapping region, take the
    +                difference of the hole from the polygon it didn't originate from - note that
    +                when current_poly is poly_a this includes poly_a holes so overlapping holes
    +                between poly_a and poly_b within the overlap are added, in addition to all
    +                holes in non-overlapping regions =#
    +                h_poly = GI.Polygon(StaticArrays.SVector(ih))
    +                new_holes = difference(h_poly, current_poly; target = GI.PolygonTrait())
    +                append!(polys[1].geom, (GI.getexterior(new_h) for new_h in new_holes))
    +            end
    +            if i == n_a_holes
    +                curr_exterior_poly = ext_poly_a
    +                current_poly = poly_a
    +            end
    +        end
    +    end
    +    return
    +end
    +
    +#= Add holes holes to the union of two polygons where one of the original polygons was
    +inside of the other. If adding the the holes reveal that the polygons aren't actually
    +intersecting, return the original polygons.=#
    +function _add_union_holes_contained_polys!(polys, interior_poly, exterior_poly; exact)
    +    union_poly = polys[1]
    +    ext_int_ring = GI.getexterior(interior_poly)
    +    for (i, ih) in enumerate(GI.gethole(exterior_poly))
    +        poly_ih = GI.Polygon(StaticArrays.SVector(ih))
    +        in_ih, on_ih, out_ih = _line_polygon_interactions(ext_int_ring, poly_ih; exact, closed_line = true)
    +        if in_ih  # at least part of interior polygon exterior is within the ith hole
    +            if !on_ih && !out_ih
    +                #= interior polygon is completely within the ith hole - polygons aren't
    +                touching and do not actually form a union =#
    +                polys[1] = tuples(interior_poly)
    +                push!(polys, tuples(exterior_poly))
    +                return polys
    +            else
    +                #= interior polygon is partially within the ith hole - area of interior
    +                polygon reduces the size of the hole =#
    +                new_holes = difference(poly_ih, interior_poly; target = GI.PolygonTrait())
    +                append!(union_poly.geom, (GI.getexterior(new_h) for new_h in new_holes))
    +            end
    +        else  # none of interior polygon exterior is within the ith hole
    +            if !out_ih
    +                #= interior polygon's exterior is the same as the ith hole - polygons do
    +                form a union, but do not overlap so all holes stay in final polygon =#
    +                append!(union_poly.geom, Iterators.drop(GI.gethole(exterior_poly), i))
    +                append!(union_poly.geom, GI.gethole(interior_poly))
    +                return polys
    +            else
    +                #= interior polygon's exterior is outside of the ith hole - the interior
    +                polygon could either be disjoint from the hole, or contain the hole =#
    +                ext_int_poly = GI.Polygon(StaticArrays.SVector(ext_int_ring))
    +                in_int, _, _ = _line_polygon_interactions(ih, ext_int_poly; exact, closed_line = true)
    +                if in_int
    +                    #= interior polygon contains the hole - overlapping holes between the
    +                    interior and exterior polygons will be added =#
    +                    for jh in GI.gethole(interior_poly)
    +                        poly_jh = GI.Polygon(StaticArrays.SVector(jh))
    +                        if intersects(poly_ih, poly_jh)
    +                            new_holes = intersection(poly_ih, poly_jh; target = GI.PolygonTrait())
    +                            append!(union_poly.geom, (GI.getexterior(new_h) for new_h in new_holes))
    +                        end
    +                    end
    +                else
    +                    #= interior polygon and the exterior polygon are disjoint - add the ith
    +                    hole as it is not covered by the interior polygon =#
    +                    push!(union_poly.geom, ih)
    +                end
    +            end
    +        end
    +    end
    +    return
    +end
    +
    +#= Polygon with multipolygon union - note that all sub-polygons of \`multipoly_b\` will be
    +included, unioning these sub-polygons with \`poly_a\` where they intersect. Unless specified
    +with \`fix_multipoly = nothing\`, \`multipolygon_b\` will be validated using the given (default
    +is \`UnionIntersectingPolygons()\`) correction. =#
    +function _union(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.PolygonTrait, poly_a,
    +    ::GI.MultiPolygonTrait, multipoly_b;
    +    fix_multipoly = UnionIntersectingPolygons(), kwargs...,
    +) where T
    +    if !isnothing(fix_multipoly) # Fix multipoly_b to prevent repeated regions in the output
    +        multipoly_b = fix_multipoly(multipoly_b)
    +    end
    +    polys = [tuples(poly_a, T)]
    +    for poly_b in GI.getpolygon(multipoly_b)
    +        if intersects(polys[1], poly_b)

    If polygons intersect and form a new polygon, swap out polygon

    julia
                new_polys = union(polys[1], poly_b; target)
    +            if length(new_polys) > 1 # case where they intersect by just one point
    +                push!(polys, tuples(poly_b, T))  # add poly_b to list
    +            else
    +                polys[1] = new_polys[1]
    +            end
    +        else

    If they don't intersect, poly_b is now a part of the union as its own polygon

    julia
                push!(polys, tuples(poly_b, T))
    +        end
    +    end
    +    return polys
    +end
    +
    +#= Multipolygon with polygon union is equivalent to taking the union of the polygon with the
    +multipolygon and thus simply switches the order of operations and calls the above method. =#
    +_union(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.MultiPolygonTrait, multipoly_a,
    +    ::GI.PolygonTrait, poly_b;
    +    kwargs...,
    +) where T = union(poly_b, multipoly_a; target, kwargs...)
    +
    +#= Multipolygon with multipolygon union - note that all of the sub-polygons of \`multipoly_a\`
    +and the sub-polygons of \`multipoly_b\` are included and combined together where there are
    +intersections. Unless specified with \`fix_multipoly = nothing\`, \`multipolygon_b\` will be
    +validated using the given (default is \`UnionIntersectingPolygons()\`) correction. =#
    +function _union(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.MultiPolygonTrait, multipoly_a,
    +    ::GI.MultiPolygonTrait, multipoly_b;
    +    fix_multipoly = UnionIntersectingPolygons(), kwargs...,
    +) where T
    +    if !isnothing(fix_multipoly) # Fix multipoly_b to prevent repeated regions in the output
    +        multipoly_b = fix_multipoly(multipoly_b)
    +        fix_multipoly = nothing
    +    end
    +    multipolys = multipoly_b
    +    local polys
    +    for poly_a in GI.getpolygon(multipoly_a)
    +        polys = union(poly_a, multipolys; target, fix_multipoly)
    +        multipolys = GI.MultiPolygon(polys)
    +    end
    +    return polys
    +end

    Many type and target combos aren't implemented

    julia
    function _union(
    +    ::TraitTarget{Target}, ::Type{T},
    +    trait_a::GI.AbstractTrait, geom_a,
    +    trait_b::GI.AbstractTrait, geom_b;
    +    kwargs...
    +) where {Target,T}
    +    throw(ArgumentError("Union between $trait_a and $trait_b with target $Target isn't implemented yet."))
    +    return nothing
    +end

    This page was generated using Literate.jl.

    `,28)]))}const d=i(h,[["render",p]]);export{y as __pageData,d as default}; diff --git a/previews/PR239/assets/source_methods_clipping_union.md.DlTyWPn1.lean.js b/previews/PR239/assets/source_methods_clipping_union.md.DlTyWPn1.lean.js new file mode 100644 index 000000000..ecc318c2a --- /dev/null +++ b/previews/PR239/assets/source_methods_clipping_union.md.DlTyWPn1.lean.js @@ -0,0 +1,251 @@ +import{_ as i,c as a,a5 as n,o as l}from"./chunks/framework.onQNwZ2I.js";const y=JSON.parse('{"title":"Union Polygon Clipping","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/clipping/union.md","filePath":"source/methods/clipping/union.md","lastUpdated":null}'),h={name:"source/methods/clipping/union.md"};function p(t,s,k,e,r,E){return l(),a("div",null,s[0]||(s[0]=[n(`

    Union Polygon Clipping

    julia
    export union
    +
    +"""
    +    union(geom_a, geom_b, [::Type{T}]; target::Type, fix_multipoly = UnionIntersectingPolygons())
    +
    +Return the union between two geometries as a list of geometries. Return an empty list if
    +none are found. The type of the list will be constrained as much as possible given the input
    +geometries. Furthermore, the user can provide a \`taget\` type as a keyword argument and a
    +list of target geometries found in the difference will be returned. The user can also
    +provide a float type 'T' that they would like the points of returned geometries to be. If
    +the user is taking a intersection involving one or more multipolygons, and the multipolygon
    +might be comprised of polygons that intersect, if \`fix_multipoly\` is set to an
    +\`IntersectingPolygons\` correction (the default is \`UnionIntersectingPolygons()\`), then the
    +needed multipolygons will be fixed to be valid before performing the intersection to ensure
    +a correct answer. Only set \`fix_multipoly\` to false if you know that the multipolygons are
    +valid, as it will avoid unneeded computation.
    +
    +Calculates the union between two polygons.
    +# Example
    +
    +\`\`\`jldoctest
    +import GeoInterface as GI, GeometryOps as GO
    +
    +p1 = GI.Polygon([[(0.0, 0.0), (5.0, 5.0), (10.0, 0.0), (5.0, -5.0), (0.0, 0.0)]])
    +p2 = GI.Polygon([[(3.0, 0.0), (8.0, 5.0), (13.0, 0.0), (8.0, -5.0), (3.0, 0.0)]])
    +union_poly = GO.union(p1, p2; target = GI.PolygonTrait())
    +GI.coordinates.(union_poly)

    output

    julia
    1-element Vector{Vector{Vector{Vector{Float64}}}}:
    + [[[6.5, 3.5], [5.0, 5.0], [0.0, 0.0], [5.0, -5.0], [6.5, -3.5], [8.0, -5.0], [13.0, 0.0], [8.0, 5.0], [6.5, 3.5]]]
    +\`\`\`
    +"""
    +function union(
    +    geom_a, geom_b, ::Type{T}=Float64; target=nothing, kwargs...
    +) where {T<:AbstractFloat}
    +    return _union(
    +        TraitTarget(target), T, GI.trait(geom_a), geom_a, GI.trait(geom_b), geom_b;
    +        exact = _True(), kwargs...,
    +    )
    +end
    +
    +#= This 'union' implementation returns the union of two polygons. The algorithm to determine
    +the union was adapted from "Efficient clipping of efficient polygons," by Greiner and
    +Hormann (1998). DOI: https://doi.org/10.1145/274363.274364 =#
    +function _union(
    +    ::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.PolygonTrait, poly_a,
    +    ::GI.PolygonTrait, poly_b;
    +    exact, kwargs...,
    +) where T

    First, I get the exteriors of the two polygons

    julia
        ext_a = GI.getexterior(poly_a)
    +    ext_b = GI.getexterior(poly_b)

    Then, I get the union of the exteriors

    julia
        a_list, b_list, a_idx_list = _build_ab_list(T, ext_a, ext_b, _union_delay_cross_f, _union_delay_bounce_f; exact)
    +    polys = _trace_polynodes(T, a_list, b_list, a_idx_list, _union_step, poly_a, poly_b)
    +    n_pieces = length(polys)

    Check if one polygon totally within other and if so, return the larger polygon

    julia
        a_in_b, b_in_a = false, false
    +    if n_pieces == 0 # no crossing points, determine if either poly is inside the other
    +        a_in_b, b_in_a = _find_non_cross_orientation(a_list, b_list, ext_a, ext_b; exact)
    +        if a_in_b
    +            push!(polys, GI.Polygon([_linearring(tuples(ext_b))]))
    +        elseif b_in_a
    +            push!(polys,  GI.Polygon([_linearring(tuples(ext_a))]))
    +        else
    +            push!(polys, tuples(poly_a))
    +            push!(polys, tuples(poly_b))
    +            return polys
    +        end
    +    elseif n_pieces > 1
    +        #= extra polygons are holes (n_pieces == 1 is the desired state) and since
    +        holes are formed by regions exterior to both poly_a and poly_b, they can't interact
    +        with pre-existing holes =#
    +        sort!(polys, by = area, rev = true)  # sort by area so first element is the exterior

    the first element is the exterior, the rest are holes

    julia
            @views append!(polys[1].geom, (GI.getexterior(p) for p in polys[2:end]))
    +        keepat!(polys, 1)
    +    end

    Add in holes

    julia
        if GI.nhole(poly_a) != 0 || GI.nhole(poly_b) != 0
    +        _add_union_holes!(polys, a_in_b, b_in_a, poly_a, poly_b; exact)
    +    end

    Remove unneeded collinear points on same edge

    julia
        _remove_collinear_points!(polys, [false], poly_a, poly_b)
    +    return polys
    +end

    Helper functions for Unions with Greiner and Hormann Polygon Clipping

    julia
    #= When marking the crossing status of a delayed crossing, the chain start point is crossing
    +when the start point is a entry point and is a bouncing point when the start point is an
    +exit point. The end of the chain has the opposite crossing / bouncing status. =#
    +_union_delay_cross_f(x) = (x, !x)
    +
    +#= When marking the crossing status of a delayed bouncing, the chain start and end points
    +are bouncing if the current polygon's adjacent edges are within the non-tracing polygon. If
    +the edges are outside then the chain endpoints are marked as crossing. x is a boolean
    +representing if the edges are inside or outside of the polygon. =#
    +_union_delay_bounce_f(x, _) = !x
    +
    +#= When tracing polygons, step backwards if the most recent intersection point was an entry
    +point, else step forwards where x is the entry/exit status. =#
    +_union_step(x, _) = x ? (-1) : 1
    +
    +#= Add holes from two polygons to the exterior polygon formed by their union. If adding the
    +the holes reveals that the polygons aren't actually intersecting, return the original
    +polygons. =#
    +function _add_union_holes!(polys, a_in_b, b_in_a, poly_a, poly_b; exact)
    +    if a_in_b
    +        _add_union_holes_contained_polys!(polys, poly_a, poly_b; exact)
    +    elseif b_in_a
    +        _add_union_holes_contained_polys!(polys, poly_b, poly_a; exact)
    +    else  # Polygons intersect, but neither is contained in the other
    +        n_a_holes = GI.nhole(poly_a)
    +        ext_poly_a = GI.Polygon(StaticArrays.SVector(GI.getexterior(poly_a)))
    +        ext_poly_b = GI.Polygon(StaticArrays.SVector(GI.getexterior(poly_b)))
    +        #= Start with poly_b when comparing with holes from poly_a and then switch to poly_a
    +        to compare with holes from poly_b. For current_poly, use ext_poly_b to avoid
    +        repeating overlapping holes in poly_a and poly_b =#
    +        curr_exterior_poly = n_a_holes > 0 ? ext_poly_b : ext_poly_a
    +        current_poly = n_a_holes > 0 ? ext_poly_b : poly_a

    Loop over all holes in both original polygons

    julia
            for (i, ih) in enumerate(Iterators.flatten((GI.gethole(poly_a), GI.gethole(poly_b))))
    +            ih = _linearring(ih)
    +            in_ext, _, _ = _line_polygon_interactions(ih, curr_exterior_poly; exact, closed_line = true)
    +            if !in_ext
    +                #= if the hole isn't in the overlapping region between the two polygons, add
    +                the hole to the resulting polygon as we know it can't interact with any
    +                other holes =#
    +                push!(polys[1].geom, ih)
    +            else
    +                #= if the hole is at least partially in the overlapping region, take the
    +                difference of the hole from the polygon it didn't originate from - note that
    +                when current_poly is poly_a this includes poly_a holes so overlapping holes
    +                between poly_a and poly_b within the overlap are added, in addition to all
    +                holes in non-overlapping regions =#
    +                h_poly = GI.Polygon(StaticArrays.SVector(ih))
    +                new_holes = difference(h_poly, current_poly; target = GI.PolygonTrait())
    +                append!(polys[1].geom, (GI.getexterior(new_h) for new_h in new_holes))
    +            end
    +            if i == n_a_holes
    +                curr_exterior_poly = ext_poly_a
    +                current_poly = poly_a
    +            end
    +        end
    +    end
    +    return
    +end
    +
    +#= Add holes holes to the union of two polygons where one of the original polygons was
    +inside of the other. If adding the the holes reveal that the polygons aren't actually
    +intersecting, return the original polygons.=#
    +function _add_union_holes_contained_polys!(polys, interior_poly, exterior_poly; exact)
    +    union_poly = polys[1]
    +    ext_int_ring = GI.getexterior(interior_poly)
    +    for (i, ih) in enumerate(GI.gethole(exterior_poly))
    +        poly_ih = GI.Polygon(StaticArrays.SVector(ih))
    +        in_ih, on_ih, out_ih = _line_polygon_interactions(ext_int_ring, poly_ih; exact, closed_line = true)
    +        if in_ih  # at least part of interior polygon exterior is within the ith hole
    +            if !on_ih && !out_ih
    +                #= interior polygon is completely within the ith hole - polygons aren't
    +                touching and do not actually form a union =#
    +                polys[1] = tuples(interior_poly)
    +                push!(polys, tuples(exterior_poly))
    +                return polys
    +            else
    +                #= interior polygon is partially within the ith hole - area of interior
    +                polygon reduces the size of the hole =#
    +                new_holes = difference(poly_ih, interior_poly; target = GI.PolygonTrait())
    +                append!(union_poly.geom, (GI.getexterior(new_h) for new_h in new_holes))
    +            end
    +        else  # none of interior polygon exterior is within the ith hole
    +            if !out_ih
    +                #= interior polygon's exterior is the same as the ith hole - polygons do
    +                form a union, but do not overlap so all holes stay in final polygon =#
    +                append!(union_poly.geom, Iterators.drop(GI.gethole(exterior_poly), i))
    +                append!(union_poly.geom, GI.gethole(interior_poly))
    +                return polys
    +            else
    +                #= interior polygon's exterior is outside of the ith hole - the interior
    +                polygon could either be disjoint from the hole, or contain the hole =#
    +                ext_int_poly = GI.Polygon(StaticArrays.SVector(ext_int_ring))
    +                in_int, _, _ = _line_polygon_interactions(ih, ext_int_poly; exact, closed_line = true)
    +                if in_int
    +                    #= interior polygon contains the hole - overlapping holes between the
    +                    interior and exterior polygons will be added =#
    +                    for jh in GI.gethole(interior_poly)
    +                        poly_jh = GI.Polygon(StaticArrays.SVector(jh))
    +                        if intersects(poly_ih, poly_jh)
    +                            new_holes = intersection(poly_ih, poly_jh; target = GI.PolygonTrait())
    +                            append!(union_poly.geom, (GI.getexterior(new_h) for new_h in new_holes))
    +                        end
    +                    end
    +                else
    +                    #= interior polygon and the exterior polygon are disjoint - add the ith
    +                    hole as it is not covered by the interior polygon =#
    +                    push!(union_poly.geom, ih)
    +                end
    +            end
    +        end
    +    end
    +    return
    +end
    +
    +#= Polygon with multipolygon union - note that all sub-polygons of \`multipoly_b\` will be
    +included, unioning these sub-polygons with \`poly_a\` where they intersect. Unless specified
    +with \`fix_multipoly = nothing\`, \`multipolygon_b\` will be validated using the given (default
    +is \`UnionIntersectingPolygons()\`) correction. =#
    +function _union(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.PolygonTrait, poly_a,
    +    ::GI.MultiPolygonTrait, multipoly_b;
    +    fix_multipoly = UnionIntersectingPolygons(), kwargs...,
    +) where T
    +    if !isnothing(fix_multipoly) # Fix multipoly_b to prevent repeated regions in the output
    +        multipoly_b = fix_multipoly(multipoly_b)
    +    end
    +    polys = [tuples(poly_a, T)]
    +    for poly_b in GI.getpolygon(multipoly_b)
    +        if intersects(polys[1], poly_b)

    If polygons intersect and form a new polygon, swap out polygon

    julia
                new_polys = union(polys[1], poly_b; target)
    +            if length(new_polys) > 1 # case where they intersect by just one point
    +                push!(polys, tuples(poly_b, T))  # add poly_b to list
    +            else
    +                polys[1] = new_polys[1]
    +            end
    +        else

    If they don't intersect, poly_b is now a part of the union as its own polygon

    julia
                push!(polys, tuples(poly_b, T))
    +        end
    +    end
    +    return polys
    +end
    +
    +#= Multipolygon with polygon union is equivalent to taking the union of the polygon with the
    +multipolygon and thus simply switches the order of operations and calls the above method. =#
    +_union(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.MultiPolygonTrait, multipoly_a,
    +    ::GI.PolygonTrait, poly_b;
    +    kwargs...,
    +) where T = union(poly_b, multipoly_a; target, kwargs...)
    +
    +#= Multipolygon with multipolygon union - note that all of the sub-polygons of \`multipoly_a\`
    +and the sub-polygons of \`multipoly_b\` are included and combined together where there are
    +intersections. Unless specified with \`fix_multipoly = nothing\`, \`multipolygon_b\` will be
    +validated using the given (default is \`UnionIntersectingPolygons()\`) correction. =#
    +function _union(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.MultiPolygonTrait, multipoly_a,
    +    ::GI.MultiPolygonTrait, multipoly_b;
    +    fix_multipoly = UnionIntersectingPolygons(), kwargs...,
    +) where T
    +    if !isnothing(fix_multipoly) # Fix multipoly_b to prevent repeated regions in the output
    +        multipoly_b = fix_multipoly(multipoly_b)
    +        fix_multipoly = nothing
    +    end
    +    multipolys = multipoly_b
    +    local polys
    +    for poly_a in GI.getpolygon(multipoly_a)
    +        polys = union(poly_a, multipolys; target, fix_multipoly)
    +        multipolys = GI.MultiPolygon(polys)
    +    end
    +    return polys
    +end

    Many type and target combos aren't implemented

    julia
    function _union(
    +    ::TraitTarget{Target}, ::Type{T},
    +    trait_a::GI.AbstractTrait, geom_a,
    +    trait_b::GI.AbstractTrait, geom_b;
    +    kwargs...
    +) where {Target,T}
    +    throw(ArgumentError("Union between $trait_a and $trait_b with target $Target isn't implemented yet."))
    +    return nothing
    +end

    This page was generated using Literate.jl.

    `,28)]))}const d=i(h,[["render",p]]);export{y as __pageData,d as default}; diff --git a/previews/PR239/assets/source_methods_convex_hull.md.DkVMD0Lv.js b/previews/PR239/assets/source_methods_convex_hull.md.DkVMD0Lv.js new file mode 100644 index 000000000..10d5d100a --- /dev/null +++ b/previews/PR239/assets/source_methods_convex_hull.md.DkVMD0Lv.js @@ -0,0 +1,57 @@ +import{_ as i,c as a,a5 as n,o as l}from"./chunks/framework.onQNwZ2I.js";const t="/GeometryOps.jl/previews/PR239/assets/kbbskga.BT_oJ_KS.png",h="/GeometryOps.jl/previews/PR239/assets/filtvpm.mCtKcWOr.png",e="/GeometryOps.jl/previews/PR239/assets/cvdrlht.HTM0ungm.png",c=JSON.parse('{"title":"Convex hull","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/convex_hull.md","filePath":"source/methods/convex_hull.md","lastUpdated":null}'),p={name:"source/methods/convex_hull.md"};function k(r,s,o,d,E,g){return l(),a("div",null,s[0]||(s[0]=[n(`

    Convex hull

    The convex hull of a set of points is the smallest convex polygon that contains all the points.

    GeometryOps.jl provides a number of methods for computing the convex hull of a set of points, usually linked to other Julia packages.

    For now, we expose one algorithm, MonotoneChainMethod, which uses the DelaunayTriangulation.jl package. The GEOS() interface also supports convex hulls.

    Future work could include other algorithms, such as Quickhull.jl, or similar, via package extensions.

    Example

    Simple hull

    julia
    import GeometryOps as GO, GeoInterface as GI
    +using CairoMakie # to plot
    +
    +points = randn(GO.Point2f, 100)
    +f, a, p = plot(points; label = "Points")
    +hull_poly = GO.convex_hull(points)
    +lines!(a, hull_poly; label = "Convex hull", color = Makie.wong_colors()[2])
    +axislegend(a)
    +f

    Convex hull of the USA

    julia
    import GeometryOps as GO, GeoInterface as GI
    +using CairoMakie # to plot
    +using NaturalEarth # for data
    +
    +all_adm0 = naturalearth("admin_0_countries", 110)
    +usa = all_adm0.geometry[findfirst(==("USA"), all_adm0.ADM0_A3)]
    +f, a, p = lines(usa)
    +lines!(a, GO.convex_hull(usa); color = Makie.wong_colors()[2])
    +f

    Investigating the winding order

    The winding order of the monotone chain method is counterclockwise, while the winding order of the GEOS method is clockwise.

    GeometryOps' convexity detection says that the GEOS hull is convex, while the monotone chain method hull is not. However, they are both going over the same points (we checked), it's just that the winding order is different.

    In reality, both sets are convex, but we need to fix the GeometryOps convexity detector (isconcave)!

    We may also decide at a later date to change the returned winding order of the polygon, but most algorithms are robust to that, and you can always fix it...

    julia
    import GeoInterface as GI, GeometryOps as GO, LibGEOS as LG
    +using CairoMakie # to plot
    +
    +points = rand(Point2{Float64}, 100)
    +go_hull = GO.convex_hull(GO.MonotoneChainMethod(), points)
    +lg_hull = GO.convex_hull(GO.GEOS(), points)
    +
    +fig = Figure()
    +a1, p1 = lines(fig[1, 1], go_hull; color = 1:GI.npoint(go_hull), axis = (; title = "MonotoneChainMethod()"))
    +a2, p2 = lines(fig[2, 1], lg_hull; color = 1:GI.npoint(lg_hull), axis = (; title = "GEOS()"))
    +cb = Colorbar(fig[1:2, 2], p1; label = "Vertex number")
    +fig

    Implementation

    julia
    """
    +    convex_hull([method], geometries)
    +
    +Compute the convex hull of the points in \`geometries\`.
    +Returns a \`GI.Polygon\` representing the convex hull.
    +
    +Note that the polygon returned is wound counterclockwise
    +as in the Simple Features standard by default.  If you
    +choose GEOS, the winding order will be inverted.
    +
    +!!! warning
    +    This interface only computes the 2-dimensional convex hull!
    +
    +    For higher dimensional hulls, use the relevant package (Qhull.jl, Quickhull.jl, or similar).
    +"""
    +function convex_hull end
    +
    +"""
    +    MonotoneChainMethod()
    +
    +This is an algorithm for the \`convex_hull\` function.
    +
    +Uses [\`DelaunayTriangulation.jl\`](https://github.com/JuliaGeometry/DelaunayTriangulation.jl) to compute the convex hull.
    +This is a pure Julia algorithm which provides an optimal Delaunay triangulation.
    +
    +See also \`convex_hull\`
    +"""
    +struct MonotoneChainMethod end

    GrahamScanMethod, etc. can be implemented in GO as well, if someone wants to. If we add an extension on Quickhull.jl, then that would be another algorithm.

    julia
    convex_hull(geometries) = convex_hull(MonotoneChainMethod(), geometries)

    TODO: have this respect the CRS by pulling it out of geometries.

    julia
    function convex_hull(::MonotoneChainMethod, geometries)

    Extract all points as tuples. We have to collect and allocate here, because DelaunayTriangulation only accepts vectors of point-like geoms.

    Cleanest would be to use the iterable from GO.flatten directly, but that would require us to implement the convex hull algorithm directly.

    TODO: create a specialized method that extracts only the information required, GeometryBasics points can be passed through directly.

    julia
        points = collect(flatten(tuples, GI.PointTrait, geometries))

    Compute the convex hull using DelTri (shorthand for DelaunayTriangulation.jl).

    julia
        hull = DelaunayTriangulation.convex_hull(points)

    Convert the result to a GI.Polygon and return it. View would be more efficient here, but re-allocating is cleaner.

    julia
        point_vec = DelaunayTriangulation.get_points(hull)[DelaunayTriangulation.get_vertices(hull)]
    +    return GI.Polygon([GI.LinearRing(point_vec)])
    +end

    This page was generated using Literate.jl.

    `,35)]))}const u=i(p,[["render",k]]);export{c as __pageData,u as default}; diff --git a/previews/PR239/assets/source_methods_convex_hull.md.DkVMD0Lv.lean.js b/previews/PR239/assets/source_methods_convex_hull.md.DkVMD0Lv.lean.js new file mode 100644 index 000000000..10d5d100a --- /dev/null +++ b/previews/PR239/assets/source_methods_convex_hull.md.DkVMD0Lv.lean.js @@ -0,0 +1,57 @@ +import{_ as i,c as a,a5 as n,o as l}from"./chunks/framework.onQNwZ2I.js";const t="/GeometryOps.jl/previews/PR239/assets/kbbskga.BT_oJ_KS.png",h="/GeometryOps.jl/previews/PR239/assets/filtvpm.mCtKcWOr.png",e="/GeometryOps.jl/previews/PR239/assets/cvdrlht.HTM0ungm.png",c=JSON.parse('{"title":"Convex hull","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/convex_hull.md","filePath":"source/methods/convex_hull.md","lastUpdated":null}'),p={name:"source/methods/convex_hull.md"};function k(r,s,o,d,E,g){return l(),a("div",null,s[0]||(s[0]=[n(`

    Convex hull

    The convex hull of a set of points is the smallest convex polygon that contains all the points.

    GeometryOps.jl provides a number of methods for computing the convex hull of a set of points, usually linked to other Julia packages.

    For now, we expose one algorithm, MonotoneChainMethod, which uses the DelaunayTriangulation.jl package. The GEOS() interface also supports convex hulls.

    Future work could include other algorithms, such as Quickhull.jl, or similar, via package extensions.

    Example

    Simple hull

    julia
    import GeometryOps as GO, GeoInterface as GI
    +using CairoMakie # to plot
    +
    +points = randn(GO.Point2f, 100)
    +f, a, p = plot(points; label = "Points")
    +hull_poly = GO.convex_hull(points)
    +lines!(a, hull_poly; label = "Convex hull", color = Makie.wong_colors()[2])
    +axislegend(a)
    +f

    Convex hull of the USA

    julia
    import GeometryOps as GO, GeoInterface as GI
    +using CairoMakie # to plot
    +using NaturalEarth # for data
    +
    +all_adm0 = naturalearth("admin_0_countries", 110)
    +usa = all_adm0.geometry[findfirst(==("USA"), all_adm0.ADM0_A3)]
    +f, a, p = lines(usa)
    +lines!(a, GO.convex_hull(usa); color = Makie.wong_colors()[2])
    +f

    Investigating the winding order

    The winding order of the monotone chain method is counterclockwise, while the winding order of the GEOS method is clockwise.

    GeometryOps' convexity detection says that the GEOS hull is convex, while the monotone chain method hull is not. However, they are both going over the same points (we checked), it's just that the winding order is different.

    In reality, both sets are convex, but we need to fix the GeometryOps convexity detector (isconcave)!

    We may also decide at a later date to change the returned winding order of the polygon, but most algorithms are robust to that, and you can always fix it...

    julia
    import GeoInterface as GI, GeometryOps as GO, LibGEOS as LG
    +using CairoMakie # to plot
    +
    +points = rand(Point2{Float64}, 100)
    +go_hull = GO.convex_hull(GO.MonotoneChainMethod(), points)
    +lg_hull = GO.convex_hull(GO.GEOS(), points)
    +
    +fig = Figure()
    +a1, p1 = lines(fig[1, 1], go_hull; color = 1:GI.npoint(go_hull), axis = (; title = "MonotoneChainMethod()"))
    +a2, p2 = lines(fig[2, 1], lg_hull; color = 1:GI.npoint(lg_hull), axis = (; title = "GEOS()"))
    +cb = Colorbar(fig[1:2, 2], p1; label = "Vertex number")
    +fig

    Implementation

    julia
    """
    +    convex_hull([method], geometries)
    +
    +Compute the convex hull of the points in \`geometries\`.
    +Returns a \`GI.Polygon\` representing the convex hull.
    +
    +Note that the polygon returned is wound counterclockwise
    +as in the Simple Features standard by default.  If you
    +choose GEOS, the winding order will be inverted.
    +
    +!!! warning
    +    This interface only computes the 2-dimensional convex hull!
    +
    +    For higher dimensional hulls, use the relevant package (Qhull.jl, Quickhull.jl, or similar).
    +"""
    +function convex_hull end
    +
    +"""
    +    MonotoneChainMethod()
    +
    +This is an algorithm for the \`convex_hull\` function.
    +
    +Uses [\`DelaunayTriangulation.jl\`](https://github.com/JuliaGeometry/DelaunayTriangulation.jl) to compute the convex hull.
    +This is a pure Julia algorithm which provides an optimal Delaunay triangulation.
    +
    +See also \`convex_hull\`
    +"""
    +struct MonotoneChainMethod end

    GrahamScanMethod, etc. can be implemented in GO as well, if someone wants to. If we add an extension on Quickhull.jl, then that would be another algorithm.

    julia
    convex_hull(geometries) = convex_hull(MonotoneChainMethod(), geometries)

    TODO: have this respect the CRS by pulling it out of geometries.

    julia
    function convex_hull(::MonotoneChainMethod, geometries)

    Extract all points as tuples. We have to collect and allocate here, because DelaunayTriangulation only accepts vectors of point-like geoms.

    Cleanest would be to use the iterable from GO.flatten directly, but that would require us to implement the convex hull algorithm directly.

    TODO: create a specialized method that extracts only the information required, GeometryBasics points can be passed through directly.

    julia
        points = collect(flatten(tuples, GI.PointTrait, geometries))

    Compute the convex hull using DelTri (shorthand for DelaunayTriangulation.jl).

    julia
        hull = DelaunayTriangulation.convex_hull(points)

    Convert the result to a GI.Polygon and return it. View would be more efficient here, but re-allocating is cleaner.

    julia
        point_vec = DelaunayTriangulation.get_points(hull)[DelaunayTriangulation.get_vertices(hull)]
    +    return GI.Polygon([GI.LinearRing(point_vec)])
    +end

    This page was generated using Literate.jl.

    `,35)]))}const u=i(p,[["render",k]]);export{c as __pageData,u as default}; diff --git a/previews/PR239/assets/source_methods_distance.md.DLCaGxsq.js b/previews/PR239/assets/source_methods_distance.md.DLCaGxsq.js new file mode 100644 index 000000000..f6d5521c7 --- /dev/null +++ b/previews/PR239/assets/source_methods_distance.md.DLCaGxsq.js @@ -0,0 +1,181 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const t="/GeometryOps.jl/previews/PR239/assets/tlayvwm.DiwGEg2f.png",k="/GeometryOps.jl/previews/PR239/assets/cphyzje.DuBHk1fh.png",F=JSON.parse('{"title":"Distance and signed distance","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/distance.md","filePath":"source/methods/distance.md","lastUpdated":null}'),p={name:"source/methods/distance.md"};function l(e,s,d,E,r,g){return h(),a("div",null,s[0]||(s[0]=[n(`

    Distance and signed distance

    julia
    export distance, signed_distance

    What is distance? What is signed distance?

    Distance is the distance of a point to another geometry. This is always a positive number. If a point is inside of geometry, so on a curve or inside of a polygon, the distance will be zero. Signed distance is mainly used for polygons and multipolygons. If a point is outside of a geometry, signed distance has the same value as distance. However, points within the geometry have a negative distance representing the distance of a point to the closest boundary. Therefore, for all "non-filled" geometries, like curves, the distance will either be positive or 0.

    To provide an example, consider this rectangle:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +rect = GI.Polygon([[(0,0), (0,1), (1,1), (1,0), (0, 0)]])
    +point_in = (0.5, 0.5)
    +point_out = (0.5, 1.5)
    +f, a, p = poly(collect(GI.getpoint(rect)); axis = (; aspect = DataAspect()))
    +scatter!(GI.x(point_in), GI.y(point_in); color = :red)
    +scatter!(GI.x(point_out), GI.y(point_out); color = :orange)
    +f

    This is clearly a rectangle with one point inside and one point outside. The points are both an equal distance to the polygon. The distance to point_in is negative while the distance to point_out is positive.

    julia
    (
    +GO.distance(point_in, rect),  # == 0
    +GO.signed_distance(point_in, rect),  # < 0
    +GO.signed_distance(point_out, rect)  # > 0
    +)
    (0.0, -0.5, 0.5)

    Consider also a heatmap of signed distances around this object:

    julia
    xrange = yrange = LinRange(-0.5, 1.5, 300)
    +f, a, p = heatmap(xrange, yrange, GO.signed_distance.(Point2f.(xrange, yrange'), Ref(rect)); colormap = :RdBu, colorrange = (-0.75, 0.75))
    +a.aspect = DataAspect(); Colorbar(f[1, 2], p, label = "Signed distance"); lines!(a, GI.convert(GO.GeometryBasics, rect)); f

    Implementation

    This is the GeoInterface-compatible implementation. First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait. This is also used in the implementation, since it's a lot less work!

    Distance and signed distance are only implemented for points to other geometries right now. This could be extended to include distance from other geometries in the future.

    The distance calculated is the Euclidean distance using the Pythagorean theorem. Also note that singed_distance only makes sense for "filled-in" shapes, like polygons, so it isn't implemented for curves.

    julia
    const _DISTANCE_TARGETS = TraitTarget{Union{GI.AbstractPolygonTrait,GI.LineStringTrait,GI.LinearRingTrait,GI.LineTrait,GI.PointTrait}}()
    +
    +"""
    +    distance(point, geom, ::Type{T} = Float64)::T
    +
    +Calculates the  ditance from the geometry \`g1\` to the \`point\`. The distance
    +will always be positive or zero.
    +
    +The method will differ based on the type of the geometry provided:
    +    - The distance from a point to a point is just the Euclidean distance
    +    between the points.
    +    - The distance from a point to a line is the minimum distance from the point
    +    to the closest point on the given line.
    +    - The distance from a point to a linestring is the minimum distance from the
    +    point to the closest segment of the linestring.
    +    - The distance from a point to a linear ring is the minimum distance from
    +    the point to the closest segment of the linear ring.
    +    - The distance from a point to a polygon is zero if the point is within the
    +    polygon and otherwise is the minimum distance from the point to an edge of
    +    the polygon. This includes edges created by holes.
    +    - The distance from a point to a multigeometry or a geometry collection is
    +    the minimum distance between the point and any of the sub-geometries.
    +
    +Result will be of type T, where T is an optional argument with a default value
    +of Float64.
    +"""
    +function distance(
    +    geom1, geom2, ::Type{T} = Float64; threaded=false
    +) where T<:AbstractFloat
    +    distance(GI.trait(geom1), geom1, GI.trait(geom2), geom2, T; threaded)
    +end
    +function distance(
    +    trait1, geom, trait2::GI.PointTrait, point, ::Type{T} = Float64;
    +    threaded=false
    +) where T<:AbstractFloat
    +    distance(trait2, point, trait1, geom, T) # Swap order
    +end
    +function distance(
    +    trait1::GI.PointTrait, point, trait2, geom, ::Type{T} = Float64;
    +    threaded=false
    +) where T<:AbstractFloat
    +    applyreduce(min, _DISTANCE_TARGETS, geom; threaded, init=typemax(T)) do g
    +        _distance(T, trait1, point, GI.trait(g), g)
    +    end
    +end

    Needed for method ambiguity

    julia
    function distance(
    +    trait1::GI.PointTrait, point1, trait2::GI.PointTrait, point2, ::Type{T} = Float64;
    +    threaded=false
    +) where T<:AbstractFloat
    +    _distance(T, trait1, point1, trait2, point2)
    +end

    Point-Point, Point-Line, Point-LineString, Point-LinearRing

    julia
    _distance(::Type{T}, ::GI.PointTrait, point, ::GI.PointTrait, geom) where T =
    +    _euclid_distance(T, point, geom)
    +_distance(::Type{T}, ::GI.PointTrait, point, ::GI.LineTrait, geom) where T =
    +    _distance_line(T, point, GI.getpoint(geom, 1), GI.getpoint(geom, 2))
    +_distance(::Type{T}, ::GI.PointTrait, point, ::GI.LineStringTrait, geom) where T =
    +    _distance_curve(T, point, geom; close_curve = false)
    +_distance(::Type{T}, ::GI.PointTrait, point, ::GI.LinearRingTrait, geom) where T =
    +    _distance_curve(T, point, geom; close_curve = true)

    Point-Polygon

    julia
    function _distance(::Type{T}, ::GI.PointTrait, point, ::GI.PolygonTrait, geom) where T
    +    within(point, geom) && return zero(T)
    +    return _distance_polygon(T, point, geom)
    +end
    +
    +"""
    +    signed_distance(point, geom, ::Type{T} = Float64)::T
    +
    +Calculates the signed distance from the geometry \`geom\` to the given point.
    +Points within \`geom\` have a negative signed distance, and points outside of
    +\`geom\` have a positive signed distance.
    +    - The signed distance from a point to a point, line, linestring, or linear
    +    ring is equal to the distance between the two.
    +    - The signed distance from a point to a polygon is negative if the point is
    +    within the polygon and is positive otherwise. The value of the distance is
    +    the minimum distance from the point to an edge of the polygon. This includes
    +    edges created by holes.
    +    - The signed distance from a point to a multigeometry or a geometry
    +    collection is the minimum signed distance between the point and any of the
    +    sub-geometries.
    +
    +Result will be of type T, where T is an optional argument with a default value
    +of Float64.
    +"""
    +function signed_distance(
    +    geom1, geom2, ::Type{T} = Float64; threaded=false
    +) where T<:AbstractFloat
    +    signed_distance(GI.trait(geom1), geom1, GI.trait(geom2), geom2, T; threaded)
    +end
    +function signed_distance(
    +    trait1, geom, trait2::GI.PointTrait, point, ::Type{T} = Float64;
    +    threaded=false
    +) where T<:AbstractFloat
    +    signed_distance(trait2, point, trait1, geom, T; threaded) # Swap order
    +end
    +function signed_distance(
    +    trait1::GI.PointTrait, point, trait2, geom, ::Type{T} = Float64;
    +    threaded=false
    +) where T<:AbstractFloat
    +    applyreduce(min, _DISTANCE_TARGETS, geom; threaded, init=typemax(T)) do g
    +        _signed_distance(T, trait1, point, GI.trait(g), g)
    +    end
    +end

    Needed for method ambiguity

    julia
    function signed_distance(
    +    trait1::GI.PointTrait, point1, trait2::GI.PointTrait, point2, ::Type{T} = Float64;
    +    threaded=false
    +) where T<:AbstractFloat
    +    _signed_distance(T, trait1, point1, trait2, point2)
    +end

    Point-Geom (just calls _distance)

    julia
    function _signed_distance(
    +    ::Type{T}, ptrait::GI.PointTrait, point, gtrait::GI.AbstractGeometryTrait, geom
    +) where T
    +    _distance(T, ptrait, point, gtrait, geom)
    +end

    Point-Polygon

    julia
    function _signed_distance(::Type{T}, ::GI.PointTrait, point, ::GI.PolygonTrait, geom) where T
    +    min_dist = _distance_polygon(T, point, geom)
    +    return within(point, geom) ? -min_dist : min_dist

    negative if point is inside polygon

    julia
    end

    Returns the Euclidean distance between two points.

    julia
    Base.@propagate_inbounds _euclid_distance(::Type{T}, p1, p2) where T =
    +    sqrt(_squared_euclid_distance(T, p1, p2))

    Returns the square of the euclidean distance between two points

    julia
    Base.@propagate_inbounds _squared_euclid_distance(::Type{T}, p1, p2) where T =
    +    _squared_euclid_distance(
    +        T,
    +        GeoInterface.x(p1), GeoInterface.y(p1),
    +        GeoInterface.x(p2), GeoInterface.y(p2),
    +    )

    Returns the Euclidean distance between two points given their x and y values.

    julia
    Base.@propagate_inbounds _euclid_distance(::Type{T}, x1, y1, x2, y2) where T =
    +    sqrt(_squared_euclid_distance(T, x1, y1, x2, y2))

    Returns the squared Euclidean distance between two points given their x and y values.

    julia
    Base.@propagate_inbounds _squared_euclid_distance(::Type{T}, x1, y1, x2, y2) where T =
    +    T((x2 - x1)^2 + (y2 - y1)^2)

    Returns the minimum distance from point p0 to the line defined by endpoints p1 and p2.

    julia
    _distance_line(::Type{T}, p0, p1, p2) where T =
    +    sqrt(_squared_distance_line(T, p0, p1, p2))

    Returns the squared minimum distance from point p0 to the line defined by endpoints p1 and p2.

    julia
    function _squared_distance_line(::Type{T}, p0, p1, p2) where T
    +    x0, y0 = GeoInterface.x(p0), GeoInterface.y(p0)
    +    x1, y1 = GeoInterface.x(p1), GeoInterface.y(p1)
    +    x2, y2 = GeoInterface.x(p2), GeoInterface.y(p2)
    +
    +    xfirst, yfirst, xlast, ylast = x1 < x2 ? (x1, y1, x2, y2) : (x2, y2, x1, y1)
    +
    +    #=
    +    Vectors from first point to last point (v) and from first point to point of
    +    interest (w) to find the projection of w onto v to find closest point
    +    =#
    +    v = (xlast - xfirst, ylast - yfirst)
    +    w = (x0 - xfirst, y0 - yfirst)
    +
    +    c1 = sum(w .* v)
    +    if c1 <= 0  # p0 is closest to first endpoint
    +        return _squared_euclid_distance(T, x0, y0, xfirst, yfirst)
    +    end
    +
    +    c2 = sum(v .* v)
    +    if c2 <= c1 # p0 is closest to last endpoint
    +        return _squared_euclid_distance(T, x0, y0, xlast, ylast)
    +    end
    +
    +    b2 = c1 / c2  # projection fraction
    +    return _squared_euclid_distance(T, x0, y0, xfirst + (b2 * v[1]), yfirst + (b2 * v[2]))
    +end

    Returns the minimum distance from the given point to the given curve. If close_curve is true, make sure to include the edge from the first to last point of the curve, even if it isn't explicitly repeated.

    julia
    function _distance_curve(::Type{T}, point, curve; close_curve = false) where T

    see if linear ring has explicitly repeated last point in coordinates

    julia
        np = GI.npoint(curve)
    +    first_last_equal = equals(GI.getpoint(curve, 1), GI.getpoint(curve, np))
    +    close_curve &= first_last_equal
    +    np -= first_last_equal ? 1 : 0

    find minimum distance

    julia
        min_dist = typemax(T)
    +    p1 = GI.getpoint(curve, close_curve ? np : 1)
    +    for i in (close_curve ? 1 : 2):np
    +        p2 = GI.getpoint(curve, i)
    +        dist = _distance_line(T, point, p1, p2)
    +        min_dist = dist < min_dist ? dist : min_dist
    +        p1 = p2
    +    end
    +    return min_dist
    +end

    Returns the minimum distance from the given point to an edge of the given polygon, including from edges created by holes. Assumes polygon isn't filled and treats the exterior and each hole as a linear ring.

    julia
    function _distance_polygon(::Type{T}, point, poly) where T
    +    min_dist = _distance_curve(T, point, GI.getexterior(poly); close_curve = true)
    +    @inbounds for hole in GI.gethole(poly)
    +        dist = _distance_curve(T, point, hole; close_curve = true)
    +        min_dist = dist < min_dist ? dist : min_dist
    +    end
    +    return min_dist
    +end

    This page was generated using Literate.jl.

    `,54)]))}const o=i(p,[["render",l]]);export{F as __pageData,o as default}; diff --git a/previews/PR239/assets/source_methods_distance.md.DLCaGxsq.lean.js b/previews/PR239/assets/source_methods_distance.md.DLCaGxsq.lean.js new file mode 100644 index 000000000..f6d5521c7 --- /dev/null +++ b/previews/PR239/assets/source_methods_distance.md.DLCaGxsq.lean.js @@ -0,0 +1,181 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const t="/GeometryOps.jl/previews/PR239/assets/tlayvwm.DiwGEg2f.png",k="/GeometryOps.jl/previews/PR239/assets/cphyzje.DuBHk1fh.png",F=JSON.parse('{"title":"Distance and signed distance","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/distance.md","filePath":"source/methods/distance.md","lastUpdated":null}'),p={name:"source/methods/distance.md"};function l(e,s,d,E,r,g){return h(),a("div",null,s[0]||(s[0]=[n(`

    Distance and signed distance

    julia
    export distance, signed_distance

    What is distance? What is signed distance?

    Distance is the distance of a point to another geometry. This is always a positive number. If a point is inside of geometry, so on a curve or inside of a polygon, the distance will be zero. Signed distance is mainly used for polygons and multipolygons. If a point is outside of a geometry, signed distance has the same value as distance. However, points within the geometry have a negative distance representing the distance of a point to the closest boundary. Therefore, for all "non-filled" geometries, like curves, the distance will either be positive or 0.

    To provide an example, consider this rectangle:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +rect = GI.Polygon([[(0,0), (0,1), (1,1), (1,0), (0, 0)]])
    +point_in = (0.5, 0.5)
    +point_out = (0.5, 1.5)
    +f, a, p = poly(collect(GI.getpoint(rect)); axis = (; aspect = DataAspect()))
    +scatter!(GI.x(point_in), GI.y(point_in); color = :red)
    +scatter!(GI.x(point_out), GI.y(point_out); color = :orange)
    +f

    This is clearly a rectangle with one point inside and one point outside. The points are both an equal distance to the polygon. The distance to point_in is negative while the distance to point_out is positive.

    julia
    (
    +GO.distance(point_in, rect),  # == 0
    +GO.signed_distance(point_in, rect),  # < 0
    +GO.signed_distance(point_out, rect)  # > 0
    +)
    (0.0, -0.5, 0.5)

    Consider also a heatmap of signed distances around this object:

    julia
    xrange = yrange = LinRange(-0.5, 1.5, 300)
    +f, a, p = heatmap(xrange, yrange, GO.signed_distance.(Point2f.(xrange, yrange'), Ref(rect)); colormap = :RdBu, colorrange = (-0.75, 0.75))
    +a.aspect = DataAspect(); Colorbar(f[1, 2], p, label = "Signed distance"); lines!(a, GI.convert(GO.GeometryBasics, rect)); f

    Implementation

    This is the GeoInterface-compatible implementation. First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait. This is also used in the implementation, since it's a lot less work!

    Distance and signed distance are only implemented for points to other geometries right now. This could be extended to include distance from other geometries in the future.

    The distance calculated is the Euclidean distance using the Pythagorean theorem. Also note that singed_distance only makes sense for "filled-in" shapes, like polygons, so it isn't implemented for curves.

    julia
    const _DISTANCE_TARGETS = TraitTarget{Union{GI.AbstractPolygonTrait,GI.LineStringTrait,GI.LinearRingTrait,GI.LineTrait,GI.PointTrait}}()
    +
    +"""
    +    distance(point, geom, ::Type{T} = Float64)::T
    +
    +Calculates the  ditance from the geometry \`g1\` to the \`point\`. The distance
    +will always be positive or zero.
    +
    +The method will differ based on the type of the geometry provided:
    +    - The distance from a point to a point is just the Euclidean distance
    +    between the points.
    +    - The distance from a point to a line is the minimum distance from the point
    +    to the closest point on the given line.
    +    - The distance from a point to a linestring is the minimum distance from the
    +    point to the closest segment of the linestring.
    +    - The distance from a point to a linear ring is the minimum distance from
    +    the point to the closest segment of the linear ring.
    +    - The distance from a point to a polygon is zero if the point is within the
    +    polygon and otherwise is the minimum distance from the point to an edge of
    +    the polygon. This includes edges created by holes.
    +    - The distance from a point to a multigeometry or a geometry collection is
    +    the minimum distance between the point and any of the sub-geometries.
    +
    +Result will be of type T, where T is an optional argument with a default value
    +of Float64.
    +"""
    +function distance(
    +    geom1, geom2, ::Type{T} = Float64; threaded=false
    +) where T<:AbstractFloat
    +    distance(GI.trait(geom1), geom1, GI.trait(geom2), geom2, T; threaded)
    +end
    +function distance(
    +    trait1, geom, trait2::GI.PointTrait, point, ::Type{T} = Float64;
    +    threaded=false
    +) where T<:AbstractFloat
    +    distance(trait2, point, trait1, geom, T) # Swap order
    +end
    +function distance(
    +    trait1::GI.PointTrait, point, trait2, geom, ::Type{T} = Float64;
    +    threaded=false
    +) where T<:AbstractFloat
    +    applyreduce(min, _DISTANCE_TARGETS, geom; threaded, init=typemax(T)) do g
    +        _distance(T, trait1, point, GI.trait(g), g)
    +    end
    +end

    Needed for method ambiguity

    julia
    function distance(
    +    trait1::GI.PointTrait, point1, trait2::GI.PointTrait, point2, ::Type{T} = Float64;
    +    threaded=false
    +) where T<:AbstractFloat
    +    _distance(T, trait1, point1, trait2, point2)
    +end

    Point-Point, Point-Line, Point-LineString, Point-LinearRing

    julia
    _distance(::Type{T}, ::GI.PointTrait, point, ::GI.PointTrait, geom) where T =
    +    _euclid_distance(T, point, geom)
    +_distance(::Type{T}, ::GI.PointTrait, point, ::GI.LineTrait, geom) where T =
    +    _distance_line(T, point, GI.getpoint(geom, 1), GI.getpoint(geom, 2))
    +_distance(::Type{T}, ::GI.PointTrait, point, ::GI.LineStringTrait, geom) where T =
    +    _distance_curve(T, point, geom; close_curve = false)
    +_distance(::Type{T}, ::GI.PointTrait, point, ::GI.LinearRingTrait, geom) where T =
    +    _distance_curve(T, point, geom; close_curve = true)

    Point-Polygon

    julia
    function _distance(::Type{T}, ::GI.PointTrait, point, ::GI.PolygonTrait, geom) where T
    +    within(point, geom) && return zero(T)
    +    return _distance_polygon(T, point, geom)
    +end
    +
    +"""
    +    signed_distance(point, geom, ::Type{T} = Float64)::T
    +
    +Calculates the signed distance from the geometry \`geom\` to the given point.
    +Points within \`geom\` have a negative signed distance, and points outside of
    +\`geom\` have a positive signed distance.
    +    - The signed distance from a point to a point, line, linestring, or linear
    +    ring is equal to the distance between the two.
    +    - The signed distance from a point to a polygon is negative if the point is
    +    within the polygon and is positive otherwise. The value of the distance is
    +    the minimum distance from the point to an edge of the polygon. This includes
    +    edges created by holes.
    +    - The signed distance from a point to a multigeometry or a geometry
    +    collection is the minimum signed distance between the point and any of the
    +    sub-geometries.
    +
    +Result will be of type T, where T is an optional argument with a default value
    +of Float64.
    +"""
    +function signed_distance(
    +    geom1, geom2, ::Type{T} = Float64; threaded=false
    +) where T<:AbstractFloat
    +    signed_distance(GI.trait(geom1), geom1, GI.trait(geom2), geom2, T; threaded)
    +end
    +function signed_distance(
    +    trait1, geom, trait2::GI.PointTrait, point, ::Type{T} = Float64;
    +    threaded=false
    +) where T<:AbstractFloat
    +    signed_distance(trait2, point, trait1, geom, T; threaded) # Swap order
    +end
    +function signed_distance(
    +    trait1::GI.PointTrait, point, trait2, geom, ::Type{T} = Float64;
    +    threaded=false
    +) where T<:AbstractFloat
    +    applyreduce(min, _DISTANCE_TARGETS, geom; threaded, init=typemax(T)) do g
    +        _signed_distance(T, trait1, point, GI.trait(g), g)
    +    end
    +end

    Needed for method ambiguity

    julia
    function signed_distance(
    +    trait1::GI.PointTrait, point1, trait2::GI.PointTrait, point2, ::Type{T} = Float64;
    +    threaded=false
    +) where T<:AbstractFloat
    +    _signed_distance(T, trait1, point1, trait2, point2)
    +end

    Point-Geom (just calls _distance)

    julia
    function _signed_distance(
    +    ::Type{T}, ptrait::GI.PointTrait, point, gtrait::GI.AbstractGeometryTrait, geom
    +) where T
    +    _distance(T, ptrait, point, gtrait, geom)
    +end

    Point-Polygon

    julia
    function _signed_distance(::Type{T}, ::GI.PointTrait, point, ::GI.PolygonTrait, geom) where T
    +    min_dist = _distance_polygon(T, point, geom)
    +    return within(point, geom) ? -min_dist : min_dist

    negative if point is inside polygon

    julia
    end

    Returns the Euclidean distance between two points.

    julia
    Base.@propagate_inbounds _euclid_distance(::Type{T}, p1, p2) where T =
    +    sqrt(_squared_euclid_distance(T, p1, p2))

    Returns the square of the euclidean distance between two points

    julia
    Base.@propagate_inbounds _squared_euclid_distance(::Type{T}, p1, p2) where T =
    +    _squared_euclid_distance(
    +        T,
    +        GeoInterface.x(p1), GeoInterface.y(p1),
    +        GeoInterface.x(p2), GeoInterface.y(p2),
    +    )

    Returns the Euclidean distance between two points given their x and y values.

    julia
    Base.@propagate_inbounds _euclid_distance(::Type{T}, x1, y1, x2, y2) where T =
    +    sqrt(_squared_euclid_distance(T, x1, y1, x2, y2))

    Returns the squared Euclidean distance between two points given their x and y values.

    julia
    Base.@propagate_inbounds _squared_euclid_distance(::Type{T}, x1, y1, x2, y2) where T =
    +    T((x2 - x1)^2 + (y2 - y1)^2)

    Returns the minimum distance from point p0 to the line defined by endpoints p1 and p2.

    julia
    _distance_line(::Type{T}, p0, p1, p2) where T =
    +    sqrt(_squared_distance_line(T, p0, p1, p2))

    Returns the squared minimum distance from point p0 to the line defined by endpoints p1 and p2.

    julia
    function _squared_distance_line(::Type{T}, p0, p1, p2) where T
    +    x0, y0 = GeoInterface.x(p0), GeoInterface.y(p0)
    +    x1, y1 = GeoInterface.x(p1), GeoInterface.y(p1)
    +    x2, y2 = GeoInterface.x(p2), GeoInterface.y(p2)
    +
    +    xfirst, yfirst, xlast, ylast = x1 < x2 ? (x1, y1, x2, y2) : (x2, y2, x1, y1)
    +
    +    #=
    +    Vectors from first point to last point (v) and from first point to point of
    +    interest (w) to find the projection of w onto v to find closest point
    +    =#
    +    v = (xlast - xfirst, ylast - yfirst)
    +    w = (x0 - xfirst, y0 - yfirst)
    +
    +    c1 = sum(w .* v)
    +    if c1 <= 0  # p0 is closest to first endpoint
    +        return _squared_euclid_distance(T, x0, y0, xfirst, yfirst)
    +    end
    +
    +    c2 = sum(v .* v)
    +    if c2 <= c1 # p0 is closest to last endpoint
    +        return _squared_euclid_distance(T, x0, y0, xlast, ylast)
    +    end
    +
    +    b2 = c1 / c2  # projection fraction
    +    return _squared_euclid_distance(T, x0, y0, xfirst + (b2 * v[1]), yfirst + (b2 * v[2]))
    +end

    Returns the minimum distance from the given point to the given curve. If close_curve is true, make sure to include the edge from the first to last point of the curve, even if it isn't explicitly repeated.

    julia
    function _distance_curve(::Type{T}, point, curve; close_curve = false) where T

    see if linear ring has explicitly repeated last point in coordinates

    julia
        np = GI.npoint(curve)
    +    first_last_equal = equals(GI.getpoint(curve, 1), GI.getpoint(curve, np))
    +    close_curve &= first_last_equal
    +    np -= first_last_equal ? 1 : 0

    find minimum distance

    julia
        min_dist = typemax(T)
    +    p1 = GI.getpoint(curve, close_curve ? np : 1)
    +    for i in (close_curve ? 1 : 2):np
    +        p2 = GI.getpoint(curve, i)
    +        dist = _distance_line(T, point, p1, p2)
    +        min_dist = dist < min_dist ? dist : min_dist
    +        p1 = p2
    +    end
    +    return min_dist
    +end

    Returns the minimum distance from the given point to an edge of the given polygon, including from edges created by holes. Assumes polygon isn't filled and treats the exterior and each hole as a linear ring.

    julia
    function _distance_polygon(::Type{T}, point, poly) where T
    +    min_dist = _distance_curve(T, point, GI.getexterior(poly); close_curve = true)
    +    @inbounds for hole in GI.gethole(poly)
    +        dist = _distance_curve(T, point, hole; close_curve = true)
    +        min_dist = dist < min_dist ? dist : min_dist
    +    end
    +    return min_dist
    +end

    This page was generated using Literate.jl.

    `,54)]))}const o=i(p,[["render",l]]);export{F as __pageData,o as default}; diff --git a/previews/PR239/assets/source_methods_equals.md.BsnJrmWL.js b/previews/PR239/assets/source_methods_equals.md.BsnJrmWL.js new file mode 100644 index 000000000..23fd097d8 --- /dev/null +++ b/previews/PR239/assets/source_methods_equals.md.BsnJrmWL.js @@ -0,0 +1,265 @@ +import{_ as i,c as a,a5 as n,o as l}from"./chunks/framework.onQNwZ2I.js";const t="/GeometryOps.jl/previews/PR239/assets/hvyhqaw.CgiryX2p.png",F=JSON.parse('{"title":"Equals","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/equals.md","filePath":"source/methods/equals.md","lastUpdated":null}'),h={name:"source/methods/equals.md"};function p(k,s,e,r,d,g){return l(),a("div",null,s[0]||(s[0]=[n(`

    Equals

    julia
    export equals

    What is equals?

    The equals function checks if two geometries are equal. They are equal if they share the same set of points and edges to define the same shape.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +l1 = GI.LineString([(0.0, 0.0), (0.0, 10.0)])
    +l2 = GI.LineString([(0.0, -10.0), (0.0, 3.0)])
    +f, a, p = lines(GI.getpoint(l1), color = :blue)
    +scatter!(GI.getpoint(l1), color = :blue)
    +lines!(GI.getpoint(l2), color = :orange)
    +scatter!(GI.getpoint(l2), color = :orange)
    +f

    We can see that the two lines do not share a common set of points and edges in the plot, so they are not equal:

    julia
    GO.equals(l1, l2)  # returns false
    false

    Implementation

    This is the GeoInterface-compatible implementation.

    First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait. This is also used in the implementation, since it's a lot less work!

    Note that while we need the same set of points and edges, they don't need to be provided in the same order for polygons. For for example, we need the same set points for two multipoints to be equal, but they don't have to be saved in the same order. The winding order also doesn't have to be the same to represent the same geometry. This requires checking every point against every other point in the two geometries we are comparing. Also, some geometries must be "closed" like polygons and linear rings. These will be assumed to be closed, even if they don't have a repeated last point explicitly written in the coordinates. Additionally, geometries and multi-geometries can be equal if the multi-geometry only includes that single geometry.

    julia
    """
    +    equals(geom1, geom2)::Bool
    +
    +Compare two Geometries return true if they are the same geometry.
    +
    +# Examples
    +\`\`\`jldoctest
    +import GeometryOps as GO, GeoInterface as GI
    +poly1 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
    +poly2 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
    +
    +GO.equals(poly1, poly2)

    output

    julia
    true
    +\`\`\`
    +"""
    +equals(geom_a, geom_b) = equals(
    +    GI.trait(geom_a), geom_a,
    +    GI.trait(geom_b), geom_b,
    +)
    +
    +"""
    +    equals(::T, geom_a, ::T, geom_b)::Bool
    +
    +Two geometries of the same type, which don't have a equals function to dispatch
    +off of should throw an error.
    +"""
    +equals(::T, geom_a, ::T, geom_b) where T = error("Cant compare $T yet")
    +
    +"""
    +    equals(trait_a, geom_a, trait_b, geom_b)
    +
    +Two geometries which are not of the same type cannot be equal so they always
    +return false.
    +"""
    +equals(trait_a, geom_a, trait_b, geom_b) = false
    +
    +"""
    +    equals(::GI.PointTrait, p1, ::GI.PointTrait, p2)::Bool
    +
    +Two points are the same if they have the same x and y (and z if 3D) coordinates.
    +"""
    +function equals(::GI.PointTrait, p1, ::GI.PointTrait, p2)
    +    GI.ncoord(p1) == GI.ncoord(p2) || return false
    +    GI.x(p1) == GI.x(p2) || return false
    +    GI.y(p1) == GI.y(p2) || return false
    +    if GI.is3d(p1)
    +        GI.z(p1) == GI.z(p2) || return false
    +    end
    +    return true
    +end
    +
    +"""
    +    equals(::GI.PointTrait, p1, ::GI.MultiPointTrait, mp2)::Bool
    +
    +A point and a multipoint are equal if the multipoint is composed of a single
    +point that is equivalent to the given point.
    +"""
    +function equals(::GI.PointTrait, p1, ::GI.MultiPointTrait, mp2)
    +    GI.npoint(mp2) == 1 || return false
    +    return equals(p1, GI.getpoint(mp2, 1))
    +end
    +
    +"""
    +    equals(::GI.MultiPointTrait, mp1, ::GI.PointTrait, p2)::Bool
    +
    +A point and a multipoint are equal if the multipoint is composed of a single
    +point that is equivalent to the given point.
    +"""
    +equals(trait1::GI.MultiPointTrait, mp1, trait2::GI.PointTrait, p2) =
    +    equals(trait2, p2, trait1, mp1)
    +
    +"""
    +    equals(::GI.MultiPointTrait, mp1, ::GI.MultiPointTrait, mp2)::Bool
    +
    +Two multipoints are equal if they share the same set of points.
    +"""
    +function equals(::GI.MultiPointTrait, mp1, ::GI.MultiPointTrait, mp2)
    +    GI.npoint(mp1) == GI.npoint(mp2) || return false
    +    for p1 in GI.getpoint(mp1)
    +        has_match = false  # if point has a matching point in other multipoint
    +        for p2 in GI.getpoint(mp2)
    +            if equals(p1, p2)
    +                has_match = true
    +                break
    +            end
    +        end
    +        has_match || return false  # if no matching point, can't be equal
    +    end
    +    return true  # all points had a match
    +end
    +
    +"""
    +    _equals_curves(c1, c2, closed_type1, closed_type2)::Bool
    +
    +Two curves are equal if they share the same set of point, representing the same
    +geometry. Both curves must must be composed of the same set of points, however,
    +they do not have to wind in the same direction, or start on the same point to be
    +equivalent.
    +Inputs:
    +    c1 first geometry
    +    c2 second geometry
    +    closed_type1::Bool true if c1 is closed by definition (polygon, linear ring)
    +    closed_type2::Bool true if c2 is closed by definition (polygon, linear ring)
    +"""
    +function _equals_curves(c1, c2, closed_type1, closed_type2)

    Check if both curves are closed or not

    julia
        n1 = GI.npoint(c1)
    +    n2 = GI.npoint(c2)
    +    c1_repeat_point = GI.getpoint(c1, 1) == GI.getpoint(c1, n1)
    +    n2 = GI.npoint(c2)
    +    c2_repeat_point = GI.getpoint(c2, 1) == GI.getpoint(c2, n2)
    +    closed1 = closed_type1 || c1_repeat_point
    +    closed2 = closed_type2 || c2_repeat_point
    +    closed1 == closed2 || return false

    How many points in each curve

    julia
        n1 -= c1_repeat_point ? 1 : 0
    +    n2 -= c2_repeat_point ? 1 : 0
    +    n1 == n2 || return false
    +    n1 == 0 && return true

    Find offset between curves

    julia
        jstart = nothing
    +    p1 = GI.getpoint(c1, 1)
    +    for i in 1:n2
    +        if equals(p1, GI.getpoint(c2, i))
    +            jstart = i
    +            break
    +        end
    +    end

    no point matches the first point

    julia
        isnothing(jstart) && return false

    found match for only point

    julia
        n1 == 1 && return true

    if isn't closed and first or last point don't match, not same curve

    julia
        !closed_type1 && (jstart != 1 && jstart != n1) && return false

    Check if curves are going in same direction

    julia
        i = 2
    +    j = jstart + 1
    +    j -= j > n2 ? n2 : 0
    +    same_direction = equals(GI.getpoint(c1, i), GI.getpoint(c2, j))

    if only 2 points, we have already compared both

    julia
        n1 == 2 && return same_direction

    Check all remaining points are the same wrapping around line

    julia
        jstep = same_direction ? 1 : -1
    +    for i in 2:n1
    +        ip = GI.getpoint(c1, i)
    +        j = jstart + (i - 1) * jstep
    +        j += (0 < j <= n2) ? 0 : (n2 * -jstep)
    +        jp = GI.getpoint(c2, j)
    +        equals(ip, jp) || return false
    +    end
    +    return true
    +end
    +
    +"""
    +    equals(
    +        ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
    +        ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
    +    )::Bool
    +
    +Two lines/linestrings are equal if they share the same set of points going
    +along the curve. Note that lines/linestrings aren't closed by definition.
    +"""
    +equals(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
    +) = _equals_curves(l1, l2, false, false)
    +
    +"""
    +    equals(
    +        ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
    +        ::GI.LinearRingTrait, l2,
    +    )::Bool
    +
    +A line/linestring and a linear ring are equal if they share the same set of
    +points going along the curve. Note that lines aren't closed by definition, but
    +rings are, so the line must have a repeated last point to be equal
    +"""
    +equals(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
    +    ::GI.LinearRingTrait, l2,
    +) = _equals_curves(l1, l2, false, true)
    +
    +"""
    +    equals(
    +        ::GI.LinearRingTrait, l1,
    +        ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
    +    )::Bool
    +
    +A linear ring and a line/linestring are equal if they share the same set of
    +points going along the curve. Note that lines aren't closed by definition, but
    +rings are, so the line must have a repeated last point to be equal
    +"""
    +equals(
    +    ::GI.LinearRingTrait, l1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
    +) = _equals_curves(l1, l2, true, false)
    +
    +"""
    +    equals(
    +        ::GI.LinearRingTrait, l1,
    +        ::GI.LinearRingTrait, l2,
    +    )::Bool
    +
    +Two linear rings are equal if they share the same set of points going along the
    +curve. Note that rings are closed by definition, so they can have, but don't
    +need, a repeated last point to be equal.
    +"""
    +equals(
    +    ::GI.LinearRingTrait, l1,
    +    ::GI.LinearRingTrait, l2,
    +) = _equals_curves(l1, l2, true, true)
    +
    +"""
    +    equals(::GI.PolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool
    +
    +Two polygons are equal if they share the same exterior edge and holes.
    +"""
    +function equals(::GI.PolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)

    Check if exterior is equal

    julia
        _equals_curves(
    +        GI.getexterior(geom_a), GI.getexterior(geom_b),
    +        true, true,  # linear rings are closed by definition
    +    ) || return false

    Check if number of holes are equal

    julia
        GI.nhole(geom_a) == GI.nhole(geom_b) || return false

    Check if holes are equal

    julia
        for ihole in GI.gethole(geom_a)
    +        has_match = false
    +        for jhole in GI.gethole(geom_b)
    +            if _equals_curves(
    +                ihole, jhole,
    +                true, true,  # linear rings are closed by definition
    +            )
    +                has_match = true
    +                break
    +            end
    +        end
    +        has_match || return false
    +    end
    +    return true
    +end
    +
    +"""
    +    equals(::GI.PolygonTrait, geom_a, ::GI.MultiPolygonTrait, geom_b)::Bool
    +
    +A polygon and a multipolygon are equal if the multipolygon is composed of a
    +single polygon that is equivalent to the given polygon.
    +"""
    +function equals(::GI.PolygonTrait, geom_a, ::MultiPolygonTrait, geom_b)
    +    GI.npolygon(geom_b) == 1 || return false
    +    return equals(geom_a, GI.getpolygon(geom_b, 1))
    +end
    +
    +"""
    +    equals(::GI.MultiPolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool
    +
    +A polygon and a multipolygon are equal if the multipolygon is composed of a
    +single polygon that is equivalent to the given polygon.
    +"""
    +equals(trait_a::GI.MultiPolygonTrait, geom_a, trait_b::PolygonTrait, geom_b) =
    +    equals(trait_b, geom_b, trait_a, geom_a)
    +
    +"""
    +    equals(::GI.PolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool
    +
    +Two multipolygons are equal if they share the same set of polygons.
    +"""
    +function equals(::GI.MultiPolygonTrait, geom_a, ::GI.MultiPolygonTrait, geom_b)

    Check if same number of polygons

    julia
        GI.npolygon(geom_a) == GI.npolygon(geom_b) || return false

    Check if each polygon has a matching polygon

    julia
        for poly_a in GI.getpolygon(geom_a)
    +        has_match = false
    +        for poly_b in GI.getpolygon(geom_b)
    +            if equals(poly_a, poly_b)
    +                has_match = true
    +                break
    +            end
    +        end
    +        has_match || return false
    +    end
    +    return true
    +end

    This page was generated using Literate.jl.

    `,47)]))}const o=i(h,[["render",p]]);export{F as __pageData,o as default}; diff --git a/previews/PR239/assets/source_methods_equals.md.BsnJrmWL.lean.js b/previews/PR239/assets/source_methods_equals.md.BsnJrmWL.lean.js new file mode 100644 index 000000000..23fd097d8 --- /dev/null +++ b/previews/PR239/assets/source_methods_equals.md.BsnJrmWL.lean.js @@ -0,0 +1,265 @@ +import{_ as i,c as a,a5 as n,o as l}from"./chunks/framework.onQNwZ2I.js";const t="/GeometryOps.jl/previews/PR239/assets/hvyhqaw.CgiryX2p.png",F=JSON.parse('{"title":"Equals","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/equals.md","filePath":"source/methods/equals.md","lastUpdated":null}'),h={name:"source/methods/equals.md"};function p(k,s,e,r,d,g){return l(),a("div",null,s[0]||(s[0]=[n(`

    Equals

    julia
    export equals

    What is equals?

    The equals function checks if two geometries are equal. They are equal if they share the same set of points and edges to define the same shape.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +l1 = GI.LineString([(0.0, 0.0), (0.0, 10.0)])
    +l2 = GI.LineString([(0.0, -10.0), (0.0, 3.0)])
    +f, a, p = lines(GI.getpoint(l1), color = :blue)
    +scatter!(GI.getpoint(l1), color = :blue)
    +lines!(GI.getpoint(l2), color = :orange)
    +scatter!(GI.getpoint(l2), color = :orange)
    +f

    We can see that the two lines do not share a common set of points and edges in the plot, so they are not equal:

    julia
    GO.equals(l1, l2)  # returns false
    false

    Implementation

    This is the GeoInterface-compatible implementation.

    First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait. This is also used in the implementation, since it's a lot less work!

    Note that while we need the same set of points and edges, they don't need to be provided in the same order for polygons. For for example, we need the same set points for two multipoints to be equal, but they don't have to be saved in the same order. The winding order also doesn't have to be the same to represent the same geometry. This requires checking every point against every other point in the two geometries we are comparing. Also, some geometries must be "closed" like polygons and linear rings. These will be assumed to be closed, even if they don't have a repeated last point explicitly written in the coordinates. Additionally, geometries and multi-geometries can be equal if the multi-geometry only includes that single geometry.

    julia
    """
    +    equals(geom1, geom2)::Bool
    +
    +Compare two Geometries return true if they are the same geometry.
    +
    +# Examples
    +\`\`\`jldoctest
    +import GeometryOps as GO, GeoInterface as GI
    +poly1 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
    +poly2 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
    +
    +GO.equals(poly1, poly2)

    output

    julia
    true
    +\`\`\`
    +"""
    +equals(geom_a, geom_b) = equals(
    +    GI.trait(geom_a), geom_a,
    +    GI.trait(geom_b), geom_b,
    +)
    +
    +"""
    +    equals(::T, geom_a, ::T, geom_b)::Bool
    +
    +Two geometries of the same type, which don't have a equals function to dispatch
    +off of should throw an error.
    +"""
    +equals(::T, geom_a, ::T, geom_b) where T = error("Cant compare $T yet")
    +
    +"""
    +    equals(trait_a, geom_a, trait_b, geom_b)
    +
    +Two geometries which are not of the same type cannot be equal so they always
    +return false.
    +"""
    +equals(trait_a, geom_a, trait_b, geom_b) = false
    +
    +"""
    +    equals(::GI.PointTrait, p1, ::GI.PointTrait, p2)::Bool
    +
    +Two points are the same if they have the same x and y (and z if 3D) coordinates.
    +"""
    +function equals(::GI.PointTrait, p1, ::GI.PointTrait, p2)
    +    GI.ncoord(p1) == GI.ncoord(p2) || return false
    +    GI.x(p1) == GI.x(p2) || return false
    +    GI.y(p1) == GI.y(p2) || return false
    +    if GI.is3d(p1)
    +        GI.z(p1) == GI.z(p2) || return false
    +    end
    +    return true
    +end
    +
    +"""
    +    equals(::GI.PointTrait, p1, ::GI.MultiPointTrait, mp2)::Bool
    +
    +A point and a multipoint are equal if the multipoint is composed of a single
    +point that is equivalent to the given point.
    +"""
    +function equals(::GI.PointTrait, p1, ::GI.MultiPointTrait, mp2)
    +    GI.npoint(mp2) == 1 || return false
    +    return equals(p1, GI.getpoint(mp2, 1))
    +end
    +
    +"""
    +    equals(::GI.MultiPointTrait, mp1, ::GI.PointTrait, p2)::Bool
    +
    +A point and a multipoint are equal if the multipoint is composed of a single
    +point that is equivalent to the given point.
    +"""
    +equals(trait1::GI.MultiPointTrait, mp1, trait2::GI.PointTrait, p2) =
    +    equals(trait2, p2, trait1, mp1)
    +
    +"""
    +    equals(::GI.MultiPointTrait, mp1, ::GI.MultiPointTrait, mp2)::Bool
    +
    +Two multipoints are equal if they share the same set of points.
    +"""
    +function equals(::GI.MultiPointTrait, mp1, ::GI.MultiPointTrait, mp2)
    +    GI.npoint(mp1) == GI.npoint(mp2) || return false
    +    for p1 in GI.getpoint(mp1)
    +        has_match = false  # if point has a matching point in other multipoint
    +        for p2 in GI.getpoint(mp2)
    +            if equals(p1, p2)
    +                has_match = true
    +                break
    +            end
    +        end
    +        has_match || return false  # if no matching point, can't be equal
    +    end
    +    return true  # all points had a match
    +end
    +
    +"""
    +    _equals_curves(c1, c2, closed_type1, closed_type2)::Bool
    +
    +Two curves are equal if they share the same set of point, representing the same
    +geometry. Both curves must must be composed of the same set of points, however,
    +they do not have to wind in the same direction, or start on the same point to be
    +equivalent.
    +Inputs:
    +    c1 first geometry
    +    c2 second geometry
    +    closed_type1::Bool true if c1 is closed by definition (polygon, linear ring)
    +    closed_type2::Bool true if c2 is closed by definition (polygon, linear ring)
    +"""
    +function _equals_curves(c1, c2, closed_type1, closed_type2)

    Check if both curves are closed or not

    julia
        n1 = GI.npoint(c1)
    +    n2 = GI.npoint(c2)
    +    c1_repeat_point = GI.getpoint(c1, 1) == GI.getpoint(c1, n1)
    +    n2 = GI.npoint(c2)
    +    c2_repeat_point = GI.getpoint(c2, 1) == GI.getpoint(c2, n2)
    +    closed1 = closed_type1 || c1_repeat_point
    +    closed2 = closed_type2 || c2_repeat_point
    +    closed1 == closed2 || return false

    How many points in each curve

    julia
        n1 -= c1_repeat_point ? 1 : 0
    +    n2 -= c2_repeat_point ? 1 : 0
    +    n1 == n2 || return false
    +    n1 == 0 && return true

    Find offset between curves

    julia
        jstart = nothing
    +    p1 = GI.getpoint(c1, 1)
    +    for i in 1:n2
    +        if equals(p1, GI.getpoint(c2, i))
    +            jstart = i
    +            break
    +        end
    +    end

    no point matches the first point

    julia
        isnothing(jstart) && return false

    found match for only point

    julia
        n1 == 1 && return true

    if isn't closed and first or last point don't match, not same curve

    julia
        !closed_type1 && (jstart != 1 && jstart != n1) && return false

    Check if curves are going in same direction

    julia
        i = 2
    +    j = jstart + 1
    +    j -= j > n2 ? n2 : 0
    +    same_direction = equals(GI.getpoint(c1, i), GI.getpoint(c2, j))

    if only 2 points, we have already compared both

    julia
        n1 == 2 && return same_direction

    Check all remaining points are the same wrapping around line

    julia
        jstep = same_direction ? 1 : -1
    +    for i in 2:n1
    +        ip = GI.getpoint(c1, i)
    +        j = jstart + (i - 1) * jstep
    +        j += (0 < j <= n2) ? 0 : (n2 * -jstep)
    +        jp = GI.getpoint(c2, j)
    +        equals(ip, jp) || return false
    +    end
    +    return true
    +end
    +
    +"""
    +    equals(
    +        ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
    +        ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
    +    )::Bool
    +
    +Two lines/linestrings are equal if they share the same set of points going
    +along the curve. Note that lines/linestrings aren't closed by definition.
    +"""
    +equals(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
    +) = _equals_curves(l1, l2, false, false)
    +
    +"""
    +    equals(
    +        ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
    +        ::GI.LinearRingTrait, l2,
    +    )::Bool
    +
    +A line/linestring and a linear ring are equal if they share the same set of
    +points going along the curve. Note that lines aren't closed by definition, but
    +rings are, so the line must have a repeated last point to be equal
    +"""
    +equals(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
    +    ::GI.LinearRingTrait, l2,
    +) = _equals_curves(l1, l2, false, true)
    +
    +"""
    +    equals(
    +        ::GI.LinearRingTrait, l1,
    +        ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
    +    )::Bool
    +
    +A linear ring and a line/linestring are equal if they share the same set of
    +points going along the curve. Note that lines aren't closed by definition, but
    +rings are, so the line must have a repeated last point to be equal
    +"""
    +equals(
    +    ::GI.LinearRingTrait, l1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
    +) = _equals_curves(l1, l2, true, false)
    +
    +"""
    +    equals(
    +        ::GI.LinearRingTrait, l1,
    +        ::GI.LinearRingTrait, l2,
    +    )::Bool
    +
    +Two linear rings are equal if they share the same set of points going along the
    +curve. Note that rings are closed by definition, so they can have, but don't
    +need, a repeated last point to be equal.
    +"""
    +equals(
    +    ::GI.LinearRingTrait, l1,
    +    ::GI.LinearRingTrait, l2,
    +) = _equals_curves(l1, l2, true, true)
    +
    +"""
    +    equals(::GI.PolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool
    +
    +Two polygons are equal if they share the same exterior edge and holes.
    +"""
    +function equals(::GI.PolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)

    Check if exterior is equal

    julia
        _equals_curves(
    +        GI.getexterior(geom_a), GI.getexterior(geom_b),
    +        true, true,  # linear rings are closed by definition
    +    ) || return false

    Check if number of holes are equal

    julia
        GI.nhole(geom_a) == GI.nhole(geom_b) || return false

    Check if holes are equal

    julia
        for ihole in GI.gethole(geom_a)
    +        has_match = false
    +        for jhole in GI.gethole(geom_b)
    +            if _equals_curves(
    +                ihole, jhole,
    +                true, true,  # linear rings are closed by definition
    +            )
    +                has_match = true
    +                break
    +            end
    +        end
    +        has_match || return false
    +    end
    +    return true
    +end
    +
    +"""
    +    equals(::GI.PolygonTrait, geom_a, ::GI.MultiPolygonTrait, geom_b)::Bool
    +
    +A polygon and a multipolygon are equal if the multipolygon is composed of a
    +single polygon that is equivalent to the given polygon.
    +"""
    +function equals(::GI.PolygonTrait, geom_a, ::MultiPolygonTrait, geom_b)
    +    GI.npolygon(geom_b) == 1 || return false
    +    return equals(geom_a, GI.getpolygon(geom_b, 1))
    +end
    +
    +"""
    +    equals(::GI.MultiPolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool
    +
    +A polygon and a multipolygon are equal if the multipolygon is composed of a
    +single polygon that is equivalent to the given polygon.
    +"""
    +equals(trait_a::GI.MultiPolygonTrait, geom_a, trait_b::PolygonTrait, geom_b) =
    +    equals(trait_b, geom_b, trait_a, geom_a)
    +
    +"""
    +    equals(::GI.PolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool
    +
    +Two multipolygons are equal if they share the same set of polygons.
    +"""
    +function equals(::GI.MultiPolygonTrait, geom_a, ::GI.MultiPolygonTrait, geom_b)

    Check if same number of polygons

    julia
        GI.npolygon(geom_a) == GI.npolygon(geom_b) || return false

    Check if each polygon has a matching polygon

    julia
        for poly_a in GI.getpolygon(geom_a)
    +        has_match = false
    +        for poly_b in GI.getpolygon(geom_b)
    +            if equals(poly_a, poly_b)
    +                has_match = true
    +                break
    +            end
    +        end
    +        has_match || return false
    +    end
    +    return true
    +end

    This page was generated using Literate.jl.

    `,47)]))}const o=i(h,[["render",p]]);export{F as __pageData,o as default}; diff --git a/previews/PR239/assets/source_methods_geom_relations_contains.md.CTaz5DgK.js b/previews/PR239/assets/source_methods_geom_relations_contains.md.CTaz5DgK.js new file mode 100644 index 000000000..098b4f9b5 --- /dev/null +++ b/previews/PR239/assets/source_methods_geom_relations_contains.md.CTaz5DgK.js @@ -0,0 +1,33 @@ +import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const e="/GeometryOps.jl/previews/PR239/assets/rzkakxn._0R9BbFk.png",E=JSON.parse('{"title":"Contains","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/geom_relations/contains.md","filePath":"source/methods/geom_relations/contains.md","lastUpdated":null}'),h={name:"source/methods/geom_relations/contains.md"};function l(p,s,k,r,o,d){return t(),a("div",null,s[0]||(s[0]=[n(`

    Contains

    julia
    export contains

    What is contains?

    The contains function checks if a given geometry completely contains another geometry, or in other words, that the second geometry is completely within the first. This requires that the two interiors intersect and that the interior and boundary of the second geometry is not in the exterior of the first geometry.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +l1 = GI.LineString([(0.0, 0.0), (1.0, 0.0), (0.0, 0.1)])
    +l2 = GI.LineString([(0.25, 0.0), (0.75, 0.0)])
    +f, a, p = lines(GI.getpoint(l1), color = :blue)
    +scatter!(GI.getpoint(l1), color = :blue)
    +lines!(GI.getpoint(l2), color = :orange)
    +scatter!(GI.getpoint(l2), color = :orange)
    +f

    We can see that all of the points and edges of l2 are within l1, so l1 contains l2. However, l2 does not contain l1.

    julia
    GO.contains(l1, l2)  # returns true
    +GO.contains(l2, l1)  # returns false
    false

    Implementation

    This is the GeoInterface-compatible implementation.

    Given that contains is the exact opposite of within, we simply pass the two inputs variables, swapped in order, to within.

    julia
    """
    +    contains(g1::AbstractGeometry, g2::AbstractGeometry)::Bool
    +
    +Return true if the second geometry is completely contained by the first
    +geometry. The interiors of both geometries must intersect and the interior and
    +boundary of the secondary (g2) must not intersect the exterior of the first
    +(g1).
    +
    +\`contains\` returns the exact opposite result of \`within\`.
    +
    +# Examples
    +
    +\`\`\`jldoctest
    +import GeometryOps as GO, GeoInterface as GI
    +line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
    +point = GI.Point((1, 2))
    +
    +GO.contains(line, point)

    output

    julia
    true
    +\`\`\`
    +"""
    +contains(g1, g2) = GeometryOps.within(g2, g1)

    This page was generated using Literate.jl.

    `,18)]))}const c=i(h,[["render",l]]);export{E as __pageData,c as default}; diff --git a/previews/PR239/assets/source_methods_geom_relations_contains.md.CTaz5DgK.lean.js b/previews/PR239/assets/source_methods_geom_relations_contains.md.CTaz5DgK.lean.js new file mode 100644 index 000000000..098b4f9b5 --- /dev/null +++ b/previews/PR239/assets/source_methods_geom_relations_contains.md.CTaz5DgK.lean.js @@ -0,0 +1,33 @@ +import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const e="/GeometryOps.jl/previews/PR239/assets/rzkakxn._0R9BbFk.png",E=JSON.parse('{"title":"Contains","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/geom_relations/contains.md","filePath":"source/methods/geom_relations/contains.md","lastUpdated":null}'),h={name:"source/methods/geom_relations/contains.md"};function l(p,s,k,r,o,d){return t(),a("div",null,s[0]||(s[0]=[n(`

    Contains

    julia
    export contains

    What is contains?

    The contains function checks if a given geometry completely contains another geometry, or in other words, that the second geometry is completely within the first. This requires that the two interiors intersect and that the interior and boundary of the second geometry is not in the exterior of the first geometry.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +l1 = GI.LineString([(0.0, 0.0), (1.0, 0.0), (0.0, 0.1)])
    +l2 = GI.LineString([(0.25, 0.0), (0.75, 0.0)])
    +f, a, p = lines(GI.getpoint(l1), color = :blue)
    +scatter!(GI.getpoint(l1), color = :blue)
    +lines!(GI.getpoint(l2), color = :orange)
    +scatter!(GI.getpoint(l2), color = :orange)
    +f

    We can see that all of the points and edges of l2 are within l1, so l1 contains l2. However, l2 does not contain l1.

    julia
    GO.contains(l1, l2)  # returns true
    +GO.contains(l2, l1)  # returns false
    false

    Implementation

    This is the GeoInterface-compatible implementation.

    Given that contains is the exact opposite of within, we simply pass the two inputs variables, swapped in order, to within.

    julia
    """
    +    contains(g1::AbstractGeometry, g2::AbstractGeometry)::Bool
    +
    +Return true if the second geometry is completely contained by the first
    +geometry. The interiors of both geometries must intersect and the interior and
    +boundary of the secondary (g2) must not intersect the exterior of the first
    +(g1).
    +
    +\`contains\` returns the exact opposite result of \`within\`.
    +
    +# Examples
    +
    +\`\`\`jldoctest
    +import GeometryOps as GO, GeoInterface as GI
    +line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
    +point = GI.Point((1, 2))
    +
    +GO.contains(line, point)

    output

    julia
    true
    +\`\`\`
    +"""
    +contains(g1, g2) = GeometryOps.within(g2, g1)

    This page was generated using Literate.jl.

    `,18)]))}const c=i(h,[["render",l]]);export{E as __pageData,c as default}; diff --git a/previews/PR239/assets/source_methods_geom_relations_coveredby.md.BNo4Y8zx.js b/previews/PR239/assets/source_methods_geom_relations_coveredby.md.BNo4Y8zx.js new file mode 100644 index 000000000..b0e7611c0 --- /dev/null +++ b/previews/PR239/assets/source_methods_geom_relations_coveredby.md.BNo4Y8zx.js @@ -0,0 +1,183 @@ +import{_ as i,c as a,a5 as n,o as e}from"./chunks/framework.onQNwZ2I.js";const l="/GeometryOps.jl/previews/PR239/assets/kbzwnsa.DC3TvBOO.png",o=JSON.parse('{"title":"CoveredBy","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/geom_relations/coveredby.md","filePath":"source/methods/geom_relations/coveredby.md","lastUpdated":null}'),h={name:"source/methods/geom_relations/coveredby.md"};function t(p,s,k,r,E,d){return e(),a("div",null,s[0]||(s[0]=[n(`

    CoveredBy

    julia
    export coveredby

    What is coveredby?

    The coveredby function checks if one geometry is covered by another geometry. This is an extension of within that does not require the interiors of the two geometries to intersect, but still does require that the interior and boundary of the first geometry isn't outside of the second geometry.

    To provide an example, consider this point and line:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +p1 = (0.0, 0.0)
    +l1 = GI.Line([p1, (1.0, 1.0)])
    +f, a, p = lines(GI.getpoint(l1))
    +scatter!(p1, color = :red)
    +f

    As we can see, p1 is on the endpoint of l1. This means it is not within, but it does meet the definition of coveredby.

    julia
    GO.coveredby(p1, l1)  # true
    true

    Implementation

    This is the GeoInterface-compatible implementation.

    First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait.

    Each of these calls a method in the geom_geom_processors file. The methods in this file determine if the given geometries meet a set of criteria. For the coveredby function and arguments g1 and g2, this criteria is as follows: - points of g1 are allowed to be in the interior of g2 (either through overlap or crossing for lines) - points of g1 are allowed to be on the boundary of g2 - points of g1 are not allowed to be in the exterior of g2 - no points of g1 are required to be in the interior of g2 - no points of g1 are required to be on the boundary of g2 - no points of g1 are required to be in the exterior of g2

    The code for the specific implementations is in the geom_geom_processors file.

    julia
    const COVEREDBY_ALLOWS = (in_allow = true, on_allow = true, out_allow = false)
    +const COVEREDBY_CURVE_ALLOWS = (over_allow = true, cross_allow = true, on_allow = true, out_allow = false)
    +const COVEREDBY_CURVE_REQUIRES = (in_require = false, on_require = false, out_require = false)
    +const COVEREDBY_POLYGON_REQUIRES = (in_require = true, on_require = false, out_require = false,)
    +const COVEREDBY_EXACT = (exact = _False(),)
    +
    +"""
    +    coveredby(g1, g2)::Bool
    +
    +Return \`true\` if the first geometry is completely covered by the second
    +geometry. The interior and boundary of the primary geometry (g1) must not
    +intersect the exterior of the secondary geometry (g2).
    +
    +Furthermore, \`coveredby\` returns the exact opposite result of \`covers\`. They are
    +equivalent with the order of the arguments swapped.
    +
    +# Examples
    +\`\`\`jldoctest setup=:(using GeometryOps, GeometryBasics)
    +import GeometryOps as GO, GeoInterface as GI
    +p1 = GI.Point(0.0, 0.0)
    +p2 = GI.Point(1.0, 1.0)
    +l1 = GI.Line([p1, p2])
    +
    +GO.coveredby(p1, l1)

    output

    julia
    true
    +\`\`\`
    +"""
    +coveredby(g1, g2) = _coveredby(trait(g1), g1, trait(g2), g2)

    Convert features to geometries

    julia
    _coveredby(::GI.FeatureTrait, g1, ::Any, g2) = coveredby(GI.geometry(g1), g2)
    +_coveredby(::Any, g1, t2::GI.FeatureTrait, g2) = coveredby(g1, GI.geometry(g2))
    +_coveredby(::FeatureTrait, g1, ::FeatureTrait, g2) = coveredby(GI.geometry(g1), GI.geometry(g2))

    Points coveredby geometries

    Point is coveredby another point if those points are equal

    julia
    _coveredby(
    +    ::GI.PointTrait, g1,
    +    ::GI.PointTrait, g2,
    +) = equals(g1, g2)

    Point is coveredby a line/linestring if it is on a line vertex or an edge

    julia
    _coveredby(
    +    ::GI.PointTrait, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _point_curve_process(
    +    g1, g2;
    +    COVEREDBY_ALLOWS...,
    +    closed_curve = false,
    +)

    Point is coveredby a linearring if it is on a vertex or an edge of ring

    julia
    _coveredby(
    +    ::GI.PointTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _point_curve_process(
    +    g1, g2;
    +    COVEREDBY_ALLOWS...,
    +    closed_curve = true,
    +)

    Point is coveredby a polygon if it is inside polygon, including edges/vertices

    julia
    _coveredby(
    +    ::GI.PointTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _point_polygon_process(
    +    g1, g2;
    +    COVEREDBY_ALLOWS...,
    +    COVEREDBY_EXACT...,
    +)

    Points cannot cover any geometry other than points

    julia
    _coveredby(
    +    ::Union{GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    ::GI.PointTrait, g2,
    +) = false

    Lines coveredby geometries

    julia
    #= Linestring is coveredby a line if all interior and boundary points of the
    +first line are on the interior/boundary points of the second line. =#
    +_coveredby(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    COVEREDBY_CURVE_ALLOWS...,
    +    COVEREDBY_CURVE_REQUIRES...,
    +    COVEREDBY_EXACT...,
    +    closed_line = false,
    +    closed_curve = false,
    +)
    +
    +#= Linestring is coveredby a ring if all interior and boundary points of the
    +line are on the edges of the ring. =#
    +_coveredby(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    COVEREDBY_CURVE_ALLOWS...,
    +    COVEREDBY_CURVE_REQUIRES...,
    +    COVEREDBY_EXACT...,
    +    closed_line = false,
    +    closed_curve = true,
    +)
    +
    +#= Linestring is coveredby a polygon if all interior and boundary points of the
    +line are in the polygon interior or on its edges, including hole edges. =#
    +_coveredby(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    COVEREDBY_ALLOWS...,
    +    COVEREDBY_CURVE_REQUIRES...,
    +    COVEREDBY_EXACT...,
    +    closed_line = false,
    +)

    Rings covered by geometries

    julia
    #= Linearring is covered by a line if all vertices and edges of the ring are on
    +the edges and vertices of the line. =#
    +_coveredby(
    +    ::GI.LinearRingTrait, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    COVEREDBY_CURVE_ALLOWS...,
    +    COVEREDBY_CURVE_REQUIRES...,
    +    COVEREDBY_EXACT...,
    +    closed_line = true,
    +    closed_curve = false,
    +)
    +
    +#= Linearring is covered by another linear ring if all vertices and edges of the
    +first ring are on the edges/vertices of the second ring. =#
    +_coveredby(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    COVEREDBY_CURVE_ALLOWS...,
    +    COVEREDBY_CURVE_REQUIRES...,
    +    COVEREDBY_EXACT...,
    +    closed_line = true,
    +    closed_curve = true,
    +)
    +
    +#= Linearring is coveredby a polygon if all vertices and edges of the ring are
    +in the polygon interior or on the polygon edges, including hole edges. =#
    +_coveredby(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    COVEREDBY_ALLOWS...,
    +    COVEREDBY_CURVE_REQUIRES...,
    +    COVEREDBY_EXACT...,
    +    closed_line = true,
    +)

    Polygons covered by geometries

    julia
    #= Polygon is covered by another polygon if if the interior and edges of the
    +first polygon are in the second polygon interior or on polygon edges, including
    +hole edges.=#
    +_coveredby(
    +    ::GI.PolygonTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _polygon_polygon_process(
    +    g1, g2;
    +    COVEREDBY_ALLOWS...,
    +    COVEREDBY_POLYGON_REQUIRES...,
    +    COVEREDBY_EXACT...,
    +)

    Polygons cannot covered by any curves

    julia
    _coveredby(
    +    ::GI.PolygonTrait, g1,
    +    ::GI.AbstractCurveTrait, g2,
    +) = false

    Geometries coveredby multi-geometry/geometry collections

    julia
    #= Geometry is covered by a multi-geometry or a collection if one of the elements
    +of the collection cover the geometry. =#
    +function _coveredby(
    +    ::Union{GI.PointTrait, GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g2,
    +)
    +    for sub_g2 in GI.getgeom(g2)
    +        coveredby(g1, sub_g2) && return true
    +    end
    +    return false
    +end

    Multi-geometry/geometry collections coveredby geometries

    julia
    #= Multi-geometry or a geometry collection is covered by a geometry if all
    +elements of the collection are covered by the geometry. =#
    +function _coveredby(
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g1,
    +    ::GI.AbstractGeometryTrait, g2,
    +)
    +    for sub_g1 in GI.getgeom(g1)
    +        !coveredby(sub_g1, g2) && return false
    +    end
    +    return true
    +end

    This page was generated using Literate.jl.

    `,45)]))}const y=i(h,[["render",t]]);export{o as __pageData,y as default}; diff --git a/previews/PR239/assets/source_methods_geom_relations_coveredby.md.BNo4Y8zx.lean.js b/previews/PR239/assets/source_methods_geom_relations_coveredby.md.BNo4Y8zx.lean.js new file mode 100644 index 000000000..b0e7611c0 --- /dev/null +++ b/previews/PR239/assets/source_methods_geom_relations_coveredby.md.BNo4Y8zx.lean.js @@ -0,0 +1,183 @@ +import{_ as i,c as a,a5 as n,o as e}from"./chunks/framework.onQNwZ2I.js";const l="/GeometryOps.jl/previews/PR239/assets/kbzwnsa.DC3TvBOO.png",o=JSON.parse('{"title":"CoveredBy","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/geom_relations/coveredby.md","filePath":"source/methods/geom_relations/coveredby.md","lastUpdated":null}'),h={name:"source/methods/geom_relations/coveredby.md"};function t(p,s,k,r,E,d){return e(),a("div",null,s[0]||(s[0]=[n(`

    CoveredBy

    julia
    export coveredby

    What is coveredby?

    The coveredby function checks if one geometry is covered by another geometry. This is an extension of within that does not require the interiors of the two geometries to intersect, but still does require that the interior and boundary of the first geometry isn't outside of the second geometry.

    To provide an example, consider this point and line:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +p1 = (0.0, 0.0)
    +l1 = GI.Line([p1, (1.0, 1.0)])
    +f, a, p = lines(GI.getpoint(l1))
    +scatter!(p1, color = :red)
    +f

    As we can see, p1 is on the endpoint of l1. This means it is not within, but it does meet the definition of coveredby.

    julia
    GO.coveredby(p1, l1)  # true
    true

    Implementation

    This is the GeoInterface-compatible implementation.

    First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait.

    Each of these calls a method in the geom_geom_processors file. The methods in this file determine if the given geometries meet a set of criteria. For the coveredby function and arguments g1 and g2, this criteria is as follows: - points of g1 are allowed to be in the interior of g2 (either through overlap or crossing for lines) - points of g1 are allowed to be on the boundary of g2 - points of g1 are not allowed to be in the exterior of g2 - no points of g1 are required to be in the interior of g2 - no points of g1 are required to be on the boundary of g2 - no points of g1 are required to be in the exterior of g2

    The code for the specific implementations is in the geom_geom_processors file.

    julia
    const COVEREDBY_ALLOWS = (in_allow = true, on_allow = true, out_allow = false)
    +const COVEREDBY_CURVE_ALLOWS = (over_allow = true, cross_allow = true, on_allow = true, out_allow = false)
    +const COVEREDBY_CURVE_REQUIRES = (in_require = false, on_require = false, out_require = false)
    +const COVEREDBY_POLYGON_REQUIRES = (in_require = true, on_require = false, out_require = false,)
    +const COVEREDBY_EXACT = (exact = _False(),)
    +
    +"""
    +    coveredby(g1, g2)::Bool
    +
    +Return \`true\` if the first geometry is completely covered by the second
    +geometry. The interior and boundary of the primary geometry (g1) must not
    +intersect the exterior of the secondary geometry (g2).
    +
    +Furthermore, \`coveredby\` returns the exact opposite result of \`covers\`. They are
    +equivalent with the order of the arguments swapped.
    +
    +# Examples
    +\`\`\`jldoctest setup=:(using GeometryOps, GeometryBasics)
    +import GeometryOps as GO, GeoInterface as GI
    +p1 = GI.Point(0.0, 0.0)
    +p2 = GI.Point(1.0, 1.0)
    +l1 = GI.Line([p1, p2])
    +
    +GO.coveredby(p1, l1)

    output

    julia
    true
    +\`\`\`
    +"""
    +coveredby(g1, g2) = _coveredby(trait(g1), g1, trait(g2), g2)

    Convert features to geometries

    julia
    _coveredby(::GI.FeatureTrait, g1, ::Any, g2) = coveredby(GI.geometry(g1), g2)
    +_coveredby(::Any, g1, t2::GI.FeatureTrait, g2) = coveredby(g1, GI.geometry(g2))
    +_coveredby(::FeatureTrait, g1, ::FeatureTrait, g2) = coveredby(GI.geometry(g1), GI.geometry(g2))

    Points coveredby geometries

    Point is coveredby another point if those points are equal

    julia
    _coveredby(
    +    ::GI.PointTrait, g1,
    +    ::GI.PointTrait, g2,
    +) = equals(g1, g2)

    Point is coveredby a line/linestring if it is on a line vertex or an edge

    julia
    _coveredby(
    +    ::GI.PointTrait, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _point_curve_process(
    +    g1, g2;
    +    COVEREDBY_ALLOWS...,
    +    closed_curve = false,
    +)

    Point is coveredby a linearring if it is on a vertex or an edge of ring

    julia
    _coveredby(
    +    ::GI.PointTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _point_curve_process(
    +    g1, g2;
    +    COVEREDBY_ALLOWS...,
    +    closed_curve = true,
    +)

    Point is coveredby a polygon if it is inside polygon, including edges/vertices

    julia
    _coveredby(
    +    ::GI.PointTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _point_polygon_process(
    +    g1, g2;
    +    COVEREDBY_ALLOWS...,
    +    COVEREDBY_EXACT...,
    +)

    Points cannot cover any geometry other than points

    julia
    _coveredby(
    +    ::Union{GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    ::GI.PointTrait, g2,
    +) = false

    Lines coveredby geometries

    julia
    #= Linestring is coveredby a line if all interior and boundary points of the
    +first line are on the interior/boundary points of the second line. =#
    +_coveredby(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    COVEREDBY_CURVE_ALLOWS...,
    +    COVEREDBY_CURVE_REQUIRES...,
    +    COVEREDBY_EXACT...,
    +    closed_line = false,
    +    closed_curve = false,
    +)
    +
    +#= Linestring is coveredby a ring if all interior and boundary points of the
    +line are on the edges of the ring. =#
    +_coveredby(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    COVEREDBY_CURVE_ALLOWS...,
    +    COVEREDBY_CURVE_REQUIRES...,
    +    COVEREDBY_EXACT...,
    +    closed_line = false,
    +    closed_curve = true,
    +)
    +
    +#= Linestring is coveredby a polygon if all interior and boundary points of the
    +line are in the polygon interior or on its edges, including hole edges. =#
    +_coveredby(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    COVEREDBY_ALLOWS...,
    +    COVEREDBY_CURVE_REQUIRES...,
    +    COVEREDBY_EXACT...,
    +    closed_line = false,
    +)

    Rings covered by geometries

    julia
    #= Linearring is covered by a line if all vertices and edges of the ring are on
    +the edges and vertices of the line. =#
    +_coveredby(
    +    ::GI.LinearRingTrait, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    COVEREDBY_CURVE_ALLOWS...,
    +    COVEREDBY_CURVE_REQUIRES...,
    +    COVEREDBY_EXACT...,
    +    closed_line = true,
    +    closed_curve = false,
    +)
    +
    +#= Linearring is covered by another linear ring if all vertices and edges of the
    +first ring are on the edges/vertices of the second ring. =#
    +_coveredby(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    COVEREDBY_CURVE_ALLOWS...,
    +    COVEREDBY_CURVE_REQUIRES...,
    +    COVEREDBY_EXACT...,
    +    closed_line = true,
    +    closed_curve = true,
    +)
    +
    +#= Linearring is coveredby a polygon if all vertices and edges of the ring are
    +in the polygon interior or on the polygon edges, including hole edges. =#
    +_coveredby(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    COVEREDBY_ALLOWS...,
    +    COVEREDBY_CURVE_REQUIRES...,
    +    COVEREDBY_EXACT...,
    +    closed_line = true,
    +)

    Polygons covered by geometries

    julia
    #= Polygon is covered by another polygon if if the interior and edges of the
    +first polygon are in the second polygon interior or on polygon edges, including
    +hole edges.=#
    +_coveredby(
    +    ::GI.PolygonTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _polygon_polygon_process(
    +    g1, g2;
    +    COVEREDBY_ALLOWS...,
    +    COVEREDBY_POLYGON_REQUIRES...,
    +    COVEREDBY_EXACT...,
    +)

    Polygons cannot covered by any curves

    julia
    _coveredby(
    +    ::GI.PolygonTrait, g1,
    +    ::GI.AbstractCurveTrait, g2,
    +) = false

    Geometries coveredby multi-geometry/geometry collections

    julia
    #= Geometry is covered by a multi-geometry or a collection if one of the elements
    +of the collection cover the geometry. =#
    +function _coveredby(
    +    ::Union{GI.PointTrait, GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g2,
    +)
    +    for sub_g2 in GI.getgeom(g2)
    +        coveredby(g1, sub_g2) && return true
    +    end
    +    return false
    +end

    Multi-geometry/geometry collections coveredby geometries

    julia
    #= Multi-geometry or a geometry collection is covered by a geometry if all
    +elements of the collection are covered by the geometry. =#
    +function _coveredby(
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g1,
    +    ::GI.AbstractGeometryTrait, g2,
    +)
    +    for sub_g1 in GI.getgeom(g1)
    +        !coveredby(sub_g1, g2) && return false
    +    end
    +    return true
    +end

    This page was generated using Literate.jl.

    `,45)]))}const y=i(h,[["render",t]]);export{o as __pageData,y as default}; diff --git a/previews/PR239/assets/source_methods_geom_relations_covers.md.Ds8aZwNW.js b/previews/PR239/assets/source_methods_geom_relations_covers.md.Ds8aZwNW.js new file mode 100644 index 000000000..9fdf77d59 --- /dev/null +++ b/previews/PR239/assets/source_methods_geom_relations_covers.md.Ds8aZwNW.js @@ -0,0 +1,33 @@ +import{_ as i,c as a,a5 as e,o as n}from"./chunks/framework.onQNwZ2I.js";const t="/GeometryOps.jl/previews/PR239/assets/kbzwnsa.DC3TvBOO.png",g=JSON.parse('{"title":"Covers","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/geom_relations/covers.md","filePath":"source/methods/geom_relations/covers.md","lastUpdated":null}'),p={name:"source/methods/geom_relations/covers.md"};function l(h,s,k,r,o,d){return n(),a("div",null,s[0]||(s[0]=[e(`

    Covers

    julia
    export covers

    What is covers?

    The covers function checks if a given geometry completely covers another geometry. For this to be true, the "contained" geometry's interior and boundaries must be covered by the "covering" geometry's interior and boundaries. The interiors do not need to overlap.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +p1 = (0.0, 0.0)
    +p2 = (1.0, 1.0)
    +l1 = GI.Line([p1, p2])
    +
    +f, a, p = lines(GI.getpoint(l1))
    +scatter!(p1, color = :red)
    +f

    julia
    GO.covers(l1, p1)  # returns true
    +GO.covers(p1, l1)  # returns false
    false

    Implementation

    This is the GeoInterface-compatible implementation.

    Given that covers is the exact opposite of coveredby, we simply pass the two inputs variables, swapped in order, to coveredby.

    julia
    """
    +    covers(g1::AbstractGeometry, g2::AbstractGeometry)::Bool
    +
    +Return true if the first geometry is completely covers the second geometry,
    +The exterior and boundary of the second geometry must not be outside of the
    +interior and boundary of the first geometry. However, the interiors need not
    +intersect.
    +
    +\`covers\` returns the exact opposite result of \`coveredby\`.
    +
    +# Examples
    +
    +\`\`\`jldoctest
    +import GeometryOps as GO, GeoInterface as GI
    +l1 = GI.LineString([(1.0, 1.0), (1.0, 2.0), (1.0, 3.0), (1.0, 4.0)])
    +l2 = GI.LineString([(1.0, 1.0), (1.0, 2.0)])
    +
    +GO.covers(l1, l2)

    output

    julia
    true
    +\`\`\`
    +"""
    +covers(g1, g2)::Bool = GeometryOps.coveredby(g2, g1)

    This page was generated using Literate.jl.

    `,17)]))}const E=i(p,[["render",l]]);export{g as __pageData,E as default}; diff --git a/previews/PR239/assets/source_methods_geom_relations_covers.md.Ds8aZwNW.lean.js b/previews/PR239/assets/source_methods_geom_relations_covers.md.Ds8aZwNW.lean.js new file mode 100644 index 000000000..9fdf77d59 --- /dev/null +++ b/previews/PR239/assets/source_methods_geom_relations_covers.md.Ds8aZwNW.lean.js @@ -0,0 +1,33 @@ +import{_ as i,c as a,a5 as e,o as n}from"./chunks/framework.onQNwZ2I.js";const t="/GeometryOps.jl/previews/PR239/assets/kbzwnsa.DC3TvBOO.png",g=JSON.parse('{"title":"Covers","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/geom_relations/covers.md","filePath":"source/methods/geom_relations/covers.md","lastUpdated":null}'),p={name:"source/methods/geom_relations/covers.md"};function l(h,s,k,r,o,d){return n(),a("div",null,s[0]||(s[0]=[e(`

    Covers

    julia
    export covers

    What is covers?

    The covers function checks if a given geometry completely covers another geometry. For this to be true, the "contained" geometry's interior and boundaries must be covered by the "covering" geometry's interior and boundaries. The interiors do not need to overlap.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +p1 = (0.0, 0.0)
    +p2 = (1.0, 1.0)
    +l1 = GI.Line([p1, p2])
    +
    +f, a, p = lines(GI.getpoint(l1))
    +scatter!(p1, color = :red)
    +f

    julia
    GO.covers(l1, p1)  # returns true
    +GO.covers(p1, l1)  # returns false
    false

    Implementation

    This is the GeoInterface-compatible implementation.

    Given that covers is the exact opposite of coveredby, we simply pass the two inputs variables, swapped in order, to coveredby.

    julia
    """
    +    covers(g1::AbstractGeometry, g2::AbstractGeometry)::Bool
    +
    +Return true if the first geometry is completely covers the second geometry,
    +The exterior and boundary of the second geometry must not be outside of the
    +interior and boundary of the first geometry. However, the interiors need not
    +intersect.
    +
    +\`covers\` returns the exact opposite result of \`coveredby\`.
    +
    +# Examples
    +
    +\`\`\`jldoctest
    +import GeometryOps as GO, GeoInterface as GI
    +l1 = GI.LineString([(1.0, 1.0), (1.0, 2.0), (1.0, 3.0), (1.0, 4.0)])
    +l2 = GI.LineString([(1.0, 1.0), (1.0, 2.0)])
    +
    +GO.covers(l1, l2)

    output

    julia
    true
    +\`\`\`
    +"""
    +covers(g1, g2)::Bool = GeometryOps.coveredby(g2, g1)

    This page was generated using Literate.jl.

    `,17)]))}const E=i(p,[["render",l]]);export{g as __pageData,E as default}; diff --git a/previews/PR239/assets/source_methods_geom_relations_crosses.md.-nyWl6CC.js b/previews/PR239/assets/source_methods_geom_relations_crosses.md.-nyWl6CC.js new file mode 100644 index 000000000..41b060fb1 --- /dev/null +++ b/previews/PR239/assets/source_methods_geom_relations_crosses.md.-nyWl6CC.js @@ -0,0 +1,120 @@ +import{_ as i,c as a,a5 as n,o as l}from"./chunks/framework.onQNwZ2I.js";const d=JSON.parse('{"title":"Crossing checks","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/geom_relations/crosses.md","filePath":"source/methods/geom_relations/crosses.md","lastUpdated":null}'),p={name:"source/methods/geom_relations/crosses.md"};function h(t,s,k,e,r,E){return l(),a("div",null,s[0]||(s[0]=[n(`

    Crossing checks

    julia
    """
    +     crosses(geom1, geom2)::Bool
    +
    +Return \`true\` if the intersection results in a geometry whose dimension is one less than
    +the maximum dimension of the two source geometries and the intersection set is interior to
    +both source geometries.
    +
    +TODO: broken
    +
    +# Examples
    +\`\`\`julia
    +import GeoInterface as GI, GeometryOps as GO

    TODO: Add working example

    julia
    \`\`\`
    +"""
    +crosses(g1, g2)::Bool = crosses(trait(g1), g1, trait(g2), g2)::Bool
    +crosses(t1::FeatureTrait, g1, t2, g2)::Bool = crosses(GI.geometry(g1), g2)
    +crosses(t1, g1, t2::FeatureTrait, g2)::Bool = crosses(g1, geometry(g2))
    +crosses(::MultiPointTrait, g1, ::LineStringTrait, g2)::Bool = multipoint_crosses_line(g1, g2)
    +crosses(::MultiPointTrait, g1, ::PolygonTrait, g2)::Bool = multipoint_crosses_poly(g1, g2)
    +crosses(::LineStringTrait, g1, ::MultiPointTrait, g2)::Bool = multipoint_crosses_lines(g2, g1)
    +crosses(::LineStringTrait, g1, ::PolygonTrait, g2)::Bool = line_crosses_poly(g1, g2)
    +crosses(::LineStringTrait, g1, ::LineStringTrait, g2)::Bool = line_crosses_line(g1, g2)
    +crosses(::PolygonTrait, g1, ::MultiPointTrait, g2)::Bool = multipoint_crosses_poly(g2, g1)
    +crosses(::PolygonTrait, g1, ::LineStringTrait, g2)::Bool = line_crosses_poly(g2, g1)
    +
    +function multipoint_crosses_line(geom1, geom2)
    +    int_point = false
    +    ext_point = false
    +    i = 1
    +    np2 = GI.npoint(geom2)
    +
    +    while i < GI.npoint(geom1) && !int_point && !ext_point
    +        for j in 1:GI.npoint(geom2) - 1
    +            exclude_boundary = (j === 1 || j === np2 - 2) ? :none : :both
    +            if _point_on_segment(GI.getpoint(geom1, i), (GI.getpoint(geom2, j), GI.getpoint(geom2, j + 1)); exclude_boundary)
    +                int_point = true
    +            else
    +                ext_point = true
    +            end
    +        end
    +        i += 1
    +    end
    +    return int_point && ext_point
    +end
    +
    +function line_crosses_line(line1, line2)
    +    np2 = GI.npoint(line2)
    +    if GeometryOps.intersects(line1, line2)
    +        for i in 1:GI.npoint(line1) - 1
    +            for j in 1:GI.npoint(line2) - 1
    +                exclude_boundary = (j === 1 || j === np2 - 2) ? :none : :both
    +                pa = GI.getpoint(line1, i)
    +                pb = GI.getpoint(line1, i + 1)
    +                p = GI.getpoint(line2, j)
    +                _point_on_segment(p, (pa, pb); exclude_boundary) && return true
    +            end
    +        end
    +    end
    +    return false
    +end
    +
    +function line_crosses_poly(line, poly)
    +    for l in flatten(AbstractCurveTrait, poly)
    +        intersects(line, l) && return true
    +    end
    +    return false
    +end
    +
    +function multipoint_crosses_poly(mp, poly)
    +    int_point = false
    +    ext_point = false
    +
    +    for p in GI.getpoint(mp)
    +        if _point_polygon_process(
    +            p, poly;
    +            in_allow = true, on_allow = true, out_allow = false, exact = _False()
    +        )
    +            int_point = true
    +        else
    +            ext_point = true
    +        end
    +        int_point && ext_point && return true
    +    end
    +    return false
    +end
    +
    +#= TODO: Once crosses is swapped over to use the geom relations workflow, can
    +delete these helpers. =#
    +
    +function _point_on_segment(point, (start, stop); exclude_boundary::Symbol=:none)::Bool
    +    x, y = GI.x(point), GI.y(point)
    +    x1, y1 = GI.x(start), GI.y(start)
    +    x2, y2 = GI.x(stop), GI.y(stop)
    +
    +    dxc = x - x1
    +    dyc = y - y1
    +    dx1 = x2 - x1
    +    dy1 = y2 - y1

    TODO use better predicate for crossing here

    julia
        cross = dxc * dy1 - dyc * dx1
    +    cross != 0 && return false

    Will constprop optimise these away?

    julia
        if exclude_boundary === :none
    +        if abs(dx1) >= abs(dy1)
    +            return dx1 > 0 ? x1 <= x && x <= x2 : x2 <= x && x <= x1
    +        end
    +        return dy1 > 0 ? y1 <= y && y <= y2 : y2 <= y && y <= y1
    +    elseif exclude_boundary === :start
    +        if abs(dx1) >= abs(dy1)
    +             return dx1 > 0 ? x1 < x && x <= x2 : x2 <= x && x < x1
    +        end
    +        return dy1 > 0 ? y1 < y && y <= y2 : y2 <= y && y < y1
    +    elseif exclude_boundary === :end
    +        if abs(dx1) >= abs(dy1)
    +            return dx1 > 0 ? x1 <= x && x < x2 : x2 < x && x <= x1
    +        end
    +        return dy1 > 0 ? y1 <= y && y < y2 : y2 < y && y <= y1
    +    elseif exclude_boundary === :both
    +        if abs(dx1) >= abs(dy1)
    +            return dx1 > 0 ? x1 < x && x < x2 : x2 < x && x < x1
    +        end
    +        return dy1 > 0 ? y1 < y && y < y2 : y2 < y && y < y1
    +    end
    +    return false
    +end

    This page was generated using Literate.jl.

    `,10)]))}const F=i(p,[["render",h]]);export{d as __pageData,F as default}; diff --git a/previews/PR239/assets/source_methods_geom_relations_crosses.md.-nyWl6CC.lean.js b/previews/PR239/assets/source_methods_geom_relations_crosses.md.-nyWl6CC.lean.js new file mode 100644 index 000000000..41b060fb1 --- /dev/null +++ b/previews/PR239/assets/source_methods_geom_relations_crosses.md.-nyWl6CC.lean.js @@ -0,0 +1,120 @@ +import{_ as i,c as a,a5 as n,o as l}from"./chunks/framework.onQNwZ2I.js";const d=JSON.parse('{"title":"Crossing checks","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/geom_relations/crosses.md","filePath":"source/methods/geom_relations/crosses.md","lastUpdated":null}'),p={name:"source/methods/geom_relations/crosses.md"};function h(t,s,k,e,r,E){return l(),a("div",null,s[0]||(s[0]=[n(`

    Crossing checks

    julia
    """
    +     crosses(geom1, geom2)::Bool
    +
    +Return \`true\` if the intersection results in a geometry whose dimension is one less than
    +the maximum dimension of the two source geometries and the intersection set is interior to
    +both source geometries.
    +
    +TODO: broken
    +
    +# Examples
    +\`\`\`julia
    +import GeoInterface as GI, GeometryOps as GO

    TODO: Add working example

    julia
    \`\`\`
    +"""
    +crosses(g1, g2)::Bool = crosses(trait(g1), g1, trait(g2), g2)::Bool
    +crosses(t1::FeatureTrait, g1, t2, g2)::Bool = crosses(GI.geometry(g1), g2)
    +crosses(t1, g1, t2::FeatureTrait, g2)::Bool = crosses(g1, geometry(g2))
    +crosses(::MultiPointTrait, g1, ::LineStringTrait, g2)::Bool = multipoint_crosses_line(g1, g2)
    +crosses(::MultiPointTrait, g1, ::PolygonTrait, g2)::Bool = multipoint_crosses_poly(g1, g2)
    +crosses(::LineStringTrait, g1, ::MultiPointTrait, g2)::Bool = multipoint_crosses_lines(g2, g1)
    +crosses(::LineStringTrait, g1, ::PolygonTrait, g2)::Bool = line_crosses_poly(g1, g2)
    +crosses(::LineStringTrait, g1, ::LineStringTrait, g2)::Bool = line_crosses_line(g1, g2)
    +crosses(::PolygonTrait, g1, ::MultiPointTrait, g2)::Bool = multipoint_crosses_poly(g2, g1)
    +crosses(::PolygonTrait, g1, ::LineStringTrait, g2)::Bool = line_crosses_poly(g2, g1)
    +
    +function multipoint_crosses_line(geom1, geom2)
    +    int_point = false
    +    ext_point = false
    +    i = 1
    +    np2 = GI.npoint(geom2)
    +
    +    while i < GI.npoint(geom1) && !int_point && !ext_point
    +        for j in 1:GI.npoint(geom2) - 1
    +            exclude_boundary = (j === 1 || j === np2 - 2) ? :none : :both
    +            if _point_on_segment(GI.getpoint(geom1, i), (GI.getpoint(geom2, j), GI.getpoint(geom2, j + 1)); exclude_boundary)
    +                int_point = true
    +            else
    +                ext_point = true
    +            end
    +        end
    +        i += 1
    +    end
    +    return int_point && ext_point
    +end
    +
    +function line_crosses_line(line1, line2)
    +    np2 = GI.npoint(line2)
    +    if GeometryOps.intersects(line1, line2)
    +        for i in 1:GI.npoint(line1) - 1
    +            for j in 1:GI.npoint(line2) - 1
    +                exclude_boundary = (j === 1 || j === np2 - 2) ? :none : :both
    +                pa = GI.getpoint(line1, i)
    +                pb = GI.getpoint(line1, i + 1)
    +                p = GI.getpoint(line2, j)
    +                _point_on_segment(p, (pa, pb); exclude_boundary) && return true
    +            end
    +        end
    +    end
    +    return false
    +end
    +
    +function line_crosses_poly(line, poly)
    +    for l in flatten(AbstractCurveTrait, poly)
    +        intersects(line, l) && return true
    +    end
    +    return false
    +end
    +
    +function multipoint_crosses_poly(mp, poly)
    +    int_point = false
    +    ext_point = false
    +
    +    for p in GI.getpoint(mp)
    +        if _point_polygon_process(
    +            p, poly;
    +            in_allow = true, on_allow = true, out_allow = false, exact = _False()
    +        )
    +            int_point = true
    +        else
    +            ext_point = true
    +        end
    +        int_point && ext_point && return true
    +    end
    +    return false
    +end
    +
    +#= TODO: Once crosses is swapped over to use the geom relations workflow, can
    +delete these helpers. =#
    +
    +function _point_on_segment(point, (start, stop); exclude_boundary::Symbol=:none)::Bool
    +    x, y = GI.x(point), GI.y(point)
    +    x1, y1 = GI.x(start), GI.y(start)
    +    x2, y2 = GI.x(stop), GI.y(stop)
    +
    +    dxc = x - x1
    +    dyc = y - y1
    +    dx1 = x2 - x1
    +    dy1 = y2 - y1

    TODO use better predicate for crossing here

    julia
        cross = dxc * dy1 - dyc * dx1
    +    cross != 0 && return false

    Will constprop optimise these away?

    julia
        if exclude_boundary === :none
    +        if abs(dx1) >= abs(dy1)
    +            return dx1 > 0 ? x1 <= x && x <= x2 : x2 <= x && x <= x1
    +        end
    +        return dy1 > 0 ? y1 <= y && y <= y2 : y2 <= y && y <= y1
    +    elseif exclude_boundary === :start
    +        if abs(dx1) >= abs(dy1)
    +             return dx1 > 0 ? x1 < x && x <= x2 : x2 <= x && x < x1
    +        end
    +        return dy1 > 0 ? y1 < y && y <= y2 : y2 <= y && y < y1
    +    elseif exclude_boundary === :end
    +        if abs(dx1) >= abs(dy1)
    +            return dx1 > 0 ? x1 <= x && x < x2 : x2 < x && x <= x1
    +        end
    +        return dy1 > 0 ? y1 <= y && y < y2 : y2 < y && y <= y1
    +    elseif exclude_boundary === :both
    +        if abs(dx1) >= abs(dy1)
    +            return dx1 > 0 ? x1 < x && x < x2 : x2 < x && x < x1
    +        end
    +        return dy1 > 0 ? y1 < y && y < y2 : y2 < y && y < y1
    +    end
    +    return false
    +end

    This page was generated using Literate.jl.

    `,10)]))}const F=i(p,[["render",h]]);export{d as __pageData,F as default}; diff --git a/previews/PR239/assets/source_methods_geom_relations_disjoint.md.DH85oHhz.js b/previews/PR239/assets/source_methods_geom_relations_disjoint.md.DH85oHhz.js new file mode 100644 index 000000000..0986ed48d --- /dev/null +++ b/previews/PR239/assets/source_methods_geom_relations_disjoint.md.DH85oHhz.js @@ -0,0 +1,178 @@ +import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const h="/GeometryOps.jl/previews/PR239/assets/jsdldah.C3SxJ3x-.png",o=JSON.parse('{"title":"Disjoint","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/geom_relations/disjoint.md","filePath":"source/methods/geom_relations/disjoint.md","lastUpdated":null}'),l={name:"source/methods/geom_relations/disjoint.md"};function p(k,s,e,r,E,g){return t(),a("div",null,s[0]||(s[0]=[n(`

    Disjoint

    julia
    export disjoint

    What is disjoint?

    The disjoint function checks if one geometry is outside of another geometry, without sharing any boundaries or interiors.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +l1 = GI.LineString([(0.0, 0.0), (1.0, 0.0), (0.0, 0.1)])
    +l2 = GI.LineString([(2.0, 0.0), (2.75, 0.0)])
    +f, a, p = lines(GI.getpoint(l1), color = :blue)
    +scatter!(GI.getpoint(l1), color = :blue)
    +lines!(GI.getpoint(l2), color = :orange)
    +scatter!(GI.getpoint(l2), color = :orange)
    +f

    We can see that none of the edges or vertices of l1 interact with l2 so they are disjoint.

    julia
    GO.disjoint(l1, l2)  # returns true
    true

    Implementation

    This is the GeoInterface-compatible implementation.

    First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait.

    Each of these calls a method in the geom_geom_processors file. The methods in this file determine if the given geometries meet a set of criteria. For the disjoint function and arguments g1 and g2, this criteria is as follows: - points of g1 are not allowed to be in the interior of g2 - points of g1 are not allowed to be on the boundary of g2 - points of g1 are allowed to be in the exterior of g2 - no points required to be in the interior of g2 - no points of g1 are required to be on the boundary of g2 - no points of g1 are required to be in the exterior of g2

    The code for the specific implementations is in the geom_geom_processors file.

    julia
    const DISJOINT_ALLOWS = (in_allow = false, on_allow = false, out_allow = true)
    +const DISJOINT_CURVE_ALLOWS = (over_allow = false, cross_allow = false, on_allow = false, out_allow = true)
    +const DISJOINT_REQUIRES = (in_require = false, on_require = false, out_require = false)
    +const DISJOINT_EXACT = (exact = _False(),)
    +
    +"""
    +    disjoint(geom1, geom2)::Bool
    +
    +Return \`true\` if the first geometry is disjoint from the second geometry.
    +
    +Return \`true\` if the first geometry is disjoint from the second geometry. The
    +interiors and boundaries of both geometries must not intersect.
    +
    +# Examples
    +\`\`\`jldoctest setup=:(using GeometryOps, GeoInterface)
    +import GeometryOps as GO, GeoInterface as GI
    +
    +line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
    +point = (2, 2)
    +GO.disjoint(point, line)

    output

    julia
    true
    +\`\`\`
    +"""
    +disjoint(g1, g2) = _disjoint(trait(g1), g1, trait(g2), g2)

    Convert features to geometries

    julia
    _disjoint(::FeatureTrait, g1, ::Any, g2) = disjoint(GI.geometry(g1), g2)
    +_disjoint(::Any, g1, ::FeatureTrait, g2) = disjoint(g1, geometry(g2))
    +_disjoint(::FeatureTrait, g1, ::FeatureTrait, g2) = disjoint(GI.geometry(g1), GI.geometry(g2))

    Point disjoint geometries

    Point is disjoint from another point if the points are not equal.

    julia
    _disjoint(
    +    ::GI.PointTrait, g1,
    +    ::GI.PointTrait, g2,
    +) = !equals(g1, g2)

    Point is disjoint from a linestring if it is not on the line's edges/vertices.

    julia
    _disjoint(
    +    ::GI.PointTrait, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _point_curve_process(
    +    g1, g2;
    +    DISJOINT_ALLOWS...,
    +    closed_curve = false,
    +)

    Point is disjoint from a linearring if it is not on the ring's edges/vertices.

    julia
    _disjoint(
    +    ::GI.PointTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _point_curve_process(
    +    g1, g2;
    +    DISJOINT_ALLOWS...,
    +    closed_curve = true,
    +)
    +
    +#= Point is disjoint from a polygon if it is not on any edges, vertices, or
    +within the polygon's interior. =#
    +_disjoint(
    +    ::GI.PointTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _point_polygon_process(
    +    g1, g2;
    +    DISJOINT_ALLOWS...,
    +    DISJOINT_EXACT...,
    +)
    +
    +#= Geometry is disjoint from a point if the point is not in the interior or on
    +the boundary of the geometry. =#
    +_disjoint(
    +    trait1::Union{GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    trait2::GI.PointTrait, g2,
    +) = _disjoint(trait2, g2, trait1, g1)

    Lines disjoint geometries

    julia
    #= Linestring is disjoint from another line if they do not share any interior
    +edge/vertex points or boundary points. =#
    +_disjoint(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    DISJOINT_CURVE_ALLOWS...,
    +    DISJOINT_REQUIRES...,
    +    DISJOINT_EXACT...,
    +    closed_line = false,
    +    closed_curve = false,
    +)
    +
    +#= Linestring is disjoint from a linearring if they do not share any interior
    +edge/vertex points or boundary points. =#
    +_disjoint(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    DISJOINT_CURVE_ALLOWS...,
    +    DISJOINT_REQUIRES...,
    +    DISJOINT_EXACT...,
    +    closed_line = false,
    +    closed_curve = true,
    +)
    +
    +#= Linestring is disjoint from a polygon if the interior and boundary points of
    +the line are not in the polygon's interior or on the polygon's boundary. =#
    +_disjoint(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    DISJOINT_ALLOWS...,
    +    DISJOINT_REQUIRES...,
    +    DISJOINT_EXACT...,
    +    closed_line = false,
    +)
    +
    +#= Geometry is disjoint from a linestring if the line's interior and boundary
    +points don't intersect with the geometry's interior and boundary points. =#
    +_disjoint(
    +    trait1::Union{GI.LinearRingTrait, GI.PolygonTrait}, g1,
    +    trait2::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _disjoint(trait2, g2, trait1, g1)

    Rings disjoint geometries

    julia
    #= Linearrings is disjoint from another linearring if they do not share any
    +interior edge/vertex points or boundary points.=#
    +_disjoint(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    DISJOINT_CURVE_ALLOWS...,
    +    DISJOINT_REQUIRES...,
    +    DISJOINT_EXACT...,
    +    closed_line = true,
    +    closed_curve = true,
    +)
    +
    +#= Linearring is disjoint from a polygon if the interior and boundary points of
    +the ring are not in the polygon's interior or on the polygon's boundary. =#
    +_disjoint(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    DISJOINT_ALLOWS...,
    +    DISJOINT_REQUIRES...,
    +    DISJOINT_EXACT...,
    +    closed_line = true,
    +)

    Polygon disjoint geometries

    julia
    #= Polygon is disjoint from another polygon if they do not share any edges or
    +vertices and if their interiors do not intersect, excluding any holes. =#
    +_disjoint(
    +    ::GI.PolygonTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _polygon_polygon_process(
    +    g1, g2;
    +    DISJOINT_ALLOWS...,
    +    DISJOINT_REQUIRES...,
    +    DISJOINT_EXACT...,
    +)

    Geometries disjoint multi-geometry/geometry collections

    julia
    #= Geometry is disjoint from a multi-geometry or a collection if all of the
    +elements of the collection are disjoint from the geometry. =#
    +function _disjoint(
    +    ::Union{GI.PointTrait, GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g2,
    +)
    +    for sub_g2 in GI.getgeom(g2)
    +        !disjoint(g1, sub_g2) && return false
    +    end
    +    return true
    +end

    Multi-geometry/geometry collections coveredby geometries

    julia
    #= Multi-geometry or a geometry collection is covered by a geometry if all
    +elements of the collection are covered by the geometry. =#
    +function _disjoint(
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g1,
    +    ::GI.AbstractGeometryTrait, g2,
    +)
    +    for sub_g1 in GI.getgeom(g1)
    +        !disjoint(sub_g1, g2) && return false
    +    end
    +    return true
    +end

    This page was generated using Literate.jl.

    `,39)]))}const y=i(l,[["render",p]]);export{o as __pageData,y as default}; diff --git a/previews/PR239/assets/source_methods_geom_relations_disjoint.md.DH85oHhz.lean.js b/previews/PR239/assets/source_methods_geom_relations_disjoint.md.DH85oHhz.lean.js new file mode 100644 index 000000000..0986ed48d --- /dev/null +++ b/previews/PR239/assets/source_methods_geom_relations_disjoint.md.DH85oHhz.lean.js @@ -0,0 +1,178 @@ +import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const h="/GeometryOps.jl/previews/PR239/assets/jsdldah.C3SxJ3x-.png",o=JSON.parse('{"title":"Disjoint","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/geom_relations/disjoint.md","filePath":"source/methods/geom_relations/disjoint.md","lastUpdated":null}'),l={name:"source/methods/geom_relations/disjoint.md"};function p(k,s,e,r,E,g){return t(),a("div",null,s[0]||(s[0]=[n(`

    Disjoint

    julia
    export disjoint

    What is disjoint?

    The disjoint function checks if one geometry is outside of another geometry, without sharing any boundaries or interiors.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +l1 = GI.LineString([(0.0, 0.0), (1.0, 0.0), (0.0, 0.1)])
    +l2 = GI.LineString([(2.0, 0.0), (2.75, 0.0)])
    +f, a, p = lines(GI.getpoint(l1), color = :blue)
    +scatter!(GI.getpoint(l1), color = :blue)
    +lines!(GI.getpoint(l2), color = :orange)
    +scatter!(GI.getpoint(l2), color = :orange)
    +f

    We can see that none of the edges or vertices of l1 interact with l2 so they are disjoint.

    julia
    GO.disjoint(l1, l2)  # returns true
    true

    Implementation

    This is the GeoInterface-compatible implementation.

    First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait.

    Each of these calls a method in the geom_geom_processors file. The methods in this file determine if the given geometries meet a set of criteria. For the disjoint function and arguments g1 and g2, this criteria is as follows: - points of g1 are not allowed to be in the interior of g2 - points of g1 are not allowed to be on the boundary of g2 - points of g1 are allowed to be in the exterior of g2 - no points required to be in the interior of g2 - no points of g1 are required to be on the boundary of g2 - no points of g1 are required to be in the exterior of g2

    The code for the specific implementations is in the geom_geom_processors file.

    julia
    const DISJOINT_ALLOWS = (in_allow = false, on_allow = false, out_allow = true)
    +const DISJOINT_CURVE_ALLOWS = (over_allow = false, cross_allow = false, on_allow = false, out_allow = true)
    +const DISJOINT_REQUIRES = (in_require = false, on_require = false, out_require = false)
    +const DISJOINT_EXACT = (exact = _False(),)
    +
    +"""
    +    disjoint(geom1, geom2)::Bool
    +
    +Return \`true\` if the first geometry is disjoint from the second geometry.
    +
    +Return \`true\` if the first geometry is disjoint from the second geometry. The
    +interiors and boundaries of both geometries must not intersect.
    +
    +# Examples
    +\`\`\`jldoctest setup=:(using GeometryOps, GeoInterface)
    +import GeometryOps as GO, GeoInterface as GI
    +
    +line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
    +point = (2, 2)
    +GO.disjoint(point, line)

    output

    julia
    true
    +\`\`\`
    +"""
    +disjoint(g1, g2) = _disjoint(trait(g1), g1, trait(g2), g2)

    Convert features to geometries

    julia
    _disjoint(::FeatureTrait, g1, ::Any, g2) = disjoint(GI.geometry(g1), g2)
    +_disjoint(::Any, g1, ::FeatureTrait, g2) = disjoint(g1, geometry(g2))
    +_disjoint(::FeatureTrait, g1, ::FeatureTrait, g2) = disjoint(GI.geometry(g1), GI.geometry(g2))

    Point disjoint geometries

    Point is disjoint from another point if the points are not equal.

    julia
    _disjoint(
    +    ::GI.PointTrait, g1,
    +    ::GI.PointTrait, g2,
    +) = !equals(g1, g2)

    Point is disjoint from a linestring if it is not on the line's edges/vertices.

    julia
    _disjoint(
    +    ::GI.PointTrait, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _point_curve_process(
    +    g1, g2;
    +    DISJOINT_ALLOWS...,
    +    closed_curve = false,
    +)

    Point is disjoint from a linearring if it is not on the ring's edges/vertices.

    julia
    _disjoint(
    +    ::GI.PointTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _point_curve_process(
    +    g1, g2;
    +    DISJOINT_ALLOWS...,
    +    closed_curve = true,
    +)
    +
    +#= Point is disjoint from a polygon if it is not on any edges, vertices, or
    +within the polygon's interior. =#
    +_disjoint(
    +    ::GI.PointTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _point_polygon_process(
    +    g1, g2;
    +    DISJOINT_ALLOWS...,
    +    DISJOINT_EXACT...,
    +)
    +
    +#= Geometry is disjoint from a point if the point is not in the interior or on
    +the boundary of the geometry. =#
    +_disjoint(
    +    trait1::Union{GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    trait2::GI.PointTrait, g2,
    +) = _disjoint(trait2, g2, trait1, g1)

    Lines disjoint geometries

    julia
    #= Linestring is disjoint from another line if they do not share any interior
    +edge/vertex points or boundary points. =#
    +_disjoint(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    DISJOINT_CURVE_ALLOWS...,
    +    DISJOINT_REQUIRES...,
    +    DISJOINT_EXACT...,
    +    closed_line = false,
    +    closed_curve = false,
    +)
    +
    +#= Linestring is disjoint from a linearring if they do not share any interior
    +edge/vertex points or boundary points. =#
    +_disjoint(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    DISJOINT_CURVE_ALLOWS...,
    +    DISJOINT_REQUIRES...,
    +    DISJOINT_EXACT...,
    +    closed_line = false,
    +    closed_curve = true,
    +)
    +
    +#= Linestring is disjoint from a polygon if the interior and boundary points of
    +the line are not in the polygon's interior or on the polygon's boundary. =#
    +_disjoint(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    DISJOINT_ALLOWS...,
    +    DISJOINT_REQUIRES...,
    +    DISJOINT_EXACT...,
    +    closed_line = false,
    +)
    +
    +#= Geometry is disjoint from a linestring if the line's interior and boundary
    +points don't intersect with the geometry's interior and boundary points. =#
    +_disjoint(
    +    trait1::Union{GI.LinearRingTrait, GI.PolygonTrait}, g1,
    +    trait2::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _disjoint(trait2, g2, trait1, g1)

    Rings disjoint geometries

    julia
    #= Linearrings is disjoint from another linearring if they do not share any
    +interior edge/vertex points or boundary points.=#
    +_disjoint(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    DISJOINT_CURVE_ALLOWS...,
    +    DISJOINT_REQUIRES...,
    +    DISJOINT_EXACT...,
    +    closed_line = true,
    +    closed_curve = true,
    +)
    +
    +#= Linearring is disjoint from a polygon if the interior and boundary points of
    +the ring are not in the polygon's interior or on the polygon's boundary. =#
    +_disjoint(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    DISJOINT_ALLOWS...,
    +    DISJOINT_REQUIRES...,
    +    DISJOINT_EXACT...,
    +    closed_line = true,
    +)

    Polygon disjoint geometries

    julia
    #= Polygon is disjoint from another polygon if they do not share any edges or
    +vertices and if their interiors do not intersect, excluding any holes. =#
    +_disjoint(
    +    ::GI.PolygonTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _polygon_polygon_process(
    +    g1, g2;
    +    DISJOINT_ALLOWS...,
    +    DISJOINT_REQUIRES...,
    +    DISJOINT_EXACT...,
    +)

    Geometries disjoint multi-geometry/geometry collections

    julia
    #= Geometry is disjoint from a multi-geometry or a collection if all of the
    +elements of the collection are disjoint from the geometry. =#
    +function _disjoint(
    +    ::Union{GI.PointTrait, GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g2,
    +)
    +    for sub_g2 in GI.getgeom(g2)
    +        !disjoint(g1, sub_g2) && return false
    +    end
    +    return true
    +end

    Multi-geometry/geometry collections coveredby geometries

    julia
    #= Multi-geometry or a geometry collection is covered by a geometry if all
    +elements of the collection are covered by the geometry. =#
    +function _disjoint(
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g1,
    +    ::GI.AbstractGeometryTrait, g2,
    +)
    +    for sub_g1 in GI.getgeom(g1)
    +        !disjoint(sub_g1, g2) && return false
    +    end
    +    return true
    +end

    This page was generated using Literate.jl.

    `,39)]))}const y=i(l,[["render",p]]);export{o as __pageData,y as default}; diff --git a/previews/PR239/assets/source_methods_geom_relations_geom_geom_processors.md.CmpKdMyB.js b/previews/PR239/assets/source_methods_geom_relations_geom_geom_processors.md.CmpKdMyB.js new file mode 100644 index 000000000..869aea8c8 --- /dev/null +++ b/previews/PR239/assets/source_methods_geom_relations_geom_geom_processors.md.CmpKdMyB.js @@ -0,0 +1,437 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"Line-curve interaction","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/geom_relations/geom_geom_processors.md","filePath":"source/methods/geom_relations/geom_geom_processors.md","lastUpdated":null}'),l={name:"source/methods/geom_relations/geom_geom_processors.md"};function t(p,s,k,e,r,E){return h(),a("div",null,s[0]||(s[0]=[n(`

    Line-curve interaction

    julia
    #= Code is based off of DE-9IM Standards (https://en.wikipedia.org/wiki/DE-9IM)
    +and attempts a standardized solution for most of the functions.
    +=#
    +
    +"""
    +    Enum PointOrientation
    +
    +Enum for the orientation of a point with respect to a curve. A point can be
    +\`point_in\` the curve, \`point_on\` the curve, or \`point_out\` of the curve.
    +"""
    +@enum PointOrientation point_in=1 point_on=2 point_out=3

    Determines if a point meets the given checks with respect to a curve.

    If in_allow is true, the point can be on the curve interior. If on_allow is true, the point can be on the curve boundary. If out_allow is true, the point can be disjoint from the curve.

    If the point is in an "allowed" location, return true. Else, return false.

    If closed_curve is true, curve is treated as a closed curve where the first and last point are connected by a segment.

    julia
    function _point_curve_process(
    +    point, curve;
    +    in_allow, on_allow, out_allow,
    +    closed_curve = false,
    +)

    Determine if curve is closed

    julia
        n = GI.npoint(curve)
    +    first_last_equal = equals(GI.getpoint(curve, 1), GI.getpoint(curve, n))
    +    closed_curve |= first_last_equal
    +    n -= first_last_equal ? 1 : 0

    Loop through all curve segments

    julia
        p_start = GI.getpoint(curve, closed_curve ? n : 1)
    +    @inbounds for i in (closed_curve ? 1 : 2):n
    +        p_end = GI.getpoint(curve, i)
    +        seg_val = _point_segment_orientation(point, p_start, p_end)
    +        seg_val == point_in && return in_allow
    +        if seg_val == point_on
    +            if !closed_curve  # if point is on curve endpoints, it is "on"
    +                i == 2 && equals(point, p_start) && return on_allow
    +                i == n && equals(point, p_end) && return on_allow
    +            end
    +            return in_allow
    +        end
    +        p_start = p_end
    +    end
    +    return out_allow
    +end

    Determines if a point meets the given checks with respect to a polygon.

    If in_allow is true, the point can be within the polygon interior If on_allow is true, the point can be on the polygon boundary. If out_allow is true, the point can be disjoint from the polygon.

    If the point is in an "allowed" location, return true. Else, return false.

    julia
    function _point_polygon_process(
    +    point, polygon;
    +    in_allow, on_allow, out_allow, exact,
    +)

    Check interaction of geom with polygon's exterior boundary

    julia
        ext_val = _point_filled_curve_orientation(point, GI.getexterior(polygon); exact)

    If a point is outside, it isn't interacting with any holes

    julia
        ext_val == point_out && return out_allow

    if a point is on an external boundary, it isn't interacting with any holes

    julia
        ext_val == point_on && return on_allow

    If geom is within the polygon, need to check interactions with holes

    julia
        for hole in GI.gethole(polygon)
    +        hole_val = _point_filled_curve_orientation(point, hole; exact)

    If a point in in a hole, it is outside of the polygon

    julia
            hole_val == point_in && return out_allow

    If a point in on a hole edge, it is on the edge of the polygon

    julia
            hole_val == point_on && return on_allow
    +    end

    Point is within external boundary and on in/on any holes

    julia
        return in_allow
    +end

    Determines if a line meets the given checks with respect to a curve.

    If over_allow is true, segments of the line and curve can be co-linear. If cross_allow is true, segments of the line and curve can cross. If on_allow is true, endpoints of either the line or curve can intersect a segment of the other geometry. If cross_allow is true, segments of the line and curve can be disjoint.

    If in_require is true, the interiors of the line and curve must meet in at least one point. If on_require is true, the boundary of one of the two geometries can meet the interior or boundary of the other geometry in at least one point. If out_require is true, there must be at least one point of the given line that is exterior of the curve.

    If the point is in an "allowed" location and meets all requirements, return true. Else, return false.

    If closed_line is true, line is treated as a closed line where the first and last point are connected by a segment. Same with closed_curve.

    julia
    @inline function _line_curve_process(line, curve;
    +    over_allow, cross_allow, kw...
    +)
    +    skip, returnval = _maybe_skip_disjoint_extents(line, curve;
    +        in_allow=(over_allow | cross_allow), kw...
    +    )
    +    skip && return returnval
    +
    +    return _inner_line_curve_process(line, curve; over_allow, cross_allow, kw...)
    +end
    +
    +function _inner_line_curve_process(
    +    line, curve;
    +    over_allow, cross_allow, on_allow, out_allow,
    +    in_require, on_require, out_require,
    +    closed_line = false, closed_curve = false,
    +    exact,
    +)

    Set up requirements

    julia
        in_req_met = !in_require
    +    on_req_met = !on_require
    +    out_req_met = !out_require

    Determine curve endpoints

    julia
        nl = GI.npoint(line)
    +    nc = GI.npoint(curve)
    +    first_last_equal_line = equals(GI.getpoint(line, 1), GI.getpoint(line, nl))
    +    first_last_equal_curve = equals(GI.getpoint(curve, 1), GI.getpoint(curve, nc))
    +    nl -= first_last_equal_line ? 1 : 0
    +    nc -= first_last_equal_curve ? 1 : 0
    +    closed_line |= first_last_equal_line
    +    closed_curve |= first_last_equal_curve

    Loop over each line segment

    julia
        l_start = _tuple_point(GI.getpoint(line, closed_line ? nl : 1))
    +    i = closed_line ? 1 : 2
    +    while i  nl
    +        l_end = _tuple_point(GI.getpoint(line, i))
    +        c_start = _tuple_point(GI.getpoint(curve, closed_curve ? nc : 1))

    Loop over each curve segment

    julia
            for j in (closed_curve ? 1 : 2):nc
    +            c_end = _tuple_point(GI.getpoint(curve, j))

    Check if line and curve segments meet

    julia
                seg_val, intr1, _ = _intersection_point(Float64, (l_start, l_end), (c_start, c_end); exact)

    If segments are co-linear

    julia
                if seg_val == line_over
    +                !over_allow && return false

    at least one point in, meets requirements

    julia
                    in_req_met = true
    +                point_val = _point_segment_orientation(l_start, c_start, c_end)

    If entire segment isn't covered, consider remaining section

    julia
                    if point_val != point_out
    +                    i, l_start, break_off = _find_new_seg(i, l_start, l_end, c_start, c_end)
    +                    break_off && break
    +                end
    +            else
    +                if seg_val == line_cross
    +                    !cross_allow && return false
    +                    in_req_met = true
    +                elseif seg_val == line_hinge  # could cross or overlap

    Determine location of intersection point on each segment

    julia
                        (_, (α, β)) = intr1
    +                    if ( # Don't consider edges of curves as they can't cross
    +                        (!closed_line && ((α == 0 && i == 2) ||== 1 && i == nl))) ||
    +                        (!closed_curve && ((β == 0 && j == 2) ||== 1 && j == nc)))
    +                    )
    +                        !on_allow && return false
    +                        on_req_met = true
    +                    else
    +                        in_req_met = true

    If needed, determine if hinge actually crosses

    julia
                            if (!cross_allow || !over_allow) && α != 0 && β != 0

    Find next pieces of hinge to see if line and curve cross

    julia
                                l, c = _find_hinge_next_segments(
    +                                α, β, l_start, l_end, c_start, c_end,
    +                                i, line, j, curve,
    +                            )
    +                            next_val, _, _ = _intersection_point(Float64, l, c; exact)
    +                            if next_val == line_hinge
    +                                !cross_allow && return false
    +                            else
    +                                !over_allow && return false
    +                            end
    +                        end
    +                    end
    +                end

    no overlap for a give segment, some of segment must be out of curve

    julia
                    if j == nc
    +                    !out_allow && return false
    +                    out_req_met = true
    +                end
    +            end
    +            c_start = c_end  # consider next segment of curve
    +            if j == nc  # move on to next line segment
    +                i += 1
    +                l_start = l_end
    +            end
    +        end
    +    end
    +    return in_req_met && on_req_met && out_req_met
    +end
    +
    +#= If entire segment (le to ls) isn't covered by segment (cs to ce), find remaining section
    +part of section outside of cs to ce. If completely covered, increase segment index i. =#
    +function _find_new_seg(i, ls, le, cs, ce)
    +    break_off = true
    +    if _point_segment_orientation(le, cs, ce) != point_out
    +        ls = le
    +        i += 1
    +    elseif !equals(ls, cs) && _point_segment_orientation(cs, ls, le) != point_out
    +        ls = cs
    +    elseif !equals(ls, ce) && _point_segment_orientation(ce, ls, le) != point_out
    +        ls = ce
    +    else
    +        break_off = false
    +    end
    +    return i, ls, break_off
    +end
    +
    +#= Find next set of segments needed to determine if given hinge segments cross or not.=#
    +function _find_hinge_next_segments(α, β, ls, le, cs, ce, i, line, j, curve)
    +    next_seg = if β == 1
    +        if α == 1  # hinge at endpoints, so next segment of both is needed
    +            ((le, _tuple_point(GI.getpoint(line, i + 1))), (ce, _tuple_point(GI.getpoint(curve, j + 1))))
    +        else  # hinge at curve endpoint and line interior point, curve next segment needed
    +            ((ls, le), (ce, _tuple_point(GI.getpoint(curve, j + 1))))
    +        end
    +    else  # hinge at curve interior point and line endpoint, line next segment needed
    +        ((le, _tuple_point(GI.getpoint(line, i + 1))), (cs, ce))
    +    end
    +    return next_seg
    +end

    Determines if a line meets the given checks with respect to a polygon.

    If in_allow is true, segments of the line can be in the polygon interior. If on_allow is true, segments of the line can be on the polygon's boundary. If out_allow is true, segments of the line can be outside of the polygon.

    If in_require is true, the interiors of the line and polygon must meet in at least one point. If on_require is true, the line must have at least one point on the polygon'same boundary. If out_require is true, the line must have at least one point outside of the polygon.

    If the point is in an "allowed" location and meets all requirements, return true. Else, return false.

    If closed_line is true, line is treated as a closed line where the first and last point are connected by a segment.

    julia
    @inline function _line_polygon_process(line, polygon; kw...)
    +    skip, returnval = _maybe_skip_disjoint_extents(line, polygon; kw...)
    +    skip && return returnval
    +    return _inner_line_polygon_process(line, polygon; kw...)
    +end
    +
    +function _inner_line_polygon_process(
    +    line, polygon;
    +    in_allow, on_allow, out_allow,
    +    in_require, on_require, out_require,
    +    exact, closed_line = false,
    +)
    +    in_req_met = !in_require
    +    on_req_met = !on_require
    +    out_req_met = !out_require

    Check interaction of line with polygon's exterior boundary

    julia
        in_curve, on_curve, out_curve = _line_filled_curve_interactions(
    +        line, GI.getexterior(polygon);
    +        exact, closed_line = closed_line,
    +    )
    +    if on_curve
    +        !on_allow && return false
    +        on_req_met = true
    +    end
    +    if out_curve
    +        !out_allow && return false
    +        out_req_met = true
    +    end

    If no points within the polygon, the line is disjoint and we are done

    julia
        !in_curve && return in_req_met && on_req_met && out_req_met

    Loop over polygon holes

    julia
        for hole in GI.gethole(polygon)
    +        in_hole, on_hole, out_hole =_line_filled_curve_interactions(
    +            line, hole;
    +            exact, closed_line = closed_line,
    +        )
    +        if in_hole  # line in hole is equivalent to being out of polygon
    +            !out_allow && return false
    +            out_req_met = true
    +        end
    +        if on_hole  # hole boundary is polygon boundary
    +            !on_allow && return false
    +            on_req_met = true
    +        end
    +        if !out_hole  # entire line is in/on hole, can't be in/on other holes
    +            in_curve = false
    +            break
    +        end
    +    end
    +    if in_curve  # entirely of curve isn't within a hole
    +        !in_allow && return false
    +        in_req_met = true
    +    end
    +    return in_req_met && on_req_met && out_req_met
    +end

    Determines if a polygon meets the given checks with respect to a polygon.

    If in_allow is true, the polygon's interiors must intersect. If on_allow is true, the one of the polygon's boundaries must either interact with the other polygon's boundary or interior. If out_allow is true, the first polygon must have interior regions outside of the second polygon.

    If in_require is true, the polygon interiors must meet in at least one point. If on_require is true, one of the polygon's must have at least one boundary point in or on the other polygon. If out_require is true, the first polygon must have at least one interior point outside of the second polygon.

    If the point is in an "allowed" location and meets all requirements, return true. Else, return false.

    julia
    @inline function _polygon_polygon_process(poly1, poly2; kw...)
    +    skip, returnval = _maybe_skip_disjoint_extents(poly1, poly2; kw...)
    +    skip && return returnval
    +    return _inner_polygon_polygon_process(poly1, poly2; kw...)
    +end
    +
    +function _inner_polygon_polygon_process(
    +    poly1, poly2;
    +    in_allow, on_allow, out_allow,
    +    in_require, on_require, out_require,
    +    exact,
    +)
    +    in_req_met = !in_require
    +    on_req_met = !on_require
    +    out_req_met = !out_require

    Check if exterior of poly1 is within poly2

    julia
        ext1 = GI.getexterior(poly1)
    +    ext2 = GI.getexterior(poly2)

    Check if exterior of poly1 is in polygon 2

    julia
        e1_in_p2, e1_on_p2, e1_out_p2 = _line_polygon_interactions(
    +        ext1, poly2;
    +        exact, closed_line = true,
    +    )
    +    if e1_on_p2
    +        !on_allow && return false
    +        on_req_met = true
    +    end
    +    if e1_out_p2
    +        !out_allow && return false
    +        out_req_met = true
    +    end
    +
    +    if !e1_in_p2

    if exterior ring isn't in poly2, check if it surrounds poly2

    julia
            _, _, e2_out_e1 = _line_filled_curve_interactions(
    +            ext2, ext1;
    +            exact, closed_line = true,
    +        )  # if they really are disjoint, we are done
    +        e2_out_e1 && return in_req_met && on_req_met && out_req_met
    +    end

    If interiors interact, check if poly2 interacts with any of poly1's holes

    julia
        for h1 in GI.gethole(poly1)
    +        h1_in_p2, h1_on_p2, h1_out_p2 = _line_polygon_interactions(
    +            h1, poly2;
    +            exact, closed_line = true,
    +        )
    +        if h1_on_p2
    +            !on_allow && return false
    +            on_req_met = true
    +        end
    +        if h1_out_p2
    +            !out_allow && return false
    +            out_req_met = true
    +        end
    +        if !h1_in_p2

    If hole isn't in poly2, see if poly2 is in hole

    julia
                _, _, e2_out_h1 = _line_filled_curve_interactions(
    +                ext2, h1;
    +                exact, closed_line = true,
    +            )

    hole encompasses all of poly2

    julia
                !e2_out_h1 && return in_req_met && on_req_met && out_req_met
    +            break
    +        end
    +    end
    +    #=
    +    poly2 isn't outside of poly1 and isn't in a hole, poly1 interior must
    +    interact with poly2 interior
    +    =#
    +    !in_allow && return false
    +    in_req_met = true

    If any of poly2 holes are within poly1, part of poly1 is exterior to poly2

    julia
        for h2 in GI.gethole(poly2)
    +        h2_in_p1, h2_on_p1, _ = _line_polygon_interactions(
    +            h2, poly1;
    +            exact, closed_line = true,
    +        )
    +        if h2_on_p1
    +            !on_allow && return false
    +            on_req_met = true
    +        end
    +        if h2_in_p1
    +            !out_allow && return false
    +            out_req_met = true
    +        end
    +    end
    +    return in_req_met && on_req_met && out_req_met
    +end

    Determines if a point is in, on, or out of a segment. If the point is on the segment it is on one of the segments endpoints. If it is in, it is on any other point of the segment. If the point is not on any part of the segment, it is out of the segment.

    Point should be an object of point trait and curve should be an object with a linestring or linearring trait.

    Can provide values of in, on, and out keywords, which determines return values for each scenario.

    julia
    function _point_segment_orientation(
    +    point, start, stop;
    +    in::T = point_in, on::T = point_on, out::T = point_out,
    +) where {T}

    Parse out points

    julia
        x, y = GI.x(point), GI.y(point)
    +    x1, y1 = GI.x(start), GI.y(start)
    +    x2, y2 = GI.x(stop), GI.y(stop)
    +    Δx_seg = x2 - x1
    +    Δy_seg = y2 - y1
    +    Δx_pt = x - x1
    +    Δy_pt = y - y1
    +    if (Δx_pt == 0 && Δy_pt == 0) || (Δx_pt == Δx_seg && Δy_pt == Δy_seg)

    If point is equal to the segment start or end points

    julia
            return on
    +    else
    +        #=
    +        Determine if the point is on the segment -> see if vector from segment
    +        start to point is parallel to segment and if point is between the
    +        segment endpoints
    +        =#
    +        on_line = _isparallel(Δx_seg, Δy_seg, Δx_pt, Δy_pt)
    +        !on_line && return out
    +        between_endpoints =
    +            (x2 > x1 ? x1 <= x <= x2 : x2 <= x <= x1) &&
    +            (y2 > y1 ? y1 <= y <= y2 : y2 <= y <= y1)
    +        !between_endpoints && return out
    +    end
    +    return in
    +end

    Determine if point is in, on, or out of a closed curve, which includes the space enclosed by the closed curve.

    In means the point is within the closed curve (excluding edges and vertices). On means the point is on an edge or a vertex of the closed curve. Out means the point is outside of the closed curve.

    Point should be an object of point trait and curve should be an object with a linestring or linearring trait, that is assumed to be closed, regardless of repeated last point.

    Can provide values of in, on, and out keywords, which determines return values for each scenario.

    Note that this uses the Algorithm by Hao and Sun (2018): https://doi.org/10.3390/sym10100477 Paper separates orientation of point and edge into 26 cases. For each case, it is either a case where the point is on the edge (returns on), where a ray from the point (x, y) to infinity along the line y = y cut through the edge (k += 1), or the ray does not pass through the edge (do nothing and continue). If the ray passes through an odd number of edges, it is within the curve, else outside of of the curve if it didn't return 'on'. See paper for more information on cases denoted in comments.

    julia
    function _point_filled_curve_orientation(
    +    point, curve;
    +    in::T = point_in, on::T = point_on, out::T = point_out, exact,
    +) where {T}
    +    x, y = GI.x(point), GI.y(point)
    +    n = GI.npoint(curve)
    +    n -= equals(GI.getpoint(curve, 1), GI.getpoint(curve, n)) ? 1 : 0
    +    k = 0  # counter for ray crossings
    +    p_start = GI.getpoint(curve, n)
    +    for (i, p_end) in enumerate(GI.getpoint(curve))
    +        i > n && break
    +        v1 = GI.y(p_start) - y
    +        v2 = GI.y(p_end) - y
    +        if !((v1 < 0 && v2 < 0) || (v1 > 0 && v2 > 0)) # if not cases 11 or 26
    +            u1, u2 = GI.x(p_start) - x, GI.x(p_end) - x
    +            f = Predicates.cross((u1, u2), (v1, v2); exact)
    +            if v2 > 0 && v1  0                # Case 3, 9, 16, 21, 13, or 24
    +                f == 0 && return on         # Case 16 or 21
    +                f > 0 && (k += 1)              # Case 3 or 9
    +            elseif v1 > 0 && v2  0            # Case 4, 10, 19, 20, 12, or 25
    +                f == 0 && return on         # Case 19 or 20
    +                f < 0 && (k += 1)              # Case 4 or 10
    +            elseif v2 == 0 && v1 < 0           # Case 7, 14, or 17
    +                f == 0 && return on         # Case 17
    +            elseif v1 == 0 && v2 < 0           # Case 8, 15, or 18
    +                f == 0 && return on         # Case 18
    +            elseif v1 == 0 && v2 == 0          # Case 1, 2, 5, 6, 22, or 23
    +                u2  0 && u1  0 && return on  # Case 1
    +                u1  0 && u2  0 && return on  # Case 2
    +            end
    +        end
    +        p_start = p_end
    +    end
    +    return iseven(k) ? out : in
    +end

    Determines the types of interactions of a line with a filled-in curve. By filled-in curve, I am referring to the exterior ring of a poylgon, for example.

    Returns a tuple of booleans: (in_curve, on_curve, out_curve).

    If in_curve is true, some of the lines interior points interact with the curve's interior points. If on_curve is true, endpoints of either the line intersect with the curve or the line interacts with the polygon boundary. If out_curve is true, at least one segments of the line is outside the curve.

    If closed_line is true, line is treated as a closed line where the first and last point are connected by a segment.

    julia
    function _line_filled_curve_interactions(
    +    line, curve;
    +    exact, closed_line = false,
    +)
    +    in_curve = false
    +    on_curve = false
    +    out_curve = false

    Determine number of points in curve and line

    julia
        nl = GI.npoint(line)
    +    nc = GI.npoint(curve)
    +    first_last_equal_line = equals(GI.getpoint(line, 1), GI.getpoint(line, nl))
    +    first_last_equal_curve = equals(GI.getpoint(curve, 1), GI.getpoint(curve, nc))
    +    nl -= first_last_equal_line ? 1 : 0
    +    nc -= first_last_equal_curve ? 1 : 0
    +    closed_line |= first_last_equal_line

    See if first point is in an acceptable orientation

    julia
        l_start = _tuple_point(GI.getpoint(line, closed_line ? nl : 1))
    +    point_val = _point_filled_curve_orientation(l_start, curve; exact)
    +    if point_val == point_in
    +        in_curve = true
    +    elseif point_val == point_on
    +        on_curve = true
    +    else  # point_val == point_out
    +        out_curve = true
    +    end

    Check for any intersections between line and curve

    julia
        for i in (closed_line ? 1 : 2):nl
    +        l_end = _tuple_point(GI.getpoint(line, i))
    +        c_start = _tuple_point(GI.getpoint(curve, nc))

    If already interacted with all regions of curve, can stop

    julia
            in_curve && on_curve && out_curve && break

    Check next segment of line against curve

    julia
            for j in 1:nc
    +            c_end = _tuple_point(GI.getpoint(curve, j))

    Check if two line and curve segments meet

    julia
                seg_val, _, _ = _intersection_point(Float64, (l_start, l_end), (c_start, c_end); exact)
    +            if seg_val != line_out

    If line and curve meet, then at least one point is on boundary

    julia
                    on_curve = true
    +                if seg_val == line_cross

    When crossing boundary, line is both in and out of curve

    julia
                        in_curve = true
    +                    out_curve = true
    +                else
    +                    if seg_val == line_over
    +                        sp = _point_segment_orientation(l_start, c_start, c_end)
    +                        lp = _point_segment_orientation(l_end, c_start, c_end)
    +                        if sp != point_in || lp != point_in
    +                            #=
    +                            Line crosses over segment endpoint, creating a hinge
    +                            with another segment.
    +                            =#
    +                            seg_val = line_hinge
    +                        end
    +                    end
    +                    if seg_val == line_hinge
    +                        #=
    +                        Can't determine all types of interactions (in, out) with
    +                        hinge as it could pass through multiple other segments
    +                        so calculate if segment endpoints and intersections are
    +                        in/out of filled curve
    +                        =#
    +                        ipoints = intersection_points(GI.Line(StaticArrays.SVector(l_start, l_end)), curve)
    +                        npoints = length(ipoints)  # since hinge, at least one
    +                        dist_from_lstart = let l_start = l_start
    +                            x -> _euclid_distance(Float64, x, l_start)
    +                        end
    +                        sort!(ipoints, by = dist_from_lstart)
    +                        p_start = _tuple_point(l_start)
    +                        for i in 1:(npoints + 1)
    +                            p_end = i  npoints ? _tuple_point(ipoints[i]) : l_end
    +                            mid_val = _point_filled_curve_orientation((p_start .+ p_end) ./ 2, curve; exact)
    +                            if mid_val == point_in
    +                                in_curve = true
    +                            elseif mid_val == point_out
    +                                out_curve = true
    +                            end
    +                        end

    already checked segment against whole filled curve

    julia
                            l_start = l_end
    +                        break
    +                    end
    +                end
    +            end
    +            c_start = c_end
    +        end
    +        l_start = l_end
    +    end
    +    return in_curve, on_curve, out_curve
    +end

    Determines the types of interactions of a line with a polygon.

    Returns a tuple of booleans: (in_poly, on_poly, out_poly).

    If in_poly is true, some of the lines interior points interact with the polygon interior points. If in_poly is true, endpoints of either the line intersect with the polygon or the line interacts with the polygon boundary, including hole boundaries. If out_curve is true, at least one segments of the line is outside the polygon, including inside of holes.

    If closed_line is true, line is treated as a closed line where the first and last point are connected by a segment.

    julia
    function _line_polygon_interactions(
    +    line, polygon;
    +    exact, closed_line = false,
    +)
    +
    +    in_poly, on_poly, out_poly = _line_filled_curve_interactions(
    +        line, GI.getexterior(polygon);
    +        exact, closed_line = closed_line,
    +    )
    +    !in_poly && return (in_poly, on_poly, out_poly)

    Loop over polygon holes

    julia
        for hole in GI.gethole(polygon)
    +        in_hole, on_hole, out_hole =_line_filled_curve_interactions(
    +            line, hole;
    +            exact, closed_line = closed_line,
    +        )
    +        if in_hole
    +            out_poly = true
    +        end
    +        if on_hole
    +            on_poly = true
    +        end
    +        if !out_hole  # entire line is in/on hole, can't be in/on other holes
    +            in_poly = false
    +            return (in_poly, on_poly, out_poly)
    +        end
    +    end
    +    return in_poly, on_poly, out_poly
    +end

    Disjoint extent optimisation: skip work based on geom extent intersection returns Tuple{Bool, Bool} for (skip, returnval)

    julia
    @inline function _maybe_skip_disjoint_extents(a, b;
    +    in_allow, on_allow, out_allow,
    +    in_require, on_require, out_require,
    +    kw...
    +)
    +    ext_disjoint = Extents.disjoint(GI.extent(a), GI.extent(b))
    +    skip, returnval = if !ext_disjoint

    can't tell anything about this case

    julia
            false, false
    +    elseif out_allow # && ext_disjoint
    +        if in_require || on_require
    +            true, false
    +        else
    +            true, true
    +        end
    +    else  # !out_allow && ext_disjoint

    points not allowed in exterior, but geoms are disjoint

    julia
            true, false
    +    end
    +    return skip, returnval
    +end

    This page was generated using Literate.jl.

    `,142)]))}const y=i(l,[["render",t]]);export{g as __pageData,y as default}; diff --git a/previews/PR239/assets/source_methods_geom_relations_geom_geom_processors.md.CmpKdMyB.lean.js b/previews/PR239/assets/source_methods_geom_relations_geom_geom_processors.md.CmpKdMyB.lean.js new file mode 100644 index 000000000..869aea8c8 --- /dev/null +++ b/previews/PR239/assets/source_methods_geom_relations_geom_geom_processors.md.CmpKdMyB.lean.js @@ -0,0 +1,437 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"Line-curve interaction","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/geom_relations/geom_geom_processors.md","filePath":"source/methods/geom_relations/geom_geom_processors.md","lastUpdated":null}'),l={name:"source/methods/geom_relations/geom_geom_processors.md"};function t(p,s,k,e,r,E){return h(),a("div",null,s[0]||(s[0]=[n(`

    Line-curve interaction

    julia
    #= Code is based off of DE-9IM Standards (https://en.wikipedia.org/wiki/DE-9IM)
    +and attempts a standardized solution for most of the functions.
    +=#
    +
    +"""
    +    Enum PointOrientation
    +
    +Enum for the orientation of a point with respect to a curve. A point can be
    +\`point_in\` the curve, \`point_on\` the curve, or \`point_out\` of the curve.
    +"""
    +@enum PointOrientation point_in=1 point_on=2 point_out=3

    Determines if a point meets the given checks with respect to a curve.

    If in_allow is true, the point can be on the curve interior. If on_allow is true, the point can be on the curve boundary. If out_allow is true, the point can be disjoint from the curve.

    If the point is in an "allowed" location, return true. Else, return false.

    If closed_curve is true, curve is treated as a closed curve where the first and last point are connected by a segment.

    julia
    function _point_curve_process(
    +    point, curve;
    +    in_allow, on_allow, out_allow,
    +    closed_curve = false,
    +)

    Determine if curve is closed

    julia
        n = GI.npoint(curve)
    +    first_last_equal = equals(GI.getpoint(curve, 1), GI.getpoint(curve, n))
    +    closed_curve |= first_last_equal
    +    n -= first_last_equal ? 1 : 0

    Loop through all curve segments

    julia
        p_start = GI.getpoint(curve, closed_curve ? n : 1)
    +    @inbounds for i in (closed_curve ? 1 : 2):n
    +        p_end = GI.getpoint(curve, i)
    +        seg_val = _point_segment_orientation(point, p_start, p_end)
    +        seg_val == point_in && return in_allow
    +        if seg_val == point_on
    +            if !closed_curve  # if point is on curve endpoints, it is "on"
    +                i == 2 && equals(point, p_start) && return on_allow
    +                i == n && equals(point, p_end) && return on_allow
    +            end
    +            return in_allow
    +        end
    +        p_start = p_end
    +    end
    +    return out_allow
    +end

    Determines if a point meets the given checks with respect to a polygon.

    If in_allow is true, the point can be within the polygon interior If on_allow is true, the point can be on the polygon boundary. If out_allow is true, the point can be disjoint from the polygon.

    If the point is in an "allowed" location, return true. Else, return false.

    julia
    function _point_polygon_process(
    +    point, polygon;
    +    in_allow, on_allow, out_allow, exact,
    +)

    Check interaction of geom with polygon's exterior boundary

    julia
        ext_val = _point_filled_curve_orientation(point, GI.getexterior(polygon); exact)

    If a point is outside, it isn't interacting with any holes

    julia
        ext_val == point_out && return out_allow

    if a point is on an external boundary, it isn't interacting with any holes

    julia
        ext_val == point_on && return on_allow

    If geom is within the polygon, need to check interactions with holes

    julia
        for hole in GI.gethole(polygon)
    +        hole_val = _point_filled_curve_orientation(point, hole; exact)

    If a point in in a hole, it is outside of the polygon

    julia
            hole_val == point_in && return out_allow

    If a point in on a hole edge, it is on the edge of the polygon

    julia
            hole_val == point_on && return on_allow
    +    end

    Point is within external boundary and on in/on any holes

    julia
        return in_allow
    +end

    Determines if a line meets the given checks with respect to a curve.

    If over_allow is true, segments of the line and curve can be co-linear. If cross_allow is true, segments of the line and curve can cross. If on_allow is true, endpoints of either the line or curve can intersect a segment of the other geometry. If cross_allow is true, segments of the line and curve can be disjoint.

    If in_require is true, the interiors of the line and curve must meet in at least one point. If on_require is true, the boundary of one of the two geometries can meet the interior or boundary of the other geometry in at least one point. If out_require is true, there must be at least one point of the given line that is exterior of the curve.

    If the point is in an "allowed" location and meets all requirements, return true. Else, return false.

    If closed_line is true, line is treated as a closed line where the first and last point are connected by a segment. Same with closed_curve.

    julia
    @inline function _line_curve_process(line, curve;
    +    over_allow, cross_allow, kw...
    +)
    +    skip, returnval = _maybe_skip_disjoint_extents(line, curve;
    +        in_allow=(over_allow | cross_allow), kw...
    +    )
    +    skip && return returnval
    +
    +    return _inner_line_curve_process(line, curve; over_allow, cross_allow, kw...)
    +end
    +
    +function _inner_line_curve_process(
    +    line, curve;
    +    over_allow, cross_allow, on_allow, out_allow,
    +    in_require, on_require, out_require,
    +    closed_line = false, closed_curve = false,
    +    exact,
    +)

    Set up requirements

    julia
        in_req_met = !in_require
    +    on_req_met = !on_require
    +    out_req_met = !out_require

    Determine curve endpoints

    julia
        nl = GI.npoint(line)
    +    nc = GI.npoint(curve)
    +    first_last_equal_line = equals(GI.getpoint(line, 1), GI.getpoint(line, nl))
    +    first_last_equal_curve = equals(GI.getpoint(curve, 1), GI.getpoint(curve, nc))
    +    nl -= first_last_equal_line ? 1 : 0
    +    nc -= first_last_equal_curve ? 1 : 0
    +    closed_line |= first_last_equal_line
    +    closed_curve |= first_last_equal_curve

    Loop over each line segment

    julia
        l_start = _tuple_point(GI.getpoint(line, closed_line ? nl : 1))
    +    i = closed_line ? 1 : 2
    +    while i  nl
    +        l_end = _tuple_point(GI.getpoint(line, i))
    +        c_start = _tuple_point(GI.getpoint(curve, closed_curve ? nc : 1))

    Loop over each curve segment

    julia
            for j in (closed_curve ? 1 : 2):nc
    +            c_end = _tuple_point(GI.getpoint(curve, j))

    Check if line and curve segments meet

    julia
                seg_val, intr1, _ = _intersection_point(Float64, (l_start, l_end), (c_start, c_end); exact)

    If segments are co-linear

    julia
                if seg_val == line_over
    +                !over_allow && return false

    at least one point in, meets requirements

    julia
                    in_req_met = true
    +                point_val = _point_segment_orientation(l_start, c_start, c_end)

    If entire segment isn't covered, consider remaining section

    julia
                    if point_val != point_out
    +                    i, l_start, break_off = _find_new_seg(i, l_start, l_end, c_start, c_end)
    +                    break_off && break
    +                end
    +            else
    +                if seg_val == line_cross
    +                    !cross_allow && return false
    +                    in_req_met = true
    +                elseif seg_val == line_hinge  # could cross or overlap

    Determine location of intersection point on each segment

    julia
                        (_, (α, β)) = intr1
    +                    if ( # Don't consider edges of curves as they can't cross
    +                        (!closed_line && ((α == 0 && i == 2) ||== 1 && i == nl))) ||
    +                        (!closed_curve && ((β == 0 && j == 2) ||== 1 && j == nc)))
    +                    )
    +                        !on_allow && return false
    +                        on_req_met = true
    +                    else
    +                        in_req_met = true

    If needed, determine if hinge actually crosses

    julia
                            if (!cross_allow || !over_allow) && α != 0 && β != 0

    Find next pieces of hinge to see if line and curve cross

    julia
                                l, c = _find_hinge_next_segments(
    +                                α, β, l_start, l_end, c_start, c_end,
    +                                i, line, j, curve,
    +                            )
    +                            next_val, _, _ = _intersection_point(Float64, l, c; exact)
    +                            if next_val == line_hinge
    +                                !cross_allow && return false
    +                            else
    +                                !over_allow && return false
    +                            end
    +                        end
    +                    end
    +                end

    no overlap for a give segment, some of segment must be out of curve

    julia
                    if j == nc
    +                    !out_allow && return false
    +                    out_req_met = true
    +                end
    +            end
    +            c_start = c_end  # consider next segment of curve
    +            if j == nc  # move on to next line segment
    +                i += 1
    +                l_start = l_end
    +            end
    +        end
    +    end
    +    return in_req_met && on_req_met && out_req_met
    +end
    +
    +#= If entire segment (le to ls) isn't covered by segment (cs to ce), find remaining section
    +part of section outside of cs to ce. If completely covered, increase segment index i. =#
    +function _find_new_seg(i, ls, le, cs, ce)
    +    break_off = true
    +    if _point_segment_orientation(le, cs, ce) != point_out
    +        ls = le
    +        i += 1
    +    elseif !equals(ls, cs) && _point_segment_orientation(cs, ls, le) != point_out
    +        ls = cs
    +    elseif !equals(ls, ce) && _point_segment_orientation(ce, ls, le) != point_out
    +        ls = ce
    +    else
    +        break_off = false
    +    end
    +    return i, ls, break_off
    +end
    +
    +#= Find next set of segments needed to determine if given hinge segments cross or not.=#
    +function _find_hinge_next_segments(α, β, ls, le, cs, ce, i, line, j, curve)
    +    next_seg = if β == 1
    +        if α == 1  # hinge at endpoints, so next segment of both is needed
    +            ((le, _tuple_point(GI.getpoint(line, i + 1))), (ce, _tuple_point(GI.getpoint(curve, j + 1))))
    +        else  # hinge at curve endpoint and line interior point, curve next segment needed
    +            ((ls, le), (ce, _tuple_point(GI.getpoint(curve, j + 1))))
    +        end
    +    else  # hinge at curve interior point and line endpoint, line next segment needed
    +        ((le, _tuple_point(GI.getpoint(line, i + 1))), (cs, ce))
    +    end
    +    return next_seg
    +end

    Determines if a line meets the given checks with respect to a polygon.

    If in_allow is true, segments of the line can be in the polygon interior. If on_allow is true, segments of the line can be on the polygon's boundary. If out_allow is true, segments of the line can be outside of the polygon.

    If in_require is true, the interiors of the line and polygon must meet in at least one point. If on_require is true, the line must have at least one point on the polygon'same boundary. If out_require is true, the line must have at least one point outside of the polygon.

    If the point is in an "allowed" location and meets all requirements, return true. Else, return false.

    If closed_line is true, line is treated as a closed line where the first and last point are connected by a segment.

    julia
    @inline function _line_polygon_process(line, polygon; kw...)
    +    skip, returnval = _maybe_skip_disjoint_extents(line, polygon; kw...)
    +    skip && return returnval
    +    return _inner_line_polygon_process(line, polygon; kw...)
    +end
    +
    +function _inner_line_polygon_process(
    +    line, polygon;
    +    in_allow, on_allow, out_allow,
    +    in_require, on_require, out_require,
    +    exact, closed_line = false,
    +)
    +    in_req_met = !in_require
    +    on_req_met = !on_require
    +    out_req_met = !out_require

    Check interaction of line with polygon's exterior boundary

    julia
        in_curve, on_curve, out_curve = _line_filled_curve_interactions(
    +        line, GI.getexterior(polygon);
    +        exact, closed_line = closed_line,
    +    )
    +    if on_curve
    +        !on_allow && return false
    +        on_req_met = true
    +    end
    +    if out_curve
    +        !out_allow && return false
    +        out_req_met = true
    +    end

    If no points within the polygon, the line is disjoint and we are done

    julia
        !in_curve && return in_req_met && on_req_met && out_req_met

    Loop over polygon holes

    julia
        for hole in GI.gethole(polygon)
    +        in_hole, on_hole, out_hole =_line_filled_curve_interactions(
    +            line, hole;
    +            exact, closed_line = closed_line,
    +        )
    +        if in_hole  # line in hole is equivalent to being out of polygon
    +            !out_allow && return false
    +            out_req_met = true
    +        end
    +        if on_hole  # hole boundary is polygon boundary
    +            !on_allow && return false
    +            on_req_met = true
    +        end
    +        if !out_hole  # entire line is in/on hole, can't be in/on other holes
    +            in_curve = false
    +            break
    +        end
    +    end
    +    if in_curve  # entirely of curve isn't within a hole
    +        !in_allow && return false
    +        in_req_met = true
    +    end
    +    return in_req_met && on_req_met && out_req_met
    +end

    Determines if a polygon meets the given checks with respect to a polygon.

    If in_allow is true, the polygon's interiors must intersect. If on_allow is true, the one of the polygon's boundaries must either interact with the other polygon's boundary or interior. If out_allow is true, the first polygon must have interior regions outside of the second polygon.

    If in_require is true, the polygon interiors must meet in at least one point. If on_require is true, one of the polygon's must have at least one boundary point in or on the other polygon. If out_require is true, the first polygon must have at least one interior point outside of the second polygon.

    If the point is in an "allowed" location and meets all requirements, return true. Else, return false.

    julia
    @inline function _polygon_polygon_process(poly1, poly2; kw...)
    +    skip, returnval = _maybe_skip_disjoint_extents(poly1, poly2; kw...)
    +    skip && return returnval
    +    return _inner_polygon_polygon_process(poly1, poly2; kw...)
    +end
    +
    +function _inner_polygon_polygon_process(
    +    poly1, poly2;
    +    in_allow, on_allow, out_allow,
    +    in_require, on_require, out_require,
    +    exact,
    +)
    +    in_req_met = !in_require
    +    on_req_met = !on_require
    +    out_req_met = !out_require

    Check if exterior of poly1 is within poly2

    julia
        ext1 = GI.getexterior(poly1)
    +    ext2 = GI.getexterior(poly2)

    Check if exterior of poly1 is in polygon 2

    julia
        e1_in_p2, e1_on_p2, e1_out_p2 = _line_polygon_interactions(
    +        ext1, poly2;
    +        exact, closed_line = true,
    +    )
    +    if e1_on_p2
    +        !on_allow && return false
    +        on_req_met = true
    +    end
    +    if e1_out_p2
    +        !out_allow && return false
    +        out_req_met = true
    +    end
    +
    +    if !e1_in_p2

    if exterior ring isn't in poly2, check if it surrounds poly2

    julia
            _, _, e2_out_e1 = _line_filled_curve_interactions(
    +            ext2, ext1;
    +            exact, closed_line = true,
    +        )  # if they really are disjoint, we are done
    +        e2_out_e1 && return in_req_met && on_req_met && out_req_met
    +    end

    If interiors interact, check if poly2 interacts with any of poly1's holes

    julia
        for h1 in GI.gethole(poly1)
    +        h1_in_p2, h1_on_p2, h1_out_p2 = _line_polygon_interactions(
    +            h1, poly2;
    +            exact, closed_line = true,
    +        )
    +        if h1_on_p2
    +            !on_allow && return false
    +            on_req_met = true
    +        end
    +        if h1_out_p2
    +            !out_allow && return false
    +            out_req_met = true
    +        end
    +        if !h1_in_p2

    If hole isn't in poly2, see if poly2 is in hole

    julia
                _, _, e2_out_h1 = _line_filled_curve_interactions(
    +                ext2, h1;
    +                exact, closed_line = true,
    +            )

    hole encompasses all of poly2

    julia
                !e2_out_h1 && return in_req_met && on_req_met && out_req_met
    +            break
    +        end
    +    end
    +    #=
    +    poly2 isn't outside of poly1 and isn't in a hole, poly1 interior must
    +    interact with poly2 interior
    +    =#
    +    !in_allow && return false
    +    in_req_met = true

    If any of poly2 holes are within poly1, part of poly1 is exterior to poly2

    julia
        for h2 in GI.gethole(poly2)
    +        h2_in_p1, h2_on_p1, _ = _line_polygon_interactions(
    +            h2, poly1;
    +            exact, closed_line = true,
    +        )
    +        if h2_on_p1
    +            !on_allow && return false
    +            on_req_met = true
    +        end
    +        if h2_in_p1
    +            !out_allow && return false
    +            out_req_met = true
    +        end
    +    end
    +    return in_req_met && on_req_met && out_req_met
    +end

    Determines if a point is in, on, or out of a segment. If the point is on the segment it is on one of the segments endpoints. If it is in, it is on any other point of the segment. If the point is not on any part of the segment, it is out of the segment.

    Point should be an object of point trait and curve should be an object with a linestring or linearring trait.

    Can provide values of in, on, and out keywords, which determines return values for each scenario.

    julia
    function _point_segment_orientation(
    +    point, start, stop;
    +    in::T = point_in, on::T = point_on, out::T = point_out,
    +) where {T}

    Parse out points

    julia
        x, y = GI.x(point), GI.y(point)
    +    x1, y1 = GI.x(start), GI.y(start)
    +    x2, y2 = GI.x(stop), GI.y(stop)
    +    Δx_seg = x2 - x1
    +    Δy_seg = y2 - y1
    +    Δx_pt = x - x1
    +    Δy_pt = y - y1
    +    if (Δx_pt == 0 && Δy_pt == 0) || (Δx_pt == Δx_seg && Δy_pt == Δy_seg)

    If point is equal to the segment start or end points

    julia
            return on
    +    else
    +        #=
    +        Determine if the point is on the segment -> see if vector from segment
    +        start to point is parallel to segment and if point is between the
    +        segment endpoints
    +        =#
    +        on_line = _isparallel(Δx_seg, Δy_seg, Δx_pt, Δy_pt)
    +        !on_line && return out
    +        between_endpoints =
    +            (x2 > x1 ? x1 <= x <= x2 : x2 <= x <= x1) &&
    +            (y2 > y1 ? y1 <= y <= y2 : y2 <= y <= y1)
    +        !between_endpoints && return out
    +    end
    +    return in
    +end

    Determine if point is in, on, or out of a closed curve, which includes the space enclosed by the closed curve.

    In means the point is within the closed curve (excluding edges and vertices). On means the point is on an edge or a vertex of the closed curve. Out means the point is outside of the closed curve.

    Point should be an object of point trait and curve should be an object with a linestring or linearring trait, that is assumed to be closed, regardless of repeated last point.

    Can provide values of in, on, and out keywords, which determines return values for each scenario.

    Note that this uses the Algorithm by Hao and Sun (2018): https://doi.org/10.3390/sym10100477 Paper separates orientation of point and edge into 26 cases. For each case, it is either a case where the point is on the edge (returns on), where a ray from the point (x, y) to infinity along the line y = y cut through the edge (k += 1), or the ray does not pass through the edge (do nothing and continue). If the ray passes through an odd number of edges, it is within the curve, else outside of of the curve if it didn't return 'on'. See paper for more information on cases denoted in comments.

    julia
    function _point_filled_curve_orientation(
    +    point, curve;
    +    in::T = point_in, on::T = point_on, out::T = point_out, exact,
    +) where {T}
    +    x, y = GI.x(point), GI.y(point)
    +    n = GI.npoint(curve)
    +    n -= equals(GI.getpoint(curve, 1), GI.getpoint(curve, n)) ? 1 : 0
    +    k = 0  # counter for ray crossings
    +    p_start = GI.getpoint(curve, n)
    +    for (i, p_end) in enumerate(GI.getpoint(curve))
    +        i > n && break
    +        v1 = GI.y(p_start) - y
    +        v2 = GI.y(p_end) - y
    +        if !((v1 < 0 && v2 < 0) || (v1 > 0 && v2 > 0)) # if not cases 11 or 26
    +            u1, u2 = GI.x(p_start) - x, GI.x(p_end) - x
    +            f = Predicates.cross((u1, u2), (v1, v2); exact)
    +            if v2 > 0 && v1  0                # Case 3, 9, 16, 21, 13, or 24
    +                f == 0 && return on         # Case 16 or 21
    +                f > 0 && (k += 1)              # Case 3 or 9
    +            elseif v1 > 0 && v2  0            # Case 4, 10, 19, 20, 12, or 25
    +                f == 0 && return on         # Case 19 or 20
    +                f < 0 && (k += 1)              # Case 4 or 10
    +            elseif v2 == 0 && v1 < 0           # Case 7, 14, or 17
    +                f == 0 && return on         # Case 17
    +            elseif v1 == 0 && v2 < 0           # Case 8, 15, or 18
    +                f == 0 && return on         # Case 18
    +            elseif v1 == 0 && v2 == 0          # Case 1, 2, 5, 6, 22, or 23
    +                u2  0 && u1  0 && return on  # Case 1
    +                u1  0 && u2  0 && return on  # Case 2
    +            end
    +        end
    +        p_start = p_end
    +    end
    +    return iseven(k) ? out : in
    +end

    Determines the types of interactions of a line with a filled-in curve. By filled-in curve, I am referring to the exterior ring of a poylgon, for example.

    Returns a tuple of booleans: (in_curve, on_curve, out_curve).

    If in_curve is true, some of the lines interior points interact with the curve's interior points. If on_curve is true, endpoints of either the line intersect with the curve or the line interacts with the polygon boundary. If out_curve is true, at least one segments of the line is outside the curve.

    If closed_line is true, line is treated as a closed line where the first and last point are connected by a segment.

    julia
    function _line_filled_curve_interactions(
    +    line, curve;
    +    exact, closed_line = false,
    +)
    +    in_curve = false
    +    on_curve = false
    +    out_curve = false

    Determine number of points in curve and line

    julia
        nl = GI.npoint(line)
    +    nc = GI.npoint(curve)
    +    first_last_equal_line = equals(GI.getpoint(line, 1), GI.getpoint(line, nl))
    +    first_last_equal_curve = equals(GI.getpoint(curve, 1), GI.getpoint(curve, nc))
    +    nl -= first_last_equal_line ? 1 : 0
    +    nc -= first_last_equal_curve ? 1 : 0
    +    closed_line |= first_last_equal_line

    See if first point is in an acceptable orientation

    julia
        l_start = _tuple_point(GI.getpoint(line, closed_line ? nl : 1))
    +    point_val = _point_filled_curve_orientation(l_start, curve; exact)
    +    if point_val == point_in
    +        in_curve = true
    +    elseif point_val == point_on
    +        on_curve = true
    +    else  # point_val == point_out
    +        out_curve = true
    +    end

    Check for any intersections between line and curve

    julia
        for i in (closed_line ? 1 : 2):nl
    +        l_end = _tuple_point(GI.getpoint(line, i))
    +        c_start = _tuple_point(GI.getpoint(curve, nc))

    If already interacted with all regions of curve, can stop

    julia
            in_curve && on_curve && out_curve && break

    Check next segment of line against curve

    julia
            for j in 1:nc
    +            c_end = _tuple_point(GI.getpoint(curve, j))

    Check if two line and curve segments meet

    julia
                seg_val, _, _ = _intersection_point(Float64, (l_start, l_end), (c_start, c_end); exact)
    +            if seg_val != line_out

    If line and curve meet, then at least one point is on boundary

    julia
                    on_curve = true
    +                if seg_val == line_cross

    When crossing boundary, line is both in and out of curve

    julia
                        in_curve = true
    +                    out_curve = true
    +                else
    +                    if seg_val == line_over
    +                        sp = _point_segment_orientation(l_start, c_start, c_end)
    +                        lp = _point_segment_orientation(l_end, c_start, c_end)
    +                        if sp != point_in || lp != point_in
    +                            #=
    +                            Line crosses over segment endpoint, creating a hinge
    +                            with another segment.
    +                            =#
    +                            seg_val = line_hinge
    +                        end
    +                    end
    +                    if seg_val == line_hinge
    +                        #=
    +                        Can't determine all types of interactions (in, out) with
    +                        hinge as it could pass through multiple other segments
    +                        so calculate if segment endpoints and intersections are
    +                        in/out of filled curve
    +                        =#
    +                        ipoints = intersection_points(GI.Line(StaticArrays.SVector(l_start, l_end)), curve)
    +                        npoints = length(ipoints)  # since hinge, at least one
    +                        dist_from_lstart = let l_start = l_start
    +                            x -> _euclid_distance(Float64, x, l_start)
    +                        end
    +                        sort!(ipoints, by = dist_from_lstart)
    +                        p_start = _tuple_point(l_start)
    +                        for i in 1:(npoints + 1)
    +                            p_end = i  npoints ? _tuple_point(ipoints[i]) : l_end
    +                            mid_val = _point_filled_curve_orientation((p_start .+ p_end) ./ 2, curve; exact)
    +                            if mid_val == point_in
    +                                in_curve = true
    +                            elseif mid_val == point_out
    +                                out_curve = true
    +                            end
    +                        end

    already checked segment against whole filled curve

    julia
                            l_start = l_end
    +                        break
    +                    end
    +                end
    +            end
    +            c_start = c_end
    +        end
    +        l_start = l_end
    +    end
    +    return in_curve, on_curve, out_curve
    +end

    Determines the types of interactions of a line with a polygon.

    Returns a tuple of booleans: (in_poly, on_poly, out_poly).

    If in_poly is true, some of the lines interior points interact with the polygon interior points. If in_poly is true, endpoints of either the line intersect with the polygon or the line interacts with the polygon boundary, including hole boundaries. If out_curve is true, at least one segments of the line is outside the polygon, including inside of holes.

    If closed_line is true, line is treated as a closed line where the first and last point are connected by a segment.

    julia
    function _line_polygon_interactions(
    +    line, polygon;
    +    exact, closed_line = false,
    +)
    +
    +    in_poly, on_poly, out_poly = _line_filled_curve_interactions(
    +        line, GI.getexterior(polygon);
    +        exact, closed_line = closed_line,
    +    )
    +    !in_poly && return (in_poly, on_poly, out_poly)

    Loop over polygon holes

    julia
        for hole in GI.gethole(polygon)
    +        in_hole, on_hole, out_hole =_line_filled_curve_interactions(
    +            line, hole;
    +            exact, closed_line = closed_line,
    +        )
    +        if in_hole
    +            out_poly = true
    +        end
    +        if on_hole
    +            on_poly = true
    +        end
    +        if !out_hole  # entire line is in/on hole, can't be in/on other holes
    +            in_poly = false
    +            return (in_poly, on_poly, out_poly)
    +        end
    +    end
    +    return in_poly, on_poly, out_poly
    +end

    Disjoint extent optimisation: skip work based on geom extent intersection returns Tuple{Bool, Bool} for (skip, returnval)

    julia
    @inline function _maybe_skip_disjoint_extents(a, b;
    +    in_allow, on_allow, out_allow,
    +    in_require, on_require, out_require,
    +    kw...
    +)
    +    ext_disjoint = Extents.disjoint(GI.extent(a), GI.extent(b))
    +    skip, returnval = if !ext_disjoint

    can't tell anything about this case

    julia
            false, false
    +    elseif out_allow # && ext_disjoint
    +        if in_require || on_require
    +            true, false
    +        else
    +            true, true
    +        end
    +    else  # !out_allow && ext_disjoint

    points not allowed in exterior, but geoms are disjoint

    julia
            true, false
    +    end
    +    return skip, returnval
    +end

    This page was generated using Literate.jl.

    `,142)]))}const y=i(l,[["render",t]]);export{g as __pageData,y as default}; diff --git a/previews/PR239/assets/source_methods_geom_relations_intersects.md.Z6dLYNxj.js b/previews/PR239/assets/source_methods_geom_relations_intersects.md.Z6dLYNxj.js new file mode 100644 index 000000000..d2d54239e --- /dev/null +++ b/previews/PR239/assets/source_methods_geom_relations_intersects.md.Z6dLYNxj.js @@ -0,0 +1,27 @@ +import{_ as i,c as a,a5 as e,o as n}from"./chunks/framework.onQNwZ2I.js";const t="/GeometryOps.jl/previews/PR239/assets/sqwzzcg.DeeQUply.png",g=JSON.parse('{"title":"Intersection checks","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/geom_relations/intersects.md","filePath":"source/methods/geom_relations/intersects.md","lastUpdated":null}'),p={name:"source/methods/geom_relations/intersects.md"};function l(h,s,k,r,o,d){return n(),a("div",null,s[0]||(s[0]=[e(`

    Intersection checks

    julia
    export intersects

    What is intersects?

    The intersects function checks if a given geometry intersects with another geometry, or in other words, the either the interiors or boundaries of the two geometries intersect.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)])
    +line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)])
    +f, a, p = lines(GI.getpoint(line1))
    +lines!(GI.getpoint(line2))
    +f

    We can see that they intersect, so we expect intersects to return true, and we can visualize the intersection point in red.

    julia
    GO.intersects(line1, line2)  # true
    true

    Implementation

    This is the GeoInterface-compatible implementation.

    Given that intersects is the exact opposite of disjoint, we simply pass the two inputs variables, swapped in order, to disjoint.

    julia
    """
    +    intersects(geom1, geom2)::Bool
    +
    +Return true if the interiors or boundaries of the two geometries interact.
    +
    +\`intersects\` returns the exact opposite result of \`disjoint\`.
    +
    +# Example
    +
    +\`\`\`jldoctest
    +import GeoInterface as GI, GeometryOps as GO
    +
    +line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)])
    +line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)])
    +GO.intersects(line1, line2)

    output

    julia
    true
    +\`\`\`
    +"""
    +intersects(geom1, geom2) = !disjoint(geom1, geom2)

    This page was generated using Literate.jl.

    `,18)]))}const E=i(p,[["render",l]]);export{g as __pageData,E as default}; diff --git a/previews/PR239/assets/source_methods_geom_relations_intersects.md.Z6dLYNxj.lean.js b/previews/PR239/assets/source_methods_geom_relations_intersects.md.Z6dLYNxj.lean.js new file mode 100644 index 000000000..d2d54239e --- /dev/null +++ b/previews/PR239/assets/source_methods_geom_relations_intersects.md.Z6dLYNxj.lean.js @@ -0,0 +1,27 @@ +import{_ as i,c as a,a5 as e,o as n}from"./chunks/framework.onQNwZ2I.js";const t="/GeometryOps.jl/previews/PR239/assets/sqwzzcg.DeeQUply.png",g=JSON.parse('{"title":"Intersection checks","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/geom_relations/intersects.md","filePath":"source/methods/geom_relations/intersects.md","lastUpdated":null}'),p={name:"source/methods/geom_relations/intersects.md"};function l(h,s,k,r,o,d){return n(),a("div",null,s[0]||(s[0]=[e(`

    Intersection checks

    julia
    export intersects

    What is intersects?

    The intersects function checks if a given geometry intersects with another geometry, or in other words, the either the interiors or boundaries of the two geometries intersect.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)])
    +line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)])
    +f, a, p = lines(GI.getpoint(line1))
    +lines!(GI.getpoint(line2))
    +f

    We can see that they intersect, so we expect intersects to return true, and we can visualize the intersection point in red.

    julia
    GO.intersects(line1, line2)  # true
    true

    Implementation

    This is the GeoInterface-compatible implementation.

    Given that intersects is the exact opposite of disjoint, we simply pass the two inputs variables, swapped in order, to disjoint.

    julia
    """
    +    intersects(geom1, geom2)::Bool
    +
    +Return true if the interiors or boundaries of the two geometries interact.
    +
    +\`intersects\` returns the exact opposite result of \`disjoint\`.
    +
    +# Example
    +
    +\`\`\`jldoctest
    +import GeoInterface as GI, GeometryOps as GO
    +
    +line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)])
    +line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)])
    +GO.intersects(line1, line2)

    output

    julia
    true
    +\`\`\`
    +"""
    +intersects(geom1, geom2) = !disjoint(geom1, geom2)

    This page was generated using Literate.jl.

    `,18)]))}const E=i(p,[["render",l]]);export{g as __pageData,E as default}; diff --git a/previews/PR239/assets/source_methods_geom_relations_overlaps.md.BjDDEk4_.js b/previews/PR239/assets/source_methods_geom_relations_overlaps.md.BjDDEk4_.js new file mode 100644 index 000000000..186cb7e1e --- /dev/null +++ b/previews/PR239/assets/source_methods_geom_relations_overlaps.md.BjDDEk4_.js @@ -0,0 +1,212 @@ +import{_ as i,c as a,a5 as n,o as l}from"./chunks/framework.onQNwZ2I.js";const p="/GeometryOps.jl/previews/PR239/assets/hvyhqaw.CgiryX2p.png",o=JSON.parse('{"title":"Overlaps","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/geom_relations/overlaps.md","filePath":"source/methods/geom_relations/overlaps.md","lastUpdated":null}'),t={name:"source/methods/geom_relations/overlaps.md"};function e(h,s,k,r,d,g){return l(),a("div",null,s[0]||(s[0]=[n(`

    Overlaps

    julia
    export overlaps

    What is overlaps?

    The overlaps function checks if two geometries overlap. Two geometries can only overlap if they have the same dimension, and if they overlap, but one is not contained, within, or equal to the other.

    Note that this means it is impossible for a single point to overlap with a single point and a line only overlaps with another line if only a section of each line is collinear.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +l1 = GI.LineString([(0.0, 0.0), (0.0, 10.0)])
    +l2 = GI.LineString([(0.0, -10.0), (0.0, 3.0)])
    +f, a, p = lines(GI.getpoint(l1), color = :blue)
    +scatter!(GI.getpoint(l1), color = :blue)
    +lines!(GI.getpoint(l2), color = :orange)
    +scatter!(GI.getpoint(l2), color = :orange)
    +f

    We can see that the two lines overlap in the plot:

    julia
    GO.overlaps(l1, l2)  # true
    true

    Implementation

    This is the GeoInterface-compatible implementation.

    First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait. This is also used in the implementation, since it's a lot less work!

    Note that that since only elements of the same dimension can overlap, any two geometries with traits that are of different dimensions automatically can return false.

    For geometries with the same trait dimension, we must make sure that they share a point, an edge, or area for points, lines, and polygons/multipolygons respectively, without being contained.

    julia
    """
    +    overlaps(geom1, geom2)::Bool
    +
    +Compare two Geometries of the same dimension and return true if their
    +intersection set results in a geometry different from both but of the same
    +dimension. This means one geometry cannot be within or contain the other and
    +they cannot be equal
    +
    +# Examples
    +\`\`\`jldoctest
    +import GeometryOps as GO, GeoInterface as GI
    +poly1 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
    +poly2 = GI.Polygon([[(1,1), (1,6), (6,6), (6,1), (1,1)]])
    +
    +GO.overlaps(poly1, poly2)

    output

    julia
    true
    +\`\`\`
    +"""
    +overlaps(geom1, geom2)::Bool = overlaps(
    +    GI.trait(geom1),
    +    geom1,
    +    GI.trait(geom2),
    +    geom2,
    +)
    +
    +"""
    +    overlaps(::GI.AbstractTrait, geom1, ::GI.AbstractTrait, geom2)::Bool
    +
    +For any non-specified pair, all have non-matching dimensions, return false.
    +"""
    +overlaps(::GI.AbstractTrait, geom1, ::GI.AbstractTrait, geom2) = false
    +
    +"""
    +    overlaps(
    +        ::GI.MultiPointTrait, points1,
    +        ::GI.MultiPointTrait, points2,
    +    )::Bool
    +
    +If the multipoints overlap, meaning some, but not all, of the points within the
    +multipoints are shared, return true.
    +"""
    +function overlaps(
    +    ::GI.MultiPointTrait, points1,
    +    ::GI.MultiPointTrait, points2,
    +)
    +    one_diff = false  # assume that all the points are the same
    +    one_same = false  # assume that all points are different
    +    for p1 in GI.getpoint(points1)
    +        match_point = false
    +        for p2 in GI.getpoint(points2)
    +            if equals(p1, p2)  # Point is shared
    +                one_same = true
    +                match_point = true
    +                break
    +            end
    +        end
    +        one_diff |= !match_point  # Point isn't shared
    +        one_same && one_diff && return true
    +    end
    +    return false
    +end
    +
    +"""
    +    overlaps(::GI.LineTrait, line1, ::GI.LineTrait, line)::Bool
    +
    +If the lines overlap, meaning that they are collinear but each have one endpoint
    +outside of the other line, return true. Else false.
    +"""
    +overlaps(::GI.LineTrait, line1, ::GI.LineTrait, line) =
    +    _overlaps((a1, a2), (b1, b2))
    +
    +"""
    +    overlaps(
    +        ::Union{GI.LineStringTrait, GI.LinearRing}, line1,
    +        ::Union{GI.LineStringTrait, GI.LinearRing}, line2,
    +    )::Bool
    +
    +If the curves overlap, meaning that at least one edge of each curve overlaps,
    +return true. Else false.
    +"""
    +function overlaps(
    +    ::Union{GI.LineStringTrait, GI.LinearRing}, line1,
    +    ::Union{GI.LineStringTrait, GI.LinearRing}, line2,
    +)
    +    edges_a, edges_b = map(sort! ∘ to_edges, (line1, line2))
    +    for edge_a in edges_a
    +        for edge_b in edges_b
    +            _overlaps(edge_a, edge_b) && return true
    +        end
    +    end
    +    return false
    +end
    +
    +"""
    +    overlaps(
    +        trait_a::GI.PolygonTrait, poly_a,
    +        trait_b::GI.PolygonTrait, poly_b,
    +    )::Bool
    +
    +If the two polygons intersect with one another, but are not equal, return true.
    +Else false.
    +"""
    +function overlaps(
    +    trait_a::GI.PolygonTrait, poly_a,
    +    trait_b::GI.PolygonTrait, poly_b,
    +)
    +    edges_a, edges_b = map(sort! ∘ to_edges, (poly_a, poly_b))
    +    return _line_intersects(edges_a, edges_b) &&
    +        !equals(trait_a, poly_a, trait_b, poly_b)
    +end
    +
    +"""
    +    overlaps(
    +        ::GI.PolygonTrait, poly1,
    +        ::GI.MultiPolygonTrait, polys2,
    +    )::Bool
    +
    +Return true if polygon overlaps with at least one of the polygons within the
    +multipolygon. Else false.
    +"""
    +function overlaps(
    +    ::GI.PolygonTrait, poly1,
    +    ::GI.MultiPolygonTrait, polys2,
    +)
    +    for poly2 in GI.getgeom(polys2)
    +        overlaps(poly1, poly2) && return true
    +    end
    +    return false
    +end
    +
    +"""
    +    overlaps(
    +        ::GI.MultiPolygonTrait, polys1,
    +        ::GI.PolygonTrait, poly2,
    +    )::Bool
    +
    +Return true if polygon overlaps with at least one of the polygons within the
    +multipolygon. Else false.
    +"""
    +overlaps(trait1::GI.MultiPolygonTrait, polys1, trait2::GI.PolygonTrait, poly2) =
    +    overlaps(trait2, poly2, trait1, polys1)
    +
    +"""
    +    overlaps(
    +        ::GI.MultiPolygonTrait, polys1,
    +        ::GI.MultiPolygonTrait, polys2,
    +    )::Bool
    +
    +Return true if at least one pair of polygons from multipolygons overlap. Else
    +false.
    +"""
    +function overlaps(
    +    ::GI.MultiPolygonTrait, polys1,
    +    ::GI.MultiPolygonTrait, polys2,
    +)
    +    for poly1 in GI.getgeom(polys1)
    +        overlaps(poly1, polys2) && return true
    +    end
    +    return false
    +end
    +
    +#= If the edges overlap, meaning that they are collinear but each have one endpoint
    +outside of the other edge, return true. Else false. =#
    +function _overlaps(
    +    (a1, a2)::Edge,
    +    (b1, b2)::Edge,
    +    exact = _False(),
    +)

    meets in more than one point

    julia
        seg_val, _, _ = _intersection_point(Float64, (a1, a2), (b1, b2); exact)

    one end point is outside of other segment

    julia
        a_fully_within = _point_on_seg(a1, b1, b2) && _point_on_seg(a2, b1, b2)
    +    b_fully_within = _point_on_seg(b1, a1, a2) && _point_on_seg(b2, a1, a2)
    +    return seg_val == line_over && (!a_fully_within && !b_fully_within)
    +end
    +
    +#= TODO: Once overlaps is swapped over to use the geom relations workflow, can
    +delete these helpers. =#

    Checks if point is on a segment

    julia
    function _point_on_seg(point, start, stop)

    Parse out points

    julia
        x, y = GI.x(point), GI.y(point)
    +    x1, y1 = GI.x(start), GI.y(start)
    +    x2, y2 = GI.x(stop), GI.y(stop)
    +    Δxl = x2 - x1
    +    Δyl = y2 - y1

    Determine if point is on segment

    julia
        cross = (x - x1) * Δyl - (y - y1) * Δxl
    +    if cross == 0  # point is on line extending to infinity

    is line between endpoints

    julia
            if abs(Δxl) >= abs(Δyl)  # is line between endpoints
    +            return Δxl > 0 ? x1 <= x <= x2 : x2 <= x <= x1
    +        else
    +            return Δyl > 0 ? y1 <= y <= y2 : y2 <= y <= y1
    +        end
    +    end
    +    return false
    +end
    +
    +#= Returns true if there is at least one intersection between edges within the
    +two lists of edges. =#
    +function _line_intersects(
    +    edges_a::Vector{<:Edge},
    +    edges_b::Vector{<:Edge};
    +)

    Extents.intersects(to_extent(edges_a), to_extent(edges_b)) || return false

    julia
        for edge_a in edges_a
    +        for edge_b in edges_b
    +            _line_intersects(edge_a, edge_b) && return true
    +        end
    +    end
    +    return false
    +end

    Returns true if there is at least one intersection between two edges.

    julia
    function _line_intersects(edge_a::Edge, edge_b::Edge)
    +    seg_val, _, _ = _intersection_point(Float64, edge_a, edge_b; exact = _False())
    +    return seg_val != line_out
    +end

    This page was generated using Literate.jl.

    `,37)]))}const E=i(t,[["render",e]]);export{o as __pageData,E as default}; diff --git a/previews/PR239/assets/source_methods_geom_relations_overlaps.md.BjDDEk4_.lean.js b/previews/PR239/assets/source_methods_geom_relations_overlaps.md.BjDDEk4_.lean.js new file mode 100644 index 000000000..186cb7e1e --- /dev/null +++ b/previews/PR239/assets/source_methods_geom_relations_overlaps.md.BjDDEk4_.lean.js @@ -0,0 +1,212 @@ +import{_ as i,c as a,a5 as n,o as l}from"./chunks/framework.onQNwZ2I.js";const p="/GeometryOps.jl/previews/PR239/assets/hvyhqaw.CgiryX2p.png",o=JSON.parse('{"title":"Overlaps","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/geom_relations/overlaps.md","filePath":"source/methods/geom_relations/overlaps.md","lastUpdated":null}'),t={name:"source/methods/geom_relations/overlaps.md"};function e(h,s,k,r,d,g){return l(),a("div",null,s[0]||(s[0]=[n(`

    Overlaps

    julia
    export overlaps

    What is overlaps?

    The overlaps function checks if two geometries overlap. Two geometries can only overlap if they have the same dimension, and if they overlap, but one is not contained, within, or equal to the other.

    Note that this means it is impossible for a single point to overlap with a single point and a line only overlaps with another line if only a section of each line is collinear.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +l1 = GI.LineString([(0.0, 0.0), (0.0, 10.0)])
    +l2 = GI.LineString([(0.0, -10.0), (0.0, 3.0)])
    +f, a, p = lines(GI.getpoint(l1), color = :blue)
    +scatter!(GI.getpoint(l1), color = :blue)
    +lines!(GI.getpoint(l2), color = :orange)
    +scatter!(GI.getpoint(l2), color = :orange)
    +f

    We can see that the two lines overlap in the plot:

    julia
    GO.overlaps(l1, l2)  # true
    true

    Implementation

    This is the GeoInterface-compatible implementation.

    First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait. This is also used in the implementation, since it's a lot less work!

    Note that that since only elements of the same dimension can overlap, any two geometries with traits that are of different dimensions automatically can return false.

    For geometries with the same trait dimension, we must make sure that they share a point, an edge, or area for points, lines, and polygons/multipolygons respectively, without being contained.

    julia
    """
    +    overlaps(geom1, geom2)::Bool
    +
    +Compare two Geometries of the same dimension and return true if their
    +intersection set results in a geometry different from both but of the same
    +dimension. This means one geometry cannot be within or contain the other and
    +they cannot be equal
    +
    +# Examples
    +\`\`\`jldoctest
    +import GeometryOps as GO, GeoInterface as GI
    +poly1 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
    +poly2 = GI.Polygon([[(1,1), (1,6), (6,6), (6,1), (1,1)]])
    +
    +GO.overlaps(poly1, poly2)

    output

    julia
    true
    +\`\`\`
    +"""
    +overlaps(geom1, geom2)::Bool = overlaps(
    +    GI.trait(geom1),
    +    geom1,
    +    GI.trait(geom2),
    +    geom2,
    +)
    +
    +"""
    +    overlaps(::GI.AbstractTrait, geom1, ::GI.AbstractTrait, geom2)::Bool
    +
    +For any non-specified pair, all have non-matching dimensions, return false.
    +"""
    +overlaps(::GI.AbstractTrait, geom1, ::GI.AbstractTrait, geom2) = false
    +
    +"""
    +    overlaps(
    +        ::GI.MultiPointTrait, points1,
    +        ::GI.MultiPointTrait, points2,
    +    )::Bool
    +
    +If the multipoints overlap, meaning some, but not all, of the points within the
    +multipoints are shared, return true.
    +"""
    +function overlaps(
    +    ::GI.MultiPointTrait, points1,
    +    ::GI.MultiPointTrait, points2,
    +)
    +    one_diff = false  # assume that all the points are the same
    +    one_same = false  # assume that all points are different
    +    for p1 in GI.getpoint(points1)
    +        match_point = false
    +        for p2 in GI.getpoint(points2)
    +            if equals(p1, p2)  # Point is shared
    +                one_same = true
    +                match_point = true
    +                break
    +            end
    +        end
    +        one_diff |= !match_point  # Point isn't shared
    +        one_same && one_diff && return true
    +    end
    +    return false
    +end
    +
    +"""
    +    overlaps(::GI.LineTrait, line1, ::GI.LineTrait, line)::Bool
    +
    +If the lines overlap, meaning that they are collinear but each have one endpoint
    +outside of the other line, return true. Else false.
    +"""
    +overlaps(::GI.LineTrait, line1, ::GI.LineTrait, line) =
    +    _overlaps((a1, a2), (b1, b2))
    +
    +"""
    +    overlaps(
    +        ::Union{GI.LineStringTrait, GI.LinearRing}, line1,
    +        ::Union{GI.LineStringTrait, GI.LinearRing}, line2,
    +    )::Bool
    +
    +If the curves overlap, meaning that at least one edge of each curve overlaps,
    +return true. Else false.
    +"""
    +function overlaps(
    +    ::Union{GI.LineStringTrait, GI.LinearRing}, line1,
    +    ::Union{GI.LineStringTrait, GI.LinearRing}, line2,
    +)
    +    edges_a, edges_b = map(sort! ∘ to_edges, (line1, line2))
    +    for edge_a in edges_a
    +        for edge_b in edges_b
    +            _overlaps(edge_a, edge_b) && return true
    +        end
    +    end
    +    return false
    +end
    +
    +"""
    +    overlaps(
    +        trait_a::GI.PolygonTrait, poly_a,
    +        trait_b::GI.PolygonTrait, poly_b,
    +    )::Bool
    +
    +If the two polygons intersect with one another, but are not equal, return true.
    +Else false.
    +"""
    +function overlaps(
    +    trait_a::GI.PolygonTrait, poly_a,
    +    trait_b::GI.PolygonTrait, poly_b,
    +)
    +    edges_a, edges_b = map(sort! ∘ to_edges, (poly_a, poly_b))
    +    return _line_intersects(edges_a, edges_b) &&
    +        !equals(trait_a, poly_a, trait_b, poly_b)
    +end
    +
    +"""
    +    overlaps(
    +        ::GI.PolygonTrait, poly1,
    +        ::GI.MultiPolygonTrait, polys2,
    +    )::Bool
    +
    +Return true if polygon overlaps with at least one of the polygons within the
    +multipolygon. Else false.
    +"""
    +function overlaps(
    +    ::GI.PolygonTrait, poly1,
    +    ::GI.MultiPolygonTrait, polys2,
    +)
    +    for poly2 in GI.getgeom(polys2)
    +        overlaps(poly1, poly2) && return true
    +    end
    +    return false
    +end
    +
    +"""
    +    overlaps(
    +        ::GI.MultiPolygonTrait, polys1,
    +        ::GI.PolygonTrait, poly2,
    +    )::Bool
    +
    +Return true if polygon overlaps with at least one of the polygons within the
    +multipolygon. Else false.
    +"""
    +overlaps(trait1::GI.MultiPolygonTrait, polys1, trait2::GI.PolygonTrait, poly2) =
    +    overlaps(trait2, poly2, trait1, polys1)
    +
    +"""
    +    overlaps(
    +        ::GI.MultiPolygonTrait, polys1,
    +        ::GI.MultiPolygonTrait, polys2,
    +    )::Bool
    +
    +Return true if at least one pair of polygons from multipolygons overlap. Else
    +false.
    +"""
    +function overlaps(
    +    ::GI.MultiPolygonTrait, polys1,
    +    ::GI.MultiPolygonTrait, polys2,
    +)
    +    for poly1 in GI.getgeom(polys1)
    +        overlaps(poly1, polys2) && return true
    +    end
    +    return false
    +end
    +
    +#= If the edges overlap, meaning that they are collinear but each have one endpoint
    +outside of the other edge, return true. Else false. =#
    +function _overlaps(
    +    (a1, a2)::Edge,
    +    (b1, b2)::Edge,
    +    exact = _False(),
    +)

    meets in more than one point

    julia
        seg_val, _, _ = _intersection_point(Float64, (a1, a2), (b1, b2); exact)

    one end point is outside of other segment

    julia
        a_fully_within = _point_on_seg(a1, b1, b2) && _point_on_seg(a2, b1, b2)
    +    b_fully_within = _point_on_seg(b1, a1, a2) && _point_on_seg(b2, a1, a2)
    +    return seg_val == line_over && (!a_fully_within && !b_fully_within)
    +end
    +
    +#= TODO: Once overlaps is swapped over to use the geom relations workflow, can
    +delete these helpers. =#

    Checks if point is on a segment

    julia
    function _point_on_seg(point, start, stop)

    Parse out points

    julia
        x, y = GI.x(point), GI.y(point)
    +    x1, y1 = GI.x(start), GI.y(start)
    +    x2, y2 = GI.x(stop), GI.y(stop)
    +    Δxl = x2 - x1
    +    Δyl = y2 - y1

    Determine if point is on segment

    julia
        cross = (x - x1) * Δyl - (y - y1) * Δxl
    +    if cross == 0  # point is on line extending to infinity

    is line between endpoints

    julia
            if abs(Δxl) >= abs(Δyl)  # is line between endpoints
    +            return Δxl > 0 ? x1 <= x <= x2 : x2 <= x <= x1
    +        else
    +            return Δyl > 0 ? y1 <= y <= y2 : y2 <= y <= y1
    +        end
    +    end
    +    return false
    +end
    +
    +#= Returns true if there is at least one intersection between edges within the
    +two lists of edges. =#
    +function _line_intersects(
    +    edges_a::Vector{<:Edge},
    +    edges_b::Vector{<:Edge};
    +)

    Extents.intersects(to_extent(edges_a), to_extent(edges_b)) || return false

    julia
        for edge_a in edges_a
    +        for edge_b in edges_b
    +            _line_intersects(edge_a, edge_b) && return true
    +        end
    +    end
    +    return false
    +end

    Returns true if there is at least one intersection between two edges.

    julia
    function _line_intersects(edge_a::Edge, edge_b::Edge)
    +    seg_val, _, _ = _intersection_point(Float64, edge_a, edge_b; exact = _False())
    +    return seg_val != line_out
    +end

    This page was generated using Literate.jl.

    `,37)]))}const E=i(t,[["render",e]]);export{o as __pageData,E as default}; diff --git a/previews/PR239/assets/source_methods_geom_relations_touches.md.C3wGt7mS.js b/previews/PR239/assets/source_methods_geom_relations_touches.md.C3wGt7mS.js new file mode 100644 index 000000000..99d0ad298 --- /dev/null +++ b/previews/PR239/assets/source_methods_geom_relations_touches.md.C3wGt7mS.js @@ -0,0 +1,174 @@ +import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const h="/GeometryOps.jl/previews/PR239/assets/eytjybr.BEFUMtlf.png",o=JSON.parse('{"title":"Touches","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/geom_relations/touches.md","filePath":"source/methods/geom_relations/touches.md","lastUpdated":null}'),l={name:"source/methods/geom_relations/touches.md"};function e(p,s,k,r,E,g){return t(),a("div",null,s[0]||(s[0]=[n(`

    Touches

    julia
    export touches

    What is touches?

    The touches function checks if one geometry touches another geometry. In other words, the interiors of the two geometries don't interact, but one of the geometries must have a boundary point that interacts with either the other geometry's interior or boundary.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +l1 = GI.Line([(0.0, 0.0), (1.0, 0.0)])
    +l2 = GI.Line([(1.0, 0.0), (1.0, -1.0)])
    +
    +f, a, p = lines(GI.getpoint(l1))
    +lines!(GI.getpoint(l2))
    +f

    We can see that these two lines touch only at their endpoints.

    julia
    GO.touches(l1, l2)  # true
    true

    Implementation

    This is the GeoInterface-compatible implementation.

    First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait.

    Each of these calls a method in the geom_geom_processors file. The methods in this file determine if the given geometries meet a set of criteria. For the touches function and arguments g1 and g2, this criteria is as follows: - points of g1 are not allowed to be in the interior of g2 - points of g1 are allowed to be on the boundary of g2 - points of g1 are allowed to be in the exterior of g2 - no points of g1 are required to be in the interior of g2 - at least one point of g1 is required to be on the boundary of g2 - no points of g1 are required to be in the exterior of g2

    The code for the specific implementations is in the geom_geom_processors file.

    julia
    const TOUCHES_POINT_ALLOWED = (in_allow = false, on_allow = true, out_allow = false)
    +const TOUCHES_CURVE_ALLOWED = (over_allow = false, cross_allow = false, on_allow = true, out_allow = true)
    +const TOUCHES_POLYGON_ALLOWS = (in_allow = false, on_allow = true, out_allow = true)
    +const TOUCHES_REQUIRES = (in_require = false, on_require = true, out_require = false)
    +const TOUCHES_EXACT = (exact = _False(),)
    +
    +"""
    +    touches(geom1, geom2)::Bool
    +
    +Return \`true\` if the first geometry touches the second geometry. In other words,
    +the two interiors cannot interact, but one of the geometries must have a
    +boundary point that interacts with either the other geometry's interior or
    +boundary.
    +
    +# Examples
    +\`\`\`jldoctest setup=:(using GeometryOps, GeometryBasics)
    +import GeometryOps as GO, GeoInterface as GI
    +
    +l1 = GI.Line([(0.0, 0.0), (1.0, 0.0)])
    +l2 = GI.Line([(1.0, 1.0), (1.0, -1.0)])
    +
    +GO.touches(l1, l2)

    output

    julia
    true
    +\`\`\`
    +"""
    +touches(g1, g2)::Bool = _touches(trait(g1), g1, trait(g2), g2)

    Convert features to geometries

    julia
    _touches(::GI.FeatureTrait, g1, ::Any, g2) = touches(GI.geometry(g1), g2)
    +_touches(::Any, g1, t2::GI.FeatureTrait, g2) = touches(g1, GI.geometry(g2))
    +_touches(::FeatureTrait, g1, ::FeatureTrait, g2) = touches(GI.geometry(g1), GI.geometry(g2))

    Point touches geometries

    Point cannot touch another point as if they are equal, interiors interact

    julia
    _touches(
    +    ::GI.PointTrait, g1,
    +    ::GI.PointTrait, g2,
    +) = false

    Point touches a linestring if it equal to the first of last point of the line

    julia
    function _touches(
    +    ::GI.PointTrait, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +)
    +    n = GI.npoint(g2)
    +    p1 = GI.getpoint(g2, 1)
    +    pn = GI.getpoint(g2, n)
    +    equals(p1, pn) && return false
    +    return equals(g1, p1) || equals(g1, pn)
    +end

    Point cannot 'touch' a linearring given that the ring has no boundary points

    julia
    _touches(
    +    ::GI.PointTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = false

    Point touches a polygon if it is on the boundary of that polygon

    julia
    _touches(
    +    ::GI.PointTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _point_polygon_process(
    +    g1, g2;
    +    TOUCHES_POINT_ALLOWED...,
    +    TOUCHES_EXACT...,
    +)
    +
    +#= Geometry touches a point if the point is on the geometry boundary. =#
    +_touches(
    +    trait1::Union{GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    trait2::GI.PointTrait, g2,
    +) = _touches(trait2, g2, trait1, g1)

    Lines touching geometries

    julia
    #= Linestring touches another line if at least one boundary point interacts with
    +the boundary of interior of the other line, but the interiors don't interact. =#
    +_touches(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    TOUCHES_CURVE_ALLOWED...,
    +    TOUCHES_REQUIRES...,
    +    TOUCHES_EXACT...,
    +    closed_line = false,
    +    closed_curve = false,
    +)
    +
    +
    +#= Linestring touches a linearring if at least one of the boundary points of the
    +line interacts with the linear ring, but their interiors can't interact. =#
    +_touches(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    TOUCHES_CURVE_ALLOWED...,
    +    TOUCHES_REQUIRES...,
    +    TOUCHES_EXACT...,
    +    closed_line = false,
    +    closed_curve = true,
    +)
    +
    +#= Linestring touches a polygon if at least one of the boundary points of the
    +line interacts with the boundary of the polygon. =#
    +_touches(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    TOUCHES_POLYGON_ALLOWS...,
    +    TOUCHES_REQUIRES...,
    +    TOUCHES_EXACT...,
    +    closed_line = false,
    +)

    Rings touch geometries

    julia
    #= Linearring touches a linestring if at least one of the boundary points of the
    +line interacts with the linear ring, but their interiors can't interact. =#
    +_touches(
    +    trait1::GI.LinearRingTrait, g1,
    +    trait2::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _touches(trait2, g2, trait1, g1)
    +
    +#= Linearring cannot touch another linear ring since they are both exclusively
    +made up of interior points and no boundary points =#
    +_touches(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = false
    +
    +#= Linearring touches a polygon if at least one of the points of the ring
    +interact with the polygon boundary and non are in the polygon interior. =#
    +_touches(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    TOUCHES_POLYGON_ALLOWS...,
    +    TOUCHES_REQUIRES...,
    +    TOUCHES_EXACT...,
    +    closed_line = true,
    +)

    Polygons touch geometries

    julia
    #= Polygon touches a curve if at least one of the curve boundary points interacts
    +with the polygon's boundary and no curve points interact with the interior.=#
    +_touches(
    +    trait1::GI.PolygonTrait, g1,
    +    trait2::GI.AbstractCurveTrait, g2
    +) = _touches(trait2, g2, trait1, g1)
    +
    +
    +#= Polygon touches another polygon if they share at least one boundary point and
    +no interior points. =#
    +_touches(
    +    ::GI.PolygonTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _polygon_polygon_process(
    +    g1, g2;
    +    TOUCHES_POLYGON_ALLOWS...,
    +    TOUCHES_REQUIRES...,
    +    TOUCHES_EXACT...,
    +)

    Geometries touch multi-geometry/geometry collections

    julia
    #= Geometry touch a multi-geometry or a collection if the geometry touches at
    +least one of the elements of the collection. =#
    +function _touches(
    +    ::Union{GI.PointTrait, GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g2,
    +)
    +    for sub_g2 in GI.getgeom(g2)
    +        !touches(g1, sub_g2) && return false
    +    end
    +    return true
    +end

    Multi-geometry/geometry collections cross geometries

    julia
    #= Multi-geometry or a geometry collection touches a geometry if at least one
    +elements of the collection touches the geometry. =#
    +function _touches(
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g1,
    +    ::GI.AbstractGeometryTrait, g2,
    +)
    +    for sub_g1 in GI.getgeom(g1)
    +        !touches(sub_g1, g2) && return false
    +    end
    +    return true
    +end

    This page was generated using Literate.jl.

    `,41)]))}const y=i(l,[["render",e]]);export{o as __pageData,y as default}; diff --git a/previews/PR239/assets/source_methods_geom_relations_touches.md.C3wGt7mS.lean.js b/previews/PR239/assets/source_methods_geom_relations_touches.md.C3wGt7mS.lean.js new file mode 100644 index 000000000..99d0ad298 --- /dev/null +++ b/previews/PR239/assets/source_methods_geom_relations_touches.md.C3wGt7mS.lean.js @@ -0,0 +1,174 @@ +import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const h="/GeometryOps.jl/previews/PR239/assets/eytjybr.BEFUMtlf.png",o=JSON.parse('{"title":"Touches","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/geom_relations/touches.md","filePath":"source/methods/geom_relations/touches.md","lastUpdated":null}'),l={name:"source/methods/geom_relations/touches.md"};function e(p,s,k,r,E,g){return t(),a("div",null,s[0]||(s[0]=[n(`

    Touches

    julia
    export touches

    What is touches?

    The touches function checks if one geometry touches another geometry. In other words, the interiors of the two geometries don't interact, but one of the geometries must have a boundary point that interacts with either the other geometry's interior or boundary.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +l1 = GI.Line([(0.0, 0.0), (1.0, 0.0)])
    +l2 = GI.Line([(1.0, 0.0), (1.0, -1.0)])
    +
    +f, a, p = lines(GI.getpoint(l1))
    +lines!(GI.getpoint(l2))
    +f

    We can see that these two lines touch only at their endpoints.

    julia
    GO.touches(l1, l2)  # true
    true

    Implementation

    This is the GeoInterface-compatible implementation.

    First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait.

    Each of these calls a method in the geom_geom_processors file. The methods in this file determine if the given geometries meet a set of criteria. For the touches function and arguments g1 and g2, this criteria is as follows: - points of g1 are not allowed to be in the interior of g2 - points of g1 are allowed to be on the boundary of g2 - points of g1 are allowed to be in the exterior of g2 - no points of g1 are required to be in the interior of g2 - at least one point of g1 is required to be on the boundary of g2 - no points of g1 are required to be in the exterior of g2

    The code for the specific implementations is in the geom_geom_processors file.

    julia
    const TOUCHES_POINT_ALLOWED = (in_allow = false, on_allow = true, out_allow = false)
    +const TOUCHES_CURVE_ALLOWED = (over_allow = false, cross_allow = false, on_allow = true, out_allow = true)
    +const TOUCHES_POLYGON_ALLOWS = (in_allow = false, on_allow = true, out_allow = true)
    +const TOUCHES_REQUIRES = (in_require = false, on_require = true, out_require = false)
    +const TOUCHES_EXACT = (exact = _False(),)
    +
    +"""
    +    touches(geom1, geom2)::Bool
    +
    +Return \`true\` if the first geometry touches the second geometry. In other words,
    +the two interiors cannot interact, but one of the geometries must have a
    +boundary point that interacts with either the other geometry's interior or
    +boundary.
    +
    +# Examples
    +\`\`\`jldoctest setup=:(using GeometryOps, GeometryBasics)
    +import GeometryOps as GO, GeoInterface as GI
    +
    +l1 = GI.Line([(0.0, 0.0), (1.0, 0.0)])
    +l2 = GI.Line([(1.0, 1.0), (1.0, -1.0)])
    +
    +GO.touches(l1, l2)

    output

    julia
    true
    +\`\`\`
    +"""
    +touches(g1, g2)::Bool = _touches(trait(g1), g1, trait(g2), g2)

    Convert features to geometries

    julia
    _touches(::GI.FeatureTrait, g1, ::Any, g2) = touches(GI.geometry(g1), g2)
    +_touches(::Any, g1, t2::GI.FeatureTrait, g2) = touches(g1, GI.geometry(g2))
    +_touches(::FeatureTrait, g1, ::FeatureTrait, g2) = touches(GI.geometry(g1), GI.geometry(g2))

    Point touches geometries

    Point cannot touch another point as if they are equal, interiors interact

    julia
    _touches(
    +    ::GI.PointTrait, g1,
    +    ::GI.PointTrait, g2,
    +) = false

    Point touches a linestring if it equal to the first of last point of the line

    julia
    function _touches(
    +    ::GI.PointTrait, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +)
    +    n = GI.npoint(g2)
    +    p1 = GI.getpoint(g2, 1)
    +    pn = GI.getpoint(g2, n)
    +    equals(p1, pn) && return false
    +    return equals(g1, p1) || equals(g1, pn)
    +end

    Point cannot 'touch' a linearring given that the ring has no boundary points

    julia
    _touches(
    +    ::GI.PointTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = false

    Point touches a polygon if it is on the boundary of that polygon

    julia
    _touches(
    +    ::GI.PointTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _point_polygon_process(
    +    g1, g2;
    +    TOUCHES_POINT_ALLOWED...,
    +    TOUCHES_EXACT...,
    +)
    +
    +#= Geometry touches a point if the point is on the geometry boundary. =#
    +_touches(
    +    trait1::Union{GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    trait2::GI.PointTrait, g2,
    +) = _touches(trait2, g2, trait1, g1)

    Lines touching geometries

    julia
    #= Linestring touches another line if at least one boundary point interacts with
    +the boundary of interior of the other line, but the interiors don't interact. =#
    +_touches(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    TOUCHES_CURVE_ALLOWED...,
    +    TOUCHES_REQUIRES...,
    +    TOUCHES_EXACT...,
    +    closed_line = false,
    +    closed_curve = false,
    +)
    +
    +
    +#= Linestring touches a linearring if at least one of the boundary points of the
    +line interacts with the linear ring, but their interiors can't interact. =#
    +_touches(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    TOUCHES_CURVE_ALLOWED...,
    +    TOUCHES_REQUIRES...,
    +    TOUCHES_EXACT...,
    +    closed_line = false,
    +    closed_curve = true,
    +)
    +
    +#= Linestring touches a polygon if at least one of the boundary points of the
    +line interacts with the boundary of the polygon. =#
    +_touches(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    TOUCHES_POLYGON_ALLOWS...,
    +    TOUCHES_REQUIRES...,
    +    TOUCHES_EXACT...,
    +    closed_line = false,
    +)

    Rings touch geometries

    julia
    #= Linearring touches a linestring if at least one of the boundary points of the
    +line interacts with the linear ring, but their interiors can't interact. =#
    +_touches(
    +    trait1::GI.LinearRingTrait, g1,
    +    trait2::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _touches(trait2, g2, trait1, g1)
    +
    +#= Linearring cannot touch another linear ring since they are both exclusively
    +made up of interior points and no boundary points =#
    +_touches(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = false
    +
    +#= Linearring touches a polygon if at least one of the points of the ring
    +interact with the polygon boundary and non are in the polygon interior. =#
    +_touches(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    TOUCHES_POLYGON_ALLOWS...,
    +    TOUCHES_REQUIRES...,
    +    TOUCHES_EXACT...,
    +    closed_line = true,
    +)

    Polygons touch geometries

    julia
    #= Polygon touches a curve if at least one of the curve boundary points interacts
    +with the polygon's boundary and no curve points interact with the interior.=#
    +_touches(
    +    trait1::GI.PolygonTrait, g1,
    +    trait2::GI.AbstractCurveTrait, g2
    +) = _touches(trait2, g2, trait1, g1)
    +
    +
    +#= Polygon touches another polygon if they share at least one boundary point and
    +no interior points. =#
    +_touches(
    +    ::GI.PolygonTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _polygon_polygon_process(
    +    g1, g2;
    +    TOUCHES_POLYGON_ALLOWS...,
    +    TOUCHES_REQUIRES...,
    +    TOUCHES_EXACT...,
    +)

    Geometries touch multi-geometry/geometry collections

    julia
    #= Geometry touch a multi-geometry or a collection if the geometry touches at
    +least one of the elements of the collection. =#
    +function _touches(
    +    ::Union{GI.PointTrait, GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g2,
    +)
    +    for sub_g2 in GI.getgeom(g2)
    +        !touches(g1, sub_g2) && return false
    +    end
    +    return true
    +end

    Multi-geometry/geometry collections cross geometries

    julia
    #= Multi-geometry or a geometry collection touches a geometry if at least one
    +elements of the collection touches the geometry. =#
    +function _touches(
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g1,
    +    ::GI.AbstractGeometryTrait, g2,
    +)
    +    for sub_g1 in GI.getgeom(g1)
    +        !touches(sub_g1, g2) && return false
    +    end
    +    return true
    +end

    This page was generated using Literate.jl.

    `,41)]))}const y=i(l,[["render",e]]);export{o as __pageData,y as default}; diff --git a/previews/PR239/assets/source_methods_geom_relations_within.md.UHYdg8yN.js b/previews/PR239/assets/source_methods_geom_relations_within.md.UHYdg8yN.js new file mode 100644 index 000000000..d8cf62dc9 --- /dev/null +++ b/previews/PR239/assets/source_methods_geom_relations_within.md.UHYdg8yN.js @@ -0,0 +1,193 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const t="/GeometryOps.jl/previews/PR239/assets/rzkakxn._0R9BbFk.png",o=JSON.parse('{"title":"Within","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/geom_relations/within.md","filePath":"source/methods/geom_relations/within.md","lastUpdated":null}'),l={name:"source/methods/geom_relations/within.md"};function e(p,s,k,r,E,g){return h(),a("div",null,s[0]||(s[0]=[n(`

    Within

    julia
    export within

    What is within?

    The within function checks if one geometry is inside another geometry. This requires that the two interiors intersect and that the interior and boundary of the first geometry is not in the exterior of the second geometry.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +l1 = GI.LineString([(0.0, 0.0), (1.0, 0.0), (0.0, 0.1)])
    +l2 = GI.LineString([(0.25, 0.0), (0.75, 0.0)])
    +f, a, p = lines(GI.getpoint(l1), color = :blue)
    +scatter!(GI.getpoint(l1), color = :blue)
    +lines!(GI.getpoint(l2), color = :orange)
    +scatter!(GI.getpoint(l2), color = :orange)
    +f

    We can see that all of the points and edges of l2 are within l1, so l2 is within l1, but l1 is not within l2

    julia
    GO.within(l1, l2)  # false
    +GO.within(l2, l1)  # true
    true

    Implementation

    This is the GeoInterface-compatible implementation.

    First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait.

    Each of these calls a method in the geom_geom_processors file. The methods in this file determine if the given geometries meet a set of criteria. For the within function and arguments g1 and g2, this criteria is as follows: - points of g1 are allowed to be in the interior of g2 (either through overlap or crossing for lines) - points of g1 are allowed to be on the boundary of g2 - points of g1 are not allowed to be in the exterior of g2 - at least one point of g1 is required to be in the interior of g2 - no points of g1 are required to be on the boundary of g2 - no points of g1 are required to be in the exterior of g2

    The code for the specific implementations is in the geom_geom_processors file.

    julia
    const WITHIN_POINT_ALLOWS = (in_allow = true, on_allow = false, out_allow = false)
    +const WITHIN_CURVE_ALLOWS = (over_allow = true, cross_allow = true, on_allow = true, out_allow = false)
    +const WITHIN_POLYGON_ALLOWS = (in_allow = true, on_allow = true, out_allow = false)
    +const WITHIN_REQUIRES = (in_require = true, on_require = false, out_require = false)
    +const WITHIN_EXACT = (exact = _False(),)
    +
    +"""
    +    within(geom1, geom2)::Bool
    +
    +Return \`true\` if the first geometry is completely within the second geometry.
    +The interiors of both geometries must intersect and the interior and boundary of
    +the primary geometry (geom1) must not intersect the exterior of the secondary
    +geometry (geom2).
    +
    +Furthermore, \`within\` returns the exact opposite result of \`contains\`.
    +
    +# Examples
    +\`\`\`jldoctest setup=:(using GeometryOps, GeometryBasics)
    +import GeometryOps as GO, GeoInterface as GI
    +
    +line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
    +point = (1, 2)
    +GO.within(point, line)

    output

    julia
    true
    +\`\`\`
    +"""
    +within(g1, g2) = _within(trait(g1), g1, trait(g2), g2)

    Convert features to geometries

    julia
    _within(::GI.FeatureTrait, g1, ::Any, g2) = within(GI.geometry(g1), g2)
    +_within(::Any, g1, t2::GI.FeatureTrait, g2) = within(g1, GI.geometry(g2))
    +_within(::FeatureTrait, g1, ::FeatureTrait, g2) = within(GI.geometry(g1), GI.geometry(g2))

    Points within geometries

    Point is within another point if those points are equal.

    julia
    _within(
    +    ::GI.PointTrait, g1,
    +    ::GI.PointTrait, g2,
    +) = equals(g1, g2)
    +
    +#= Point is within a linestring if it is on a vertex or an edge of that line,
    +excluding the start and end vertex if the line is not closed. =#
    +_within(
    +    ::GI.PointTrait, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _point_curve_process(
    +    g1, g2;
    +    WITHIN_POINT_ALLOWS...,
    +    closed_curve = false,
    +)

    Point is within a linearring if it is on a vertex or an edge of that ring.

    julia
    _within(
    +    ::GI.PointTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _point_curve_process(
    +    g1, g2;
    +    WITHIN_POINT_ALLOWS...,
    +    closed_curve = true,
    +)
    +
    +#= Point is within a polygon if it is inside of that polygon, excluding edges,
    +vertices, and holes. =#
    +_within(
    +    ::GI.PointTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _point_polygon_process(
    +    g1, g2;
    +    WITHIN_POINT_ALLOWS...,
    +    WITHIN_EXACT...,
    +)

    No geometries other than points can be within points

    julia
    _within(
    +    ::Union{GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    ::GI.PointTrait, g2,
    +) = false

    Lines within geometries

    julia
    #= Linestring is within another linestring if their interiors intersect and no
    +points of the first line are in the exterior of the second line. =#
    +_within(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    WITHIN_CURVE_ALLOWS...,
    +    WITHIN_REQUIRES...,
    +    WITHIN_EXACT...,
    +    closed_line = false,
    +    closed_curve = false,
    +)
    +
    +#= Linestring is within a linear ring if their interiors intersect and no points
    +of the line are in the exterior of the ring. =#
    +_within(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    WITHIN_CURVE_ALLOWS...,
    +    WITHIN_REQUIRES...,
    +    WITHIN_EXACT...,
    +    closed_line = false,
    +    closed_curve = true,
    +)
    +
    +#= Linestring is within a polygon if their interiors intersect and no points of
    +the line are in the exterior of the polygon, although they can be on an edge. =#
    +_within(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    WITHIN_POLYGON_ALLOWS...,
    +    WITHIN_REQUIRES...,
    +    WITHIN_EXACT...,
    +    closed_line = false,
    +)

    Rings covered by geometries

    julia
    #= Linearring is within a linestring if their interiors intersect and no points
    +of the ring are in the exterior of the line. =#
    +_within(
    +    ::GI.LinearRingTrait, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    WITHIN_CURVE_ALLOWS...,
    +    WITHIN_REQUIRES...,
    +    WITHIN_EXACT...,
    +    closed_line = true,
    +    closed_curve = false,
    +)
    +
    +#= Linearring is within another linearring if their interiors intersect and no
    +points of the first ring are in the exterior of the second ring. =#
    +_within(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    WITHIN_CURVE_ALLOWS...,
    +    WITHIN_REQUIRES...,
    +    WITHIN_EXACT...,
    +    closed_line = true,
    +    closed_curve = true,
    +)
    +
    +#= Linearring is within a polygon if their interiors intersect and no points of
    +the ring are in the exterior of the polygon, although they can be on an edge. =#
    +_within(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    WITHIN_POLYGON_ALLOWS...,
    +    WITHIN_REQUIRES...,
    +    WITHIN_EXACT...,
    +    closed_line = true,
    +)

    Polygons within geometries

    julia
    #= Polygon is within another polygon if the interior of the first polygon
    +intersects with the interior of the second and no points of the first polygon
    +are outside of the second polygon. =#
    +_within(
    +    ::GI.PolygonTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _polygon_polygon_process(
    +    g1, g2;
    +    WITHIN_POLYGON_ALLOWS...,
    +    WITHIN_REQUIRES...,
    +    WITHIN_EXACT...,
    +)

    Polygons cannot be within any curves

    julia
    _within(
    +    ::GI.PolygonTrait, g1,
    +    ::GI.AbstractCurveTrait, g2,
    +) = false

    Geometries within multi-geometry/geometry collections

    julia
    #= Geometry is within a multi-geometry or a collection if the geometry is within
    +at least one of the collection elements. =#
    +function _within(
    +    ::Union{GI.PointTrait, GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g2,
    +)
    +    for sub_g2 in GI.getgeom(g2)
    +        within(g1, sub_g2) && return true
    +    end
    +    return false
    +end

    Multi-geometry/geometry collections within geometries

    julia
    #= Multi-geometry or a geometry collection is within a geometry if all
    +elements of the collection are within the geometry. =#
    +function _within(
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g1,
    +    ::GI.AbstractGeometryTrait, g2,
    +)
    +    for sub_g1 in GI.getgeom(g1)
    +        !within(sub_g1, g2) && return false
    +    end
    +    return true
    +end

    This page was generated using Literate.jl.

    `,41)]))}const y=i(l,[["render",e]]);export{o as __pageData,y as default}; diff --git a/previews/PR239/assets/source_methods_geom_relations_within.md.UHYdg8yN.lean.js b/previews/PR239/assets/source_methods_geom_relations_within.md.UHYdg8yN.lean.js new file mode 100644 index 000000000..d8cf62dc9 --- /dev/null +++ b/previews/PR239/assets/source_methods_geom_relations_within.md.UHYdg8yN.lean.js @@ -0,0 +1,193 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const t="/GeometryOps.jl/previews/PR239/assets/rzkakxn._0R9BbFk.png",o=JSON.parse('{"title":"Within","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/geom_relations/within.md","filePath":"source/methods/geom_relations/within.md","lastUpdated":null}'),l={name:"source/methods/geom_relations/within.md"};function e(p,s,k,r,E,g){return h(),a("div",null,s[0]||(s[0]=[n(`

    Within

    julia
    export within

    What is within?

    The within function checks if one geometry is inside another geometry. This requires that the two interiors intersect and that the interior and boundary of the first geometry is not in the exterior of the second geometry.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +l1 = GI.LineString([(0.0, 0.0), (1.0, 0.0), (0.0, 0.1)])
    +l2 = GI.LineString([(0.25, 0.0), (0.75, 0.0)])
    +f, a, p = lines(GI.getpoint(l1), color = :blue)
    +scatter!(GI.getpoint(l1), color = :blue)
    +lines!(GI.getpoint(l2), color = :orange)
    +scatter!(GI.getpoint(l2), color = :orange)
    +f

    We can see that all of the points and edges of l2 are within l1, so l2 is within l1, but l1 is not within l2

    julia
    GO.within(l1, l2)  # false
    +GO.within(l2, l1)  # true
    true

    Implementation

    This is the GeoInterface-compatible implementation.

    First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait.

    Each of these calls a method in the geom_geom_processors file. The methods in this file determine if the given geometries meet a set of criteria. For the within function and arguments g1 and g2, this criteria is as follows: - points of g1 are allowed to be in the interior of g2 (either through overlap or crossing for lines) - points of g1 are allowed to be on the boundary of g2 - points of g1 are not allowed to be in the exterior of g2 - at least one point of g1 is required to be in the interior of g2 - no points of g1 are required to be on the boundary of g2 - no points of g1 are required to be in the exterior of g2

    The code for the specific implementations is in the geom_geom_processors file.

    julia
    const WITHIN_POINT_ALLOWS = (in_allow = true, on_allow = false, out_allow = false)
    +const WITHIN_CURVE_ALLOWS = (over_allow = true, cross_allow = true, on_allow = true, out_allow = false)
    +const WITHIN_POLYGON_ALLOWS = (in_allow = true, on_allow = true, out_allow = false)
    +const WITHIN_REQUIRES = (in_require = true, on_require = false, out_require = false)
    +const WITHIN_EXACT = (exact = _False(),)
    +
    +"""
    +    within(geom1, geom2)::Bool
    +
    +Return \`true\` if the first geometry is completely within the second geometry.
    +The interiors of both geometries must intersect and the interior and boundary of
    +the primary geometry (geom1) must not intersect the exterior of the secondary
    +geometry (geom2).
    +
    +Furthermore, \`within\` returns the exact opposite result of \`contains\`.
    +
    +# Examples
    +\`\`\`jldoctest setup=:(using GeometryOps, GeometryBasics)
    +import GeometryOps as GO, GeoInterface as GI
    +
    +line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
    +point = (1, 2)
    +GO.within(point, line)

    output

    julia
    true
    +\`\`\`
    +"""
    +within(g1, g2) = _within(trait(g1), g1, trait(g2), g2)

    Convert features to geometries

    julia
    _within(::GI.FeatureTrait, g1, ::Any, g2) = within(GI.geometry(g1), g2)
    +_within(::Any, g1, t2::GI.FeatureTrait, g2) = within(g1, GI.geometry(g2))
    +_within(::FeatureTrait, g1, ::FeatureTrait, g2) = within(GI.geometry(g1), GI.geometry(g2))

    Points within geometries

    Point is within another point if those points are equal.

    julia
    _within(
    +    ::GI.PointTrait, g1,
    +    ::GI.PointTrait, g2,
    +) = equals(g1, g2)
    +
    +#= Point is within a linestring if it is on a vertex or an edge of that line,
    +excluding the start and end vertex if the line is not closed. =#
    +_within(
    +    ::GI.PointTrait, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _point_curve_process(
    +    g1, g2;
    +    WITHIN_POINT_ALLOWS...,
    +    closed_curve = false,
    +)

    Point is within a linearring if it is on a vertex or an edge of that ring.

    julia
    _within(
    +    ::GI.PointTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _point_curve_process(
    +    g1, g2;
    +    WITHIN_POINT_ALLOWS...,
    +    closed_curve = true,
    +)
    +
    +#= Point is within a polygon if it is inside of that polygon, excluding edges,
    +vertices, and holes. =#
    +_within(
    +    ::GI.PointTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _point_polygon_process(
    +    g1, g2;
    +    WITHIN_POINT_ALLOWS...,
    +    WITHIN_EXACT...,
    +)

    No geometries other than points can be within points

    julia
    _within(
    +    ::Union{GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    ::GI.PointTrait, g2,
    +) = false

    Lines within geometries

    julia
    #= Linestring is within another linestring if their interiors intersect and no
    +points of the first line are in the exterior of the second line. =#
    +_within(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    WITHIN_CURVE_ALLOWS...,
    +    WITHIN_REQUIRES...,
    +    WITHIN_EXACT...,
    +    closed_line = false,
    +    closed_curve = false,
    +)
    +
    +#= Linestring is within a linear ring if their interiors intersect and no points
    +of the line are in the exterior of the ring. =#
    +_within(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    WITHIN_CURVE_ALLOWS...,
    +    WITHIN_REQUIRES...,
    +    WITHIN_EXACT...,
    +    closed_line = false,
    +    closed_curve = true,
    +)
    +
    +#= Linestring is within a polygon if their interiors intersect and no points of
    +the line are in the exterior of the polygon, although they can be on an edge. =#
    +_within(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    WITHIN_POLYGON_ALLOWS...,
    +    WITHIN_REQUIRES...,
    +    WITHIN_EXACT...,
    +    closed_line = false,
    +)

    Rings covered by geometries

    julia
    #= Linearring is within a linestring if their interiors intersect and no points
    +of the ring are in the exterior of the line. =#
    +_within(
    +    ::GI.LinearRingTrait, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    WITHIN_CURVE_ALLOWS...,
    +    WITHIN_REQUIRES...,
    +    WITHIN_EXACT...,
    +    closed_line = true,
    +    closed_curve = false,
    +)
    +
    +#= Linearring is within another linearring if their interiors intersect and no
    +points of the first ring are in the exterior of the second ring. =#
    +_within(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    WITHIN_CURVE_ALLOWS...,
    +    WITHIN_REQUIRES...,
    +    WITHIN_EXACT...,
    +    closed_line = true,
    +    closed_curve = true,
    +)
    +
    +#= Linearring is within a polygon if their interiors intersect and no points of
    +the ring are in the exterior of the polygon, although they can be on an edge. =#
    +_within(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    WITHIN_POLYGON_ALLOWS...,
    +    WITHIN_REQUIRES...,
    +    WITHIN_EXACT...,
    +    closed_line = true,
    +)

    Polygons within geometries

    julia
    #= Polygon is within another polygon if the interior of the first polygon
    +intersects with the interior of the second and no points of the first polygon
    +are outside of the second polygon. =#
    +_within(
    +    ::GI.PolygonTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _polygon_polygon_process(
    +    g1, g2;
    +    WITHIN_POLYGON_ALLOWS...,
    +    WITHIN_REQUIRES...,
    +    WITHIN_EXACT...,
    +)

    Polygons cannot be within any curves

    julia
    _within(
    +    ::GI.PolygonTrait, g1,
    +    ::GI.AbstractCurveTrait, g2,
    +) = false

    Geometries within multi-geometry/geometry collections

    julia
    #= Geometry is within a multi-geometry or a collection if the geometry is within
    +at least one of the collection elements. =#
    +function _within(
    +    ::Union{GI.PointTrait, GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g2,
    +)
    +    for sub_g2 in GI.getgeom(g2)
    +        within(g1, sub_g2) && return true
    +    end
    +    return false
    +end

    Multi-geometry/geometry collections within geometries

    julia
    #= Multi-geometry or a geometry collection is within a geometry if all
    +elements of the collection are within the geometry. =#
    +function _within(
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g1,
    +    ::GI.AbstractGeometryTrait, g2,
    +)
    +    for sub_g1 in GI.getgeom(g1)
    +        !within(sub_g1, g2) && return false
    +    end
    +    return true
    +end

    This page was generated using Literate.jl.

    `,41)]))}const y=i(l,[["render",e]]);export{o as __pageData,y as default}; diff --git a/previews/PR239/assets/source_methods_orientation.md.Cx8oaEg5.js b/previews/PR239/assets/source_methods_orientation.md.Cx8oaEg5.js new file mode 100644 index 000000000..da812c3ed --- /dev/null +++ b/previews/PR239/assets/source_methods_orientation.md.Cx8oaEg5.js @@ -0,0 +1,100 @@ +import{_ as i,c as a,a5 as n,o as l}from"./chunks/framework.onQNwZ2I.js";const E=JSON.parse('{"title":"Orientation","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/orientation.md","filePath":"source/methods/orientation.md","lastUpdated":null}'),p={name:"source/methods/orientation.md"};function h(t,s,e,k,r,d){return l(),a("div",null,s[0]||(s[0]=[n(`

    Orientation

    julia
    export isclockwise, isconcave

    isclockwise

    The orientation of a geometry is whether it runs clockwise or counter-clockwise.

    This is defined for linestrings, linear rings, or vectors of points.

    isconcave

    A polygon is concave if it has at least one interior angle greater than 180 degrees, meaning that the interior of the polygon is not a convex set.

    These are all adapted from Turf.jl.

    The may not necessarily be what want in the end but work for now!

    julia
    """
    +    isclockwise(line::Union{LineString, Vector{Position}})::Bool
    +
    +Take a ring and return \`true\` if the line goes clockwise, or \`false\` if the line goes
    +counter-clockwise.  "Going clockwise" means, mathematically,
    +
    +\`\`\`math
    +\\\\left(\\\\sum_{i=2}^n (x_i - x_{i-1}) \\\\cdot (y_i + y_{i-1})\\\\right) > 0
    +\`\`\`
    +
    +# Example
    +
    +\`\`\`julia
    +julia> import GeoInterface as GI, GeometryOps as GO
    +julia> ring = GI.LinearRing([(0, 0), (1, 1), (1, 0), (0, 0)]);
    +julia> GO.isclockwise(ring)

    output

    julia
    true
    +\`\`\`
    +"""
    +isclockwise(geom)::Bool = isclockwise(GI.trait(geom), geom)
    +
    +function isclockwise(::AbstractCurveTrait, line)::Bool
    +    sum = 0.0
    +    prev = GI.getpoint(line, 1)
    +    for p in GI.getpoint(line)

    sum will be zero for the first point as x is subtracted from itself

    julia
            sum += (GI.x(p) - GI.x(prev)) * (GI.y(p) + GI.y(prev))
    +        prev = p
    +    end
    +
    +    return sum > 0.0
    +end
    +
    +"""
    +    isconcave(poly::Polygon)::Bool
    +
    +Take a polygon and return true or false as to whether it is concave or not.
    +
    +# Examples
    +\`\`\`jldoctest
    +import GeoInterface as GI, GeometryOps as GO
    +
    +poly = GI.Polygon([[(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)]])
    +GO.isconcave(poly)

    output

    julia
    false
    +\`\`\`
    +"""
    +function isconcave(poly)::Bool
    +    sign = false
    +
    +    exterior = GI.getexterior(poly)

    FIXME handle not closed polygons

    julia
        GI.npoint(exterior) <= 4 && return false
    +    n = GI.npoint(exterior) - 1
    +
    +    for i in 1:n
    +        j = ((i + 1) % n) === 0 ? 1 : (i + 1) % n
    +        m = ((i + 2) % n) === 0 ? 1 : (i + 2) % n
    +
    +        pti = GI.getpoint(exterior, i)
    +        ptj = GI.getpoint(exterior, j)
    +        ptm = GI.getpoint(exterior, m)
    +
    +        dx1 = GI.x(ptm) - GI.x(ptj)
    +        dy1 = GI.y(ptm) - GI.y(ptj)
    +        dx2 = GI.x(pti) - GI.x(ptj)
    +        dy2 = GI.y(pti) - GI.y(ptj)
    +
    +        cross = (dx1 * dy2) - (dy1 * dx2)
    +
    +        if i === 0
    +            sign = cross > 0
    +        elseif sign !== (cross > 0)
    +            return true
    +        end
    +    end
    +
    +    return false
    +end

    This is commented out.

    julia
    """
    +    isparallel(line1::LineString, line2::LineString)::Bool
    +
    +Return \`true\` if each segment of \`line1\` is parallel to the correspondent segment of \`line2\`
    +
    +## Examples

    julia import GeoInterface as GI, GeometryOps as GO julia> line1 = GI.LineString([(9.170356, 45.477985), (9.164434, 45.482551), (9.166644, 45.484003)]) GeoInterface.Wrappers.LineString{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(9.170356, 45.477985), (9.164434, 45.482551), (9.166644, 45.484003)], nothing, nothing)

    julia> line2 = GI.LineString([(9.169356, 45.477985), (9.163434, 45.482551), (9.165644, 45.484003)]) GeoInterface.Wrappers.LineString{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(9.169356, 45.477985), (9.163434, 45.482551), (9.165644, 45.484003)], nothing, nothing)

    julia> GO.isparallel(line1, line2) true

    """
    +function isparallel(line1, line2)::Bool
    +    seg1 = linesegment(line1)
    +    seg2 = linesegment(line2)
    +
    +    for i in eachindex(seg1)
    +        coors2 = nothing
    +        coors1 = seg1[i]
    +        coors2 = seg2[i]
    +        _isparallel(coors1, coors2) == false && return false
    +    end
    +    return true
    +end
    +
    +@inline function _isparallel(p1, p2)
    +    slope1 = bearing_to_azimuth(rhumb_bearing(GI.x(p1), GI.x(p2)))
    +    slope2 = bearing_to_azimuth(rhumb_bearing(GI.y(p1), GI.y(p2)))
    +
    +    return slope1 === slope2
    +end

    This is actual code:

    julia
    _isparallel(((ax, ay), (bx, by)), ((cx, cy), (dx, dy))) =
    +    _isparallel(bx - ax, by - ay, dx - cx, dy - cy)
    +
    +_isparallel(Δx1, Δy1, Δx2, Δy2) = (Δx1 * Δy2 == Δy1 * Δx2)

    This page was generated using Literate.jl.

    `,28)]))}const o=i(p,[["render",h]]);export{E as __pageData,o as default}; diff --git a/previews/PR239/assets/source_methods_orientation.md.Cx8oaEg5.lean.js b/previews/PR239/assets/source_methods_orientation.md.Cx8oaEg5.lean.js new file mode 100644 index 000000000..da812c3ed --- /dev/null +++ b/previews/PR239/assets/source_methods_orientation.md.Cx8oaEg5.lean.js @@ -0,0 +1,100 @@ +import{_ as i,c as a,a5 as n,o as l}from"./chunks/framework.onQNwZ2I.js";const E=JSON.parse('{"title":"Orientation","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/orientation.md","filePath":"source/methods/orientation.md","lastUpdated":null}'),p={name:"source/methods/orientation.md"};function h(t,s,e,k,r,d){return l(),a("div",null,s[0]||(s[0]=[n(`

    Orientation

    julia
    export isclockwise, isconcave

    isclockwise

    The orientation of a geometry is whether it runs clockwise or counter-clockwise.

    This is defined for linestrings, linear rings, or vectors of points.

    isconcave

    A polygon is concave if it has at least one interior angle greater than 180 degrees, meaning that the interior of the polygon is not a convex set.

    These are all adapted from Turf.jl.

    The may not necessarily be what want in the end but work for now!

    julia
    """
    +    isclockwise(line::Union{LineString, Vector{Position}})::Bool
    +
    +Take a ring and return \`true\` if the line goes clockwise, or \`false\` if the line goes
    +counter-clockwise.  "Going clockwise" means, mathematically,
    +
    +\`\`\`math
    +\\\\left(\\\\sum_{i=2}^n (x_i - x_{i-1}) \\\\cdot (y_i + y_{i-1})\\\\right) > 0
    +\`\`\`
    +
    +# Example
    +
    +\`\`\`julia
    +julia> import GeoInterface as GI, GeometryOps as GO
    +julia> ring = GI.LinearRing([(0, 0), (1, 1), (1, 0), (0, 0)]);
    +julia> GO.isclockwise(ring)

    output

    julia
    true
    +\`\`\`
    +"""
    +isclockwise(geom)::Bool = isclockwise(GI.trait(geom), geom)
    +
    +function isclockwise(::AbstractCurveTrait, line)::Bool
    +    sum = 0.0
    +    prev = GI.getpoint(line, 1)
    +    for p in GI.getpoint(line)

    sum will be zero for the first point as x is subtracted from itself

    julia
            sum += (GI.x(p) - GI.x(prev)) * (GI.y(p) + GI.y(prev))
    +        prev = p
    +    end
    +
    +    return sum > 0.0
    +end
    +
    +"""
    +    isconcave(poly::Polygon)::Bool
    +
    +Take a polygon and return true or false as to whether it is concave or not.
    +
    +# Examples
    +\`\`\`jldoctest
    +import GeoInterface as GI, GeometryOps as GO
    +
    +poly = GI.Polygon([[(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)]])
    +GO.isconcave(poly)

    output

    julia
    false
    +\`\`\`
    +"""
    +function isconcave(poly)::Bool
    +    sign = false
    +
    +    exterior = GI.getexterior(poly)

    FIXME handle not closed polygons

    julia
        GI.npoint(exterior) <= 4 && return false
    +    n = GI.npoint(exterior) - 1
    +
    +    for i in 1:n
    +        j = ((i + 1) % n) === 0 ? 1 : (i + 1) % n
    +        m = ((i + 2) % n) === 0 ? 1 : (i + 2) % n
    +
    +        pti = GI.getpoint(exterior, i)
    +        ptj = GI.getpoint(exterior, j)
    +        ptm = GI.getpoint(exterior, m)
    +
    +        dx1 = GI.x(ptm) - GI.x(ptj)
    +        dy1 = GI.y(ptm) - GI.y(ptj)
    +        dx2 = GI.x(pti) - GI.x(ptj)
    +        dy2 = GI.y(pti) - GI.y(ptj)
    +
    +        cross = (dx1 * dy2) - (dy1 * dx2)
    +
    +        if i === 0
    +            sign = cross > 0
    +        elseif sign !== (cross > 0)
    +            return true
    +        end
    +    end
    +
    +    return false
    +end

    This is commented out.

    julia
    """
    +    isparallel(line1::LineString, line2::LineString)::Bool
    +
    +Return \`true\` if each segment of \`line1\` is parallel to the correspondent segment of \`line2\`
    +
    +## Examples

    julia import GeoInterface as GI, GeometryOps as GO julia> line1 = GI.LineString([(9.170356, 45.477985), (9.164434, 45.482551), (9.166644, 45.484003)]) GeoInterface.Wrappers.LineString{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(9.170356, 45.477985), (9.164434, 45.482551), (9.166644, 45.484003)], nothing, nothing)

    julia> line2 = GI.LineString([(9.169356, 45.477985), (9.163434, 45.482551), (9.165644, 45.484003)]) GeoInterface.Wrappers.LineString{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(9.169356, 45.477985), (9.163434, 45.482551), (9.165644, 45.484003)], nothing, nothing)

    julia> GO.isparallel(line1, line2) true

    """
    +function isparallel(line1, line2)::Bool
    +    seg1 = linesegment(line1)
    +    seg2 = linesegment(line2)
    +
    +    for i in eachindex(seg1)
    +        coors2 = nothing
    +        coors1 = seg1[i]
    +        coors2 = seg2[i]
    +        _isparallel(coors1, coors2) == false && return false
    +    end
    +    return true
    +end
    +
    +@inline function _isparallel(p1, p2)
    +    slope1 = bearing_to_azimuth(rhumb_bearing(GI.x(p1), GI.x(p2)))
    +    slope2 = bearing_to_azimuth(rhumb_bearing(GI.y(p1), GI.y(p2)))
    +
    +    return slope1 === slope2
    +end

    This is actual code:

    julia
    _isparallel(((ax, ay), (bx, by)), ((cx, cy), (dx, dy))) =
    +    _isparallel(bx - ax, by - ay, dx - cx, dy - cy)
    +
    +_isparallel(Δx1, Δy1, Δx2, Δy2) = (Δx1 * Δy2 == Δy1 * Δx2)

    This page was generated using Literate.jl.

    `,28)]))}const o=i(p,[["render",h]]);export{E as __pageData,o as default}; diff --git a/previews/PR239/assets/source_methods_polygonize.md.CCOlggGo.js b/previews/PR239/assets/source_methods_polygonize.md.CCOlggGo.js new file mode 100644 index 000000000..19c0c3b97 --- /dev/null +++ b/previews/PR239/assets/source_methods_polygonize.md.CCOlggGo.js @@ -0,0 +1,289 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"Polygonizing raster data","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/polygonize.md","filePath":"source/methods/polygonize.md","lastUpdated":null}'),l={name:"source/methods/polygonize.md"};function p(t,s,k,e,d,E){return h(),a("div",null,s[0]||(s[0]=[n(`

    Polygonizing raster data

    julia
    export polygonize
    +
    +#=
    +The methods in this file convert a raster image into a set of polygons,
    +by contour detection using a clockwise Moore neighborhood method.
    +
    +The resulting polygons are snapped to the boundaries of the cells of the input raster,
    +so they will look different from traditional contours from a plotting package.
    +
    +The main entry point is the \`polygonize\` function.
    +
    +\`\`\`@docs
    +polygonize
    +\`\`\`
    +
    +# Example
    +
    +Here's a basic example, using the \`Makie.peaks()\` function.  First, let's investigate the nature of the function:
    +\`\`\`@example polygonize
    +using Makie, GeometryOps
    +n = 49
    +xs, ys = LinRange(-3, 3, n), LinRange(-3, 3, n)
    +zs = Makie.peaks(n)
    +z_max_value = maximum(abs.(extrema(zs)))
    +f, a, p = heatmap(
    +    xs, ys, zs;
    +    axis = (; aspect = DataAspect(), title = "Exact function")
    +)
    +cb = Colorbar(f[1, 2], p; label = "Z-value")
    +f
    +\`\`\`
    +
    +Now, we can use the \`polygonize\` function to convert the raster data into polygons.
    +
    +For this particular example, we chose a range of z-values between 0.8 and 3.2,
    +which would provide two distinct polygons with holes.
    +
    +\`\`\`@example polygonize
    +polygons = polygonize(xs, ys, 0.8 .< zs .< 3.2)
    +\`\`\`
    +This returns a \`GI.MultiPolygon\`, which is directly plottable.  Let's see how these look:
    +
    +\`\`\`@example polygonize
    +f, a, p = poly(polygons; label = "Polygonized polygons", axis = (; aspect = DataAspect()))
    +\`\`\`
    +
    +Finally, let's plot the Makie contour lines on top, to see how the polygonization compares:
    +\`\`\`@example polygonize
    +contour!(a, xs, ys, zs; labels = true, levels = [0.8, 3.2], label = "Contour lines")
    +f
    +\`\`\`
    +
    +# Implementation
    +
    +The implementation follows:
    +=#
    +
    +"""
    +    polygonize(A::AbstractMatrix{Bool}; kw...)
    +    polygonize(f, A::AbstractMatrix; kw...)
    +    polygonize(xs, ys, A::AbstractMatrix{Bool}; kw...)
    +    polygonize(f, xs, ys, A::AbstractMatrix; kw...)
    +
    +Polygonize an \`AbstractMatrix\` of values, currently to a single class of polygons.
    +
    +Returns a \`MultiPolygon\` for \`Bool\` values and \`f\` return values, and
    +a \`FeatureCollection\` of \`Feature\`s holding \`MultiPolygon\` for all other values.
    +
    +
    +Function \`f\` should return either \`true\` or \`false\` or a transformation
    +of values into simpler groups, especially useful for floating point arrays.
    +
    +If \`xs\` and \`ys\` are ranges, they are used as the pixel/cell center points.
    +If they are \`Vector\` of \`Tuple\` they are used as the lower and upper bounds of each pixel/cell.

    Keywords

    julia
    - \`minpoints\`: ignore polygons with less than \`minpoints\` points.
    +- \`values\`: the values to turn into polygons. By default these are \`union(A)\`,
    +    If function \`f\` is passed these refer to the return values of \`f\`, by
    +    default \`union(map(f, A)\`. If values \`Bool\`, false is ignored and a single
    +    \`MultiPolygon\` is returned rather than a \`FeatureCollection\`.

    Example

    julia
    \`\`\`julia
    +using GeometryOps
    +A = rand(100, 100)
    +multipolygon = polygonize(>(0.5), A);
    +\`\`\`
    +"""
    +polygonize(A::AbstractMatrix{Bool}; kw...) = polygonize(identity, A; kw...)
    +polygonize(f::Base.Callable, A::AbstractMatrix; kw...) = polygonize(f, axes(A)..., A; kw...)
    +polygonize(A::AbstractMatrix; kw...) = polygonize(axes(A)..., A; kw...)
    +polygonize(xs::AbstractVector, ys::AbstractVector, A::AbstractMatrix{Bool}; kw...) =
    +    _polygonize(identity, xs, ys, A)
    +function polygonize(xs::AbstractVector, ys::AbstractVector, A::AbstractMatrix;
    +    values=sort!(Base.union(A)), kw...
    +)
    +    _polygonize_featurecollection(identity, xs, ys, A; values, kw...)
    +end
    +function polygonize(f::Base.Callable, xs::AbstractRange, ys::AbstractRange, A::AbstractMatrix;
    +    values=_default_values(f, A), kw...
    +)
    +    if isnothing(values)
    +        _polygonize(f, xs, ys, A; kw...)
    +    else
    +        _polygonize_featurecollection(f, xs, ys, A; kw...)
    +    end
    +end
    +function _polygonize(f::Base.Callable, xs::AbstractRange, ys::AbstractRange, A::AbstractMatrix;
    +    kw...
    +)

    Make vectors of pixel bounds

    julia
        xhalf = step(xs) / 2
    +    yhalf = step(ys) / 2

    Make bounds ranges first to avoid floating point error making gaps or overlaps

    julia
        xbounds = range(first(xs) - xhalf; step = step(xs), length = length(xs) + 1)
    +    ybounds = range(first(ys) - yhalf; step = step(ys), length = length(ys) + 1)
    +    Tx = eltype(xbounds)
    +    Ty = eltype(ybounds)
    +    xvec = similar(Vector{Tuple{Tx,Tx}}, length(xs))
    +    yvec = similar(Vector{Tuple{Ty,Ty}}, length(ys))
    +    for (xind, i) in enumerate(eachindex(xvec))
    +        xvec[i] = xbounds[xind], xbounds[xind+1]
    +    end
    +    for (yind, i) in enumerate(eachindex(yvec))
    +        yvec[i] = ybounds[yind], ybounds[yind+1]
    +    end
    +    return _polygonize(f, xvec, yvec, A; kw...)
    +end
    +function _polygonize(f, xs::AbstractVector{T}, ys::AbstractVector{T}, A::AbstractMatrix;
    +    minpoints=0,
    +) where T<:Tuple
    +    (length(xs), length(ys)) == size(A) || throw(ArgumentError("length of xs and ys must match the array size"))

    Extract the CRS of the array (if it is some kind of geo array / raster)

    julia
        crs = GI.crs(A)

    Define buffers for edges and rings

    julia
        rings = Vector{T}[]
    +
    +    strait = true
    +    turning = false

    Get edges from the array A

    julia
        edges = _pixel_edges(f, xs, ys, A)

    Keep dict keys separately in a vector for performance

    julia
        edgekeys = collect(keys(edges))

    We don't delete keys we just reduce length with nkeys

    julia
        nkeys = length(edgekeys)

    Now create rings from the edges, looping until there are no edge keys left

    julia
        while nkeys > 0
    +        found = false
    +        local firstnode, nextnodes, nodestatus

    Loop until we find a key that hasn't been removed, decrementing nkeys as we go.

    julia
            while nkeys > 0

    Take the first node from the array

    julia
                firstnode::T = edgekeys[nkeys]
    +            nextnodes = edges[firstnode]
    +            nodestatus = map(!=(typemax(first(firstnode)))  first, nextnodes)
    +            if any(nodestatus)
    +                found = true
    +                break
    +            else
    +                nkeys -= 1
    +            end
    +        end

    If we found nothing this time, we are done

    julia
            found == false && break

    Check if there are one or two lines going through this node and take one of them, then update the status

    julia
            if nodestatus[2]
    +            nextnode = nextnodes[2]
    +            edges[firstnode] = (nextnodes[1], map(typemax, nextnode))
    +        else
    +            nkeys -= 1
    +            nextnode = nextnodes[1]
    +            edges[firstnode] = (map(typemax, nextnode), map(typemax, nextnode))
    +        end

    Start a new ring

    julia
            currentnode = firstnode
    +        ring = [currentnode, nextnode]
    +        push!(rings, ring)

    Loop until we close a the ring and break

    julia
            while true

    Find a node that matches the next node

    julia
                (c1, c2) = possiblenodes = edges[nextnode]
    +            nodestatus = map(!=(typemax(first(firstnode)))  first, possiblenodes)
    +            if nodestatus[2]

    When there are two possible node, choose the node that is the furthest to the left We also need to check if we are on a straight line to avoid adding unnecessary points.

    julia
                    selectednode, remainingnode, straightline = if currentnode[1] == nextnode[1] # vertical
    +                    wasincreasing = nextnode[2] > currentnode[2]
    +                    firstisstraight = nextnode[1] == c1[1]
    +                    firstisleft = nextnode[1] > c1[1]
    +                    secondisstraight = nextnode[1] == c2[1]
    +                    secondisleft = nextnode[1] > c2[1]
    +                    if firstisstraight
    +                        if secondisleft
    +                            if wasincreasing
    +                                (c2, c1, turning)
    +                            else
    +                                (c1, c2, straight)
    +                            end
    +                        else
    +                            if wasincreasing
    +                                (c1, c2, straight)
    +                            else
    +                                (c2, c1, secondisstraight)
    +                            end
    +                        end
    +                    elseif firstisleft
    +                        if wasincreasing
    +                            (c1, c2, turning)
    +                        else
    +                            (c2, c1, secondisstraight)
    +                        end
    +                    else # firstisright
    +                        if wasincreasing
    +                            (c2, c1, secondisstraight)
    +                        else
    +                            (c1, c2, turning)
    +                        end
    +                    end
    +                else # horizontal
    +                    wasincreasing = nextnode[1] > currentnode[1]
    +                    firstisstraight = nextnode[2] == c1[2]
    +                    firstisleft = nextnode[2] > c1[2]
    +                    secondisleft = nextnode[2] > c2[2]
    +                    secondisstraight = nextnode[2] == c2[2]
    +                    if firstisstraight
    +                        if secondisleft
    +                            if wasincreasing
    +                                (c1, c2, straight)
    +                            else
    +                                (c2, c1, turning)
    +                            end
    +                        else
    +                            if wasincreasing
    +                                (c2, c1, turning)
    +                            else
    +                                (c1, c2, straight)
    +                            end
    +                        end
    +                    elseif firstisleft
    +                        if wasincreasing
    +                            (c2, c1, secondisstraight)
    +                        else
    +                            (c1, c2, turning)
    +                        end
    +                    else # firstisright
    +                        if wasincreasing
    +                            (c1, c2, turning)
    +                        else
    +                            (c2, c1, secondisstraight)
    +                        end
    +                    end
    +                end

    Update edges

    julia
                    edges[nextnode] = (remainingnode, map(typemax, remainingnode))
    +            else

    Here we simply choose the first (and only valid) node

    julia
                    selectednode = c1

    Replace the edge nodes with empty nodes, they will be skipped later

    julia
                    edges[nextnode] = (map(typemax, c1), map(typemax, c1))

    Check if we are on a straight line

    julia
                    straightline = currentnode[1] == nextnode[1] == c1[1] ||
    +                               currentnode[2] == nextnode[2] == c1[2]
    +            end

    Update the current and next nodes with the next and selected nodes

    julia
                currentnode, nextnode = nextnode, selectednode

    Update the current node or add a new node to the ring

    julia
                if straightline

    replace the last node we don't need it

    julia
                    ring[end] = nextnode
    +            else

    add a new node, we have turned a corner

    julia
                    push!(ring, nextnode)
    +            end

    If the ring is closed, break the loop and start a new one

    julia
                nextnode == firstnode && break
    +        end
    +    end

    Define wrapped LinearRings, with embedded extents so we only calculate them once

    julia
        linearrings = map(rings) do ring
    +        extent = GI.extent(GI.LinearRing(ring))
    +        GI.LinearRing(ring; extent, crs)
    +    end

    Separate exteriors from holes by winding direction

    julia
        direction = (last(last(xs)) - first(first(xs))) * (last(last(ys)) - first(first(ys)))
    +    exterior_inds = if direction > 0
    +        .!isclockwise.(linearrings)
    +    else
    +        isclockwise.(linearrings)
    +    end
    +    holes = linearrings[.!exterior_inds]
    +    polygons = map(view(linearrings, exterior_inds)) do lr
    +        GI.Polygon([lr]; extent=GI.extent(lr), crs)
    +    end

    Then we add the holes to the polygons they are inside of

    julia
        assigned = fill(false, length(holes))
    +    for i in eachindex(holes)
    +        hole = holes[i]
    +        prepared_hole = GI.LinearRing(holes[i]; extent=GI.extent(holes[i]))
    +        for poly in polygons
    +            exterior = GI.Polygon(StaticArrays.SVector(GI.getexterior(poly)); extent=GI.extent(poly))
    +            if covers(exterior, prepared_hole)

    Hole is in the exterior, so add it to the polygon

    julia
                    push!(poly.geom, hole)
    +                assigned[i] = true
    +                break
    +            end
    +        end
    +    end
    +
    +    assigned_holes = count(assigned)
    +    assigned_holes == length(holes) || @warn "Not all holes were assigned to polygons, $(length(holes) - assigned_holes) where missed from $(length(holes)) holes and $(length(polygons)) polygons"
    +
    +    if isempty(polygons)

    TODO: this really should return an empty MultiPolygon but GeoInterface wrappers cant do that yet, which is not ideal...

    julia
            @warn "No polgons found, check your data or try another function for \`f\`"
    +        return nothing
    +    else

    Otherwise return a wrapped MultiPolygon

    julia
            return GI.MultiPolygon(polygons; crs, extent = mapreduce(GI.extent, Extents.union, polygons))
    +    end
    +end
    +
    +function _polygonize_featurecollection(f::Base.Callable, xs::AbstractRange, ys::AbstractRange, A::AbstractMatrix;
    +    values=_default_values(f, A), kw...
    +)
    +    crs = GI.crs(A)

    Create one feature per value

    julia
        features = map(values) do value
    +        multipolygon = _polygonize(x -> isequal(f(x), value), xs, ys, A; kw...)
    +        GI.Feature(multipolygon; properties=(; value), extent = GI.extent(multipolygon), crs)
    +    end
    +
    +    return GI.FeatureCollection(features; extent = mapreduce(GI.extent, Extents.union, features), crs)
    +end
    +
    +function _default_values(f, A)

    Get union of f return values with resolved eltype

    julia
        values = map(identity, sort!(Base.union(Iterators.map(f, A))))

    We ignore pure Bool

    julia
        return eltype(values) == Bool ? nothing : collect(skipmissing(values))
    +end
    +
    +function update_edge!(dict, key, node)
    +    newnodes = (node, map(typemax, node))

    Get or write in one go, to skip a hash lookup

    julia
        existingnodes = get!(() -> newnodes, dict, key)

    If we actually fetched an existing node, update it

    julia
        if existingnodes[1] != node
    +        dict[key] = (existingnodes[1], node)
    +    end
    +end
    +
    +function _pixel_edges(f, xs::AbstractVector{T}, ys::AbstractVector{T}, A) where T<:Tuple
    +    edges = Dict{T,Tuple{T,T}}()

    First we collect all the edges around target pixels

    julia
        fi, fj = map(first, axes(A))
    +    li, lj = map(last, axes(A))
    +    for j in axes(A, 2)
    +        y1, y2 = ys[j]
    +        for i in axes(A, 1)
    +            if f(A[i, j]) # This is a pixel inside a polygon

    xs and ys hold pixel bounds

    julia
                    x1, x2 = xs[i]

    We check the Von Neumann neighborhood to decide what edges are needed, if any.

    julia
                    (j == fi || !f(A[i, j-1])) && update_edge!(edges, (x1, y1), (x2, y1)) # S
    +                (i == fj || !f(A[i-1, j])) && update_edge!(edges, (x1, y2), (x1, y1)) # W
    +                (j == lj || !f(A[i, j+1])) && update_edge!(edges, (x2, y2), (x1, y2)) # N
    +                (i == li || !f(A[i+1, j])) && update_edge!(edges, (x2, y1), (x2, y2)) # E
    +            end
    +        end
    +    end
    +    return edges
    +end

    This page was generated using Literate.jl.

    `,86)]))}const y=i(l,[["render",p]]);export{g as __pageData,y as default}; diff --git a/previews/PR239/assets/source_methods_polygonize.md.CCOlggGo.lean.js b/previews/PR239/assets/source_methods_polygonize.md.CCOlggGo.lean.js new file mode 100644 index 000000000..19c0c3b97 --- /dev/null +++ b/previews/PR239/assets/source_methods_polygonize.md.CCOlggGo.lean.js @@ -0,0 +1,289 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"Polygonizing raster data","description":"","frontmatter":{},"headers":[],"relativePath":"source/methods/polygonize.md","filePath":"source/methods/polygonize.md","lastUpdated":null}'),l={name:"source/methods/polygonize.md"};function p(t,s,k,e,d,E){return h(),a("div",null,s[0]||(s[0]=[n(`

    Polygonizing raster data

    julia
    export polygonize
    +
    +#=
    +The methods in this file convert a raster image into a set of polygons,
    +by contour detection using a clockwise Moore neighborhood method.
    +
    +The resulting polygons are snapped to the boundaries of the cells of the input raster,
    +so they will look different from traditional contours from a plotting package.
    +
    +The main entry point is the \`polygonize\` function.
    +
    +\`\`\`@docs
    +polygonize
    +\`\`\`
    +
    +# Example
    +
    +Here's a basic example, using the \`Makie.peaks()\` function.  First, let's investigate the nature of the function:
    +\`\`\`@example polygonize
    +using Makie, GeometryOps
    +n = 49
    +xs, ys = LinRange(-3, 3, n), LinRange(-3, 3, n)
    +zs = Makie.peaks(n)
    +z_max_value = maximum(abs.(extrema(zs)))
    +f, a, p = heatmap(
    +    xs, ys, zs;
    +    axis = (; aspect = DataAspect(), title = "Exact function")
    +)
    +cb = Colorbar(f[1, 2], p; label = "Z-value")
    +f
    +\`\`\`
    +
    +Now, we can use the \`polygonize\` function to convert the raster data into polygons.
    +
    +For this particular example, we chose a range of z-values between 0.8 and 3.2,
    +which would provide two distinct polygons with holes.
    +
    +\`\`\`@example polygonize
    +polygons = polygonize(xs, ys, 0.8 .< zs .< 3.2)
    +\`\`\`
    +This returns a \`GI.MultiPolygon\`, which is directly plottable.  Let's see how these look:
    +
    +\`\`\`@example polygonize
    +f, a, p = poly(polygons; label = "Polygonized polygons", axis = (; aspect = DataAspect()))
    +\`\`\`
    +
    +Finally, let's plot the Makie contour lines on top, to see how the polygonization compares:
    +\`\`\`@example polygonize
    +contour!(a, xs, ys, zs; labels = true, levels = [0.8, 3.2], label = "Contour lines")
    +f
    +\`\`\`
    +
    +# Implementation
    +
    +The implementation follows:
    +=#
    +
    +"""
    +    polygonize(A::AbstractMatrix{Bool}; kw...)
    +    polygonize(f, A::AbstractMatrix; kw...)
    +    polygonize(xs, ys, A::AbstractMatrix{Bool}; kw...)
    +    polygonize(f, xs, ys, A::AbstractMatrix; kw...)
    +
    +Polygonize an \`AbstractMatrix\` of values, currently to a single class of polygons.
    +
    +Returns a \`MultiPolygon\` for \`Bool\` values and \`f\` return values, and
    +a \`FeatureCollection\` of \`Feature\`s holding \`MultiPolygon\` for all other values.
    +
    +
    +Function \`f\` should return either \`true\` or \`false\` or a transformation
    +of values into simpler groups, especially useful for floating point arrays.
    +
    +If \`xs\` and \`ys\` are ranges, they are used as the pixel/cell center points.
    +If they are \`Vector\` of \`Tuple\` they are used as the lower and upper bounds of each pixel/cell.

    Keywords

    julia
    - \`minpoints\`: ignore polygons with less than \`minpoints\` points.
    +- \`values\`: the values to turn into polygons. By default these are \`union(A)\`,
    +    If function \`f\` is passed these refer to the return values of \`f\`, by
    +    default \`union(map(f, A)\`. If values \`Bool\`, false is ignored and a single
    +    \`MultiPolygon\` is returned rather than a \`FeatureCollection\`.

    Example

    julia
    \`\`\`julia
    +using GeometryOps
    +A = rand(100, 100)
    +multipolygon = polygonize(>(0.5), A);
    +\`\`\`
    +"""
    +polygonize(A::AbstractMatrix{Bool}; kw...) = polygonize(identity, A; kw...)
    +polygonize(f::Base.Callable, A::AbstractMatrix; kw...) = polygonize(f, axes(A)..., A; kw...)
    +polygonize(A::AbstractMatrix; kw...) = polygonize(axes(A)..., A; kw...)
    +polygonize(xs::AbstractVector, ys::AbstractVector, A::AbstractMatrix{Bool}; kw...) =
    +    _polygonize(identity, xs, ys, A)
    +function polygonize(xs::AbstractVector, ys::AbstractVector, A::AbstractMatrix;
    +    values=sort!(Base.union(A)), kw...
    +)
    +    _polygonize_featurecollection(identity, xs, ys, A; values, kw...)
    +end
    +function polygonize(f::Base.Callable, xs::AbstractRange, ys::AbstractRange, A::AbstractMatrix;
    +    values=_default_values(f, A), kw...
    +)
    +    if isnothing(values)
    +        _polygonize(f, xs, ys, A; kw...)
    +    else
    +        _polygonize_featurecollection(f, xs, ys, A; kw...)
    +    end
    +end
    +function _polygonize(f::Base.Callable, xs::AbstractRange, ys::AbstractRange, A::AbstractMatrix;
    +    kw...
    +)

    Make vectors of pixel bounds

    julia
        xhalf = step(xs) / 2
    +    yhalf = step(ys) / 2

    Make bounds ranges first to avoid floating point error making gaps or overlaps

    julia
        xbounds = range(first(xs) - xhalf; step = step(xs), length = length(xs) + 1)
    +    ybounds = range(first(ys) - yhalf; step = step(ys), length = length(ys) + 1)
    +    Tx = eltype(xbounds)
    +    Ty = eltype(ybounds)
    +    xvec = similar(Vector{Tuple{Tx,Tx}}, length(xs))
    +    yvec = similar(Vector{Tuple{Ty,Ty}}, length(ys))
    +    for (xind, i) in enumerate(eachindex(xvec))
    +        xvec[i] = xbounds[xind], xbounds[xind+1]
    +    end
    +    for (yind, i) in enumerate(eachindex(yvec))
    +        yvec[i] = ybounds[yind], ybounds[yind+1]
    +    end
    +    return _polygonize(f, xvec, yvec, A; kw...)
    +end
    +function _polygonize(f, xs::AbstractVector{T}, ys::AbstractVector{T}, A::AbstractMatrix;
    +    minpoints=0,
    +) where T<:Tuple
    +    (length(xs), length(ys)) == size(A) || throw(ArgumentError("length of xs and ys must match the array size"))

    Extract the CRS of the array (if it is some kind of geo array / raster)

    julia
        crs = GI.crs(A)

    Define buffers for edges and rings

    julia
        rings = Vector{T}[]
    +
    +    strait = true
    +    turning = false

    Get edges from the array A

    julia
        edges = _pixel_edges(f, xs, ys, A)

    Keep dict keys separately in a vector for performance

    julia
        edgekeys = collect(keys(edges))

    We don't delete keys we just reduce length with nkeys

    julia
        nkeys = length(edgekeys)

    Now create rings from the edges, looping until there are no edge keys left

    julia
        while nkeys > 0
    +        found = false
    +        local firstnode, nextnodes, nodestatus

    Loop until we find a key that hasn't been removed, decrementing nkeys as we go.

    julia
            while nkeys > 0

    Take the first node from the array

    julia
                firstnode::T = edgekeys[nkeys]
    +            nextnodes = edges[firstnode]
    +            nodestatus = map(!=(typemax(first(firstnode)))  first, nextnodes)
    +            if any(nodestatus)
    +                found = true
    +                break
    +            else
    +                nkeys -= 1
    +            end
    +        end

    If we found nothing this time, we are done

    julia
            found == false && break

    Check if there are one or two lines going through this node and take one of them, then update the status

    julia
            if nodestatus[2]
    +            nextnode = nextnodes[2]
    +            edges[firstnode] = (nextnodes[1], map(typemax, nextnode))
    +        else
    +            nkeys -= 1
    +            nextnode = nextnodes[1]
    +            edges[firstnode] = (map(typemax, nextnode), map(typemax, nextnode))
    +        end

    Start a new ring

    julia
            currentnode = firstnode
    +        ring = [currentnode, nextnode]
    +        push!(rings, ring)

    Loop until we close a the ring and break

    julia
            while true

    Find a node that matches the next node

    julia
                (c1, c2) = possiblenodes = edges[nextnode]
    +            nodestatus = map(!=(typemax(first(firstnode)))  first, possiblenodes)
    +            if nodestatus[2]

    When there are two possible node, choose the node that is the furthest to the left We also need to check if we are on a straight line to avoid adding unnecessary points.

    julia
                    selectednode, remainingnode, straightline = if currentnode[1] == nextnode[1] # vertical
    +                    wasincreasing = nextnode[2] > currentnode[2]
    +                    firstisstraight = nextnode[1] == c1[1]
    +                    firstisleft = nextnode[1] > c1[1]
    +                    secondisstraight = nextnode[1] == c2[1]
    +                    secondisleft = nextnode[1] > c2[1]
    +                    if firstisstraight
    +                        if secondisleft
    +                            if wasincreasing
    +                                (c2, c1, turning)
    +                            else
    +                                (c1, c2, straight)
    +                            end
    +                        else
    +                            if wasincreasing
    +                                (c1, c2, straight)
    +                            else
    +                                (c2, c1, secondisstraight)
    +                            end
    +                        end
    +                    elseif firstisleft
    +                        if wasincreasing
    +                            (c1, c2, turning)
    +                        else
    +                            (c2, c1, secondisstraight)
    +                        end
    +                    else # firstisright
    +                        if wasincreasing
    +                            (c2, c1, secondisstraight)
    +                        else
    +                            (c1, c2, turning)
    +                        end
    +                    end
    +                else # horizontal
    +                    wasincreasing = nextnode[1] > currentnode[1]
    +                    firstisstraight = nextnode[2] == c1[2]
    +                    firstisleft = nextnode[2] > c1[2]
    +                    secondisleft = nextnode[2] > c2[2]
    +                    secondisstraight = nextnode[2] == c2[2]
    +                    if firstisstraight
    +                        if secondisleft
    +                            if wasincreasing
    +                                (c1, c2, straight)
    +                            else
    +                                (c2, c1, turning)
    +                            end
    +                        else
    +                            if wasincreasing
    +                                (c2, c1, turning)
    +                            else
    +                                (c1, c2, straight)
    +                            end
    +                        end
    +                    elseif firstisleft
    +                        if wasincreasing
    +                            (c2, c1, secondisstraight)
    +                        else
    +                            (c1, c2, turning)
    +                        end
    +                    else # firstisright
    +                        if wasincreasing
    +                            (c1, c2, turning)
    +                        else
    +                            (c2, c1, secondisstraight)
    +                        end
    +                    end
    +                end

    Update edges

    julia
                    edges[nextnode] = (remainingnode, map(typemax, remainingnode))
    +            else

    Here we simply choose the first (and only valid) node

    julia
                    selectednode = c1

    Replace the edge nodes with empty nodes, they will be skipped later

    julia
                    edges[nextnode] = (map(typemax, c1), map(typemax, c1))

    Check if we are on a straight line

    julia
                    straightline = currentnode[1] == nextnode[1] == c1[1] ||
    +                               currentnode[2] == nextnode[2] == c1[2]
    +            end

    Update the current and next nodes with the next and selected nodes

    julia
                currentnode, nextnode = nextnode, selectednode

    Update the current node or add a new node to the ring

    julia
                if straightline

    replace the last node we don't need it

    julia
                    ring[end] = nextnode
    +            else

    add a new node, we have turned a corner

    julia
                    push!(ring, nextnode)
    +            end

    If the ring is closed, break the loop and start a new one

    julia
                nextnode == firstnode && break
    +        end
    +    end

    Define wrapped LinearRings, with embedded extents so we only calculate them once

    julia
        linearrings = map(rings) do ring
    +        extent = GI.extent(GI.LinearRing(ring))
    +        GI.LinearRing(ring; extent, crs)
    +    end

    Separate exteriors from holes by winding direction

    julia
        direction = (last(last(xs)) - first(first(xs))) * (last(last(ys)) - first(first(ys)))
    +    exterior_inds = if direction > 0
    +        .!isclockwise.(linearrings)
    +    else
    +        isclockwise.(linearrings)
    +    end
    +    holes = linearrings[.!exterior_inds]
    +    polygons = map(view(linearrings, exterior_inds)) do lr
    +        GI.Polygon([lr]; extent=GI.extent(lr), crs)
    +    end

    Then we add the holes to the polygons they are inside of

    julia
        assigned = fill(false, length(holes))
    +    for i in eachindex(holes)
    +        hole = holes[i]
    +        prepared_hole = GI.LinearRing(holes[i]; extent=GI.extent(holes[i]))
    +        for poly in polygons
    +            exterior = GI.Polygon(StaticArrays.SVector(GI.getexterior(poly)); extent=GI.extent(poly))
    +            if covers(exterior, prepared_hole)

    Hole is in the exterior, so add it to the polygon

    julia
                    push!(poly.geom, hole)
    +                assigned[i] = true
    +                break
    +            end
    +        end
    +    end
    +
    +    assigned_holes = count(assigned)
    +    assigned_holes == length(holes) || @warn "Not all holes were assigned to polygons, $(length(holes) - assigned_holes) where missed from $(length(holes)) holes and $(length(polygons)) polygons"
    +
    +    if isempty(polygons)

    TODO: this really should return an empty MultiPolygon but GeoInterface wrappers cant do that yet, which is not ideal...

    julia
            @warn "No polgons found, check your data or try another function for \`f\`"
    +        return nothing
    +    else

    Otherwise return a wrapped MultiPolygon

    julia
            return GI.MultiPolygon(polygons; crs, extent = mapreduce(GI.extent, Extents.union, polygons))
    +    end
    +end
    +
    +function _polygonize_featurecollection(f::Base.Callable, xs::AbstractRange, ys::AbstractRange, A::AbstractMatrix;
    +    values=_default_values(f, A), kw...
    +)
    +    crs = GI.crs(A)

    Create one feature per value

    julia
        features = map(values) do value
    +        multipolygon = _polygonize(x -> isequal(f(x), value), xs, ys, A; kw...)
    +        GI.Feature(multipolygon; properties=(; value), extent = GI.extent(multipolygon), crs)
    +    end
    +
    +    return GI.FeatureCollection(features; extent = mapreduce(GI.extent, Extents.union, features), crs)
    +end
    +
    +function _default_values(f, A)

    Get union of f return values with resolved eltype

    julia
        values = map(identity, sort!(Base.union(Iterators.map(f, A))))

    We ignore pure Bool

    julia
        return eltype(values) == Bool ? nothing : collect(skipmissing(values))
    +end
    +
    +function update_edge!(dict, key, node)
    +    newnodes = (node, map(typemax, node))

    Get or write in one go, to skip a hash lookup

    julia
        existingnodes = get!(() -> newnodes, dict, key)

    If we actually fetched an existing node, update it

    julia
        if existingnodes[1] != node
    +        dict[key] = (existingnodes[1], node)
    +    end
    +end
    +
    +function _pixel_edges(f, xs::AbstractVector{T}, ys::AbstractVector{T}, A) where T<:Tuple
    +    edges = Dict{T,Tuple{T,T}}()

    First we collect all the edges around target pixels

    julia
        fi, fj = map(first, axes(A))
    +    li, lj = map(last, axes(A))
    +    for j in axes(A, 2)
    +        y1, y2 = ys[j]
    +        for i in axes(A, 1)
    +            if f(A[i, j]) # This is a pixel inside a polygon

    xs and ys hold pixel bounds

    julia
                    x1, x2 = xs[i]

    We check the Von Neumann neighborhood to decide what edges are needed, if any.

    julia
                    (j == fi || !f(A[i, j-1])) && update_edge!(edges, (x1, y1), (x2, y1)) # S
    +                (i == fj || !f(A[i-1, j])) && update_edge!(edges, (x1, y2), (x1, y1)) # W
    +                (j == lj || !f(A[i, j+1])) && update_edge!(edges, (x2, y2), (x1, y2)) # N
    +                (i == li || !f(A[i+1, j])) && update_edge!(edges, (x2, y1), (x2, y2)) # E
    +            end
    +        end
    +    end
    +    return edges
    +end

    This page was generated using Literate.jl.

    `,86)]))}const y=i(l,[["render",p]]);export{g as __pageData,y as default}; diff --git a/previews/PR239/assets/source_not_implemented_yet.md.BRH4xbkQ.js b/previews/PR239/assets/source_not_implemented_yet.md.BRH4xbkQ.js new file mode 100644 index 000000000..9f702e26d --- /dev/null +++ b/previews/PR239/assets/source_not_implemented_yet.md.BRH4xbkQ.js @@ -0,0 +1,4 @@ +import{_ as i,c as t,a5 as s,o as a}from"./chunks/framework.onQNwZ2I.js";const k=JSON.parse('{"title":"Not implemented yet","description":"","frontmatter":{},"headers":[],"relativePath":"source/not_implemented_yet.md","filePath":"source/not_implemented_yet.md","lastUpdated":null}'),n={name:"source/not_implemented_yet.md"};function l(p,e,h,o,r,d){return a(),t("div",null,e[0]||(e[0]=[s(`

    Not implemented yet

    All of the functions in this file are not implemented in Julia yet. Some of them may have implementations in LibGEOS which we can use via an extension, but there is no native-Julia implementation for them.

    julia
    function symdifference end
    +function buffer end
    +function convexhull end
    +function concavehull end

    This page was generated using Literate.jl.

    `,5)]))}const c=i(n,[["render",l]]);export{k as __pageData,c as default}; diff --git a/previews/PR239/assets/source_not_implemented_yet.md.BRH4xbkQ.lean.js b/previews/PR239/assets/source_not_implemented_yet.md.BRH4xbkQ.lean.js new file mode 100644 index 000000000..9f702e26d --- /dev/null +++ b/previews/PR239/assets/source_not_implemented_yet.md.BRH4xbkQ.lean.js @@ -0,0 +1,4 @@ +import{_ as i,c as t,a5 as s,o as a}from"./chunks/framework.onQNwZ2I.js";const k=JSON.parse('{"title":"Not implemented yet","description":"","frontmatter":{},"headers":[],"relativePath":"source/not_implemented_yet.md","filePath":"source/not_implemented_yet.md","lastUpdated":null}'),n={name:"source/not_implemented_yet.md"};function l(p,e,h,o,r,d){return a(),t("div",null,e[0]||(e[0]=[s(`

    Not implemented yet

    All of the functions in this file are not implemented in Julia yet. Some of them may have implementations in LibGEOS which we can use via an extension, but there is no native-Julia implementation for them.

    julia
    function symdifference end
    +function buffer end
    +function convexhull end
    +function concavehull end

    This page was generated using Literate.jl.

    `,5)]))}const c=i(n,[["render",l]]);export{k as __pageData,c as default}; diff --git a/previews/PR239/assets/source_primitives.md.Dyw7zzpW.js b/previews/PR239/assets/source_primitives.md.Dyw7zzpW.js new file mode 100644 index 000000000..acef8bd21 --- /dev/null +++ b/previews/PR239/assets/source_primitives.md.Dyw7zzpW.js @@ -0,0 +1 @@ +import{_ as a,c as s,j as e,a as r,o as i}from"./chunks/framework.onQNwZ2I.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/primitives.md","filePath":"source/primitives.md","lastUpdated":null}'),n={name:"source/primitives.md"};function l(o,t,p,c,d,m){return i(),s("div",null,t[0]||(t[0]=[e("hr",null,null,-1),e("p",null,[e("em",null,[r("This page was generated using "),e("a",{href:"https://github.com/fredrikekre/Literate.jl",target:"_blank",rel:"noreferrer"},"Literate.jl"),r(".")])],-1)]))}const _=a(n,[["render",l]]);export{f as __pageData,_ as default}; diff --git a/previews/PR239/assets/source_primitives.md.Dyw7zzpW.lean.js b/previews/PR239/assets/source_primitives.md.Dyw7zzpW.lean.js new file mode 100644 index 000000000..acef8bd21 --- /dev/null +++ b/previews/PR239/assets/source_primitives.md.Dyw7zzpW.lean.js @@ -0,0 +1 @@ +import{_ as a,c as s,j as e,a as r,o as i}from"./chunks/framework.onQNwZ2I.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/primitives.md","filePath":"source/primitives.md","lastUpdated":null}'),n={name:"source/primitives.md"};function l(o,t,p,c,d,m){return i(),s("div",null,t[0]||(t[0]=[e("hr",null,null,-1),e("p",null,[e("em",null,[r("This page was generated using "),e("a",{href:"https://github.com/fredrikekre/Literate.jl",target:"_blank",rel:"noreferrer"},"Literate.jl"),r(".")])],-1)]))}const _=a(n,[["render",l]]);export{f as __pageData,_ as default}; diff --git a/previews/PR239/assets/source_src_GeometryOpsCore.md.BF7KPh3I.js b/previews/PR239/assets/source_src_GeometryOpsCore.md.BF7KPh3I.js new file mode 100644 index 000000000..95056e814 --- /dev/null +++ b/previews/PR239/assets/source_src_GeometryOpsCore.md.BF7KPh3I.js @@ -0,0 +1,25 @@ +import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/src/GeometryOpsCore.md","filePath":"source/src/GeometryOpsCore.md","lastUpdated":null}'),l={name:"source/src/GeometryOpsCore.md"};function e(p,s,h,k,r,E){return t(),a("div",null,s[0]||(s[0]=[n(`
    julia
    module GeometryOpsCore
    +
    +using Base.Threads: nthreads, @threads, @spawn
    +
    +import GeoInterface
    +import GeoInterface as GI
    +import GeoInterface: Extents

    Import all names from GeoInterface and Extents, so users can do GO.extent or GO.trait.

    julia
    for name in names(GeoInterface)
    +    @eval using GeoInterface: $name
    +end
    +for name in names(Extents)
    +    @eval using GeoInterface.Extents: $name
    +end
    +
    +using Tables
    +using DataAPI
    +
    +include("keyword_docs.jl")
    +include("types.jl")
    +
    +include("apply.jl")
    +include("applyreduce.jl")
    +include("other_primitives.jl")
    +include("geometry_utils.jl")
    +
    +end

    This page was generated using Literate.jl.

    `,5)]))}const y=i(l,[["render",e]]);export{g as __pageData,y as default}; diff --git a/previews/PR239/assets/source_src_GeometryOpsCore.md.BF7KPh3I.lean.js b/previews/PR239/assets/source_src_GeometryOpsCore.md.BF7KPh3I.lean.js new file mode 100644 index 000000000..95056e814 --- /dev/null +++ b/previews/PR239/assets/source_src_GeometryOpsCore.md.BF7KPh3I.lean.js @@ -0,0 +1,25 @@ +import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/src/GeometryOpsCore.md","filePath":"source/src/GeometryOpsCore.md","lastUpdated":null}'),l={name:"source/src/GeometryOpsCore.md"};function e(p,s,h,k,r,E){return t(),a("div",null,s[0]||(s[0]=[n(`
    julia
    module GeometryOpsCore
    +
    +using Base.Threads: nthreads, @threads, @spawn
    +
    +import GeoInterface
    +import GeoInterface as GI
    +import GeoInterface: Extents

    Import all names from GeoInterface and Extents, so users can do GO.extent or GO.trait.

    julia
    for name in names(GeoInterface)
    +    @eval using GeoInterface: $name
    +end
    +for name in names(Extents)
    +    @eval using GeoInterface.Extents: $name
    +end
    +
    +using Tables
    +using DataAPI
    +
    +include("keyword_docs.jl")
    +include("types.jl")
    +
    +include("apply.jl")
    +include("applyreduce.jl")
    +include("other_primitives.jl")
    +include("geometry_utils.jl")
    +
    +end

    This page was generated using Literate.jl.

    `,5)]))}const y=i(l,[["render",e]]);export{g as __pageData,y as default}; diff --git a/previews/PR239/assets/source_src_apply.md.C1jwRpiI.js b/previews/PR239/assets/source_src_apply.md.C1jwRpiI.js new file mode 100644 index 000000000..683875f0f --- /dev/null +++ b/previews/PR239/assets/source_src_apply.md.C1jwRpiI.js @@ -0,0 +1,144 @@ +import{_ as h,c as l,a5 as a,j as i,a as t,G as n,B as p,o as k}from"./chunks/framework.onQNwZ2I.js";const b=JSON.parse('{"title":"apply","description":"","frontmatter":{},"headers":[],"relativePath":"source/src/apply.md","filePath":"source/src/apply.md","lastUpdated":null}'),r={name:"source/src/apply.md"},d={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""};function o(E,s,c,y,F,u){const e=p("Badge");return k(),l("div",null,[s[6]||(s[6]=a('

    apply

    julia
    export apply

    This file mainly defines the apply function.

    In general, the idea behind the apply framework is to take as input any geometry, vector of geometries, or feature collection, deconstruct it to the given trait target (any arbitrary GI.AbstractTrait or TraitTarget union thereof, like PointTrait or PolygonTrait) and perform some operation on it. Then, the geometry or structure is rebuilt.

    This allows for a simple and consistent framework within which users can define their own operations trivially easily, and removes a lot of the complexity involved with handling complex geometry structures.

    For example, a simple way to flip the x and y coordinates of a geometry is:

    julia
    flipped_geom = GO.apply(GI.PointTrait(), geom) do p\n    (GI.y(p), GI.x(p))\nend

    As simple as that. There's no need to implement your own decomposition because it's done for you.

    Functions like flip, reproject, transform, even segmentize and simplify have been implemented using the apply framework. Similarly, centroid, area and distance have been implemented using the applyreduce framework.

    Docstrings

    Functions

    ',11)),i("details",d,[i("summary",null,[s[0]||(s[0]=i("a",{id:"GeometryOpsCore.apply-source-src-apply",href:"#GeometryOpsCore.apply-source-src-apply"},[i("span",{class:"jlbinding"},"GeometryOpsCore.apply")],-1)),s[1]||(s[1]=t()),n(e,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=a(`
    julia
    apply(f, target::Union{TraitTarget, GI.AbstractTrait}, obj; kw...)

    Reconstruct a geometry, feature, feature collection, or nested vectors of either using the function f on the target trait.

    f(target_geom) => x where x also has the target trait, or a trait that can be substituted. For example, swapping PolgonTrait to MultiPointTrait will fail if the outer object has MultiPolygonTrait, but should work if it has FeatureTrait.

    Objects "shallower" than the target trait are always completely rebuilt, like a Vector of FeatureCollectionTrait of FeatureTrait when the target has PolygonTrait and is held in the features. These will always be GeoInterface geometries/feature/feature collections. But "deeper" objects may remain unchanged or be whatever GeoInterface compatible objects f returns.

    The result is a functionally similar geometry with values depending on f.

    • threaded: true or false. Whether to use multithreading. Defaults to false.

    • crs: The CRS to attach to geometries. Defaults to nothing.

    • calc_extent: true or false. Whether to calculate the extent. Defaults to false.

    Example

    Flipped point the order in any feature or geometry, or iterables of either:

    julia
    import GeoInterface as GI
    +import GeometryOps as GO
    +geom = GI.Polygon([GI.LinearRing([(1, 2), (3, 4), (5, 6), (1, 2)]),
    +                   GI.LinearRing([(3, 4), (5, 6), (6, 7), (3, 4)])])
    +
    +flipped_geom = GO.apply(GI.PointTrait, geom) do p
    +    (GI.y(p), GI.x(p))
    +end

    source

    `,10))]),i("details",g,[i("summary",null,[s[3]||(s[3]=i("a",{id:"GeometryOpsCore.applyreduce-source-src-apply",href:"#GeometryOpsCore.applyreduce-source-src-apply"},[i("span",{class:"jlbinding"},"GeometryOpsCore.applyreduce")],-1)),s[4]||(s[4]=t()),n(e,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=a('
    julia
    applyreduce(f, op, target::Union{TraitTarget, GI.AbstractTrait}, obj; threaded)

    Apply function f to all objects with the target trait, and reduce the result with an op like +.

    The order and grouping of application of op is not guaranteed.

    If threaded==true threads will be used over arrays and iterables, feature collections and nested geometries.

    source

    ',5))]),s[7]||(s[7]=a(`

    What is apply?

    apply applies some function to every geometry matching the Target GeoInterface trait, in some arbitrarily nested object made up of:

    • AbstractArrays (we also try to iterate other non-GeoInteface compatible object)

    • FeatureCollectionTrait objects

    • FeatureTrait objects

    • AbstractGeometryTrait objects

    apply recursively calls itself through these nested layers until it reaches objects with the Target GeoInterface trait. When found apply applies the function f, and stops.

    The outer recursive functions then progressively rebuild the object using GeoInterface objects matching the original traits.

    If PointTrait is found but it is not the Target, an error is thrown. This likely means the object contains a different geometry trait to the target, such as MultiPointTrait when LineStringTrait was specified.

    To handle this possibility it may be necessary to make Target a Union of traits found at the same level of nesting, and define methods of f to handle all cases.

    Be careful making a union across "levels" of nesting, e.g. Union{FeatureTrait,PolygonTrait}, as _apply will just never reach PolygonTrait when all the polygons are wrapped in a FeatureTrait object.

    Embedding:

    extent and crs can be embedded in all geometries, features, and feature collections as part of apply. Geometries deeper than Target will of course not have new extent or crs embedded.

    • calc_extent signals to recalculate an Extent and embed it.

    • crs will be embedded as-is

    Threading

    Threading is used at the outermost level possible - over an array, feature collection, or e.g. a MultiPolygonTrait where each PolygonTrait sub-geometry may be calculated on a different thread.

    Currently, threading defaults to false for all objects, but can be turned on by passing the keyword argument threaded=true to apply.

    julia
    """
    +    apply(f, target::Union{TraitTarget, GI.AbstractTrait}, obj; kw...)
    +
    +Reconstruct a geometry, feature, feature collection, or nested vectors of
    +either using the function \`f\` on the \`target\` trait.
    +
    +\`f(target_geom) => x\` where \`x\` also has the \`target\` trait, or a trait that can
    +be substituted. For example, swapping \`PolgonTrait\` to \`MultiPointTrait\` will fail
    +if the outer object has \`MultiPolygonTrait\`, but should work if it has \`FeatureTrait\`.
    +
    +Objects "shallower" than the target trait are always completely rebuilt, like
    +a \`Vector\` of \`FeatureCollectionTrait\` of \`FeatureTrait\` when the target
    +has \`PolygonTrait\` and is held in the features. These will always be GeoInterface
    +geometries/feature/feature collections. But "deeper" objects may remain
    +unchanged or be whatever GeoInterface compatible objects \`f\` returns.
    +
    +The result is a functionally similar geometry with values depending on \`f\`.
    +
    +$APPLY_KEYWORDS
    +
    +# Example
    +
    +Flipped point the order in any feature or geometry, or iterables of either:
    +
    +\`\`\`julia
    +import GeoInterface as GI
    +import GeometryOps as GO
    +geom = GI.Polygon([GI.LinearRing([(1, 2), (3, 4), (5, 6), (1, 2)]),
    +                   GI.LinearRing([(3, 4), (5, 6), (6, 7), (3, 4)])])
    +
    +flipped_geom = GO.apply(GI.PointTrait, geom) do p
    +    (GI.y(p), GI.x(p))
    +end
    +\`\`\`
    +"""
    +@inline function apply(
    +    f::F, target, geom; calc_extent=false, threaded=false, kw...
    +) where F
    +    threaded = _booltype(threaded)
    +    calc_extent = _booltype(calc_extent)
    +    _apply(f, TraitTarget(target), geom; threaded, calc_extent, kw...)
    +end

    Call _apply again with the trait of geom

    julia
    @inline _apply(f::F, target, geom; kw...)  where F =
    +    _apply(f, target, GI.trait(geom), geom; kw...)

    There is no trait and this is an AbstractArray - so just iterate over it calling _apply on the contents

    julia
    @inline function _apply(f::F, target, ::Nothing, A::AbstractArray; threaded, kw...) where F

    For an Array there is nothing else to do but map _apply over all values _maptasks may run this level threaded if threaded==true, but deeper _apply called in the closure will not be threaded

    julia
        apply_to_array(i) = _apply(f, target, A[i]; threaded=_False(), kw...)
    +    _maptasks(apply_to_array, eachindex(A), threaded)
    +end

    There is no trait and this is not an AbstractArray. Try to call _apply over it. We can't use threading as we don't know if we can can index into it. So just map.

    julia
    @inline function _apply(f::F, target, ::Nothing, iterable::IterableType; threaded, kw...) where {F, IterableType}

    Try the Tables.jl interface first

    julia
        if Tables.istable(iterable)
    +    _apply_table(f, target, iterable; threaded, kw...)
    +    else # this is probably some form of iterable...
    +        if threaded isa _True

    collect first so we can use threads

    julia
                _apply(f, target, collect(iterable); threaded, kw...)
    +        else
    +            apply_to_iterable(x) = _apply(f, target, x; kw...)
    +            map(apply_to_iterable, iterable)
    +        end
    +    end
    +end
    +#=
    +Doing this inline in \`_apply\` is _heavily_ type unstable, so it's best to separate this
    +by a function barrier.
    +
    +This function operates \`apply\` on the \`geometry\` column of the table, and returns a new table
    +with the same schema, but with the new geometry column.
    +
    +This new table may be of the same type as the old one iff \`Tables.materializer\` is defined for
    +that table.  If not, then a \`NamedTuple\` is returned.
    +=#
    +function _apply_table(f::F, target, iterable::IterableType; threaded, kw...) where {F, IterableType}
    +    _get_col_pair(colname) = colname => Tables.getcolumn(iterable, colname)

    We extract the geometry column and run apply on it.

    julia
        geometry_column = first(GI.geometrycolumns(iterable))
    +    new_geometry = _apply(f, target, Tables.getcolumn(iterable, geometry_column); threaded, kw...)

    Then, we obtain the schema of the table,

    julia
        old_schema = Tables.schema(iterable)

    filter the geometry column out,

    julia
        new_names = filter(Base.Fix1(!==, geometry_column), old_schema.names)

    and try to rebuild the same table as the best type - either the original type of iterable, or a named tuple which is the default fallback.

    julia
        result = Tables.materializer(iterable)(
    +        merge(
    +            NamedTuple{(geometry_column,), Base.Tuple{typeof(new_geometry)}}((new_geometry,)),
    +            NamedTuple(Iterators.map(_get_col_pair, new_names))
    +        )
    +    )

    Finally, we ensure that metadata is propagated correctly. This can only happen if the original table supports metadata reads, and the result supports metadata writes.

    julia
        if DataAPI.metadatasupport(typeof(result)).write

    Copy over all metadata from the original table to the new table, if the original table supports metadata reading.

    julia
            if DataAPI.metadatasupport(IterableType).read
    +            for (key, (value, style)) in DataAPI.metadata(iterable; style = true)

    Default styles are not preserved on data transformation, so we must skip them!

    julia
                    style == :default && continue

    We assume that any other style is preserved.

    julia
                    DataAPI.metadata!(result, key, value; style)
    +            end
    +        end

    We don't usually care about the original table's metadata for GEOINTERFACE namespaced keys, so we should set the crs and geometrycolumns metadata if they are present. Ensure that GEOINTERFACE:geometrycolumns and GEOINTERFACE:crs are set!

    julia
            mdk = DataAPI.metadatakeys(result)

    If the user has asked for geometry columns to persist, they would be here, so we don't need to set them.

    julia
            if !("GEOINTERFACE:geometrycolumns" in mdk)

    If the geometry columns are not already set, we need to set them.

    julia
                DataAPI.metadata!(result, "GEOINTERFACE:geometrycolumns", (geometry_column,); style = :default)
    +        end

    Force reset CRS always, since you can pass crs to apply.

    julia
            new_crs = if haskey(kw, :crs)
    +            kw[:crs]
    +        else
    +            GI.crs(iterable) # this will automatically check \`GEOINTERFACE:crs\` unless the type has a specialized implementation.
    +        end
    +
    +        DataAPI.metadata!(result, "GEOINTERFACE:crs", new_crs; style = :default)
    +    end
    +
    +    return result
    +end

    Rewrap all FeatureCollectionTrait feature collections as GI.FeatureCollection Maybe use threads to call _apply on component features

    julia
    @inline function _apply(f::F, target, ::GI.FeatureCollectionTrait, fc;
    +    crs=GI.crs(fc), calc_extent=_False(), threaded
    +) where F

    Run _apply on all features in the feature collection, possibly threaded

    julia
        apply_to_feature(i) =
    +        _apply(f, target, GI.getfeature(fc, i); crs, calc_extent, threaded=_False())::GI.Feature
    +    features = _maptasks(apply_to_feature, 1:GI.nfeature(fc), threaded)
    +    if calc_extent isa _True

    Calculate the extent of the features

    julia
            extent = mapreduce(GI.extent, Extents.union, features)

    Return a FeatureCollection with features, crs and calculated extent

    julia
            return GI.FeatureCollection(features; crs, extent)
    +    else

    Return a FeatureCollection with features and crs

    julia
            return GI.FeatureCollection(features; crs)
    +    end
    +end

    Rewrap all FeatureTrait features as GI.Feature, keeping the properties

    julia
    @inline function _apply(f::F, target, ::GI.FeatureTrait, feature;
    +    crs=GI.crs(feature), calc_extent=_False(), threaded
    +) where F

    Run _apply on the contained geometry

    julia
        geometry = _apply(f, target, GI.geometry(feature); crs, calc_extent, threaded)

    Get the feature properties

    julia
        properties = GI.properties(feature)
    +    if calc_extent isa _True

    Calculate the extent of the geometry

    julia
            extent = GI.extent(geometry)

    Return a new Feature with the new geometry and calculated extent, but the original properties and crs

    julia
            return GI.Feature(geometry; properties, crs, extent)
    +    else

    Return a new Feature with the new geometry, but the original properties and crs

    julia
            return GI.Feature(geometry; properties, crs)
    +    end
    +end

    Reconstruct nested geometries, maybe using threads to call _apply on component geoms

    julia
    @inline function _apply(f::F, target, trait, geom;
    +    crs=GI.crs(geom), calc_extent=_False(), threaded
    +)::(GI.geointerface_geomtype(trait)) where F

    Map _apply over all sub geometries of geom to create a new vector of geometries TODO handle zero length

    julia
        apply_to_geom(i) = _apply(f, target, GI.getgeom(geom, i); crs, calc_extent, threaded=_False())
    +    geoms = _maptasks(apply_to_geom, 1:GI.ngeom(geom), threaded)
    +    return _apply_inner(geom, geoms, crs, calc_extent)
    +end
    +@inline function _apply(f::F, target::TraitTarget{<:PointTrait}, trait::GI.PolygonTrait, geom;
    +    crs=GI.crs(geom), calc_extent=_False(), threaded
    +)::(GI.geointerface_geomtype(trait)) where F

    We need to force rebuilding a LinearRing not a LineString

    julia
        geoms = _maptasks(1:GI.ngeom(geom), threaded) do i
    +        lr = GI.getgeom(geom, i)
    +        points = map(GI.getgeom(lr)) do p
    +            _apply(f, target, p; crs, calc_extent, threaded=_False())
    +        end
    +        _linearring(_apply_inner(lr, points, crs, calc_extent))
    +    end
    +    return _apply_inner(geom, geoms, crs, calc_extent)
    +end
    +function _apply_inner(geom, geoms, crs, calc_extent::_True)

    Calculate the extent of the sub geometries

    julia
        extent = mapreduce(GI.extent, Extents.union, geoms)

    Return a new geometry of the same trait as geom, holding the new geoms with crs and calculated extent

    julia
        return rebuild(geom, geoms; crs, extent)
    +end
    +function _apply_inner(geom, geoms, crs, calc_extent::_False)

    Return a new geometry of the same trait as geom, holding the new geoms with crs

    julia
        return rebuild(geom, geoms; crs)
    +end

    Fail loudly if we hit PointTrait without running f (after PointTrait there is no further to dig with _apply) @inline _apply(f, ::TraitTarget{Target}, trait::GI.PointTrait, geom; crs=nothing, kw...) where Target = throw(ArgumentError("target Target not found, but reached a PointTrait leaf")) Finally, these short methods are the main purpose of apply. The Trait is a subtype of the Target (or identical to it) So the Target is found. We apply f to geom and return it to previous _apply calls to be wrapped with the outer geometries/feature/featurecollection/array.

    julia
    _apply(f::F, ::TraitTarget{Target}, ::Trait, geom; crs=GI.crs(geom), kw...) where {F,Target,Trait<:Target} = f(geom)

    Define some specific cases of this match to avoid method ambiguity

    julia
    for T in (
    +    GI.PointTrait, GI.LinearRing, GI.LineString,
    +    GI.MultiPoint, GI.FeatureTrait, GI.FeatureCollectionTrait
    +)
    +    @eval _apply(f::F, target::TraitTarget{<:$T}, trait::$T, x; kw...) where F = f(x)
    +end
    +
    +
    +### \`_maptasks\` - flexible, threaded \`map\`
    +
    +using Base.Threads: nthreads, @threads, @spawn

    Threading utility, modified Mason Protters threading PSA run f over ntasks, where f receives an AbstractArray/range of linear indices

    julia
    @inline function _maptasks(f::F, taskrange, threaded::_True)::Vector where F
    +    ntasks = length(taskrange)

    Customize this as needed. More tasks have more overhead, but better load balancing

    julia
        tasks_per_thread = 2
    +    chunk_size = max(1, ntasks ÷ (tasks_per_thread * nthreads()))

    partition the range into chunks

    julia
        task_chunks = Iterators.partition(taskrange, chunk_size)

    Map over the chunks

    julia
        tasks = map(task_chunks) do chunk

    Spawn a task to process this chunk

    julia
            @spawn begin

    Where we map f over the chunk indices

    julia
                map(f, chunk)
    +        end
    +    end

    Finally we join the results into a new vector

    julia
        return mapreduce(fetch, vcat, tasks)
    +end

    Here we use the compiler directive @assume_effects :foldable to force the compiler to lookup through the closure. This alone makes e.g. flip 2.5x faster!

    julia
    Base.@assume_effects :foldable @inline function _maptasks(f::F, taskrange, threaded::_False)::Vector where F
    +    map(f, taskrange)
    +end

    This page was generated using Literate.jl.

    `,107))])}const m=h(r,[["render",o]]);export{b as __pageData,m as default}; diff --git a/previews/PR239/assets/source_src_apply.md.C1jwRpiI.lean.js b/previews/PR239/assets/source_src_apply.md.C1jwRpiI.lean.js new file mode 100644 index 000000000..683875f0f --- /dev/null +++ b/previews/PR239/assets/source_src_apply.md.C1jwRpiI.lean.js @@ -0,0 +1,144 @@ +import{_ as h,c as l,a5 as a,j as i,a as t,G as n,B as p,o as k}from"./chunks/framework.onQNwZ2I.js";const b=JSON.parse('{"title":"apply","description":"","frontmatter":{},"headers":[],"relativePath":"source/src/apply.md","filePath":"source/src/apply.md","lastUpdated":null}'),r={name:"source/src/apply.md"},d={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""};function o(E,s,c,y,F,u){const e=p("Badge");return k(),l("div",null,[s[6]||(s[6]=a('

    apply

    julia
    export apply

    This file mainly defines the apply function.

    In general, the idea behind the apply framework is to take as input any geometry, vector of geometries, or feature collection, deconstruct it to the given trait target (any arbitrary GI.AbstractTrait or TraitTarget union thereof, like PointTrait or PolygonTrait) and perform some operation on it. Then, the geometry or structure is rebuilt.

    This allows for a simple and consistent framework within which users can define their own operations trivially easily, and removes a lot of the complexity involved with handling complex geometry structures.

    For example, a simple way to flip the x and y coordinates of a geometry is:

    julia
    flipped_geom = GO.apply(GI.PointTrait(), geom) do p\n    (GI.y(p), GI.x(p))\nend

    As simple as that. There's no need to implement your own decomposition because it's done for you.

    Functions like flip, reproject, transform, even segmentize and simplify have been implemented using the apply framework. Similarly, centroid, area and distance have been implemented using the applyreduce framework.

    Docstrings

    Functions

    ',11)),i("details",d,[i("summary",null,[s[0]||(s[0]=i("a",{id:"GeometryOpsCore.apply-source-src-apply",href:"#GeometryOpsCore.apply-source-src-apply"},[i("span",{class:"jlbinding"},"GeometryOpsCore.apply")],-1)),s[1]||(s[1]=t()),n(e,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=a(`
    julia
    apply(f, target::Union{TraitTarget, GI.AbstractTrait}, obj; kw...)

    Reconstruct a geometry, feature, feature collection, or nested vectors of either using the function f on the target trait.

    f(target_geom) => x where x also has the target trait, or a trait that can be substituted. For example, swapping PolgonTrait to MultiPointTrait will fail if the outer object has MultiPolygonTrait, but should work if it has FeatureTrait.

    Objects "shallower" than the target trait are always completely rebuilt, like a Vector of FeatureCollectionTrait of FeatureTrait when the target has PolygonTrait and is held in the features. These will always be GeoInterface geometries/feature/feature collections. But "deeper" objects may remain unchanged or be whatever GeoInterface compatible objects f returns.

    The result is a functionally similar geometry with values depending on f.

    • threaded: true or false. Whether to use multithreading. Defaults to false.

    • crs: The CRS to attach to geometries. Defaults to nothing.

    • calc_extent: true or false. Whether to calculate the extent. Defaults to false.

    Example

    Flipped point the order in any feature or geometry, or iterables of either:

    julia
    import GeoInterface as GI
    +import GeometryOps as GO
    +geom = GI.Polygon([GI.LinearRing([(1, 2), (3, 4), (5, 6), (1, 2)]),
    +                   GI.LinearRing([(3, 4), (5, 6), (6, 7), (3, 4)])])
    +
    +flipped_geom = GO.apply(GI.PointTrait, geom) do p
    +    (GI.y(p), GI.x(p))
    +end

    source

    `,10))]),i("details",g,[i("summary",null,[s[3]||(s[3]=i("a",{id:"GeometryOpsCore.applyreduce-source-src-apply",href:"#GeometryOpsCore.applyreduce-source-src-apply"},[i("span",{class:"jlbinding"},"GeometryOpsCore.applyreduce")],-1)),s[4]||(s[4]=t()),n(e,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=a('
    julia
    applyreduce(f, op, target::Union{TraitTarget, GI.AbstractTrait}, obj; threaded)

    Apply function f to all objects with the target trait, and reduce the result with an op like +.

    The order and grouping of application of op is not guaranteed.

    If threaded==true threads will be used over arrays and iterables, feature collections and nested geometries.

    source

    ',5))]),s[7]||(s[7]=a(`

    What is apply?

    apply applies some function to every geometry matching the Target GeoInterface trait, in some arbitrarily nested object made up of:

    • AbstractArrays (we also try to iterate other non-GeoInteface compatible object)

    • FeatureCollectionTrait objects

    • FeatureTrait objects

    • AbstractGeometryTrait objects

    apply recursively calls itself through these nested layers until it reaches objects with the Target GeoInterface trait. When found apply applies the function f, and stops.

    The outer recursive functions then progressively rebuild the object using GeoInterface objects matching the original traits.

    If PointTrait is found but it is not the Target, an error is thrown. This likely means the object contains a different geometry trait to the target, such as MultiPointTrait when LineStringTrait was specified.

    To handle this possibility it may be necessary to make Target a Union of traits found at the same level of nesting, and define methods of f to handle all cases.

    Be careful making a union across "levels" of nesting, e.g. Union{FeatureTrait,PolygonTrait}, as _apply will just never reach PolygonTrait when all the polygons are wrapped in a FeatureTrait object.

    Embedding:

    extent and crs can be embedded in all geometries, features, and feature collections as part of apply. Geometries deeper than Target will of course not have new extent or crs embedded.

    • calc_extent signals to recalculate an Extent and embed it.

    • crs will be embedded as-is

    Threading

    Threading is used at the outermost level possible - over an array, feature collection, or e.g. a MultiPolygonTrait where each PolygonTrait sub-geometry may be calculated on a different thread.

    Currently, threading defaults to false for all objects, but can be turned on by passing the keyword argument threaded=true to apply.

    julia
    """
    +    apply(f, target::Union{TraitTarget, GI.AbstractTrait}, obj; kw...)
    +
    +Reconstruct a geometry, feature, feature collection, or nested vectors of
    +either using the function \`f\` on the \`target\` trait.
    +
    +\`f(target_geom) => x\` where \`x\` also has the \`target\` trait, or a trait that can
    +be substituted. For example, swapping \`PolgonTrait\` to \`MultiPointTrait\` will fail
    +if the outer object has \`MultiPolygonTrait\`, but should work if it has \`FeatureTrait\`.
    +
    +Objects "shallower" than the target trait are always completely rebuilt, like
    +a \`Vector\` of \`FeatureCollectionTrait\` of \`FeatureTrait\` when the target
    +has \`PolygonTrait\` and is held in the features. These will always be GeoInterface
    +geometries/feature/feature collections. But "deeper" objects may remain
    +unchanged or be whatever GeoInterface compatible objects \`f\` returns.
    +
    +The result is a functionally similar geometry with values depending on \`f\`.
    +
    +$APPLY_KEYWORDS
    +
    +# Example
    +
    +Flipped point the order in any feature or geometry, or iterables of either:
    +
    +\`\`\`julia
    +import GeoInterface as GI
    +import GeometryOps as GO
    +geom = GI.Polygon([GI.LinearRing([(1, 2), (3, 4), (5, 6), (1, 2)]),
    +                   GI.LinearRing([(3, 4), (5, 6), (6, 7), (3, 4)])])
    +
    +flipped_geom = GO.apply(GI.PointTrait, geom) do p
    +    (GI.y(p), GI.x(p))
    +end
    +\`\`\`
    +"""
    +@inline function apply(
    +    f::F, target, geom; calc_extent=false, threaded=false, kw...
    +) where F
    +    threaded = _booltype(threaded)
    +    calc_extent = _booltype(calc_extent)
    +    _apply(f, TraitTarget(target), geom; threaded, calc_extent, kw...)
    +end

    Call _apply again with the trait of geom

    julia
    @inline _apply(f::F, target, geom; kw...)  where F =
    +    _apply(f, target, GI.trait(geom), geom; kw...)

    There is no trait and this is an AbstractArray - so just iterate over it calling _apply on the contents

    julia
    @inline function _apply(f::F, target, ::Nothing, A::AbstractArray; threaded, kw...) where F

    For an Array there is nothing else to do but map _apply over all values _maptasks may run this level threaded if threaded==true, but deeper _apply called in the closure will not be threaded

    julia
        apply_to_array(i) = _apply(f, target, A[i]; threaded=_False(), kw...)
    +    _maptasks(apply_to_array, eachindex(A), threaded)
    +end

    There is no trait and this is not an AbstractArray. Try to call _apply over it. We can't use threading as we don't know if we can can index into it. So just map.

    julia
    @inline function _apply(f::F, target, ::Nothing, iterable::IterableType; threaded, kw...) where {F, IterableType}

    Try the Tables.jl interface first

    julia
        if Tables.istable(iterable)
    +    _apply_table(f, target, iterable; threaded, kw...)
    +    else # this is probably some form of iterable...
    +        if threaded isa _True

    collect first so we can use threads

    julia
                _apply(f, target, collect(iterable); threaded, kw...)
    +        else
    +            apply_to_iterable(x) = _apply(f, target, x; kw...)
    +            map(apply_to_iterable, iterable)
    +        end
    +    end
    +end
    +#=
    +Doing this inline in \`_apply\` is _heavily_ type unstable, so it's best to separate this
    +by a function barrier.
    +
    +This function operates \`apply\` on the \`geometry\` column of the table, and returns a new table
    +with the same schema, but with the new geometry column.
    +
    +This new table may be of the same type as the old one iff \`Tables.materializer\` is defined for
    +that table.  If not, then a \`NamedTuple\` is returned.
    +=#
    +function _apply_table(f::F, target, iterable::IterableType; threaded, kw...) where {F, IterableType}
    +    _get_col_pair(colname) = colname => Tables.getcolumn(iterable, colname)

    We extract the geometry column and run apply on it.

    julia
        geometry_column = first(GI.geometrycolumns(iterable))
    +    new_geometry = _apply(f, target, Tables.getcolumn(iterable, geometry_column); threaded, kw...)

    Then, we obtain the schema of the table,

    julia
        old_schema = Tables.schema(iterable)

    filter the geometry column out,

    julia
        new_names = filter(Base.Fix1(!==, geometry_column), old_schema.names)

    and try to rebuild the same table as the best type - either the original type of iterable, or a named tuple which is the default fallback.

    julia
        result = Tables.materializer(iterable)(
    +        merge(
    +            NamedTuple{(geometry_column,), Base.Tuple{typeof(new_geometry)}}((new_geometry,)),
    +            NamedTuple(Iterators.map(_get_col_pair, new_names))
    +        )
    +    )

    Finally, we ensure that metadata is propagated correctly. This can only happen if the original table supports metadata reads, and the result supports metadata writes.

    julia
        if DataAPI.metadatasupport(typeof(result)).write

    Copy over all metadata from the original table to the new table, if the original table supports metadata reading.

    julia
            if DataAPI.metadatasupport(IterableType).read
    +            for (key, (value, style)) in DataAPI.metadata(iterable; style = true)

    Default styles are not preserved on data transformation, so we must skip them!

    julia
                    style == :default && continue

    We assume that any other style is preserved.

    julia
                    DataAPI.metadata!(result, key, value; style)
    +            end
    +        end

    We don't usually care about the original table's metadata for GEOINTERFACE namespaced keys, so we should set the crs and geometrycolumns metadata if they are present. Ensure that GEOINTERFACE:geometrycolumns and GEOINTERFACE:crs are set!

    julia
            mdk = DataAPI.metadatakeys(result)

    If the user has asked for geometry columns to persist, they would be here, so we don't need to set them.

    julia
            if !("GEOINTERFACE:geometrycolumns" in mdk)

    If the geometry columns are not already set, we need to set them.

    julia
                DataAPI.metadata!(result, "GEOINTERFACE:geometrycolumns", (geometry_column,); style = :default)
    +        end

    Force reset CRS always, since you can pass crs to apply.

    julia
            new_crs = if haskey(kw, :crs)
    +            kw[:crs]
    +        else
    +            GI.crs(iterable) # this will automatically check \`GEOINTERFACE:crs\` unless the type has a specialized implementation.
    +        end
    +
    +        DataAPI.metadata!(result, "GEOINTERFACE:crs", new_crs; style = :default)
    +    end
    +
    +    return result
    +end

    Rewrap all FeatureCollectionTrait feature collections as GI.FeatureCollection Maybe use threads to call _apply on component features

    julia
    @inline function _apply(f::F, target, ::GI.FeatureCollectionTrait, fc;
    +    crs=GI.crs(fc), calc_extent=_False(), threaded
    +) where F

    Run _apply on all features in the feature collection, possibly threaded

    julia
        apply_to_feature(i) =
    +        _apply(f, target, GI.getfeature(fc, i); crs, calc_extent, threaded=_False())::GI.Feature
    +    features = _maptasks(apply_to_feature, 1:GI.nfeature(fc), threaded)
    +    if calc_extent isa _True

    Calculate the extent of the features

    julia
            extent = mapreduce(GI.extent, Extents.union, features)

    Return a FeatureCollection with features, crs and calculated extent

    julia
            return GI.FeatureCollection(features; crs, extent)
    +    else

    Return a FeatureCollection with features and crs

    julia
            return GI.FeatureCollection(features; crs)
    +    end
    +end

    Rewrap all FeatureTrait features as GI.Feature, keeping the properties

    julia
    @inline function _apply(f::F, target, ::GI.FeatureTrait, feature;
    +    crs=GI.crs(feature), calc_extent=_False(), threaded
    +) where F

    Run _apply on the contained geometry

    julia
        geometry = _apply(f, target, GI.geometry(feature); crs, calc_extent, threaded)

    Get the feature properties

    julia
        properties = GI.properties(feature)
    +    if calc_extent isa _True

    Calculate the extent of the geometry

    julia
            extent = GI.extent(geometry)

    Return a new Feature with the new geometry and calculated extent, but the original properties and crs

    julia
            return GI.Feature(geometry; properties, crs, extent)
    +    else

    Return a new Feature with the new geometry, but the original properties and crs

    julia
            return GI.Feature(geometry; properties, crs)
    +    end
    +end

    Reconstruct nested geometries, maybe using threads to call _apply on component geoms

    julia
    @inline function _apply(f::F, target, trait, geom;
    +    crs=GI.crs(geom), calc_extent=_False(), threaded
    +)::(GI.geointerface_geomtype(trait)) where F

    Map _apply over all sub geometries of geom to create a new vector of geometries TODO handle zero length

    julia
        apply_to_geom(i) = _apply(f, target, GI.getgeom(geom, i); crs, calc_extent, threaded=_False())
    +    geoms = _maptasks(apply_to_geom, 1:GI.ngeom(geom), threaded)
    +    return _apply_inner(geom, geoms, crs, calc_extent)
    +end
    +@inline function _apply(f::F, target::TraitTarget{<:PointTrait}, trait::GI.PolygonTrait, geom;
    +    crs=GI.crs(geom), calc_extent=_False(), threaded
    +)::(GI.geointerface_geomtype(trait)) where F

    We need to force rebuilding a LinearRing not a LineString

    julia
        geoms = _maptasks(1:GI.ngeom(geom), threaded) do i
    +        lr = GI.getgeom(geom, i)
    +        points = map(GI.getgeom(lr)) do p
    +            _apply(f, target, p; crs, calc_extent, threaded=_False())
    +        end
    +        _linearring(_apply_inner(lr, points, crs, calc_extent))
    +    end
    +    return _apply_inner(geom, geoms, crs, calc_extent)
    +end
    +function _apply_inner(geom, geoms, crs, calc_extent::_True)

    Calculate the extent of the sub geometries

    julia
        extent = mapreduce(GI.extent, Extents.union, geoms)

    Return a new geometry of the same trait as geom, holding the new geoms with crs and calculated extent

    julia
        return rebuild(geom, geoms; crs, extent)
    +end
    +function _apply_inner(geom, geoms, crs, calc_extent::_False)

    Return a new geometry of the same trait as geom, holding the new geoms with crs

    julia
        return rebuild(geom, geoms; crs)
    +end

    Fail loudly if we hit PointTrait without running f (after PointTrait there is no further to dig with _apply) @inline _apply(f, ::TraitTarget{Target}, trait::GI.PointTrait, geom; crs=nothing, kw...) where Target = throw(ArgumentError("target Target not found, but reached a PointTrait leaf")) Finally, these short methods are the main purpose of apply. The Trait is a subtype of the Target (or identical to it) So the Target is found. We apply f to geom and return it to previous _apply calls to be wrapped with the outer geometries/feature/featurecollection/array.

    julia
    _apply(f::F, ::TraitTarget{Target}, ::Trait, geom; crs=GI.crs(geom), kw...) where {F,Target,Trait<:Target} = f(geom)

    Define some specific cases of this match to avoid method ambiguity

    julia
    for T in (
    +    GI.PointTrait, GI.LinearRing, GI.LineString,
    +    GI.MultiPoint, GI.FeatureTrait, GI.FeatureCollectionTrait
    +)
    +    @eval _apply(f::F, target::TraitTarget{<:$T}, trait::$T, x; kw...) where F = f(x)
    +end
    +
    +
    +### \`_maptasks\` - flexible, threaded \`map\`
    +
    +using Base.Threads: nthreads, @threads, @spawn

    Threading utility, modified Mason Protters threading PSA run f over ntasks, where f receives an AbstractArray/range of linear indices

    julia
    @inline function _maptasks(f::F, taskrange, threaded::_True)::Vector where F
    +    ntasks = length(taskrange)

    Customize this as needed. More tasks have more overhead, but better load balancing

    julia
        tasks_per_thread = 2
    +    chunk_size = max(1, ntasks ÷ (tasks_per_thread * nthreads()))

    partition the range into chunks

    julia
        task_chunks = Iterators.partition(taskrange, chunk_size)

    Map over the chunks

    julia
        tasks = map(task_chunks) do chunk

    Spawn a task to process this chunk

    julia
            @spawn begin

    Where we map f over the chunk indices

    julia
                map(f, chunk)
    +        end
    +    end

    Finally we join the results into a new vector

    julia
        return mapreduce(fetch, vcat, tasks)
    +end

    Here we use the compiler directive @assume_effects :foldable to force the compiler to lookup through the closure. This alone makes e.g. flip 2.5x faster!

    julia
    Base.@assume_effects :foldable @inline function _maptasks(f::F, taskrange, threaded::_False)::Vector where F
    +    map(f, taskrange)
    +end

    This page was generated using Literate.jl.

    `,107))])}const m=h(r,[["render",o]]);export{b as __pageData,m as default}; diff --git a/previews/PR239/assets/source_src_applyreduce.md.vbUWBm8w.js b/previews/PR239/assets/source_src_applyreduce.md.vbUWBm8w.js new file mode 100644 index 000000000..5c5d859a2 --- /dev/null +++ b/previews/PR239/assets/source_src_applyreduce.md.vbUWBm8w.js @@ -0,0 +1,72 @@ +import{_ as i,c as a,a5 as t,o as n}from"./chunks/framework.onQNwZ2I.js";const E=JSON.parse('{"title":"applyreduce","description":"","frontmatter":{},"headers":[],"relativePath":"source/src/applyreduce.md","filePath":"source/src/applyreduce.md","lastUpdated":null}'),h={name:"source/src/applyreduce.md"};function e(p,s,l,k,r,d){return n(),a("div",null,s[0]||(s[0]=[t(`

    applyreduce

    julia
    export applyreduce

    This file mainly defines the applyreduce function.

    This performs apply, but then reduces the result after flattening instead of rebuilding the geometry.

    In general, the idea behind the apply framework is to take as input any geometry, vector of geometries, or feature collection, deconstruct it to the given trait target (any arbitrary GI.AbstractTrait or TraitTarget union thereof, like PointTrait or PolygonTrait) and perform some operation on it.

    centroid, area and distance have been implemented using the applyreduce framework.

    julia
    """
    +    applyreduce(f, op, target::Union{TraitTarget, GI.AbstractTrait}, obj; threaded)
    +
    +Apply function \`f\` to all objects with the \`target\` trait,
    +and reduce the result with an \`op\` like \`+\`.
    +
    +The order and grouping of application of \`op\` is not guaranteed.
    +
    +If \`threaded==true\` threads will be used over arrays and iterables,
    +feature collections and nested geometries.
    +"""
    +@inline function applyreduce(
    +    f::F, op::O, target, geom; threaded=false, init=nothing
    +) where {F, O}
    +    threaded = _booltype(threaded)
    +    _applyreduce(f, op, TraitTarget(target), geom; threaded, init)
    +end
    +
    +@inline _applyreduce(f::F, op::O, target, geom; threaded, init) where {F, O} =
    +    _applyreduce(f, op, target, GI.trait(geom), geom; threaded, init)

    Maybe use threads reducing over arrays

    julia
    @inline function _applyreduce(f::F, op::O, target, ::Nothing, A::AbstractArray; threaded, init) where {F, O}
    +    applyreduce_array(i) = _applyreduce(f, op, target, A[i]; threaded=_False(), init)
    +    _mapreducetasks(applyreduce_array, op, eachindex(A), threaded; init)
    +end

    Try to applyreduce over iterables

    julia
    @inline function _applyreduce(f::F, op::O, target, ::Nothing, iterable::IterableType; threaded, init) where {F, O, IterableType}
    +    if Tables.istable(iterable)
    +        _applyreduce_table(f, op, target, iterable; threaded, init)
    +    else
    +        applyreduce_iterable(i) = _applyreduce(f, op, target, i; threaded=_False(), init)
    +        if threaded isa _True # Try to \`collect\` and reduce over the vector with threads
    +            _applyreduce(f, op, target, collect(iterable); threaded, init)
    +        else

    Try to mapreduce the iterable as-is

    julia
                mapreduce(applyreduce_iterable, op, iterable; init)
    +        end
    +    end
    +end

    In this case, we don't reconstruct the table, but only operate on the geometry column.

    julia
    function _applyreduce_table(f::F, op::O, target, iterable::IterableType; threaded, init) where {F, O, IterableType}

    We extract the geometry column and run applyreduce on it.

    julia
        geometry_column = first(GI.geometrycolumns(iterable))
    +    return _applyreduce(f, op, target, Tables.getcolumn(iterable, geometry_column); threaded, init)
    +end

    If applyreduce wants features, then applyreduce over the rows as GI.Features.

    julia
    function _applyreduce_table(f::F, op::O, target::GI.FeatureTrait, iterable::IterableType; threaded, init) where {F, O, IterableType}

    We extract the geometry column and run apply on it.

    julia
        geometry_column = first(GI.geometrycolumns(iterable))
    +    property_names = Iterators.filter(!=(geometry_column), Tables.schema(iterable).names)
    +    features = map(Tables.rows(iterable)) do row
    +        GI.Feature(Tables.getcolumn(row, geometry_column), properties=NamedTuple(Iterators.map(Base.Fix1(_get_col_pair, row), property_names)))
    +    end
    +    return _applyreduce(f, op, target, features; threaded, init)
    +end

    Maybe use threads reducing over features of feature collections

    julia
    @inline function _applyreduce(f::F, op::O, target, ::GI.FeatureCollectionTrait, fc; threaded, init) where {F, O}
    +    applyreduce_fc(i) = _applyreduce(f, op, target, GI.getfeature(fc, i); threaded=_False(), init)
    +    _mapreducetasks(applyreduce_fc, op, 1:GI.nfeature(fc), threaded; init)
    +end

    Features just applyreduce to their geometry

    julia
    @inline _applyreduce(f::F, op::O, target, ::GI.FeatureTrait, feature; threaded, init) where {F, O} =
    +    _applyreduce(f, op, target, GI.geometry(feature); threaded, init)

    Maybe use threads over components of nested geometries

    julia
    @inline function _applyreduce(f::F, op::O, target, trait, geom; threaded, init) where {F, O}
    +    applyreduce_geom(i) = _applyreduce(f, op, target, GI.getgeom(geom, i); threaded=_False(), init)
    +    _mapreducetasks(applyreduce_geom, op, 1:GI.ngeom(geom), threaded; init)
    +end

    Don't thread over points it won't pay off

    julia
    @inline function _applyreduce(
    +    f::F, op::O, target, trait::Union{GI.LinearRing,GI.LineString,GI.MultiPoint}, geom;
    +    threaded, init
    +) where {F, O}
    +    _applyreduce(f, op, target, GI.getgeom(geom); threaded=_False(), init)
    +end

    Apply f to the target

    julia
    @inline function _applyreduce(f::F, op::O, ::TraitTarget{Target}, ::Trait, x; kw...) where {F,O,Target,Trait<:Target}
    +    f(x)
    +end

    Fail if we hit PointTrait _applyreduce(f, op, target::TraitTarget{Target}, trait::PointTrait, geom; kw...) where Target = throw(ArgumentError("target target not found")) Specific cases to avoid method ambiguity

    julia
    for T in (
    +    GI.PointTrait, GI.LinearRing, GI.LineString,
    +    GI.MultiPoint, GI.FeatureTrait, GI.FeatureCollectionTrait
    +)
    +    @eval _applyreduce(f::F, op::O, ::TraitTarget{<:$T}, trait::$T, x; kw...) where {F, O} = f(x)
    +end
    +
    +### \`_mapreducetasks\` - flexible, threaded mapreduce
    +
    +import Base.Threads: nthreads, @threads, @spawn

    Threading utility, modified Mason Protters threading PSA run f over ntasks, where f receives an AbstractArray/range of linear indices

    WARNING: this will not work for mean/median - only ops where grouping is possible. That's because the implementation operates in chunks, and not globally.

    If you absolutely need a single chunk, then threaded = false will always decompose to straight mapreduce without grouping.

    julia
    @inline function _mapreducetasks(f::F, op, taskrange, threaded::_True; init) where F
    +    ntasks = length(taskrange)

    Customize this as needed. More tasks have more overhead, but better load balancing

    julia
        tasks_per_thread = 2
    +    chunk_size = max(1, ntasks ÷ (tasks_per_thread * nthreads()))

    partition the range into chunks

    julia
        task_chunks = Iterators.partition(taskrange, chunk_size)

    Map over the chunks

    julia
        tasks = map(task_chunks) do chunk

    Spawn a task to process this chunk

    julia
            @spawn begin

    Where we map f over the chunk indices

    julia
                mapreduce(f, op, chunk; init)
    +        end
    +    end

    Finally we join the results into a new vector

    julia
        return mapreduce(fetch, op, tasks; init)
    +end
    +Base.@assume_effects :foldable function _mapreducetasks(f::F, op, taskrange, threaded::_False; init) where F
    +    mapreduce(f, op, taskrange; init)
    +end

    This page was generated using Literate.jl.

    `,51)]))}const y=i(h,[["render",e]]);export{E as __pageData,y as default}; diff --git a/previews/PR239/assets/source_src_applyreduce.md.vbUWBm8w.lean.js b/previews/PR239/assets/source_src_applyreduce.md.vbUWBm8w.lean.js new file mode 100644 index 000000000..5c5d859a2 --- /dev/null +++ b/previews/PR239/assets/source_src_applyreduce.md.vbUWBm8w.lean.js @@ -0,0 +1,72 @@ +import{_ as i,c as a,a5 as t,o as n}from"./chunks/framework.onQNwZ2I.js";const E=JSON.parse('{"title":"applyreduce","description":"","frontmatter":{},"headers":[],"relativePath":"source/src/applyreduce.md","filePath":"source/src/applyreduce.md","lastUpdated":null}'),h={name:"source/src/applyreduce.md"};function e(p,s,l,k,r,d){return n(),a("div",null,s[0]||(s[0]=[t(`

    applyreduce

    julia
    export applyreduce

    This file mainly defines the applyreduce function.

    This performs apply, but then reduces the result after flattening instead of rebuilding the geometry.

    In general, the idea behind the apply framework is to take as input any geometry, vector of geometries, or feature collection, deconstruct it to the given trait target (any arbitrary GI.AbstractTrait or TraitTarget union thereof, like PointTrait or PolygonTrait) and perform some operation on it.

    centroid, area and distance have been implemented using the applyreduce framework.

    julia
    """
    +    applyreduce(f, op, target::Union{TraitTarget, GI.AbstractTrait}, obj; threaded)
    +
    +Apply function \`f\` to all objects with the \`target\` trait,
    +and reduce the result with an \`op\` like \`+\`.
    +
    +The order and grouping of application of \`op\` is not guaranteed.
    +
    +If \`threaded==true\` threads will be used over arrays and iterables,
    +feature collections and nested geometries.
    +"""
    +@inline function applyreduce(
    +    f::F, op::O, target, geom; threaded=false, init=nothing
    +) where {F, O}
    +    threaded = _booltype(threaded)
    +    _applyreduce(f, op, TraitTarget(target), geom; threaded, init)
    +end
    +
    +@inline _applyreduce(f::F, op::O, target, geom; threaded, init) where {F, O} =
    +    _applyreduce(f, op, target, GI.trait(geom), geom; threaded, init)

    Maybe use threads reducing over arrays

    julia
    @inline function _applyreduce(f::F, op::O, target, ::Nothing, A::AbstractArray; threaded, init) where {F, O}
    +    applyreduce_array(i) = _applyreduce(f, op, target, A[i]; threaded=_False(), init)
    +    _mapreducetasks(applyreduce_array, op, eachindex(A), threaded; init)
    +end

    Try to applyreduce over iterables

    julia
    @inline function _applyreduce(f::F, op::O, target, ::Nothing, iterable::IterableType; threaded, init) where {F, O, IterableType}
    +    if Tables.istable(iterable)
    +        _applyreduce_table(f, op, target, iterable; threaded, init)
    +    else
    +        applyreduce_iterable(i) = _applyreduce(f, op, target, i; threaded=_False(), init)
    +        if threaded isa _True # Try to \`collect\` and reduce over the vector with threads
    +            _applyreduce(f, op, target, collect(iterable); threaded, init)
    +        else

    Try to mapreduce the iterable as-is

    julia
                mapreduce(applyreduce_iterable, op, iterable; init)
    +        end
    +    end
    +end

    In this case, we don't reconstruct the table, but only operate on the geometry column.

    julia
    function _applyreduce_table(f::F, op::O, target, iterable::IterableType; threaded, init) where {F, O, IterableType}

    We extract the geometry column and run applyreduce on it.

    julia
        geometry_column = first(GI.geometrycolumns(iterable))
    +    return _applyreduce(f, op, target, Tables.getcolumn(iterable, geometry_column); threaded, init)
    +end

    If applyreduce wants features, then applyreduce over the rows as GI.Features.

    julia
    function _applyreduce_table(f::F, op::O, target::GI.FeatureTrait, iterable::IterableType; threaded, init) where {F, O, IterableType}

    We extract the geometry column and run apply on it.

    julia
        geometry_column = first(GI.geometrycolumns(iterable))
    +    property_names = Iterators.filter(!=(geometry_column), Tables.schema(iterable).names)
    +    features = map(Tables.rows(iterable)) do row
    +        GI.Feature(Tables.getcolumn(row, geometry_column), properties=NamedTuple(Iterators.map(Base.Fix1(_get_col_pair, row), property_names)))
    +    end
    +    return _applyreduce(f, op, target, features; threaded, init)
    +end

    Maybe use threads reducing over features of feature collections

    julia
    @inline function _applyreduce(f::F, op::O, target, ::GI.FeatureCollectionTrait, fc; threaded, init) where {F, O}
    +    applyreduce_fc(i) = _applyreduce(f, op, target, GI.getfeature(fc, i); threaded=_False(), init)
    +    _mapreducetasks(applyreduce_fc, op, 1:GI.nfeature(fc), threaded; init)
    +end

    Features just applyreduce to their geometry

    julia
    @inline _applyreduce(f::F, op::O, target, ::GI.FeatureTrait, feature; threaded, init) where {F, O} =
    +    _applyreduce(f, op, target, GI.geometry(feature); threaded, init)

    Maybe use threads over components of nested geometries

    julia
    @inline function _applyreduce(f::F, op::O, target, trait, geom; threaded, init) where {F, O}
    +    applyreduce_geom(i) = _applyreduce(f, op, target, GI.getgeom(geom, i); threaded=_False(), init)
    +    _mapreducetasks(applyreduce_geom, op, 1:GI.ngeom(geom), threaded; init)
    +end

    Don't thread over points it won't pay off

    julia
    @inline function _applyreduce(
    +    f::F, op::O, target, trait::Union{GI.LinearRing,GI.LineString,GI.MultiPoint}, geom;
    +    threaded, init
    +) where {F, O}
    +    _applyreduce(f, op, target, GI.getgeom(geom); threaded=_False(), init)
    +end

    Apply f to the target

    julia
    @inline function _applyreduce(f::F, op::O, ::TraitTarget{Target}, ::Trait, x; kw...) where {F,O,Target,Trait<:Target}
    +    f(x)
    +end

    Fail if we hit PointTrait _applyreduce(f, op, target::TraitTarget{Target}, trait::PointTrait, geom; kw...) where Target = throw(ArgumentError("target target not found")) Specific cases to avoid method ambiguity

    julia
    for T in (
    +    GI.PointTrait, GI.LinearRing, GI.LineString,
    +    GI.MultiPoint, GI.FeatureTrait, GI.FeatureCollectionTrait
    +)
    +    @eval _applyreduce(f::F, op::O, ::TraitTarget{<:$T}, trait::$T, x; kw...) where {F, O} = f(x)
    +end
    +
    +### \`_mapreducetasks\` - flexible, threaded mapreduce
    +
    +import Base.Threads: nthreads, @threads, @spawn

    Threading utility, modified Mason Protters threading PSA run f over ntasks, where f receives an AbstractArray/range of linear indices

    WARNING: this will not work for mean/median - only ops where grouping is possible. That's because the implementation operates in chunks, and not globally.

    If you absolutely need a single chunk, then threaded = false will always decompose to straight mapreduce without grouping.

    julia
    @inline function _mapreducetasks(f::F, op, taskrange, threaded::_True; init) where F
    +    ntasks = length(taskrange)

    Customize this as needed. More tasks have more overhead, but better load balancing

    julia
        tasks_per_thread = 2
    +    chunk_size = max(1, ntasks ÷ (tasks_per_thread * nthreads()))

    partition the range into chunks

    julia
        task_chunks = Iterators.partition(taskrange, chunk_size)

    Map over the chunks

    julia
        tasks = map(task_chunks) do chunk

    Spawn a task to process this chunk

    julia
            @spawn begin

    Where we map f over the chunk indices

    julia
                mapreduce(f, op, chunk; init)
    +        end
    +    end

    Finally we join the results into a new vector

    julia
        return mapreduce(fetch, op, tasks; init)
    +end
    +Base.@assume_effects :foldable function _mapreducetasks(f::F, op, taskrange, threaded::_False; init) where F
    +    mapreduce(f, op, taskrange; init)
    +end

    This page was generated using Literate.jl.

    `,51)]))}const y=i(h,[["render",e]]);export{E as __pageData,y as default}; diff --git a/previews/PR239/assets/source_src_geometry_utils.md.CpDbCg3A.js b/previews/PR239/assets/source_src_geometry_utils.md.CpDbCg3A.js new file mode 100644 index 000000000..ffd71c493 --- /dev/null +++ b/previews/PR239/assets/source_src_geometry_utils.md.CpDbCg3A.js @@ -0,0 +1,2 @@ +import{_ as i,c as a,a5 as t,o as e}from"./chunks/framework.onQNwZ2I.js";const E=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/src/geometry_utils.md","filePath":"source/src/geometry_utils.md","lastUpdated":null}'),n={name:"source/src/geometry_utils.md"};function h(l,s,k,p,r,g){return e(),a("div",null,s[0]||(s[0]=[t(`
    julia
    _linearring(geom::GI.LineString) = GI.LinearRing(parent(geom); extent=geom.extent, crs=geom.crs)
    +_linearring(geom::GI.LinearRing) = geom

    This page was generated using Literate.jl.

    `,3)]))}const o=i(n,[["render",h]]);export{E as __pageData,o as default}; diff --git a/previews/PR239/assets/source_src_geometry_utils.md.CpDbCg3A.lean.js b/previews/PR239/assets/source_src_geometry_utils.md.CpDbCg3A.lean.js new file mode 100644 index 000000000..ffd71c493 --- /dev/null +++ b/previews/PR239/assets/source_src_geometry_utils.md.CpDbCg3A.lean.js @@ -0,0 +1,2 @@ +import{_ as i,c as a,a5 as t,o as e}from"./chunks/framework.onQNwZ2I.js";const E=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/src/geometry_utils.md","filePath":"source/src/geometry_utils.md","lastUpdated":null}'),n={name:"source/src/geometry_utils.md"};function h(l,s,k,p,r,g){return e(),a("div",null,s[0]||(s[0]=[t(`
    julia
    _linearring(geom::GI.LineString) = GI.LinearRing(parent(geom); extent=geom.extent, crs=geom.crs)
    +_linearring(geom::GI.LinearRing) = geom

    This page was generated using Literate.jl.

    `,3)]))}const o=i(n,[["render",h]]);export{E as __pageData,o as default}; diff --git a/previews/PR239/assets/source_src_keyword_docs.md.BxLB2oH3.js b/previews/PR239/assets/source_src_keyword_docs.md.BxLB2oH3.js new file mode 100644 index 000000000..7b174f887 --- /dev/null +++ b/previews/PR239/assets/source_src_keyword_docs.md.BxLB2oH3.js @@ -0,0 +1 @@ +import{_ as a,c as i,a5 as t,o as e}from"./chunks/framework.onQNwZ2I.js";const c=JSON.parse('{"title":"Keyword docs","description":"","frontmatter":{},"headers":[],"relativePath":"source/src/keyword_docs.md","filePath":"source/src/keyword_docs.md","lastUpdated":null}'),n={name:"source/src/keyword_docs.md"};function l(h,s,o,r,p,d){return e(),i("div",null,s[0]||(s[0]=[t('

    Keyword docs

    This file defines common keyword documentation, that can be spliced into docstrings.

    julia
    const THREADED_KEYWORD = "- `threaded`: `true` or `false`. Whether to use multithreading. Defaults to `false`."\nconst CRS_KEYWORD = "- `crs`: The CRS to attach to geometries. Defaults to `nothing`."\nconst CALC_EXTENT_KEYWORD = "- `calc_extent`: `true` or `false`. Whether to calculate the extent. Defaults to `false`."\n\nconst APPLY_KEYWORDS = """\n$THREADED_KEYWORD\n$CRS_KEYWORD\n$CALC_EXTENT_KEYWORD\n"""

    This page was generated using Literate.jl.

    ',5)]))}const u=a(n,[["render",l]]);export{c as __pageData,u as default}; diff --git a/previews/PR239/assets/source_src_keyword_docs.md.BxLB2oH3.lean.js b/previews/PR239/assets/source_src_keyword_docs.md.BxLB2oH3.lean.js new file mode 100644 index 000000000..7b174f887 --- /dev/null +++ b/previews/PR239/assets/source_src_keyword_docs.md.BxLB2oH3.lean.js @@ -0,0 +1 @@ +import{_ as a,c as i,a5 as t,o as e}from"./chunks/framework.onQNwZ2I.js";const c=JSON.parse('{"title":"Keyword docs","description":"","frontmatter":{},"headers":[],"relativePath":"source/src/keyword_docs.md","filePath":"source/src/keyword_docs.md","lastUpdated":null}'),n={name:"source/src/keyword_docs.md"};function l(h,s,o,r,p,d){return e(),i("div",null,s[0]||(s[0]=[t('

    Keyword docs

    This file defines common keyword documentation, that can be spliced into docstrings.

    julia
    const THREADED_KEYWORD = "- `threaded`: `true` or `false`. Whether to use multithreading. Defaults to `false`."\nconst CRS_KEYWORD = "- `crs`: The CRS to attach to geometries. Defaults to `nothing`."\nconst CALC_EXTENT_KEYWORD = "- `calc_extent`: `true` or `false`. Whether to calculate the extent. Defaults to `false`."\n\nconst APPLY_KEYWORDS = """\n$THREADED_KEYWORD\n$CRS_KEYWORD\n$CALC_EXTENT_KEYWORD\n"""

    This page was generated using Literate.jl.

    ',5)]))}const u=a(n,[["render",l]]);export{c as __pageData,u as default}; diff --git a/previews/PR239/assets/source_src_other_primitives.md.BVzBrNUT.js b/previews/PR239/assets/source_src_other_primitives.md.BVzBrNUT.js new file mode 100644 index 000000000..9d232a003 --- /dev/null +++ b/previews/PR239/assets/source_src_other_primitives.md.BVzBrNUT.js @@ -0,0 +1,131 @@ +import{_ as k,c as l,j as i,a,G as h,a5 as t,B as p,o as e}from"./chunks/framework.onQNwZ2I.js";const A=JSON.parse('{"title":"Other primitives (unwrap, flatten, etc)","description":"","frontmatter":{},"headers":[],"relativePath":"source/src/other_primitives.md","filePath":"source/src/other_primitives.md","lastUpdated":null}'),r={name:"source/src/other_primitives.md"},E={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""};function F(o,s,c,C,u,m){const n=p("Badge");return e(),l("div",null,[s[12]||(s[12]=i("h1",{id:"Other-primitives-(unwrap,-flatten,-etc)",tabindex:"-1"},[a("Other primitives (unwrap, flatten, etc) "),i("a",{class:"header-anchor",href:"#Other-primitives-(unwrap,-flatten,-etc)","aria-label":'Permalink to "Other primitives (unwrap, flatten, etc) {#Other-primitives-(unwrap,-flatten,-etc)}"'},"​")],-1)),s[13]||(s[13]=i("p",null,"This file defines the following primitives:",-1)),i("details",E,[i("summary",null,[s[0]||(s[0]=i("a",{id:"GeometryOpsCore.unwrap-source-src-other_primitives",href:"#GeometryOpsCore.unwrap-source-src-other_primitives"},[i("span",{class:"jlbinding"},"GeometryOpsCore.unwrap")],-1)),s[1]||(s[1]=a()),h(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=t(`
    julia
    unwrap(target::Type{<:AbstractTrait}, obj)
    +unwrap(f, target::Type{<:AbstractTrait}, obj)

    Unwrap the object to vectors, down to the target trait.

    If f is passed in it will be applied to the target geometries as they are found.

    source

    `,4))]),i("details",d,[i("summary",null,[s[3]||(s[3]=i("a",{id:"GeometryOpsCore.flatten-source-src-other_primitives",href:"#GeometryOpsCore.flatten-source-src-other_primitives"},[i("span",{class:"jlbinding"},"GeometryOpsCore.flatten")],-1)),s[4]||(s[4]=a()),h(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=t(`
    julia
    flatten(target::Type{<:GI.AbstractTrait}, obj)
    +flatten(f, target::Type{<:GI.AbstractTrait}, obj)

    Lazily flatten any AbstractArray, iterator, FeatureCollectionTrait, FeatureTrait or AbstractGeometryTrait object obj, so that objects with the target trait are returned by the iterator.

    If f is passed in it will be applied to the target geometries.

    source

    `,4))]),i("details",g,[i("summary",null,[s[6]||(s[6]=i("a",{id:"GeometryOpsCore.reconstruct-source-src-other_primitives",href:"#GeometryOpsCore.reconstruct-source-src-other_primitives"},[i("span",{class:"jlbinding"},"GeometryOpsCore.reconstruct")],-1)),s[7]||(s[7]=a()),h(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=t('
    julia
    reconstruct(geom, components)

    Reconstruct geom from an iterable of component objects that match its structure.

    All objects in components must have the same GeoInterface.trait.

    Usually used in combination with flatten.

    source

    ',5))]),i("details",y,[i("summary",null,[s[9]||(s[9]=i("a",{id:"GeometryOpsCore.rebuild-source-src-other_primitives",href:"#GeometryOpsCore.rebuild-source-src-other_primitives"},[i("span",{class:"jlbinding"},"GeometryOpsCore.rebuild")],-1)),s[10]||(s[10]=a()),h(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[11]||(s[11]=t('
    julia
    rebuild(geom, child_geoms)

    Rebuild a geometry from child geometries.

    By default geometries will be rebuilt as a GeoInterface.Wrappers geometry, but rebuild can have methods added to it to dispatch on geometries from other packages and specify how to rebuild them.

    (Maybe it should go into GeoInterface.jl)

    source

    ',5))]),s[14]||(s[14]=t(`
    julia
    """
    +    unwrap(target::Type{<:AbstractTrait}, obj)
    +    unwrap(f, target::Type{<:AbstractTrait}, obj)
    +
    +Unwrap the object to vectors, down to the target trait.
    +
    +If \`f\` is passed in it will be applied to the target geometries
    +as they are found.
    +"""
    +function unwrap end
    +unwrap(target::Type, geom) = unwrap(identity, target, geom)

    Add dispatch argument for trait

    julia
    unwrap(f, target::Type, geom) = unwrap(f, target, GI.trait(geom), geom)

    Try to unwrap over iterables

    julia
    unwrap(f, target::Type, ::Nothing, iterable) =
    +    map(x -> unwrap(f, target, x), iterable)

    Rewrap feature collections

    julia
    unwrap(f, target::Type, ::GI.FeatureCollectionTrait, fc) =
    +    map(x -> unwrap(f, target, x), GI.getfeature(fc))
    +unwrap(f, target::Type, ::GI.FeatureTrait, feature) =
    +    unwrap(f, target, GI.geometry(feature))
    +unwrap(f, target::Type, trait, geom) = map(g -> unwrap(f, target, g), GI.getgeom(geom))

    Apply f to the target geometry

    julia
    unwrap(f, ::Type{Target}, ::Trait, geom) where {Target,Trait<:Target} = f(geom)

    Fail if we hit PointTrait

    julia
    unwrap(f, target::Type, trait::GI.PointTrait, geom) =
    +    throw(ArgumentError("target $target not found, but reached a \`PointTrait\` leaf"))

    Specific cases to avoid method ambiguity

    julia
    unwrap(f, target::Type{GI.PointTrait}, trait::GI.PointTrait, geom) = f(geom)
    +unwrap(f, target::Type{GI.FeatureTrait}, ::GI.FeatureTrait, feature) = f(feature)
    +unwrap(f, target::Type{GI.FeatureCollectionTrait}, ::GI.FeatureCollectionTrait, fc) = f(fc)
    +
    +"""
    +    flatten(target::Type{<:GI.AbstractTrait}, obj)
    +    flatten(f, target::Type{<:GI.AbstractTrait}, obj)
    +
    +Lazily flatten any \`AbstractArray\`, iterator, \`FeatureCollectionTrait\`,
    +\`FeatureTrait\` or \`AbstractGeometryTrait\` object \`obj\`, so that objects
    +with the \`target\` trait are returned by the iterator.
    +
    +If \`f\` is passed in it will be applied to the target geometries.
    +"""
    +flatten(::Type{Target}, geom) where {Target<:GI.AbstractTrait} = flatten(identity, Target, geom)
    +flatten(f, ::Type{Target}, geom) where {Target<:GI.AbstractTrait} = _flatten(f, Target, geom)
    +
    +_flatten(f, ::Type{Target}, geom) where Target = _flatten(f, Target, GI.trait(geom), geom)

    Try to flatten over iterables

    julia
    function _flatten(f, ::Type{Target}, ::Nothing, iterable) where Target
    +    if Tables.istable(iterable)
    +        column = Tables.getcolumn(iterable, first(GI.geometrycolumns(iterable)))
    +        Iterators.map(x -> _flatten(f, Target, x), column) |> Iterators.flatten
    +    else
    +        Iterators.map(x -> _flatten(f, Target, x), iterable) |> Iterators.flatten
    +    end
    +end

    Flatten feature collections

    julia
    function _flatten(f, ::Type{Target}, ::GI.FeatureCollectionTrait, fc) where Target
    +    Iterators.map(GI.getfeature(fc)) do feature
    +        _flatten(f, Target, feature)
    +    end |> Iterators.flatten
    +end
    +_flatten(f, ::Type{Target}, ::GI.FeatureTrait, feature) where Target =
    +    _flatten(f, Target, GI.geometry(feature))

    Apply f to the target geometry

    julia
    _flatten(f, ::Type{Target}, ::Trait, geom) where {Target,Trait<:Target} = (f(geom),)
    +_flatten(f, ::Type{Target}, trait, geom) where Target =
    +    Iterators.flatten(Iterators.map(g -> _flatten(f, Target, g), GI.getgeom(geom)))

    Fail if we hit PointTrait without running f

    julia
    _flatten(f, ::Type{Target}, trait::GI.PointTrait, geom) where Target =
    +    throw(ArgumentError("target $Target not found, but reached a \`PointTrait\` leaf"))

    Specific cases to avoid method ambiguity

    julia
    _flatten(f, ::Type{<:GI.PointTrait}, ::GI.PointTrait, geom) = (f(geom),)
    +_flatten(f, ::Type{<:GI.FeatureTrait}, ::GI.FeatureTrait, feature) = (f(feature),)
    +_flatten(f, ::Type{<:GI.FeatureCollectionTrait}, ::GI.FeatureCollectionTrait, fc) = (f(fc),)
    +
    +
    +"""
    +    reconstruct(geom, components)
    +
    +Reconstruct \`geom\` from an iterable of component objects that match its structure.
    +
    +All objects in \`components\` must have the same \`GeoInterface.trait\`.
    +
    +Usually used in combination with \`flatten\`.
    +"""
    +function reconstruct(geom, components)
    +    obj, iter = _reconstruct(geom, components)
    +    return obj
    +end
    +
    +_reconstruct(geom, components) =
    +    _reconstruct(typeof(GI.trait(first(components))), geom, components, 1)
    +_reconstruct(::Type{Target}, geom, components, iter) where Target =
    +    _reconstruct(Target, GI.trait(geom), geom, components, iter)

    Try to reconstruct over iterables

    julia
    function _reconstruct(::Type{Target}, ::Nothing, iterable, components, iter) where Target
    +    vect = map(iterable) do x

    iter is updated by _reconstruct here

    julia
            obj, iter = _reconstruct(Target, x, components, iter)
    +        obj
    +    end
    +    return vect, iter
    +end

    Reconstruct feature collections

    julia
    function _reconstruct(::Type{Target}, ::GI.FeatureCollectionTrait, fc, components, iter) where Target
    +    features = map(GI.getfeature(fc)) do feature

    iter is updated by _reconstruct here

    julia
            newfeature, iter = _reconstruct(Target, feature, components, iter)
    +        newfeature
    +    end
    +    return GI.FeatureCollection(features; crs=GI.crs(fc)), iter
    +end
    +function _reconstruct(::Type{Target}, ::GI.FeatureTrait, feature, components, iter) where Target
    +    geom, iter = _reconstruct(Target, GI.geometry(feature), components, iter)
    +    return GI.Feature(geom; properties=GI.properties(feature), crs=GI.crs(feature)), iter
    +end
    +function _reconstruct(::Type{Target}, trait, geom, components, iter) where Target
    +    geoms = map(GI.getgeom(geom)) do subgeom

    iter is updated by _reconstruct here

    julia
            subgeom1, iter = _reconstruct(Target, GI.trait(subgeom), subgeom, components, iter)
    +        subgeom1
    +    end
    +    return rebuild(geom, geoms), iter
    +end

    Apply f to the target geometry

    julia
    _reconstruct(::Type{Target}, ::Trait, geom, components, iter) where {Target,Trait<:Target} =
    +    iterate(components, iter)

    Specific cases to avoid method ambiguity

    julia
    _reconstruct(::Type{<:GI.PointTrait}, ::GI.PointTrait, geom, components, iter) = iterate(components, iter)
    +_reconstruct(::Type{<:GI.FeatureTrait}, ::GI.FeatureTrait, feature, components, iter) = iterate(feature, iter)
    +_reconstruct(::Type{<:GI.FeatureCollectionTrait}, ::GI.FeatureCollectionTrait, fc, components, iter) = iterate(fc, iter)

    Fail if we hit PointTrait without running f

    julia
    _reconstruct(::Type{Target}, trait::GI.PointTrait, geom, components, iter) where Target =
    +    throw(ArgumentError("target $Target not found, but reached a \`PointTrait\` leaf"))
    +
    +"""
    +    rebuild(geom, child_geoms)
    +
    +Rebuild a geometry from child geometries.
    +
    +By default geometries will be rebuilt as a \`GeoInterface.Wrappers\`
    +geometry, but \`rebuild\` can have methods added to it to dispatch
    +on geometries from other packages and specify how to rebuild them.
    +
    +(Maybe it should go into GeoInterface.jl)
    +"""
    +rebuild(geom, child_geoms; kw...) = rebuild(GI.trait(geom), geom, child_geoms; kw...)
    +function rebuild(trait::GI.AbstractTrait, geom, child_geoms; crs=GI.crs(geom), extent=nothing)
    +    T = GI.geointerface_geomtype(trait)
    +    haveZ = (GI.is3d(child) for child in child_geoms)
    +    haveM = (GI.ismeasured(child) for child in child_geoms)
    +
    +    consistentZ = length(child_geoms) == 1 ? true : all(==(first(haveZ)), haveZ)
    +    consistentM = length(child_geoms) == 1 ? true : all(==(first(haveM)), haveM)
    +
    +    if !consistentZ || !consistentM
    +        @show consistentZ consistentM
    +        @show GI.is3d.(child_geoms)
    +        @show GI.ismeasured.(child_geoms)
    +        throw(ArgumentError("child geometries do not have consistent 3d or measure attributes."))
    +    end
    +
    +    hasZ = first(haveZ)
    +    hasM = first(haveM)
    +
    +    return T{hasZ,hasM}(child_geoms; crs, extent)
    +end

    This page was generated using Literate.jl.

    `,41))])}const B=k(r,[["render",F]]);export{A as __pageData,B as default}; diff --git a/previews/PR239/assets/source_src_other_primitives.md.BVzBrNUT.lean.js b/previews/PR239/assets/source_src_other_primitives.md.BVzBrNUT.lean.js new file mode 100644 index 000000000..9d232a003 --- /dev/null +++ b/previews/PR239/assets/source_src_other_primitives.md.BVzBrNUT.lean.js @@ -0,0 +1,131 @@ +import{_ as k,c as l,j as i,a,G as h,a5 as t,B as p,o as e}from"./chunks/framework.onQNwZ2I.js";const A=JSON.parse('{"title":"Other primitives (unwrap, flatten, etc)","description":"","frontmatter":{},"headers":[],"relativePath":"source/src/other_primitives.md","filePath":"source/src/other_primitives.md","lastUpdated":null}'),r={name:"source/src/other_primitives.md"},E={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""};function F(o,s,c,C,u,m){const n=p("Badge");return e(),l("div",null,[s[12]||(s[12]=i("h1",{id:"Other-primitives-(unwrap,-flatten,-etc)",tabindex:"-1"},[a("Other primitives (unwrap, flatten, etc) "),i("a",{class:"header-anchor",href:"#Other-primitives-(unwrap,-flatten,-etc)","aria-label":'Permalink to "Other primitives (unwrap, flatten, etc) {#Other-primitives-(unwrap,-flatten,-etc)}"'},"​")],-1)),s[13]||(s[13]=i("p",null,"This file defines the following primitives:",-1)),i("details",E,[i("summary",null,[s[0]||(s[0]=i("a",{id:"GeometryOpsCore.unwrap-source-src-other_primitives",href:"#GeometryOpsCore.unwrap-source-src-other_primitives"},[i("span",{class:"jlbinding"},"GeometryOpsCore.unwrap")],-1)),s[1]||(s[1]=a()),h(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[2]||(s[2]=t(`
    julia
    unwrap(target::Type{<:AbstractTrait}, obj)
    +unwrap(f, target::Type{<:AbstractTrait}, obj)

    Unwrap the object to vectors, down to the target trait.

    If f is passed in it will be applied to the target geometries as they are found.

    source

    `,4))]),i("details",d,[i("summary",null,[s[3]||(s[3]=i("a",{id:"GeometryOpsCore.flatten-source-src-other_primitives",href:"#GeometryOpsCore.flatten-source-src-other_primitives"},[i("span",{class:"jlbinding"},"GeometryOpsCore.flatten")],-1)),s[4]||(s[4]=a()),h(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[5]||(s[5]=t(`
    julia
    flatten(target::Type{<:GI.AbstractTrait}, obj)
    +flatten(f, target::Type{<:GI.AbstractTrait}, obj)

    Lazily flatten any AbstractArray, iterator, FeatureCollectionTrait, FeatureTrait or AbstractGeometryTrait object obj, so that objects with the target trait are returned by the iterator.

    If f is passed in it will be applied to the target geometries.

    source

    `,4))]),i("details",g,[i("summary",null,[s[6]||(s[6]=i("a",{id:"GeometryOpsCore.reconstruct-source-src-other_primitives",href:"#GeometryOpsCore.reconstruct-source-src-other_primitives"},[i("span",{class:"jlbinding"},"GeometryOpsCore.reconstruct")],-1)),s[7]||(s[7]=a()),h(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[8]||(s[8]=t('
    julia
    reconstruct(geom, components)

    Reconstruct geom from an iterable of component objects that match its structure.

    All objects in components must have the same GeoInterface.trait.

    Usually used in combination with flatten.

    source

    ',5))]),i("details",y,[i("summary",null,[s[9]||(s[9]=i("a",{id:"GeometryOpsCore.rebuild-source-src-other_primitives",href:"#GeometryOpsCore.rebuild-source-src-other_primitives"},[i("span",{class:"jlbinding"},"GeometryOpsCore.rebuild")],-1)),s[10]||(s[10]=a()),h(n,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[11]||(s[11]=t('
    julia
    rebuild(geom, child_geoms)

    Rebuild a geometry from child geometries.

    By default geometries will be rebuilt as a GeoInterface.Wrappers geometry, but rebuild can have methods added to it to dispatch on geometries from other packages and specify how to rebuild them.

    (Maybe it should go into GeoInterface.jl)

    source

    ',5))]),s[14]||(s[14]=t(`
    julia
    """
    +    unwrap(target::Type{<:AbstractTrait}, obj)
    +    unwrap(f, target::Type{<:AbstractTrait}, obj)
    +
    +Unwrap the object to vectors, down to the target trait.
    +
    +If \`f\` is passed in it will be applied to the target geometries
    +as they are found.
    +"""
    +function unwrap end
    +unwrap(target::Type, geom) = unwrap(identity, target, geom)

    Add dispatch argument for trait

    julia
    unwrap(f, target::Type, geom) = unwrap(f, target, GI.trait(geom), geom)

    Try to unwrap over iterables

    julia
    unwrap(f, target::Type, ::Nothing, iterable) =
    +    map(x -> unwrap(f, target, x), iterable)

    Rewrap feature collections

    julia
    unwrap(f, target::Type, ::GI.FeatureCollectionTrait, fc) =
    +    map(x -> unwrap(f, target, x), GI.getfeature(fc))
    +unwrap(f, target::Type, ::GI.FeatureTrait, feature) =
    +    unwrap(f, target, GI.geometry(feature))
    +unwrap(f, target::Type, trait, geom) = map(g -> unwrap(f, target, g), GI.getgeom(geom))

    Apply f to the target geometry

    julia
    unwrap(f, ::Type{Target}, ::Trait, geom) where {Target,Trait<:Target} = f(geom)

    Fail if we hit PointTrait

    julia
    unwrap(f, target::Type, trait::GI.PointTrait, geom) =
    +    throw(ArgumentError("target $target not found, but reached a \`PointTrait\` leaf"))

    Specific cases to avoid method ambiguity

    julia
    unwrap(f, target::Type{GI.PointTrait}, trait::GI.PointTrait, geom) = f(geom)
    +unwrap(f, target::Type{GI.FeatureTrait}, ::GI.FeatureTrait, feature) = f(feature)
    +unwrap(f, target::Type{GI.FeatureCollectionTrait}, ::GI.FeatureCollectionTrait, fc) = f(fc)
    +
    +"""
    +    flatten(target::Type{<:GI.AbstractTrait}, obj)
    +    flatten(f, target::Type{<:GI.AbstractTrait}, obj)
    +
    +Lazily flatten any \`AbstractArray\`, iterator, \`FeatureCollectionTrait\`,
    +\`FeatureTrait\` or \`AbstractGeometryTrait\` object \`obj\`, so that objects
    +with the \`target\` trait are returned by the iterator.
    +
    +If \`f\` is passed in it will be applied to the target geometries.
    +"""
    +flatten(::Type{Target}, geom) where {Target<:GI.AbstractTrait} = flatten(identity, Target, geom)
    +flatten(f, ::Type{Target}, geom) where {Target<:GI.AbstractTrait} = _flatten(f, Target, geom)
    +
    +_flatten(f, ::Type{Target}, geom) where Target = _flatten(f, Target, GI.trait(geom), geom)

    Try to flatten over iterables

    julia
    function _flatten(f, ::Type{Target}, ::Nothing, iterable) where Target
    +    if Tables.istable(iterable)
    +        column = Tables.getcolumn(iterable, first(GI.geometrycolumns(iterable)))
    +        Iterators.map(x -> _flatten(f, Target, x), column) |> Iterators.flatten
    +    else
    +        Iterators.map(x -> _flatten(f, Target, x), iterable) |> Iterators.flatten
    +    end
    +end

    Flatten feature collections

    julia
    function _flatten(f, ::Type{Target}, ::GI.FeatureCollectionTrait, fc) where Target
    +    Iterators.map(GI.getfeature(fc)) do feature
    +        _flatten(f, Target, feature)
    +    end |> Iterators.flatten
    +end
    +_flatten(f, ::Type{Target}, ::GI.FeatureTrait, feature) where Target =
    +    _flatten(f, Target, GI.geometry(feature))

    Apply f to the target geometry

    julia
    _flatten(f, ::Type{Target}, ::Trait, geom) where {Target,Trait<:Target} = (f(geom),)
    +_flatten(f, ::Type{Target}, trait, geom) where Target =
    +    Iterators.flatten(Iterators.map(g -> _flatten(f, Target, g), GI.getgeom(geom)))

    Fail if we hit PointTrait without running f

    julia
    _flatten(f, ::Type{Target}, trait::GI.PointTrait, geom) where Target =
    +    throw(ArgumentError("target $Target not found, but reached a \`PointTrait\` leaf"))

    Specific cases to avoid method ambiguity

    julia
    _flatten(f, ::Type{<:GI.PointTrait}, ::GI.PointTrait, geom) = (f(geom),)
    +_flatten(f, ::Type{<:GI.FeatureTrait}, ::GI.FeatureTrait, feature) = (f(feature),)
    +_flatten(f, ::Type{<:GI.FeatureCollectionTrait}, ::GI.FeatureCollectionTrait, fc) = (f(fc),)
    +
    +
    +"""
    +    reconstruct(geom, components)
    +
    +Reconstruct \`geom\` from an iterable of component objects that match its structure.
    +
    +All objects in \`components\` must have the same \`GeoInterface.trait\`.
    +
    +Usually used in combination with \`flatten\`.
    +"""
    +function reconstruct(geom, components)
    +    obj, iter = _reconstruct(geom, components)
    +    return obj
    +end
    +
    +_reconstruct(geom, components) =
    +    _reconstruct(typeof(GI.trait(first(components))), geom, components, 1)
    +_reconstruct(::Type{Target}, geom, components, iter) where Target =
    +    _reconstruct(Target, GI.trait(geom), geom, components, iter)

    Try to reconstruct over iterables

    julia
    function _reconstruct(::Type{Target}, ::Nothing, iterable, components, iter) where Target
    +    vect = map(iterable) do x

    iter is updated by _reconstruct here

    julia
            obj, iter = _reconstruct(Target, x, components, iter)
    +        obj
    +    end
    +    return vect, iter
    +end

    Reconstruct feature collections

    julia
    function _reconstruct(::Type{Target}, ::GI.FeatureCollectionTrait, fc, components, iter) where Target
    +    features = map(GI.getfeature(fc)) do feature

    iter is updated by _reconstruct here

    julia
            newfeature, iter = _reconstruct(Target, feature, components, iter)
    +        newfeature
    +    end
    +    return GI.FeatureCollection(features; crs=GI.crs(fc)), iter
    +end
    +function _reconstruct(::Type{Target}, ::GI.FeatureTrait, feature, components, iter) where Target
    +    geom, iter = _reconstruct(Target, GI.geometry(feature), components, iter)
    +    return GI.Feature(geom; properties=GI.properties(feature), crs=GI.crs(feature)), iter
    +end
    +function _reconstruct(::Type{Target}, trait, geom, components, iter) where Target
    +    geoms = map(GI.getgeom(geom)) do subgeom

    iter is updated by _reconstruct here

    julia
            subgeom1, iter = _reconstruct(Target, GI.trait(subgeom), subgeom, components, iter)
    +        subgeom1
    +    end
    +    return rebuild(geom, geoms), iter
    +end

    Apply f to the target geometry

    julia
    _reconstruct(::Type{Target}, ::Trait, geom, components, iter) where {Target,Trait<:Target} =
    +    iterate(components, iter)

    Specific cases to avoid method ambiguity

    julia
    _reconstruct(::Type{<:GI.PointTrait}, ::GI.PointTrait, geom, components, iter) = iterate(components, iter)
    +_reconstruct(::Type{<:GI.FeatureTrait}, ::GI.FeatureTrait, feature, components, iter) = iterate(feature, iter)
    +_reconstruct(::Type{<:GI.FeatureCollectionTrait}, ::GI.FeatureCollectionTrait, fc, components, iter) = iterate(fc, iter)

    Fail if we hit PointTrait without running f

    julia
    _reconstruct(::Type{Target}, trait::GI.PointTrait, geom, components, iter) where Target =
    +    throw(ArgumentError("target $Target not found, but reached a \`PointTrait\` leaf"))
    +
    +"""
    +    rebuild(geom, child_geoms)
    +
    +Rebuild a geometry from child geometries.
    +
    +By default geometries will be rebuilt as a \`GeoInterface.Wrappers\`
    +geometry, but \`rebuild\` can have methods added to it to dispatch
    +on geometries from other packages and specify how to rebuild them.
    +
    +(Maybe it should go into GeoInterface.jl)
    +"""
    +rebuild(geom, child_geoms; kw...) = rebuild(GI.trait(geom), geom, child_geoms; kw...)
    +function rebuild(trait::GI.AbstractTrait, geom, child_geoms; crs=GI.crs(geom), extent=nothing)
    +    T = GI.geointerface_geomtype(trait)
    +    haveZ = (GI.is3d(child) for child in child_geoms)
    +    haveM = (GI.ismeasured(child) for child in child_geoms)
    +
    +    consistentZ = length(child_geoms) == 1 ? true : all(==(first(haveZ)), haveZ)
    +    consistentM = length(child_geoms) == 1 ? true : all(==(first(haveM)), haveM)
    +
    +    if !consistentZ || !consistentM
    +        @show consistentZ consistentM
    +        @show GI.is3d.(child_geoms)
    +        @show GI.ismeasured.(child_geoms)
    +        throw(ArgumentError("child geometries do not have consistent 3d or measure attributes."))
    +    end
    +
    +    hasZ = first(haveZ)
    +    hasM = first(haveM)
    +
    +    return T{hasZ,hasM}(child_geoms; crs, extent)
    +end

    This page was generated using Literate.jl.

    `,41))])}const B=k(r,[["render",F]]);export{A as __pageData,B as default}; diff --git a/previews/PR239/assets/source_src_types.md.BulrghgC.js b/previews/PR239/assets/source_src_types.md.BulrghgC.js new file mode 100644 index 000000000..21ac874a0 --- /dev/null +++ b/previews/PR239/assets/source_src_types.md.BulrghgC.js @@ -0,0 +1,111 @@ +import{_ as a,c as i,a5 as n,o as e}from"./chunks/framework.onQNwZ2I.js";const c=JSON.parse('{"title":"Types","description":"","frontmatter":{},"headers":[],"relativePath":"source/src/types.md","filePath":"source/src/types.md","lastUpdated":null}'),t={name:"source/src/types.md"};function l(p,s,h,k,r,o){return e(),i("div",null,s[0]||(s[0]=[n(`

    Types

    This defines core types that the GeometryOps ecosystem uses, and that are usable in more than just GeometryOps.

    Manifold

    A manifold is mathematically defined as a topological space that resembles Euclidean space locally.

    In GeometryOps (and geodesy more generally), there are three manifolds we care about:

    • Planar: the 2d plane, a completely Euclidean manifold

    • Spherical: the unit sphere, but one where areas are multiplied by the radius of the Earth. This is not Euclidean globally, but all map projections attempt to represent the sphere on the Euclidean 2D plane to varying degrees of success.

    • Geodesic: the ellipsoid, the closest we can come to representing the Earth by a simple geometric shape. Parametrized by semimajor_axis and inv_flattening.

    Generally, we aim to have Linear and Spherical be operable everywhere, whereas Geodesic will only apply in specific circumstances. Currently, those circumstances are area and segmentize, but this could be extended with time and https://github.com/JuliaGeo/SphericalGeodesics.jl.

    julia
    export Planar, Spherical, Geodesic
    +export TraitTarget
    +export BoolsAsTypes, _True, _False, _booltype
    +
    +"""
    +    abstract type Manifold
    +
    +A manifold is mathematically defined as a topological space that resembles Euclidean space locally.
    +
    +We use the manifold definition to define the space in which an operation should be performed, or where a geometry lies.
    +
    +Currently we have \`Planar\`, \`Spherical\`, and \`Geodesic\` manifolds.
    +"""
    +abstract type Manifold end
    +
    +"""
    +    Planar()
    +
    +A planar manifold refers to the 2D Euclidean plane.
    +
    +Z coordinates may be accepted but will not influence geometry calculations, which
    +are done purely on 2D geometry.  This is the standard "2.5D" model used by e.g. GEOS.
    +"""
    +struct Planar <: Manifold
    +end
    +
    +"""
    +    Spherical(; radius)
    +
    +A spherical manifold means that the geometry is on the 3-sphere (but is represented by 2-D longitude and latitude).
    +
    +By default, the radius is defined as the mean radius of the Earth, \`6371008.8 m\`.
    +
    +# Extended help
    +
    +!!! note
    +    The traditional definition of spherical coordinates in physics and mathematics,
    +    \`\`r, \\\\theta, \\\\phi\`\`, uses the _colatitude_, that measures angular displacement from the \`z\`-axis.
    +
    +    Here, we use the geographic definition of longitude and latitude, meaning
    +    that \`lon\` is longitude between -180 and 180, and \`lat\` is latitude between
    +    \`-90\` (south pole) and \`90\` (north pole).
    +"""
    +Base.@kwdef struct Spherical{T} <: Manifold
    +    radius::T = 6371008.8
    +end
    +
    +"""
    +    Geodesic(; semimajor_axis, inv_flattening)
    +
    +A geodesic manifold means that the geometry is on a 3-dimensional ellipsoid, parameterized by \`semimajor_axis\` (\`\`a\`\` in mathematical parlance)
    +and \`inv_flattening\` (\`\`1/f\`\`).
    +
    +Usually, this is only relevant for area and segmentization calculations.  It becomes more relevant as one grows closer to the poles (or equator).
    +"""
    +Base.@kwdef struct Geodesic{T} <: Manifold
    +    semimajor_axis::T = 6378137.0
    +    inv_flattening::T = 298.257223563
    +end

    TraitTarget

    This struct holds a trait parameter or a union of trait parameters. It's essentially a way to construct unions.

    julia
    """
    +    TraitTarget{T}
    +
    +This struct holds a trait parameter or a union of trait parameters.
    +
    +It is primarily used for dispatch into methods which select trait levels,
    +like \`apply\`, or as a parameter to \`target\`.
    +
    +# Constructors
    +\`\`\`julia
    +TraitTarget(GI.PointTrait())
    +TraitTarget(GI.LineStringTrait(), GI.LinearRingTrait()) # and other traits as you may like
    +TraitTarget(TraitTarget(...))

    There are also type based constructors available, but that's not advised.

    julia
    TraitTarget(GI.PointTrait)
    +TraitTarget(Union{GI.LineStringTrait, GI.LinearRingTrait})

    etc.

    julia
    \`\`\`
    +
    +"""
    +struct TraitTarget{T} end
    +TraitTarget(::Type{T}) where T = TraitTarget{T}()
    +TraitTarget(::T) where T<:GI.AbstractTrait = TraitTarget{T}()
    +TraitTarget(::TraitTarget{T}) where T = TraitTarget{T}()
    +TraitTarget(::Type{<:TraitTarget{T}}) where T = TraitTarget{T}()
    +TraitTarget(traits::GI.AbstractTrait...) = TraitTarget{Union{map(typeof, traits)...}}()
    +
    +
    +Base.in(::Trait, ::TraitTarget{Target}) where {Trait <: GI.AbstractTrait, Target} = Trait <: Target

    BoolsAsTypes

    In apply and applyreduce, we pass threading and calc_extent as types, not simple boolean values.

    This is to help compilation - with a type to hold on to, it's easier for the compiler to separate threaded and non-threaded code paths.

    Note that if we didn't include the parent abstract type, this would have been really type unstable, since the compiler couldn't tell what would be returned!

    We had to add the type annotation on the _booltype(::Bool) method for this reason as well.

    TODO: should we switch to Static.jl?

    julia
    """
    +    abstract type BoolsAsTypes
    +
    +"""
    +abstract type BoolsAsTypes end
    +
    +"""
    +    struct _True <: BoolsAsTypes
    +
    +A struct that means \`true\`.
    +"""
    +struct _True <: BoolsAsTypes end
    +
    +"""
    +    struct _False <: BoolsAsTypes
    +
    +A struct that means \`false\`.
    +"""
    +struct _False <: BoolsAsTypes end
    +
    +"""
    +    _booltype(x)
    +
    +Returns a \`BoolsAsTypes\` from \`x\`, whether it's a boolean or a BoolsAsTypes.
    +"""
    +function _booltype end
    +
    +@inline _booltype(x::Bool)::BoolsAsTypes = x ? _True() : _False()
    +@inline _booltype(x::BoolsAsTypes)::BoolsAsTypes = x

    This page was generated using Literate.jl.

    `,24)]))}const F=a(t,[["render",l]]);export{c as __pageData,F as default}; diff --git a/previews/PR239/assets/source_src_types.md.BulrghgC.lean.js b/previews/PR239/assets/source_src_types.md.BulrghgC.lean.js new file mode 100644 index 000000000..21ac874a0 --- /dev/null +++ b/previews/PR239/assets/source_src_types.md.BulrghgC.lean.js @@ -0,0 +1,111 @@ +import{_ as a,c as i,a5 as n,o as e}from"./chunks/framework.onQNwZ2I.js";const c=JSON.parse('{"title":"Types","description":"","frontmatter":{},"headers":[],"relativePath":"source/src/types.md","filePath":"source/src/types.md","lastUpdated":null}'),t={name:"source/src/types.md"};function l(p,s,h,k,r,o){return e(),i("div",null,s[0]||(s[0]=[n(`

    Types

    This defines core types that the GeometryOps ecosystem uses, and that are usable in more than just GeometryOps.

    Manifold

    A manifold is mathematically defined as a topological space that resembles Euclidean space locally.

    In GeometryOps (and geodesy more generally), there are three manifolds we care about:

    • Planar: the 2d plane, a completely Euclidean manifold

    • Spherical: the unit sphere, but one where areas are multiplied by the radius of the Earth. This is not Euclidean globally, but all map projections attempt to represent the sphere on the Euclidean 2D plane to varying degrees of success.

    • Geodesic: the ellipsoid, the closest we can come to representing the Earth by a simple geometric shape. Parametrized by semimajor_axis and inv_flattening.

    Generally, we aim to have Linear and Spherical be operable everywhere, whereas Geodesic will only apply in specific circumstances. Currently, those circumstances are area and segmentize, but this could be extended with time and https://github.com/JuliaGeo/SphericalGeodesics.jl.

    julia
    export Planar, Spherical, Geodesic
    +export TraitTarget
    +export BoolsAsTypes, _True, _False, _booltype
    +
    +"""
    +    abstract type Manifold
    +
    +A manifold is mathematically defined as a topological space that resembles Euclidean space locally.
    +
    +We use the manifold definition to define the space in which an operation should be performed, or where a geometry lies.
    +
    +Currently we have \`Planar\`, \`Spherical\`, and \`Geodesic\` manifolds.
    +"""
    +abstract type Manifold end
    +
    +"""
    +    Planar()
    +
    +A planar manifold refers to the 2D Euclidean plane.
    +
    +Z coordinates may be accepted but will not influence geometry calculations, which
    +are done purely on 2D geometry.  This is the standard "2.5D" model used by e.g. GEOS.
    +"""
    +struct Planar <: Manifold
    +end
    +
    +"""
    +    Spherical(; radius)
    +
    +A spherical manifold means that the geometry is on the 3-sphere (but is represented by 2-D longitude and latitude).
    +
    +By default, the radius is defined as the mean radius of the Earth, \`6371008.8 m\`.
    +
    +# Extended help
    +
    +!!! note
    +    The traditional definition of spherical coordinates in physics and mathematics,
    +    \`\`r, \\\\theta, \\\\phi\`\`, uses the _colatitude_, that measures angular displacement from the \`z\`-axis.
    +
    +    Here, we use the geographic definition of longitude and latitude, meaning
    +    that \`lon\` is longitude between -180 and 180, and \`lat\` is latitude between
    +    \`-90\` (south pole) and \`90\` (north pole).
    +"""
    +Base.@kwdef struct Spherical{T} <: Manifold
    +    radius::T = 6371008.8
    +end
    +
    +"""
    +    Geodesic(; semimajor_axis, inv_flattening)
    +
    +A geodesic manifold means that the geometry is on a 3-dimensional ellipsoid, parameterized by \`semimajor_axis\` (\`\`a\`\` in mathematical parlance)
    +and \`inv_flattening\` (\`\`1/f\`\`).
    +
    +Usually, this is only relevant for area and segmentization calculations.  It becomes more relevant as one grows closer to the poles (or equator).
    +"""
    +Base.@kwdef struct Geodesic{T} <: Manifold
    +    semimajor_axis::T = 6378137.0
    +    inv_flattening::T = 298.257223563
    +end

    TraitTarget

    This struct holds a trait parameter or a union of trait parameters. It's essentially a way to construct unions.

    julia
    """
    +    TraitTarget{T}
    +
    +This struct holds a trait parameter or a union of trait parameters.
    +
    +It is primarily used for dispatch into methods which select trait levels,
    +like \`apply\`, or as a parameter to \`target\`.
    +
    +# Constructors
    +\`\`\`julia
    +TraitTarget(GI.PointTrait())
    +TraitTarget(GI.LineStringTrait(), GI.LinearRingTrait()) # and other traits as you may like
    +TraitTarget(TraitTarget(...))

    There are also type based constructors available, but that's not advised.

    julia
    TraitTarget(GI.PointTrait)
    +TraitTarget(Union{GI.LineStringTrait, GI.LinearRingTrait})

    etc.

    julia
    \`\`\`
    +
    +"""
    +struct TraitTarget{T} end
    +TraitTarget(::Type{T}) where T = TraitTarget{T}()
    +TraitTarget(::T) where T<:GI.AbstractTrait = TraitTarget{T}()
    +TraitTarget(::TraitTarget{T}) where T = TraitTarget{T}()
    +TraitTarget(::Type{<:TraitTarget{T}}) where T = TraitTarget{T}()
    +TraitTarget(traits::GI.AbstractTrait...) = TraitTarget{Union{map(typeof, traits)...}}()
    +
    +
    +Base.in(::Trait, ::TraitTarget{Target}) where {Trait <: GI.AbstractTrait, Target} = Trait <: Target

    BoolsAsTypes

    In apply and applyreduce, we pass threading and calc_extent as types, not simple boolean values.

    This is to help compilation - with a type to hold on to, it's easier for the compiler to separate threaded and non-threaded code paths.

    Note that if we didn't include the parent abstract type, this would have been really type unstable, since the compiler couldn't tell what would be returned!

    We had to add the type annotation on the _booltype(::Bool) method for this reason as well.

    TODO: should we switch to Static.jl?

    julia
    """
    +    abstract type BoolsAsTypes
    +
    +"""
    +abstract type BoolsAsTypes end
    +
    +"""
    +    struct _True <: BoolsAsTypes
    +
    +A struct that means \`true\`.
    +"""
    +struct _True <: BoolsAsTypes end
    +
    +"""
    +    struct _False <: BoolsAsTypes
    +
    +A struct that means \`false\`.
    +"""
    +struct _False <: BoolsAsTypes end
    +
    +"""
    +    _booltype(x)
    +
    +Returns a \`BoolsAsTypes\` from \`x\`, whether it's a boolean or a BoolsAsTypes.
    +"""
    +function _booltype end
    +
    +@inline _booltype(x::Bool)::BoolsAsTypes = x ? _True() : _False()
    +@inline _booltype(x::BoolsAsTypes)::BoolsAsTypes = x

    This page was generated using Literate.jl.

    `,24)]))}const F=a(t,[["render",l]]);export{c as __pageData,F as default}; diff --git a/previews/PR239/assets/source_transformations_correction_closed_ring.md.DlzJm4wM.js b/previews/PR239/assets/source_transformations_correction_closed_ring.md.DlzJm4wM.js new file mode 100644 index 000000000..95f4acd86 --- /dev/null +++ b/previews/PR239/assets/source_transformations_correction_closed_ring.md.DlzJm4wM.js @@ -0,0 +1,30 @@ +import{_ as l,c as a,a5 as n,j as i,a as t,o as e}from"./chunks/framework.onQNwZ2I.js";const m=JSON.parse('{"title":"Closed Rings","description":"","frontmatter":{},"headers":[],"relativePath":"source/transformations/correction/closed_ring.md","filePath":"source/transformations/correction/closed_ring.md","lastUpdated":null}'),h={name:"source/transformations/correction/closed_ring.md"},p={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.357ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 600 453","aria-hidden":"true"},r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.254ex",height:"1.692ex",role:"img",focusable:"false",viewBox:"0 -666 2322.4 748","aria-hidden":"true"};function d(g,s,c,E,y,u){return e(),a("div",null,[s[7]||(s[7]=n(`

    Closed Rings

    julia
    export ClosedRing

    A closed ring is a ring that has the same start and end point. This is a requirement for a valid polygon (technically, for a valid LinearRing). This correction is used to ensure that the polygon is valid.

    The reason this operates on the polygon level is that several packages are loose about whether they return LinearRings (which is correct) or LineStrings (which is incorrect) for the contents of a polygon. Therefore, we decompose manually to ensure correctness.

    Example

    Many polygon providers do not close their polygons, which makes them invalid according to the specification. Quite a few geometry algorithms assume that polygons are closed, and leaving them open can lead to incorrect results!

    For example, the following polygon is not valid:

    julia
    import GeoInterface as GI
    +polygon = GI.Polygon([[(0, 0), (1, 0), (1, 1), (0, 1)]])
    GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Int64, Int64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Int64, Int64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Int64, Int64}}, Nothing, Nothing}([(0, 0), (1, 0), (1, 1), (0, 1)], nothing, nothing)], nothing, nothing)

    even though it will look correct when visualized, and indeed appears correct.

    julia
    import GeometryOps as GO
    +GO.fix(polygon, corrections = [GO.ClosedRing()])
    GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(0.0, 0.0), (1.0, 0.0), (1.0, 1.0), (0.0, 1.0), (0.0, 0.0)], nothing, nothing)], nothing, nothing)
    `,12)),i("p",null,[s[4]||(s[4]=t("You can see that the last point of the ring here is equal to the first point. For a polygon with ")),i("mjx-container",p,[(e(),a("svg",k,s[0]||(s[0]=[i("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[i("g",{"data-mml-node":"math"},[i("g",{"data-mml-node":"mi"},[i("path",{"data-c":"1D45B",d:"M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),s[1]||(s[1]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"n")])],-1))]),s[5]||(s[5]=t(" sides, there should be ")),i("mjx-container",r,[(e(),a("svg",o,s[2]||(s[2]=[n('',1)]))),s[3]||(s[3]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"n"),i("mo",null,"+"),i("mn",null,"1")])],-1))]),s[6]||(s[6]=t(" vertices."))]),s[8]||(s[8]=n(`

    Implementation

    julia
    """
    +    ClosedRing() <: GeometryCorrection
    +
    +This correction ensures that a polygon's exterior and interior rings are closed.
    +
    +It can be called on any geometry correction as usual.
    +
    +See also \`GeometryCorrection\`.
    +"""
    +struct ClosedRing <: GeometryCorrection end
    +
    +application_level(::ClosedRing) = GI.PolygonTrait
    +
    +function (::ClosedRing)(::GI.PolygonTrait, polygon)
    +    exterior = _close_linear_ring(GI.getexterior(polygon))
    +
    +    holes = map(GI.gethole(polygon)) do hole
    +        _close_linear_ring(hole) # TODO: make this more efficient, or use tuples!
    +    end
    +
    +    return GI.Wrappers.Polygon([exterior, holes...])
    +end
    +
    +function _close_linear_ring(ring)
    +    if GI.getpoint(ring, 1) == GI.getpoint(ring, GI.npoint(ring))

    the ring is closed, all hail the ring

    julia
            return ring
    +    else

    Assemble the ring as a vector

    julia
            tups = tuples.(GI.getpoint(ring))

    Close the ring

    julia
            push!(tups, tups[1])

    Return an actual ring

    julia
            return GI.LinearRing(tups)
    +    end
    +end

    This page was generated using Literate.jl.

    `,12))])}const C=l(h,[["render",d]]);export{m as __pageData,C as default}; diff --git a/previews/PR239/assets/source_transformations_correction_closed_ring.md.DlzJm4wM.lean.js b/previews/PR239/assets/source_transformations_correction_closed_ring.md.DlzJm4wM.lean.js new file mode 100644 index 000000000..95f4acd86 --- /dev/null +++ b/previews/PR239/assets/source_transformations_correction_closed_ring.md.DlzJm4wM.lean.js @@ -0,0 +1,30 @@ +import{_ as l,c as a,a5 as n,j as i,a as t,o as e}from"./chunks/framework.onQNwZ2I.js";const m=JSON.parse('{"title":"Closed Rings","description":"","frontmatter":{},"headers":[],"relativePath":"source/transformations/correction/closed_ring.md","filePath":"source/transformations/correction/closed_ring.md","lastUpdated":null}'),h={name:"source/transformations/correction/closed_ring.md"},p={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.357ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 600 453","aria-hidden":"true"},r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.254ex",height:"1.692ex",role:"img",focusable:"false",viewBox:"0 -666 2322.4 748","aria-hidden":"true"};function d(g,s,c,E,y,u){return e(),a("div",null,[s[7]||(s[7]=n(`

    Closed Rings

    julia
    export ClosedRing

    A closed ring is a ring that has the same start and end point. This is a requirement for a valid polygon (technically, for a valid LinearRing). This correction is used to ensure that the polygon is valid.

    The reason this operates on the polygon level is that several packages are loose about whether they return LinearRings (which is correct) or LineStrings (which is incorrect) for the contents of a polygon. Therefore, we decompose manually to ensure correctness.

    Example

    Many polygon providers do not close their polygons, which makes them invalid according to the specification. Quite a few geometry algorithms assume that polygons are closed, and leaving them open can lead to incorrect results!

    For example, the following polygon is not valid:

    julia
    import GeoInterface as GI
    +polygon = GI.Polygon([[(0, 0), (1, 0), (1, 1), (0, 1)]])
    GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Int64, Int64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Int64, Int64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Int64, Int64}}, Nothing, Nothing}([(0, 0), (1, 0), (1, 1), (0, 1)], nothing, nothing)], nothing, nothing)

    even though it will look correct when visualized, and indeed appears correct.

    julia
    import GeometryOps as GO
    +GO.fix(polygon, corrections = [GO.ClosedRing()])
    GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(0.0, 0.0), (1.0, 0.0), (1.0, 1.0), (0.0, 1.0), (0.0, 0.0)], nothing, nothing)], nothing, nothing)
    `,12)),i("p",null,[s[4]||(s[4]=t("You can see that the last point of the ring here is equal to the first point. For a polygon with ")),i("mjx-container",p,[(e(),a("svg",k,s[0]||(s[0]=[i("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[i("g",{"data-mml-node":"math"},[i("g",{"data-mml-node":"mi"},[i("path",{"data-c":"1D45B",d:"M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),s[1]||(s[1]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"n")])],-1))]),s[5]||(s[5]=t(" sides, there should be ")),i("mjx-container",r,[(e(),a("svg",o,s[2]||(s[2]=[n('',1)]))),s[3]||(s[3]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"n"),i("mo",null,"+"),i("mn",null,"1")])],-1))]),s[6]||(s[6]=t(" vertices."))]),s[8]||(s[8]=n(`

    Implementation

    julia
    """
    +    ClosedRing() <: GeometryCorrection
    +
    +This correction ensures that a polygon's exterior and interior rings are closed.
    +
    +It can be called on any geometry correction as usual.
    +
    +See also \`GeometryCorrection\`.
    +"""
    +struct ClosedRing <: GeometryCorrection end
    +
    +application_level(::ClosedRing) = GI.PolygonTrait
    +
    +function (::ClosedRing)(::GI.PolygonTrait, polygon)
    +    exterior = _close_linear_ring(GI.getexterior(polygon))
    +
    +    holes = map(GI.gethole(polygon)) do hole
    +        _close_linear_ring(hole) # TODO: make this more efficient, or use tuples!
    +    end
    +
    +    return GI.Wrappers.Polygon([exterior, holes...])
    +end
    +
    +function _close_linear_ring(ring)
    +    if GI.getpoint(ring, 1) == GI.getpoint(ring, GI.npoint(ring))

    the ring is closed, all hail the ring

    julia
            return ring
    +    else

    Assemble the ring as a vector

    julia
            tups = tuples.(GI.getpoint(ring))

    Close the ring

    julia
            push!(tups, tups[1])

    Return an actual ring

    julia
            return GI.LinearRing(tups)
    +    end
    +end

    This page was generated using Literate.jl.

    `,12))])}const C=l(h,[["render",d]]);export{m as __pageData,C as default}; diff --git a/previews/PR239/assets/source_transformations_correction_geometry_correction.md.DSGv3LiX.js b/previews/PR239/assets/source_transformations_correction_geometry_correction.md.DSGv3LiX.js new file mode 100644 index 000000000..e79621afd --- /dev/null +++ b/previews/PR239/assets/source_transformations_correction_geometry_correction.md.DSGv3LiX.js @@ -0,0 +1,31 @@ +import{_ as r,c as o,a5 as e,j as i,a as t,G as n,B as l,o as p}from"./chunks/framework.onQNwZ2I.js";const G=JSON.parse('{"title":"Geometry Corrections","description":"","frontmatter":{},"headers":[],"relativePath":"source/transformations/correction/geometry_correction.md","filePath":"source/transformations/correction/geometry_correction.md","lastUpdated":null}'),h={name:"source/transformations/correction/geometry_correction.md"},k={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""};function m(E,s,u,F,f,C){const a=l("Badge");return p(),o("div",null,[s[15]||(s[15]=e('

    Geometry Corrections

    julia
    export fix

    This file simply defines the GeometryCorrection abstract type, and the interface that any GeometryCorrection must implement.

    A geometry correction is a transformation that is applied to a geometry to correct it in some way.

    For example, a ClosedRing correction might be applied to a Polygon to ensure that its exterior ring is closed.

    Interface

    All GeometryCorrections are callable structs which, when called, apply the correction to the given geometry, and return either a copy or the original geometry (if nothing needed to be corrected).

    See below for the full interface specification.

    ',8)),i("details",k,[i("summary",null,[s[0]||(s[0]=i("a",{id:"GeometryOps.GeometryCorrection-source-transformations-correction-geometry_correction",href:"#GeometryOps.GeometryCorrection-source-transformations-correction-geometry_correction"},[i("span",{class:"jlbinding"},"GeometryOps.GeometryCorrection")],-1)),s[1]||(s[1]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=e('
    julia
    abstract type GeometryCorrection

    This abstract type represents a geometry correction.

    Interface

    Any GeometryCorrection must implement two functions: * application_level(::GeometryCorrection)::AbstractGeometryTrait: This function should return the GeoInterface trait that the correction is intended to be applied to, like PointTrait or LineStringTrait or PolygonTrait. * (::GeometryCorrection)(::AbstractGeometryTrait, geometry)::(some_geometry): This function should apply the correction to the given geometry, and return a new geometry.

    source

    ',5))]),s[16]||(s[16]=e(`

    Any geometry correction must implement the interface as given above.

    julia
    """
    +    abstract type GeometryCorrection
    +
    +This abstract type represents a geometry correction.
    +
    +# Interface
    +
    +Any \`GeometryCorrection\` must implement two functions:
    +    * \`application_level(::GeometryCorrection)::AbstractGeometryTrait\`: This function should return the \`GeoInterface\` trait that the correction is intended to be applied to, like \`PointTrait\` or \`LineStringTrait\` or \`PolygonTrait\`.
    +    * \`(::GeometryCorrection)(::AbstractGeometryTrait, geometry)::(some_geometry)\`: This function should apply the correction to the given geometry, and return a new geometry.
    +"""
    +abstract type GeometryCorrection end
    +
    +application_level(gc::GeometryCorrection) = error("Not implemented yet for $(gc)")
    +
    +(gc::GeometryCorrection)(geometry) = gc(GI.trait(geometry), geometry)
    +
    +(gc::GeometryCorrection)(trait::GI.AbstractGeometryTrait, geometry) = error("Not implemented yet for $(gc) and $(trait).")
    +
    +function fix(geometry; corrections = GeometryCorrection[ClosedRing(),], kwargs...)
    +    traits = application_level.(corrections)
    +    final_geometry = geometry
    +    for Trait in (GI.PointTrait, GI.MultiPointTrait, GI.LineStringTrait, GI.LinearRingTrait, GI.MultiLineStringTrait, GI.PolygonTrait, GI.MultiPolygonTrait)
    +        available_corrections = findall(x -> x == Trait, traits)
    +        isempty(available_corrections) && continue
    +        @debug "Correcting for $(Trait)"
    +        net_function = reduce(, corrections[available_corrections])
    +        final_geometry = apply(net_function, Trait, final_geometry; kwargs...)
    +    end
    +    return final_geometry
    +end

    Available corrections

    `,3)),i("details",c,[i("summary",null,[s[3]||(s[3]=i("a",{id:"GeometryOps.ClosedRing-source-transformations-correction-geometry_correction",href:"#GeometryOps.ClosedRing-source-transformations-correction-geometry_correction"},[i("span",{class:"jlbinding"},"GeometryOps.ClosedRing")],-1)),s[4]||(s[4]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[5]||(s[5]=e('
    julia
    ClosedRing() <: GeometryCorrection

    This correction ensures that a polygon's exterior and interior rings are closed.

    It can be called on any geometry correction as usual.

    See also GeometryCorrection.

    source

    ',5))]),i("details",d,[i("summary",null,[s[6]||(s[6]=i("a",{id:"GeometryOps.DiffIntersectingPolygons-source-transformations-correction-geometry_correction",href:"#GeometryOps.DiffIntersectingPolygons-source-transformations-correction-geometry_correction"},[i("span",{class:"jlbinding"},"GeometryOps.DiffIntersectingPolygons")],-1)),s[7]||(s[7]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[8]||(s[8]=e('
    julia
    DiffIntersectingPolygons() <: GeometryCorrection

    This correction ensures that the polygons included in a multipolygon aren't intersecting. If any polygon's are intersecting, they will be made nonintersecting through the difference operation to create a unique set of disjoint (other than potentially connections by a single point) polygons covering the same area. See also GeometryCorrection, UnionIntersectingPolygons.

    source

    ',3))]),i("details",y,[i("summary",null,[s[9]||(s[9]=i("a",{id:"GeometryOps.GeometryCorrection-source-transformations-correction-geometry_correction-2",href:"#GeometryOps.GeometryCorrection-source-transformations-correction-geometry_correction-2"},[i("span",{class:"jlbinding"},"GeometryOps.GeometryCorrection")],-1)),s[10]||(s[10]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[11]||(s[11]=e('
    julia
    abstract type GeometryCorrection

    This abstract type represents a geometry correction.

    Interface

    Any GeometryCorrection must implement two functions: * application_level(::GeometryCorrection)::AbstractGeometryTrait: This function should return the GeoInterface trait that the correction is intended to be applied to, like PointTrait or LineStringTrait or PolygonTrait. * (::GeometryCorrection)(::AbstractGeometryTrait, geometry)::(some_geometry): This function should apply the correction to the given geometry, and return a new geometry.

    source

    ',5))]),i("details",g,[i("summary",null,[s[12]||(s[12]=i("a",{id:"GeometryOps.UnionIntersectingPolygons-source-transformations-correction-geometry_correction",href:"#GeometryOps.UnionIntersectingPolygons-source-transformations-correction-geometry_correction"},[i("span",{class:"jlbinding"},"GeometryOps.UnionIntersectingPolygons")],-1)),s[13]||(s[13]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[14]||(s[14]=e('
    julia
    UnionIntersectingPolygons() <: GeometryCorrection

    This correction ensures that the polygon's included in a multipolygon aren't intersecting. If any polygon's are intersecting, they will be combined through the union operation to create a unique set of disjoint (other than potentially connections by a single point) polygons covering the same area.

    See also GeometryCorrection.

    source

    ',4))]),s[17]||(s[17]=i("hr",null,null,-1)),s[18]||(s[18]=i("p",null,[i("em",null,[t("This page was generated using "),i("a",{href:"https://github.com/fredrikekre/Literate.jl",target:"_blank",rel:"noreferrer"},"Literate.jl"),t(".")])],-1))])}const A=r(h,[["render",m]]);export{G as __pageData,A as default}; diff --git a/previews/PR239/assets/source_transformations_correction_geometry_correction.md.DSGv3LiX.lean.js b/previews/PR239/assets/source_transformations_correction_geometry_correction.md.DSGv3LiX.lean.js new file mode 100644 index 000000000..e79621afd --- /dev/null +++ b/previews/PR239/assets/source_transformations_correction_geometry_correction.md.DSGv3LiX.lean.js @@ -0,0 +1,31 @@ +import{_ as r,c as o,a5 as e,j as i,a as t,G as n,B as l,o as p}from"./chunks/framework.onQNwZ2I.js";const G=JSON.parse('{"title":"Geometry Corrections","description":"","frontmatter":{},"headers":[],"relativePath":"source/transformations/correction/geometry_correction.md","filePath":"source/transformations/correction/geometry_correction.md","lastUpdated":null}'),h={name:"source/transformations/correction/geometry_correction.md"},k={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},d={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""};function m(E,s,u,F,f,C){const a=l("Badge");return p(),o("div",null,[s[15]||(s[15]=e('

    Geometry Corrections

    julia
    export fix

    This file simply defines the GeometryCorrection abstract type, and the interface that any GeometryCorrection must implement.

    A geometry correction is a transformation that is applied to a geometry to correct it in some way.

    For example, a ClosedRing correction might be applied to a Polygon to ensure that its exterior ring is closed.

    Interface

    All GeometryCorrections are callable structs which, when called, apply the correction to the given geometry, and return either a copy or the original geometry (if nothing needed to be corrected).

    See below for the full interface specification.

    ',8)),i("details",k,[i("summary",null,[s[0]||(s[0]=i("a",{id:"GeometryOps.GeometryCorrection-source-transformations-correction-geometry_correction",href:"#GeometryOps.GeometryCorrection-source-transformations-correction-geometry_correction"},[i("span",{class:"jlbinding"},"GeometryOps.GeometryCorrection")],-1)),s[1]||(s[1]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[2]||(s[2]=e('
    julia
    abstract type GeometryCorrection

    This abstract type represents a geometry correction.

    Interface

    Any GeometryCorrection must implement two functions: * application_level(::GeometryCorrection)::AbstractGeometryTrait: This function should return the GeoInterface trait that the correction is intended to be applied to, like PointTrait or LineStringTrait or PolygonTrait. * (::GeometryCorrection)(::AbstractGeometryTrait, geometry)::(some_geometry): This function should apply the correction to the given geometry, and return a new geometry.

    source

    ',5))]),s[16]||(s[16]=e(`

    Any geometry correction must implement the interface as given above.

    julia
    """
    +    abstract type GeometryCorrection
    +
    +This abstract type represents a geometry correction.
    +
    +# Interface
    +
    +Any \`GeometryCorrection\` must implement two functions:
    +    * \`application_level(::GeometryCorrection)::AbstractGeometryTrait\`: This function should return the \`GeoInterface\` trait that the correction is intended to be applied to, like \`PointTrait\` or \`LineStringTrait\` or \`PolygonTrait\`.
    +    * \`(::GeometryCorrection)(::AbstractGeometryTrait, geometry)::(some_geometry)\`: This function should apply the correction to the given geometry, and return a new geometry.
    +"""
    +abstract type GeometryCorrection end
    +
    +application_level(gc::GeometryCorrection) = error("Not implemented yet for $(gc)")
    +
    +(gc::GeometryCorrection)(geometry) = gc(GI.trait(geometry), geometry)
    +
    +(gc::GeometryCorrection)(trait::GI.AbstractGeometryTrait, geometry) = error("Not implemented yet for $(gc) and $(trait).")
    +
    +function fix(geometry; corrections = GeometryCorrection[ClosedRing(),], kwargs...)
    +    traits = application_level.(corrections)
    +    final_geometry = geometry
    +    for Trait in (GI.PointTrait, GI.MultiPointTrait, GI.LineStringTrait, GI.LinearRingTrait, GI.MultiLineStringTrait, GI.PolygonTrait, GI.MultiPolygonTrait)
    +        available_corrections = findall(x -> x == Trait, traits)
    +        isempty(available_corrections) && continue
    +        @debug "Correcting for $(Trait)"
    +        net_function = reduce(, corrections[available_corrections])
    +        final_geometry = apply(net_function, Trait, final_geometry; kwargs...)
    +    end
    +    return final_geometry
    +end

    Available corrections

    `,3)),i("details",c,[i("summary",null,[s[3]||(s[3]=i("a",{id:"GeometryOps.ClosedRing-source-transformations-correction-geometry_correction",href:"#GeometryOps.ClosedRing-source-transformations-correction-geometry_correction"},[i("span",{class:"jlbinding"},"GeometryOps.ClosedRing")],-1)),s[4]||(s[4]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[5]||(s[5]=e('
    julia
    ClosedRing() <: GeometryCorrection

    This correction ensures that a polygon's exterior and interior rings are closed.

    It can be called on any geometry correction as usual.

    See also GeometryCorrection.

    source

    ',5))]),i("details",d,[i("summary",null,[s[6]||(s[6]=i("a",{id:"GeometryOps.DiffIntersectingPolygons-source-transformations-correction-geometry_correction",href:"#GeometryOps.DiffIntersectingPolygons-source-transformations-correction-geometry_correction"},[i("span",{class:"jlbinding"},"GeometryOps.DiffIntersectingPolygons")],-1)),s[7]||(s[7]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[8]||(s[8]=e('
    julia
    DiffIntersectingPolygons() <: GeometryCorrection

    This correction ensures that the polygons included in a multipolygon aren't intersecting. If any polygon's are intersecting, they will be made nonintersecting through the difference operation to create a unique set of disjoint (other than potentially connections by a single point) polygons covering the same area. See also GeometryCorrection, UnionIntersectingPolygons.

    source

    ',3))]),i("details",y,[i("summary",null,[s[9]||(s[9]=i("a",{id:"GeometryOps.GeometryCorrection-source-transformations-correction-geometry_correction-2",href:"#GeometryOps.GeometryCorrection-source-transformations-correction-geometry_correction-2"},[i("span",{class:"jlbinding"},"GeometryOps.GeometryCorrection")],-1)),s[10]||(s[10]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[11]||(s[11]=e('
    julia
    abstract type GeometryCorrection

    This abstract type represents a geometry correction.

    Interface

    Any GeometryCorrection must implement two functions: * application_level(::GeometryCorrection)::AbstractGeometryTrait: This function should return the GeoInterface trait that the correction is intended to be applied to, like PointTrait or LineStringTrait or PolygonTrait. * (::GeometryCorrection)(::AbstractGeometryTrait, geometry)::(some_geometry): This function should apply the correction to the given geometry, and return a new geometry.

    source

    ',5))]),i("details",g,[i("summary",null,[s[12]||(s[12]=i("a",{id:"GeometryOps.UnionIntersectingPolygons-source-transformations-correction-geometry_correction",href:"#GeometryOps.UnionIntersectingPolygons-source-transformations-correction-geometry_correction"},[i("span",{class:"jlbinding"},"GeometryOps.UnionIntersectingPolygons")],-1)),s[13]||(s[13]=t()),n(a,{type:"info",class:"jlObjectType jlType",text:"Type"})]),s[14]||(s[14]=e('
    julia
    UnionIntersectingPolygons() <: GeometryCorrection

    This correction ensures that the polygon's included in a multipolygon aren't intersecting. If any polygon's are intersecting, they will be combined through the union operation to create a unique set of disjoint (other than potentially connections by a single point) polygons covering the same area.

    See also GeometryCorrection.

    source

    ',4))]),s[17]||(s[17]=i("hr",null,null,-1)),s[18]||(s[18]=i("p",null,[i("em",null,[t("This page was generated using "),i("a",{href:"https://github.com/fredrikekre/Literate.jl",target:"_blank",rel:"noreferrer"},"Literate.jl"),t(".")])],-1))])}const A=r(h,[["render",m]]);export{G as __pageData,A as default}; diff --git a/previews/PR239/assets/source_transformations_correction_intersecting_polygons.md.CLhMqjHy.js b/previews/PR239/assets/source_transformations_correction_intersecting_polygons.md.CLhMqjHy.js new file mode 100644 index 000000000..440caed24 --- /dev/null +++ b/previews/PR239/assets/source_transformations_correction_intersecting_polygons.md.CLhMqjHy.js @@ -0,0 +1,97 @@ +import{_ as i,c as a,a5 as n,o as l}from"./chunks/framework.onQNwZ2I.js";const E=JSON.parse('{"title":"Intersecting Polygons","description":"","frontmatter":{},"headers":[],"relativePath":"source/transformations/correction/intersecting_polygons.md","filePath":"source/transformations/correction/intersecting_polygons.md","lastUpdated":null}'),t={name:"source/transformations/correction/intersecting_polygons.md"};function h(p,s,e,k,r,g){return l(),a("div",null,s[0]||(s[0]=[n(`

    Intersecting Polygons

    julia
    export UnionIntersectingPolygons

    If the sub-polygons of a multipolygon are intersecting, this makes them invalid according to specification. Each sub-polygon of a multipolygon being disjoint (other than by a single point) is a requirement for a valid multipolygon. However, different libraries may achieve this in different ways.

    For example, taking the union of all sub-polygons of a multipolygon will create a new multipolygon where each sub-polygon is disjoint. This can be done with the UnionIntersectingPolygons correction.

    The reason this operates on a multipolygon level is that it is easy for users to mistakenly create multipolygon's that overlap, which can then be detrimental to polygon clipping performance and even create wrong answers.

    Example

    Multipolygon providers may not check that the polygons making up their multipolygons do not intersect, which makes them invalid according to the specification.

    For example, the following multipolygon is not valid:

    julia
    import GeoInterface as GI
    +polygon = GI.Polygon([[(0.0, 0.0), (3.0, 0.0), (3.0, 3.0), (0.0, 3.0), (0.0, 0.0)]])
    +multipolygon = GI.MultiPolygon([polygon, polygon])
    GeoInterface.Wrappers.MultiPolygon{false, false, Vector{GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}[GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(0.0, 0.0), (3.0, 0.0), (3.0, 3.0), (0.0, 3.0), (0.0, 0.0)], nothing, nothing)], nothing, nothing), GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(0.0, 0.0), (3.0, 0.0), (3.0, 3.0), (0.0, 3.0), (0.0, 0.0)], nothing, nothing)], nothing, nothing)], nothing, nothing)

    given that the two sub-polygons are the exact same shape.

    julia
    import GeometryOps as GO
    +GO.fix(multipolygon, corrections = [GO.UnionIntersectingPolygons()])
    GeoInterface.Wrappers.MultiPolygon{false, false, Vector{GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}[GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(0.0, 0.0), (3.0, 0.0), (3.0, 3.0), (0.0, 3.0), (0.0, 0.0)], nothing, nothing)], nothing, nothing)], nothing, nothing)

    You can see that the the multipolygon now only contains one sub-polygon, rather than the two identical ones provided.

    Implementation

    julia
    """
    +    UnionIntersectingPolygons() <: GeometryCorrection
    +
    +This correction ensures that the polygon's included in a multipolygon aren't intersecting.
    +If any polygon's are intersecting, they will be combined through the union operation to
    +create a unique set of disjoint (other than potentially connections by a single point)
    +polygons covering the same area.
    +
    +See also \`GeometryCorrection\`.
    +"""
    +struct UnionIntersectingPolygons <: GeometryCorrection end
    +
    +application_level(::UnionIntersectingPolygons) = GI.MultiPolygonTrait
    +
    +function (::UnionIntersectingPolygons)(::GI.MultiPolygonTrait, multipoly)
    +    union_multipoly = tuples(multipoly)
    +    n_polys = GI.npolygon(multipoly)
    +    if n_polys > 1
    +        keep_idx = trues(n_polys)  # keep track of sub-polygons to remove

    Combine any sub-polygons that intersect

    julia
            for (curr_idx, _) in Iterators.filter(last, Iterators.enumerate(keep_idx))
    +            curr_poly = union_multipoly.geom[curr_idx]
    +            poly_disjoint = false
    +            while !poly_disjoint
    +                poly_disjoint = true  # assume current polygon is disjoint from others
    +                for (next_idx, _) in Iterators.filter(last, Iterators.drop(Iterators.enumerate(keep_idx), curr_idx))
    +                    next_poly = union_multipoly.geom[next_idx]
    +                    if intersects(curr_poly, next_poly)  # if two polygons intersect
    +                        new_polys = union(curr_poly, next_poly; target = GI.PolygonTrait())
    +                        n_new_polys = length(new_polys)
    +                        if n_new_polys == 1  # if polygons combined
    +                            poly_disjoint = false
    +                            union_multipoly.geom[curr_idx] = new_polys[1]
    +                            curr_poly = union_multipoly.geom[curr_idx]
    +                            keep_idx[next_idx] = false
    +                        end
    +                    end
    +                end
    +            end
    +        end
    +        keepat!(union_multipoly.geom, keep_idx)
    +    end
    +    return union_multipoly
    +end
    +
    +"""
    +    DiffIntersectingPolygons() <: GeometryCorrection
    +This correction ensures that the polygons included in a multipolygon aren't intersecting.
    +If any polygon's are intersecting, they will be made nonintersecting through the \`difference\`
    +operation to create a unique set of disjoint (other than potentially connections by a single point)
    +polygons covering the same area.
    +See also \`GeometryCorrection\`, \`UnionIntersectingPolygons\`.
    +"""
    +struct DiffIntersectingPolygons <: GeometryCorrection end
    +
    +application_level(::DiffIntersectingPolygons) = GI.MultiPolygonTrait
    +
    +function (::DiffIntersectingPolygons)(::GI.MultiPolygonTrait, multipoly)
    +    diff_multipoly = tuples(multipoly)
    +    n_starting_polys = GI.npolygon(multipoly)
    +    n_polys = n_starting_polys
    +    if n_polys > 1
    +        keep_idx = trues(n_polys)  # keep track of sub-polygons to remove

    Break apart any sub-polygons that intersect

    julia
            for curr_idx in 1:n_starting_polys
    +            !keep_idx[curr_idx] && continue
    +            for next_idx in (curr_idx + 1):n_starting_polys
    +                !keep_idx[next_idx] && continue
    +                next_poly = diff_multipoly.geom[next_idx]
    +                n_new_polys = 0
    +                curr_pieces_added = (n_polys + 1):(n_polys + n_new_polys)
    +                for curr_piece_idx in Iterators.flatten((curr_idx:curr_idx, curr_pieces_added))
    +                    !keep_idx[curr_piece_idx] && continue
    +                    curr_poly = diff_multipoly.geom[curr_piece_idx]
    +                    if intersects(curr_poly, next_poly)  # if two polygons intersect
    +                        new_polys = difference(curr_poly, next_poly; target = GI.PolygonTrait())
    +                        n_new_pieces = length(new_polys) - 1
    +                        if n_new_pieces < 0  # current polygon is covered by next_polygon
    +                            keep_idx[curr_piece_idx] = false
    +                            break
    +                        elseif n_new_pieces  0
    +                            diff_multipoly.geom[curr_piece_idx] = new_polys[1]
    +                            curr_poly = diff_multipoly.geom[curr_piece_idx]
    +                            if n_new_pieces > 0 # current polygon breaks into several pieces
    +                                append!(diff_multipoly.geom, @view new_polys[2:end])
    +                                append!(keep_idx, trues(n_new_pieces))
    +                                n_new_polys += n_new_pieces
    +                            end
    +                        end
    +                    end
    +                end
    +                n_polys += n_new_polys
    +            end
    +        end
    +        keepat!(diff_multipoly.geom, keep_idx)
    +    end
    +    return diff_multipoly
    +end

    This page was generated using Literate.jl.

    `,22)]))}const d=i(t,[["render",h]]);export{E as __pageData,d as default}; diff --git a/previews/PR239/assets/source_transformations_correction_intersecting_polygons.md.CLhMqjHy.lean.js b/previews/PR239/assets/source_transformations_correction_intersecting_polygons.md.CLhMqjHy.lean.js new file mode 100644 index 000000000..440caed24 --- /dev/null +++ b/previews/PR239/assets/source_transformations_correction_intersecting_polygons.md.CLhMqjHy.lean.js @@ -0,0 +1,97 @@ +import{_ as i,c as a,a5 as n,o as l}from"./chunks/framework.onQNwZ2I.js";const E=JSON.parse('{"title":"Intersecting Polygons","description":"","frontmatter":{},"headers":[],"relativePath":"source/transformations/correction/intersecting_polygons.md","filePath":"source/transformations/correction/intersecting_polygons.md","lastUpdated":null}'),t={name:"source/transformations/correction/intersecting_polygons.md"};function h(p,s,e,k,r,g){return l(),a("div",null,s[0]||(s[0]=[n(`

    Intersecting Polygons

    julia
    export UnionIntersectingPolygons

    If the sub-polygons of a multipolygon are intersecting, this makes them invalid according to specification. Each sub-polygon of a multipolygon being disjoint (other than by a single point) is a requirement for a valid multipolygon. However, different libraries may achieve this in different ways.

    For example, taking the union of all sub-polygons of a multipolygon will create a new multipolygon where each sub-polygon is disjoint. This can be done with the UnionIntersectingPolygons correction.

    The reason this operates on a multipolygon level is that it is easy for users to mistakenly create multipolygon's that overlap, which can then be detrimental to polygon clipping performance and even create wrong answers.

    Example

    Multipolygon providers may not check that the polygons making up their multipolygons do not intersect, which makes them invalid according to the specification.

    For example, the following multipolygon is not valid:

    julia
    import GeoInterface as GI
    +polygon = GI.Polygon([[(0.0, 0.0), (3.0, 0.0), (3.0, 3.0), (0.0, 3.0), (0.0, 0.0)]])
    +multipolygon = GI.MultiPolygon([polygon, polygon])
    GeoInterface.Wrappers.MultiPolygon{false, false, Vector{GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}[GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(0.0, 0.0), (3.0, 0.0), (3.0, 3.0), (0.0, 3.0), (0.0, 0.0)], nothing, nothing)], nothing, nothing), GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(0.0, 0.0), (3.0, 0.0), (3.0, 3.0), (0.0, 3.0), (0.0, 0.0)], nothing, nothing)], nothing, nothing)], nothing, nothing)

    given that the two sub-polygons are the exact same shape.

    julia
    import GeometryOps as GO
    +GO.fix(multipolygon, corrections = [GO.UnionIntersectingPolygons()])
    GeoInterface.Wrappers.MultiPolygon{false, false, Vector{GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}[GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(0.0, 0.0), (3.0, 0.0), (3.0, 3.0), (0.0, 3.0), (0.0, 0.0)], nothing, nothing)], nothing, nothing)], nothing, nothing)

    You can see that the the multipolygon now only contains one sub-polygon, rather than the two identical ones provided.

    Implementation

    julia
    """
    +    UnionIntersectingPolygons() <: GeometryCorrection
    +
    +This correction ensures that the polygon's included in a multipolygon aren't intersecting.
    +If any polygon's are intersecting, they will be combined through the union operation to
    +create a unique set of disjoint (other than potentially connections by a single point)
    +polygons covering the same area.
    +
    +See also \`GeometryCorrection\`.
    +"""
    +struct UnionIntersectingPolygons <: GeometryCorrection end
    +
    +application_level(::UnionIntersectingPolygons) = GI.MultiPolygonTrait
    +
    +function (::UnionIntersectingPolygons)(::GI.MultiPolygonTrait, multipoly)
    +    union_multipoly = tuples(multipoly)
    +    n_polys = GI.npolygon(multipoly)
    +    if n_polys > 1
    +        keep_idx = trues(n_polys)  # keep track of sub-polygons to remove

    Combine any sub-polygons that intersect

    julia
            for (curr_idx, _) in Iterators.filter(last, Iterators.enumerate(keep_idx))
    +            curr_poly = union_multipoly.geom[curr_idx]
    +            poly_disjoint = false
    +            while !poly_disjoint
    +                poly_disjoint = true  # assume current polygon is disjoint from others
    +                for (next_idx, _) in Iterators.filter(last, Iterators.drop(Iterators.enumerate(keep_idx), curr_idx))
    +                    next_poly = union_multipoly.geom[next_idx]
    +                    if intersects(curr_poly, next_poly)  # if two polygons intersect
    +                        new_polys = union(curr_poly, next_poly; target = GI.PolygonTrait())
    +                        n_new_polys = length(new_polys)
    +                        if n_new_polys == 1  # if polygons combined
    +                            poly_disjoint = false
    +                            union_multipoly.geom[curr_idx] = new_polys[1]
    +                            curr_poly = union_multipoly.geom[curr_idx]
    +                            keep_idx[next_idx] = false
    +                        end
    +                    end
    +                end
    +            end
    +        end
    +        keepat!(union_multipoly.geom, keep_idx)
    +    end
    +    return union_multipoly
    +end
    +
    +"""
    +    DiffIntersectingPolygons() <: GeometryCorrection
    +This correction ensures that the polygons included in a multipolygon aren't intersecting.
    +If any polygon's are intersecting, they will be made nonintersecting through the \`difference\`
    +operation to create a unique set of disjoint (other than potentially connections by a single point)
    +polygons covering the same area.
    +See also \`GeometryCorrection\`, \`UnionIntersectingPolygons\`.
    +"""
    +struct DiffIntersectingPolygons <: GeometryCorrection end
    +
    +application_level(::DiffIntersectingPolygons) = GI.MultiPolygonTrait
    +
    +function (::DiffIntersectingPolygons)(::GI.MultiPolygonTrait, multipoly)
    +    diff_multipoly = tuples(multipoly)
    +    n_starting_polys = GI.npolygon(multipoly)
    +    n_polys = n_starting_polys
    +    if n_polys > 1
    +        keep_idx = trues(n_polys)  # keep track of sub-polygons to remove

    Break apart any sub-polygons that intersect

    julia
            for curr_idx in 1:n_starting_polys
    +            !keep_idx[curr_idx] && continue
    +            for next_idx in (curr_idx + 1):n_starting_polys
    +                !keep_idx[next_idx] && continue
    +                next_poly = diff_multipoly.geom[next_idx]
    +                n_new_polys = 0
    +                curr_pieces_added = (n_polys + 1):(n_polys + n_new_polys)
    +                for curr_piece_idx in Iterators.flatten((curr_idx:curr_idx, curr_pieces_added))
    +                    !keep_idx[curr_piece_idx] && continue
    +                    curr_poly = diff_multipoly.geom[curr_piece_idx]
    +                    if intersects(curr_poly, next_poly)  # if two polygons intersect
    +                        new_polys = difference(curr_poly, next_poly; target = GI.PolygonTrait())
    +                        n_new_pieces = length(new_polys) - 1
    +                        if n_new_pieces < 0  # current polygon is covered by next_polygon
    +                            keep_idx[curr_piece_idx] = false
    +                            break
    +                        elseif n_new_pieces  0
    +                            diff_multipoly.geom[curr_piece_idx] = new_polys[1]
    +                            curr_poly = diff_multipoly.geom[curr_piece_idx]
    +                            if n_new_pieces > 0 # current polygon breaks into several pieces
    +                                append!(diff_multipoly.geom, @view new_polys[2:end])
    +                                append!(keep_idx, trues(n_new_pieces))
    +                                n_new_polys += n_new_pieces
    +                            end
    +                        end
    +                    end
    +                end
    +                n_polys += n_new_polys
    +            end
    +        end
    +        keepat!(diff_multipoly.geom, keep_idx)
    +    end
    +    return diff_multipoly
    +end

    This page was generated using Literate.jl.

    `,22)]))}const d=i(t,[["render",h]]);export{E as __pageData,d as default}; diff --git a/previews/PR239/assets/source_transformations_extent.md.CrI7_2Lj.js b/previews/PR239/assets/source_transformations_extent.md.CrI7_2Lj.js new file mode 100644 index 000000000..6452b6fb3 --- /dev/null +++ b/previews/PR239/assets/source_transformations_extent.md.CrI7_2Lj.js @@ -0,0 +1,13 @@ +import{_ as e,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const k=JSON.parse('{"title":"Extent embedding","description":"","frontmatter":{},"headers":[],"relativePath":"source/transformations/extent.md","filePath":"source/transformations/extent.md","lastUpdated":null}'),i={name:"source/transformations/extent.md"};function l(p,s,r,h,d,o){return t(),a("div",null,s[0]||(s[0]=[n(`

    Extent embedding

    julia
    """
    +    embed_extent(obj)
    +
    +Recursively wrap the object with a GeoInterface.jl geometry,
    +calculating and adding an \`Extents.Extent\` to all objects.
    +
    +This can improve performance when extents need to be checked multiple times,
    +such when needing to check if many points are in geometries, and using their extents
    +as a quick filter for obviously exterior points.

    Keywords

    julia
    $THREADED_KEYWORD
    +$CRS_KEYWORD
    +"""
    +embed_extent(x; threaded=false, crs=nothing) =
    +    apply(identity, GI.PointTrait(), x; calc_extent=true, threaded, crs)

    This page was generated using Literate.jl.

    `,6)]))}const g=e(i,[["render",l]]);export{k as __pageData,g as default}; diff --git a/previews/PR239/assets/source_transformations_extent.md.CrI7_2Lj.lean.js b/previews/PR239/assets/source_transformations_extent.md.CrI7_2Lj.lean.js new file mode 100644 index 000000000..6452b6fb3 --- /dev/null +++ b/previews/PR239/assets/source_transformations_extent.md.CrI7_2Lj.lean.js @@ -0,0 +1,13 @@ +import{_ as e,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const k=JSON.parse('{"title":"Extent embedding","description":"","frontmatter":{},"headers":[],"relativePath":"source/transformations/extent.md","filePath":"source/transformations/extent.md","lastUpdated":null}'),i={name:"source/transformations/extent.md"};function l(p,s,r,h,d,o){return t(),a("div",null,s[0]||(s[0]=[n(`

    Extent embedding

    julia
    """
    +    embed_extent(obj)
    +
    +Recursively wrap the object with a GeoInterface.jl geometry,
    +calculating and adding an \`Extents.Extent\` to all objects.
    +
    +This can improve performance when extents need to be checked multiple times,
    +such when needing to check if many points are in geometries, and using their extents
    +as a quick filter for obviously exterior points.

    Keywords

    julia
    $THREADED_KEYWORD
    +$CRS_KEYWORD
    +"""
    +embed_extent(x; threaded=false, crs=nothing) =
    +    apply(identity, GI.PointTrait(), x; calc_extent=true, threaded, crs)

    This page was generated using Literate.jl.

    `,6)]))}const g=e(i,[["render",l]]);export{k as __pageData,g as default}; diff --git a/previews/PR239/assets/source_transformations_flip.md.CbHFKr9B.js b/previews/PR239/assets/source_transformations_flip.md.CbHFKr9B.js new file mode 100644 index 000000000..d979792ae --- /dev/null +++ b/previews/PR239/assets/source_transformations_flip.md.CbHFKr9B.js @@ -0,0 +1,22 @@ +import{_ as i,c as a,a5 as n,o as p}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"Coordinate flipping","description":"","frontmatter":{},"headers":[],"relativePath":"source/transformations/flip.md","filePath":"source/transformations/flip.md","lastUpdated":null}'),t={name:"source/transformations/flip.md"};function l(h,s,e,k,r,d){return p(),a("div",null,s[0]||(s[0]=[n(`

    Coordinate flipping

    This is a simple example of how to use the apply functionality in a function, by flipping the x and y coordinates of a geometry.

    julia
    """
    +    flip(obj)
    +
    +Swap all of the x and y coordinates in obj, otherwise
    +keeping the original structure (but not necessarily the
    +original type).
    +
    +# Keywords
    +
    +$APPLY_KEYWORDS
    +"""
    +function flip(geom; kw...)
    +    if _is3d(geom)
    +        return apply(PointTrait(), geom; kw...) do p
    +            (GI.y(p), GI.x(p), GI.z(p))
    +        end
    +    else
    +        return apply(PointTrait(), geom; kw...) do p
    +            (GI.y(p), GI.x(p))
    +        end
    +    end
    +end

    This page was generated using Literate.jl.

    `,5)]))}const E=i(t,[["render",l]]);export{g as __pageData,E as default}; diff --git a/previews/PR239/assets/source_transformations_flip.md.CbHFKr9B.lean.js b/previews/PR239/assets/source_transformations_flip.md.CbHFKr9B.lean.js new file mode 100644 index 000000000..d979792ae --- /dev/null +++ b/previews/PR239/assets/source_transformations_flip.md.CbHFKr9B.lean.js @@ -0,0 +1,22 @@ +import{_ as i,c as a,a5 as n,o as p}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"Coordinate flipping","description":"","frontmatter":{},"headers":[],"relativePath":"source/transformations/flip.md","filePath":"source/transformations/flip.md","lastUpdated":null}'),t={name:"source/transformations/flip.md"};function l(h,s,e,k,r,d){return p(),a("div",null,s[0]||(s[0]=[n(`

    Coordinate flipping

    This is a simple example of how to use the apply functionality in a function, by flipping the x and y coordinates of a geometry.

    julia
    """
    +    flip(obj)
    +
    +Swap all of the x and y coordinates in obj, otherwise
    +keeping the original structure (but not necessarily the
    +original type).
    +
    +# Keywords
    +
    +$APPLY_KEYWORDS
    +"""
    +function flip(geom; kw...)
    +    if _is3d(geom)
    +        return apply(PointTrait(), geom; kw...) do p
    +            (GI.y(p), GI.x(p), GI.z(p))
    +        end
    +    else
    +        return apply(PointTrait(), geom; kw...) do p
    +            (GI.y(p), GI.x(p))
    +        end
    +    end
    +end

    This page was generated using Literate.jl.

    `,5)]))}const E=i(t,[["render",l]]);export{g as __pageData,E as default}; diff --git a/previews/PR239/assets/source_transformations_forcedims.md._lugiyHg.js b/previews/PR239/assets/source_transformations_forcedims.md._lugiyHg.js new file mode 100644 index 000000000..8d62b14bb --- /dev/null +++ b/previews/PR239/assets/source_transformations_forcedims.md._lugiyHg.js @@ -0,0 +1,5 @@ +import{_ as i,c as a,a5 as t,o as n}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/transformations/forcedims.md","filePath":"source/transformations/forcedims.md","lastUpdated":null}'),e={name:"source/transformations/forcedims.md"};function p(h,s,l,k,r,d){return n(),a("div",null,s[0]||(s[0]=[t(`
    julia
    function forcexy(geom)
    +    return GO.apply(GO.GI.PointTrait(), geom) do point
    +        (GI.x(point), GI.y(point))
    +    end
    +end

    This page was generated using Literate.jl.

    `,3)]))}const E=i(e,[["render",p]]);export{g as __pageData,E as default}; diff --git a/previews/PR239/assets/source_transformations_forcedims.md._lugiyHg.lean.js b/previews/PR239/assets/source_transformations_forcedims.md._lugiyHg.lean.js new file mode 100644 index 000000000..8d62b14bb --- /dev/null +++ b/previews/PR239/assets/source_transformations_forcedims.md._lugiyHg.lean.js @@ -0,0 +1,5 @@ +import{_ as i,c as a,a5 as t,o as n}from"./chunks/framework.onQNwZ2I.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"source/transformations/forcedims.md","filePath":"source/transformations/forcedims.md","lastUpdated":null}'),e={name:"source/transformations/forcedims.md"};function p(h,s,l,k,r,d){return n(),a("div",null,s[0]||(s[0]=[t(`
    julia
    function forcexy(geom)
    +    return GO.apply(GO.GI.PointTrait(), geom) do point
    +        (GI.x(point), GI.y(point))
    +    end
    +end

    This page was generated using Literate.jl.

    `,3)]))}const E=i(e,[["render",p]]);export{g as __pageData,E as default}; diff --git a/previews/PR239/assets/source_transformations_reproject.md.DZgumE25.js b/previews/PR239/assets/source_transformations_reproject.md.DZgumE25.js new file mode 100644 index 000000000..891cb589b --- /dev/null +++ b/previews/PR239/assets/source_transformations_reproject.md.DZgumE25.js @@ -0,0 +1 @@ +import{_ as i,c as a,a5 as e,o as n}from"./chunks/framework.onQNwZ2I.js";const c=JSON.parse('{"title":"Geometry reprojection","description":"","frontmatter":{},"headers":[],"relativePath":"source/transformations/reproject.md","filePath":"source/transformations/reproject.md","lastUpdated":null}'),t={name:"source/transformations/reproject.md"};function p(l,s,r,h,k,o){return n(),a("div",null,s[0]||(s[0]=[e('

    Geometry reprojection

    julia
    export reproject

    This file is pretty simple - it simply reprojects a geometry pointwise from one CRS to another. It uses the Proj package for the transformation, but this could be moved to an extension if needed.

    Note that the actual implementation is in the GeometryOpsProjExt extension module.

    This works using the apply functionality.

    julia
    """\n    reproject(geometry; source_crs, target_crs, transform, always_xy, time)\n    reproject(geometry, source_crs, target_crs; always_xy, time)\n    reproject(geometry, transform; always_xy, time)\n\nReproject any GeoInterface.jl compatible `geometry` from `source_crs` to `target_crs`.\n\nThe returned object will be constructed from `GeoInterface.WrapperGeometry`\ngeometries, wrapping views of a `Vector{Proj.Point{D}}`, where `D` is the dimension.\n\n!!! tip\n    The `Proj.jl` package must be loaded for this method to work,\n    since it is implemented in a package extension.\n\n# Arguments\n\n- `geometry`: Any GeoInterface.jl compatible geometries.\n- `source_crs`: the source coordinate reference system, as a GeoFormatTypes.jl object or a string.\n- `target_crs`: the target coordinate reference system, as a GeoFormatTypes.jl object or a string.\n\nIf these a passed as keywords, `transform` will take priority.\nWithout it `target_crs` is always needed, and `source_crs` is\nneeded if it is not retrievable from the geometry with `GeoInterface.crs(geometry)`.\n\n# Keywords\n\n- `always_xy`: force x, y coordinate order, `true` by default.\n    `false` will expect and return points in the crs coordinate order.\n- `time`: the time for the coordinates. `Inf` by default.\n$APPLY_KEYWORDS\n"""\nfunction reproject end

    Method error handling

    We also inject a method error handler, which prints a suggestion if the Proj extension is not loaded.

    julia
    function _reproject_error_hinter(io, exc, argtypes, kwargs)\n    if isnothing(Base.get_extension(GeometryOps, :GeometryOpsProjExt)) && exc.f == reproject\n        print(io, "\\n\\nThe `reproject` method requires the Proj.jl package to be explicitly loaded.\\n")\n        print(io, "You can do this by simply typing ")\n        printstyled(io, "using Proj"; color = :cyan, bold = true)\n        println(io, " in your REPL, \\nor otherwise loading Proj.jl via using or import.")\n    else # this is a more general error\n        nothing\n    end\nend

    This page was generated using Literate.jl.

    ',11)]))}const g=i(t,[["render",p]]);export{c as __pageData,g as default}; diff --git a/previews/PR239/assets/source_transformations_reproject.md.DZgumE25.lean.js b/previews/PR239/assets/source_transformations_reproject.md.DZgumE25.lean.js new file mode 100644 index 000000000..891cb589b --- /dev/null +++ b/previews/PR239/assets/source_transformations_reproject.md.DZgumE25.lean.js @@ -0,0 +1 @@ +import{_ as i,c as a,a5 as e,o as n}from"./chunks/framework.onQNwZ2I.js";const c=JSON.parse('{"title":"Geometry reprojection","description":"","frontmatter":{},"headers":[],"relativePath":"source/transformations/reproject.md","filePath":"source/transformations/reproject.md","lastUpdated":null}'),t={name:"source/transformations/reproject.md"};function p(l,s,r,h,k,o){return n(),a("div",null,s[0]||(s[0]=[e('

    Geometry reprojection

    julia
    export reproject

    This file is pretty simple - it simply reprojects a geometry pointwise from one CRS to another. It uses the Proj package for the transformation, but this could be moved to an extension if needed.

    Note that the actual implementation is in the GeometryOpsProjExt extension module.

    This works using the apply functionality.

    julia
    """\n    reproject(geometry; source_crs, target_crs, transform, always_xy, time)\n    reproject(geometry, source_crs, target_crs; always_xy, time)\n    reproject(geometry, transform; always_xy, time)\n\nReproject any GeoInterface.jl compatible `geometry` from `source_crs` to `target_crs`.\n\nThe returned object will be constructed from `GeoInterface.WrapperGeometry`\ngeometries, wrapping views of a `Vector{Proj.Point{D}}`, where `D` is the dimension.\n\n!!! tip\n    The `Proj.jl` package must be loaded for this method to work,\n    since it is implemented in a package extension.\n\n# Arguments\n\n- `geometry`: Any GeoInterface.jl compatible geometries.\n- `source_crs`: the source coordinate reference system, as a GeoFormatTypes.jl object or a string.\n- `target_crs`: the target coordinate reference system, as a GeoFormatTypes.jl object or a string.\n\nIf these a passed as keywords, `transform` will take priority.\nWithout it `target_crs` is always needed, and `source_crs` is\nneeded if it is not retrievable from the geometry with `GeoInterface.crs(geometry)`.\n\n# Keywords\n\n- `always_xy`: force x, y coordinate order, `true` by default.\n    `false` will expect and return points in the crs coordinate order.\n- `time`: the time for the coordinates. `Inf` by default.\n$APPLY_KEYWORDS\n"""\nfunction reproject end

    Method error handling

    We also inject a method error handler, which prints a suggestion if the Proj extension is not loaded.

    julia
    function _reproject_error_hinter(io, exc, argtypes, kwargs)\n    if isnothing(Base.get_extension(GeometryOps, :GeometryOpsProjExt)) && exc.f == reproject\n        print(io, "\\n\\nThe `reproject` method requires the Proj.jl package to be explicitly loaded.\\n")\n        print(io, "You can do this by simply typing ")\n        printstyled(io, "using Proj"; color = :cyan, bold = true)\n        println(io, " in your REPL, \\nor otherwise loading Proj.jl via using or import.")\n    else # this is a more general error\n        nothing\n    end\nend

    This page was generated using Literate.jl.

    ',11)]))}const g=i(t,[["render",p]]);export{c as __pageData,g as default}; diff --git a/previews/PR239/assets/source_transformations_segmentize.md.DQ-jJDsI.js b/previews/PR239/assets/source_transformations_segmentize.md.DQ-jJDsI.js new file mode 100644 index 000000000..83598bc44 --- /dev/null +++ b/previews/PR239/assets/source_transformations_segmentize.md.DQ-jJDsI.js @@ -0,0 +1,161 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const t="/GeometryOps.jl/previews/PR239/assets/xnfkjof.D5-bot8v.png",l="/GeometryOps.jl/previews/PR239/assets/eozeurm.DGf_4PiA.png",o=JSON.parse('{"title":"Segmentize","description":"","frontmatter":{},"headers":[],"relativePath":"source/transformations/segmentize.md","filePath":"source/transformations/segmentize.md","lastUpdated":null}'),k={name:"source/transformations/segmentize.md"};function e(p,s,r,d,E,g){return h(),a("div",null,s[0]||(s[0]=[n(`

    Segmentize

    julia
    export segmentize
    +export LinearSegments, GeodesicSegments

    This function "segmentizes" or "densifies" a geometry by adding extra vertices to the geometry so that no segment is longer than a given distance. This is useful for plotting geometries with a limited number of vertices, or for ensuring that a geometry is not too "coarse" for a given application.

    Info

    We plan to add interpolated segmentization from DataInterpolations.jl in the future, which will be available to any vector of point-like objects.

    For now, this function only works on 2D geometries.  We will also support 3D geometries, as well as measure interpolation, in the future.

    Examples

    julia
    import GeometryOps as GO, GeoInterface as GI
    +rectangle = GI.Wrappers.Polygon([[(0.0, 50.0), (7.071, 57.07), (0, 64.14), (-7.07, 57.07), (0.0, 50.0)]])
    +linear = GO.segmentize(rectangle; max_distance = 5)
    +collect(GI.getpoint(linear))
    9-element Vector{Tuple{Float64, Float64}}:
    + (0.0, 50.0)
    + (3.5355, 53.535)
    + (7.071, 57.07)
    + (3.5355, 60.605000000000004)
    + (0.0, 64.14)
    + (-3.535, 60.605000000000004)
    + (-7.07, 57.07)
    + (-3.535, 53.535)
    + (0.0, 50.0)

    You can see that this geometry was segmentized correctly, and now has 8 vertices where it previously had only 4.

    Now, we'll also segmentize this using the geodesic method, which is more accurate for lat/lon coordinates.

    julia
    using Proj # required to activate the \`GeodesicSegments\` method!
    +geodesic = GO.segmentize(GO.GeodesicSegments(max_distance = 1000), rectangle)
    +length(GI.getpoint(geodesic) |> collect)
    3585

    This has a lot of points! It's important to keep in mind that the max_distance is in meters, so this is a very fine-grained segmentation.

    Now, let's see what they look like! To make this fair, we'll use approximately the same number of points for both.

    julia
    using CairoMakie
    +linear = GO.segmentize(rectangle; max_distance = 0.01)
    +geodesic = GO.segmentize(GO.GeodesicSegments(; max_distance = 1000), rectangle)
    +f, a, p = poly(collect(GI.getpoint(linear)); label = "Linear", axis = (; aspect = DataAspect()))
    +p2 = poly!(collect(GI.getpoint(geodesic)); label = "Geodesic")
    +axislegend(a; position = :lt)
    +f

    There are two methods available for segmentizing geometries at the moment:

    Missing docstring.

    Missing docstring for LinearSegments. Check Documenter's build log for details.

    Missing docstring.

    Missing docstring for GeodesicSegments. Check Documenter's build log for details.

    Benchmark

    We benchmark our method against LibGEOS's GEOSDensify method, which is a similar method for densifying geometries.

    julia
    using BenchmarkTools: BenchmarkGroup
    +using Chairmarks: @be
    +using Main: plot_trials
    +using CairoMakie
    +
    +import GeometryOps as GO, GeoInterface as GI, LibGEOS as LG
    +
    +segmentize_suite = BenchmarkGroup(["title:Segmentize", "subtitle:Segmentize a rectangle"])
    +
    +rectangle = GI.Wrappers.Polygon([[(0.0, 50.0), (7.071, 57.07), (0.0, 64.14), (-7.07, 57.07), (0.0, 50.0)]])
    +lg_rectangle = GI.convert(LG, rectangle)
    POLYGON ((0 50, 7.071 57.07, 0 64.14, -7.07 57.07, 0 50))
    julia
    # These are initial distances, which yield similar numbers of points
    +# in the final geometry.
    +init_lin = 0.01
    +init_geo = 900
    +
    +# LibGEOS.jl doesn't offer this function, so we just wrap it ourselves!
    +function densify(obj::LG.Geometry, tol::Real, context::LG.GEOSContext = LG.get_context(obj))
    +    result = LG.GEOSDensify_r(context, obj, tol)
    +    if result == C_NULL
    +        error("LibGEOS: Error in GEOSDensify")
    +    end
    +    LG.geomFromGEOS(result, context)
    +end
    +# now, we get to the actual benchmarking:
    +for scalefactor in exp10.(LinRange(log10(0.1), log10(10), 5))
    +    lin_dist = init_lin * scalefactor
    +    geo_dist = init_geo * scalefactor
    +
    +    npoints_linear = GI.npoint(GO.segmentize(rectangle; max_distance = lin_dist))
    +    npoints_geodesic = GO.segmentize(GO.GeodesicSegments(; max_distance = geo_dist), rectangle) |> GI.npoint
    +    npoints_libgeos = GI.npoint(densify(lg_rectangle, lin_dist))
    +
    +    segmentize_suite["Linear"][npoints_linear] = @be GO.segmentize(GO.LinearSegments(; max_distance = $lin_dist), $rectangle) seconds=1
    +    segmentize_suite["Geodesic"][npoints_geodesic] = @be GO.segmentize(GO.GeodesicSegments(; max_distance = $geo_dist), $rectangle) seconds=1
    +    segmentize_suite["LibGEOS"][npoints_libgeos] = @be densify($lg_rectangle, $lin_dist) seconds=1
    +
    +end
    +
    +plot_trials(segmentize_suite)

    julia
    abstract type SegmentizeMethod end
    +"""
    +    LinearSegments(; max_distance::Real)
    +
    +A method for segmentizing geometries by adding extra vertices to the geometry so that no segment is longer than a given distance.
    +
    +Here, \`max_distance\` is a purely nondimensional quantity and will apply in the input space.   This is to say, that if the polygon is
    +provided in lat/lon coordinates then the \`max_distance\` will be in degrees of arc.  If the polygon is provided in meters, then the
    +\`max_distance\` will be in meters.
    +"""
    +Base.@kwdef struct LinearSegments <: SegmentizeMethod
    +    max_distance::Float64
    +end
    +
    +"""
    +    GeodesicSegments(; max_distance::Real, equatorial_radius::Real=6378137, flattening::Real=1/298.257223563)
    +
    +A method for segmentizing geometries by adding extra vertices to the geometry so that no segment is longer than a given distance.
    +This method calculates the distance between points on the geodesic, and assumes input in lat/long coordinates.
    +
    +!!! warning
    +    Any input geometries must be in lon/lat coordinates!  If not, the method may fail or error.
    +
    +# Arguments
    +- \`max_distance::Real\`: The maximum distance, **in meters**, between vertices in the geometry.
    +- \`equatorial_radius::Real=6378137\`: The equatorial radius of the Earth, in meters.  Passed to \`Proj.geod_geodesic\`.
    +- \`flattening::Real=1/298.257223563\`: The flattening of the Earth, which is the ratio of the difference between the equatorial and polar radii to the equatorial radius.  Passed to \`Proj.geod_geodesic\`.
    +
    +One can also omit the \`equatorial_radius\` and \`flattening\` keyword arguments, and pass a \`geodesic\` object directly to the eponymous keyword.
    +
    +This method uses the Proj/GeographicLib API for geodesic calculations.
    +"""
    +struct GeodesicSegments{T} <: SegmentizeMethod
    +    geodesic::T# ::Proj.geod_geodesic
    +    max_distance::Float64
    +end

    Add an error hint for GeodesicSegments if Proj is not loaded!

    julia
    function _geodesic_segments_error_hinter(io, exc, argtypes, kwargs)
    +    if isnothing(Base.get_extension(GeometryOps, :GeometryOpsProjExt)) && exc.f == GeodesicSegments
    +        print(io, "\\n\\nThe \`Geodesic\` method requires the Proj.jl package to be explicitly loaded.\\n")
    +        print(io, "You can do this by simply typing ")
    +        printstyled(io, "using Proj"; color = :cyan, bold = true)
    +        println(io, " in your REPL, \\nor otherwise loading Proj.jl via using or import.")
    +    end
    +end

    Implementation

    julia
    """
    +    segmentize([method = Planar()], geom; max_distance::Real, threaded)
    +
    +Segmentize a geometry by adding extra vertices to the geometry so that no segment is longer than a given distance.
    +This is useful for plotting geometries with a limited number of vertices, or for ensuring that a geometry is not too "coarse" for a given application.
    +
    +# Arguments
    +- \`method::Manifold = Planar()\`: The method to use for segmentizing the geometry.  At the moment, only \`Planar\` (assumes a flat plane) and \`Geodesic\` (assumes geometry on the ellipsoidal Earth and uses Vincenty's formulae) are available.
    +- \`geom\`: The geometry to segmentize.  Must be a \`LineString\`, \`LinearRing\`, \`Polygon\`, \`MultiPolygon\`, or \`GeometryCollection\`, or some vector or table of those.
    +- \`max_distance::Real\`: The maximum distance between vertices in the geometry.  **Beware: for \`Planar\`, this is in the units of the geometry, but for \`Geodesic\` and \`Spherical\` it's in units of the radius of the sphere.**
    +
    +Returns a geometry of similar type to the input geometry, but resampled.
    +"""
    +function segmentize(geom; max_distance, threaded::Union{Bool, BoolsAsTypes} = _False())
    +    return segmentize(Planar(), geom; max_distance, threaded = _booltype(threaded))
    +end

    allow three-arg method as well, just in case

    julia
    segmentize(geom, max_distance::Real; threaded = _False()) = segmentize(Planar(), geom, max_distance; threaded)
    +segmentize(method::Manifold, geom, max_distance::Real; threaded = _False()) = segmentize(Planar(), geom; max_distance, threaded)

    generic implementation

    julia
    function segmentize(method::Manifold, geom; max_distance, threaded::Union{Bool, BoolsAsTypes} = _False())
    +    @assert max_distance > 0 "\`max_distance\` should be positive and nonzero!  Found $(method.max_distance)."
    +    _segmentize_function(geom) = _segmentize(method, geom, GI.trait(geom); max_distance)
    +    return apply(_segmentize_function, TraitTarget(GI.LinearRingTrait(), GI.LineStringTrait()), geom; threaded)
    +end
    +
    +function segmentize(method::SegmentizeMethod, geom; threaded::Union{Bool, BoolsAsTypes} = _False())
    +    @warn "\`segmentize(method::$(typeof(method)), geom) is deprecated; use \`segmentize($(method isa LinearSegments ? "Planar()" : "Geodesic()"), geom; max_distance, threaded) instead!"  maxlog=3
    +    @assert method.max_distance > 0 "\`max_distance\` should be positive and nonzero!  Found $(method.max_distance)."
    +    new_method = method isa LinearSegments ? Planar() : Geodesic()
    +    segmentize(new_method, geom; max_distance = method.max_distance, threaded)
    +end
    +
    +_segmentize(method, geom) = _segmentize(method, geom, GI.trait(geom))
    +#=
    +This is a method which performs the common functionality for both linear and geodesic algorithms,
    +and calls out to the "kernel" function which we've defined per linesegment.
    +=#
    +function _segmentize(method::Union{Planar, Spherical}, geom, T::Union{GI.LineStringTrait, GI.LinearRingTrait}; max_distance)
    +    first_coord = GI.getpoint(geom, 1)
    +    x1, y1 = GI.x(first_coord), GI.y(first_coord)
    +    new_coords = NTuple{2, Float64}[]
    +    sizehint!(new_coords, GI.npoint(geom))
    +    push!(new_coords, (x1, y1))
    +    for coord in Iterators.drop(GI.getpoint(geom), 1)
    +        x2, y2 = GI.x(coord), GI.y(coord)
    +        _fill_linear_kernel!(method, new_coords, x1, y1, x2, y2; max_distance)
    +        x1, y1 = x2, y2
    +    end
    +    return rebuild(geom, new_coords)
    +end
    +
    +function _fill_linear_kernel!(::Planar, new_coords::Vector, x1, y1, x2, y2; max_distance)
    +    dx, dy = x2 - x1, y2 - y1
    +    distance = hypot(dx, dy) # this is a more stable way to compute the Euclidean distance
    +    if distance > max_distance
    +        n_segments = ceil(Int, distance / max_distance)
    +        for i in 1:(n_segments - 1)
    +            t = i / n_segments
    +            push!(new_coords, (x1 + t * dx, y1 + t * dy))
    +        end
    +    end

    End the line with the original coordinate, to avoid any multiplication errors.

    julia
        push!(new_coords, (x2, y2))
    +    return nothing
    +end

    Note

    The _fill_linear_kernel definition for GeodesicSegments is in the GeometryOpsProjExt extension module, in the segmentize.jl file.


    This page was generated using Literate.jl.

    `,39)]))}const F=i(k,[["render",e]]);export{o as __pageData,F as default}; diff --git a/previews/PR239/assets/source_transformations_segmentize.md.DQ-jJDsI.lean.js b/previews/PR239/assets/source_transformations_segmentize.md.DQ-jJDsI.lean.js new file mode 100644 index 000000000..83598bc44 --- /dev/null +++ b/previews/PR239/assets/source_transformations_segmentize.md.DQ-jJDsI.lean.js @@ -0,0 +1,161 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const t="/GeometryOps.jl/previews/PR239/assets/xnfkjof.D5-bot8v.png",l="/GeometryOps.jl/previews/PR239/assets/eozeurm.DGf_4PiA.png",o=JSON.parse('{"title":"Segmentize","description":"","frontmatter":{},"headers":[],"relativePath":"source/transformations/segmentize.md","filePath":"source/transformations/segmentize.md","lastUpdated":null}'),k={name:"source/transformations/segmentize.md"};function e(p,s,r,d,E,g){return h(),a("div",null,s[0]||(s[0]=[n(`

    Segmentize

    julia
    export segmentize
    +export LinearSegments, GeodesicSegments

    This function "segmentizes" or "densifies" a geometry by adding extra vertices to the geometry so that no segment is longer than a given distance. This is useful for plotting geometries with a limited number of vertices, or for ensuring that a geometry is not too "coarse" for a given application.

    Info

    We plan to add interpolated segmentization from DataInterpolations.jl in the future, which will be available to any vector of point-like objects.

    For now, this function only works on 2D geometries.  We will also support 3D geometries, as well as measure interpolation, in the future.

    Examples

    julia
    import GeometryOps as GO, GeoInterface as GI
    +rectangle = GI.Wrappers.Polygon([[(0.0, 50.0), (7.071, 57.07), (0, 64.14), (-7.07, 57.07), (0.0, 50.0)]])
    +linear = GO.segmentize(rectangle; max_distance = 5)
    +collect(GI.getpoint(linear))
    9-element Vector{Tuple{Float64, Float64}}:
    + (0.0, 50.0)
    + (3.5355, 53.535)
    + (7.071, 57.07)
    + (3.5355, 60.605000000000004)
    + (0.0, 64.14)
    + (-3.535, 60.605000000000004)
    + (-7.07, 57.07)
    + (-3.535, 53.535)
    + (0.0, 50.0)

    You can see that this geometry was segmentized correctly, and now has 8 vertices where it previously had only 4.

    Now, we'll also segmentize this using the geodesic method, which is more accurate for lat/lon coordinates.

    julia
    using Proj # required to activate the \`GeodesicSegments\` method!
    +geodesic = GO.segmentize(GO.GeodesicSegments(max_distance = 1000), rectangle)
    +length(GI.getpoint(geodesic) |> collect)
    3585

    This has a lot of points! It's important to keep in mind that the max_distance is in meters, so this is a very fine-grained segmentation.

    Now, let's see what they look like! To make this fair, we'll use approximately the same number of points for both.

    julia
    using CairoMakie
    +linear = GO.segmentize(rectangle; max_distance = 0.01)
    +geodesic = GO.segmentize(GO.GeodesicSegments(; max_distance = 1000), rectangle)
    +f, a, p = poly(collect(GI.getpoint(linear)); label = "Linear", axis = (; aspect = DataAspect()))
    +p2 = poly!(collect(GI.getpoint(geodesic)); label = "Geodesic")
    +axislegend(a; position = :lt)
    +f

    There are two methods available for segmentizing geometries at the moment:

    Missing docstring.

    Missing docstring for LinearSegments. Check Documenter's build log for details.

    Missing docstring.

    Missing docstring for GeodesicSegments. Check Documenter's build log for details.

    Benchmark

    We benchmark our method against LibGEOS's GEOSDensify method, which is a similar method for densifying geometries.

    julia
    using BenchmarkTools: BenchmarkGroup
    +using Chairmarks: @be
    +using Main: plot_trials
    +using CairoMakie
    +
    +import GeometryOps as GO, GeoInterface as GI, LibGEOS as LG
    +
    +segmentize_suite = BenchmarkGroup(["title:Segmentize", "subtitle:Segmentize a rectangle"])
    +
    +rectangle = GI.Wrappers.Polygon([[(0.0, 50.0), (7.071, 57.07), (0.0, 64.14), (-7.07, 57.07), (0.0, 50.0)]])
    +lg_rectangle = GI.convert(LG, rectangle)
    POLYGON ((0 50, 7.071 57.07, 0 64.14, -7.07 57.07, 0 50))
    julia
    # These are initial distances, which yield similar numbers of points
    +# in the final geometry.
    +init_lin = 0.01
    +init_geo = 900
    +
    +# LibGEOS.jl doesn't offer this function, so we just wrap it ourselves!
    +function densify(obj::LG.Geometry, tol::Real, context::LG.GEOSContext = LG.get_context(obj))
    +    result = LG.GEOSDensify_r(context, obj, tol)
    +    if result == C_NULL
    +        error("LibGEOS: Error in GEOSDensify")
    +    end
    +    LG.geomFromGEOS(result, context)
    +end
    +# now, we get to the actual benchmarking:
    +for scalefactor in exp10.(LinRange(log10(0.1), log10(10), 5))
    +    lin_dist = init_lin * scalefactor
    +    geo_dist = init_geo * scalefactor
    +
    +    npoints_linear = GI.npoint(GO.segmentize(rectangle; max_distance = lin_dist))
    +    npoints_geodesic = GO.segmentize(GO.GeodesicSegments(; max_distance = geo_dist), rectangle) |> GI.npoint
    +    npoints_libgeos = GI.npoint(densify(lg_rectangle, lin_dist))
    +
    +    segmentize_suite["Linear"][npoints_linear] = @be GO.segmentize(GO.LinearSegments(; max_distance = $lin_dist), $rectangle) seconds=1
    +    segmentize_suite["Geodesic"][npoints_geodesic] = @be GO.segmentize(GO.GeodesicSegments(; max_distance = $geo_dist), $rectangle) seconds=1
    +    segmentize_suite["LibGEOS"][npoints_libgeos] = @be densify($lg_rectangle, $lin_dist) seconds=1
    +
    +end
    +
    +plot_trials(segmentize_suite)

    julia
    abstract type SegmentizeMethod end
    +"""
    +    LinearSegments(; max_distance::Real)
    +
    +A method for segmentizing geometries by adding extra vertices to the geometry so that no segment is longer than a given distance.
    +
    +Here, \`max_distance\` is a purely nondimensional quantity and will apply in the input space.   This is to say, that if the polygon is
    +provided in lat/lon coordinates then the \`max_distance\` will be in degrees of arc.  If the polygon is provided in meters, then the
    +\`max_distance\` will be in meters.
    +"""
    +Base.@kwdef struct LinearSegments <: SegmentizeMethod
    +    max_distance::Float64
    +end
    +
    +"""
    +    GeodesicSegments(; max_distance::Real, equatorial_radius::Real=6378137, flattening::Real=1/298.257223563)
    +
    +A method for segmentizing geometries by adding extra vertices to the geometry so that no segment is longer than a given distance.
    +This method calculates the distance between points on the geodesic, and assumes input in lat/long coordinates.
    +
    +!!! warning
    +    Any input geometries must be in lon/lat coordinates!  If not, the method may fail or error.
    +
    +# Arguments
    +- \`max_distance::Real\`: The maximum distance, **in meters**, between vertices in the geometry.
    +- \`equatorial_radius::Real=6378137\`: The equatorial radius of the Earth, in meters.  Passed to \`Proj.geod_geodesic\`.
    +- \`flattening::Real=1/298.257223563\`: The flattening of the Earth, which is the ratio of the difference between the equatorial and polar radii to the equatorial radius.  Passed to \`Proj.geod_geodesic\`.
    +
    +One can also omit the \`equatorial_radius\` and \`flattening\` keyword arguments, and pass a \`geodesic\` object directly to the eponymous keyword.
    +
    +This method uses the Proj/GeographicLib API for geodesic calculations.
    +"""
    +struct GeodesicSegments{T} <: SegmentizeMethod
    +    geodesic::T# ::Proj.geod_geodesic
    +    max_distance::Float64
    +end

    Add an error hint for GeodesicSegments if Proj is not loaded!

    julia
    function _geodesic_segments_error_hinter(io, exc, argtypes, kwargs)
    +    if isnothing(Base.get_extension(GeometryOps, :GeometryOpsProjExt)) && exc.f == GeodesicSegments
    +        print(io, "\\n\\nThe \`Geodesic\` method requires the Proj.jl package to be explicitly loaded.\\n")
    +        print(io, "You can do this by simply typing ")
    +        printstyled(io, "using Proj"; color = :cyan, bold = true)
    +        println(io, " in your REPL, \\nor otherwise loading Proj.jl via using or import.")
    +    end
    +end

    Implementation

    julia
    """
    +    segmentize([method = Planar()], geom; max_distance::Real, threaded)
    +
    +Segmentize a geometry by adding extra vertices to the geometry so that no segment is longer than a given distance.
    +This is useful for plotting geometries with a limited number of vertices, or for ensuring that a geometry is not too "coarse" for a given application.
    +
    +# Arguments
    +- \`method::Manifold = Planar()\`: The method to use for segmentizing the geometry.  At the moment, only \`Planar\` (assumes a flat plane) and \`Geodesic\` (assumes geometry on the ellipsoidal Earth and uses Vincenty's formulae) are available.
    +- \`geom\`: The geometry to segmentize.  Must be a \`LineString\`, \`LinearRing\`, \`Polygon\`, \`MultiPolygon\`, or \`GeometryCollection\`, or some vector or table of those.
    +- \`max_distance::Real\`: The maximum distance between vertices in the geometry.  **Beware: for \`Planar\`, this is in the units of the geometry, but for \`Geodesic\` and \`Spherical\` it's in units of the radius of the sphere.**
    +
    +Returns a geometry of similar type to the input geometry, but resampled.
    +"""
    +function segmentize(geom; max_distance, threaded::Union{Bool, BoolsAsTypes} = _False())
    +    return segmentize(Planar(), geom; max_distance, threaded = _booltype(threaded))
    +end

    allow three-arg method as well, just in case

    julia
    segmentize(geom, max_distance::Real; threaded = _False()) = segmentize(Planar(), geom, max_distance; threaded)
    +segmentize(method::Manifold, geom, max_distance::Real; threaded = _False()) = segmentize(Planar(), geom; max_distance, threaded)

    generic implementation

    julia
    function segmentize(method::Manifold, geom; max_distance, threaded::Union{Bool, BoolsAsTypes} = _False())
    +    @assert max_distance > 0 "\`max_distance\` should be positive and nonzero!  Found $(method.max_distance)."
    +    _segmentize_function(geom) = _segmentize(method, geom, GI.trait(geom); max_distance)
    +    return apply(_segmentize_function, TraitTarget(GI.LinearRingTrait(), GI.LineStringTrait()), geom; threaded)
    +end
    +
    +function segmentize(method::SegmentizeMethod, geom; threaded::Union{Bool, BoolsAsTypes} = _False())
    +    @warn "\`segmentize(method::$(typeof(method)), geom) is deprecated; use \`segmentize($(method isa LinearSegments ? "Planar()" : "Geodesic()"), geom; max_distance, threaded) instead!"  maxlog=3
    +    @assert method.max_distance > 0 "\`max_distance\` should be positive and nonzero!  Found $(method.max_distance)."
    +    new_method = method isa LinearSegments ? Planar() : Geodesic()
    +    segmentize(new_method, geom; max_distance = method.max_distance, threaded)
    +end
    +
    +_segmentize(method, geom) = _segmentize(method, geom, GI.trait(geom))
    +#=
    +This is a method which performs the common functionality for both linear and geodesic algorithms,
    +and calls out to the "kernel" function which we've defined per linesegment.
    +=#
    +function _segmentize(method::Union{Planar, Spherical}, geom, T::Union{GI.LineStringTrait, GI.LinearRingTrait}; max_distance)
    +    first_coord = GI.getpoint(geom, 1)
    +    x1, y1 = GI.x(first_coord), GI.y(first_coord)
    +    new_coords = NTuple{2, Float64}[]
    +    sizehint!(new_coords, GI.npoint(geom))
    +    push!(new_coords, (x1, y1))
    +    for coord in Iterators.drop(GI.getpoint(geom), 1)
    +        x2, y2 = GI.x(coord), GI.y(coord)
    +        _fill_linear_kernel!(method, new_coords, x1, y1, x2, y2; max_distance)
    +        x1, y1 = x2, y2
    +    end
    +    return rebuild(geom, new_coords)
    +end
    +
    +function _fill_linear_kernel!(::Planar, new_coords::Vector, x1, y1, x2, y2; max_distance)
    +    dx, dy = x2 - x1, y2 - y1
    +    distance = hypot(dx, dy) # this is a more stable way to compute the Euclidean distance
    +    if distance > max_distance
    +        n_segments = ceil(Int, distance / max_distance)
    +        for i in 1:(n_segments - 1)
    +            t = i / n_segments
    +            push!(new_coords, (x1 + t * dx, y1 + t * dy))
    +        end
    +    end

    End the line with the original coordinate, to avoid any multiplication errors.

    julia
        push!(new_coords, (x2, y2))
    +    return nothing
    +end

    Note

    The _fill_linear_kernel definition for GeodesicSegments is in the GeometryOpsProjExt extension module, in the segmentize.jl file.


    This page was generated using Literate.jl.

    `,39)]))}const F=i(k,[["render",e]]);export{o as __pageData,F as default}; diff --git a/previews/PR239/assets/source_transformations_simplify.md.CnWLEC8c.js b/previews/PR239/assets/source_transformations_simplify.md.CnWLEC8c.js new file mode 100644 index 000000000..b2b60e12a --- /dev/null +++ b/previews/PR239/assets/source_transformations_simplify.md.CnWLEC8c.js @@ -0,0 +1,490 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const l="/GeometryOps.jl/previews/PR239/assets/evhqnlv.Bglvb-jp.png",k="/GeometryOps.jl/previews/PR239/assets/tsgqxnn.B94PsR1K.png",t="/GeometryOps.jl/previews/PR239/assets/umfmfiz.Da39FuJg.png",p="/GeometryOps.jl/previews/PR239/assets/twuyjor.DYrZOYql.png",c=JSON.parse('{"title":"Geometry simplification","description":"","frontmatter":{},"headers":[],"relativePath":"source/transformations/simplify.md","filePath":"source/transformations/simplify.md","lastUpdated":null}'),e={name:"source/transformations/simplify.md"};function E(r,s,d,g,y,F){return h(),a("div",null,s[0]||(s[0]=[n(`

    Geometry simplification

    This file holds implementations for the RadialDistance, Douglas-Peucker, and Visvalingam-Whyatt algorithms for simplifying geometries (specifically for polygons and lines).

    The GEOS extension also allows for GEOS's topology preserving simplification as well as Douglas-Peucker simplification implemented in GEOS. Call this by passing GEOS(; method = :TopologyPreserve) or GEOS(; method = :DouglasPeucker) to the algorithm.

    Examples

    A quick and dirty example is:

    julia
    using Makie, GeoInterfaceMakie
    +import GeoInterface as GI
    +import GeometryOps as GO
    +
    +original = GI.Polygon([[[-70.603637, -33.399918], [-70.614624, -33.395332], [-70.639343, -33.392466], [-70.659942, -33.394759], [-70.683975, -33.404504], [-70.697021, -33.419406], [-70.701141, -33.434306], [-70.700454, -33.446339], [-70.694274, -33.458369], [-70.682601, -33.465816], [-70.668869, -33.472117], [-70.646209, -33.473835], [-70.624923, -33.472117], [-70.609817, -33.468107], [-70.595397, -33.458369], [-70.587158, -33.442901], [-70.587158, -33.426283], [-70.590591, -33.414248], [-70.594711, -33.406224], [-70.603637, -33.399918]]])
    +
    +simple = GO.simplify(original; number=6)
    +
    +f, a, p = poly(original; label = "Original")
    +poly!(simple; label = "Simplified")
    +axislegend(a)
    +f

    Benchmark

    We benchmark these methods against LibGEOS's simplify implementation, which uses the Douglas-Peucker algorithm.

    julia
    using BenchmarkTools, Chairmarks, GeoJSON, CairoMakie
    +import GeometryOps as GO, LibGEOS as LG, GeoInterface as GI
    +using CoordinateTransformations
    +using NaturalEarth
    +lg_and_go(geometry) = (GI.convert(LG, geometry), GO.tuples(geometry))
    +# Load in the Natural Earth admin GeoJSON, then extract the USA's geometry
    +fc = NaturalEarth.naturalearth("admin_0_countries", 10)
    +usa_multipoly = fc.geometry[findfirst(==("United States of America"), fc.NAME)] |> x -> GI.convert(LG, x) |> LG.makeValid |> GO.tuples
    +include(joinpath(dirname(dirname(pathof(GO))), "test", "data", "polygon_generation.jl"))
    +
    +usa_poly = GI.getgeom(usa_multipoly, findmax(GO.area.(GI.getgeom(usa_multipoly)))[2]) # isolate the poly with the most area
    +usa_centroid = GO.centroid(usa_poly)
    +usa_reflected = GO.transform(Translation(usa_centroid...)  LinearMap(Makie.rotmatrix2d(π))  Translation((-).(usa_centroid)...), usa_poly)
    +f, a, p = plot(usa_poly; label = "Original", axis = (; aspect = DataAspect()))#; plot!(usa_reflected; label = "Reflected")

    This is the complex polygon we'll be benchmarking.

    julia
    simplify_suite = BenchmarkGroup(["Simplify"])
    +singlepoly_suite = BenchmarkGroup(["Polygon", "title:Polygon simplify", "subtitle:Random blob"])
    +
    +include(joinpath(dirname(dirname(pathof(GO))), "test", "data", "polygon_generation.jl"))
    +
    +for n_verts in round.(Int, exp10.(LinRange(log10(10), log10(10_000), 10)))
    +    geom = GI.Wrappers.Polygon(generate_random_poly(0, 0, n_verts, 2, 0.2, 0.3))
    +    geom_lg, geom_go = lg_and_go(LG.makeValid(GI.convert(LG, geom)))
    +    singlepoly_suite["GO-DP"][GI.npoint(geom)] = @be GO.simplify($geom_go; tol = 0.1) seconds=1
    +    singlepoly_suite["GO-VW"][GI.npoint(geom)] = @be GO.simplify($(GO.VisvalingamWhyatt(; tol = 0.1)), $geom_go) seconds=1
    +    singlepoly_suite["GO-RD"][GI.npoint(geom)] = @be GO.simplify($(GO.RadialDistance(; tol = 0.1)), $geom_go) seconds=1
    +    singlepoly_suite["LibGEOS"][GI.npoint(geom)] = @be LG.simplify($geom_lg, 0.1) seconds=1
    +end
    +
    +plot_trials(singlepoly_suite; legend_position=(1, 1, TopRight()), legend_valign = -2, legend_halign = 1.2, legend_orientation = :horizontal)

    julia
    multipoly_suite = BenchmarkGroup(["MultiPolygon", "title:Multipolygon simplify", "subtitle:USA multipolygon"])
    +
    +for frac in exp10.(LinRange(log10(0.3), log10(1), 6)) # TODO: this example isn't the best.  How can we get this better?
    +    geom = GO.simplify(usa_multipoly; ratio = frac)
    +    geom_lg, geom_go = lg_and_go(geom)
    +    _tol = 0.001
    +    multipoly_suite["GO-DP"][GI.npoint(geom)] = @be GO.simplify($geom_go; tol = $_tol) seconds=1
    +    # multipoly_suite["GO-VW"][GI.npoint(geom)] = @be GO.simplify($(GO.VisvalingamWhyatt(; tol = $_tol)), $geom_go) seconds=1
    +    multipoly_suite["GO-RD"][GI.npoint(geom)] = @be GO.simplify($(GO.RadialDistance(; tol = _tol)), $geom_go) seconds=1
    +    multipoly_suite["LibGEOS"][GI.npoint(geom)] = @be LG.simplify($geom_lg, $_tol) seconds=1
    +    println("""
    +    For $(GI.npoint(geom)) points, the algorithms generated polygons with the following number of vertices:
    +    GO-DP : $(GI.npoint( GO.simplify(geom_go; tol = _tol)))
    +    GO-RD : $(GI.npoint( GO.simplify((GO.RadialDistance(; tol = _tol)), geom_go)))
    +    LGeos : $(GI.npoint( LG.simplify(geom_lg, _tol)))
    +    """)
    +    # GO-VW : $(GI.npoint( GO.simplify((GO.VisvalingamWhyatt(; tol = _tol)), geom_go)))
    +    println()
    +end
    +plot_trials(multipoly_suite)

    julia
    export simplify, VisvalingamWhyatt, DouglasPeucker, RadialDistance
    +
    +const _SIMPLIFY_TARGET = TraitTarget{Union{GI.PolygonTrait, GI.AbstractCurveTrait, GI.MultiPointTrait, GI.PointTrait}}()
    +const MIN_POINTS = 3
    +const SIMPLIFY_ALG_KEYWORDS = """
    +# Keywords
    +
    +- \`ratio\`: the fraction of points that should remain after \`simplify\`.
    +    Useful as it will generalise for large collections of objects.
    +- \`number\`: the number of points that should remain after \`simplify\`.
    +    Less useful for large collections of mixed size objects.
    +"""
    +const DOUGLAS_PEUCKER_KEYWORDS = """
    +$SIMPLIFY_ALG_KEYWORDS
    +- \`tol\`: the minimum distance a point will be from the line
    +    joining its neighboring points.
    +"""
    +
    +"""
    +    abstract type SimplifyAlg
    +
    +Abstract type for simplification algorithms.
    +
    +# API
    +
    +For now, the algorithm must hold the \`number\`, \`ratio\` and \`tol\` properties.
    +
    +Simplification algorithm types can hook into the interface by implementing
    +the \`_simplify(trait, alg, geom)\` methods for whichever traits are necessary.
    +"""
    +abstract type SimplifyAlg end
    +
    +"""
    +    simplify(obj; kw...)
    +    simplify(::SimplifyAlg, obj; kw...)
    +
    +Simplify a geometry, feature, feature collection,
    +or nested vectors or a table of these.
    +
    +\`RadialDistance\`, \`DouglasPeucker\`, or
    +\`VisvalingamWhyatt\` algorithms are available,
    +listed in order of increasing quality but decreasing performance.
    +
    +\`PoinTrait\` and \`MultiPointTrait\` are returned unchanged.
    +
    +The default behaviour is \`simplify(DouglasPeucker(; kw...), obj)\`.
    +Pass in other \`SimplifyAlg\` to use other algorithms.

    Keywords

    julia
    - \`prefilter_alg\`: \`SimplifyAlg\` algorithm used to pre-filter object before
    +    using primary filtering algorithm.
    +$APPLY_KEYWORDS
    +
    +
    +Keywords for DouglasPeucker are allowed when no algorithm is specified:
    +
    +$DOUGLAS_PEUCKER_KEYWORDS

    Example

    julia
    Simplify a polygon to have six points:
    +
    +\`\`\`jldoctest
    +import GeoInterface as GI
    +import GeometryOps as GO
    +
    +poly = GI.Polygon([[
    +    [-70.603637, -33.399918],
    +    [-70.614624, -33.395332],
    +    [-70.639343, -33.392466],
    +    [-70.659942, -33.394759],
    +    [-70.683975, -33.404504],
    +    [-70.697021, -33.419406],
    +    [-70.701141, -33.434306],
    +    [-70.700454, -33.446339],
    +    [-70.694274, -33.458369],
    +    [-70.682601, -33.465816],
    +    [-70.668869, -33.472117],
    +    [-70.646209, -33.473835],
    +    [-70.624923, -33.472117],
    +    [-70.609817, -33.468107],
    +    [-70.595397, -33.458369],
    +    [-70.587158, -33.442901],
    +    [-70.587158, -33.426283],
    +    [-70.590591, -33.414248],
    +    [-70.594711, -33.406224],
    +    [-70.603637, -33.399918]]])
    +
    +simple = GO.simplify(poly; number=6)
    +GI.npoint(simple)

    output

    julia
    6
    +\`\`\`
    +"""
    +simplify(alg::SimplifyAlg, data; kw...) = _simplify(alg, data; kw...)
    +simplify(alg::GEOS, data; kw...) = _simplify(alg, data; kw...)

    Default algorithm is DouglasPeucker

    julia
    simplify(
    +    data; prefilter_alg = nothing,
    +    calc_extent=false, threaded=false, crs=nothing, kw...,
    + ) = _simplify(DouglasPeucker(; kw...), data; prefilter_alg, calc_extent, threaded, crs)
    +
    +
    +#= For each algorithm, apply simplification to all curves, multipoints, and
    +points, reconstructing everything else around them. =#
    +function _simplify(alg::Union{SimplifyAlg, GEOS}, data; prefilter_alg=nothing, kw...)
    +    simplifier(geom) = _simplify(GI.trait(geom), alg, geom; prefilter_alg)
    +    return apply(simplifier, _SIMPLIFY_TARGET, data; kw...)
    +end
    +
    +
    +# For Point and MultiPoint traits we do nothing
    +_simplify(::GI.PointTrait, alg, geom; kw...) = geom
    +_simplify(::GI.MultiPointTrait, alg, geom; kw...) = geom
    +
    +# For curves, rings, and polygon we simplify
    +function _simplify(
    +    ::GI.AbstractCurveTrait, alg, geom;
    +    prefilter_alg, preserve_endpoint = true,
    +)
    +    points = if isnothing(prefilter_alg)
    +        tuple_points(geom)
    +    else
    +        _simplify(prefilter_alg, tuple_points(geom), preserve_endpoint)
    +    end
    +    return rebuild(geom, _simplify(alg, points, preserve_endpoint))
    +end
    +
    +function _simplify(::GI.PolygonTrait, alg, geom;  kw...)
    +    # Force treating children as LinearRing
    +    simplifier(g) = _simplify(
    +        GI.LinearRingTrait(), alg, g;
    +        kw..., preserve_endpoint = false,
    +    )
    +    lrs = map(simplifier, GI.getgeom(geom))
    +    return rebuild(geom, lrs)
    +end

    Simplify with RadialDistance Algorithm

    julia
    """
    +    RadialDistance <: SimplifyAlg
    +
    +Simplifies geometries by removing points less than
    +\`tol\` distance from the line between its neighboring points.
    +
    +$SIMPLIFY_ALG_KEYWORDS
    +- \`tol\`: the minimum distance between points.
    +
    +Note: user input \`tol\` is squared to avoid unnecessary computation in algorithm.
    +"""
    +@kwdef struct RadialDistance <: SimplifyAlg
    +    number::Union{Int64,Nothing} = nothing
    +    ratio::Union{Float64,Nothing} = nothing
    +    tol::Union{Float64,Nothing} = nothing
    +
    +    function RadialDistance(number, ratio, tol)
    +        _checkargs(number, ratio, tol)

    square tolerance for reduced computation

    julia
            tol = isnothing(tol) ? tol : tol^2
    +        new(number, ratio, tol)
    +    end
    +end
    +
    +function _simplify(alg::RadialDistance, points::Vector, _)
    +    previous = first(points)
    +    distances = Array{Float64}(undef, length(points))
    +    for i in eachindex(points)
    +        point = points[i]
    +        distances[i] = _squared_euclid_distance(Float64, point, previous)
    +        previous = point
    +    end
    +    # Never remove the end points
    +    distances[begin] = distances[end] = Inf
    +    return _get_points(alg, points, distances)
    +end

    Simplify with DouglasPeucker Algorithm

    julia
    """
    +    DouglasPeucker <: SimplifyAlg
    +
    +    DouglasPeucker(; number, ratio, tol)
    +
    +Simplifies geometries by removing points below \`tol\`
    +distance from the line between its neighboring points.
    +
    +$DOUGLAS_PEUCKER_KEYWORDS
    +Note: user input \`tol\` is squared to avoid unnecessary computation in algorithm.
    +"""
    +@kwdef struct DouglasPeucker <: SimplifyAlg
    +    number::Union{Int64,Nothing} = nothing
    +    ratio::Union{Float64,Nothing} = nothing
    +    tol::Union{Float64,Nothing} = nothing
    +
    +    function DouglasPeucker(number, ratio, tol)
    +        _checkargs(number, ratio, tol)

    square tolerance for reduced computation

    julia
            tol = isnothing(tol) ? tol : tol^2
    +        return new(number, ratio, tol)
    +    end
    +end
    +
    +#= Simplify using the DouglasPeucker algorithm - nice gif of process on wikipedia:
    +(https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm). =#
    +function _simplify(alg::DouglasPeucker, points::Vector, preserve_endpoint)
    +    npoints = length(points)
    +    npoints <= MIN_POINTS && return points

    Determine stopping criteria

    julia
        max_points = if !isnothing(alg.tol)
    +        npoints
    +    else
    +        npts = !isnothing(alg.number) ? alg.number : max(3, round(Int, alg.ratio * npoints))
    +        npts  npoints && return points
    +        npts
    +    end
    +    max_tol = !isnothing(alg.tol) ? alg.tol : zero(Float64)

    Set up queue

    julia
        queue = Vector{Tuple{Int, Int, Int, Float64}}()
    +    queue_idx, queue_dist = 0, zero(Float64)
    +    len_queue = 0

    Set up results vector

    julia
        results = Vector{Int}(undef, max_points + (preserve_endpoint ? 0 : 1))
    +    results[1], results[2] = 1, npoints

    Loop through points until stopping criteria are fulfilled

    julia
        i = 2  # already have first and last point added
    +    start_idx, end_idx = 1, npoints
    +    max_idx, max_dist = _find_max_squared_dist(points, start_idx, end_idx)
    +    while i  min(MIN_POINTS + 1, max_points) || (i < max_points && max_dist > max_tol)

    Add next point to results

    julia
            i += 1
    +        results[i] = max_idx

    Determine which point to add next by checking left and right of point

    julia
            left_idx, left_dist = _find_max_squared_dist(points, start_idx, max_idx)
    +        right_idx, right_dist = _find_max_squared_dist(points, max_idx, end_idx)
    +        left_vals = (start_idx, left_idx, max_idx, left_dist)
    +        right_vals = (max_idx, right_idx, end_idx, right_dist)

    Add and remove values from queue

    julia
            if queue_dist > left_dist && queue_dist > right_dist

    Value in queue is next value to add to results

    julia
                start_idx, max_idx, end_idx, max_dist = queue[queue_idx]

    Add left and/or right values to queue or delete used queue value

    julia
                if left_dist > 0
    +                queue[queue_idx] = left_vals
    +                if right_dist > 0
    +                    push!(queue, right_vals)
    +                    len_queue += 1
    +                end
    +            elseif right_dist > 0
    +                queue[queue_idx] = right_vals
    +            else
    +                deleteat!(queue, queue_idx)
    +                len_queue -= 1
    +            end

    Determine new maximum queue value

    julia
                queue_dist, queue_idx = !isempty(queue) ?
    +                findmax(x -> x[4], queue) : (zero(Float64), 0)
    +        elseif left_dist > right_dist  # use left value as next value to add to results
    +            push!(queue, right_vals)  # add right value to queue
    +            len_queue += 1
    +            if right_dist > queue_dist
    +                queue_dist = right_dist
    +                queue_idx = len_queue
    +            end
    +            start_idx, max_idx, end_idx, max_dist = left_vals
    +        else  # use right value as next value to add to results
    +            push!(queue, left_vals)  # add left value to queue
    +            len_queue += 1
    +            if left_dist > queue_dist
    +                queue_dist = left_dist
    +                queue_idx = len_queue
    +            end
    +            start_idx, max_idx, end_idx, max_dist = right_vals
    +        end
    +    end
    +    sorted_results = sort!(@view results[1:i])
    +    if !preserve_endpoint && i > 3

    Check start/endpoint distance to other points to see if it meets criteria

    julia
            pre_pt, post_pt = points[sorted_results[end - 1]], points[sorted_results[2]]
    +        endpt_dist = _squared_distance_line(Float64, points[1], pre_pt, post_pt)
    +        if !isnothing(alg.tol)

    Remove start point and replace with second point

    julia
                if endpt_dist < max_tol
    +                results[i] = results[2]
    +                sorted_results = @view results[2:i]
    +            end
    +        else

    Remove start point and add point with maximum distance still remaining

    julia
                if endpt_dist < max_dist
    +                insert!(results, searchsortedfirst(sorted_results, max_idx), max_idx)
    +                results[i+1] = results[2]
    +                sorted_results = @view results[2:i+1]
    +            end
    +        end
    +    end
    +    return points[sorted_results]
    +end
    +
    +#= find maximum distance of any point between the start_idx and end_idx to the line formed
    +by connecting the points at start_idx and end_idx. Note that the first index of maximum
    +value will be used, which might cause differences in results from other algorithms.=#
    +function _find_max_squared_dist(points, start_idx, end_idx)
    +    max_idx = start_idx
    +    max_dist = zero(Float64)
    +    for i in (start_idx + 1):(end_idx - 1)
    +        d = _squared_distance_line(Float64, points[i], points[start_idx], points[end_idx])
    +        if d > max_dist
    +            max_dist = d
    +            max_idx = i
    +        end
    +    end
    +    return max_idx, max_dist
    +end

    Simplify with VisvalingamWhyatt Algorithm

    julia
    """
    +    VisvalingamWhyatt <: SimplifyAlg
    +
    +    VisvalingamWhyatt(; kw...)
    +
    +Simplifies geometries by removing points below \`tol\`
    +distance from the line between its neighboring points.
    +
    +$SIMPLIFY_ALG_KEYWORDS
    +- \`tol\`: the minimum area of a triangle made with a point and
    +    its neighboring points.
    +Note: user input \`tol\` is doubled to avoid unnecessary computation in algorithm.
    +"""
    +@kwdef struct VisvalingamWhyatt <: SimplifyAlg
    +    number::Union{Int,Nothing} = nothing
    +    ratio::Union{Float64,Nothing} = nothing
    +    tol::Union{Float64,Nothing} = nothing
    +
    +    function VisvalingamWhyatt(number, ratio, tol)
    +        _checkargs(number, ratio, tol)

    double tolerance for reduced computation

    julia
            tol = isnothing(tol) ? tol : tol*2
    +        return new(number, ratio, tol)
    +    end
    +end
    +
    +function _simplify(alg::VisvalingamWhyatt, points::Vector, _)
    +    length(points) <= MIN_POINTS && return points
    +    areas = _build_tolerances(_triangle_double_area, points)
    +    return _get_points(alg, points, areas)
    +end

    Calculates double the area of a triangle given its vertices

    julia
    _triangle_double_area(p1, p2, p3) =
    +    abs(p1[1] * (p2[2] - p3[2]) + p2[1] * (p3[2] - p1[2]) + p3[1] * (p1[2] - p2[2]))

    Shared utils

    julia
    function _build_tolerances(f, points)
    +    nmax = length(points)
    +    real_tolerances = _flat_tolerances(f, points)
    +
    +    tolerances = copy(real_tolerances)
    +    i = [n for n in 1:nmax]
    +
    +    this_tolerance, min_vert = findmin(tolerances)
    +    _remove!(tolerances, min_vert)
    +    deleteat!(i, min_vert)
    +
    +    while this_tolerance < Inf
    +        skip = false
    +
    +        if min_vert < length(i)
    +            right_tolerance = f(
    +                points[i[min_vert - 1]],
    +                points[i[min_vert]],
    +                points[i[min_vert + 1]],
    +            )
    +            if right_tolerance <= this_tolerance
    +                right_tolerance = this_tolerance
    +                skip = min_vert == 1
    +            end
    +
    +            real_tolerances[i[min_vert]] = right_tolerance
    +            tolerances[min_vert] = right_tolerance
    +        end
    +
    +        if min_vert > 2
    +            left_tolerance = f(
    +                points[i[min_vert - 2]],
    +                points[i[min_vert - 1]],
    +                points[i[min_vert]],
    +            )
    +            if left_tolerance <= this_tolerance
    +                left_tolerance = this_tolerance
    +                skip = min_vert == 2
    +            end
    +            real_tolerances[i[min_vert - 1]] = left_tolerance
    +            tolerances[min_vert - 1] = left_tolerance
    +        end
    +
    +        if !skip
    +            min_vert = argmin(tolerances)
    +        end
    +        deleteat!(i, min_vert)
    +        this_tolerance = tolerances[min_vert]
    +        _remove!(tolerances, min_vert)
    +    end
    +
    +    return real_tolerances
    +end
    +
    +function tuple_points(geom)
    +    points = Array{Tuple{Float64,Float64}}(undef, GI.npoint(geom))
    +    for (i, p) in enumerate(GI.getpoint(geom))
    +        points[i] = (GI.x(p), GI.y(p))
    +    end
    +    return points
    +end
    +
    +function _get_points(alg, points, tolerances)
    +    # This assumes that \`alg\` has the properties
    +    # \`tol\`, \`number\`, and \`ratio\` available...
    +    tol = alg.tol
    +    number = alg.number
    +    ratio = alg.ratio
    +    bit_indices = if !isnothing(tol)
    +        _tol_indices(alg.tol::Float64, points, tolerances)
    +    elseif !isnothing(number)
    +        _number_indices(alg.number::Int64, points, tolerances)
    +    else
    +        _ratio_indices(alg.ratio::Float64, points, tolerances)
    +    end
    +    return points[bit_indices]
    +end
    +
    +function _tol_indices(tol, points, tolerances)
    +    tolerances .>= tol
    +end
    +
    +function _number_indices(n, points, tolerances)
    +    tol = partialsort(tolerances, length(points) - n + 1)
    +    bit_indices = _tol_indices(tol, points, tolerances)
    +    nselected = sum(bit_indices)
    +    # If there are multiple values exactly at \`tol\` we will get
    +    # the wrong output length. So we need to remove some.
    +    while nselected > n
    +        min_tol = Inf
    +        min_i = 0
    +        for i in eachindex(bit_indices)
    +            bit_indices[i] || continue
    +            if tolerances[i] < min_tol
    +                min_tol = tolerances[i]
    +                min_i = i
    +            end
    +        end
    +        nselected -= 1
    +        bit_indices[min_i] = false
    +    end
    +    return bit_indices
    +end
    +
    +function _ratio_indices(r, points, tolerances)
    +    n = max(3, round(Int, r * length(points)))
    +    return _number_indices(n, points, tolerances)
    +end
    +
    +function _flat_tolerances(f, points)::Vector{Float64}
    +    result = Vector{Float64}(undef, length(points))
    +    result[1] = result[end] = Inf
    +
    +    for i in 2:length(result) - 1
    +        result[i] = f(points[i-1], points[i], points[i+1])
    +    end
    +    return result
    +end
    +
    +function _remove!(s, i)
    +    for j in i:lastindex(s)-1
    +        s[j] = s[j+1]
    +    end
    +end

    Check SimplifyAlgs inputs to make sure they are valid for below algorithms

    julia
    function _checkargs(number, ratio, tol)
    +    count(isnothing, (number, ratio, tol)) == 2 ||
    +        error("Must provide one of \`number\`, \`ratio\` or \`tol\` keywords")
    +    if !isnothing(number)
    +        if number < MIN_POINTS
    +            error("\`number\` must be $MIN_POINTS or larger. Got $number")
    +        end
    +    elseif !isnothing(ratio)
    +        if ratio <= 0 || ratio > 1
    +            error("\`ratio\` must be 0 < ratio <= 1. Got $ratio")
    +        end
    +    else  # !isnothing(tol)
    +        if tol  0
    +            error("\`tol\` must be a positive number. Got $tol")
    +        end
    +    end
    +    return nothing
    +end

    This page was generated using Literate.jl.

    `,71)]))}const C=i(e,[["render",E]]);export{c as __pageData,C as default}; diff --git a/previews/PR239/assets/source_transformations_simplify.md.CnWLEC8c.lean.js b/previews/PR239/assets/source_transformations_simplify.md.CnWLEC8c.lean.js new file mode 100644 index 000000000..b2b60e12a --- /dev/null +++ b/previews/PR239/assets/source_transformations_simplify.md.CnWLEC8c.lean.js @@ -0,0 +1,490 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const l="/GeometryOps.jl/previews/PR239/assets/evhqnlv.Bglvb-jp.png",k="/GeometryOps.jl/previews/PR239/assets/tsgqxnn.B94PsR1K.png",t="/GeometryOps.jl/previews/PR239/assets/umfmfiz.Da39FuJg.png",p="/GeometryOps.jl/previews/PR239/assets/twuyjor.DYrZOYql.png",c=JSON.parse('{"title":"Geometry simplification","description":"","frontmatter":{},"headers":[],"relativePath":"source/transformations/simplify.md","filePath":"source/transformations/simplify.md","lastUpdated":null}'),e={name:"source/transformations/simplify.md"};function E(r,s,d,g,y,F){return h(),a("div",null,s[0]||(s[0]=[n(`

    Geometry simplification

    This file holds implementations for the RadialDistance, Douglas-Peucker, and Visvalingam-Whyatt algorithms for simplifying geometries (specifically for polygons and lines).

    The GEOS extension also allows for GEOS's topology preserving simplification as well as Douglas-Peucker simplification implemented in GEOS. Call this by passing GEOS(; method = :TopologyPreserve) or GEOS(; method = :DouglasPeucker) to the algorithm.

    Examples

    A quick and dirty example is:

    julia
    using Makie, GeoInterfaceMakie
    +import GeoInterface as GI
    +import GeometryOps as GO
    +
    +original = GI.Polygon([[[-70.603637, -33.399918], [-70.614624, -33.395332], [-70.639343, -33.392466], [-70.659942, -33.394759], [-70.683975, -33.404504], [-70.697021, -33.419406], [-70.701141, -33.434306], [-70.700454, -33.446339], [-70.694274, -33.458369], [-70.682601, -33.465816], [-70.668869, -33.472117], [-70.646209, -33.473835], [-70.624923, -33.472117], [-70.609817, -33.468107], [-70.595397, -33.458369], [-70.587158, -33.442901], [-70.587158, -33.426283], [-70.590591, -33.414248], [-70.594711, -33.406224], [-70.603637, -33.399918]]])
    +
    +simple = GO.simplify(original; number=6)
    +
    +f, a, p = poly(original; label = "Original")
    +poly!(simple; label = "Simplified")
    +axislegend(a)
    +f

    Benchmark

    We benchmark these methods against LibGEOS's simplify implementation, which uses the Douglas-Peucker algorithm.

    julia
    using BenchmarkTools, Chairmarks, GeoJSON, CairoMakie
    +import GeometryOps as GO, LibGEOS as LG, GeoInterface as GI
    +using CoordinateTransformations
    +using NaturalEarth
    +lg_and_go(geometry) = (GI.convert(LG, geometry), GO.tuples(geometry))
    +# Load in the Natural Earth admin GeoJSON, then extract the USA's geometry
    +fc = NaturalEarth.naturalearth("admin_0_countries", 10)
    +usa_multipoly = fc.geometry[findfirst(==("United States of America"), fc.NAME)] |> x -> GI.convert(LG, x) |> LG.makeValid |> GO.tuples
    +include(joinpath(dirname(dirname(pathof(GO))), "test", "data", "polygon_generation.jl"))
    +
    +usa_poly = GI.getgeom(usa_multipoly, findmax(GO.area.(GI.getgeom(usa_multipoly)))[2]) # isolate the poly with the most area
    +usa_centroid = GO.centroid(usa_poly)
    +usa_reflected = GO.transform(Translation(usa_centroid...)  LinearMap(Makie.rotmatrix2d(π))  Translation((-).(usa_centroid)...), usa_poly)
    +f, a, p = plot(usa_poly; label = "Original", axis = (; aspect = DataAspect()))#; plot!(usa_reflected; label = "Reflected")

    This is the complex polygon we'll be benchmarking.

    julia
    simplify_suite = BenchmarkGroup(["Simplify"])
    +singlepoly_suite = BenchmarkGroup(["Polygon", "title:Polygon simplify", "subtitle:Random blob"])
    +
    +include(joinpath(dirname(dirname(pathof(GO))), "test", "data", "polygon_generation.jl"))
    +
    +for n_verts in round.(Int, exp10.(LinRange(log10(10), log10(10_000), 10)))
    +    geom = GI.Wrappers.Polygon(generate_random_poly(0, 0, n_verts, 2, 0.2, 0.3))
    +    geom_lg, geom_go = lg_and_go(LG.makeValid(GI.convert(LG, geom)))
    +    singlepoly_suite["GO-DP"][GI.npoint(geom)] = @be GO.simplify($geom_go; tol = 0.1) seconds=1
    +    singlepoly_suite["GO-VW"][GI.npoint(geom)] = @be GO.simplify($(GO.VisvalingamWhyatt(; tol = 0.1)), $geom_go) seconds=1
    +    singlepoly_suite["GO-RD"][GI.npoint(geom)] = @be GO.simplify($(GO.RadialDistance(; tol = 0.1)), $geom_go) seconds=1
    +    singlepoly_suite["LibGEOS"][GI.npoint(geom)] = @be LG.simplify($geom_lg, 0.1) seconds=1
    +end
    +
    +plot_trials(singlepoly_suite; legend_position=(1, 1, TopRight()), legend_valign = -2, legend_halign = 1.2, legend_orientation = :horizontal)

    julia
    multipoly_suite = BenchmarkGroup(["MultiPolygon", "title:Multipolygon simplify", "subtitle:USA multipolygon"])
    +
    +for frac in exp10.(LinRange(log10(0.3), log10(1), 6)) # TODO: this example isn't the best.  How can we get this better?
    +    geom = GO.simplify(usa_multipoly; ratio = frac)
    +    geom_lg, geom_go = lg_and_go(geom)
    +    _tol = 0.001
    +    multipoly_suite["GO-DP"][GI.npoint(geom)] = @be GO.simplify($geom_go; tol = $_tol) seconds=1
    +    # multipoly_suite["GO-VW"][GI.npoint(geom)] = @be GO.simplify($(GO.VisvalingamWhyatt(; tol = $_tol)), $geom_go) seconds=1
    +    multipoly_suite["GO-RD"][GI.npoint(geom)] = @be GO.simplify($(GO.RadialDistance(; tol = _tol)), $geom_go) seconds=1
    +    multipoly_suite["LibGEOS"][GI.npoint(geom)] = @be LG.simplify($geom_lg, $_tol) seconds=1
    +    println("""
    +    For $(GI.npoint(geom)) points, the algorithms generated polygons with the following number of vertices:
    +    GO-DP : $(GI.npoint( GO.simplify(geom_go; tol = _tol)))
    +    GO-RD : $(GI.npoint( GO.simplify((GO.RadialDistance(; tol = _tol)), geom_go)))
    +    LGeos : $(GI.npoint( LG.simplify(geom_lg, _tol)))
    +    """)
    +    # GO-VW : $(GI.npoint( GO.simplify((GO.VisvalingamWhyatt(; tol = _tol)), geom_go)))
    +    println()
    +end
    +plot_trials(multipoly_suite)

    julia
    export simplify, VisvalingamWhyatt, DouglasPeucker, RadialDistance
    +
    +const _SIMPLIFY_TARGET = TraitTarget{Union{GI.PolygonTrait, GI.AbstractCurveTrait, GI.MultiPointTrait, GI.PointTrait}}()
    +const MIN_POINTS = 3
    +const SIMPLIFY_ALG_KEYWORDS = """
    +# Keywords
    +
    +- \`ratio\`: the fraction of points that should remain after \`simplify\`.
    +    Useful as it will generalise for large collections of objects.
    +- \`number\`: the number of points that should remain after \`simplify\`.
    +    Less useful for large collections of mixed size objects.
    +"""
    +const DOUGLAS_PEUCKER_KEYWORDS = """
    +$SIMPLIFY_ALG_KEYWORDS
    +- \`tol\`: the minimum distance a point will be from the line
    +    joining its neighboring points.
    +"""
    +
    +"""
    +    abstract type SimplifyAlg
    +
    +Abstract type for simplification algorithms.
    +
    +# API
    +
    +For now, the algorithm must hold the \`number\`, \`ratio\` and \`tol\` properties.
    +
    +Simplification algorithm types can hook into the interface by implementing
    +the \`_simplify(trait, alg, geom)\` methods for whichever traits are necessary.
    +"""
    +abstract type SimplifyAlg end
    +
    +"""
    +    simplify(obj; kw...)
    +    simplify(::SimplifyAlg, obj; kw...)
    +
    +Simplify a geometry, feature, feature collection,
    +or nested vectors or a table of these.
    +
    +\`RadialDistance\`, \`DouglasPeucker\`, or
    +\`VisvalingamWhyatt\` algorithms are available,
    +listed in order of increasing quality but decreasing performance.
    +
    +\`PoinTrait\` and \`MultiPointTrait\` are returned unchanged.
    +
    +The default behaviour is \`simplify(DouglasPeucker(; kw...), obj)\`.
    +Pass in other \`SimplifyAlg\` to use other algorithms.

    Keywords

    julia
    - \`prefilter_alg\`: \`SimplifyAlg\` algorithm used to pre-filter object before
    +    using primary filtering algorithm.
    +$APPLY_KEYWORDS
    +
    +
    +Keywords for DouglasPeucker are allowed when no algorithm is specified:
    +
    +$DOUGLAS_PEUCKER_KEYWORDS

    Example

    julia
    Simplify a polygon to have six points:
    +
    +\`\`\`jldoctest
    +import GeoInterface as GI
    +import GeometryOps as GO
    +
    +poly = GI.Polygon([[
    +    [-70.603637, -33.399918],
    +    [-70.614624, -33.395332],
    +    [-70.639343, -33.392466],
    +    [-70.659942, -33.394759],
    +    [-70.683975, -33.404504],
    +    [-70.697021, -33.419406],
    +    [-70.701141, -33.434306],
    +    [-70.700454, -33.446339],
    +    [-70.694274, -33.458369],
    +    [-70.682601, -33.465816],
    +    [-70.668869, -33.472117],
    +    [-70.646209, -33.473835],
    +    [-70.624923, -33.472117],
    +    [-70.609817, -33.468107],
    +    [-70.595397, -33.458369],
    +    [-70.587158, -33.442901],
    +    [-70.587158, -33.426283],
    +    [-70.590591, -33.414248],
    +    [-70.594711, -33.406224],
    +    [-70.603637, -33.399918]]])
    +
    +simple = GO.simplify(poly; number=6)
    +GI.npoint(simple)

    output

    julia
    6
    +\`\`\`
    +"""
    +simplify(alg::SimplifyAlg, data; kw...) = _simplify(alg, data; kw...)
    +simplify(alg::GEOS, data; kw...) = _simplify(alg, data; kw...)

    Default algorithm is DouglasPeucker

    julia
    simplify(
    +    data; prefilter_alg = nothing,
    +    calc_extent=false, threaded=false, crs=nothing, kw...,
    + ) = _simplify(DouglasPeucker(; kw...), data; prefilter_alg, calc_extent, threaded, crs)
    +
    +
    +#= For each algorithm, apply simplification to all curves, multipoints, and
    +points, reconstructing everything else around them. =#
    +function _simplify(alg::Union{SimplifyAlg, GEOS}, data; prefilter_alg=nothing, kw...)
    +    simplifier(geom) = _simplify(GI.trait(geom), alg, geom; prefilter_alg)
    +    return apply(simplifier, _SIMPLIFY_TARGET, data; kw...)
    +end
    +
    +
    +# For Point and MultiPoint traits we do nothing
    +_simplify(::GI.PointTrait, alg, geom; kw...) = geom
    +_simplify(::GI.MultiPointTrait, alg, geom; kw...) = geom
    +
    +# For curves, rings, and polygon we simplify
    +function _simplify(
    +    ::GI.AbstractCurveTrait, alg, geom;
    +    prefilter_alg, preserve_endpoint = true,
    +)
    +    points = if isnothing(prefilter_alg)
    +        tuple_points(geom)
    +    else
    +        _simplify(prefilter_alg, tuple_points(geom), preserve_endpoint)
    +    end
    +    return rebuild(geom, _simplify(alg, points, preserve_endpoint))
    +end
    +
    +function _simplify(::GI.PolygonTrait, alg, geom;  kw...)
    +    # Force treating children as LinearRing
    +    simplifier(g) = _simplify(
    +        GI.LinearRingTrait(), alg, g;
    +        kw..., preserve_endpoint = false,
    +    )
    +    lrs = map(simplifier, GI.getgeom(geom))
    +    return rebuild(geom, lrs)
    +end

    Simplify with RadialDistance Algorithm

    julia
    """
    +    RadialDistance <: SimplifyAlg
    +
    +Simplifies geometries by removing points less than
    +\`tol\` distance from the line between its neighboring points.
    +
    +$SIMPLIFY_ALG_KEYWORDS
    +- \`tol\`: the minimum distance between points.
    +
    +Note: user input \`tol\` is squared to avoid unnecessary computation in algorithm.
    +"""
    +@kwdef struct RadialDistance <: SimplifyAlg
    +    number::Union{Int64,Nothing} = nothing
    +    ratio::Union{Float64,Nothing} = nothing
    +    tol::Union{Float64,Nothing} = nothing
    +
    +    function RadialDistance(number, ratio, tol)
    +        _checkargs(number, ratio, tol)

    square tolerance for reduced computation

    julia
            tol = isnothing(tol) ? tol : tol^2
    +        new(number, ratio, tol)
    +    end
    +end
    +
    +function _simplify(alg::RadialDistance, points::Vector, _)
    +    previous = first(points)
    +    distances = Array{Float64}(undef, length(points))
    +    for i in eachindex(points)
    +        point = points[i]
    +        distances[i] = _squared_euclid_distance(Float64, point, previous)
    +        previous = point
    +    end
    +    # Never remove the end points
    +    distances[begin] = distances[end] = Inf
    +    return _get_points(alg, points, distances)
    +end

    Simplify with DouglasPeucker Algorithm

    julia
    """
    +    DouglasPeucker <: SimplifyAlg
    +
    +    DouglasPeucker(; number, ratio, tol)
    +
    +Simplifies geometries by removing points below \`tol\`
    +distance from the line between its neighboring points.
    +
    +$DOUGLAS_PEUCKER_KEYWORDS
    +Note: user input \`tol\` is squared to avoid unnecessary computation in algorithm.
    +"""
    +@kwdef struct DouglasPeucker <: SimplifyAlg
    +    number::Union{Int64,Nothing} = nothing
    +    ratio::Union{Float64,Nothing} = nothing
    +    tol::Union{Float64,Nothing} = nothing
    +
    +    function DouglasPeucker(number, ratio, tol)
    +        _checkargs(number, ratio, tol)

    square tolerance for reduced computation

    julia
            tol = isnothing(tol) ? tol : tol^2
    +        return new(number, ratio, tol)
    +    end
    +end
    +
    +#= Simplify using the DouglasPeucker algorithm - nice gif of process on wikipedia:
    +(https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm). =#
    +function _simplify(alg::DouglasPeucker, points::Vector, preserve_endpoint)
    +    npoints = length(points)
    +    npoints <= MIN_POINTS && return points

    Determine stopping criteria

    julia
        max_points = if !isnothing(alg.tol)
    +        npoints
    +    else
    +        npts = !isnothing(alg.number) ? alg.number : max(3, round(Int, alg.ratio * npoints))
    +        npts  npoints && return points
    +        npts
    +    end
    +    max_tol = !isnothing(alg.tol) ? alg.tol : zero(Float64)

    Set up queue

    julia
        queue = Vector{Tuple{Int, Int, Int, Float64}}()
    +    queue_idx, queue_dist = 0, zero(Float64)
    +    len_queue = 0

    Set up results vector

    julia
        results = Vector{Int}(undef, max_points + (preserve_endpoint ? 0 : 1))
    +    results[1], results[2] = 1, npoints

    Loop through points until stopping criteria are fulfilled

    julia
        i = 2  # already have first and last point added
    +    start_idx, end_idx = 1, npoints
    +    max_idx, max_dist = _find_max_squared_dist(points, start_idx, end_idx)
    +    while i  min(MIN_POINTS + 1, max_points) || (i < max_points && max_dist > max_tol)

    Add next point to results

    julia
            i += 1
    +        results[i] = max_idx

    Determine which point to add next by checking left and right of point

    julia
            left_idx, left_dist = _find_max_squared_dist(points, start_idx, max_idx)
    +        right_idx, right_dist = _find_max_squared_dist(points, max_idx, end_idx)
    +        left_vals = (start_idx, left_idx, max_idx, left_dist)
    +        right_vals = (max_idx, right_idx, end_idx, right_dist)

    Add and remove values from queue

    julia
            if queue_dist > left_dist && queue_dist > right_dist

    Value in queue is next value to add to results

    julia
                start_idx, max_idx, end_idx, max_dist = queue[queue_idx]

    Add left and/or right values to queue or delete used queue value

    julia
                if left_dist > 0
    +                queue[queue_idx] = left_vals
    +                if right_dist > 0
    +                    push!(queue, right_vals)
    +                    len_queue += 1
    +                end
    +            elseif right_dist > 0
    +                queue[queue_idx] = right_vals
    +            else
    +                deleteat!(queue, queue_idx)
    +                len_queue -= 1
    +            end

    Determine new maximum queue value

    julia
                queue_dist, queue_idx = !isempty(queue) ?
    +                findmax(x -> x[4], queue) : (zero(Float64), 0)
    +        elseif left_dist > right_dist  # use left value as next value to add to results
    +            push!(queue, right_vals)  # add right value to queue
    +            len_queue += 1
    +            if right_dist > queue_dist
    +                queue_dist = right_dist
    +                queue_idx = len_queue
    +            end
    +            start_idx, max_idx, end_idx, max_dist = left_vals
    +        else  # use right value as next value to add to results
    +            push!(queue, left_vals)  # add left value to queue
    +            len_queue += 1
    +            if left_dist > queue_dist
    +                queue_dist = left_dist
    +                queue_idx = len_queue
    +            end
    +            start_idx, max_idx, end_idx, max_dist = right_vals
    +        end
    +    end
    +    sorted_results = sort!(@view results[1:i])
    +    if !preserve_endpoint && i > 3

    Check start/endpoint distance to other points to see if it meets criteria

    julia
            pre_pt, post_pt = points[sorted_results[end - 1]], points[sorted_results[2]]
    +        endpt_dist = _squared_distance_line(Float64, points[1], pre_pt, post_pt)
    +        if !isnothing(alg.tol)

    Remove start point and replace with second point

    julia
                if endpt_dist < max_tol
    +                results[i] = results[2]
    +                sorted_results = @view results[2:i]
    +            end
    +        else

    Remove start point and add point with maximum distance still remaining

    julia
                if endpt_dist < max_dist
    +                insert!(results, searchsortedfirst(sorted_results, max_idx), max_idx)
    +                results[i+1] = results[2]
    +                sorted_results = @view results[2:i+1]
    +            end
    +        end
    +    end
    +    return points[sorted_results]
    +end
    +
    +#= find maximum distance of any point between the start_idx and end_idx to the line formed
    +by connecting the points at start_idx and end_idx. Note that the first index of maximum
    +value will be used, which might cause differences in results from other algorithms.=#
    +function _find_max_squared_dist(points, start_idx, end_idx)
    +    max_idx = start_idx
    +    max_dist = zero(Float64)
    +    for i in (start_idx + 1):(end_idx - 1)
    +        d = _squared_distance_line(Float64, points[i], points[start_idx], points[end_idx])
    +        if d > max_dist
    +            max_dist = d
    +            max_idx = i
    +        end
    +    end
    +    return max_idx, max_dist
    +end

    Simplify with VisvalingamWhyatt Algorithm

    julia
    """
    +    VisvalingamWhyatt <: SimplifyAlg
    +
    +    VisvalingamWhyatt(; kw...)
    +
    +Simplifies geometries by removing points below \`tol\`
    +distance from the line between its neighboring points.
    +
    +$SIMPLIFY_ALG_KEYWORDS
    +- \`tol\`: the minimum area of a triangle made with a point and
    +    its neighboring points.
    +Note: user input \`tol\` is doubled to avoid unnecessary computation in algorithm.
    +"""
    +@kwdef struct VisvalingamWhyatt <: SimplifyAlg
    +    number::Union{Int,Nothing} = nothing
    +    ratio::Union{Float64,Nothing} = nothing
    +    tol::Union{Float64,Nothing} = nothing
    +
    +    function VisvalingamWhyatt(number, ratio, tol)
    +        _checkargs(number, ratio, tol)

    double tolerance for reduced computation

    julia
            tol = isnothing(tol) ? tol : tol*2
    +        return new(number, ratio, tol)
    +    end
    +end
    +
    +function _simplify(alg::VisvalingamWhyatt, points::Vector, _)
    +    length(points) <= MIN_POINTS && return points
    +    areas = _build_tolerances(_triangle_double_area, points)
    +    return _get_points(alg, points, areas)
    +end

    Calculates double the area of a triangle given its vertices

    julia
    _triangle_double_area(p1, p2, p3) =
    +    abs(p1[1] * (p2[2] - p3[2]) + p2[1] * (p3[2] - p1[2]) + p3[1] * (p1[2] - p2[2]))

    Shared utils

    julia
    function _build_tolerances(f, points)
    +    nmax = length(points)
    +    real_tolerances = _flat_tolerances(f, points)
    +
    +    tolerances = copy(real_tolerances)
    +    i = [n for n in 1:nmax]
    +
    +    this_tolerance, min_vert = findmin(tolerances)
    +    _remove!(tolerances, min_vert)
    +    deleteat!(i, min_vert)
    +
    +    while this_tolerance < Inf
    +        skip = false
    +
    +        if min_vert < length(i)
    +            right_tolerance = f(
    +                points[i[min_vert - 1]],
    +                points[i[min_vert]],
    +                points[i[min_vert + 1]],
    +            )
    +            if right_tolerance <= this_tolerance
    +                right_tolerance = this_tolerance
    +                skip = min_vert == 1
    +            end
    +
    +            real_tolerances[i[min_vert]] = right_tolerance
    +            tolerances[min_vert] = right_tolerance
    +        end
    +
    +        if min_vert > 2
    +            left_tolerance = f(
    +                points[i[min_vert - 2]],
    +                points[i[min_vert - 1]],
    +                points[i[min_vert]],
    +            )
    +            if left_tolerance <= this_tolerance
    +                left_tolerance = this_tolerance
    +                skip = min_vert == 2
    +            end
    +            real_tolerances[i[min_vert - 1]] = left_tolerance
    +            tolerances[min_vert - 1] = left_tolerance
    +        end
    +
    +        if !skip
    +            min_vert = argmin(tolerances)
    +        end
    +        deleteat!(i, min_vert)
    +        this_tolerance = tolerances[min_vert]
    +        _remove!(tolerances, min_vert)
    +    end
    +
    +    return real_tolerances
    +end
    +
    +function tuple_points(geom)
    +    points = Array{Tuple{Float64,Float64}}(undef, GI.npoint(geom))
    +    for (i, p) in enumerate(GI.getpoint(geom))
    +        points[i] = (GI.x(p), GI.y(p))
    +    end
    +    return points
    +end
    +
    +function _get_points(alg, points, tolerances)
    +    # This assumes that \`alg\` has the properties
    +    # \`tol\`, \`number\`, and \`ratio\` available...
    +    tol = alg.tol
    +    number = alg.number
    +    ratio = alg.ratio
    +    bit_indices = if !isnothing(tol)
    +        _tol_indices(alg.tol::Float64, points, tolerances)
    +    elseif !isnothing(number)
    +        _number_indices(alg.number::Int64, points, tolerances)
    +    else
    +        _ratio_indices(alg.ratio::Float64, points, tolerances)
    +    end
    +    return points[bit_indices]
    +end
    +
    +function _tol_indices(tol, points, tolerances)
    +    tolerances .>= tol
    +end
    +
    +function _number_indices(n, points, tolerances)
    +    tol = partialsort(tolerances, length(points) - n + 1)
    +    bit_indices = _tol_indices(tol, points, tolerances)
    +    nselected = sum(bit_indices)
    +    # If there are multiple values exactly at \`tol\` we will get
    +    # the wrong output length. So we need to remove some.
    +    while nselected > n
    +        min_tol = Inf
    +        min_i = 0
    +        for i in eachindex(bit_indices)
    +            bit_indices[i] || continue
    +            if tolerances[i] < min_tol
    +                min_tol = tolerances[i]
    +                min_i = i
    +            end
    +        end
    +        nselected -= 1
    +        bit_indices[min_i] = false
    +    end
    +    return bit_indices
    +end
    +
    +function _ratio_indices(r, points, tolerances)
    +    n = max(3, round(Int, r * length(points)))
    +    return _number_indices(n, points, tolerances)
    +end
    +
    +function _flat_tolerances(f, points)::Vector{Float64}
    +    result = Vector{Float64}(undef, length(points))
    +    result[1] = result[end] = Inf
    +
    +    for i in 2:length(result) - 1
    +        result[i] = f(points[i-1], points[i], points[i+1])
    +    end
    +    return result
    +end
    +
    +function _remove!(s, i)
    +    for j in i:lastindex(s)-1
    +        s[j] = s[j+1]
    +    end
    +end

    Check SimplifyAlgs inputs to make sure they are valid for below algorithms

    julia
    function _checkargs(number, ratio, tol)
    +    count(isnothing, (number, ratio, tol)) == 2 ||
    +        error("Must provide one of \`number\`, \`ratio\` or \`tol\` keywords")
    +    if !isnothing(number)
    +        if number < MIN_POINTS
    +            error("\`number\` must be $MIN_POINTS or larger. Got $number")
    +        end
    +    elseif !isnothing(ratio)
    +        if ratio <= 0 || ratio > 1
    +            error("\`ratio\` must be 0 < ratio <= 1. Got $ratio")
    +        end
    +    else  # !isnothing(tol)
    +        if tol  0
    +            error("\`tol\` must be a positive number. Got $tol")
    +        end
    +    end
    +    return nothing
    +end

    This page was generated using Literate.jl.

    `,71)]))}const C=i(e,[["render",E]]);export{c as __pageData,C as default}; diff --git a/previews/PR239/assets/source_transformations_transform.md.BWclfchr.js b/previews/PR239/assets/source_transformations_transform.md.BWclfchr.js new file mode 100644 index 000000000..4ece6c0b6 --- /dev/null +++ b/previews/PR239/assets/source_transformations_transform.md.BWclfchr.js @@ -0,0 +1,55 @@ +import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const F=JSON.parse('{"title":"Pointwise transformation","description":"","frontmatter":{},"headers":[],"relativePath":"source/transformations/transform.md","filePath":"source/transformations/transform.md","lastUpdated":null}'),l={name:"source/transformations/transform.md"};function e(p,s,h,r,k,o){return t(),a("div",null,s[0]||(s[0]=[n(`

    Pointwise transformation

    julia
    """
    +    transform(f, obj)
    +
    +Apply a function \`f\` to all the points in \`obj\`.
    +
    +Points will be passed to \`f\` as an \`SVector\` to allow
    +using CoordinateTransformations.jl and Rotations.jl
    +without hassle.
    +
    +\`SVector\` is also a valid GeoInterface.jl point, so will
    +work in all GeoInterface.jl methods.
    +
    +# Example
    +
    +\`\`\`julia
    +julia> import GeoInterface as GI
    +
    +julia> import GeometryOps as GO
    +
    +julia> geom = GI.Polygon([GI.LinearRing([(1, 2), (3, 4), (5, 6), (1, 2)]), GI.LinearRing([(3, 4), (5, 6), (6, 7), (3, 4)])]);
    +
    +julia> f = CoordinateTransformations.Translation(3.5, 1.5)
    +Translation(3.5, 1.5)
    +
    +julia> GO.transform(f, geom)
    +GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Linea
    +rRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticArraysCo
    +re.SVector{2, Float64}[[4.5, 3.5], [6.5, 5.5], [8.5, 7.5], [4.5, 3.5]], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticA
    +rraysCore.SVector{2, Float64}[[6.5, 5.5], [8.5, 7.5], [9.5, 8.5], [6.5, 5.5]], nothing, nothing)], nothing, nothing)
    +\`\`\`
    +
    +With Rotations.jl you need to actually multiply the Rotation
    +by the \`SVector\` point, which is easy using an anonymous function.
    +
    +\`\`\`julia
    +julia> using Rotations
    +
    +julia> GO.transform(p -> one(RotMatrix{2}) * p, geom)
    +GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearR
    +ing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}(StaticArraysCore.SVe
    +ctor{2, Int64}[[2, 1], [4, 3], [6, 5], [2, 1]], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}(StaticArraysCore.SVector{2, Int64
    +}[[4, 3], [6, 5], [7, 6], [4, 3]], nothing, nothing)], nothing, nothing)
    +\`\`\`
    +"""
    +function transform(f, geom; kw...)
    +    if _is3d(geom)
    +        return apply(PointTrait(), geom; kw...) do p
    +            f(StaticArrays.SVector{3}((GI.x(p), GI.y(p), GI.z(p))))
    +        end
    +    else
    +        return apply(PointTrait(), geom; kw...) do p
    +            f(StaticArrays.SVector{2}((GI.x(p), GI.y(p))))
    +        end
    +    end
    +end

    This page was generated using Literate.jl.

    `,4)]))}const c=i(l,[["render",e]]);export{F as __pageData,c as default}; diff --git a/previews/PR239/assets/source_transformations_transform.md.BWclfchr.lean.js b/previews/PR239/assets/source_transformations_transform.md.BWclfchr.lean.js new file mode 100644 index 000000000..4ece6c0b6 --- /dev/null +++ b/previews/PR239/assets/source_transformations_transform.md.BWclfchr.lean.js @@ -0,0 +1,55 @@ +import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const F=JSON.parse('{"title":"Pointwise transformation","description":"","frontmatter":{},"headers":[],"relativePath":"source/transformations/transform.md","filePath":"source/transformations/transform.md","lastUpdated":null}'),l={name:"source/transformations/transform.md"};function e(p,s,h,r,k,o){return t(),a("div",null,s[0]||(s[0]=[n(`

    Pointwise transformation

    julia
    """
    +    transform(f, obj)
    +
    +Apply a function \`f\` to all the points in \`obj\`.
    +
    +Points will be passed to \`f\` as an \`SVector\` to allow
    +using CoordinateTransformations.jl and Rotations.jl
    +without hassle.
    +
    +\`SVector\` is also a valid GeoInterface.jl point, so will
    +work in all GeoInterface.jl methods.
    +
    +# Example
    +
    +\`\`\`julia
    +julia> import GeoInterface as GI
    +
    +julia> import GeometryOps as GO
    +
    +julia> geom = GI.Polygon([GI.LinearRing([(1, 2), (3, 4), (5, 6), (1, 2)]), GI.LinearRing([(3, 4), (5, 6), (6, 7), (3, 4)])]);
    +
    +julia> f = CoordinateTransformations.Translation(3.5, 1.5)
    +Translation(3.5, 1.5)
    +
    +julia> GO.transform(f, geom)
    +GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Linea
    +rRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticArraysCo
    +re.SVector{2, Float64}[[4.5, 3.5], [6.5, 5.5], [8.5, 7.5], [4.5, 3.5]], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticA
    +rraysCore.SVector{2, Float64}[[6.5, 5.5], [8.5, 7.5], [9.5, 8.5], [6.5, 5.5]], nothing, nothing)], nothing, nothing)
    +\`\`\`
    +
    +With Rotations.jl you need to actually multiply the Rotation
    +by the \`SVector\` point, which is easy using an anonymous function.
    +
    +\`\`\`julia
    +julia> using Rotations
    +
    +julia> GO.transform(p -> one(RotMatrix{2}) * p, geom)
    +GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearR
    +ing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}(StaticArraysCore.SVe
    +ctor{2, Int64}[[2, 1], [4, 3], [6, 5], [2, 1]], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}(StaticArraysCore.SVector{2, Int64
    +}[[4, 3], [6, 5], [7, 6], [4, 3]], nothing, nothing)], nothing, nothing)
    +\`\`\`
    +"""
    +function transform(f, geom; kw...)
    +    if _is3d(geom)
    +        return apply(PointTrait(), geom; kw...) do p
    +            f(StaticArrays.SVector{3}((GI.x(p), GI.y(p), GI.z(p))))
    +        end
    +    else
    +        return apply(PointTrait(), geom; kw...) do p
    +            f(StaticArrays.SVector{2}((GI.x(p), GI.y(p))))
    +        end
    +    end
    +end

    This page was generated using Literate.jl.

    `,4)]))}const c=i(l,[["render",e]]);export{F as __pageData,c as default}; diff --git a/previews/PR239/assets/source_transformations_tuples.md.BFXQMbxF.js b/previews/PR239/assets/source_transformations_tuples.md.BFXQMbxF.js new file mode 100644 index 000000000..42ae74220 --- /dev/null +++ b/previews/PR239/assets/source_transformations_tuples.md.BFXQMbxF.js @@ -0,0 +1,19 @@ +import{_ as a,c as n,a5 as i,o as e}from"./chunks/framework.onQNwZ2I.js";const d=JSON.parse('{"title":"Tuple conversion","description":"","frontmatter":{},"headers":[],"relativePath":"source/transformations/tuples.md","filePath":"source/transformations/tuples.md","lastUpdated":null}'),t={name:"source/transformations/tuples.md"};function p(l,s,r,o,h,k){return e(),n("div",null,s[0]||(s[0]=[i(`

    Tuple conversion

    julia
    """
    +    tuples(obj)
    +
    +Convert all points in \`obj\` to \`Tuple\`s, wherever the are nested.
    +
    +Returns a similar object or collection of objects using GeoInterface.jl
    +geometries wrapping \`Tuple\` points.

    Keywords

    julia
    $APPLY_KEYWORDS
    +"""
    +function tuples(geom, ::Type{T} = Float64; kw...) where T
    +    if _is3d(geom)
    +        return apply(PointTrait(), geom; kw...) do p
    +            (T(GI.x(p)), T(GI.y(p)), T(GI.z(p)))
    +        end
    +    else
    +        return apply(PointTrait(), geom; kw...) do p
    +            (T(GI.x(p)), T(GI.y(p)))
    +        end
    +    end
    +end

    This page was generated using Literate.jl.

    `,6)]))}const F=a(t,[["render",p]]);export{d as __pageData,F as default}; diff --git a/previews/PR239/assets/source_transformations_tuples.md.BFXQMbxF.lean.js b/previews/PR239/assets/source_transformations_tuples.md.BFXQMbxF.lean.js new file mode 100644 index 000000000..42ae74220 --- /dev/null +++ b/previews/PR239/assets/source_transformations_tuples.md.BFXQMbxF.lean.js @@ -0,0 +1,19 @@ +import{_ as a,c as n,a5 as i,o as e}from"./chunks/framework.onQNwZ2I.js";const d=JSON.parse('{"title":"Tuple conversion","description":"","frontmatter":{},"headers":[],"relativePath":"source/transformations/tuples.md","filePath":"source/transformations/tuples.md","lastUpdated":null}'),t={name:"source/transformations/tuples.md"};function p(l,s,r,o,h,k){return e(),n("div",null,s[0]||(s[0]=[i(`

    Tuple conversion

    julia
    """
    +    tuples(obj)
    +
    +Convert all points in \`obj\` to \`Tuple\`s, wherever the are nested.
    +
    +Returns a similar object or collection of objects using GeoInterface.jl
    +geometries wrapping \`Tuple\` points.

    Keywords

    julia
    $APPLY_KEYWORDS
    +"""
    +function tuples(geom, ::Type{T} = Float64; kw...) where T
    +    if _is3d(geom)
    +        return apply(PointTrait(), geom; kw...) do p
    +            (T(GI.x(p)), T(GI.y(p)), T(GI.z(p)))
    +        end
    +    else
    +        return apply(PointTrait(), geom; kw...) do p
    +            (T(GI.x(p)), T(GI.y(p)))
    +        end
    +    end
    +end

    This page was generated using Literate.jl.

    `,6)]))}const F=a(t,[["render",p]]);export{d as __pageData,F as default}; diff --git a/previews/PR239/assets/source_types.md.BzRqHlPc.js b/previews/PR239/assets/source_types.md.BzRqHlPc.js new file mode 100644 index 000000000..9d5cfae61 --- /dev/null +++ b/previews/PR239/assets/source_types.md.BzRqHlPc.js @@ -0,0 +1,38 @@ +import{_ as i,c as a,a5 as n,o as e}from"./chunks/framework.onQNwZ2I.js";const E=JSON.parse('{"title":"Types","description":"","frontmatter":{},"headers":[],"relativePath":"source/types.md","filePath":"source/types.md","lastUpdated":null}'),t={name:"source/types.md"};function l(h,s,p,k,r,d){return e(),a("div",null,s[0]||(s[0]=[n(`

    Types

    This file defines some fundamental types used in GeometryOps.

    Warning

    Unlike in other Julia packages, only some types are defined in this file, not all. This is because we define types in the files where they are used, to make it easier to understand the code.

    julia
    export GEOS

    GEOS

    GEOS is a struct which instructs the method it's passed to as an algorithm to use the appropriate GEOS function via LibGEOS.jl for the operation.

    It's generally a lot slower than the native Julia implementations, but it's useful for two reasons:

    1. Functionality which doesn't exist in GeometryOps can be accessed through the GeometryOps API, but use GEOS in the backend until someone implements a native Julia version.

    2. It's a good way to test the correctness of the native implementations.

    julia
    """
    +    GEOS(; params...)
    +
    +A struct which instructs the method it's passed to as an algorithm
    +to use the appropriate GEOS function via \`LibGEOS.jl\` for the operation.
    +
    +Dispatch is generally carried out using the names of the keyword arguments.
    +For example, \`segmentize\` will only accept a \`GEOS\` struct with only a
    +\`max_distance\` keyword, and no other.
    +
    +It's generally a lot slower than the native Julia implementations, since
    +it must convert to the LibGEOS implementation and back - so be warned!
    +"""
    +struct GEOS
    +    params::NamedTuple
    +end
    +
    +function GEOS(; params...)
    +    nt = NamedTuple(params)
    +    return GEOS(nt)
    +end

    These are definitions for convenience, so we don't have to type out alg.params every time.

    julia
    Base.get(alg::GEOS, key, value) = Base.get(alg.params, key, value)
    +Base.get(f::Function, alg::GEOS, key) = Base.get(f, alg.params, key)
    +
    +"""
    +    enforce(alg::GO.GEOS, kw::Symbol, f)
    +
    +Enforce the presence of a keyword argument in a \`GEOS\` algorithm, and return \`alg.params[kw]\`.
    +
    +Throws an error if the key is not present, and mentions \`f\` in the error message (since there isn't
    +a good way to get the name of the function that called this method).
    +"""
    +function enforce(alg::GEOS, kw::Symbol, f)
    +    if haskey(alg.params, kw)
    +        return alg.params[kw]
    +    else
    +        error("$(f) requires a \`$(kw)\` keyword argument to the \`GEOS\` algorithm, which was not provided.")
    +    end
    +end

    This page was generated using Literate.jl.

    `,13)]))}const g=i(t,[["render",l]]);export{E as __pageData,g as default}; diff --git a/previews/PR239/assets/source_types.md.BzRqHlPc.lean.js b/previews/PR239/assets/source_types.md.BzRqHlPc.lean.js new file mode 100644 index 000000000..9d5cfae61 --- /dev/null +++ b/previews/PR239/assets/source_types.md.BzRqHlPc.lean.js @@ -0,0 +1,38 @@ +import{_ as i,c as a,a5 as n,o as e}from"./chunks/framework.onQNwZ2I.js";const E=JSON.parse('{"title":"Types","description":"","frontmatter":{},"headers":[],"relativePath":"source/types.md","filePath":"source/types.md","lastUpdated":null}'),t={name:"source/types.md"};function l(h,s,p,k,r,d){return e(),a("div",null,s[0]||(s[0]=[n(`

    Types

    This file defines some fundamental types used in GeometryOps.

    Warning

    Unlike in other Julia packages, only some types are defined in this file, not all. This is because we define types in the files where they are used, to make it easier to understand the code.

    julia
    export GEOS

    GEOS

    GEOS is a struct which instructs the method it's passed to as an algorithm to use the appropriate GEOS function via LibGEOS.jl for the operation.

    It's generally a lot slower than the native Julia implementations, but it's useful for two reasons:

    1. Functionality which doesn't exist in GeometryOps can be accessed through the GeometryOps API, but use GEOS in the backend until someone implements a native Julia version.

    2. It's a good way to test the correctness of the native implementations.

    julia
    """
    +    GEOS(; params...)
    +
    +A struct which instructs the method it's passed to as an algorithm
    +to use the appropriate GEOS function via \`LibGEOS.jl\` for the operation.
    +
    +Dispatch is generally carried out using the names of the keyword arguments.
    +For example, \`segmentize\` will only accept a \`GEOS\` struct with only a
    +\`max_distance\` keyword, and no other.
    +
    +It's generally a lot slower than the native Julia implementations, since
    +it must convert to the LibGEOS implementation and back - so be warned!
    +"""
    +struct GEOS
    +    params::NamedTuple
    +end
    +
    +function GEOS(; params...)
    +    nt = NamedTuple(params)
    +    return GEOS(nt)
    +end

    These are definitions for convenience, so we don't have to type out alg.params every time.

    julia
    Base.get(alg::GEOS, key, value) = Base.get(alg.params, key, value)
    +Base.get(f::Function, alg::GEOS, key) = Base.get(f, alg.params, key)
    +
    +"""
    +    enforce(alg::GO.GEOS, kw::Symbol, f)
    +
    +Enforce the presence of a keyword argument in a \`GEOS\` algorithm, and return \`alg.params[kw]\`.
    +
    +Throws an error if the key is not present, and mentions \`f\` in the error message (since there isn't
    +a good way to get the name of the function that called this method).
    +"""
    +function enforce(alg::GEOS, kw::Symbol, f)
    +    if haskey(alg.params, kw)
    +        return alg.params[kw]
    +    else
    +        error("$(f) requires a \`$(kw)\` keyword argument to the \`GEOS\` algorithm, which was not provided.")
    +    end
    +end

    This page was generated using Literate.jl.

    `,13)]))}const g=i(t,[["render",l]]);export{E as __pageData,g as default}; diff --git a/previews/PR239/assets/source_utils.md.Cy9C-nnj.js b/previews/PR239/assets/source_utils.md.Cy9C-nnj.js new file mode 100644 index 000000000..494fb3f1f --- /dev/null +++ b/previews/PR239/assets/source_utils.md.Cy9C-nnj.js @@ -0,0 +1,120 @@ +import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const d=JSON.parse('{"title":"Utility functions","description":"","frontmatter":{},"headers":[],"relativePath":"source/utils.md","filePath":"source/utils.md","lastUpdated":null}'),p={name:"source/utils.md"};function l(h,s,k,e,r,F){return t(),a("div",null,s[0]||(s[0]=[n(`

    Utility functions

    julia
    _is3d(geom)::Bool = _is3d(GI.trait(geom), geom)
    +_is3d(::GI.AbstractGeometryTrait, geom)::Bool = GI.is3d(geom)
    +_is3d(::GI.FeatureTrait, feature)::Bool = _is3d(GI.geometry(feature))
    +_is3d(::GI.FeatureCollectionTrait, fc)::Bool = _is3d(GI.getfeature(fc, 1))
    +_is3d(::Nothing, geom)::Bool = _is3d(first(geom)) # Otherwise step into an itererable
    +
    +_npoint(x) = _npoint(trait(x), x)
    +_npoint(::Nothing, xs::AbstractArray) = sum(_npoint, xs)
    +_npoint(::GI.FeatureCollectionTrait, fc) = sum(_npoint, GI.getfeature(fc))
    +_npoint(::GI.FeatureTrait, f) = _npoint(GI.geometry(f))
    +_npoint(::GI.AbstractGeometryTrait, x) = GI.npoint(trait(x), x)
    +
    +_nedge(x) = _nedge(trait(x), x)
    +_nedge(::Nothing, xs::AbstractArray) = sum(_nedge, xs)
    +_nedge(::GI.FeatureCollectionTrait, fc) = sum(_nedge, GI.getfeature(fc))
    +_nedge(::GI.FeatureTrait, f) = _nedge(GI.geometry(f))
    +function _nedge(::GI.AbstractGeometryTrait, x)
    +    n = 0
    +    for g in GI.getgeom(x)
    +        n += _nedge(g)
    +    end
    +    return n
    +end
    +_nedge(::GI.AbstractCurveTrait, x) = GI.npoint(x) - 1
    +_nedge(::GI.PointTrait, x) = error("Cant get edges from points")
    +
    +
    +"""
    +    polygon_to_line(poly::Polygon)
    +
    +Converts a Polygon to LineString or MultiLineString

    Examples

    julia
    \`\`\`jldoctest
    +import GeometryOps as GO, GeoInterface as GI
    +
    +poly = GI.Polygon([[(-2.275543, 53.464547), (-2.275543, 53.489271), (-2.215118, 53.489271), (-2.215118, 53.464547), (-2.275543, 53.464547)]])
    +GO.polygon_to_line(poly)

    output

    julia
    GeoInterface.Wrappers.LineString{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(-2.275543, 53.464547), (-2.275543, 53.489271), (-2.215118, 53.489271), (-2.215118, 53.464547), (-2.275543, 53.464547)], nothing, nothing)
    +\`\`\`
    +"""
    +function polygon_to_line(poly)
    +    @assert GI.trait(poly) isa PolygonTrait
    +    GI.ngeom(poly) > 1 && return GI.MultiLineString(collect(GI.getgeom(poly)))
    +    return GI.LineString(collect(GI.getgeom(GI.getgeom(poly, 1))))
    +end
    +
    +
    +"""
    +    to_edges()
    +
    +Convert any geometry or collection of geometries into a flat
    +vector of \`Tuple{Tuple{Float64,Float64},Tuple{Float64,Float64}}\` edges.
    +"""
    +function to_edges(x, ::Type{T} = Float64) where T
    +    edges = Vector{Edge{T}}(undef, _nedge(x))
    +    _to_edges!(edges, x, 1)
    +    return edges
    +end
    +
    +_to_edges!(edges::Vector, x, n) = _to_edges!(edges, trait(x), x, n)
    +function _to_edges!(edges::Vector, ::GI.FeatureCollectionTrait, fc, n)
    +    for f in GI.getfeature(fc)
    +        n = _to_edges!(edges, f, n)
    +    end
    +end
    +_to_edges!(edges::Vector, ::GI.FeatureTrait, f, n) = _to_edges!(edges, GI.geometry(f), n)
    +function _to_edges!(edges::Vector, ::GI.AbstractGeometryTrait, fc, n)
    +    for f in GI.getgeom(fc)
    +        n = _to_edges!(edges, f, n)
    +    end
    +end
    +function _to_edges!(edges::Vector, ::GI.AbstractCurveTrait, geom, n)
    +    p1 = GI.getpoint(geom, 1)
    +    p1x, p1y = GI.x(p1), GI.y(p1)
    +    for i in 2:GI.npoint(geom)
    +        p2 = GI.getpoint(geom, i)
    +        p2x, p2y = GI.x(p2), GI.y(p2)
    +        edges[n] = (p1x, p1y), (p2x, p2y)
    +        p1x, p1y = p2x, p2y
    +        n += 1
    +    end
    +    return n
    +end
    +
    +_tuple_point(p) = GI.x(p), GI.y(p)
    +_tuple_point(p, ::Type{T}) where T = T(GI.x(p)), T(GI.y(p))
    +
    +function to_extent(edges::Vector{Edge})
    +    x, y = extrema(first, edges)
    +    Extents.Extent(X=x, Y=y)
    +end
    +
    +function to_points(x, ::Type{T} = Float64) where T
    +    points = Vector{TuplePoint{T}}(undef, _npoint(x))
    +    _to_points!(points, x, 1)
    +    return points
    +end
    +
    +_to_points!(points::Vector, x, n) = _to_points!(points, trait(x), x, n)
    +function _to_points!(points::Vector, ::FeatureCollectionTrait, fc, n)
    +    for f in GI.getfeature(fc)
    +        n = _to_points!(points, f, n)
    +    end
    +end
    +_to_points!(points::Vector, ::FeatureTrait, f, n) = _to_points!(points, GI.geometry(f), n)
    +function _to_points!(points::Vector, ::AbstractGeometryTrait, fc, n)
    +    for f in GI.getgeom(fc)
    +        n = _to_points!(points, f, n)
    +    end
    +end
    +function _to_points!(points::Vector, ::Union{AbstractCurveTrait,MultiPointTrait}, geom, n)
    +    n = 0
    +    for p in GI.getpoint(geom)
    +        n += 1
    +        points[n] = _tuple_point(p)
    +    end
    +    return n
    +end
    +
    +function _point_in_extent(p, extent::Extents.Extent)
    +    (x1, x2), (y1, y2) = extent.X, extent.Y
    +    return x1 ≤ GI.x(p) ≤ x2 && y1 ≤ GI.y(p) ≤ y2
    +end

    This page was generated using Literate.jl.

    `,8)]))}const E=i(p,[["render",l]]);export{d as __pageData,E as default}; diff --git a/previews/PR239/assets/source_utils.md.Cy9C-nnj.lean.js b/previews/PR239/assets/source_utils.md.Cy9C-nnj.lean.js new file mode 100644 index 000000000..494fb3f1f --- /dev/null +++ b/previews/PR239/assets/source_utils.md.Cy9C-nnj.lean.js @@ -0,0 +1,120 @@ +import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.onQNwZ2I.js";const d=JSON.parse('{"title":"Utility functions","description":"","frontmatter":{},"headers":[],"relativePath":"source/utils.md","filePath":"source/utils.md","lastUpdated":null}'),p={name:"source/utils.md"};function l(h,s,k,e,r,F){return t(),a("div",null,s[0]||(s[0]=[n(`

    Utility functions

    julia
    _is3d(geom)::Bool = _is3d(GI.trait(geom), geom)
    +_is3d(::GI.AbstractGeometryTrait, geom)::Bool = GI.is3d(geom)
    +_is3d(::GI.FeatureTrait, feature)::Bool = _is3d(GI.geometry(feature))
    +_is3d(::GI.FeatureCollectionTrait, fc)::Bool = _is3d(GI.getfeature(fc, 1))
    +_is3d(::Nothing, geom)::Bool = _is3d(first(geom)) # Otherwise step into an itererable
    +
    +_npoint(x) = _npoint(trait(x), x)
    +_npoint(::Nothing, xs::AbstractArray) = sum(_npoint, xs)
    +_npoint(::GI.FeatureCollectionTrait, fc) = sum(_npoint, GI.getfeature(fc))
    +_npoint(::GI.FeatureTrait, f) = _npoint(GI.geometry(f))
    +_npoint(::GI.AbstractGeometryTrait, x) = GI.npoint(trait(x), x)
    +
    +_nedge(x) = _nedge(trait(x), x)
    +_nedge(::Nothing, xs::AbstractArray) = sum(_nedge, xs)
    +_nedge(::GI.FeatureCollectionTrait, fc) = sum(_nedge, GI.getfeature(fc))
    +_nedge(::GI.FeatureTrait, f) = _nedge(GI.geometry(f))
    +function _nedge(::GI.AbstractGeometryTrait, x)
    +    n = 0
    +    for g in GI.getgeom(x)
    +        n += _nedge(g)
    +    end
    +    return n
    +end
    +_nedge(::GI.AbstractCurveTrait, x) = GI.npoint(x) - 1
    +_nedge(::GI.PointTrait, x) = error("Cant get edges from points")
    +
    +
    +"""
    +    polygon_to_line(poly::Polygon)
    +
    +Converts a Polygon to LineString or MultiLineString

    Examples

    julia
    \`\`\`jldoctest
    +import GeometryOps as GO, GeoInterface as GI
    +
    +poly = GI.Polygon([[(-2.275543, 53.464547), (-2.275543, 53.489271), (-2.215118, 53.489271), (-2.215118, 53.464547), (-2.275543, 53.464547)]])
    +GO.polygon_to_line(poly)

    output

    julia
    GeoInterface.Wrappers.LineString{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(-2.275543, 53.464547), (-2.275543, 53.489271), (-2.215118, 53.489271), (-2.215118, 53.464547), (-2.275543, 53.464547)], nothing, nothing)
    +\`\`\`
    +"""
    +function polygon_to_line(poly)
    +    @assert GI.trait(poly) isa PolygonTrait
    +    GI.ngeom(poly) > 1 && return GI.MultiLineString(collect(GI.getgeom(poly)))
    +    return GI.LineString(collect(GI.getgeom(GI.getgeom(poly, 1))))
    +end
    +
    +
    +"""
    +    to_edges()
    +
    +Convert any geometry or collection of geometries into a flat
    +vector of \`Tuple{Tuple{Float64,Float64},Tuple{Float64,Float64}}\` edges.
    +"""
    +function to_edges(x, ::Type{T} = Float64) where T
    +    edges = Vector{Edge{T}}(undef, _nedge(x))
    +    _to_edges!(edges, x, 1)
    +    return edges
    +end
    +
    +_to_edges!(edges::Vector, x, n) = _to_edges!(edges, trait(x), x, n)
    +function _to_edges!(edges::Vector, ::GI.FeatureCollectionTrait, fc, n)
    +    for f in GI.getfeature(fc)
    +        n = _to_edges!(edges, f, n)
    +    end
    +end
    +_to_edges!(edges::Vector, ::GI.FeatureTrait, f, n) = _to_edges!(edges, GI.geometry(f), n)
    +function _to_edges!(edges::Vector, ::GI.AbstractGeometryTrait, fc, n)
    +    for f in GI.getgeom(fc)
    +        n = _to_edges!(edges, f, n)
    +    end
    +end
    +function _to_edges!(edges::Vector, ::GI.AbstractCurveTrait, geom, n)
    +    p1 = GI.getpoint(geom, 1)
    +    p1x, p1y = GI.x(p1), GI.y(p1)
    +    for i in 2:GI.npoint(geom)
    +        p2 = GI.getpoint(geom, i)
    +        p2x, p2y = GI.x(p2), GI.y(p2)
    +        edges[n] = (p1x, p1y), (p2x, p2y)
    +        p1x, p1y = p2x, p2y
    +        n += 1
    +    end
    +    return n
    +end
    +
    +_tuple_point(p) = GI.x(p), GI.y(p)
    +_tuple_point(p, ::Type{T}) where T = T(GI.x(p)), T(GI.y(p))
    +
    +function to_extent(edges::Vector{Edge})
    +    x, y = extrema(first, edges)
    +    Extents.Extent(X=x, Y=y)
    +end
    +
    +function to_points(x, ::Type{T} = Float64) where T
    +    points = Vector{TuplePoint{T}}(undef, _npoint(x))
    +    _to_points!(points, x, 1)
    +    return points
    +end
    +
    +_to_points!(points::Vector, x, n) = _to_points!(points, trait(x), x, n)
    +function _to_points!(points::Vector, ::FeatureCollectionTrait, fc, n)
    +    for f in GI.getfeature(fc)
    +        n = _to_points!(points, f, n)
    +    end
    +end
    +_to_points!(points::Vector, ::FeatureTrait, f, n) = _to_points!(points, GI.geometry(f), n)
    +function _to_points!(points::Vector, ::AbstractGeometryTrait, fc, n)
    +    for f in GI.getgeom(fc)
    +        n = _to_points!(points, f, n)
    +    end
    +end
    +function _to_points!(points::Vector, ::Union{AbstractCurveTrait,MultiPointTrait}, geom, n)
    +    n = 0
    +    for p in GI.getpoint(geom)
    +        n += 1
    +        points[n] = _tuple_point(p)
    +    end
    +    return n
    +end
    +
    +function _point_in_extent(p, extent::Extents.Extent)
    +    (x1, x2), (y1, y2) = extent.X, extent.Y
    +    return x1 ≤ GI.x(p) ≤ x2 && y1 ≤ GI.y(p) ≤ y2
    +end

    This page was generated using Literate.jl.

    `,8)]))}const E=i(p,[["render",l]]);export{d as __pageData,E as default}; diff --git a/previews/PR239/assets/sqwzzcg.DeeQUply.png b/previews/PR239/assets/sqwzzcg.DeeQUply.png new file mode 100644 index 0000000000000000000000000000000000000000..8a60753d00536ba6552886d98e4eefef8238f743 GIT binary patch literal 41343 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 literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/style.BIJ4ByRG.css b/previews/PR239/assets/style.BIJ4ByRG.css new file mode 100644 index 000000000..9f292cd28 --- /dev/null +++ b/previews/PR239/assets/style.BIJ4ByRG.css @@ -0,0 +1 @@ +@import"https://fonts.googleapis.com/css?family=Space+Mono:regular,italic,700,700italic";@import"https://fonts.googleapis.com/css?family=Space+Grotesk:regular,italic,700,700italic";@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/GeometryOps.jl/previews/PR239/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/GeometryOps.jl/previews/PR239/assets/inter-roman-cyrillic.C5lxZ8CY.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/GeometryOps.jl/previews/PR239/assets/inter-roman-greek-ext.CqjqNYQ-.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/GeometryOps.jl/previews/PR239/assets/inter-roman-greek.BBVDIX6e.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/GeometryOps.jl/previews/PR239/assets/inter-roman-vietnamese.BjW4sHH5.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/GeometryOps.jl/previews/PR239/assets/inter-roman-latin-ext.4ZJIpNVo.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/GeometryOps.jl/previews/PR239/assets/inter-roman-latin.Di8DUHzh.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/GeometryOps.jl/previews/PR239/assets/inter-italic-cyrillic-ext.r48I6akx.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/GeometryOps.jl/previews/PR239/assets/inter-italic-cyrillic.By2_1cv3.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/GeometryOps.jl/previews/PR239/assets/inter-italic-greek-ext.1u6EdAuj.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/GeometryOps.jl/previews/PR239/assets/inter-italic-greek.DJ8dCoTZ.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/GeometryOps.jl/previews/PR239/assets/inter-italic-vietnamese.BSbpV94h.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/GeometryOps.jl/previews/PR239/assets/inter-italic-latin-ext.CN1xVJS-.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/GeometryOps.jl/previews/PR239/assets/inter-italic-latin.C2AdPX0b.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Punctuation SC;font-weight:400;src:local("PingFang SC Regular"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:500;src:local("PingFang SC Medium"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:600;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:700;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-purple-1: #6f42c1;--vp-c-purple-2: #7e4cc9;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-purple-1: #c8abfa;--vp-c-purple-2: #a879e6;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: rgba(60, 60, 67);--vp-c-text-2: rgba(60, 60, 67, .78);--vp-c-text-3: rgba(60, 60, 67, .56)}.dark{--vp-c-text-1: rgba(255, 255, 245, .86);--vp-c-text-2: rgba(235, 235, 245, .6);--vp-c-text-3: rgba(235, 235, 245, .38)}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-note-1: var(--vp-c-brand-1);--vp-c-note-2: var(--vp-c-brand-2);--vp-c-note-3: var(--vp-c-brand-3);--vp-c-note-soft: var(--vp-c-brand-soft);--vp-c-success-1: var(--vp-c-green-1);--vp-c-success-2: var(--vp-c-green-2);--vp-c-success-3: var(--vp-c-green-3);--vp-c-success-soft: var(--vp-c-green-soft);--vp-c-important-1: var(--vp-c-purple-1);--vp-c-important-2: var(--vp-c-purple-2);--vp-c-important-3: var(--vp-c-purple-3);--vp-c-important-soft: var(--vp-c-purple-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft);--vp-c-caution-1: var(--vp-c-red-1);--vp-c-caution-2: var(--vp-c-red-2);--vp-c-caution-3: var(--vp-c-red-3);--vp-c-caution-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;font-optical-sizing:auto}:root:where(:lang(zh)){--vp-font-family-base: "Punctuation SC", "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-success-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-success-1);--vp-code-line-diff-remove-color: var(--vp-c-danger-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1);--vp-code-line-warning-color: var(--vp-c-warning-soft);--vp-code-line-error-color: var(--vp-c-danger-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-note-border: transparent;--vp-custom-block-note-text: var(--vp-c-text-1);--vp-custom-block-note-bg: var(--vp-c-default-soft);--vp-custom-block-note-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-tip-soft);--vp-custom-block-tip-code-bg: var(--vp-c-tip-soft);--vp-custom-block-important-border: transparent;--vp-custom-block-important-text: var(--vp-c-text-1);--vp-custom-block-important-bg: var(--vp-c-important-soft);--vp-custom-block-important-code-bg: var(--vp-c-important-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-caution-border: transparent;--vp-custom-block-caution-text: var(--vp-c-text-1);--vp-custom-block-caution-bg: var(--vp-c-caution-soft);--vp-custom-block-caution-code-bg: var(--vp-c-caution-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-default-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-tip-1);--vp-badge-tip-bg: var(--vp-c-tip-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{overflow-x:auto}mjx-container>svg{display:inline-block;margin:auto}[class^=vpi-],[class*=" vpi-"],.vp-icon{width:1em;height:1em}[class^=vpi-].bg,[class*=" vpi-"].bg,.vp-icon.bg{background-size:100% 100%;background-color:transparent}[class^=vpi-]:not(.bg),[class*=" vpi-"]:not(.bg),.vp-icon:not(.bg){-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit}.vpi-align-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M21 6H3M15 12H3M17 18H3'/%3E%3C/svg%3E")}.vpi-arrow-right,.vpi-arrow-down,.vpi-arrow-left,.vpi-arrow-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5l7 7-7 7'/%3E%3C/svg%3E")}.vpi-chevron-right,.vpi-chevron-down,.vpi-chevron-left,.vpi-chevron-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E")}.vpi-chevron-down,.vpi-arrow-down{transform:rotate(90deg)}.vpi-chevron-left,.vpi-arrow-left{transform:rotate(180deg)}.vpi-chevron-up,.vpi-arrow-up{transform:rotate(-90deg)}.vpi-square-pen{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z'/%3E%3C/svg%3E")}.vpi-plus{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5v14'/%3E%3C/svg%3E")}.vpi-sun{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E")}.vpi-moon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z'/%3E%3C/svg%3E")}.vpi-more-horizontal{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='1'/%3E%3Ccircle cx='19' cy='12' r='1'/%3E%3Ccircle cx='5' cy='12' r='1'/%3E%3C/svg%3E")}.vpi-languages{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6'/%3E%3C/svg%3E")}.vpi-heart{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z'/%3E%3C/svg%3E")}.vpi-search{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E")}.vpi-layout-list{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='7' height='7' x='3' y='3' rx='1'/%3E%3Crect width='7' height='7' x='3' y='14' rx='1'/%3E%3Cpath d='M14 4h7M14 9h7M14 15h7M14 20h7'/%3E%3C/svg%3E")}.vpi-delete{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2ZM18 9l-6 6M12 9l6 6'/%3E%3C/svg%3E")}.vpi-corner-down-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 10-5 5 5 5'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E")}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3Cpath d='m9 14 2 2 4-4'/%3E%3C/svg%3E")}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover,.custom-block.info a:hover>code{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.note{border-color:var(--vp-custom-block-note-border);color:var(--vp-custom-block-note-text);background-color:var(--vp-custom-block-note-bg)}.custom-block.note a,.custom-block.note code{color:var(--vp-c-brand-1)}.custom-block.note a:hover,.custom-block.note a:hover>code{color:var(--vp-c-brand-2)}.custom-block.note code{background-color:var(--vp-custom-block-note-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-tip-1)}.custom-block.tip a:hover,.custom-block.tip a:hover>code{color:var(--vp-c-tip-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.important{border-color:var(--vp-custom-block-important-border);color:var(--vp-custom-block-important-text);background-color:var(--vp-custom-block-important-bg)}.custom-block.important a,.custom-block.important code{color:var(--vp-c-important-1)}.custom-block.important a:hover,.custom-block.important a:hover>code{color:var(--vp-c-important-2)}.custom-block.important code{background-color:var(--vp-custom-block-important-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover,.custom-block.warning a:hover>code{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover,.custom-block.danger a:hover>code{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.caution{border-color:var(--vp-custom-block-caution-border);color:var(--vp-custom-block-caution-text);background-color:var(--vp-custom-block-caution-bg)}.custom-block.caution a,.custom-block.caution code{color:var(--vp-c-caution-1)}.custom-block.caution a:hover,.custom-block.caution a:hover>code{color:var(--vp-c-caution-2)}.custom-block.caution code{background-color:var(--vp-custom-block-caution-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover,.custom-block.details a:hover>code{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc h4{margin:24px 0 0;letter-spacing:-.01em;line-height:24px;font-size:18px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s;color:var(--vp-c-text-2)}.vp-doc blockquote>p{margin:0;font-size:16px;transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code,.vp-doc h4>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;-webkit-user-select:none;user-select:none;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(.no-icon):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin:0 0 4px!important;text-align:center;letter-spacing:1px!important;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-b06cdb19]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-b06cdb19],.VPBackdrop.fade-leave-to[data-v-b06cdb19]{opacity:0}.VPBackdrop.fade-leave-active[data-v-b06cdb19]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-b06cdb19]{display:none}}.NotFound[data-v-951cab6c]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-951cab6c]{padding:96px 32px 168px}}.code[data-v-951cab6c]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-951cab6c]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-951cab6c]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-951cab6c]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-951cab6c]{padding-top:20px}.link[data-v-951cab6c]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-951cab6c]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-3f927ebe]{position:relative;z-index:1}.nested[data-v-3f927ebe]{padding-right:16px;padding-left:16px}.outline-link[data-v-3f927ebe]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-3f927ebe]:hover,.outline-link.active[data-v-3f927ebe]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-3f927ebe]{padding-left:13px}.VPDocAsideOutline[data-v-b38bf2ff]{display:none}.VPDocAsideOutline.has-outline[data-v-b38bf2ff]{display:block}.content[data-v-b38bf2ff]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-b38bf2ff]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-b38bf2ff]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-6d7b3c46]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-6d7b3c46]{flex-grow:1}.VPDocAside[data-v-6d7b3c46] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-6d7b3c46] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-6d7b3c46] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-475f71b8]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-475f71b8]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-4f9813fa]{margin-top:64px}.edit-info[data-v-4f9813fa]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-4f9813fa]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-4f9813fa]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-4f9813fa]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-4f9813fa]{margin-right:8px}.prev-next[data-v-4f9813fa]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-4f9813fa]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-4f9813fa]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-4f9813fa]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-4f9813fa]{margin-left:auto;text-align:right}.desc[data-v-4f9813fa]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-4f9813fa]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-83890dd9]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-83890dd9]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-83890dd9]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-83890dd9]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-83890dd9]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-83890dd9]{display:flex;justify-content:center}.VPDoc .aside[data-v-83890dd9]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-83890dd9]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-83890dd9]{max-width:1104px}}.container[data-v-83890dd9]{margin:0 auto;width:100%}.aside[data-v-83890dd9]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-83890dd9]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-83890dd9]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-83890dd9]::-webkit-scrollbar{display:none}.aside-curtain[data-v-83890dd9]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-83890dd9]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-83890dd9]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-83890dd9]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-83890dd9]{order:1;margin:0;min-width:640px}}.content-container[data-v-83890dd9]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-83890dd9]{max-width:688px}.VPButton[data-v-906d7fb4]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-906d7fb4]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-906d7fb4]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-906d7fb4]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-906d7fb4]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-906d7fb4]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-906d7fb4]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-906d7fb4]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-906d7fb4]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-906d7fb4]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-906d7fb4]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-906d7fb4]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-906d7fb4]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-35a7d0b8]{display:none}.dark .VPImage.light[data-v-35a7d0b8]{display:none}.VPHero[data-v-955009fc]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-955009fc]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-955009fc]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-955009fc]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-955009fc]{flex-direction:row}}.main[data-v-955009fc]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-955009fc]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-955009fc]{text-align:left}}@media (min-width: 960px){.main[data-v-955009fc]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-955009fc]{max-width:592px}}.name[data-v-955009fc],.text[data-v-955009fc]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-955009fc],.VPHero.has-image .text[data-v-955009fc]{margin:0 auto}.name[data-v-955009fc]{color:var(--vp-home-hero-name-color)}.clip[data-v-955009fc]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-955009fc],.text[data-v-955009fc]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-955009fc],.text[data-v-955009fc]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-955009fc],.VPHero.has-image .text[data-v-955009fc]{margin:0}}.tagline[data-v-955009fc]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-955009fc]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-955009fc]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-955009fc]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-955009fc]{margin:0}}.actions[data-v-955009fc]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-955009fc]{justify-content:center}@media (min-width: 640px){.actions[data-v-955009fc]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-955009fc]{justify-content:flex-start}}.action[data-v-955009fc]{flex-shrink:0;padding:6px}.image[data-v-955009fc]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-955009fc]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-955009fc]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-955009fc]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-955009fc]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-955009fc]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-955009fc]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-955009fc]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-955009fc]{width:320px;height:320px}}[data-v-955009fc] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-955009fc] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-955009fc] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-f5e9645b]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-f5e9645b]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-f5e9645b]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-f5e9645b]>.VPImage{margin-bottom:20px}.icon[data-v-f5e9645b]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-f5e9645b]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-f5e9645b]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-f5e9645b]{padding-top:8px}.link-text-value[data-v-f5e9645b]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-f5e9645b]{margin-left:6px}.VPFeatures[data-v-d0a190d7]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-d0a190d7]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-d0a190d7]{padding:0 64px}}.container[data-v-d0a190d7]{margin:0 auto;max-width:1152px}.items[data-v-d0a190d7]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-d0a190d7]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-d0a190d7],.item.grid-4[data-v-d0a190d7],.item.grid-6[data-v-d0a190d7]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-d0a190d7],.item.grid-4[data-v-d0a190d7]{width:50%}.item.grid-3[data-v-d0a190d7],.item.grid-6[data-v-d0a190d7]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-d0a190d7]{width:25%}}.container[data-v-7a48a447]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media (min-width: 640px){.container[data-v-7a48a447]{padding:0 48px}}@media (min-width: 960px){.container[data-v-7a48a447]{width:100%;padding:0 64px}}.vp-doc[data-v-7a48a447] .VPHomeSponsors,.vp-doc[data-v-7a48a447] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-7a48a447] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-7a48a447] .VPHomeSponsors a,.vp-doc[data-v-7a48a447] .VPTeamPage a{text-decoration:none}.VPHome[data-v-cbb6ec48]{margin-bottom:96px}@media (min-width: 768px){.VPHome[data-v-cbb6ec48]{margin-bottom:128px}}.VPContent[data-v-91765379]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-91765379]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-91765379]{margin:0}@media (min-width: 960px){.VPContent[data-v-91765379]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-91765379]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-91765379]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-c970a860]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-c970a860]{display:none}.VPFooter[data-v-c970a860] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-c970a860] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-c970a860]{padding:32px}}.container[data-v-c970a860]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-c970a860],.copyright[data-v-c970a860]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-bc9dc845]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-bc9dc845]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-bc9dc845]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-bc9dc845]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-bc9dc845]{color:var(--vp-c-text-1)}.icon[data-v-bc9dc845]{display:inline-block;vertical-align:middle;margin-left:2px;font-size:14px;transform:rotate(0);transition:transform .25s}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-bc9dc845]{font-size:14px}.icon[data-v-bc9dc845]{font-size:16px}}.open>.icon[data-v-bc9dc845]{transform:rotate(90deg)}.items[data-v-bc9dc845]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media (min-width: 960px){.items[data-v-bc9dc845]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-bc9dc845]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-bc9dc845]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-bc9dc845]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-bc9dc845]{transition:all .2s ease-out}.flyout-leave-active[data-v-bc9dc845]{transition:all .15s ease-in}.flyout-enter-from[data-v-bc9dc845],.flyout-leave-to[data-v-bc9dc845]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-070ab83d]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-070ab83d]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-070ab83d]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-070ab83d]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-070ab83d]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-070ab83d]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-070ab83d]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-070ab83d]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-070ab83d]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-070ab83d]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-070ab83d]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-070ab83d]{display:none}}.menu-icon[data-v-070ab83d]{margin-right:8px;font-size:14px}.VPOutlineDropdown[data-v-070ab83d]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-070ab83d]{padding:12px 32px 11px}}.VPSwitch[data-v-4a1c76db]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-4a1c76db]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-4a1c76db]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-4a1c76db]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-4a1c76db] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-4a1c76db] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-e40a8bb6]{opacity:1}.moon[data-v-e40a8bb6],.dark .sun[data-v-e40a8bb6]{opacity:0}.dark .moon[data-v-e40a8bb6]{opacity:1}.dark .VPSwitchAppearance[data-v-e40a8bb6] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-af096f4a]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-af096f4a]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-acbfed09]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-acbfed09]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-acbfed09]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-acbfed09]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-48c802d0]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-48c802d0]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-48c802d0]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-48c802d0]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-7dd3104a]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-7dd3104a] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-7dd3104a] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-7dd3104a] .group:last-child{padding-bottom:0}.VPMenu[data-v-7dd3104a] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-7dd3104a] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-7dd3104a] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-7dd3104a] .action{padding-left:24px}.VPFlyout[data-v-04f5c5e9]{position:relative}.VPFlyout[data-v-04f5c5e9]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-04f5c5e9]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-04f5c5e9]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-04f5c5e9]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-04f5c5e9]{color:var(--vp-c-brand-2)}.button[aria-expanded=false]+.menu[data-v-04f5c5e9]{opacity:0;visibility:hidden;transform:translateY(0)}.VPFlyout:hover .menu[data-v-04f5c5e9],.button[aria-expanded=true]+.menu[data-v-04f5c5e9]{opacity:1;visibility:visible;transform:translateY(0)}.button[data-v-04f5c5e9]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-04f5c5e9]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-04f5c5e9]{margin-right:0;font-size:16px}.text-icon[data-v-04f5c5e9]{margin-left:4px;font-size:14px}.icon[data-v-04f5c5e9]{font-size:20px;transition:fill .25s}.menu[data-v-04f5c5e9]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-d26d30cb]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-d26d30cb]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-d26d30cb]>svg,.VPSocialLink[data-v-d26d30cb]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-ee7a9424]{display:flex;justify-content:center}.VPNavBarExtra[data-v-925effce]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-925effce]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-925effce]{display:none}}.trans-title[data-v-925effce]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-925effce],.item.social-links[data-v-925effce]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-925effce]{min-width:176px}.appearance-action[data-v-925effce]{margin-right:-2px}.social-links-list[data-v-925effce]{margin:-4px -8px}.VPNavBarHamburger[data-v-5dea55bf]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-5dea55bf]{display:none}}.container[data-v-5dea55bf]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-5dea55bf]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-5dea55bf]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-5dea55bf]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-5dea55bf]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-5dea55bf]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-5dea55bf]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-5dea55bf],.VPNavBarHamburger.active:hover .middle[data-v-5dea55bf],.VPNavBarHamburger.active:hover .bottom[data-v-5dea55bf]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-5dea55bf],.middle[data-v-5dea55bf],.bottom[data-v-5dea55bf]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-5dea55bf]{top:0;left:0;transform:translate(0)}.middle[data-v-5dea55bf]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-5dea55bf]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-956ec74c]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-956ec74c],.VPNavBarMenuLink[data-v-956ec74c]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-e6d46098]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-e6d46098]{display:flex}}/*! @docsearch/css 3.8.0 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 #0304094d;--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow);transform:translate3d(0,1px,0)}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button-Key--pressed{transform:none;box-shadow:none}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.DocSearch-Search-Icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke-width='1.6' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='m14.386 14.386 4.088 4.088-4.088-4.088A7.533 7.533 0 1 1 3.733 3.733a7.533 7.533 0 0 1 10.653 10.653z'/%3E%3C/svg%3E")}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-164c457f]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-164c457f]{display:flex;align-items:center}}.title[data-v-0f4f798b]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-0f4f798b]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-0f4f798b]{border-bottom-color:var(--vp-c-divider)}}[data-v-0f4f798b] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-c80d9ad0]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-c80d9ad0]{display:flex;align-items:center}}.title[data-v-c80d9ad0]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-822684d1]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .25s}.VPNavBar.screen-open[data-v-822684d1]{transition:none;background-color:var(--vp-nav-bg-color);border-bottom:1px solid var(--vp-c-divider)}.VPNavBar[data-v-822684d1]:not(.home){background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar[data-v-822684d1]:not(.home){background-color:transparent}.VPNavBar[data-v-822684d1]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-822684d1]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-822684d1]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-822684d1]{padding:0}}.container[data-v-822684d1]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-822684d1],.container>.content[data-v-822684d1]{pointer-events:none}.container[data-v-822684d1] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-822684d1]{max-width:100%}}.title[data-v-822684d1]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-822684d1]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-822684d1]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-822684d1]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-822684d1]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-822684d1]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-822684d1]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.home.top) .content-body[data-v-822684d1]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-822684d1]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-822684d1]{column-gap:.5rem}}.menu+.translations[data-v-822684d1]:before,.menu+.appearance[data-v-822684d1]:before,.menu+.social-links[data-v-822684d1]:before,.translations+.appearance[data-v-822684d1]:before,.appearance+.social-links[data-v-822684d1]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-822684d1]:before,.translations+.appearance[data-v-822684d1]:before{margin-right:16px}.appearance+.social-links[data-v-822684d1]:before{margin-left:16px}.social-links[data-v-822684d1]{margin-right:-8px}.divider[data-v-822684d1]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-822684d1]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-822684d1]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-822684d1]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-822684d1]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.home.top) .divider-line[data-v-822684d1]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-822684d1]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-ffb44008]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-ffb44008]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-735512b8]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-735512b8]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-372ae7c0]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-372ae7c0]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-4b8941ac]{display:block}.title[data-v-4b8941ac]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-875057a5]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-875057a5]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-875057a5]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-875057a5]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-875057a5]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-875057a5]{transform:rotate(45deg)}.button[data-v-875057a5]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-875057a5]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-875057a5]{transition:transform .25s}.group[data-v-875057a5]:first-child{padding-top:0}.group+.group[data-v-875057a5],.group+.item[data-v-875057a5]{padding-top:4px}.VPNavScreenTranslations[data-v-362991c2]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-362991c2]{height:auto}.title[data-v-362991c2]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-362991c2]{font-size:16px}.icon.lang[data-v-362991c2]{margin-right:8px}.icon.chevron[data-v-362991c2]{margin-left:4px}.list[data-v-362991c2]{padding:4px 0 0 24px}.link[data-v-362991c2]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-833aabba]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px));right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .25s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-833aabba],.VPNavScreen.fade-leave-active[data-v-833aabba]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-833aabba],.VPNavScreen.fade-leave-active .container[data-v-833aabba]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-833aabba],.VPNavScreen.fade-leave-to[data-v-833aabba]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-833aabba],.VPNavScreen.fade-leave-to .container[data-v-833aabba]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-833aabba]{display:none}}.container[data-v-833aabba]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-833aabba],.menu+.appearance[data-v-833aabba],.translations+.appearance[data-v-833aabba]{margin-top:24px}.menu+.social-links[data-v-833aabba]{margin-top:16px}.appearance+.social-links[data-v-833aabba]{margin-top:16px}.VPNav[data-v-f1e365da]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-f1e365da]{position:fixed}}.VPSidebarItem.level-0[data-v-196b2e5f]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-196b2e5f]{padding-bottom:10px}.item[data-v-196b2e5f]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-196b2e5f]{cursor:pointer}.indicator[data-v-196b2e5f]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-196b2e5f],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-196b2e5f],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-196b2e5f],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-196b2e5f]{background-color:var(--vp-c-brand-1)}.link[data-v-196b2e5f]{display:flex;align-items:center;flex-grow:1}.text[data-v-196b2e5f]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-196b2e5f]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-196b2e5f],.VPSidebarItem.level-2 .text[data-v-196b2e5f],.VPSidebarItem.level-3 .text[data-v-196b2e5f],.VPSidebarItem.level-4 .text[data-v-196b2e5f],.VPSidebarItem.level-5 .text[data-v-196b2e5f]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-196b2e5f]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-1.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-2.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-3.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-4.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-5.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-196b2e5f]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-196b2e5f]{color:var(--vp-c-brand-1)}.caret[data-v-196b2e5f]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-196b2e5f]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-196b2e5f]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-196b2e5f]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-196b2e5f]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-196b2e5f],.VPSidebarItem.level-2 .items[data-v-196b2e5f],.VPSidebarItem.level-3 .items[data-v-196b2e5f],.VPSidebarItem.level-4 .items[data-v-196b2e5f],.VPSidebarItem.level-5 .items[data-v-196b2e5f]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-196b2e5f]{display:none}.no-transition[data-v-9e426adc] .caret-icon{transition:none}.group+.group[data-v-9e426adc]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-9e426adc]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSidebar[data-v-18756405]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-18756405]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-18756405]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-18756405]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-18756405]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-18756405]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-18756405]{outline:0}.VPSkipLink[data-v-c3508ec8]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-c3508ec8]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-c3508ec8]{top:14px;left:16px}}.Layout[data-v-a9a9e638]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-db81191c]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPHomeSponsors[data-v-db81191c]{margin:96px 0}@media (min-width: 768px){.VPHomeSponsors[data-v-db81191c]{margin:128px 0}}.VPHomeSponsors[data-v-db81191c]{padding:0 24px}@media (min-width: 768px){.VPHomeSponsors[data-v-db81191c]{padding:0 48px}}@media (min-width: 960px){.VPHomeSponsors[data-v-db81191c]{padding:0 64px}}.container[data-v-db81191c]{margin:0 auto;max-width:1152px}.love[data-v-db81191c]{margin:0 auto;width:fit-content;font-size:28px;color:var(--vp-c-text-3)}.icon[data-v-db81191c]{display:inline-block}.message[data-v-db81191c]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-db81191c]{padding-top:32px}.action[data-v-db81191c]{padding-top:40px;text-align:center}.VPTeamPage[data-v-c2f8e101]{margin:96px 0}@media (min-width: 768px){.VPTeamPage[data-v-c2f8e101]{margin:128px 0}}.VPHome .VPTeamPageTitle[data-v-c2f8e101-s]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPTeamPageSection+.VPTeamPageSection[data-v-c2f8e101-s],.VPTeamMembers+.VPTeamPageSection[data-v-c2f8e101-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-c2f8e101-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-c2f8e101-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-c2f8e101-s],.VPTeamMembers+.VPTeamPageSection[data-v-c2f8e101-s]{margin-top:96px}}.VPTeamMembers[data-v-c2f8e101-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-c2f8e101-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-c2f8e101-s]{padding:0 64px}}.VPTeamPageTitle[data-v-e277e15c]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-e277e15c]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-e277e15c]{padding:80px 64px 48px}}.title[data-v-e277e15c]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-e277e15c]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-e277e15c]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-e277e15c]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-d43bc49d]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-d43bc49d]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-d43bc49d]{padding:0 64px}}.title[data-v-d43bc49d]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-d43bc49d]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-d43bc49d]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-d43bc49d]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-d43bc49d]{padding-top:40px}.VPTeamMembersItem[data-v-f9987cb6]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-f9987cb6]{padding:32px}.VPTeamMembersItem.small .data[data-v-f9987cb6]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-f9987cb6]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-f9987cb6]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-f9987cb6]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-f9987cb6]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-f9987cb6]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-f9987cb6]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-f9987cb6]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-f9987cb6]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-f9987cb6]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-f9987cb6]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-f9987cb6]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-f9987cb6]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-f9987cb6]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-f9987cb6]{text-align:center}.avatar[data-v-f9987cb6]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-f9987cb6]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-f9987cb6]{margin:0;font-weight:600}.affiliation[data-v-f9987cb6]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-f9987cb6]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-f9987cb6]:hover{color:var(--vp-c-brand-1)}.desc[data-v-f9987cb6]{margin:0 auto}.desc[data-v-f9987cb6] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-f9987cb6]{display:flex;justify-content:center;height:56px}.sp-link[data-v-f9987cb6]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-f9987cb6]:hover,.sp .sp-link.link[data-v-f9987cb6]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-f9987cb6]{margin-right:8px;font-size:16px}.VPTeamMembers.small .container[data-v-fba19bad]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-fba19bad]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-fba19bad]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-fba19bad]{max-width:876px}.VPTeamMembers.medium .container[data-v-fba19bad]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-fba19bad]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-fba19bad]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-fba19bad]{max-width:760px}.container[data-v-fba19bad]{display:grid;gap:24px;margin:0 auto;max-width:1152px}:root{--vp-plugin-tabs-tab-text-color: var(--vp-c-text-2);--vp-plugin-tabs-tab-active-text-color: var(--vp-c-text-1);--vp-plugin-tabs-tab-hover-text-color: var(--vp-c-text-1);--vp-plugin-tabs-tab-bg: var(--vp-c-bg-soft);--vp-plugin-tabs-tab-divider: var(--vp-c-divider);--vp-plugin-tabs-tab-active-bar-color: var(--vp-c-brand-1)}.plugin-tabs{margin:16px 0;background-color:var(--vp-plugin-tabs-tab-bg);border-radius:8px}.plugin-tabs--tab-list{position:relative;padding:0 12px;overflow-x:auto;overflow-y:hidden}.plugin-tabs--tab-list:after{content:"";position:absolute;bottom:0;left:0;right:0;height:2px;background-color:var(--vp-plugin-tabs-tab-divider)}.plugin-tabs--tab{position:relative;padding:0 12px;line-height:48px;border-bottom:2px solid transparent;color:var(--vp-plugin-tabs-tab-text-color);font-size:14px;font-weight:500;white-space:nowrap;transition:color .25s}.plugin-tabs--tab[aria-selected=true]{color:var(--vp-plugin-tabs-tab-active-text-color)}.plugin-tabs--tab:hover{color:var(--vp-plugin-tabs-tab-hover-text-color)}.plugin-tabs--tab:after{content:"";position:absolute;bottom:-2px;left:8px;right:8px;height:2px;background-color:transparent;transition:background-color .25s;z-index:1}.plugin-tabs--tab[aria-selected=true]:after{background-color:var(--vp-plugin-tabs-tab-active-bar-color)}.plugin-tabs--content[data-v-9b0d03d2]{padding:16px}.plugin-tabs--content[data-v-9b0d03d2]>:first-child:first-child{margin-top:0}.plugin-tabs--content[data-v-9b0d03d2]>:last-child:last-child{margin-bottom:0}.plugin-tabs--content[data-v-9b0d03d2]>div[class*=language-]{border-radius:8px;margin:16px 0}:root:not(.dark) .plugin-tabs--content[data-v-9b0d03d2] div[class*=language-]{background-color:var(--vp-c-bg)}.VPHero .clip{white-space:pre;max-width:500px}:root{--vp-font-family-base: "Barlow", "Inter var experimental", "Inter var", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;--vp-font-family-mono: "Space Mono", Menlo, Monaco, Consolas, "Courier New", monospace}:root{--julia-blue: #4063D8;--julia-purple: #9558B2;--julia-red: #CB3C33;--julia-green: #389826;--vp-c-brand: #389826;--vp-c-brand-light: #3dd027;--vp-c-brand-lighter: #9499ff;--vp-c-brand-lightest: #bcc0ff;--vp-c-brand-dark: #535bf2;--vp-c-brand-darker: #454ce1;--vp-c-brand-dimm: #212425}:root{--vp-button-brand-border: var(--vp-c-brand-light);--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand);--vp-button-brand-hover-border: var(--vp-c-brand-light);--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-light);--vp-button-brand-active-border: var(--vp-c-brand-light);--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-button-brand-bg)}:root{--vp-home-hero-name-color: transparent;--vp-home-hero-name-background: -webkit-linear-gradient( 120deg, #459c55 30%, #dccc50 );--vp-home-hero-image-background-image: linear-gradient( -45deg, #9558B2 30%, #389826 30%, #CB3C33 );--vp-home-hero-image-filter: blur(40px)}@media (min-width: 640px){:root{--vp-home-hero-image-filter: blur(56px)}}@media (min-width: 960px){:root{--vp-home-hero-image-filter: blur(72px)}}:root.dark{--vp-custom-block-tip-border: var(--vp-c-brand);--vp-custom-block-tip-text: var(--vp-c-brand-lightest);--vp-custom-block-tip-bg: var(--vp-c-brand-dimm);--vp-c-black: hsl(220 20% 9%);--vp-c-black-pure: hsl(220, 24%, 4%);--vp-c-black-soft: hsl(220 16% 13%);--vp-c-black-mute: hsl(220 14% 17%);--vp-c-gray: hsl(220 8% 56%);--vp-c-gray-dark-1: hsl(220 10% 39%);--vp-c-gray-dark-2: hsl(220 12% 28%);--vp-c-gray-dark-3: hsl(220 12% 23%);--vp-c-gray-dark-4: hsl(220 14% 17%);--vp-c-gray-dark-5: hsl(220 16% 13%);--vp-custom-block-info-bg: hsl(220 14% 17%)}.DocSearch{--docsearch-primary-color: var(--vp-c-brand) !important}mjx-container>svg{display:block;margin:auto}mjx-container{padding:.5rem 0}mjx-container{display:inline-block;margin:auto 2px -2px}mjx-container>svg{margin:auto;display:inline-block}:root{--vp-c-brand-1: #CB3C33;--vp-c-brand-2: #CB3C33;--vp-c-brand-3: #CB3C33;--vp-c-sponsor: #ca2971;--vitest-c-sponsor-hover: #c13071}.dark{--vp-c-brand-1: #91dd33;--vp-c-brand-2: #91dd33;--vp-c-brand-3: #91dd33;--vp-c-sponsor: #91dd33;--vitest-c-sponsor-hover: #e51370}.VPLocalSearchBox[data-v-42e65fb9]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-42e65fb9]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-42e65fb9]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 767px){.shell[data-v-42e65fb9]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-42e65fb9]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 767px){.search-bar[data-v-42e65fb9]{padding:0 8px}}.search-bar[data-v-42e65fb9]:focus-within{border-color:var(--vp-c-brand-1)}.local-search-icon[data-v-42e65fb9]{display:block;font-size:18px}.navigate-icon[data-v-42e65fb9]{display:block;font-size:14px}.search-icon[data-v-42e65fb9]{margin:8px}@media (max-width: 767px){.search-icon[data-v-42e65fb9]{display:none}}.search-input[data-v-42e65fb9]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 767px){.search-input[data-v-42e65fb9]{padding:6px 4px}}.search-actions[data-v-42e65fb9]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-42e65fb9]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-42e65fb9]{display:none}}.search-actions button[data-v-42e65fb9]{padding:8px}.search-actions button[data-v-42e65fb9]:not([disabled]):hover,.toggle-layout-button.detailed-list[data-v-42e65fb9]{color:var(--vp-c-brand-1)}.search-actions button.clear-button[data-v-42e65fb9]:disabled{opacity:.37}.search-keyboard-shortcuts[data-v-42e65fb9]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-42e65fb9]{display:flex;align-items:center;gap:4px}@media (max-width: 767px){.search-keyboard-shortcuts[data-v-42e65fb9]{display:none}}.search-keyboard-shortcuts kbd[data-v-42e65fb9]{background:#8080801a;border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-42e65fb9]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-42e65fb9]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border);outline:none}.result>div[data-v-42e65fb9]{margin:12px;width:100%;overflow:hidden}@media (max-width: 767px){.result>div[data-v-42e65fb9]{margin:8px}}.titles[data-v-42e65fb9]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-42e65fb9]{display:flex;align-items:center;gap:4px}.title.main[data-v-42e65fb9]{font-weight:500}.title-icon[data-v-42e65fb9]{opacity:.5;font-weight:500;color:var(--vp-c-brand-1)}.title svg[data-v-42e65fb9]{opacity:.5}.result.selected[data-v-42e65fb9]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-42e65fb9]{position:relative}.excerpt[data-v-42e65fb9]{opacity:50%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;margin-top:4px}.result.selected .excerpt[data-v-42e65fb9]{opacity:1}.excerpt[data-v-42e65fb9] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-42e65fb9] mark,.excerpt[data-v-42e65fb9] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-42e65fb9] .vp-code-group .tabs{display:none}.excerpt[data-v-42e65fb9] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-42e65fb9]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-42e65fb9]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-42e65fb9],.result.selected .title-icon[data-v-42e65fb9]{color:var(--vp-c-brand-1)!important}.no-results[data-v-42e65fb9]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-42e65fb9]{flex:none} diff --git a/previews/PR239/assets/tfqfmef.Dz86q2IX.png b/previews/PR239/assets/tfqfmef.Dz86q2IX.png new file mode 100644 index 0000000000000000000000000000000000000000..4009c1abb86e2c71c1ebcb2ca8dea2bea3795232 GIT binary patch literal 14890 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 F{{gAEmiPbw literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/tlayvwm.DiwGEg2f.png b/previews/PR239/assets/tlayvwm.DiwGEg2f.png new file mode 100644 index 0000000000000000000000000000000000000000..b9cc2026e0ce54e2cb4b69930300d7f9789e4599 GIT binary patch literal 13659 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 literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/tsgqxnn.B94PsR1K.png b/previews/PR239/assets/tsgqxnn.B94PsR1K.png new file mode 100644 index 0000000000000000000000000000000000000000..65bec08ee041bea3fbc09c0e72a8aeb6f7387ae9 GIT binary patch literal 34578 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

    YFW2AiB=HTn1h&?i|(pqpV5oy)_f{FIlqa6 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

    `n%(A{67fl<345^-zIJU+0o^P$o>)1U&XD&H|Kf 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 lHTe9W67l!X|C4>tXhCreating Geometry

    GeometryOps.jl

  • In this tutorial, we're going to:

    1. Create and plot geometries

    2. Plot geometries on a map using GeoMakie and coordinate reference system (CRS)

    3. Create geospatial geometries with embedded coordinate reference system information

    4. Assign attributes to geospatial geometries

    5. Save geospatial geometries to common geospatial file formats

    First, we load some required packages.

    julia
    # Geospatial packages from Julia
    +import GeoInterface as GI
    +import GeometryOps as GO
    +import GeoFormatTypes as GFT
    +using GeoJSON # to load some data
    +# Packages for coordinate transformation and projection
    +import CoordinateTransformations
    +import Proj
    +# Plotting
    +using CairoMakie
    +using GeoMakie

    Creating and plotting geometries

    Let's start by making a single Point.

    julia
    point = GI.Point(0, 0)
    GeoInterface.Wrappers.Point{false, false, Tuple{Int64, Int64}, Nothing}((0, 0), nothing)

    Now, let's plot our point.

    julia
    fig, ax, plt = plot(point)

    Let's create a set of points, and have a bit more fun with plotting.

    julia
    x = [-5, 0, 5, 0];
    +y = [0, -5, 0, 5];
    +points = GI.Point.(zip(x,y));
    +plot!(ax, points; marker = '✈', markersize = 30)
    +fig

    Points can be combined into a single MultiPoint geometry.

    julia
    x = [-5, -5, 5, 5];
    +y = [-5, 5, 5, -5];
    +multipoint = GI.MultiPoint(GI.Point.(zip(x, y)));
    +plot!(ax, multipoint; marker = '☁', markersize = 30)
    +fig

    Let's create a LineString connecting two points.

    julia
    p1 = GI.Point.(-5, 0);
    +p2 = GI.Point.(5, 0);
    +line = GI.LineString([p1,p2])
    +plot!(ax, line; color = :red)
    +fig

    Now, let's create a line connecting multiple points (i.e. a LineString). This time we get a bit more fancy with point creation.

    julia
    r = 2;
    +k = 10;
    +ϴ = 0:0.01:2pi;
    +x = r .* (k + 1) .* cos.(ϴ) .- r .* cos.((k + 1) .* ϴ);
    +y = r .* (k + 1) .* sin.(ϴ) .- r .* sin.((k + 1) .* ϴ);
    +lines = GI.LineString(GI.Point.(zip(x,y)));
    +plot!(ax, lines; linewidth = 5)
    +fig

    We can also create a single LinearRing trait, the building block of a polygon. A LinearRing is simply a LineString with the same beginning and endpoint, i.e., an arbitrary closed shape composed of point pairs.

    A LinearRing is composed of a series of points.

    julia
    ring1 = GI.LinearRing(GI.getpoint(lines));
    GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}[GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.0, 0.0), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.010987813253244, 0.0004397316773170068), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.043805248003498, 0.0035114210915891397), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.098016055420953, 0.011814947665167774), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.172899020101585, 0.027886421973952302), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.267456684570245, 0.05416726609360478), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.380427415579764, 0.09297443860091348), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.51030066635026, 0.1464721641710074), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.655335250260467, 0.21664550952386064), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.813580405100698, 0.30527612515520186), nothing)  …  GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.866418416586406, -0.3376428491230612), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.704405820024185, -0.24279488312757858), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.55494217175954, -0.16692537029320365), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.420040147662014, -0.10832215707812454), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.30151010318639, -0.0650624499034016), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.200938172182195, -0.03503632062070827), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.119667078681967, -0.01597247419241532), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.058779893613323, -0.005465967083412071), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.019086932781654, -0.0010075412835199304), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.001115954499138, -1.4219350464667047e-5), nothing)], nothing, nothing)

    Now, let's make the LinearRing into a Polygon.

    julia
    polygon1 = GI.Polygon([ring1]);
    GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}[GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.0, 0.0), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.010987813253244, 0.0004397316773170068), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.043805248003498, 0.0035114210915891397), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.098016055420953, 0.011814947665167774), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.172899020101585, 0.027886421973952302), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.267456684570245, 0.05416726609360478), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.380427415579764, 0.09297443860091348), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.51030066635026, 0.1464721641710074), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.655335250260467, 0.21664550952386064), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.813580405100698, 0.30527612515520186), nothing)  …  GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.866418416586406, -0.3376428491230612), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.704405820024185, -0.24279488312757858), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.55494217175954, -0.16692537029320365), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.420040147662014, -0.10832215707812454), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.30151010318639, -0.0650624499034016), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.200938172182195, -0.03503632062070827), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.119667078681967, -0.01597247419241532), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.058779893613323, -0.005465967083412071), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.019086932781654, -0.0010075412835199304), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.001115954499138, -1.4219350464667047e-5), nothing)], nothing, nothing)], nothing, nothing)

    Now, we can use GeometryOps and CoordinateTransformations to shift polygon1 up, to avoid plotting over our earlier results. This is done through the GeometryOps.transform function.

    julia
    xoffset = 0.;
    +yoffset = 50.;
    +f = CoordinateTransformations.Translation(xoffset, yoffset);
    +polygon1 = GO.transform(f, polygon1);
    +plot!(polygon1)
    +fig

    Polygons can contain "holes". The first LinearRing in a polygon is the exterior, and all subsequent LinearRings are treated as holes in the leading LinearRing.

    GeoInterface offers the GI.getexterior(poly) and GI.gethole(poly) methods to get the exterior ring and an iterable of holes, respectively.

    julia
    hole = GI.LinearRing(GI.getpoint(multipoint))
    +polygon2 = GI.Polygon([ring1, hole])
    GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, T, Nothing, Nothing} where T}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, T, Nothing, Nothing} where T[GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}[GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.0, 0.0), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.010987813253244, 0.0004397316773170068), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.043805248003498, 0.0035114210915891397), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.098016055420953, 0.011814947665167774), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.172899020101585, 0.027886421973952302), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.267456684570245, 0.05416726609360478), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.380427415579764, 0.09297443860091348), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.51030066635026, 0.1464721641710074), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.655335250260467, 0.21664550952386064), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.813580405100698, 0.30527612515520186), nothing)  …  GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.866418416586406, -0.3376428491230612), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.704405820024185, -0.24279488312757858), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.55494217175954, -0.16692537029320365), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.420040147662014, -0.10832215707812454), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.30151010318639, -0.0650624499034016), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.200938172182195, -0.03503632062070827), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.119667078681967, -0.01597247419241532), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.058779893613323, -0.005465967083412071), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.019086932781654, -0.0010075412835199304), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.001115954499138, -1.4219350464667047e-5), nothing)], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Int64, Int64}, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Point{false, false, Tuple{Int64, Int64}, Nothing}[GeoInterface.Wrappers.Point{false, false, Tuple{Int64, Int64}, Nothing}((-5, -5), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Int64, Int64}, Nothing}((-5, 5), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Int64, Int64}, Nothing}((5, 5), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Int64, Int64}, Nothing}((5, -5), nothing)], nothing, nothing)], nothing, nothing)

    Shift polygon2 to the right, to avoid plotting over our earlier results.

    julia
    xoffset = 50.;
    +yoffset = 0.;
    +f = CoordinateTransformations.Translation(xoffset, yoffset);
    +polygon2 = GO.transform(f, polygon2);
    +plot!(polygon2)
    +fig

    Polygons can also be grouped together as a MultiPolygon.

    julia
    r = 5;
    +x = cos.(reverse(ϴ)) .* r .+ xoffset;
    +y = sin.(reverse(ϴ)) .* r .+ yoffset;
    +ring2 =  GI.LinearRing(GI.Point.(zip(x,y)));
    +polygon3 = GI.Polygon([ring2]);
    +multipolygon = GI.MultiPolygon([polygon2, polygon3])
    GeoInterface.Wrappers.MultiPolygon{false, false, Vector{GeoInterface.Wrappers.Polygon{false, false, T, Nothing, Nothing} where T}, Nothing, Nothing}(GeoInterface.Wrappers.Polygon{false, false, T, Nothing, Nothing} where T[GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticArraysCore.SVector{2, Float64}[[70.0, 0.0], [70.01098781325325, 0.0004397316773170068], [70.0438052480035, 0.0035114210915891397], [70.09801605542096, 0.011814947665167774], [70.17289902010158, 0.027886421973952302], [70.26745668457025, 0.05416726609360478], [70.38042741557976, 0.09297443860091348], [70.51030066635026, 0.1464721641710074], [70.65533525026046, 0.21664550952386064], [70.8135804051007, 0.30527612515520186]  …  [70.86641841658641, -0.3376428491230612], [70.70440582002419, -0.24279488312757858], [70.55494217175954, -0.16692537029320365], [70.42004014766201, -0.10832215707812454], [70.30151010318639, -0.0650624499034016], [70.20093817218219, -0.03503632062070827], [70.11966707868197, -0.01597247419241532], [70.05877989361332, -0.005465967083412071], [70.01908693278165, -0.0010075412835199304], [70.00111595449914, -1.4219350464667047e-5]], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticArraysCore.SVector{2, Float64}[[45.0, -5.0], [45.0, 5.0], [55.0, 5.0], [55.0, -5.0]], nothing, nothing)], nothing, nothing), GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}[GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.999974634566875, -0.01592650896568995), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.999565375483215, -0.06592462566760626), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.99865616402829, -0.11591614996189725), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.997247091122496, -0.16589608273778408), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.99533829767195, -0.2158594260436434), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.99292997455441, -0.2658011835867806), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.990022362600165, -0.31571636123306385), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.98661575256801, -0.3655999675063154), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.98271048511609, -0.41544701408748197), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.9783069507679, -0.46525251631344455), nothing)  …  GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.97976366505997, 0.4493927459900552), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.9840085315131, 0.3995734698458635), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.9877550012664, 0.3497142366876638), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.991002699676024, 0.299820032397223), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.99375130197483, 0.24989584635339165), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.99600053330489, 0.1999466709331708), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.997750168744936, 0.1499775010124783), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.99900003333289, 0.0999933334666654), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.999750002083324, 0.049999166670833324), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((55.0, 0.0), nothing)], nothing, nothing)], nothing, nothing)], nothing, nothing)

    Shift multipolygon up, to avoid plotting over our earlier results.

    julia
    xoffset = 0.;
    +yoffset = 50.;
    +f = CoordinateTransformations.Translation(xoffset, yoffset);
    +multipolygon = GO.transform(f, multipolygon);
    +plot!(multipolygon)
    +fig

    Great, now we can make Points, MultiPoints, Lines, LineStrings, Polygons (with holes), and MultiPolygons and modify them using [CoordinateTransformations] and [GeometryOps].

    Plot geometries on a map using GeoMakie and coordinate reference system (CRS)

    In geospatial sciences we often have data in one Coordinate Reference System (CRS) (source) and would like to display it in different (destination) CRS. GeoMakie allows us to do this by automatically projecting from source to destination CRS.

    Here, our source CRS is common geographic (i.e. coordinates of latitude and longitude), WGS84.

    julia
    source_crs1 = GFT.EPSG(4326)
    GeoFormatTypes.EPSG{1}((4326,))

    Now let's pick a destination CRS for displaying our map. Here we'll pick natearth2.

    julia
    destination_crs = "+proj=natearth2"
    "+proj=natearth2"

    Let's add land area for context. First, download and open the Natural Earth global land polygons at 110 m resolution.GeoMakie ships with this particular dataset, so we will access it from there.

    julia
    land_path = GeoMakie.assetpath("ne_110m_land.geojson")
    "/home/runner/.julia/packages/GeoMakie/t8Vkb/assets/ne_110m_land.geojson"

    Note

    Natural Earth has lots of other datasets, and there is a Julia package that provides an interface to it called NaturalEarth.jl.

    Read the land MultiPolygons as a GeoJSON.FeatureCollection.

    julia
    land_geo = GeoJSON.read(land_path)
    FeatureCollection with 127 Features

    We then need to create a figure with a GeoAxis that can handle the projection between source and destination CRS. For GeoMakie, source is the CRS of the input and dest is the CRS you want to visualize in.

    julia
    fig = Figure(size=(1000, 500));
    +ga = GeoAxis(
    +    fig[1, 1];
    +    source = source_crs1,
    +    dest = destination_crs,
    +    xticklabelsvisible = false,
    +    yticklabelsvisible = false,
    +);

    Plot land for context.

    julia
    poly!(ga, land_geo, color=:black)
    +fig

    Now let's plot a Polygon like before, but this time with a CRS that differs from our source data

    julia
    plot!(multipolygon; color = :green)
    +fig

    But what if we want to plot geometries with a different source CRS on the same figure?

    To show how to do this let's create a geometry with coordinates in UTM (Universal Transverse Mercator) zone 10N EPSG:32610.

    julia
    source_crs2 = GFT.EPSG(32610)
    GeoFormatTypes.EPSG{1}((32610,))

    Create a polygon (we're working in meters now, not latitude and longitude)

    julia
    r = 1000000;
    +ϴ = 0:0.01:2pi;
    +x = r .* cos.(ϴ).^3 .+ 500000;
    +y = r .* sin.(ϴ) .^ 3 .+5000000;
    629-element Vector{Float64}:
    + 5.0e6
    + 5.0e6
    + 5.00001e6
    +
    + 5.0e6
    + 5.0e6

    Now create a LinearRing from Points

    julia
    ring3 = GI.LinearRing(Point.(zip(x, y)))
    GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}(Point{2, Float64}[[1.5e6, 5.0e6], [1.4998500087497458e6, 5.000000999950001e6], [1.4994001399837343e6, 5.000007998400139e6], [1.4986507085647392e6, 5.000026987852369e6], [1.4976022389592e6, 5.000063948817746e6], [1.4962554647802354e6, 5.000124843834609e6], [1.4946113281484335e6, 5.000215611503127e6], [1.4926709788709967e6, 5.000342160541625e6], [1.4904357734399722e6, 5.000510363870095e6], [1.4879072738504685e6, 5.0007260527263e6]  …  [1.4870405593989636e6, 4.999194331880103e6], [1.4896621210021754e6, 4.999426363321033e6], [1.491990928929295e6, 4.999609061508909e6], [1.4940253560034204e6, 4.999748243174828e6], [1.4957639801366436e6, 4.999849768598615e6], [1.497205585568957e6, 4.999919535736425e6], [1.4983491639274692e6, 4.999963474314044e6], [1.4991939151049731e6, 4.999987539891298e6], [1.4997392479570867e6, 4.999997707902938e6], [1.499984780817334e6, 4.999999967681458e6]], nothing, nothing)

    Now create a Polygon from the LineRing

    julia
    polygon3 = GI.Polygon([ring3])
    GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}(Point{2, Float64}[[1.5e6, 5.0e6], [1.4998500087497458e6, 5.000000999950001e6], [1.4994001399837343e6, 5.000007998400139e6], [1.4986507085647392e6, 5.000026987852369e6], [1.4976022389592e6, 5.000063948817746e6], [1.4962554647802354e6, 5.000124843834609e6], [1.4946113281484335e6, 5.000215611503127e6], [1.4926709788709967e6, 5.000342160541625e6], [1.4904357734399722e6, 5.000510363870095e6], [1.4879072738504685e6, 5.0007260527263e6]  …  [1.4870405593989636e6, 4.999194331880103e6], [1.4896621210021754e6, 4.999426363321033e6], [1.491990928929295e6, 4.999609061508909e6], [1.4940253560034204e6, 4.999748243174828e6], [1.4957639801366436e6, 4.999849768598615e6], [1.497205585568957e6, 4.999919535736425e6], [1.4983491639274692e6, 4.999963474314044e6], [1.4991939151049731e6, 4.999987539891298e6], [1.4997392479570867e6, 4.999997707902938e6], [1.499984780817334e6, 4.999999967681458e6]], nothing, nothing)], nothing, nothing)

    Now plot on the existing GeoAxis.

    Note

    The keyword argument source is used to specify the source CRS of that particular plot, when plotting on an existing GeoAxis.

    julia
    plot!(ga,polygon3; color=:red, source = source_crs2)
    +fig

    Create geospatial geometries with embedded coordinate reference system information

    Great, we can make geometries and plot them on a map... now let's export the data to common geospatial data formats. To do this we now need to create geometries with embedded CRS information, making it a geospatial geometry. All that's needed is to include ; crs = crs as a keyword argument when constructing the geometry.

    Let's do this for a new Polygon

    julia
    r = 3;
    +k = 7;
    +ϴ = 0:0.01:2pi;
    +x = r .* (k + 1) .* cos.(ϴ) .- r .* cos.((k + 1) .* ϴ);
    +y = r .* (k + 1) .* sin.(ϴ) .- r .* sin.((k + 1) .* ϴ);
    +ring4 = GI.LinearRing(Point.(zip(x, y)))
    GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}(Point{2, Float64}[[21.0, 0.0], [21.00839489109211, 0.00025191811248184703], [21.033518309870985, 0.0020133807972559925], [21.075186885419612, 0.006784125578492062], [21.13309630561615, 0.016044338630866517], [21.206823267470536, 0.031245035570328428], [21.29582819010705, 0.053798628882221644], [21.39945867303846, 0.08506974233813636], [21.516953677609987, 0.12636633117296836], [21.64744840486518, 0.17893116483784577]  …  [21.69159119078359, -0.19823293781563178], [21.557153362189904, -0.14182952335952814], [21.43541888381864, -0.09707519809793252], [21.327284472232776, -0.06274967861547665], [21.233544778745394, -0.03756486776283019], [21.15488729606723, -0.020173244847778715], [21.091887951911644, -0.0091766360295773], [21.045007417743918, -0.0031353088009582475], [21.01458815628695, -0.0005773323690041465], [21.00085222666982, -8.14404531208901e-6]], nothing, nothing)

    But this time when we create the Polygon we need to specify the CRS at the time of creation, making it a geospatial polygon

    julia
    geopoly1 = GI.Polygon([ring4], crs = source_crs1)
    GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}}, Nothing, GeoFormatTypes.EPSG{1}}(GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}(Point{2, Float64}[[21.0, 0.0], [21.00839489109211, 0.00025191811248184703], [21.033518309870985, 0.0020133807972559925], [21.075186885419612, 0.006784125578492062], [21.13309630561615, 0.016044338630866517], [21.206823267470536, 0.031245035570328428], [21.29582819010705, 0.053798628882221644], [21.39945867303846, 0.08506974233813636], [21.516953677609987, 0.12636633117296836], [21.64744840486518, 0.17893116483784577]  …  [21.69159119078359, -0.19823293781563178], [21.557153362189904, -0.14182952335952814], [21.43541888381864, -0.09707519809793252], [21.327284472232776, -0.06274967861547665], [21.233544778745394, -0.03756486776283019], [21.15488729606723, -0.020173244847778715], [21.091887951911644, -0.0091766360295773], [21.045007417743918, -0.0031353088009582475], [21.01458815628695, -0.0005773323690041465], [21.00085222666982, -8.14404531208901e-6]], nothing, nothing)], nothing, GeoFormatTypes.EPSG{1}((4326,)))

    Note

    It is good practice to only include CRS information with the highest-level geometry. Not doing so can bloat the memory footprint of the geometry. CRS information can be included at the individual Point level but is discouraged.

    And let's create second Polygon by shifting the first using CoordinateTransformations

    julia
    xoffset = 20.;
    +yoffset = -25.;
    +f = CoordinateTransformations.Translation(xoffset, yoffset);
    +geopoly2 = GO.transform(f, geopoly1);
    GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, GeoFormatTypes.EPSG{1}}}, Nothing, GeoFormatTypes.EPSG{1}}(GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, GeoFormatTypes.EPSG{1}}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, GeoFormatTypes.EPSG{1}}(StaticArraysCore.SVector{2, Float64}[[41.0, -25.0], [41.00839489109211, -24.999748081887518], [41.033518309870985, -24.997986619202745], [41.07518688541961, -24.99321587442151], [41.13309630561615, -24.983955661369134], [41.20682326747054, -24.96875496442967], [41.295828190107045, -24.946201371117777], [41.39945867303846, -24.914930257661865], [41.51695367760999, -24.873633668827033], [41.64744840486518, -24.821068835162155]  …  [41.69159119078359, -25.198232937815632], [41.55715336218991, -25.14182952335953], [41.43541888381864, -25.097075198097933], [41.327284472232776, -25.062749678615475], [41.2335447787454, -25.037564867762832], [41.15488729606723, -25.02017324484778], [41.091887951911644, -25.009176636029576], [41.04500741774392, -25.003135308800957], [41.01458815628695, -25.000577332369005], [41.00085222666982, -25.000008144045314]], nothing, GeoFormatTypes.EPSG{1}((4326,)))], nothing, GeoFormatTypes.EPSG{1}((4326,)))

    Creating a table with attributes and geometry

    Typically, you'll also want to include attributes with your geometries. Attributes are simply data that are attributed to each geometry. The easiest way to do this is to create a table with a :geometry column. Let's do this using DataFrames.

    julia
    using DataFrames
    +df = DataFrame(geometry=[geopoly1, geopoly2])

    Now let's add a couple of attributes to the geometries. We do this using DataFrames' ! mutation syntax that allows you to add a new column to an existing data frame.

    julia
    df[!,:id] = ["a", "b"]
    +df[!, :name] = ["polygon 1", "polygon 2"]
    +df

    Saving your geospatial data

    There are Julia packages for most commonly used geographic data formats. Below, we show how to export that data to each of these.

    We begin with GeoJSON, which is a JSON format for geospatial feature collections. It's human-readable and widely supported by most web-based and desktop geospatial libraries.

    julia
    import GeoJSON
    +fn = "shapes.json"
    +GeoJSON.write(fn, df)
    "shapes.json"

    Now, let's save as a Shapefile. Shapefiles are actually a set of files (usually 4) that hold geometry information, a CRS, and additional attribute information as a separate table. When you give Shapefile.write a file name, it will write 4 files of the same name but with different extensions.

    julia
    import Shapefile
    +fn = "shapes.shp"
    +Shapefile.write(fn, df)
    20340

    Now, let's save as a GeoParquet. GeoParquet is a geospatial extension to the Parquet format, which is a high-performance data store. It's great for storing large amounts of data in a single file.

    julia
    import GeoParquet
    +fn = "shapes.parquet"
    +GeoParquet.write(fn, df, (:geometry,))
    "shapes.parquet"

    Finally, if there's no Julia-native package that can write data to your desired format (e.g. .gpkg, .gml, etc), you can use GeoDataFrames. This package uses the GDAL library under the hood which supports writing to nearly all geospatial formats.

    julia
    import GeoDataFrames
    +fn = "shapes.gpkg"
    +GeoDataFrames.write(fn, df)
    "shapes.gpkg"

    And there we go, you can now create mapped geometries from scratch, manipulate them, plot them on a map, and save them in multiple geospatial data formats.

    `,120)]))}const A=i(y,[["render",F]]);export{G as __pageData,A as default}; diff --git a/previews/PR239/assets/tutorials_creating_geometry.md.BW0vmesq.lean.js b/previews/PR239/assets/tutorials_creating_geometry.md.BW0vmesq.lean.js new file mode 100644 index 000000000..9097582fd --- /dev/null +++ b/previews/PR239/assets/tutorials_creating_geometry.md.BW0vmesq.lean.js @@ -0,0 +1,89 @@ +import{_ as i,c as a,a5 as e,o as t}from"./chunks/framework.onQNwZ2I.js";const n="/GeometryOps.jl/previews/PR239/assets/tfqfmef.Dz86q2IX.png",l="/GeometryOps.jl/previews/PR239/assets/ivowqmu.Cx40vhB3.png",p="/GeometryOps.jl/previews/PR239/assets/xetmrwv.0OJvb21A.png",h="/GeometryOps.jl/previews/PR239/assets/cthossd.DaovVbE6.png",o="/GeometryOps.jl/previews/PR239/assets/bnkpkoa.rOsRk89v.png",k="/GeometryOps.jl/previews/PR239/assets/krkgpps.4wfjCtJV.png",r="/GeometryOps.jl/previews/PR239/assets/rleiuex.3sfpQl2i.png",g="/GeometryOps.jl/previews/PR239/assets/fyfzmss.Dab1-ETk.png",d="/GeometryOps.jl/previews/PR239/assets/mtwzvwz.D9AE7i2o.png",E="/GeometryOps.jl/previews/PR239/assets/tstphwa.DTKLkKh_.png",c="/GeometryOps.jl/previews/PR239/assets/wjwdigs.0f3Lq4Lw.png",G=JSON.parse('{"title":"Creating Geometry","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/creating_geometry.md","filePath":"tutorials/creating_geometry.md","lastUpdated":null}'),y={name:"tutorials/creating_geometry.md"};function F(u,s,f,C,m,b){return t(),a("div",null,s[0]||(s[0]=[e(`

    Creating Geometry

    In this tutorial, we're going to:

    1. Create and plot geometries

    2. Plot geometries on a map using GeoMakie and coordinate reference system (CRS)

    3. Create geospatial geometries with embedded coordinate reference system information

    4. Assign attributes to geospatial geometries

    5. Save geospatial geometries to common geospatial file formats

    First, we load some required packages.

    julia
    # Geospatial packages from Julia
    +import GeoInterface as GI
    +import GeometryOps as GO
    +import GeoFormatTypes as GFT
    +using GeoJSON # to load some data
    +# Packages for coordinate transformation and projection
    +import CoordinateTransformations
    +import Proj
    +# Plotting
    +using CairoMakie
    +using GeoMakie

    Creating and plotting geometries

    Let's start by making a single Point.

    julia
    point = GI.Point(0, 0)
    GeoInterface.Wrappers.Point{false, false, Tuple{Int64, Int64}, Nothing}((0, 0), nothing)

    Now, let's plot our point.

    julia
    fig, ax, plt = plot(point)

    Let's create a set of points, and have a bit more fun with plotting.

    julia
    x = [-5, 0, 5, 0];
    +y = [0, -5, 0, 5];
    +points = GI.Point.(zip(x,y));
    +plot!(ax, points; marker = '✈', markersize = 30)
    +fig

    Points can be combined into a single MultiPoint geometry.

    julia
    x = [-5, -5, 5, 5];
    +y = [-5, 5, 5, -5];
    +multipoint = GI.MultiPoint(GI.Point.(zip(x, y)));
    +plot!(ax, multipoint; marker = '☁', markersize = 30)
    +fig

    Let's create a LineString connecting two points.

    julia
    p1 = GI.Point.(-5, 0);
    +p2 = GI.Point.(5, 0);
    +line = GI.LineString([p1,p2])
    +plot!(ax, line; color = :red)
    +fig

    Now, let's create a line connecting multiple points (i.e. a LineString). This time we get a bit more fancy with point creation.

    julia
    r = 2;
    +k = 10;
    +ϴ = 0:0.01:2pi;
    +x = r .* (k + 1) .* cos.(ϴ) .- r .* cos.((k + 1) .* ϴ);
    +y = r .* (k + 1) .* sin.(ϴ) .- r .* sin.((k + 1) .* ϴ);
    +lines = GI.LineString(GI.Point.(zip(x,y)));
    +plot!(ax, lines; linewidth = 5)
    +fig

    We can also create a single LinearRing trait, the building block of a polygon. A LinearRing is simply a LineString with the same beginning and endpoint, i.e., an arbitrary closed shape composed of point pairs.

    A LinearRing is composed of a series of points.

    julia
    ring1 = GI.LinearRing(GI.getpoint(lines));
    GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}[GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.0, 0.0), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.010987813253244, 0.0004397316773170068), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.043805248003498, 0.0035114210915891397), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.098016055420953, 0.011814947665167774), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.172899020101585, 0.027886421973952302), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.267456684570245, 0.05416726609360478), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.380427415579764, 0.09297443860091348), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.51030066635026, 0.1464721641710074), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.655335250260467, 0.21664550952386064), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.813580405100698, 0.30527612515520186), nothing)  …  GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.866418416586406, -0.3376428491230612), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.704405820024185, -0.24279488312757858), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.55494217175954, -0.16692537029320365), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.420040147662014, -0.10832215707812454), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.30151010318639, -0.0650624499034016), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.200938172182195, -0.03503632062070827), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.119667078681967, -0.01597247419241532), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.058779893613323, -0.005465967083412071), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.019086932781654, -0.0010075412835199304), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.001115954499138, -1.4219350464667047e-5), nothing)], nothing, nothing)

    Now, let's make the LinearRing into a Polygon.

    julia
    polygon1 = GI.Polygon([ring1]);
    GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}[GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.0, 0.0), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.010987813253244, 0.0004397316773170068), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.043805248003498, 0.0035114210915891397), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.098016055420953, 0.011814947665167774), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.172899020101585, 0.027886421973952302), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.267456684570245, 0.05416726609360478), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.380427415579764, 0.09297443860091348), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.51030066635026, 0.1464721641710074), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.655335250260467, 0.21664550952386064), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.813580405100698, 0.30527612515520186), nothing)  …  GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.866418416586406, -0.3376428491230612), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.704405820024185, -0.24279488312757858), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.55494217175954, -0.16692537029320365), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.420040147662014, -0.10832215707812454), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.30151010318639, -0.0650624499034016), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.200938172182195, -0.03503632062070827), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.119667078681967, -0.01597247419241532), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.058779893613323, -0.005465967083412071), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.019086932781654, -0.0010075412835199304), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.001115954499138, -1.4219350464667047e-5), nothing)], nothing, nothing)], nothing, nothing)

    Now, we can use GeometryOps and CoordinateTransformations to shift polygon1 up, to avoid plotting over our earlier results. This is done through the GeometryOps.transform function.

    julia
    xoffset = 0.;
    +yoffset = 50.;
    +f = CoordinateTransformations.Translation(xoffset, yoffset);
    +polygon1 = GO.transform(f, polygon1);
    +plot!(polygon1)
    +fig

    Polygons can contain "holes". The first LinearRing in a polygon is the exterior, and all subsequent LinearRings are treated as holes in the leading LinearRing.

    GeoInterface offers the GI.getexterior(poly) and GI.gethole(poly) methods to get the exterior ring and an iterable of holes, respectively.

    julia
    hole = GI.LinearRing(GI.getpoint(multipoint))
    +polygon2 = GI.Polygon([ring1, hole])
    GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, T, Nothing, Nothing} where T}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, T, Nothing, Nothing} where T[GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}[GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.0, 0.0), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.010987813253244, 0.0004397316773170068), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.043805248003498, 0.0035114210915891397), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.098016055420953, 0.011814947665167774), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.172899020101585, 0.027886421973952302), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.267456684570245, 0.05416726609360478), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.380427415579764, 0.09297443860091348), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.51030066635026, 0.1464721641710074), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.655335250260467, 0.21664550952386064), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.813580405100698, 0.30527612515520186), nothing)  …  GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.866418416586406, -0.3376428491230612), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.704405820024185, -0.24279488312757858), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.55494217175954, -0.16692537029320365), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.420040147662014, -0.10832215707812454), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.30151010318639, -0.0650624499034016), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.200938172182195, -0.03503632062070827), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.119667078681967, -0.01597247419241532), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.058779893613323, -0.005465967083412071), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.019086932781654, -0.0010075412835199304), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.001115954499138, -1.4219350464667047e-5), nothing)], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Int64, Int64}, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Point{false, false, Tuple{Int64, Int64}, Nothing}[GeoInterface.Wrappers.Point{false, false, Tuple{Int64, Int64}, Nothing}((-5, -5), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Int64, Int64}, Nothing}((-5, 5), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Int64, Int64}, Nothing}((5, 5), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Int64, Int64}, Nothing}((5, -5), nothing)], nothing, nothing)], nothing, nothing)

    Shift polygon2 to the right, to avoid plotting over our earlier results.

    julia
    xoffset = 50.;
    +yoffset = 0.;
    +f = CoordinateTransformations.Translation(xoffset, yoffset);
    +polygon2 = GO.transform(f, polygon2);
    +plot!(polygon2)
    +fig

    Polygons can also be grouped together as a MultiPolygon.

    julia
    r = 5;
    +x = cos.(reverse(ϴ)) .* r .+ xoffset;
    +y = sin.(reverse(ϴ)) .* r .+ yoffset;
    +ring2 =  GI.LinearRing(GI.Point.(zip(x,y)));
    +polygon3 = GI.Polygon([ring2]);
    +multipolygon = GI.MultiPolygon([polygon2, polygon3])
    GeoInterface.Wrappers.MultiPolygon{false, false, Vector{GeoInterface.Wrappers.Polygon{false, false, T, Nothing, Nothing} where T}, Nothing, Nothing}(GeoInterface.Wrappers.Polygon{false, false, T, Nothing, Nothing} where T[GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticArraysCore.SVector{2, Float64}[[70.0, 0.0], [70.01098781325325, 0.0004397316773170068], [70.0438052480035, 0.0035114210915891397], [70.09801605542096, 0.011814947665167774], [70.17289902010158, 0.027886421973952302], [70.26745668457025, 0.05416726609360478], [70.38042741557976, 0.09297443860091348], [70.51030066635026, 0.1464721641710074], [70.65533525026046, 0.21664550952386064], [70.8135804051007, 0.30527612515520186]  …  [70.86641841658641, -0.3376428491230612], [70.70440582002419, -0.24279488312757858], [70.55494217175954, -0.16692537029320365], [70.42004014766201, -0.10832215707812454], [70.30151010318639, -0.0650624499034016], [70.20093817218219, -0.03503632062070827], [70.11966707868197, -0.01597247419241532], [70.05877989361332, -0.005465967083412071], [70.01908693278165, -0.0010075412835199304], [70.00111595449914, -1.4219350464667047e-5]], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticArraysCore.SVector{2, Float64}[[45.0, -5.0], [45.0, 5.0], [55.0, 5.0], [55.0, -5.0]], nothing, nothing)], nothing, nothing), GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}[GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.999974634566875, -0.01592650896568995), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.999565375483215, -0.06592462566760626), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.99865616402829, -0.11591614996189725), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.997247091122496, -0.16589608273778408), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.99533829767195, -0.2158594260436434), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.99292997455441, -0.2658011835867806), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.990022362600165, -0.31571636123306385), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.98661575256801, -0.3655999675063154), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.98271048511609, -0.41544701408748197), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.9783069507679, -0.46525251631344455), nothing)  …  GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.97976366505997, 0.4493927459900552), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.9840085315131, 0.3995734698458635), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.9877550012664, 0.3497142366876638), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.991002699676024, 0.299820032397223), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.99375130197483, 0.24989584635339165), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.99600053330489, 0.1999466709331708), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.997750168744936, 0.1499775010124783), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.99900003333289, 0.0999933334666654), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.999750002083324, 0.049999166670833324), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((55.0, 0.0), nothing)], nothing, nothing)], nothing, nothing)], nothing, nothing)

    Shift multipolygon up, to avoid plotting over our earlier results.

    julia
    xoffset = 0.;
    +yoffset = 50.;
    +f = CoordinateTransformations.Translation(xoffset, yoffset);
    +multipolygon = GO.transform(f, multipolygon);
    +plot!(multipolygon)
    +fig

    Great, now we can make Points, MultiPoints, Lines, LineStrings, Polygons (with holes), and MultiPolygons and modify them using [CoordinateTransformations] and [GeometryOps].

    Plot geometries on a map using GeoMakie and coordinate reference system (CRS)

    In geospatial sciences we often have data in one Coordinate Reference System (CRS) (source) and would like to display it in different (destination) CRS. GeoMakie allows us to do this by automatically projecting from source to destination CRS.

    Here, our source CRS is common geographic (i.e. coordinates of latitude and longitude), WGS84.

    julia
    source_crs1 = GFT.EPSG(4326)
    GeoFormatTypes.EPSG{1}((4326,))

    Now let's pick a destination CRS for displaying our map. Here we'll pick natearth2.

    julia
    destination_crs = "+proj=natearth2"
    "+proj=natearth2"

    Let's add land area for context. First, download and open the Natural Earth global land polygons at 110 m resolution.GeoMakie ships with this particular dataset, so we will access it from there.

    julia
    land_path = GeoMakie.assetpath("ne_110m_land.geojson")
    "/home/runner/.julia/packages/GeoMakie/t8Vkb/assets/ne_110m_land.geojson"

    Note

    Natural Earth has lots of other datasets, and there is a Julia package that provides an interface to it called NaturalEarth.jl.

    Read the land MultiPolygons as a GeoJSON.FeatureCollection.

    julia
    land_geo = GeoJSON.read(land_path)
    FeatureCollection with 127 Features

    We then need to create a figure with a GeoAxis that can handle the projection between source and destination CRS. For GeoMakie, source is the CRS of the input and dest is the CRS you want to visualize in.

    julia
    fig = Figure(size=(1000, 500));
    +ga = GeoAxis(
    +    fig[1, 1];
    +    source = source_crs1,
    +    dest = destination_crs,
    +    xticklabelsvisible = false,
    +    yticklabelsvisible = false,
    +);

    Plot land for context.

    julia
    poly!(ga, land_geo, color=:black)
    +fig

    Now let's plot a Polygon like before, but this time with a CRS that differs from our source data

    julia
    plot!(multipolygon; color = :green)
    +fig

    But what if we want to plot geometries with a different source CRS on the same figure?

    To show how to do this let's create a geometry with coordinates in UTM (Universal Transverse Mercator) zone 10N EPSG:32610.

    julia
    source_crs2 = GFT.EPSG(32610)
    GeoFormatTypes.EPSG{1}((32610,))

    Create a polygon (we're working in meters now, not latitude and longitude)

    julia
    r = 1000000;
    +ϴ = 0:0.01:2pi;
    +x = r .* cos.(ϴ).^3 .+ 500000;
    +y = r .* sin.(ϴ) .^ 3 .+5000000;
    629-element Vector{Float64}:
    + 5.0e6
    + 5.0e6
    + 5.00001e6
    +
    + 5.0e6
    + 5.0e6

    Now create a LinearRing from Points

    julia
    ring3 = GI.LinearRing(Point.(zip(x, y)))
    GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}(Point{2, Float64}[[1.5e6, 5.0e6], [1.4998500087497458e6, 5.000000999950001e6], [1.4994001399837343e6, 5.000007998400139e6], [1.4986507085647392e6, 5.000026987852369e6], [1.4976022389592e6, 5.000063948817746e6], [1.4962554647802354e6, 5.000124843834609e6], [1.4946113281484335e6, 5.000215611503127e6], [1.4926709788709967e6, 5.000342160541625e6], [1.4904357734399722e6, 5.000510363870095e6], [1.4879072738504685e6, 5.0007260527263e6]  …  [1.4870405593989636e6, 4.999194331880103e6], [1.4896621210021754e6, 4.999426363321033e6], [1.491990928929295e6, 4.999609061508909e6], [1.4940253560034204e6, 4.999748243174828e6], [1.4957639801366436e6, 4.999849768598615e6], [1.497205585568957e6, 4.999919535736425e6], [1.4983491639274692e6, 4.999963474314044e6], [1.4991939151049731e6, 4.999987539891298e6], [1.4997392479570867e6, 4.999997707902938e6], [1.499984780817334e6, 4.999999967681458e6]], nothing, nothing)

    Now create a Polygon from the LineRing

    julia
    polygon3 = GI.Polygon([ring3])
    GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}(Point{2, Float64}[[1.5e6, 5.0e6], [1.4998500087497458e6, 5.000000999950001e6], [1.4994001399837343e6, 5.000007998400139e6], [1.4986507085647392e6, 5.000026987852369e6], [1.4976022389592e6, 5.000063948817746e6], [1.4962554647802354e6, 5.000124843834609e6], [1.4946113281484335e6, 5.000215611503127e6], [1.4926709788709967e6, 5.000342160541625e6], [1.4904357734399722e6, 5.000510363870095e6], [1.4879072738504685e6, 5.0007260527263e6]  …  [1.4870405593989636e6, 4.999194331880103e6], [1.4896621210021754e6, 4.999426363321033e6], [1.491990928929295e6, 4.999609061508909e6], [1.4940253560034204e6, 4.999748243174828e6], [1.4957639801366436e6, 4.999849768598615e6], [1.497205585568957e6, 4.999919535736425e6], [1.4983491639274692e6, 4.999963474314044e6], [1.4991939151049731e6, 4.999987539891298e6], [1.4997392479570867e6, 4.999997707902938e6], [1.499984780817334e6, 4.999999967681458e6]], nothing, nothing)], nothing, nothing)

    Now plot on the existing GeoAxis.

    Note

    The keyword argument source is used to specify the source CRS of that particular plot, when plotting on an existing GeoAxis.

    julia
    plot!(ga,polygon3; color=:red, source = source_crs2)
    +fig

    Create geospatial geometries with embedded coordinate reference system information

    Great, we can make geometries and plot them on a map... now let's export the data to common geospatial data formats. To do this we now need to create geometries with embedded CRS information, making it a geospatial geometry. All that's needed is to include ; crs = crs as a keyword argument when constructing the geometry.

    Let's do this for a new Polygon

    julia
    r = 3;
    +k = 7;
    +ϴ = 0:0.01:2pi;
    +x = r .* (k + 1) .* cos.(ϴ) .- r .* cos.((k + 1) .* ϴ);
    +y = r .* (k + 1) .* sin.(ϴ) .- r .* sin.((k + 1) .* ϴ);
    +ring4 = GI.LinearRing(Point.(zip(x, y)))
    GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}(Point{2, Float64}[[21.0, 0.0], [21.00839489109211, 0.00025191811248184703], [21.033518309870985, 0.0020133807972559925], [21.075186885419612, 0.006784125578492062], [21.13309630561615, 0.016044338630866517], [21.206823267470536, 0.031245035570328428], [21.29582819010705, 0.053798628882221644], [21.39945867303846, 0.08506974233813636], [21.516953677609987, 0.12636633117296836], [21.64744840486518, 0.17893116483784577]  …  [21.69159119078359, -0.19823293781563178], [21.557153362189904, -0.14182952335952814], [21.43541888381864, -0.09707519809793252], [21.327284472232776, -0.06274967861547665], [21.233544778745394, -0.03756486776283019], [21.15488729606723, -0.020173244847778715], [21.091887951911644, -0.0091766360295773], [21.045007417743918, -0.0031353088009582475], [21.01458815628695, -0.0005773323690041465], [21.00085222666982, -8.14404531208901e-6]], nothing, nothing)

    But this time when we create the Polygon we need to specify the CRS at the time of creation, making it a geospatial polygon

    julia
    geopoly1 = GI.Polygon([ring4], crs = source_crs1)
    GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}}, Nothing, GeoFormatTypes.EPSG{1}}(GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}(Point{2, Float64}[[21.0, 0.0], [21.00839489109211, 0.00025191811248184703], [21.033518309870985, 0.0020133807972559925], [21.075186885419612, 0.006784125578492062], [21.13309630561615, 0.016044338630866517], [21.206823267470536, 0.031245035570328428], [21.29582819010705, 0.053798628882221644], [21.39945867303846, 0.08506974233813636], [21.516953677609987, 0.12636633117296836], [21.64744840486518, 0.17893116483784577]  …  [21.69159119078359, -0.19823293781563178], [21.557153362189904, -0.14182952335952814], [21.43541888381864, -0.09707519809793252], [21.327284472232776, -0.06274967861547665], [21.233544778745394, -0.03756486776283019], [21.15488729606723, -0.020173244847778715], [21.091887951911644, -0.0091766360295773], [21.045007417743918, -0.0031353088009582475], [21.01458815628695, -0.0005773323690041465], [21.00085222666982, -8.14404531208901e-6]], nothing, nothing)], nothing, GeoFormatTypes.EPSG{1}((4326,)))

    Note

    It is good practice to only include CRS information with the highest-level geometry. Not doing so can bloat the memory footprint of the geometry. CRS information can be included at the individual Point level but is discouraged.

    And let's create second Polygon by shifting the first using CoordinateTransformations

    julia
    xoffset = 20.;
    +yoffset = -25.;
    +f = CoordinateTransformations.Translation(xoffset, yoffset);
    +geopoly2 = GO.transform(f, geopoly1);
    GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, GeoFormatTypes.EPSG{1}}}, Nothing, GeoFormatTypes.EPSG{1}}(GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, GeoFormatTypes.EPSG{1}}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, GeoFormatTypes.EPSG{1}}(StaticArraysCore.SVector{2, Float64}[[41.0, -25.0], [41.00839489109211, -24.999748081887518], [41.033518309870985, -24.997986619202745], [41.07518688541961, -24.99321587442151], [41.13309630561615, -24.983955661369134], [41.20682326747054, -24.96875496442967], [41.295828190107045, -24.946201371117777], [41.39945867303846, -24.914930257661865], [41.51695367760999, -24.873633668827033], [41.64744840486518, -24.821068835162155]  …  [41.69159119078359, -25.198232937815632], [41.55715336218991, -25.14182952335953], [41.43541888381864, -25.097075198097933], [41.327284472232776, -25.062749678615475], [41.2335447787454, -25.037564867762832], [41.15488729606723, -25.02017324484778], [41.091887951911644, -25.009176636029576], [41.04500741774392, -25.003135308800957], [41.01458815628695, -25.000577332369005], [41.00085222666982, -25.000008144045314]], nothing, GeoFormatTypes.EPSG{1}((4326,)))], nothing, GeoFormatTypes.EPSG{1}((4326,)))

    Creating a table with attributes and geometry

    Typically, you'll also want to include attributes with your geometries. Attributes are simply data that are attributed to each geometry. The easiest way to do this is to create a table with a :geometry column. Let's do this using DataFrames.

    julia
    using DataFrames
    +df = DataFrame(geometry=[geopoly1, geopoly2])

    Now let's add a couple of attributes to the geometries. We do this using DataFrames' ! mutation syntax that allows you to add a new column to an existing data frame.

    julia
    df[!,:id] = ["a", "b"]
    +df[!, :name] = ["polygon 1", "polygon 2"]
    +df

    Saving your geospatial data

    There are Julia packages for most commonly used geographic data formats. Below, we show how to export that data to each of these.

    We begin with GeoJSON, which is a JSON format for geospatial feature collections. It's human-readable and widely supported by most web-based and desktop geospatial libraries.

    julia
    import GeoJSON
    +fn = "shapes.json"
    +GeoJSON.write(fn, df)
    "shapes.json"

    Now, let's save as a Shapefile. Shapefiles are actually a set of files (usually 4) that hold geometry information, a CRS, and additional attribute information as a separate table. When you give Shapefile.write a file name, it will write 4 files of the same name but with different extensions.

    julia
    import Shapefile
    +fn = "shapes.shp"
    +Shapefile.write(fn, df)
    20340

    Now, let's save as a GeoParquet. GeoParquet is a geospatial extension to the Parquet format, which is a high-performance data store. It's great for storing large amounts of data in a single file.

    julia
    import GeoParquet
    +fn = "shapes.parquet"
    +GeoParquet.write(fn, df, (:geometry,))
    "shapes.parquet"

    Finally, if there's no Julia-native package that can write data to your desired format (e.g. .gpkg, .gml, etc), you can use GeoDataFrames. This package uses the GDAL library under the hood which supports writing to nearly all geospatial formats.

    julia
    import GeoDataFrames
    +fn = "shapes.gpkg"
    +GeoDataFrames.write(fn, df)
    "shapes.gpkg"

    And there we go, you can now create mapped geometries from scratch, manipulate them, plot them on a map, and save them in multiple geospatial data formats.

    `,120)]))}const A=i(y,[["render",F]]);export{G as __pageData,A as default}; diff --git a/previews/PR239/assets/tutorials_geodesic_paths.md.BlU0MlUq.js b/previews/PR239/assets/tutorials_geodesic_paths.md.BlU0MlUq.js new file mode 100644 index 000000000..020af8870 --- /dev/null +++ b/previews/PR239/assets/tutorials_geodesic_paths.md.BlU0MlUq.js @@ -0,0 +1,11 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const t="/GeometryOps.jl/previews/PR239/assets/chihpsx.CPClNl7F.png",o=JSON.parse('{"title":"Geodesic paths","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/geodesic_paths.md","filePath":"tutorials/geodesic_paths.md","lastUpdated":null}'),p={name:"tutorials/geodesic_paths.md"};function k(l,s,e,E,r,d){return h(),a("div",null,s[0]||(s[0]=[n(`

    Geodesic paths

    Geodesic paths are paths computed on an ellipsoid, as opposed to a plane.

    julia
    import GeometryOps as GO, GeoInterface as GI
    +using CairoMakie, GeoMakie
    +
    +
    +IAH = (-95.358421, 29.749907)
    +AMS = (4.897070, 52.377956)
    +
    +
    +fig, ga, _cp = lines(GeoMakie.coastlines(); axis = (; type = GeoAxis))
    +lines!(ga, GO.segmentize(GO.GeodesicSegments(; max_distance = 100_000), GI.LineString([IAH, AMS])); color = Makie.wong_colors()[2])
    +fig

    ',4)]))}const y=i(p,[["render",k]]);export{o as __pageData,y as default}; diff --git a/previews/PR239/assets/tutorials_geodesic_paths.md.BlU0MlUq.lean.js b/previews/PR239/assets/tutorials_geodesic_paths.md.BlU0MlUq.lean.js new file mode 100644 index 000000000..020af8870 --- /dev/null +++ b/previews/PR239/assets/tutorials_geodesic_paths.md.BlU0MlUq.lean.js @@ -0,0 +1,11 @@ +import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const t="/GeometryOps.jl/previews/PR239/assets/chihpsx.CPClNl7F.png",o=JSON.parse('{"title":"Geodesic paths","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/geodesic_paths.md","filePath":"tutorials/geodesic_paths.md","lastUpdated":null}'),p={name:"tutorials/geodesic_paths.md"};function k(l,s,e,E,r,d){return h(),a("div",null,s[0]||(s[0]=[n(`

    Geodesic paths

    Geodesic paths are paths computed on an ellipsoid, as opposed to a plane.

    julia
    import GeometryOps as GO, GeoInterface as GI
    +using CairoMakie, GeoMakie
    +
    +
    +IAH = (-95.358421, 29.749907)
    +AMS = (4.897070, 52.377956)
    +
    +
    +fig, ga, _cp = lines(GeoMakie.coastlines(); axis = (; type = GeoAxis))
    +lines!(ga, GO.segmentize(GO.GeodesicSegments(; max_distance = 100_000), GI.LineString([IAH, AMS])); color = Makie.wong_colors()[2])
    +fig

    ',4)]))}const y=i(p,[["render",k]]);export{o as __pageData,y as default}; diff --git a/previews/PR239/assets/tutorials_spatial_joins.md.B67GghbG.js b/previews/PR239/assets/tutorials_spatial_joins.md.B67GghbG.js new file mode 100644 index 000000000..2a0e89af6 --- /dev/null +++ b/previews/PR239/assets/tutorials_spatial_joins.md.B67GghbG.js @@ -0,0 +1,52 @@ +import{_ as l,c as t,j as i,a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const e="/GeometryOps.jl/previews/PR239/assets/kojydpc.3UVIT8DR.png",p="/GeometryOps.jl/previews/PR239/assets/izslanu.Cm_V2Vs0.png",k="/GeometryOps.jl/previews/PR239/assets/cfoowuw.BEoJ_XVP.png",C=JSON.parse('{"title":"Spatial joins","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/spatial_joins.md","filePath":"tutorials/spatial_joins.md","lastUpdated":null}'),r={name:"tutorials/spatial_joins.md"},E={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"6.307ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2787.7 1000","aria-hidden":"true"};function o(g,s,y,F,c,u){return h(),t("div",null,[s[12]||(s[12]=i("h1",{id:"Spatial-joins",tabindex:"-1"},[a("Spatial joins "),i("a",{class:"header-anchor",href:"#Spatial-joins","aria-label":'Permalink to "Spatial joins {#Spatial-joins}"'},"​")],-1)),i("p",null,[s[2]||(s[2]=a("Spatial joins are ")),s[3]||(s[3]=i("a",{href:"https://www.geeksforgeeks.org/sql-join-set-1-inner-left-right-and-full-joins/",target:"_blank",rel:"noreferrer"},"table joins",-1)),s[4]||(s[4]=a(" which are based not on equality, but on some predicate ")),i("mjx-container",E,[(h(),t("svg",d,s[0]||(s[0]=[n('',1)]))),s[1]||(s[1]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"p"),i("mo",{stretchy:"false"},"("),i("mi",null,"x"),i("mo",null,","),i("mi",null,"y"),i("mo",{stretchy:"false"},")")])],-1))]),s[5]||(s[5]=a(", which takes two geometries, and returns a value of either ")),s[6]||(s[6]=i("code",null,"true",-1)),s[7]||(s[7]=a(" or ")),s[8]||(s[8]=i("code",null,"false",-1)),s[9]||(s[9]=a(". For geometries, the ")),s[10]||(s[10]=i("a",{href:"https://en.wikipedia.org/wiki/DE-9IM",target:"_blank",rel:"noreferrer"},[i("code",null,"DE-9IM")],-1)),s[11]||(s[11]=a(" spatial relationship model is used to determine the spatial relationship between two geometries."))]),s[13]||(s[13]=n(`

    Spatial joins can be done between any geometry types (from geometrycollections to points), just as geometrical predicates can be evaluated on any geometries.

    In this tutorial, we will show how to perform a spatial join on first a toy dataset and then two Natural Earth datasets, to show how this can be used in the real world.

    In order to perform the spatial join, we use FlexiJoins.jl to perform the join, specifically using its by_pred joining method. This allows the user to specify a predicate in the following manner, for any kind of table join operation:

    julia
    using FlexiJoins
    +innerjoin((table1, table1),
    +    by_pred(:table1_column, predicate_function, :table2_column) # & add other conditions here
    +)
    +leftjoin((table1, table1),
    +    by_pred(:table1_column, predicate_function, :table2_column) # & add other conditions here
    +)
    +rightjoin((table1, table1),
    +    by_pred(:table1_column, predicate_function, :table2_column) # & add other conditions here
    +)
    +outerjoin((table1, table1),
    +    by_pred(:table1_column, predicate_function, :table2_column) # & add other conditions here
    +)

    We have enabled the use of all of GeometryOps' boolean comparisons here. These are:

    julia
    GO.contains, GO.within, GO.intersects, GO.touches, GO.crosses, GO.disjoint, GO.overlaps, GO.covers, GO.coveredby, GO.equals

    Tip

    Always place the dataframe with more complex geometries second, as that is the one which will be sorted into a tree.

    Simple example

    This example demonstrates how to perform a spatial join between two datasets: a set of polygons and a set of randomly generated points.

    The polygons are represented as a DataFrame with geometries and colors, while the points are stored in a separate DataFrame.

    The spatial join is performed using the contains predicate from GeometryOps, which checks if each point is contained within any of the polygons. The resulting joined DataFrame is then used to plot the points, colored according to the containing polygon.

    First, we generate our data. We create two triangle polygons which, together, span the rectangle (0, 0, 1, 1), and a set of points which are randomly distributed within this rectangle.

    julia
    import GeoInterface as GI, GeometryOps as GO
    +using FlexiJoins, DataFrames
    +
    +using CairoMakie, GeoInterfaceMakie
    +
    +pl = GI.Polygon([GI.LinearRing([(0, 0), (1, 0), (1, 1), (0, 0)])])
    +pu = GI.Polygon([GI.LinearRing([(0, 0), (0, 1), (1, 1), (0, 0)])])
    +poly_df = DataFrame(geometry = [pl, pu], color = [:red, :blue])
    +f, a, p = poly(poly_df.geometry; color = tuple.(poly_df.color, 0.3))

    Here, the upper polygon is blue, and the lower polygon is red. Keep this in mind!

    Now, we generate the points.

    julia
    points = tuple.(rand(1000), rand(1000))
    +points_df = DataFrame(geometry = points)
    +scatter!(points_df.geometry)
    +f

    You can see that they are evenly distributed around the box. But how do we know which points are in which polygons?

    We have to join the two dataframes based on which polygon (if any) each point lies within.

    Now, we can perform the "spatial join" using FlexiJoins. We are performing an outer join here

    julia
    @time joined_df = FlexiJoins.innerjoin(
    +    (points_df, poly_df),
    +    by_pred(:geometry, GO.within, :geometry)
    +)
    julia
    scatter!(a, joined_df.geometry; color = joined_df.color)
    +f

    Here, you can see that the colors were assigned appropriately to the scattered points!

    Real-world example

    Suppose I have a list of polygons representing administrative regions (or mining sites, or what have you), and I have a list of polygons for each country. I want to find the country each region is in.

    julia
    import GeoInterface as GI, GeometryOps as GO
    +using FlexiJoins, DataFrames, GADM # GADM gives us country and sublevel geometry
    +
    +using CairoMakie, GeoInterfaceMakie
    +
    +country_df = GADM.get.(["JPN", "USA", "IND", "DEU", "FRA"]) |> DataFrame
    +country_df.geometry = GI.GeometryCollection.(GO.tuples.(country_df.geom))
    +
    +state_doublets = [
    +    ("USA", "New York"),
    +    ("USA", "California"),
    +    ("IND", "Karnataka"),
    +    ("DEU", "Berlin"),
    +    ("FRA", "Grand Est"),
    +    ("JPN", "Tokyo"),
    +]
    +
    +state_full_df = (x -> GADM.get(x...)).(state_doublets) |> DataFrame
    +state_full_df.geom = GO.tuples.(only.(state_full_df.geom))
    +state_compact_df = state_full_df[:, [:geom, :NAME_1]]
    julia
    innerjoin((state_compact_df, country_df), by_pred(:geom, GO.within, :geometry))
    +innerjoin((state_compact_df,  view(country_df, 1:1, :)), by_pred(:geom, GO.within, :geometry))

    Warning

    This is how you would do this, but it doesn't work yet, since the GeometryOps predicates are quite slow on large polygons. If you try this, the code will continue to run for a very, very long time (it took 12 hours on my laptop, but with minimal CPU usage).

    Enabling custom predicates

    In case you want to use a custom predicate, you only need to define a method to tell FlexiJoins how to use it.

    For example, let's suppose you wanted to perform a spatial join on geometries which are some distance away from each other:

    julia
    my_predicate_function = <(5)  abs  GO.distance

    You would need to define FlexiJoins.supports_mode on your predicate:

    julia
    FlexiJoins.supports_mode(
    +    ::FlexiJoins.Mode.NestedLoopFast, 
    +    ::FlexiJoins.ByPred{typeof(my_predicate_function)}, 
    +    datas
    +) = true

    This will enable FlexiJoins to support your custom function, when it's passed to by_pred(:geometry, my_predicate_function, :geometry).

    `,37))])}const T=l(r,[["render",o]]);export{C as __pageData,T as default}; diff --git a/previews/PR239/assets/tutorials_spatial_joins.md.B67GghbG.lean.js b/previews/PR239/assets/tutorials_spatial_joins.md.B67GghbG.lean.js new file mode 100644 index 000000000..2a0e89af6 --- /dev/null +++ b/previews/PR239/assets/tutorials_spatial_joins.md.B67GghbG.lean.js @@ -0,0 +1,52 @@ +import{_ as l,c as t,j as i,a,a5 as n,o as h}from"./chunks/framework.onQNwZ2I.js";const e="/GeometryOps.jl/previews/PR239/assets/kojydpc.3UVIT8DR.png",p="/GeometryOps.jl/previews/PR239/assets/izslanu.Cm_V2Vs0.png",k="/GeometryOps.jl/previews/PR239/assets/cfoowuw.BEoJ_XVP.png",C=JSON.parse('{"title":"Spatial joins","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/spatial_joins.md","filePath":"tutorials/spatial_joins.md","lastUpdated":null}'),r={name:"tutorials/spatial_joins.md"},E={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"6.307ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2787.7 1000","aria-hidden":"true"};function o(g,s,y,F,c,u){return h(),t("div",null,[s[12]||(s[12]=i("h1",{id:"Spatial-joins",tabindex:"-1"},[a("Spatial joins "),i("a",{class:"header-anchor",href:"#Spatial-joins","aria-label":'Permalink to "Spatial joins {#Spatial-joins}"'},"​")],-1)),i("p",null,[s[2]||(s[2]=a("Spatial joins are ")),s[3]||(s[3]=i("a",{href:"https://www.geeksforgeeks.org/sql-join-set-1-inner-left-right-and-full-joins/",target:"_blank",rel:"noreferrer"},"table joins",-1)),s[4]||(s[4]=a(" which are based not on equality, but on some predicate ")),i("mjx-container",E,[(h(),t("svg",d,s[0]||(s[0]=[n('',1)]))),s[1]||(s[1]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"p"),i("mo",{stretchy:"false"},"("),i("mi",null,"x"),i("mo",null,","),i("mi",null,"y"),i("mo",{stretchy:"false"},")")])],-1))]),s[5]||(s[5]=a(", which takes two geometries, and returns a value of either ")),s[6]||(s[6]=i("code",null,"true",-1)),s[7]||(s[7]=a(" or ")),s[8]||(s[8]=i("code",null,"false",-1)),s[9]||(s[9]=a(". For geometries, the ")),s[10]||(s[10]=i("a",{href:"https://en.wikipedia.org/wiki/DE-9IM",target:"_blank",rel:"noreferrer"},[i("code",null,"DE-9IM")],-1)),s[11]||(s[11]=a(" spatial relationship model is used to determine the spatial relationship between two geometries."))]),s[13]||(s[13]=n(`

    Spatial joins can be done between any geometry types (from geometrycollections to points), just as geometrical predicates can be evaluated on any geometries.

    In this tutorial, we will show how to perform a spatial join on first a toy dataset and then two Natural Earth datasets, to show how this can be used in the real world.

    In order to perform the spatial join, we use FlexiJoins.jl to perform the join, specifically using its by_pred joining method. This allows the user to specify a predicate in the following manner, for any kind of table join operation:

    julia
    using FlexiJoins
    +innerjoin((table1, table1),
    +    by_pred(:table1_column, predicate_function, :table2_column) # & add other conditions here
    +)
    +leftjoin((table1, table1),
    +    by_pred(:table1_column, predicate_function, :table2_column) # & add other conditions here
    +)
    +rightjoin((table1, table1),
    +    by_pred(:table1_column, predicate_function, :table2_column) # & add other conditions here
    +)
    +outerjoin((table1, table1),
    +    by_pred(:table1_column, predicate_function, :table2_column) # & add other conditions here
    +)

    We have enabled the use of all of GeometryOps' boolean comparisons here. These are:

    julia
    GO.contains, GO.within, GO.intersects, GO.touches, GO.crosses, GO.disjoint, GO.overlaps, GO.covers, GO.coveredby, GO.equals

    Tip

    Always place the dataframe with more complex geometries second, as that is the one which will be sorted into a tree.

    Simple example

    This example demonstrates how to perform a spatial join between two datasets: a set of polygons and a set of randomly generated points.

    The polygons are represented as a DataFrame with geometries and colors, while the points are stored in a separate DataFrame.

    The spatial join is performed using the contains predicate from GeometryOps, which checks if each point is contained within any of the polygons. The resulting joined DataFrame is then used to plot the points, colored according to the containing polygon.

    First, we generate our data. We create two triangle polygons which, together, span the rectangle (0, 0, 1, 1), and a set of points which are randomly distributed within this rectangle.

    julia
    import GeoInterface as GI, GeometryOps as GO
    +using FlexiJoins, DataFrames
    +
    +using CairoMakie, GeoInterfaceMakie
    +
    +pl = GI.Polygon([GI.LinearRing([(0, 0), (1, 0), (1, 1), (0, 0)])])
    +pu = GI.Polygon([GI.LinearRing([(0, 0), (0, 1), (1, 1), (0, 0)])])
    +poly_df = DataFrame(geometry = [pl, pu], color = [:red, :blue])
    +f, a, p = poly(poly_df.geometry; color = tuple.(poly_df.color, 0.3))

    Here, the upper polygon is blue, and the lower polygon is red. Keep this in mind!

    Now, we generate the points.

    julia
    points = tuple.(rand(1000), rand(1000))
    +points_df = DataFrame(geometry = points)
    +scatter!(points_df.geometry)
    +f

    You can see that they are evenly distributed around the box. But how do we know which points are in which polygons?

    We have to join the two dataframes based on which polygon (if any) each point lies within.

    Now, we can perform the "spatial join" using FlexiJoins. We are performing an outer join here

    julia
    @time joined_df = FlexiJoins.innerjoin(
    +    (points_df, poly_df),
    +    by_pred(:geometry, GO.within, :geometry)
    +)
    julia
    scatter!(a, joined_df.geometry; color = joined_df.color)
    +f

    Here, you can see that the colors were assigned appropriately to the scattered points!

    Real-world example

    Suppose I have a list of polygons representing administrative regions (or mining sites, or what have you), and I have a list of polygons for each country. I want to find the country each region is in.

    julia
    import GeoInterface as GI, GeometryOps as GO
    +using FlexiJoins, DataFrames, GADM # GADM gives us country and sublevel geometry
    +
    +using CairoMakie, GeoInterfaceMakie
    +
    +country_df = GADM.get.(["JPN", "USA", "IND", "DEU", "FRA"]) |> DataFrame
    +country_df.geometry = GI.GeometryCollection.(GO.tuples.(country_df.geom))
    +
    +state_doublets = [
    +    ("USA", "New York"),
    +    ("USA", "California"),
    +    ("IND", "Karnataka"),
    +    ("DEU", "Berlin"),
    +    ("FRA", "Grand Est"),
    +    ("JPN", "Tokyo"),
    +]
    +
    +state_full_df = (x -> GADM.get(x...)).(state_doublets) |> DataFrame
    +state_full_df.geom = GO.tuples.(only.(state_full_df.geom))
    +state_compact_df = state_full_df[:, [:geom, :NAME_1]]
    julia
    innerjoin((state_compact_df, country_df), by_pred(:geom, GO.within, :geometry))
    +innerjoin((state_compact_df,  view(country_df, 1:1, :)), by_pred(:geom, GO.within, :geometry))

    Warning

    This is how you would do this, but it doesn't work yet, since the GeometryOps predicates are quite slow on large polygons. If you try this, the code will continue to run for a very, very long time (it took 12 hours on my laptop, but with minimal CPU usage).

    Enabling custom predicates

    In case you want to use a custom predicate, you only need to define a method to tell FlexiJoins how to use it.

    For example, let's suppose you wanted to perform a spatial join on geometries which are some distance away from each other:

    julia
    my_predicate_function = <(5)  abs  GO.distance

    You would need to define FlexiJoins.supports_mode on your predicate:

    julia
    FlexiJoins.supports_mode(
    +    ::FlexiJoins.Mode.NestedLoopFast, 
    +    ::FlexiJoins.ByPred{typeof(my_predicate_function)}, 
    +    datas
    +) = true

    This will enable FlexiJoins to support your custom function, when it's passed to by_pred(:geometry, my_predicate_function, :geometry).

    `,37))])}const T=l(r,[["render",o]]);export{C as __pageData,T as default}; diff --git a/previews/PR239/assets/twuyjor.DYrZOYql.png b/previews/PR239/assets/twuyjor.DYrZOYql.png new file mode 100644 index 0000000000000000000000000000000000000000..45c3ba24a07f9cc84ffecd103568c19f52260d46 GIT binary patch literal 72147 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 literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/umfmfiz.Da39FuJg.png b/previews/PR239/assets/umfmfiz.Da39FuJg.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f00422a1dc312f5d9dc19fe12b8c101dae7595 GIT binary patch literal 75505 zcmeFZbyt;Z+dgV7#Xyi$R1if#Kv25DDU#AD64KI2N*hQcDk32v-5{lupii+RY{wSqpExU`%gp4UFOS| z^`BvG@mupn+JZrMN2a!#*tzWNTwH(Hy&d}5*5Z1{p)3|(j@R9l&dm9}|MRotyrd+_ zzaL+wl9Lk;a>tIF=l1yi`(cOfft`&1e!Bad@c+LJSK|Mf3-Wo;4xbgN!fGnf)7v|- zxK`2|MR$fK*o^zwqKb@+jIwe*&CqVVW$-RbWV3Yz=`YLmsRSP;iokVYQTq0eA3qKc zSIUJmD=8`Qb!0tz_UzZMTP||d-dlA1Haffg_qGa&h!inAVvz9e&CiMMXuURbDTiK0O`Yc<9ifoZQ?BmwDa! zR+PzIWqNm#ub0=B`wXv~elodiYh&X_#vtxI(<2>9=T)jzS6jM*K$@DGntQE?`NDK)E)$uePrXUogWTVDv+cf7omTf7hN6L*QaOu}c;lc74N z_k=r|gNKLb+_~w`6|S){W@cs{t3UJ$P32noaYUKw>4gj~KZeVm)2SuzC8HnC(qx}Z z>^d6OEq2q!#&h;l?)vhq&#(HOJ9fNd!Sd*djbPWNJ9?D$`M!Pow%2F#g@lCWKD>N+ zYLBmO^XO>x>lZ2qnU&-9?Bed<-?egCKtMq10S-uonuH{Ah4knJN#^j@c(E7yQO}7l za|?@f^UIkUF_Dpx2?_c6`SzBU*YXX-=)+d;9ltKO>)xsJ=UZ!QQ;cf-goQQfvd%{~ zA3S)_(a~|jp$wP$;lnGvecwH{|9WX@JufROD=BfNc1@M#pqcvijf#e5W_r3eTRZ>K zgS`w(CT#5N%}q@d!F8`+zpk&Z&x&~#5uvH8JM-;ZN`AiKv(~35 zRjsK^Bf%ROW!Zv z?0Cs|*-v9^MwFS^{OgB@a}?Irv*Qh6?76Yg(L$D8OfHRI-anu{uUnhROcD6#q=?I8 zOEfK)K?jA2$+&8=G_K1~ef=a3xyZcLxKF};DI<&TLap&and20JK%f`BqoStv;n{II zI^zAZAFVQJc*MuYr&&I~IMq(eq4SP&VR3PGwA$zP?S+xI9_?`=kx!oznp<02_4V}9 z6kqV)`E?_;qAON|P0Vq!Wx6{(LBfZVCOF!Gho|W9N#Q#l9%LtlH7wt){N38X;S?w^ zE5&}Km!hMiD>rYYb9smZ=CvQ$Yz$|?nyPS|dZfXYI+1(*4LzFx2TQ=2H&eTPq! zI?vMBQY5sy-n#W`X=(HC#?RK47OLZm6Oo2Aw6r{AVxponTm~F8!DKk4%|8p@zM1Og zrKk73u^(L+Z&;n}Q(k-%FkbPq%42bobn%t#(CZicwn;t-;$AWFGbrCVMKyKxXmuz2 zRf(-7bqx)wiVq(i9+cSLbWHUhdSz5oV%-x&8v{KF)iRFH8OJ-@lJiF?j2~+%B=LSLR?AMlZ(JbN5s3by{j_ zGYbozv-yVAO0u#yM=HyVC$7J-d+WUwqu-UO&Y~2Dd+52nwHg>0I7hfAdF$K9C$oL| z+vp#j;t55RE?;VCPMoMTt_vzI=B-O_YHIpWLww-JE}Z|PMvy*3lLjh>9&}bkrCiV>|ba!(L5H?($a<5fpue#|GjXN@ljfurg;Vq z4%{2g*K~Ecee(6n)TV_PXlWY`<)cn){12aOix+FoBR_gHgYA^4&tFe>cj3iX`V}q# zd(ldY$qPdWpUq57YrR>i4p_9tl-wSdPSviru^*|7<~9q;Y7^7^qHkoErl}f&)7(4GpJZ)n)^O z&$m5S(5&Hy_WVk!5S;cBQxlt^D|0LA>;xr_xEq#l=~a<8y{p1!eT!*u`bh zdgHQ=dT-da#_(;d%$vwOuo)N_I7rL+t))ZV3d==1foKM0^rMz?(O3@_uX& zPgZzsyzZ(vw6L%+ck?khw@v>mvLQhfUPd^v@ZQsN$XvU2t$=~^`fCm*CaIdYa;dnR zk+_R*2)0Kr8t+M$vXo?vkVjz*oPDs5%-k^G;GX-}ip(>^IDaoL@-@ad;=6G_HH|`& ziY(gyu1zIOXbn}mIimHg3s1EtXzP7@sdxMKZM5v}SA}|`qN<9*}=i#Q@&w-m6DE5|NPLK-afbA-x_~UH23zcNphS&zp*r3!+Gx9xxjz` zm7K=1To=Zt)PA9GdxxxaO* z`T6;vEt5x&9${8ZEv_9oa)ft%;?NUKH0$Nr{Az~-%gf8?AA0)wq=ycD&z=m){aogl z9vP{PTh%*vjg^Xm@W;~|{V6Uk?jga*$%!|;)uC(?oxsk{ZsvGn0j_|Ovi=*p&-Ee4 z#=n1OB`10M^r=#U_(_zmDEkxH*I1Qqi<1XVUO9LD`Vg8l+Ml@hrcUq7JcevuULMLq zL0OrMjBJXxWLSjcYF`2t=ZhED0X0mFjgyj+1l2d%Vug6jTcU!hoULqzOP{nc>Q&xZ z*jW7;{Ts{8XZ5q|lD)7p@WWRDyWt!5Xy}6#uJ&z*QT&bG{Uz4gn&H}5BwxDy?vh(Y z>v2{)Of(gmH49GQ9Oh~-h`7vs(YWR8j5B8uVV{f>ah+^WXs^<1YiwNG_*u=@IN5$w z+*2^T@c}u|4c3gHkdokAcGBbgb6u$i7hjc@{^>6;iT#YT-ikEzHY&76AO5vE>J!;$ zI&<9d%e$RzUoIa%{sQZ`w7k5_Kb%FGxF%djy=WO2+U*t%eYQ%xHe8lP>_3+;50+S? z87eZ!Gd)FHVGzCZSbqvX%(x~6P+B@ocTM2ZUsZ|}_gcRiE4YALXzqIbp`TxqX(1c4 zVH|#~EU_iEVVSBnZC|~WCU~^Bv-5VtqmwNPk3vIn02~`9l@t}JN%mwpgmb$u&k(s;jT}l^37%FB!IPn{Fqb?+|E z4E6XGV&9?h3n8?wVeQZsa_GFe@xgaLI)03Vk2s4p38U#)ZD7l2K|z6Xg1DK4wXLn! z(s$K1y8SWTEG{UmSSz8!eqQWs1sq&ggMNGphd z50R2$K!4({x!ho0hwnq$YX!2f(>JmnkXh>LcRBa%};C?Mb?@J`M^ z;^lqH%F2^p(Ut_M&D&xvZ{Ex(H3BHbI&0>1Lw9+Y*L?EiNueWsShiPAA6dM>&K@i_ z_JnmQ?^YTu1wqhSK?M+8MMCx`E?4Yx4>z|G%Wmm{wA9oIT$zEh+|gIJma2jB&T&pB zrl&VFMzE2SP&vNU`iNS>n10_Fz;o-%yX)K80CSo`O(@&OYeOBl&*3~p_*Lwhv+rZ` z)|lJ!8fV?j{`~pF%4ub6ZQUGwmn}j*LDWsnu32JF-3z+d%vZ4ndakak^6BCKp`(SJ z1e|tkX>Ap-A8Gk9@|7c3n&fN9SB=GIdYoa89_6X*7VPWZb?*xhQOji|r6={F#~saQ z#k@D8wq9NKKP*q1*U{ISe7OcVlGRIo zp*!>$r3eB$=^j>K5OdtPF#)B0b(nLm?dimlCda!~0+{Yd>S`n}@kc z`MSLXH)_(yRG}w?)GXaRJvT8RS*}KP0C}PrZY{P;OicE4>XjA!<;_v&1oGFkSM61< zoJlIZD~}%QD14TQ>6M5LDJdy+%a8K>ztAP4!(h|H@jSP0X*wda+^a3c zc$VUKFnHfhp*_ATj(()awK~ZI#!M?!^v1#zFDjUxr7&OmIXc?k9~H;J%gbBrJo{j_nGsMx0f&@NA}@)O&}z06X#(9Yi8I6mu7A;);o*vYA=sOadj zc%8{LwX|N}`ud@xqa)1tWaYDGRGP{_N4K@kFn9t@`C&Md5ug>d2e={a@ijz{c%5u5KjpS zV_I5T?Cl3uAGFIw-?GJOD?WS6%crb4rm4*(o-hi84fg2g@1G#%;qocxTF^PM%&soA zx`^YmX+1p}nwGNE68DKL``6yg`eQA6y1MTFgL4apB=9|L(?p$VaPLk=9E~+2If1J0 zM7k;WF^jL4=))SWNfR!|&Q4pj$BX&=jTQUa+S?mZWW@kUfPJOr<44)li-{U+n$^-t z#znn761T^IxE2(%cLE8wTO{h|h|=d{MN9nsV*=W;JljXhsdp0{WZ>6Cb0pvBpgeh? z)KpuX`ntx+HIk!HB4X7sV4m^ZBmXy8b`Xz=xKPgxys>BS;A9vFy4$~h|J+lpTwP7O zZw8o(b`!8&|y z`}t82#>U41%0F;k_wjntmHU)hT3SKdg}9cIL#IyphTRPgKFD(0 z?9!$8zy(5L_BhYQ#l>+O5zDTWrjyUwr#w77iWK_UHx|}BHD^1|?F~v-PB17kCl!er zeq*0dU0uDt_t%}u{glkN4peXas1R}e@k$|H%!A)xG@EU#Cvl7w@orm}lg?~cm_?kL8Ue#Y;mB4B-H8(G`D0cVo z(DsTrf@A*E&zO10^TZ?+9=G47E^_ErIKK+lpCeUX8=!GO^Q@e8Kd{2Bu8As!9KAS( zKbB9J=}g{NvHdvLYhwi{F1CK|f4Yc%xziI_CZJKeJQV@6re~;uf(-&lw1n5X6VwZB zZEY{Ft&EI}ePr|jQm0q6fC2%(Kbda#+CgqXwV6e3E_Ev#85sddWEobAhc&RXu?2;O zzP%`io1`-2gkqXl1v@>n~osNUV*U3FO8%Zd|Y(EFQF?Pxjtg2hfN$ zN;(umi`lf}{#|l$8X`L3w;ja%8F*M%SI7A8B`?s~*Ejmw_C<^)LsKu#nprW1RdFKe zudzD-!5Qh0FHXlmSskURpEq}PIc%*j69t8a<7%0_r-?5@ua?4d4%O;!TmIu;zjosO z;C^yr2yeO*{csMn_Z*>Q2t(yqH5 zBO_G~j@Cr1O8I~>`B&$!#YOel@U)2M#oU(w3H&g@j~kiaW z9}(hh{PS~SqQrB}fz*EmUsIRY6H`02h&h~NzU*=ZlMy^7J7Q;E#1|q;naina1Ck`x z9nbu^zPmejKg$!5aQfci(5{SY)v=d^!tke z54cb<(b1Wsw}wk^ALqAG(R=>5tFON-(cw4WJTqzF| zxJ?6M_PoGNm=d+Nv&);j6?$CY2i7K0>QJc(o<4F$8c>1(AfJ`>JKn|}9YStwWb}1n z0&PDBQV+P9RUrdG7VQI#hmL}RSOlnGQ&ZE9x47Cs_j&pixX4+JM~uzQ>)m>@m?eb; z1#el+%xL|&{-M6!983(d5|MfU_Mw@eBSc%Qd3uL4D-OP~mw=W84phfKJ2T@j`0m^?2o#EDhy_}OyA8?UJnqp~NNSLmGOS+Nm2m}; zcU5_Lth63ZCH>KpNhxwByG!^4%DD8_*IgC00|U`Tg2cvu^E^EZ?XGtXSD^1rP0h~E zzIgG%=OyDUP`{1wFo`ICoHcGBFE@8qhf<1~C9d3)Cr3n_+}4-Qu}mr6xl_uV9j%bs z_2B~{`l`95<(eu}5C=Ou`?+&Rg6p7hV01BDd69_|prNL|NCtTS#%ADyXiB;vR-u(x zVg{XBX0bvf=iCL94XUH8q@M|gl_An`nS?<=OzbV$TjQPj`f(R;yt^AD{lJ%8JR!fo z4dT!(`KFVk&2x%1G0wh;iAMT|quFxzDphBNH%~ysoO>E}_8}QQsAtC>-yJiU2~dxU z6q-(QxueqBVkjM_+H61NL>sq4WnH<9Vnah}dQBx+*3qG|@_}g{6s#*nZk~@Q{Lawe zGuQ&9k~Fim3M|&I>FA(PvPaoOL|*WiWtW!TL2r+}{S-K)+-rls!t~3#dzyCK@3sSi zf^=Wo9IMzfZHiC1O9~%ETS}_-YmNVe!x{*nAp6HKI=-x7CU#7o3Di!1Fu9+fA5p|? zdUlSJlM}s#k@0I!ruz2Z4K5FMb@lG@BCVaCb3~<&A`l!qDLHu{J*lcn++vUoUqQq? zJM=Jorw&b~goK2kXtjP!Vn*mgEdZhEf2bTU`ZeT?+4$lbV1r%%E2Fcz2Vb%Z3k!2{ zDiwG_`~&vk8>Po*WfaXc8DHDsd?KM8GTbPi+)jCtXbAG)%)D2Vp?(!%QD-b``;?mfwW&=`~&-dW^@se_$Xpt2^n+K?#ZKFJEpb zE4RBO}$&RzI?@@9ym;BtCZgj@B|Up&2~i*?|>3 zTIqI%A`l;AVP*yj#1%qC90~t7%j(cE;xEwo)JRCsfAK1&+C}*H!;bS0?~?!fNm7CF z6cLU8fBd%TPcFN^bU%xVg2HiGvpwd;3+NnBi0jSG&G`n{mK_`&p&&|=9J^@jTTpP@ zR=|H2EYO$S)zuZ%tvCbaDiaeI@;21vyxOnE|6X8eSd#1oLd5g&q#`H(ux|mM@8jdM z>(41^v`0e}(@)jN*?z6ej(Da`#j;O!T zOkr`d^~gUP(DMU6&>wg>HG4xMJz9gUwYfRG(NryS31b1nT{}K?4?Ls@Od)vCknC|Ns~omc%hWhU zu5q*d>{%jPUR=i?=Hy&0(Bq8MUg`*vS5RPIZ+iui7I?aKw%N20OHQ8QF!A$ePGR~C zN_mig?R}SJ4#y$S|N2@3xf%)_{I#a0EHDc!@*jQq3}Fo>R^lEjHs}-3&e81@6%>dn zBS0|(tk95<7y)~6*auL7+38nXqIsb7y086C)nMZj5Lo>mxxcrVhl$A)`T&+NS}W!n zG(Yt7sEa0h6WT4bD=?u^)E>(-d`2I9yVI4?1|%+CROO5mu6YLa9Nj4hcC# z2*7&7e5K*g>A>CQJS7DM zgjojgMz=+CVD8CGC>bwbzC>x9zgGC|TVr_fSscolGiOenI)!-y$cy?7mrq4g^nDEJ z@ztwWs6f#3>({PX{(b}uNOqh*q{@CNPEKBa5GxSt>9x&3SBC1Do}!!^X7N7R7=`VuWg4$D&1-ZG_PG7z(u(uI)dNh6p{yD zTnPBzEI@Ly>-^vq?V|o-OLaRtPIX7XC|)|7zP!&^v@l+(Alus8+uxIXg-Ki|Z8umP zDE$C+{290bDmJhbAg~mP8>T|ewIZs9Gy~K)u9tec(p%?QEj_(q2xPXlw)+`zeG&xh z<8yQ8@9o})zCthVDZ4uhA}N5s<)5@%0C+yW-k~9widz8NFjap*4r65E=2o+mY<~XY z#YU^ZXi948v7<*hbc??y`1~yca0hn>Vth#W3K^Z6#j(m`mGji8cOO0&gMHq+caI2L zU){J@RaGU+^m}zREFhrc)c~>PR0Iozw%T>{Z{nwro61`AC5B~RUQa2U(c zxdX~Zkj3e^%n#NbdSHW55A_;;BV&Yoa#9l5LDL8myv_c8fWd(2{NopH+|A4T0eO@? zLLQ1Vps);yoRSjQ2QOm^ludw6hzU%-f+8Xwckc8L4S{06=>CHlT;oqhNq`5u3G=;c znI|?j7L0ZP;23tud4B$trU>@fi1h;p58`~PAV99a!p#Pgh!%0>WUT%8@jFNkRAwe$ zNFPKC2Iv7z295|_Rl=@&H{dd$pQMt(&0B{8%cWOJWE-bXj{!G3>87cnO;eKW0Vsw3 z>*(y9`mn974Rv{3!rK$wQd076dOFMe+Z0$^92^{w*lQ}kqE4Yyt>RAqx9dI5v^`cR z*{GQ~4__W8kTH7d5Vh)|?U_%xL|<@oYpc7vTPBpwd1daJwYBvMb0{4jo#>rcV~50m z1BDBDSy*HiBvCYGVIxewOEbN}KkiL4ir)HiSL!qvIPvH^Pt{=2M0b1?bo%~Sh4tIw zTJ`4dgBE;spssL7W629G+UeW0up+TEO(Hv#M9Zl|_eRIyNSS>*p5(<`xOnmF(jKq{ zPW^H;p#X9Rh(?;n0Xa`fc*l}+JA9L6rb~ej14~DlBrq(j8g{BhO@8&?7)tL7=YL#1hJQ@ULyj%E~G$Pf@{MvH>2BwG$x7qCvqM%F^!?m*n^I@7(5iC`9>VbWUhY_Hgt)X1q)# zP*7NyWZwrgrePcP?3tAM(?`d6q!$J-3h>LY&DFC-knFVz{ysaW{++?<(Z8IHGlO5q z2mcbg&+w3AZXa0u{X1UNtRZM}af4`>?cuIq?On&?JN+y;2yERz*o8n@P@_iyA75)7>%s%IO zUm0CqIn5Bej&)+SZu75je_WO%DXDL6&V~nn?AS4)7ZI7SQ*ht>Gw+29--pW_(F-6K z11^ru%m_mjmv@z0xKoMhC#D{#s91AVG&E|@K@EnW!pgy+p}UO{x)heRx?!oLY4V*z z3cN&+@@e6#SEqafq>=y_gugz1P<5isTGd%_GC=+Tkx}pXqXTJZ@Y|O!?*dEX#l7T{ z-@~CJx-ROyahgJK=ujo-9O~;i#%>tDJlx!ZapoaV6^TRe@JSI}9u2X;SwaB7 z%;IA5&lNzw+?*W2>)^&SL|bp&9GnHN=TTvYUetMv;qiYLm!pNzchJ<@T7h`@chKqp z!1gnuAYE_Ymb-d27O)87)^S)U2?^U!^}&_U7^7ai@b~rI1epVb94L3T4yHNJ=3Wc! zROto(`7>us;I=xEWoBkNQ6vMT0htNKJ^uUmFMh3{sHhL20TdEQH68(&^meSGT-}l& z&QWa>^Y-|+P;5ZyaF)Ed5Em~#;qM4XejbUycoZ$s|moK#$L3vk?-EUgK9@X?19P2$(FqRpwED^o-mgp+y*o++#aii z_yyvH3;{X~9cg(*g<npK06L|zvOS^&80DHR;#TJ7E}MUD zue-c;TlABDfYypzqld8Aa`itllW|S7OwVA*c8AL8ix(F#N`MbBL}!4JD6=75K);KM zj@G>W{y|Dg3N9lxE$vW$zthi=&o~UPE##*_?0|JBDZ^n?Y9%=q(m||1Hg9Rk378O4 zrv`6Pum+nKzycJbTI1UwQlE#1p&R$u6Gro%KBa&yk7?3rBT2l@zY5STi9hUknR>zW z-@4iHe~9(|AEDa+uYc(?J6nN&*LTOuJXQ|MpI(nW=gnNy;_v3ySX-K`n+-{iiww*z zO0-t-#_MtB&-4G!n|rE`2MSR>5^v+6aA+Fh=iaceilq6(T+)?A_P-h19d1i`FWXl< zQjIgaEKZ&epilXbel`USZTr^7g?{i)fCgZ)**yxyiE7@7~-RI2|U#FYD^e5ku zm7u|fw!eZ#0!a7Yu6spAjsRTxcb@L#T4;+!I+R%xGj6;9wqnNWc=pXCFGoEj68g$RAe{5+kCj$-Q!w%my)cD!5Or~ z@$Q|ZZX&vBX)a%0c_Yq37t9WTm7?El@+v zhYLfDX50)fuEoIKM@lEP9ePVpP;hSK?R5^C>;XOIZ~(d-;wO)8LXkuIM5|a%b5jy( zlBR9*_yR6zL&&l4s3@IIEw87DN=%D5LWFQ&Z>X)^+{FCb-ducmkoKmWPQMT505B)J z`*-<-J25ix=$}Ev77LL82w1tG>d~V%L=&PPKYp1u0E7rAt_XO}QwHJeA zrpc3YreEtEwu4()v*w>`@jwPuu`Mht6n6d5vZ>N}eHlW@&F(Z($DxS!DPnY?mp;$n zt(BEk)26h`Ophfl-pI%Z(ULB@4jc(8W;K!p4W*kDl2%5VE`U{HA|svMpSeD?F{S$6Tq9Y}W({NBFxva(|HxW2rwyQaIFhl?x! zsr@jERbQU|)f=dwQ4}cPC~7VX}(E6Nr)haV0dAPw0uZos|gG#GGjsmlrW|FM>A z{Wz|;>qAApqjg1U?;+^d8eza}lUDPKT3}Jy*w|bpxyZ{~>H0H%j2<{c%7@O` z*_kK_V*acYfqEdXYvH{KVSv|0$I>#htW1cpwzXAJu>|^9R~#|l^!yOLXw-Aow`+sM zs5I?5>O&*v*N}a6r^P?|sgB05GW@t`7Xc{4cbl4l!3Sa*Y@G|^WC-7|hBrppM*lH_ zR53?7J~oC~whXg(Xkei80F22jiF*b<0noG=Ux}kHNveAIua+# zPCfYA_Ba()ZJs(za`*(31UHDvF#i^ptM3Me1tB3F z;)ne@$j@iuARR`pxcezQ8{ITC?)^{5QUQ*<{ z%qGjFP^KH>Bpr2(GyIuX>F(YM#|QgK(0KE+l&)PnMoC%NP{O@X1N0hU7X_2)^p`((cZ$Rc9 z;+ys$Z*++_wMgjmRcRzv%S7q^;91xe#3+5w8a9=GYYqgFHOn0z$nHg zT=w1hxkiRvkDaCl>nU7)B7=hzg`|e00^1RCt*zSRokmwAL;|I{iY%1N+kxYPD9=%qMPGa$W$x|u3b2FI$f2|aLPJ3a2@Rd5jwgn8 zcEL+``mPHFg3rcOkzzu;jdUi#J;)E z#`o!_LxCn5X6?sr>&j4(C`=7YSUY_Tn=_Q!9-rTSFLKA;#=G8M@Wflyq(A2zkp=3U zHEFY4oatqE*B?od3oqn$cD;!Cc{5)DfU&pFRAXWHd4W@iJS~0lTkkwjlFE_Jy6`bh zCRkZ~ePYiRSJ$>i*MR@n)0yh)8i{vRRL}1Ez!rb!chg>9*rX{9CqYQoV=UTY6ZwdV zKhAX5)}?)o4lIRj>vzpY(1FPR5wEawfM|;7#~-Skd5~GgUp!M#{8R^ z)h|DPDo;JN9jUy=rWt)aCKnA1bldkaC5sYk?ky;z0Ko*3?#L@7x1F6!h%DaM-`{bj zJ3AVTr7MIFtODJ3?f|GEk_e}L@3^~Lb$y7@c<#w4@XG&!*fV`rTG|NFp~sZ{mzi6# zM{0T(94}u+t~J>wB`ridi(4_gC#A`R&6Faz*^zcD*0_arbCl znf{>X8L~a5N<+1WMm%-xwnUxk1vkf>;U68@H!|uSJ%KzzOz(V^|CET%g)cw zPqn^~A!%%B5p`d>>CBt(ILqrLa`Kb^sm3%HyF@Te)!H6p3s7Xtk&1B$zfKn~VdfBu}Bl3A1}(%h=eE`|h2PC(*d`_DMp zG9To=UQ8>(N03Jf3W}Qu0V!U+%H+$c*l-1c5EORAP2@Eno$XMGmU_-ko=Z2}^+8r{ zhC9poa?x3XR!y;u1#AZUwO_uCEAG}@fy!z1b(^c}8r0u&|G8U#>gjnFM?;X2NjI$a_I->>qoty{FoA3a6O%7FH>_o1hvZ{H(4}9*)L0fK zyrQm-Ny^#A|K6~COeLhY%l|exP?N4X{&nVWSz=;N4#&Dbru&sQae}u`D_(oQ6x4H) z((a^!XF~GQxqDKg>-CATg)s9fGR)e z;r-Ia^ejO2&NK~<$ZXn&K!qHMYK&DOja+kW{-cqI183zEsHsT|7|2*k-pEI*u*QNC z0_(zs6;cLbe+{VlKe+;VQ`2t%ke~AO0mPeH_NQlgk7+6)&4bJa2_y0rJxsdEt?=M5 zJ(JIRisS0}krQ(am7)=@v&7bq_aMakGKln(c^yHnN|Gs(a%wNL1+%NAk!_YvLrvr(wCSx|uY_QKc|LO@{Pex6@f9g#e8dW^_jN+oCR zmIu#xZ|)&G!voi=GM3u=MSAZ@348ZLC2eiZ9d3ed0e2p+mKh%|!>W|*2XM#KrVDqT zfTvR&EG{ZqN#_y5zI9Lf%9YNMcRtCi7V`z-=@dm1@o#sSFQCrJbe2ig-1F)@N zyo|FI3?le;U+s3MkA1-RneR)^1@0>*qm<#oUY`dNUAxz}Vsp(`tsK0}SC5N}*~}jM zWM?h$SouP|<~V#xU|TGOEi#GCmsyW=I1ZDL2;Ta#Ls8tw&Q2Uj5_l7#aa>X7xw(Hs z!y!3vfP!QXP9InUNwlAyo}RpGxyHzl<>?fRVd^h27bho=l< z51!fT&rxibiHwbH8CI?G*%oI^f#2=aG3~FlKADoDl6>jreeH>`IFIe0r?>om#LTs3 zOyAL8d~U_&Nj2r?j?HdZt!V;tkf8L-$ezU?MLO)i|Ne9G>+)aZ<(eNJvWV$9q!i5c zrftO6-!oo1vhL)}kk>$I?z-^O<>{WxaApw=DdoKcSxBM0!zsYpXf?p_paE9BBA!Ph z{zwAsUO>Vw`YN1yZ0T_>kqZ3~X?gY>UFeSXP)~ikxZ)0rvzc`Bt(B>9fe)l5I5k(- zm#qyANAKR<;oeE4xbP!E7bd2rh#Lh>>O&G;BeU*|6~My27{2w4h&#joixe{9+b^}B z5&28BhWGE^&*c+Cq6XF8V$fkBGG*siar5yl|0cfZF5K7=K6ijkk(tG9*At!f1QC&S z&yxx!Vkhat$VUXVH*V)q(^LF@(v^4j*T*MkX4tV=^p2aG*qvW@&zB~DNe_-sZr(HElON3hvl-3r_GX)lcZlhlAUYG>E3ZZx55MOu5Wl$4gIN|tCGB@(Q z3uLjRO|a1D8?j@W9G2A(*9fWU9ntfWl&xqE2$DMtw&B$A^0b76gzz{!3yVKFVPE}C zVn;_r3j1oDE|X%%=Q%dE8Hl~8f}aQ`sw???M(U^iTck;`CD>FwGciCP`U`;Bmptt^ zl4O58tH9IY0V35)!UzKbt|$zpBk6oE=avHtU1_te?UR;{*2zN=eu;bU)^;r`jg=`Z~3| z$Qn=~)|a}QP`S&zyhl`YyT;<;J-O9{@No6{os6n0_n;3vLS9;5O-pM9mko8;`J)yi zzx$dMgD$$q+`j$2B?6bM;w6jjstlveju$V%$rO5t0d`DtN0!}yp0^Gih$rtvr z5z3;k0VIS^szwk$M(Dq9)fPEueTuqi``zmctE=EgLVxE4D1%mk92X1_OcHR5c<~7& z-(2SUckbS+k-@NwwLs&!A=~q&zm%kOvx}{y%T{mXO0ER&`T*eu@ji90ld$FKNR^^4 z7{N`2e0kvTVFPUW!@fyG6fmg<6e7iuB>|x_F6jUCX$72q;n%N#u&_};aut;h@O^Bk z<2#mxyfolpd~|f<)FRp>l!Wu-B-r>?0hj{L0m2j`rb7Bsw{d@F{3x0Ep5U%a*N6eB zaIvQ*IQylfghy+c>4cl0h*W! z@2eeIjcjZx@gX=+!^%6VHDv<78jt_9nzG98WF0&2I{Ga#Ql_W7PPc|JIU#eN zo@rY@IE?&hRMbZ%6H{KRo`7rfk&s3b7w3-Q>!BuEnYXYfRgdC7mcC-+qG0p{HsT09 zs6iqDM$=^i0sA=KVy}Svu_JVJ@|5+gk7!eGO6ut9uH$Us3jsi>Gf^P7$;HK$)&_Up z8>SA{3Z(PwY=tw@;t7T(lq94tLiA2Ji;lUDWNUorR{ zI`-kvk}(x6EpE*wY#;2cM2Z5NQB?T6B*mCT#{7TKGx<7Y*uN=GE*A|7`LguKBU)}| zwx2HAtFO?1UAX0TulAS4H7tGz|4Z7+PhPw@F5*GS_zg>9j$)FhchmC*=hF0R^vsIe z4~90x(DfaBa)f$3U!to888YLA(K(Asg|+OIq;+QT`Rj6KI@01cuT9-&hDz@LnQW|2 zCRp;CHuk@l54Y+iOxs-Dz54+mv%jBTm(L$fiG_Z6vhtB9yY`69B8*_h9qq?MF@3Dr z)3Fc*xduf4=g&veLb#s@0b#IpCcMCJz>R>=OX~enJ?DZRQkZw03L{rA@!G9F-<17f zA#k5BM8w|<3!SfigN=W4D1$bDa~Kf&iHg}83+BT1Ngp_YAQv4zU6{1R)!5ivZ9zub zhb%T6Dzq^$bmcf8JK*|XFR@CUDVJi4K!)T|-f~aQHJ*L@{IlA#{j3t#bXG*~-I@I?Ff(g& zVkGT>{_<6|l9G~CA0{RyR`VrdbJSmqyFL5qd|TM_xHu@`CwM+5=>aP&1wB5d?)ANc zQTS;%a8ur$P6up6A*^6 zXn+3rq2xh=(1o5!_ubH#N8PW|^rEyW-e`Kox$E=K^ybH>&@yzEA+eok<-UeBSXo(# zRSy|4d#&Wu@lXb&OssAwS^BTLOw^k{^Urmx&KAMG)7NIJW_ffEBV%5bl)&vWRhx0V z#m#esASx=_f7v6deF@vf=nVeAh~x2R_8rE~v(eE6bqi!UBMy>8c)tXyjS!K`igQyC zS$s|xw_n(Ov**;=>Bxb(%0a8rH!(e>w@p$fKyeR}l6oypN>o446kT8ojV}PN5*Pnl z)ZSF)CEdxRwdKTk@?;!@LE_FubbU9lZRB477*w>h_>lmBE$C2m(OL*5m=5zf>h1Ij z9c`J0E*)iUnW25d-eWtBAfFAKS;kKKlr-)w>0iHpt8IES@Z0pSElxQ)IN%;hd3-}o z)KaMvBHS%D*Y6$g8ynBTOlM`4^^%OjKG$!Jl&KSE7)^f-Q=%Jn%kVg%x7&6yDrV zNr$bt1xR$~SFOt{?tYoK)>-4WUGt5iH&D9TrZ1yB=@LN}s=+h^wnLbuYv}z+M8pg| z0tPDPY4nr<1tAPSS%(!;{S!pfQfYc-5Pg4x-*GDB{N;lKSG z6BH5F`;Q8HUDNM8wU*IF%7@KdK+qINkAD1iD2KdEPpL0%7GdMK^6F1-o)r1#Dn!lH z?VUY-wB5e9f-bBd6cXe38=mcumS$CWR|b33HWJaQT90BclrWSl#YeK~9!RCcxRhbI zj-#bc_GI4V)v=K1kT3c%`IP#vnqCUGS88B#gxkTP7@MblQA~$VIOQ-q3Tf9-=66Ne zC!+sCaE1;iEOme27tRM}QDJd$iuDMagNqCB!zRcJmqF!GTG~}?HYtBz^IAzYjvzhj z_2uEuS(^2yL{ajO21LoX>4i{7>MWuo0`ShuNK{=T5M^qpS3%3uqNfoBT%I?2egT?7 z-dNGqdefMn#lu^IA|l;(^-xe(r@Q^vnu-bw2eB18FOO64{$Q#Ct$9)p1d@Rbqvy_D zy}h4Be&dqO4DE1kt+P1hC!x=Lkc;hapHWS#=)DYgG8vy4@L9B`rd(0Les_b^ z^z?2D;qMR0xvhFK90VdE?e#}gRe59c)0G#(*xN%0z!1O|m%pUaQc@WMzMR)Op&~;a z?pg-$tOGP1?N$v?LT!7!l~u7S%Dex<{0`Mkt_{Mz%nSMMWZDhwp{1pQd=jLG z2HkFAD*~q}r!*j5rulXABccfRD#mDpcm4PCdhE5!D_m-u?caWJ8BGWFdI*|3mtrkM zT#q(4AFF)(U@z%uUu244u3LJSV%MQ%S0$VGODD5u4nFI%X=C4FS(@8K*C%|(d^%@2 z4=gHVt=?*J{fULsl-n{qUgf^bcHYRYHDf&{H9KA@R`7{<&Uzr8Ml-EB2J+kdd3SP7 zPRsCcEcw{KP2)|u?ZcC$PSX_U6Z@QDzaf&_>eo`-3$kiGB5Hf)sVq-$Q`Z57X`la6 zdp#MKR5z%8*k}ghmUj=-%WEGlDJn{KeHOj2cZrO+dqjT`%-#1fBI3)|^xPim?keS! zE_}g4ik-mFPc z-K9fE4m=F1DG&s}g57jZ$%r`0U4JT(Aok$Xq%UrVX1+u}gN#>{(3O}C5WD@17>7jM zS$z{-si(azJy;op8yi+0kYk5Tir_$qK|1!(M;&JF>+L=7dU9pZ_`6_>)lJ`fpCw(i z7~>7Zx?Q}rF8`SRuD!_gChYsL%7aG*Tx@JvwGJ*$(Uj=OFz+-?!n3ZNIaB0Q{pat- zrytDa+X<@#|AvhZnTp?NtG4Kbw10k;esn_4UJJ+jX4vRm_22bu<3vPt8Ks!RiE-Pl zN$j=&xTYj-x_;yC^I_)qK3z-ZM_Rd)WUp;zKbnNbb$5xFilI1j zHk!$aiB87-*yK>0GQ(mpfvue#feJui>;lm$SFav=%Vs@Lc($nN$XhB7JjCPgW?77F zG!t)3I!`aZ8O60c$yz2VKAw)=LEj{Kud&P0d<`us+7T^-gM-*i6&)R~G@G4uwRyt9 z&A@;@d@LtvpV@&3=4v&j@W%QuhH8M)^~dc~#GpAMsbKjCNWzdL)0d4T?}8SHn|j`` zN>p6j07*1Cza{x>q@S<9`MbTD1X+hjv%qnHL7^gR^64ZfdL25%*I1{wI-IgHa5m}t z(wOm++D|PnljEYr4gF<(cggWFSmU`Uc+LnIrZ^tvfak76jhH_I+rlH5E@tim%88~l z$0l*uklfL8FuvY;t`%aWb%}vr2duQi3MB?gA_PZ4odI$2CF69kI6w{FYKXd zW2y6=xo84x40S}5-u~lb#+KIrDMz!~NHw8iVR!M1@NnYP2Rg}!$%&7P6GME-{Qz!$ z?3#fwjVMv>0#``0@;()JsC{Y?yYE&D;=LKv3RKiKN9A}$2^=9yPAS~?BsD5>v&i{6 zrAj0v|1h+)QeVD&IhFb*8KZjW-^40zRoN3cOE0t3j#`&e@++Cs;ZH%_A&{W(xI0f> zk zl)9YU8wpny@Ow%Ar!DSpAd1yTg_1wL z_Ox%2j3L~keb|kKCuA|+v27!lmCwpZ-?>*4Y8wTCxRvtaMP6;5o4meO+S&L&&><_c*5MWcBw)$Ug_ zbv=}&eM+9lAnzh@y{22&533t;79O8L4DZ7`T6w!VB4S({FjLpw)ZCn|_~P}=&eIjC z-w@BmgRio-r|I3lCnBj=Rb1?ZJzJ>a^4YwKq>^A8$hy(O&RJU_#3Sz0chx_${hQ^F z?_k_{UPXmpEae4RzWoMHb4H33`rg%WLih3?9jeezI@SgjH(zbLlwj-Tww4-cunw9e z?fBupgEW;(T?&MNgPf(3&nLb+-X7x;-Poq(GdS-2)U0fMsvOVe*?d#IWqXRebS#J+ z(S4^HQUQ(aTlO)NED4_6wu8JIxjzT3^XFmqE;opw-CjwvMJ70ZCqvFo_;q@Y38bq^*N{-xH))1vAgOCcCx)w zr}0u4hQ3nFXtdNSG{{n}gp?GbgLcdOuWg4Vw%6LP+m)H2$3foM{`}Ls57gMPO(-2m z13KEM*Xn1Cl@DKEbx(WZ$w_Z)hgPt^8BadY_OU|2Ep*B-Y;8_Sz$os+c@%>w@wAH; zp?QNPpm!O1Eo(X@)IojS{<~T&P}To)zj)$Gx~G55`|2%|!D^psuknHgdXKq+hMD6l zaB-0E6k0F21NuEzog0UkR?j(hc5BphpPpkYAT)q2fUJejLu~fgK%Kvq&VE7Z`E?-S z6EU-Wvop!hr-D7d(gA(A^Zz31yW^?u-~U@g)}dsNV-&Kpx05Y zW$!IAlD#5Z2se@~l2O9%dh_`{e)r@4zV4be8cW}?W z0A;9c7}kRiiz!Gca$Juqq}mZW4-|y&c7njzLD2P-+^sSvL<^`R9AsGTfq?}#OI>nj z7~mgQfaoBAEiH8dv%Kqq)REuwScsXJa+%~GD)095oEWf7&*!xCq>YZqyDK5Y-5z>) zW6V(W{z7-m?l?jU^0@b`>N}*T*BI87k#dMJ(fy+8>GG2IFypv$9xHh{Yi6$c*+H?Y z?+?rb7;8oAV3D-5*L95fkw_WL?>8PFIv#L?F;jfm^q*}`@>OrM-)rOBv3DQE1EB2WL<5Cn_#l?J1~$#3iORn7KP@8E3K!5ous>O?O<|(Gv*);QbRI z)9H>CfrGAxRb!?Fj;V_<$HER17KWoRE7w-ow-6}!(|MBNYV{oORv^e+**aR#*u+;` zN$2OgdiZUSx9+!zx4b2+BG6%)hKkJLnlTvEMu0@c8202$-9sH0H@8!d>vwMf;CBy9 z{mxVtBqauBir+(74A_RjVhx={5G0rjx=swW+TU|B^wP1Poz46=1DEW6{hgSacpaDC zvPQE*1nyd~^SHT`%{oqeXuZ-C=ej94F}(jS=N$ivYXk;?0~DwMDg!gFeZ>+y9w_@j z3cLuLWy+yOVhqB5KrSF&tpN{<;rV{k!s7*iyn*Xl-oyR+xt=s2TYzbbJ^N|u)P#dn z#X=oemHXBlXr@8Mv>0s|1ji}P?No6lZidO^Zxj9l`&?n2WhcOr`vo@tBcBVlX=VEm zFs<>KmQ-iO9bC_7^>RpZ8B`u1i6bHeG;V9vI}<1pjGf!A_TFUkDL92(_I< zI4Njs$9&nvN!55P$~wup9cE>2%N-CCgcv=^Wd`R`^qV*4jj6-JT5e1{^^leODkfId zUn)j$3rcG2fg1+#0)y8kQm_MxB21A=NDblcnke8GkRlnWHoc7(85@gmz3QNkFl>|H zc!3>7o(wDlL~>Bl(-=maZ`C7_v$@vrYM@+dkw6^thvJMnybEhS z!LBKx*PfR&>?U}B-)lT>KrsmlR`p>%xp{nngo6Kk&@Kjn_v}(lphC;r4M?O!_i_xa z@G=Nn465u#AkG0n67oZa#L4xe-AP9pVx$HxFeAV8YBHsSlL+Nth`VC+1sic^WK{N+ zfwJ{+cYLX7>54+8Cu6X{4w|+ncqBUpwm0~SpE>;EiNA`XSW?9IrH71TqHlKI=&0H4>m8(5W zkqNJC)`?od>Mo`{EB3a4CF~YjH}UK>U{94$IDwX{4883QNwc-2(mtZ@-6mi%HsY_E zhQ-+?fVFGfpL>1074D-eosy8?xtRPE(jl^V&Ywpm;pH-G@v(Z;{VyjXjhfWu`;=Y9 zEL1uLF5%CHKdN26hL(du9U8}at;2o5N`X?(g{^^!N-r3M)%SF(je-De3U-p(0d4BF zC9gJ=q`n9igGSPZvK=frRIgEUk?S1FA{p3>;H@ZDRdB;-(5+x66V`15C{k!!uYuMZ;woipt!$MP(4MA+FT+*z>F)S#IlNsgGG z&k2I7aBTRSA#8Z)sI=F<6J#N7kx1%#|9hh$wd^E%dP02 zxJ%O!5G5|XHP(0}C@t*+kFTEgTrKfAw1-k$3UN2FWF*;ANmb?mJFukwSGUR2sVYR+ zOf~MW*T?d5{)1s?-X0vJ!aqoXC_D}4H!{;{Y5z47@Z45YBMNA7TUZ5n5d1O$P1k&n zLzs1h(hnTzyN(Uy4vD0$lMdA;K8HJHK}fZ@$Tc6i@JH0q*iDb*htv;WzTdeHd_vHY z&B)jIHUj8BOd^QE?Lm3zYOSfEAq*&Y!|y@pI7sk*+}#)7s4*Wew}d2B97|UpZXH+# zIBj@LYAf5@rSWPH0*1dxjC#4iHcEM$-x*1f_iEL^>H zsBsq~LVE;H0=!b=`xsJ@m5^*}XnB^a*0w*dQ>vspyXhJ;8X2buT7ec$0=oe*6I! z+WMEg7ZZt2|9(LpKR#9ggH$vyl4@bD;VPXJ_p{KdbhhI9=pc^?dPT<1ckA>kTAG+^ z?f?7A1^5d6=~MQH)CvSp@36N+B2Q}D18>4-1U{C?&$s08<3*TG+K*z0jtCMbJ887D z41TM*YH^dm(aTSR$W|NERkP_?sD zJ2sAt-}$uhX>HJWzSFnc7{ad&Sg^?3jZmx>WK>^}(F2KX{P+usC$CKV17By4IBBen z6@2~b>DLo3vsy&`Z^*1};m3b(eu7xvG!N+a^6A$_wBYO7r(ajcgRfJZjzM+?_O|wE z^ZMoBD{c~Zkp?8ZB;zkSbNZEec%nYYbikiKIj3Q7+ha}}Q^tlK>i%D2uBdcYN=f)2 zKMjM97m=O*)L#>mO@8`xO&<8lqtgbgD8LiLPo5}42T!@W8FCJOnHxmL?{MMtmkfrn zdZa?7~Ek&6~bGP$wz zl!r+oGAc6siN9t?bK)FJ4##KEs$W7@pR|1HgK=>0+ATP_F_xQ4pn-s^ZHFawp?oY2`t+ z(N4G;wQRer6ybZaynRR4z7>D8Isf->Qq-G4$w`_-_Xy4Zee$`o@NS=2-Yj1u!xNQ< zFJ;qD2h!+z54h+?@=A@4x_f3O6)QAuEopti3^&Z>?B&fpp&x1F{9FZ`X@>?J?PNpx z>(3oV9{IEehIOesOSwG%a!fU@mW^X}SN^n7LbbLrxJ>N>f74BKqBb5YMY)J%dcUu* zxT7o+n<=%fqv-PGS8m5w)4r@{jm!7aifuQU0Ysn*+Dw zbf8#-dwF|a8tstrQ#}&=h(;Tpu32Ty%*2HzrAloURtqO%cSJV)OjkZf;T`|*=!i&G z_Mr@I3~tA(lU6E839598Sd1^~v7`OwPn*F)HAI&6BG8J~@cPQ*&Ukv2&NTMZp|-%_ zQwcDiOdO-_FdO>KhFhk{AEof@`4MDWvIJ1GT6md`YBz5mD8}8|^+^8y(guCH0Mq*k!6-@@ z$tq-u&@DfbD$Bsx`i1OHGK}U;Xk#5VghhFoyKVLRyqM9|5@ew>9&xmIlCxT%o}4~H z!VnXEu_|KM96z43MCTor@WIQIUIx;rbTWQC?a+SUl9eGZ3{)#A4eV zPxdpd|Ho-h$`tUaSny7J;s&2~Y#C`fF4+Bgz4wKnbrB5cbh2gXAgsyOaU7$qzu5XD8HSy=p845EBT&CZr(<17zUW7jUng zvt9x4;q!buamEY4y8&kFWYL3!EVaW@7yB7w~-)g_FVs3 zmH}>HZLx3!>gdbyzb_C2uT4V41et_v+e>I5N7VvQpzs4raFrABWV|~dhod$Gfwky@@AVfr2b^0<}%-?8$m%T z;0xEVfTMf-9#H&QzpajL1)U^d?|OY!OcHao)6t2~c_?Sq>|3 z=HCzDpACDaJFg4!#XxKZ5@MpX^+sR<@ahm4g#traM`*)B84eJ5vU1rSt!b1 zStD_t_E>ZP{VeDtk+gAT;ZnSHis7O>w9e9G48(QKc$6IsSjavA6suoi>fJ_uCket* z2w-3lgcYwog`WdpD*;Ja$gG9a2=}eK@ql(Rq;>&N0jj@BC7U`gWj%~3sP8diDJ9&U zAXDYn^j|Rf4RGCgp^_){%U*}{5wPoEj4SoCEn{#h1I;F+^Mj)oT+6IcU18YLAlUM( zSdrz-H!Bj)U=RqwP<&N{ESb-I zsPIay6f_a${@={;Vd~f_IYt6NW3U6$p!`$G9fq2Nn)vBbGd~t(n70NXHn025Iw2Pj z0G-fhIVeGXsVOcYFv&1=MN{j0I<&)}eXBt(=h$cTQJ9vplLE$7{3`g-s7NxO|>B9>1l~(i>6lN^px@DTZi~S`jvy zk+HEC%p#~;=}A8t3*sYWPC!i@OFI20V`v!vW$|@b{ZjgCs4%6W@QL&r6K0KJkRU{Xul9>U{dq4dk3YW`SnVER# zl~rm6Nd$}d{Q7M+RqtVfQ{>8uDjm%mZLl0w)!!b!Mm>ODKmF#cXlgpmo|E*e;NIa1 zV46g@exZc0u+m(4xe8htf~@=y$ig|2D1B#Ea7qsL+GPyjeIp*Drb6t>+HP*Ud_3AS zuIctXK*&*N8E!x5xp!0!s|m6Q6Y5BDlqjJ01;w?<{styVm>TkQ=bS|SGHEg{wiT@y z&XPAT(`{mu@Dg(Y$HW8zjyNLvp&Cj)&~k{hgsU-iO<=D6qsm=*EDAV_qD?k5KVK4X zy93Mu!;B;|009T`x>-4ATx{&o%AH0}D9<#%3c!y{J=V3NhT|bE7hA%Q#}=M!Y{B}k zVS9jT7z@aCFuCFMQLhCj!=()m_nE+~l~$7$8&+h0d~IQEJvJVlF8{%}7`6qn_94YH z0qb2-{!d)vKh}0L=tb*W>GU{UCO2+2{Mqf?JnrB}X@bnKwzvDlzZ9Q?8q{ypImoFC z0#xW$n7HXpdEk%2{WqqI@&JedM230*Qf{uJj1H#Rw!liLo7#~6H%lU@p6oVZ3+9h} zrz9Md>1=Q~dpJn!$k9_rT9H{vx^Z{2@NXK4k~Lq0vS=jb_6h}B5xF1#8!9in$l#@k zHvsq^kTDd(12FF(0|IF_b6{MLlsxI6dy0n!S*&~W`^N`9$0a~l6HCkLD*pzQV<(Y+ z0F>OApc~NF(kcUKsDVIy5HIm%u{6@Rl_5CF#D)wt70Xth{p>3|#T+id51e#3Swrb1 z|3c*!I zJ-I)6*U{m#Jd1Jya5vj1?)`%*Yw2xhvc&f7-^1WX{RR@Xkk7ZB8pw#y8e6_#%8ClAH#gUxJ4a7z!X1-IM?uR_Tf8SAjqwc@J<^=IL(Db$|X$3x$C| zsvQ~}T%qj;m?`m5ZP&WnML${PC|Dp~fbW4OjW@6gsxB7f+ud6)tmw;sF2TyWaHsLF z9;9(zHlm-gN#r53YGsrzfEoy4CXhEF799f5_`g#RpG9)0{OHhOAgbshfy(({ z&K<% zzOJcvyZLO?>5xR}l}QhVwD<}Io(x`&?KdUrAt7V!?Ih{o^aRghy z(6FW|7U3;B7LIQ>#roB$o`b=*O+^OVM>Lb*wfqbJlOUAQmNHxKYKTpHq(-T_JOqj5 zS7y?DS$+gQh3B1-$&e$gfUqZA-P%1_MPYtI{Y>uv#zBVhfi8AuY3{vCHFH~+qTzpX zTO|lo7gWq&c;}Vt!Fx_+sgf04wlF+_^Cv+O3-?Ky&_G%nqo8L2P|R0BJb}xnAF)kU zs+=dCUn-WZzSZ|zgf&Vw?axVc$VmFi6&et9wN=AabkNw#4JU!>I2T?M;gsL(xd3ou z6bb-1HAUGpoYNn?fY9qA6B%pSbjX3+@bj3NN277%NnihV({K1)DRi#3nc*>7qRb2S186ABShxnQAax^pg0>Uj732jX9E}~a8cR8 z&MJlE0l@dh&TZtFK=8i3fbHx28cBetrBhjzNf%N{?l}$VY8V4 z6A0(HBV?bEGN~TrBNK>G9q4Rg{@MRn_ zwQpq25E8-FW{|w`IdnBF7AG`}g=5DI-3r7%`l0{e-A?BK5b@BgP}S><0?$3WmMlFM z?Mpouivq>^yLgcxh6%YxT>qV)GxzYc^z`%$3@9@?;fMXYu_!RM99|YfX}4m_b&|Lh zlUDW5iN3Gk;+TLi0CLB|~rc}EsHnP@JMnL?Lz)J5A& zi9MmNdQA9$0`I~`sAAfj2%>YfK?qwKIJx@ARjzvYW@JrfJC*r=aKz-Ty zh9rjdb|3@)6DS@~Nph7CHzNo0t{)P^eG=QBVS#{S57+0l^QpsQhC9k({TARI!g`!s z{hh1gm2s|LDaz8&*=rwywJA8s-3Z+#@zsXZ#g;RHkTID^$g1oK1PjLx3$Y@&V77h5 zs1Um(Cr%^=cu>|5W5n&bB-AA|l5PR-5Y+t3ck@8%@@QGZM+{OZ4;T;$W9q8|z2*16 zFQv%Nx^gUY2gnu3GUl~Pqbt1+cgBF(GY-)bq=rFw4^ph-K;wcGYnwPX(qwclRlqHy z-+mSeJ+e8nj8v>D2-fLqp+z;Ck&J7p{L4cx2Lm6lw{53xKv?q(hEZ7J2gE9kJEM1z z{P0&SL`%N7Zy{M2C|4n?7x_dx$-+jF#qF}K6JW1-P)o_Tu!0y$9ndrzw4ATj!1+`F+=P@{vEgV5z+Gfc8f z@+qupO{Q%^EJk#$NT$#l4^lOU&yTmJ?IA~%`uwjg0T#aLYhG|^HAXQmNCjizsaNf% z?k8g(abac^6wZzSWO@A*@fsW=ErVLnT)A|HvssY97+X#oVeB_*_4IcFdZ$~52f7tZ z0Tj^#)qUWTdq4}6yWHqmLoO8w6l|&NewkoJ`)BjViD$74wvs8x6#49oGb!Ka@=qFw zl^Ll~xRCaz4KNQVgHNw`1)nO>z6jJJ9bFGPuN*aKLR|7j%}?gWl`mOulf_(txn=Ku z8&rrV*XhMvY#w4@E6B(zNz)FlxmuL7SbFG{%cfNY`)E-O2|$9<)Y=@sryQ8RG{gZk z)7HrBS(zE>8_K+AuTDi1#PJ`OfZYZ z5k!um@O+CJJ&w*ZMRz4GHzR1xy8wEzAEkg;eB5fM;R^%^E3Nm^vXuufS&@*^j7M5% z;3Pd}NB}%O4lE_q5;>Au-PNX25*Itf|7n7Y`*{(2y$vggCNMWkeQzh0RBLf z0FcozEU21RiRw4PVNwW^eqa=f!bD}>4o{fXpQpRxD-w7Y;|}nL zY7|rkd;oUSQWG+eXsJKn-z<@~@UC&aBEBe|2(4C+wloa5H37%|!MWpR>9 zEoW6c2x}oBtBr0&LIfbwJ zNvT9!J^8*}v6EA6lDwKD0}}{JJdYt71I{NV5aOU6V3}UU7<(>fL7BpqCy42VLHrE} zim=)?M41anM)`D5&%$Knay`0<#RLLTsRX!sust7Di+gS&>=!tY8By*4X~lAz*d_ev zx}N%PSVyA`v8BEi6v+9+l0cOGfi|ALT=tA}GCBm(!zetszu>F%#$@%+|FI20@dIkw zej%hIHU&s-`L-7juIkM)<4m%my-ag@NWU1KJrl%?KJj5Hu}0pDtf^zlIkIQ8qBjtn zC;0@Q9#Hq=4oHIW6TnLoL%!;(&sLbYAloZZdzEu!LFvg>6N!vk*|U2!%h`#r*(NIw zpm6aq(TVlLu15GvN66#*vJBc9`7_-;9L}KcGeJqvJL%*rI+8LnJu42w8Pq zi>}3YLyW$jZN<5tPj^g$+YG>2A#~#J4O?JdZ5$AvO+jG3Ge7ZU6_N2`jJq2W; zp6@MHIX|00Zh;-k%dDd%W3@OV5ZKTL8(Ep>)R;dz0v-%RB{DiV#L;>W5762h6j9$F z#l?;be~FKW9E8!On~1mHRpdG2VHm|PNgU^geA_0bNs{2BNYXun!!#CE(OaG_AAjHe zAb8a}*cyYBoPun^+eo1L`~sKe>mXt}SSS$Z*2qA3oq?_#ya5jIEfeGlE-id9pyw{i z-+pKmPAusos-pd!QgLJuJRQ(M1;ARs>N_wAqz-=%T_pyS!bocCFS?g_p26!*WdRGL z@?3OM^o_qy>&txh{>Ty&^jR-l@7QKg^7z6*l=@tI+&n;4q}?ly)$EulKb<~Z3&W=$1{Hqa~88T zj>m1M%IkM!VX0nMD!CNnFfqCL)~}%YDdn_cW${mwxj*elz0_ZIP#{MPC~zN5Dy-BX zMn{ZC&nFlLvZmswPk(OeGvw!IptprzkzYQ3|9tCvg?Oge%?9=Aj4Cek^A8H`G|DXL z&DSk5zcFy{)p-@=f4cqh<5Q93J}|Gvz|n_*8?4eW0OWIYq|oBR!;M47)z7#NugKpm z9#=?;zj}zW!8Ov$jX;yFns4G}S@NE*`D_-c*<6ImX6NpM{JR0~v>QaeyU#zp@k9gi`6Rl{{5r z_r*2Hw!{h+@!MbpdnzU9_>(^l`~Qp@5WeH~{{4ztPzvfJxDPL6WTG;GQ0d+Qry5FJ z$}vMfdm&Tgt{7RGAaE83iI^z|4$(K$kKHk3$vpIonVzbF9NdCGn}^IvA3SWk*@WPy zW|TY0Mfv&V1fiGE>f-AH)dydn)IisZ+SB@|f;k22?S>a3G}a@oRz&z_TE)laEoWN= zrn)_dvryKjD<7H_U(bBg@^^Z#vC^fY-J6cRcw>y{i6w*iB|fUQn`pRtMTwbaNE#9^ zTyy~Y$zZyE=bEc`8NOfFJa1ksDjB!y_lYmQ*38a7>)3)@C5q);XL)|-NO#wF!i^Nq z$9*YZK5~6Io}L|hg;K~aIJ7kp4_{hUa!9_c8+1fG2*($AjKH))PrraRx2m5+lpQ=P zJ8d7!f2El&zExk|uDFShc)=BE5;;9Vix<`^@ z3kiCn3)jj^7^ZdpNFORF6%}4@KwEmH@#QE+ati068U^@+2%a$>A1Gm3EZAe7eatvqVnIXDKmqnNCbMY&-j z%Xpx1zRLQ0zDoL?ix(dBlEs=)l1}m4JvvwU6n`{@tZ*Zxis0U#M|$VaTZPxS4YK_byX(&|R^4mj$w{?c> zErbUnOAN-jnRv$Z&!-^8M9sN>ZBb^FUnKXwfuurtMMVJ* z!{JIn3Dl`1CnkymQY+#Q!-S#%2aUQvef)kxPvkP1=0aHSFp(r`^w5ks{qQZ3O4N5v zTGP0e)u<73Yd=gNx%8Ty2*CJWcT9hK|F?-BkYq4tsN4Q?@807s)*E+<3mp-GFNCcL znzR3)tRUF(zM2lylX~rMf;;~aP_B+=_l5)zEdu~3fjY|`48<`e_x{aMAOtj3#M2>D zg8-aiJ>Z(Ec6P^XzIFIzUuMppeizl7oD~X9l!n@t@~#5?TBYitpMUQjkSu!K3|sBS z=T5nah2AD56Ct@MP)m3!^8B+pP=4#cszJU`0gn%ICO~j)iO3&B8lha4iGU-IKzu#Lel33&R+REGVeOe29^A9CE6k+dY7+Wt^#}GM+Qg z$;O5Ab*@+fs~?DCUx2F$F>%V(fLl{wO=nN-!Jr;M zdY2gsSLn6^Hhb>HCnP*EYw?FpSz1{EvoNujnjM_(D~O|8WwYu5Q9n_|WcL^+C9`ty zN<^~C$>_5+U1CaH#*)Ow6Vr>`no?L@47zI*w`}5#=`^Jm3fX|fzAo5 zW!**W{0rZ7mT%RT*|x~dOu(iGao`(lY$!|!sCN#e%ZD~LBbCE-Yy2n7Mqo)gFbumM zMyYZee)Rf)dH{K0xXaM9LXr5)nYkOt;hmu8Fm#`T>&J^)Fs633RCynoO15y!SImuK z?}cCZ4S1NpC9&u6g5SG*-1d8K$5t~49PQ`)So3SRsH%o?kc!#}aCg_Fu#rj@aQ2nq z7j8k|GP~stE%pXiYoby8ay{g|Fo9r)5T|~?k2nC)p?Fk%7jFydEd*!FV-e2kq22Dm zVYXofv7-Y_^DH-DuW4OK=)b8X#HI>y5`re)H;m1qQQ%EKxFuLFYv@XQr|InkVNZTP z=AxgTp3&DzPBfOO%ZHLT`$b)D`LB)_MWyYE5RpTE9Nh|OAqGNR8p_zzRL7Z3&v3~A z8uKU?a5I*_XBcyjZJ9Rx-17lyEG7_;m!@SGed&emKfuxlaaOoVm#?G(LTXqHe}xY=8rOa-^x0@>8=9_;v!2_nu9 zppp@8n(vrjhU@l#mY?7|4vY=u?r8x7^5Qbvh_IKR!a0ZdnG#6xR+|FzXa?q^ID5DQ zm`93g^z!n&MFfY~!Y`2E-Z(UB6`QCwjr{JCbCB|!`H1)a?c}0Gli>NHS!sr-p)6aH zgwDC$jVI6_@KJ0h;E<=L+=W%EgEs)D0XQuk9F^^GKb@kiAY>;br*9y27jENkk%9p! z@#p{C(Q+Wx4P!R5=?XM>2&oz^x}tpk%`-r^AuiBZ6a55#Zv-d_{xA+41uE+#KDY_& z*RRLQQ2<#0(V7PsnxHDJ*VqRi!yOM2U}>O);B9u^>R&+Ok@P)a15mL~|I-mnpj|&< z#aD(P+NrY(S}_kxbZkp?g!;4J*1nt6c{y^aT`7u1?*=8apliwf&VH5Vqqzv_T>AmP z{6dRbiFL_5cH$hCOlw?|zq7C2D7vn_Q&J>j4NpHRT=jLG|M}r#$EVBx*2#2WF+gQ1 zWEYh2w!kVv;pCsHYJO^e$X|gAlE0LTOlD2=`vj{tt}`|rJ$g=qpSNlNpz@q*{A`92(p+&FRb_?^$d0@BxaBbC?N+U6%`d;%F0wu@YpS6d)e^i(pfE*1n_jN?Z6$PY6{eI zP|;MvIOhkCEo_P`Wb4mVao(`83Bc%C&fag`-P*>0`y^ z9gRmHe;sk%Idp{o>=pl+ebz8JVRtErC#7HnDJOxT_|bIzA6S$~U_*Y#cmQ%P5D?Ic zx#Xs$-G?$G&|A2IfndCvh!8I;hmqWkt8+1}D@4e{=>iYr8RUl0g^M0-_Qm z!Tk64@;2ngR$+CF0wJXm$iH88!Z3kICK_4(a6J|fAu^sG|K~?S*wWeE4J8B~kbChi zh2%~`_7r5d5M3A0=K);^9iKbEji~G{r8l|80SAzxWjq@rw)Fp8g`5D30H%Uqmj_%1 z`C}nL^wBI`MIzdC+yUSE8=G84rg$pmgCso51FbPY)P;%)cc2>|E=nImUJU5YckRMO zp~7p%bG2xN>(brJjS#v=SdJGn==gQa=Sdav(R=^a`Y>^$4jd<#>aS3rV`!aB-izyi zTqy+iG@PJJyQyO-0dT*yssK%;3FM1+ca<_GC^(3a8)cX?aL%N0L2{Vsp`GG&2yxY) zc3+IAl%ugWY_8;-x?RS_z4S)(%JE6^=VDzB?k&RMu8hM znm!i(BpncnaL8%7!!RS%ZouZC>N>+VA)W1dvWqt4#WoOdiMy8VBk6m#XXnkl*9FpT zo!G9}eaE>-T==0}l$rS!9v_H1i-q5TN(NzcD^!#s%K!*b;t2*&YCHu5?odJ*7K=Xs zPtM5;7qytR%$Bbm=ha;SQ2u^A+k`+5S*_)Ye*~x2x=v|kCni$eNktRy-Ce6s{TP4l zD*wz`i<0dP03uPNym2-Jcz$R^EJ{O+8CidDqdetbr?J z_FJ{-Y>?%1V4=C9_{Yh;oRwq#{)-xJ1>|sZkC|N)uwi1?;8v!1)p?Kk5g2?I5R% zR4->w!5w{v05UjCyOX_WP|?9FgVLf2dy$N(Yw0aU6EMZ^!7D=8_E5cy)E~e~Yo6VN z`2l5RB>h@s+Ay)W-F6Ky^r$#n!v$GMuS)IoTd{yN_)U}9JTt1iA7WEu6|(YJDM)Z9 zru0D^O6pf9Gf_3|!%qkXn*x}t2_!?{LI5tTLG>dO)qt~SWV8zgYynu`1XcxC+3g|1 zRZqQ6Jll~9S>;Ib>ip~)%eeUq6|%ho-ONpXO)8C7frSywk|RDvS8uzVpZIXoz3q{| z6Bs3gs5i7>UoB}9^L)1=wc%Iy4T#pgq3i{O^??5Y>P>Juax*#}H z;8xVtA}XCjMnQ9R<2ABo5O{o_qy+)UmyJm5Cz?xn4Z^zQc|I}iAl@U;6pC{?a? zeS%71#QDy)eGgzU6#ay&VIiZk3rsU0@ic${wMK$KSFtCY<#5}S)ZZm$G)OZuKe!Bj zdKcuIf2Ca=4gVZaYKw9Rur$gpzMEinSecy0(i6qelb_*+KAeA!*K;Y}Gv?}OZz`vZ zD?4$?E!Q`fQcC4Y+$#LPO!O zC&UD;C(BqVR1L7NwQaF3oPm{-uvX7rMN`{id|70Rp6q1;Us===z8MIki7qA$0T%{p zT-(HBV;_Tql9QD+1%?5#`37)bpLZ#+mY^8z2NVUGUsZr2A1PSNGXR#}&@Y5rXyBj9 z@SN=IX}3uS63O2Ylj~uIkOyGFsT)d@&ylTU&CX6FZD@~9i@>JmN98N^@(HW=zBK@k zOKdmys(Hc>@L?LkcZJ)ZCak%7jKB>9_Zddv*)z`~@|%S7NTLSZ+AH!v%J>4;70r=% zftvvIoCetC!^6Yy8T`MnP$=r`871zA)N+ZBGXt>MV%Z#X2V8UhQXgcN9r`E1>Y z|M~9L#e@5BlMOi92p!b=FpXiO^0% z)$Z?3Sj-P8+kw7A765a128+V{U%n}Tb1}2F6E{+h3x&+hj6}OnZ%DBV|*Ng zevrh^rgEZU=z?43b#Aqgp)i8Zj3|2`idHoxEygCWF++`Js)DXB*jF6HS z1Rmg`d(aCYKm&UX3h6nq2rJ54>YkBNLNe9S58+1eqamnO8&E5#;h+`!OO>GJr(_yy zMs21h@Xc|PO>o5fCCSrDtJ~y)=21!#agr_&n<7_145c1b!npyr)gSzaaIe5WK`x`H zum2|X7?`u);E>uPfXhoN(db?_>Dt@6{jl@8$-uhRno(t=m{@sKwJi?ZyoX)F>r9N^ zFz{N~JeSn=j!Q#fVq&h0ba6Lbps1F@67i~S!|g}Mz&$?AaUg12?uy{}Oknd%O${4{ z(#E>@wOB6q@Do*prToII9d9NMmJm?a*iXMYFBT@Xv(M0fa>RsfkX3%T5-|3zT$Pud z+){g2;WY?Zks3H# zAeRm|91)-`48!D@g44g|0D)Q(G;@#`W(m$A2t zs`c^;Htez+>aheciATq}8{4&4KG^c=c?LTLt~i}~w1?nqfPEs?Pz0!S5St=ke|Sd) zNaX`)#*Q2wzN0w`IkNJxyLKU^8kYdo0xSqm3-gUdmw0C0fO%_)JN zb4D&hX*!YKrb0wavj(x2%h_2pRz>;mqBxcF({uA};^Vjk%_qWuje=Ce!x3C>>IkO< zu%jKp#F?6=aP|Ntgg*RwEHG(&_1TdW8`odHu~l9EZ=WACmc6ZYW+5rm63~r;F)0Wh zt})#fyb|#5=Jp+*QXf@Wy?D+{Q>yhNpWO`!_2T?Kn&a_}2ECDIgUfyNc;k34T7AL z8}&3;KRe3J)HcyGnM!tXFiG9JmwY$pZ;HUX0x8$NKhKYCe`)IdrS5Cmy@=4)pTT#JJgQM!UjudI1-xuID>Z}AQ6Eb0qG&)YVV z@56kUcyaAYK3pndNr-3}A|=fG^PpOGG%tOWv40abjBjMq9VuX5HuQN` zi>iT-(OUO9&L^7k`jc^pkkqALYn8PANqoub?oh=%!{q29!}f4CxpPr-Gu7o{y7dt( z3a3CJh-S!VS@oXh_ee!NG$ycxSRA=UwWz2FYP^xK3q%z1s;*&;;Y>oP$*LmC(BWKT z5dpk~7Ha$G@* zr*Dbv>)J??fb)+xG}529qX}{t!UPPGOHY2te1Vt@e(2qiEdgu@P@CrSo@wrC51v%3P14z($1EPJTH|ooN{V$T$Dty4u^F zPkh$Z{;R>f8f>@lurM{6TTV8p;4UNk7$NP<VMdzGO2SR%xZ~w{M9bXirq?s<7`+ zmbgj;?1&cH1bJHxbzc|ut|_*@p5bEE^42FoVsUBo@byhSHjUHAjsK;m&fG}}tN|1e z=YG+^H4hcu`A8GR3-Vj<{mC%rGBO4=eoxVLvxVXbGtsI$Goo;DtP8=(P1811ttI2< ze%c`30lh;Nglc`r_t(aVTC4NbDz3$cRN-fMp1-#;*GV7WbGyy8qssvc;bD6mF!`Xh-K zLUd(P0l2G@T7|dn@(vn4s2Y9I?I9O|FH5KJdh(qtHJuKBvE^S|9u*~n8o_4yI=rtG zmRInqMxlrw5v0IE>5WFp=S?2u;>X89IJGy*3Yw^iiJE!K#l|&FEu~v&QzTdozO(O) zDKIf51v*hl;k@wH|0_fJx@`mK_~4*9g7>Sk{8YF1~CBLm6P<4_oHf{p$yd>=S( zK7WT&iN%)E9`qsQ&)q0!QmJYzq2Qq&k?RGnzm2>O4xFoL_kA2#&g`17pPvQ#5s*CU z;1X+0r!t^=fK8~UNPMWOf`hjR(U5^78ni1gc%n;be$#-}YqII)dmx*xYv+j#${FQW z@!ozRwm9alUl^O2z_9U{$g>CQ&&?l)3EDj+{%psVYD~guwHJ7$GSWAS&5}_9lFf)F z&G6V50>c2f>%Qv?;o%Yx=LOqA1W6F+j?cCbcGsDOGXc2h#@5{pS069I_f^dEo`)gM z2R?uBwCe0lnyBrwMzx~~_Zm4r@I+V4`E*A-WG0PyA>e(L1IN6JEl`L|Qxnb=(BzwM z53LwI+VeTyLr6PE{@%w2GmU_=-8C`-rqN}uOYkzdmW+f*$e;Gk{k#jicw*@{HaygK zuRWHcrk@moOkwkmAI}I?G-s1e75YUL#aammJ6%G=DlVK z?seW=gCYSYECS@izikP~h3nBc4r^g=Q&s%9t$PLO2N^BC?zc`JX2F5_?@eFPmxi3n z{E|f43h_7OS}zNtH^kaB{05hb8Oyk)Cz;_K%EZcH#joj#cfV#N!VE+gcH3xZkf0G2 zl$6Bm)6)EcT=c0&1HfQi9JL$+ux=igsJ-6)ArI3wH^U1k}hCvP2+wZW$B9ByS-gmvOp>2Eo?zhUgTl3x_ zbC?Lz2lmRcvaOo=uta{#Zm9Y}s*j+g7EmniNF@{oq1sw-p1K1@<;USE$2H6;)}Kjr z5=q(t0LR9@xYsL{-l>2gNs1zoK6 zqfeU>KS6t}4saxd)eV}fu-Qb+q38|btd9V!sqiBQG+RWq@Y4kin6fcpm&%>L=BvNR zQ~m7Bf(9ly95VadTWR!YsK%nFUhtX>B`LQl``Iv`jmd2l{{^DnfW^$Qs>c33CjiM2k`eo(IQtpZ<$EkVeSkiKud@+0)j5b#=x+fdBni90h~aa$nro z0@d!6{7|qEE1Q&kp;kA?8}W;e6>#Rm7#AuRw5jRzWR1IizmARwoFB!Dn@?lZ&38C`cMUYH0ZG(61^X7f53<7gcC9N=E;J}tr<4Kx8?fq_leHTx34>UJK|4> z#TRuhb4xvV9Jz=qe?L@E+c3+a_(^8;&1)i0|4867xue3?pPfA4cpuX(Dfv2Teq?zD|OZ7k=eUdtm9<(Tu@`?@^l z^_(N$IfO-@rXWOXBB5|cMupA1ON`I5ie3qiZ?wHCq?<7#6x-twx{3KpcZnHOc7FEf z^F49)r$rTr23wiI8ltRo6B4pe9|*#9HEb0K!TP0UyIXtKw+2y7-ia&DI2qW8Vyu_* zPME8>c}NtMxgEuAIy&dq!!op&dN=H--zn`L^qPojUMafwFM`edfmon2oPUue-(Ghk z%QZ`tZHS6M+fk&M*bz^Bp^EH6i_M+O9_G>441eBa&(h_+CPKdO_B{TClFSbKg32Dy z(P=Ko;$Mf~p23M}P^;{_EXXZ15h_>r`2NPVUs&yHl;lY<_QaK=*Fsiep1aWm1v)i< zdl&eU7ZdaN6%x@X@LJxsHqLUq>_8~4UVQDb<_9;y$U77Hw4%J@0!)S++51muSj-)C zabS1r5gfOIS9X7&HFHBHcUXKa;=fSRhnMMO3kAC=^8(96^(olYt_F3D%YF0$3w}nH z5wTdamPPAZt`kC9MvKnyWvaq5{bh^1w`+<|1tWP5XqE7kZK(8Q(+>V|iDZ$^DmZDP z@(G`d!_a;z9cXuJJ)ifKi^};VLfG1^Z8o&e6jE7y#FYB^1#wPcw5XF#EkEm=%!I*1`qR$>k>Nc zVP*d^X~VGJIP{s5_W5^&!*g7A_Zok(Mxm`i{pP=xj@x}h3h4?p#5ZP`!_K_&Kk>I) z(mL)m9Hponx~Amrlum0$x-H09J{E|aNj@LXth8+YA2&~R(cRyl8wS7UKT_#rz&Zg{5D0}?R-Shpu{?F^_^-Op7 zeT{RS>zwycTv!%y?hp{*Sthk@U*Hot*@*8fcBzQK#krdziLIh~xB_q))IMcpkVfqb z94^&}4Q}7vULRR1$I5>JJBPP8goUr`-SERt@21mGo-vx#8(UlN+n&Q+x-c^^5}8DH z_&rrOt!ZsyI%n=kvt)HL?j}Wi?%UsXdP!lcAm06n+Dr6og|_Ev>Rhz2OWXVo(lZ}3 z3M8G$LtVlZi{rky9L&VL6=((c(JjE3kW9_L3~GFf81D=TEg<|R|w&!b0z zMEBdB1ld&&Wc{K!1NTbUEF=UMIGejg;F9c?DH3Pcz{>nb0mZ5o}Fxo zk`L+SqIrH>jH;qS2HmGCM<}&i)$bshIkBRpr25k{<^x_Yy*IckWz%9{f#ax zL^>lYkr6&)V_?4EV<~kEhNTb(tFQD-n?a^h`2qceyFJgFzGfY|ir}Ms-ZTQA9|124 zuhzn)|1rT_@)I$071ANPv(2Cx3NNngg|rMN94(e|Ze89CF9o~ot15PKHR6Y$aq11} zA2&DmJL3Doko98GgbD6`gM2$O%xl~IrvQRwfovEWt{~Sd(g2V-xrgfTPW=#Qj8hNP zkgaOHcqORoN1fNn2=Rx5!s*zJtKY5^rwBVwm0p!%4C$hL8CqfSg>g5XJmD%%P$grU zx_GzfL1*jtXW#P(ZhE|&-xcg@a9lF|9gi;REjQu}1}c^SZ&&SdhsHf9JIX&p?(l#k zfDRT|dW|i_{Da{=b6W)>D*U_J$R4QfqA+QY>k{>kurCDl92;sn*|{=S_lw8=^b96F z6=F*9(%PH7x^Y}qA-$i1#+LzCuOYdDNmDG?@S208tn)O|c^y)50-Iic9w<*$uuR14 z33$}L8kA?!hg;b!6Shi(+$~H*XBLh?UCe>$X$qXcDB?0SLvU_}Vh~GKsn#9BYcVhK z;Z@Y{Wh9stF|DbHWHa-Bu+iD8(>(T!8(by!YBZV4o%)XE!W)s}t2yPCS~0@Q3gf{t zSw(}9HEb+Ms~cul>ppFx*VkLzbQ-8R!8v-fcfw|?FYMSp>h`_C`b(@TonDFFKu7Qo zhudA|pn+0oDCiqmZo-_wpBkB+up&`3{{e5@p!`n+q4PtF&!lt%>1 z%-hzIDelcbSnEjQFz%gtJpYc{?zNoyXHlRHn~8sehP+WJ2v)4xjDbLAls*_v68)=( ziDGubwy+-|v||G?RNuDATKr9+qmHkY&fm7GpHMOSt2DnyY&9oG zOi4R*o+r?v-QNNVFkiSZQSLb}E-V3Bj)?f;?%G`J+dyknWglg^2^bI;Pzb>j{{#xj z&-;L7kg7v!>C*0-JROKZnw3F&59h`${oY;nagv;#**9?Q=7fWMYPF-X&AragpUeGP zAg5ew3+bYiPD{mKrEi8r`;ScwSc4p%Ov=E{*`Vj)U@)c|5h0coCdj3oOm7WlxQ z(6tQaV}l2;5#CU9x%@*?z6VM#96p??p0>+F6MZkM!h7>>QtdW1%5({rUX|{M2`QjH z@yzLd6(?Xg8+)dI+294M9kqfR=$azxjfk!(ln_+qXuiU3?zm-*7YcS5lK~Y9}j3;;Lo-dG-8B9esVN!9D|{__BOS5YN?C) zh8@!#a$>3HsIKdmY2a{(Y2g{bFVnc%)g}BmoU@C(nLNVoj!K7La>XRRfE#nx%t~!7 znogu$DS4(`8~tZ{YKGx?!8=K~_dkqZ77c(pBck@=bCpsH?9gm%Y?2LAj)!xQ>P-4~ zD4rO6jhb-&>Nm{uIB+PtoXsqLQCb^nKx@)mzf?3Z6??v*J*q`&D)bpd= z#n0E9&euWtqMzTv;S~=#3#3IP(gUJ@58ZEN!`Wq4SSrm*M)ySZ~D7ZV3N+jTZcn8`ce8H~t_gHvSl+jz_1u zSe~rg+vm}BN?GMGqa$BqLM-z_I$dShZ_P0iq5X@fA^=I)-**=OhNwa#lGkcOFaf!g zs)_H*Ez)sJ6>}MNTt~DBzWs@0_s8ubbwMX0!bK0Qz`8rHgP~nl`_Pz%Mw~qBIf_-Q z^YSbN2rL@FL`ajtS26o)rPg`IG(sXePk3^Ct<%CNv+KQY4^iPpMk>R|D1Wx^Mr2xa zc(|>&ZmQb#FPJJ2&cK-)X&)HnAqTGt17~HBsyG>)HRhxwcBe%Knz6c+w3vQDbu1Rc z0~}0MIlb6Bq^xG>F^!jA*UM=b4Km-f}0MFANC#ZuG{GSl^yC0F7J)y+A9K2|q|x5wcH% zEAQkR=x#x@|GJn#C*$|#dBwnvXxr%@E*U-oys*IO&x(FsaZpZB{!_`6{&+mcHrJqV zWCsFGMneMGEbWcUAu^t52elL*(R&@8HtiU?Bu5+M|k>$Du?0LLu4A!A(|kP#B4I=Xn{o$l0 z4k4q$rs+(0bhtlk8iS&Wt~hE3KV}DXhc1q57}89~_lXFWl(edidCgJG>5)aapL8mM zaRVELG+@3Rhf?1e2nJ#-H5&8;y(~JoE%vZQrkS z$;8x%alO(g`7N@NB~UfBJA7e#|{AgNGXBK9E4k;HhQ-c_5w;8Whq;A-{?|h(5+ysXdFUW?^B(YY0$eos+)ojXJTz~qbZQMK@7k_kj-TS2V z=fsHPVX0NnjFL!lG6qW)C9&eOOm5xLm4FD0OQ|ARF9imE{HOqyWf-8iDk0AYkmQ>$ z#jFronjw;kmqH}H;`w2MdGV9Md*&AHX2(EKmue_9vP`~|VjjQytz~bh7`8L&x-3*n zerW1XgIi?3#7$Bo!M;QeBWdp}NjTB_0qL+Tl?+uv(N~|5%X+Oqsfyg15YyaqLtA}q zqfj;Jd|^*g=EYW?jW%H1Tw1R?y>}(UNQNchrkdMv9 z=o;&V)__1-M#9Q(nNQdDLw%zkFYy;TKDE_!w7P8@!r&}lc#_&)>Kn5`j*C(&SH)-n zo(LmZD2~YjQ~^XbTrM_kyxj++h~fHUg*3H}Zx4-(I0IV)0enGvPv@_Yz_ki6j~d9| z!7kb1y*H#9UVv6dt`7J=njGAdVNTwZ?bp6(%3Cl|5&sX#mp@|VexkytxVXj}tZ zbr!hhsbT&Fc>jr|)~YZ!yjQYL?P823zBq_`odE2G&**e_u^W-(XIX?y2O$6yMQE0k?i;V8T6|co~jvmG+Id=y_bsBv3Yqz&J?wA>D>Xs+gH0)hQZZW(ElG>pA8OKCH}?PMGOWOf#`Z z#r^7WFq7>wWHp-8flAz9rFD(2hv$Uh#YM39!mGI|oMZAF_2VO9)b)3BR-`w44d6cd z@17wD;&=YxKnySsH^l^cxf?8%jrl8x1Oa5qg7eS4pGqU!3JQ5A4^obL5Inn=p5^q! zL@n%#2fYvH!LLR3*~Z2O`2&*>)ipr-Zy|A5*b7kGz>A~vpMqeINb2qN*~;+VB`^95 zcM4E$YUNAecUl7}B2pzdk)wSpDmzBU82RrM@-V7M8(ZTpCQH2Pe700r(Kx_C^ny29 z**T2;>pi!niP9_BCn?_Nud>v3U;F~7 zWlnS#pBK<|qL`FH$F3FNM^PfUIDfN`KzHQT|Jq)*a7#56EC+tb6J?v3__waoCk0 zT;Qu_`)p8M%-m6-v-%pRaNIJIzv3xbOm7!6Jv-hUr8@b$#;Z1=-#kCJtDVwt)c*tm zs{vKa?vr-FLpV7*L)ZY495;jPbUkYS#-KUQc~8 zEE>>xnT4#*UHt7ogOnZD`l2E$z)>T(M4Bt{xTsV!&Z;2(dK&tEee2wiK}MDM+maN$ zx?=L>M{Qb({hZmET%Mz>EKa0hn7m&f{7n48KXd;*|N8N(jtjtQ{1Dm<>0kZ(ok=l? zn@3mkYY^I(x9atxpf&>#VI|C2kI_fkfDZE**b=6PQ~&YqyQIx~I1hil9xi#oBmX`H zEPU3AV}-n6|HIW?xvw>C#&Jvt$~&E0t`IY3U_OwWbvRHz5YGr`G}f)<7vN%Ef{P}U z+`KFjnTz%wRtDk3sOy{zCJ1%gM60rr9FVJ~>uy>SjdG?%Zw~DzWB$9Z@OuABQ5$j{ z2x-L@e1yuCmh$w0^7_4{&HV}Bh(+m_mzTc~NvMsR*iIl%aj;#ht#AfiJ(w018~zPM z&=XG_L>%nlf|hd+e&8TG(fW8|v=M3DA90>=Qp_SynofYEzj z5lbc?O+#wBdxb73BK?A}s3LOA|FPK5qBMV8G3~c@VOXa*=&ze)D%qKn=FnTf5e#Hk z>|xfV>gJ!xCog84)nnwWeP+b&+-N&AtXVA)SO}NEq=C%mtV^?Tx0UML7N8iN>mV!% z@^yX}!g#=H=1&GiQ~LjCWl2{HaV8dkl^l3#ZoO^MQ-mty|Dg za{c9V6?in2(0T$9S>W%SIi#FSadeP7bg|@Ix3^*kXP7)uz|@dLl$U3!} zn9HW3=%}KQ>PQ_#O<#Y4|L@WnEJz?PBi>ydDaR(3R4YV4OG%73>sEMWl@Mhh>e|pr zqpkcV^W(bw=*&zq$DJdo-e$gzo85|mdd!46ATSH(*OE0EQ+|RP?K;Y})z$ z{rgebl!}cG=B({uAP5w~@F12HAhGEM@i%$dyeI|iQNWXR-j*8m<@ego4?yHhXlbnn zWtRY#18s}~T`^VleqHqAEj}g1w{=Pb@3F}&Gg!wcx2=>Vjm$T%uw>EPOQ^Sno@Vck z>gJV8s4fC8*~M^v&I4eI7>gv-ue^H3nn(eW%|Co*W=6e0<1eq*7b91RhE;=wmwOKl zwjZ^RJ$^*t1esGK*kx^QZX$xZ{XmhXi^Oq~2U?nMVsE<{# ziXz6^dA_ZUjv5na^V(e9+5(16n@S2%kR)I>bl)B=Z~?&rIAMrlE>eO8eT{^j6$rgz znA+uL5$m;`Y={P|Q4h%;VB3LA_rUWv!091dqxZA7%k zfhvI>ixZq`XL}+S4r^{!R-3?X+ksXqk|_c)n*6lr66)9NLFM^^_egzX+LPPznC5wZ zdy{$3e}*Lrv(7nw^;HWLR4!>R>CSi6W3Q~puxuMKFuiZc#g+ZZaKvB5;b-jn$eO5e zY^Y&$4UR*wW-7zDC~fu&4KytLTh>|+@8!3lMA2EDsXaj65JBCi2_t$~ND6l;d#D&` zq#;T-@TO;=Ytoy@d*2CB&jlgo{!tU!h#j}25(WSvv`zK}eH5C5+jaO`CQ5MQAq5FhsSLjLRKgZyz5rQc2AL+JPN|Y205;eN4b*ix zO7}|LX60n#-pB0)^55X>a!02;Hzy|$SM}-B^^?ZvNL)^@(?f)G3oOh|5^tc;oOU;z z%I_|Z1G{8kAfmnzilwH>uNXZGOyMT>IieL3p9ehskf5FMZI%xqjCH_pc)>~}J!6OB z(T9*i7{yg5>-2#Y&{~@K+1M|CuLc@m7f00FI4G6x6Kv*Sc<85h`e5t6T$3n<$RP1^esRKGe+c%%s@ak*N<+=)!cj2_9dDg%|iIPr! zejzRJ`wQ9$wt-Y7h-rz-9JlBNC<7`A=61^kpuV6*TUb@~0asO1^8ld?LHMzAaB$c^ zglyXbAccskF~a0|L6*d2J_t@?&OnE`Hn6xA*aTGR1R($pts7dXE|HA^fpzo3EME|)H`kn=v zE0MxfAF$iSp=^7VLE@6ZLf%YRHHHJT9o!8O9GEXPK-I99JwWw&{OMCG1>y15Q95CAK%&z+`>mm3nF;F*Rx!W&9`k8ikQg6 z)u(gb*Z8?zZK?M?jgIE9yKBVC?#aeNe_KY2pkaO3V}FE(1xe*Ud}AwJe>U5_9PUTLyiR|9j%=;i zkYp`PV&gC`eeLr9(Jo`0$>{HzvEEX2W2f?y;QV?{*gOqy-|OZm>5hsJw)j%|Z!Fl@ zOtiXyPDH5`1-rP-0*g%_>X~<|rc}!X0Np?s$dD(;OF-uf21OE6xFQ&f2oFvaBqIx-uZ0T)(d$|H*&YWOSW{Ayat4k#S-1=6&~5 zKjlGvla7&BRY`8Yj#9R&<_BbqiXOLL8BAz=^w*h}XzFMtAdL9Fta6Yn?VO^}@;9ij z9~}4k4D5K3$)xIBM~U+Pn~;VVg_}F-cgCVj1)Islaeg-ZuBa6{Zduz`{1`;`p^rkp z$yTRKlOaZ`=!dFy-h+(PUsFWU+eb8q6a!Ypg)2HWKeku0qTMpq$xM~a_$;!Y2>8#9 zu}naTkAtB?3g+as*gw?4*ljH1+Bx^$Ob)p<38k^T10QGJaMr)Zk3kIeItjUQpaR;p28ljkRhSyG(`!joPtZMb`yMC6 zZ1~>bQ|goewdrmImS#wuS%V!AE)}E1Y$t8+vPrH0z z1gusey9lX#VX*^m`0r{=Y^Ja1|9%hyX;^$oH8ZNiAJlYzuKacJFHMe{QHLnEQNW+? zwZ2y}%6myuMbfzVvtQ_)x0Sn1_rAM; z+kJzdIahWHMJn-{J6Vdt%_MD8s#REef-06d?X%J`)zT#Wm=jiEmy_&Dn-#zCctf>M)i z#X^@R6_$d@WROnBNpauDleW&Qc;X&K&sl#%@2kTX16qWwmyvf&)o*BAyRk2c7g!bm z0Ej4C2Az?pPpr>9MDh_-%oNJFRxwd!NB+T_a|8TZ-}w~ zEgz zf`whRb`Ax7LVRI8_{&PG&fx9bXWq(3av#b9O6UTrsqC+?tHz5y9b&r1*__uJsPlla z^@Jj20fD}0PK>x**%^37U&F0dVxb#{j$-Ee_Z~u*t!n2~H}56NvgA2Q6=@pZ{{Rb2 zdwh9pX68r8YG0rp8XVMbE3>D=daYkhA4~$9%sYRB2!I=@RI%a7{=pdTw=jf|O;DWu zM$9rK!mZk(eF0C?p1t*jMgu9ND$o8!m#>=HY&3tj-iS$?e`KPyCaOrRg3^)+*9WF( zdrfwihd=LXiO;cOI=Ha=b-Y;*+!=xL`VC~v^Ak!dJ2XoT`sCCq?p`O$3QZ}fIc@wA z(wQ9+WJ&tOr*!{GM!UQ2q0SUjqF7CpZpcR31R!uG?TR`sXOxZsXqu%=?W+|QBXaOG&uhILiv?> zPmAf6cCCYa@A5q|-m^S{d(PTKn-ehRSjd>?^4sOr5wOOnKFqj5(?OtKV%e@m!JKhC z5|S1z;9K*&T4VlBY2yggq&6@iMua@_Ph4a9N&2zjgE^c-Fn>V--RI z$rI(zt@?1JR|^ATpD@Hp-yIIUgW0%=I zk$Payy^%1IGjR<1_6#5R>-K*7{cs=NWib+%_ZfBDqkc13jm$pdK>p6lLrcd(!u zL2~E`wV9cq6{)yifv$Jnj?#!)6=kIgs5T$ z)1$L&M90{XT6SMdOjCv9I=4{?Jtm6%bLbb%M=)zTvEf_(A?WTJrT;=cRS>q{*+>Xh z&B=@|rMxd7H!e3pZ^OX-ZL4(P4 z$Q4le*N~8@CTL{kBHp%$sZVmp>^lka8EQ6tNsU5f{#!e521cCQUxZhBbI$D^hd&S(52;}6=MN|S z5YHAzx1Z&~jJz}TZLhy*Kt~C}$nVh1J5KN|4JffalF=gB$T3m)?6D&JBV@dRp84)- z8S`5>fKZ~y@7|RfvKew!bvuZwB01OTNLXX^4p%`)@KMjA;KDv{JG0g080`lE50-2h z_Z$Bkn*E>%e|zyqEvD~Z{fdFT%qj|N1?}Tn{j%){F22&M``4X|#s>EfVj9+~n4*#= zNl2Z(MUNPn1d-W{Vp=L1{%@9x^FH0o==PqoantGGArO~p4e4L-&X4!x#;%HWvp^Sn zFfjp1Npy@TWD06^bOc$M?L#0O)6A>cQ8qH!UYm@5c8B;rltU<}~s>Gki zqX$)|f6vY-oh-zM?rSq2Z&6QoByecKo)~jE&(3i^|BL-KAt_8X=hG3k&AVfBsbuxE zn7<~#z{u6{;n^Gj7#9o8UmA|u_PZBcx#{Oj7kh@umpBv5yq*4j5>aWnPo0Xp zMB0BI#;HGMwFrKYHTQ4EIp^4hV#3`HI{E(v`>mM|nkv)IZa43uKEvN}~R(;!2C ztqViQkJMx#H9#E~iKomB{+xPt<}WP_!=dZkFZ@T387reaCc(Y;HC;U0ZaITOAd(EV zaQghfO2>~5#CVYOsGZ17S}H&j#2J|xtX@_X##n*OOt6L zxA$5(PsHGti3T!D%;c7r(+M=%o~XY_;z*&1CP=jTaJBeji{$}Z`)M#Ha#+bR-dfr6 zS7@W?HIw+ZBWbMmrE)|kD|EQCagQa!E|mL;^dpg(h~=8QkG^jlOzv0F%j9;HLX;`F zU-(0K0ILAs|Hb}{QQFe)=m&G_RK0tr3EG&{SUb3<>RlqQR%!=&MC+GJe zU_m6DFp0s>3Q=v2|0SmRa)X%5Otp$0mdiiy@AC@%Fl8r*AidB(Gpu@o$MQQ< z9yJNacdF}u`Oz%^EV{PQGR$9T{f}UkGne@~%}gE%v&ceeYXI z=Ju~iH#9LDT&3GyF}S7y*>WmLAwz>tFb4nM+Ib|{;M^Z2@Eb`uuL|I#$!%rs7CL$) z{LFdeT@&|NeT$b#Pqe90wHDdGY}?SN0u~s7##KH_W8YoeMZ=a7%2+I9B(L2=ZdO0G zocE$5bu@?FjF0nQR&dDO&bwO1&Gl5b+x+IwdWP6yp|h~1l+)1F6s0pfWP`bPvKHWf zJ>+wsUc6^WIZG2vJ|=Q%27~iD65Fq#QBKc}&k|F>H%4#2v|T6bWSVTvcIo<>)ZX}a zw!IuN@oy6AGiU98l#P%R@4mLN`qbJL4%QQ~F1;2BnEW=IQJ;V3NZMhSBSWUr-RtDTz-dZ{NzJ*G1eF@1O@O=kl&Eju zZn$cTZkI%KAm-iCR!rl(o@d~UXduZxvVX{WYvWb({uN71zWStF7*S6piiXE?nBrQa zZqV<~O*$WzUg|Kj1cT>4Ww5x7#uXQaR9f^{TcQJ{p9OyTFP1dy>}P*^^uhacwvYu@ zJU_qvnom(m{9v>PGmTSKu`0G-$RNM6_m~eh>3# zNh}>(-R+1`uk%X_UQrJ;e(&{xI`Csk+9?T~sYm}Z2CmJ4U+ICd!j-2{f8L3BY-JFb zzOT91c!d|pFr2Kp6>f0DFfc|!Gsxqq1SwHS-E*0z5>e6Ib_||Hstgj#p_C%OKwK|b z_m&6&>h@=rEM4X?KToly8XCWSdKr)AbGAPx3lc*@kQ+@D|z}}?=2};Z(^6V;uPNu8ocMrP!*6sUEqF&Mq#7Z zMTWiU` zSl+xFV-5t3=^%1>E0#|NiA^rL4vH)yUlpCBcx%YIo;1hPt*BT`YCZQX!q;Jl?(yn; z5nUS+=ua@Gbj<7NF@Ke~aaYBiHi6@O<81kCH@9q!+~eB~l=^kWg>Eb_U<j zreI*v_;AAC@j2^YT~_vfD#4<-B&u|TdoAL&rDq1d+_BDNp~IaJ)v$NC#FPYFqdGqU z#`0`$(fed`t?Jp>@xYRnOPqkiBOr6Fozk@{P_F&NhHUKHq+~LCpnceH_JnW5q+V0V z?>Fi0(BN-szTR1}mt#;UyYyvtoGhWo2S^m-VfJ0(;{Mh1IO#DS4Ft8jUot)k{?2Wl zxeW_ioZx8pA8_7Jefh?kdIrq`p&O&@QDp#d<|J~-@{456V){AzwZFf|!UG)Yyd6gz zIV^z}E(EXA33vpqs>;R7S3i11qPQTBgG2=khJKTm4c(-Q+$23gs+^`T^~6k{M_0<- zj*meLY~<#uGneEKvjA*%`vvwZb$OtC@{o3Qtn6=13*oBkd+ z2}_t#3x^827F~?`#J*x?v}y~p3p$140j9ZQdP+8)KkkP;To-X&TMz3SD0Y$&oq2-I zrysvXpbbbi*8htHO{$OCofePhbDApC9;_|jyGww-@&0}<=?tHiC4hZlx^G%puDn*H z6W8^x_Cqe!eh;b{cYAK1Vt6qNmw$vx75QajH$Olt;^I5I7Io-9tJ~YS`m^gE`w*eC z*FnV*Q=bLtC%%mdvV6y-$?I~E50ea!^fy?NU4o(;3~NziRYW=-y6I!8anaBClR7LJ;12quqBxT9acFFCKT$8bU|zx0 z7;A_=v$??#?XYCa(?8OGsz?{fhpR}3fYCMfw_KgmUV1-R&PbEhH`6)9G`y_1P=E`G zrDzPRIwA7gIk}!Yc$&emv8zqXpK~A2>b=4krZ`UF9%}Mo+*L=Ck<>LAE66~Z?Fq|A z%#1QCSqstxGZZk_*b`h>?gJ?%ExOmjUMi|he1PjRikg_see(Qa`7!n=a)vx+uguEWYyEx>tgk}e{7S=-!-SxkZhS2(=a2a0$0Pk}Lzwyn z=LuH>{ynbP;6!8>4xzX2t<;6qCC|9J1Zl+y;VY0rk*GRJJ2ND(9o}9Idw$=cOVU_U z@6}#?*63LMgjnfWX***b=F$vup8Yu?dr>&uKp9u}iu&IW$5zz3w5DRLkziNda^qLA zMoL`L)w9#o`JOdv=fv|VjwT|*4HoP9`i<;+gY(r)j;Zzwq6iOvv&#L-zef;QI*BTX zhLrPD*Ra|c8(B-F<)9m57U#iTQ-h}Wn)TWG3CJC&rZ{U;Y~ zJetIm*btNhJPMTpL<`WKp9}}g{(W-Qi+{0x>$Ujz8(k#ud0#NqQa^KO#P9QtEKv>Z zoCnyw!D!kS?^xiue-j&MbTq%n9*)pCh{xE1pa z>~r>X!g61;jVPtf?o*>e&LHL5wVbdl-yvNWN#q?opJysEiV}nu=6AcZi$QFWkC$gI z7CH5HssGI&Zht_W+EbM1?U2TJeGw_782GES@6*2!OO(xBK}oGeh79(6_wXbwG57C~ zB0(0Oy^H{^nQu?pF4VjxIQx56*VL#tRcU7@JnFPXXZ`k~<;Q+}HIVdv}{ehyB##7uxNU${xE)g=KiheT|j*6x#nv*q)?#J9DEDC zXpmneol%msBD?8k4i=5S%3K8(J@1=z^DC$?xPOFj$F_@gx>#JW9N-tlMB=NQqu<#^ z7YZT6J3Qi~H>>c2-SmDSF*lW#i0PV+Wzn#7{tHY(JeO`}&QC%=pYU)`V9^+zX|+2k z#do~vc=cAG6|@~*Uo$O=ki0r_WmqP0TQpT7D(6zX{QlWnZU@)zUp>zl*;SE?vsxUj zlo&8prStw=zJhhvrtoNmNgyXcaqBkvuvf9y4+*jQW-Nx{RCrZUDnKLS(gk4^M&zOS zXs`Q3?@s4js*%UsewZ6MVmm62dvbcZdRtZ4k+x2^OQ zJ{mqLD(%0gyFDp%X9V238#1aEP6IL|A`Ih6!1_ei5+}{?oc|n;bL#5lOZzvF1r*Qf z2mvZm?{P`rT|$lkjudm*OswPjwD=CnYr(4PmZmr!c2r>|Zv+TY_2 zlo7%GHg)=)1{HiAnb-|N4|Rag=6;s8pis#mDfPumcNpfSc2vk+TEHr!oU9h?I}o-$ z{j(EsY#2um(9ISfQ4(z=cy!4$YoZT12g+q+aSY~uA?s##dicE-o#E?Zi}BQAOInEP zaTJ}Bca4?RBiz2Dvvu4?rRy`hyrH=8NZ=VXowu{#{~4-zW7+;M$a)`k1{& zKn-10j>zn85l(sKSA4nLy^FEBzQf%7`kTKl9J&?w%|$W&Zv|t%9h9V|mU)8r5;M5Y z;HsY9l+&hgFol#JF5cri1qPR}sa4h0+#>M9Rq*k3#IaX9d#2ob_vRQ|U+6FjJvj2z zKa8JpUz#FV@IPAQl2SG9IFiRV%BN4HAHTzvUspz3`B8{xYxIJGt;eo*hL(P=pxFf{ z*i!%d$Ym543J3dgO^l$Ifr)~KENdc8FuKpLKx9DHwC_F=W4*^xsq>OYugre>{6R`5 z{*xEku}eZh97ZJl^qtlcsZkz@#?5I~@?o0-NiIs^GS|auXwuftKAv!MpsSZP!!eh= zNKu-kn@5~U5Ead+=c}W~hFJ_~0Q1KpJb<2HJ>YhDF6Q0E~}dzYpH{nu2X?0CK<1HJ5D@u-YDfBY(#E<#S%(>Xs^Hb@T8lTLQu8x9tjk@f2fU?$$u-Vx&F&;xBy(S;FsEbP2U8XbUU} z)zrsF!zgNhX?%L>G@Wi)dqzCTzs#feken%3?lWt*7$cZchO0>|kD{TtM5huQmI{`9 zpEg8CNa%chKQk-*E9Nfdi_f4zE;{ee*N;L~d`ft%Lfp=tYW>4$+RizOI&HOmLq)oW zzMJ)lT2MS;)XPW)bwiSyS6+*n3N$pklhM;QFhA+;Q)!uu_4-a2i0<={{4$vU)LLHa zs4X(*Vp;#-rn_oCnnx}U{i4KAa*-`+QL?HG@f__hWO-N=nwM{*Fm=Vl```4xwe+>r znZeVa`C2rtu-Q%@6|M#Y`0HPKqM=4}ZKB$mUNmtMS4L7&Vfk~fni8Y7dXLEoNopo* zq^u!+z?DnXC74?z7cypFxjRl2c#c#<$;tYLZCh$ZQN)=3jXHqC0Nf9_Zr$2$<5HXi z`DLJ+)6&uc++?gdJgrL4HXpT6>-cojYT>LrtJ$Y;{#5*XC6T60)X2PJtS z%6D$b1OAj75sLq<`VtUgh%7gN0z&Q+N!5V43?eTo*Vcmc(Sajz4sfLn&Ex&e6F^>r z2x^%{=+)Q!^YVmTI9OZ(mnf8jUF>%=KvMR8?Qd#&8G_qE2IewO3QcFo@=) ziP*$_rH_eIP+*i5t|||Vbs3Z2N%g;-{z+Q{%?blk64PJ!=+BVyHb9g6`&I7y*iMw2 zgBla(vyS$5Fn4w64ax=7AAq{|I0(D|5C{~p2Qws;l-6bAphx!h+e;pRSoeVoZLW_E z2Fk+cfZ0rhzQ2pRU~A`>QM_zBmXC>cMEqCoY4dFrG?T!~uT$`R-(p)on4`i{T&cVk zc;3YxN%)*IiZGI}9e(8mr7(1S&_8@tm~$>b65tuxmgAOV1d&8om3Fm`9h>n5oFAyjyt*70<4?Pcm~{wf+yQ+<$l zs#&A-x*g@ypHW?14Z^en&vpng!Et<|(n?+u77-%1MQ-!)p&cy^jnCWj?Td38(EpuD z8G{k{^T)BOHHd=WQASabg3GKQXq8Ly^I;SMu^&DV11N@yYTL0OH<$VD-O#s)m6fc0 z+2$@N-U1;vA|Zjb+aCP5q9P+FDlC_~B`%##m$oFyHhI?wv;Ejf|2me5(_pIq$|%mF zQr|JexAs@Ng(xlF%jfxlPkyP(@^lBY$}-AE=ms2CXFC)yIxb%i8c##@+hV4D_bmeP0{O}q+yPKL`wj3J7chuuYinz6ZYJV62dyw&K;VIk z5WCHcV9rzT^CMGLReU_XYFm)39NZb%neRZ%7jw4N)PEq#NPsF0_HDY0`%UTAB4bgU zLm_*|DnIdDRO{r>Zkc9Sb>AH}X~Leev6t-$qI#p~yq&6X+8T@YRMsRM>ahxu&m&(% z-Fa}cX@8$fKuy)S(_iT->aWy8>jTxiG?C}{KUVtnjb*dH1!G?lCH0v2Z3g(5{n6Fc z)n}K}O6knN_;@P$CI=XLgD&di@<+E~|F=L)y;c=-deC(7gKHB+f8oCzWSzyR>*@-E z;3E7J0ph<@=d`Y&t9uHb9Hu5F04C;TWnBaNuTP=Nm$`6Q*VE#-(JVDj7YR0X=Zs2)o2&ItQbgh#OFeQM~ zWlTz?O2ckUwCtT2vC+^YaB@-2^Qq1=wfLo)3MUTM9U)rr{OT~*Bnk`F7g6G4>=>x7 z`H`ghyBEyD#|&73DYpm9!*N_5{qam>NsGx>#O&=_@`%M~lEXRU=-^AaE>eLyrMzr- z<6Cz(9j&rqpO+BG`^!^vvF@ma88Q4Y&nJFbWzCQd8)#yP8ZZ9)65=8bixByM2{^^B zt@GKpExwg7NGeV}iuUO>hTa!akuN2sgaxI>9Ib~w zituwh5AGqX!O3}Y>Ge+oH=lAN^2Ke3#^#E2i9PJTjX9wv`p%85B1y@1HxYb(w#nl+ z5glirl77lXdQKJJIgyp@opik{YGnyv`=XIB7;CVic>8V02X~*r`^}p-L>lS&`IDi~ zJPI@ULzY3|71V-3?Y+y(6LtvT&i5LUfkQdsF^{sqVM@bJ!~TTbENe^SNaH17*Yn{Z zxz@H(FPfZ|E%Jv2&F8~I8L>=oRK&`&0`voLvUNp`2zzLI#`yNr74 z5-n{rshtV=0h6P264rD_nuu7BjHmAlMi$>r-xsuEFC;Es$#uc>_xdtsC3RpsR{mY% zIBNK0z>r&2)=Ag%?+=7k1UbS9cqjn>E|l~^yHlX5ezhJNmdb&v_Sz7Vf`mHgRbTw5 zPV!9lAo1LuIUmgYD)+Lsn_F+pam(?upwZ`icJ=ldSgIfUgO#=~n%y(sebb(rT_Z-v z+Wo!vozzGYpYP>C3w^~s7mrJ?12B9_F#H1o@E^;{22IxOuNxZ9REqGh&L&O1Fck_cPUfY%hMMeA{ce z)Ps)J^WsA_+6RVsI3HT+Q}{t?7AD?dTtF?BUOko&ovHzqdf7MX*T{q0Z#0_y9j!Yn zpN$nrJ3DzN#=Jk|$PQPl3xum}ia2%QrFPjrN`bc~z>O0R&*%;#V|I&Nh?{Q5n^3v8 z%sf1m2}OVBGQxxt!2J<0_$3xU@_l`M;Y5W$0Ab6;&wq^AtO&lc-xMNC72n4b(X)NV zvz22veUPE{h8ji`vzK()SBA5){XwVd_DUrc)lEi+(yD{yHbzOc@Y`>CYZR9gmbm2K zv3&M#kht`P`XL@uGx{hg7A%*CbTrl0O~!=7d#VkiYC8Iz=INg#3tv_#*EkM+_}ohQ zTYwq$`!bBO3H&^@a$+FVtsVzz)Fd^=7kZ&5ictq zjvL}Im*gmR&4`sF@@?1ssr3)I-!+^Fts;Y7xxWAOmB`7Oc(ark$s@vXec|n|nEGNH zUJ(>C#*PgoUYwcTZNYouk&xW#JD>T>gyb0Qb-ozP0B}obX$yYT0^I5d z0giSwxZMdyGVtSfKdn+WDET3UxdN@xU4&i7T2A_{~17O({ehmy2@KhpT*of1*MH9Xrh zSC2dHsO|V}XY<}R$zwKxNK4j3j&}Oz!Stlf$`LQ-oA`N^9B_F;i5>3A-F)KQRO2gj zDgSe(T%^&LM9(Kxn`I81VUlqf%FevnI_!h!S=h0v_+4f5Clwa^W8q)ze}1SNPYdCQ zWEjsh*j7R5|BiI1Nz93U;jv7Tx?3qkHn@|_npC2B!&evM&o?_pCcFHFusb#+bdhoN z?*^$};zvkEDtvt_8`3EmX;+;>Hmnxf*b>{&EpMD%U6A!_iFbJL@d+)2Y%&qA`mJTO& zz~rSQCC6+Q7Zf=2~7Or^jbgX80pLjl&Zbm=cJA+aJA zxMW$wGC-&CVEimXDTdm0TD#z}r9iIOs( zVPjjD@Wk`{$=~Gm5bGc@{J}W+z)5IVB_8Sv-etq@uKVMrpaf|TB9n;Fg#N|xD99e; zPzoN7o2J0ELRs<;$m8>G;pnKS7)aJZ{v&|V1d6Q_P7f+1b)EhNWuit6C5hz2$L!8Xv zK5_HLjk|D7Rx^RT8Npi*m2QNT0=|9;xGDDau3J-lM#=*)q~Ln-aE2eWA;4nAdDA|b z96X@D!A)!Cpo|Jc$YH?-LpVti{C~}TWmr{hyX{g@5T!vyH9!%{Au}cRk}C<2hpT_Et)6BEQ0PnK7^LGhNQN;cffJO(<>lnk@0s>4 z4}FkN6CfcV_zJY^|M1{{$u)ZXxE-kCT=z>nQPn##)(F zzAYG#!p5i_*vFbxPD`Lq#$!8WmC7dq`df>OW`?H8nbZr<`9Ke<2P|gE(*{2fK}v_j zj)mnTlm~!G&l4ILR&xw|^p3b!g7&!{qc^U9=el2~OyYMlZf(OLW8sPZX6c;Y$7J1j z6o28Ze{Ls=I~x;#_p#fSdJ6{d4&j z=;l!Q@m_0nT7d*_ZwB%^JDu4!B_-@h^m;X_`q$$;&1996ooqOtJ|LpizeC-+Z0F2? z!VnI_zr<+hzX=^G2$!a3`MdSh+qX5I)6OfbKat(soBi4}Cs>BJ@3LnoO4v%zOoMUx zLGwk@texKp)Na-reT8c$E$%psPx#$dl&4I?$1o3#B&+xqN;&I=NzvkarR0I!&%%Ae zI$Kf3*`3i!S3-9j@X`ggM>j}_4F;XZoPWJncsYl0ZldI7;VmlODHiW{Ed6mtEWMM5 zeb^tustzfYOMTZj$hAtfwcomO>=MKzo=Brmo7i;z_*fscz1RCxOV1A9phs3o8Cq>@ zy<4hJY(hBy2n>Cmy-RqVv@yu>-Pef6SaW6g^iy+q`HjnBS$HZxr1(rony|p1p0nW8sB5lRzEMcuN+#)-NHtpaqcJ+GdCwr*p=&a! z$s3S1hscf9CX{^T#u;0yezn`YcXI)cY$4ajwKYiF7;~j!vkt4^8iyefX{*NQ1NE@D zQ{6Oz-4JtCeVoaxA7Ui7UB}*RSTzUuTxoGq4b5vS>HB{r<_CurAhv;~%GY=-=<$71Gr* zU5R4XDviZm;h=*^t}rIb6ZpxF{@CGPf%{B9YgC zd%-C+=s87ZX+4jUo{k3|8`&Kls-_@*dV#i)J7%tWe?^EQ zIYr8kH+u6nRnuz+NxM56qn3r?m0tH^@{UJ3R&Foj67dN+w=-W|(Yb%`#NgW)w&U^IRqrlO*vpjfVoG@Id1&hX?C8FweA z97!-;z4^7Ibl-rx*Vw1mGxeUZDTnx;e(jjF)NI~!lMKrBvCXoa^Ez~Mr(au|PI1sb zQ&D#kCp3l6sr|Vhl-y=bQEm}2S0NLhj8jAJn6}V>-TEWYxiGZV_l!tWaq6?Vu0g`u zamJ(Djt|+>ejN^5unm0>|K{lU%FX;deQqO;^M~Qeo~#;q~+SPaWJ-pNei9ClJ$iGVeX}F$!R&`gpI7o-mH$;|KPwntYF{H&d%v90`#T zEwja+rx#;(+v+n3Q zk?kKWw9!ptm&)omKCRTx_lM+E08)0B2H(&7ikgaENI)(lUD{*Zm6gPlk=Ca=OP0aQ z-kOFzCCkUY4DP$D&pN}i5@U#yALhkjy!m0*X)VRy^tL4**!g;P2;?MhiipD1}fh%kX^AI;quaOefwauUB4`yqrz0MysVLT z)M4+k0JupcajT?Cn8p2^g9N$!5t**ix*Ko6o6Jb&G&rvNisTr;)Ia6 zx=vP$7Z0~Eg^}CH5-&}*kByeLyP}8hOY$B7iWIAV<5gMPsw{E>873I@aDNOX@`cp%--2{v}2u0SK0a8 z;VAH96~@T>T1ma#aTb$i;88Fh1E>#*Co4rb?LVjTkWh@z%j`N3u@WBJeQ>#jLZ zRw)ODI`1Dnmr+A9@bN6{6vAdRsrj%DkRJ<6S*h9`J`J zbb$3yw8>uOY&Os2@;iN1YJdA8ee>2*3E{Ma8~$c}?y3Xy?|*pCk_49pV{auyi3-yA zgPr`v`EQkgp~&l&LZ81{Z24Sq*29|wt_P2<#yk{|30XYS%O397S#_XuugaO^vwZp@ z{@aO9cnk@B)w6ZKl(}nR^~MkK3zTUE%$`fs3{ress*@@^4^Ae&=up4}C)325&wkr? zTJ0^dsokg;I_yq{&tJTVf@ou3L6P)LOAbAvrHan^I(*Ymdv$tc^@bs{p{=QXkvc8x{z@%47S$^ zMup_&LMPSZ)fQG6iBa_`?yFt1sX`4MvsYh+l3Mzw%x+q&~u zsd~))(?H@4(zk+F=i_QKu_G+s-=CWhONzVk)Qsvk+dW2(=(pc=l#COW(s^A%L$C0f z&I2bd1q}(wl^9v=W5vz=sng;qC9DVU6pM~m65d-AR%yTJV5$5#=qkF@`=eFJPi7d{ycMtwqR(#U?jcdXgE z2%1xTT5j1tH{w@&YSz334+9yeZmP)h zK!5y7(5#`7vg(t?pEi-h4-OZE(8aO%RkB1pwXLRszcvo*{e;-7dzp+J?2Nvh`Hf9! zwzypg?w9wzzTinJoBfiT(lxciWWm_oPkA&wmHW$5(8ab%J{=Q>Vba&6q&c3(J%_67 z_ZwpIxvL};s<$i#jdv&60L2xGc-rtk&&Ib;a_Huds|~!Wcnln~{=98&zHB*=amCHs zY40V`XOlHUv55Q5;hwVEm2Yo7UP!&-Amdh5Y%Cq_f-|@1=KkeQT5HGSc(OOil5WC8 zTJh5(zmCt3P%fZDD-=bzt?i$$mA?*|=*2Y-i(=_u3{YinyLR&rmuZtu`Z{L^@jbT> z6q9ymb{=${pA`wvXtD2+(o9EJ*b_MpmzBOet7moJ{}cCu*+XXV)rO4hk!o!cE+%VG z3DFP)v=iY2fp18mf#C~jA}97KYav=I&Ed1US*OJ1LT+{T?}fLLHAUDI7H#aEXr0D55gwfWMr2sR7vo~7E`sj zk?JI!Wd7^ghXLv3zs+s;E4k15OtS*>-><(2@}Jq8mLt;>e8*{$YPmqximp^K$xyj1 zrH7@qF71%$yrl91ujjX00_lz4?+A50#(vAH@l>eWX!M0I9-QHfWtbhQ`R*P z#njZwqMjYB%KlxOAQjG>-SLG;@f&;t`Ig%AF2YXN2V&lpbfg*^y0s>7@8l0&wBgq) z+BasuxYI~<@yPV0-j-4tcZXoZ#d7nBY{7YQ*w%TE^SV;Mgwo`#iapVAU~1GU)abMN z*^)FxX~XGXTCZ$2>mmjUp`vM#~?IHGd3ENzN*I`Ie|el zmp3pHZzvt0_OmuS`i)+o-d@*Q zUhHIM0?=uswedN52j&^27naI3I`)q0IQO{aw@bR12y(xwgTtx?(Lt2Y%L~ZZ-kBfd z&;1d(UF(M@HT*5@WCC|iMK3^=+dqo-HR+L()Fz=?mv8@xp>^uG(*iZCbP4mlmIYaK zr!8+|=gS&4UH#}4lG|Jj303n!&7nC3_kukrwBCf;_b&J@NZ}}qY?-;BH+XyVWtd&* zJu8RXp<0tSeht8(qC-d|MfCZ+UdTn|i@)hF_@;Q0rp5RXPh|bDh{ZRtaods}X<*=O zlI_KFpsb>*|Ac2jKrjMlB9f%dK}l@G47qtmYF#&PwWl)c3$OAldE$3Jm8(dnA2MvG zp`~TmR$|C1jl|n7z1G0FVXqhOQwDmhuNh|MUG|Jm7 z*L_b}->+F0e^n=D>|^4uOHD|nq3xhDv~l*-*uNFqF1=Fi4ELpQnJ*CkIE}BgqD=Q$ zqZR=pcm3L1V(q2Ur3+Df1(2*L35jS zQ8b^S$KCAWl`~%55bP?>c*343aheyT<@ngHgGy%_2j;*h@5^Z2%!bC}oTJ(VEDOgw z-=30R*aYg1KYUsHWlM;CU52*WsCdkoqCv!NLb$9v-^;(#l0|x!5|4|qJu@h z3V#0>i0^iG^P-SsWGD&cw`p$)H-fQ3oxgIP1_LU7J(JrC_G7d;wfAN1)g^F`Rd6kp z^>8fPtrk8%k;@+lmE&MQhp!V1T5#Rt&fUt1O=qzkN-ektbs#CB2uz53fGrtcjQXp? zUINw8gD#=RVhK%S$y&OW7Q#h!lta(#Wl155nU{+<4TE!Am3PN*f&?!G5rA1`ieG*` z&ZR$a(N$PZLCIKBu?Qaz{+2mwrXlSLqX7pHDZSi1_ET(zVN!3X0d4_*<>G^W1qD_y ztZ$VzL;k&8lTYbCFe@8(<3h(f%B%>vY#zoEPYRr>hP*X+48w}bd=20#A1NXTsKUoP zt;rsS#jRgwp7T+LzoE_$0(W5|Kg-l{#9{<|oA@ZqXqVqJObng;0u5k8_Zig_a;@S|9OneL;zd++(tRMD^OE8umF2tOQ#{Op z3tViPujgk1MG{gw933MSSBh&5-OEXNdaaWO@Gz0g4PZ?0ULR3E0x_RfhPk7)bvQ}A zEKp}Qltm5MJ2N7rV_WW7#PdM)vdM^c!vM`BW(&W+Q zE731hpf?UK=Hm|+6Q|#>GYK%pj!2IpPRcDos($eD#ijE{g$Hq$S2S{J7RPlEA|Vz^ z)X)d{!~?qqm@X~FNV3_x&?=1b5r>v>>Q|R#7bq4qmwdOg85>CI9^v4%ZvOoco$u{8 zsB;onHUpn%L-RAycRo9$h#O-*Mmt&Q&hFif($O6DB02}x$$S9uKNh~&!h}-tgm3fPEJ?A=f|nAL{Ra(R{QVXh{YLw%=TOJKo`GbqtHX_z;})nJ-mv%@8A}Om`~oeaUhwYJ+({F z-&?)}jb51!H5>R%WOV=e49x!*%l`ro_ZGU;B! zB}bjM#H*+74Q2c7l*)~~FlZW=UA#$nQ+1vBpKGD0X#vlMatr1*ULT8g{A07h+>qU? z9EjQS^51(w-O|9h=*9j!;UpdGwRy|1p|q=60E4Ff<#MxL^H&^_sz0B`P*AX7rqIXu z{bklgg<}pQPFXv3I&QsI#%tNUD?m&+2LFiU-w^&ynr!tXLM>426Hc^yc>r9xB$ zZWI4I7u5KE^#dUv>xkzB)SLV)s{hUj>h$98`7iai8yNLMa$i4wfs8n+7xB7DhK)Zn zL+wo})EBCDtC&!5ggTY2hgsnSy zUH|?G2pBfqr8E@U++Sj}J*t{gYI-3kLqYuQ{O?D|6rd)aiUl3oToA><7pQ;bvD$b_ z#9;b6=!&wFMvNS*fm>NZ&vz*#s7HMfLfTK^La z|7Z3V7UbXm{ZD*b?4b<`BLalQS0^e<>$LvfD87Q*?(z`eXf*SveDN*1ftk&;FI{Ik z|L;>^F@fU4Oj zpVi;re`tdx`o`x5rh=(I{-Z~a!irzLdIfJ7n%aa&fd;)cgsZR*$8d(Fqi#Ekuk$QC z%P&%Ip1?tH>Ti&3mmtk&!MVw;Xb~3gf`$>kfQjqBkoW{we0&7AEYZwIK zle7OQ@$vGOH%7z3n#14Mw$Hf>7FoWibMH*twJj_x%*@QrPEXdIE(GB4XPyBa%s$6B_~n<@}`#rgyE0{gJ|YvZJT|sql1G7`TYaH+<{zt zILs2YuyEZN&PSwX$qO`}-?AQs!qd9nE`>9HEt^UPE-o$rAX@Pt7-aa>?qHx6j2>WA zLHh*YTtjj(=Z-ac_9}8Rys7{x3!v$}JAt^@rR3z+;W|CM*S}0-(XheO7#>etnRcH5 zY*IRK*v>giN_GHVlaxi{E+8)w6BCndg?#F_irat?`Pmnrb0($y%*@P8OlHkN1OT+$ zQaL#O^V|Dqd>X{lxNIgWl5K3)h)}20A|fL9@23Uz z=ya#l7uToj&wx1a^QaXti6siTy8y5TScwGzjYWG1*c3!aqsoHCXZpj?4cFPm01yb? zT^f)W*`4o7K(t)B&u~x&aj-(CVZ%&ysZ_R20#q3R8v=FK8+C4&$v=WCXgoQ3al>DmKLG@+uMU6J9r(3a@fSR?Je&d%)}>iVNcxT4nYU)(4M zL;_qSQ6?L1+t}1}WZ3om3?2+EDU+umpU-ayOTrK+xD%>Mjv$DCH`@#FWS8|T019Zb!Ik-v_L zifRhPbFFf2!r_%k;pt&=95qfLCk6dUpfJo3yygx7DF9vn>P{K}lSXlT%|g-hmJ%xC z_;97Lby}l*js!&NuMz;}-8}i1+eqT=sS;yp`8Y#={4bK>`xP(=u|ZzI#n-)kY%G8y zn$PKi0c%4s;07WElhkA4e#XkeLdEa!HjAmFql0_u8LED+wv9X|3iu(r*CxUF|3$3S z4sN*KWZ@9Q@|^)gj9}_!p8bl}F)*Md08~L9K)LDZ-xg3};@jo*&jBa(BlL?)I1bE! zbYF;#jUBUQ^U3%i7Ma3rsWx5bSqRF|9}23NX=x1r6c5ou8c^wj{aG%VN1e7W+OLh3 zIlA+5aBRU>i6{9$&z~=~pkPW+SX^B}*os)t>Z(<_?xvIp`b)kS+i#PL1boBOJEQpHG!P65Xs` z?{ts6QnU^kurDoUO0&W^rIXadLYgXyPsRW;s#}t zzZVvd>}qefb01l>|94a~VYQ-F6cp?h`)Nk1Va?Igu9o2_DEH5ymI;xMak`~`ElmaI zev{A6=X^mMQrjRC_NbtjMDM^}5||W#eFenPL5t8~@*yz(90u)wo-{!`f=Ut%KCmFk z4gyA=l<RQAft5%7xEW;_PT?tEGAe-)qj4aK$t0u&XLdX0t!cy-c(66 zIK-!7Vq%`<1k`q!ZRZ9V;PwQFU}JXQ>%;$w5X=Jrm^}27vXT<`p-;wL*J#~#ht!3x zOU)Ky_=p^UBzJgyG3bcztC&E~$=)eB35oHUw6IY-KG^Mq{EM5e$aF2iUcCijtOC0+ zjGcv4fKY@Zq9-=)o@5y54)Sg*CArQQ==^7H!bD=?-M9~na&yy8-WVKv6>JyZ3z(d( zz@ILPzI^#I*#1t?6_sIBzRq*)%f@TC?RPN706XIYK$tW+JVLUPexzX-t9HdEaOSTJ z<`NN*3l+ddg5D7?pc`K?d6Z^o$q?{AA$ng%W))cdN5iHYuR8QKuwQx6Z{ zRpR949x^F~aElw_f&$G2aVaTmf-Ejb!y$5Pk7!4K#24WY#C4@ zL!Xu-tc2a6FeFw*6z!ma2O^MV=tM-FLm?U7`3F)`odDs|oX*GcxE6{y3PFdTSOjGd zVnNKkI|SZ17U41nIozIPZqQ+N!FvQO&0JUw|aP?=LtacH2hb-r}es#pU;mpZWH zj|sgdpJrD{$AY*sE$8 zQv2W4Ws(v)ldA*?dPpPE0b>W6JWuLb&!ILg;TRDxQ6<6>PTv z+duFFM92cJ>-Rkl>~gdq*at%BSo$SsjQON@3^yj1Cctgb90dP>-#rA5UTIlb?j#w& zKOe&Lj27q!(n?87r+`s{K?l=4R&I-ch26;|j{weA51Sp@Z(=$Ifl(g;vG!*^u#vt- zLgERV4Y1Qf&$o?WQG;0kVMTyXisl$V_5k6Pp^OZ){ZH#^Xz&4~5bk_udB_qh5y`2! z)nwH!5_FZ@>gnq0T3J~^Cm|y00ef%k3W6_$Or%`CGmY0aJ&Or&c^eSyJg9sMyk2T`>fWDd|3 zAP`?XY6VRR=Lnz|Asa&O))pkRfp)gmvp29-5G%I7KFPqq01mC<^l+su@@5~|Jt?oP z7E(yx{`~oa{sgd72-n-&+hH^YinsJUwpt)qhDq0iwF^rZ0y@4^UsxJQy3I^t(w zw3c@w&5ewHLZ?dI$)47T|2;@t+N8olK?Q;%MW*OD_Ha*~UA5*JhX8j@ppOTl0*Ivd4C+r0KUh)%+b}mf zcRirG(OkgK4AGgmgoI#iIe4x>yqhj=UGQi&6|a25$PEVfU2t3w}1 z2|Pjh3P^sFMy*`(eu4l&@!1w5Bcs5itc(nojd?N;G}MgnKny%uYU+O0gn`-={JXGG z_Fw~q0q+b*)ia3n;cix7|BbXNgI}oxKLbBZgF?=O2M=JHH9`48POcaBGYojvn>TvE zMGrLx2$F%s{sgug1g`EtrVX`=S&a_JEfV76hrwBc2Fh&?4tuz51j!AzfN*m|&I=uA z{kje?TiUyK5Mb)9)C?KsKt#Y=sv$KOW zuY*aLHUWtSR73a)U^!WXrGdss@YPRhp4pq2`~nOz5I~2cCSU?V8+>V|;RP(1iv&Wj znnSXlQG9c9g4s&3t>YIF@g97y*z^*oR5O1CpyQ<`vXGl*2z$bK6vBg(G32XR!bS;W zm5~S|Sp^gb>IY$-r`MS!mQFVni)A*}KJjp;MM zutFg4yW>^{eHM_m>p`9mS&|xzDTE4_u97{C{D`PVGzMG=HiM@I8JO_kU`gnc5%E5S z#;8+JZ`|FOo(=-SnR8inM7NRSLH-DQY#Nqpp~WqaVfcXw_`3A)AQlaQY=-dUR+T6E zjzFJ7L|D1sh@Tm$+# zj~?|_avX@GVT)#;RB?!z{cM6Xu&vlj-erBlygMuPuD+PPeeua5+*nv;CTL8sGcnn@ zVG!_N+iRYB-1;5DQ7T(--0rQ3Kj|Xx8`K|wMWdXb27Q>eMoM0ru;5^tEU^7kUSGT5 zesQh~a6wb7mk>L9U!ofHcqp_bkAE_s+c9nDj|>Z=&+3S|B^WOwFVFkZ8_{3HuD3^_ zMEqop;iSwCRyHiAR~#$iRfNAetU34*WS!BUya zN39+P;+{Y!2Gz>`PuO~-VrU5o?}OPu*eQD}NE$8TEliLm>{)eqw4)8uN>DHinu~*e zqJ9k>e(zHc!v&?#7K2oJe((;EnDSqPB)q=ZydP3tC<^G#&KW%cIJBIGM&gOovu71s z^|x7Bdyd>AZwMvF#5}}3)55VH`-F(n0m(EW35lvcRPv7@>jcvmd+x#|$lL;uRMxP( zYbq}nysI3g)tKphh_1fp7TJe7t~;H)q_nZqX#$tUg8ZP-%w-s@iGBgi$@+_r*mrBi1` zM-$S`UFUcB2{{q^XY3^$q#g>{d1QDcIB}i6EVH3J68_cbWl1Zmk6S+=eE7!Ivo#Er z0Fd2?27xgV5*{cpNB-mAlaVUlXo)eRNRL3;V`8pj*5&oxIAeD13eE|zgV;o;&f~eJ zW-`7Xhs(jHK5a;7=n?dsYhQszO$v5++{I5HEI@q8!(3cfH$AE$Y&5R`+GgsY9|~Jy zhc zaQy^WHLxyVo2TFkhV`_77x~Lj<;zG*`vVqzHOK)(Qt@+o9y%Re?S9#$QS~bisk^CY zYkR;Nt*GFm!-rKiWPX@MWEk>>?&h0Zp%>2uWE;#DU^YB+dtwq3$wp=+Xrqn!p^OZ3 z|9;vmEHAJ1zE*iS|KIzvPp#0p2#O>f&>^Fq51Lw=vxt090I4n(Ha6s2RS-OEfZ!Fx zgUc$osQ!K=?iEE*K%E=<*Q#K+p=DnV3P%a~x38=66&EF2@uZBeTnh~dA~S5=7I{Ms z-fOo``MqV0)1>Plt2>AM8V6&w+Hd)$UC}FoZ%lMX*1~5&e_*oiojAo@D8y5sGJ_P3 zv|uhFR)jcDO-TvSZUTQ+2ePT)Lbi=>mu7<;U3HX)Ad( z$@AukU1SWQk&(Q^UCxlRf$sxnv|U0#RGHrY z-aL70!D`T!C2!FA1SZEuf(0n{>L`&cq~QgGCzF8pKLr~kod5x$(-PQ|TQZ4AQdn-7 z4$&x93XrmiK7|$J4tZ6O8F(1D_MS@jTF^kl3rx#mV>EQT*tws8;2TXA)Y8cGC}vF| z(YLv>@bl*?w7`JpQne9>QZGm4;J|QNtFya%o)uiCfE3bxi`6lMLECBLHfzJ)bRkQO z#%12tYOwIuqa`iH4KPM25PKmq*5HPT6v2BzA=0u8XRf*oj>j(vNTMI8pis_#X%){8 zBg56b?hXZTaByksoh35Hb8-sHXLI2*`MBCKjFS!H~6HOa9viJP%<3O%})| zL7Vz;Su_YpEQ0Dz1?;O21B7z~8D57=;F{BHAW(Hfx^cOnQF{5lUr?CQ`p*_pJ^HMo zq9SP4BUFTHdbn=`DC-WCZ9dciD*A8a~Z-{=H?Yw+6W zZX%2ee~W>Le7P&kO>(&X{DEte*C!;(xeo3sjHkWCO8zC13t2*_N&O1qvL$GjLZm>n zZNsk%?txU>pflo7q0rw4Y7-C;??D1Y1)dENQUvd4QK;J5a0%&+f=)+}%!r2l2JL2} z7G-&Phfw$7OSjtuy%LCrq4>mn`?fh;42shWskYyX8WPo?!z!JEg6ohuq`Ku`<~@P?PoVC2J_HC{mI2gN#RS<*GHk( zpq#lpQaBCDk+sm#2r86jP*NNLzC<*-8H@~E#`@ziB3@JMgO55N0txP>7Fe#}t-euM zazb&%n)!Qg)?h)>v}wVf14|rn#?o1G43%q&l(hDeRSl%Jj@|)jwDH_iP+p%jW?tmTO&bQQOu;WnrYvMcpH-K-}2lCINOHYXk3 z91@p$92E7KNXy6|!4|}sa6e#W$qk_b_&H&s%u?OP#zsuc&+~`~60tq7K*45^A<8W< ztWH$kgTo-m*kJMAEBL5apB_|Dwai>PS_6I!C>ds!%q-1i$JrqUcDC>F&rG6{9Za; zh;tD2B&cb&N6|sC0%U_mq0t!fOe9IfyD4nYj5RW2`W@zY`^F?pYh^vYkv?_XvemSVH7Ni`$F7^|ErLQe9E!&)sJ5*H!AjjdE98*+IlwVJo$NT z>)G-4_Wiz*l`^J~Y;)m-J*oqj>J#Bq^W>NMOkLY{d@LE$HsuRndrrLS@3TIy)IO}s z$X@cQx8+Hhv~d+kQ~NM9opE(@14|4w!w~=AV7&~rc`pHc0Lq^bIj4M$0l}0g(*y8S z_?_NZ=X??tt88j@p*e9q0JV9i968nWFEIv;AayKq&W*)@M9{2B!ncSvXVG9CCN_WWbeIq zM*QyQy1wr};&;1!Uhntqy1H_l^Ljm>k8!`>ANS`8xTK-Hmx`H+f`VeN$^`{23JS^} z6cpP=c5TJq?3S7Pi+}AjRZ~`=*d+h&RdGr<1;r5x6@|0fZm|=c?oRE^ahsbVTs4Ka ztAdNBt@~ty`?)l>2GG-8P(6BJr~aFoOD8^EQT3~j9(6LSS5JxaJ*5A0)T!rF3d;{I zi-e>z7ruW9dpI#ms9YnsN8WJ{&Dq$TXo|5oPz zg5dwsgW~^xK_G8SgEH3h+%&s2O(&I0MI*)0#YHF9QY>j8vGc)63 z4CGQ_46HEC+P-7QMRj!v)_t>qeP6_4E{1Uxb_&!JTW#ictAw%c^YhxW;@|hM&MffB z6T@t?pgJ>0sklC7{2(vs55N6^*{g=x>V{`ZqVgWi%*+%O73C8n^3K`sN^Rx|=E%4d zD_G);*YC8Kio>UkI_=!CgMop8e@@;sN57)(L`lJ2>+DwCOlhf)z5T57dd#MvU%8O1 ztgK_j!osJf(V}QxL$*i(Bdrq$K7amvR(CrkC2xedaj4_yPj360t1Bz-nypBggl>U3 zDqdb*b2GC8RKBI9rRNeZz0F@8y&l4{B-@t1FGF6%S)a|#dn3_`bZS7-TUtectW>!*C`Z_o`ejxH$rjFcW zuev_wfz*hQ*V;U%nd@q6pWp*=aj9%6^s5X3amn>PR$$>+=*QY z=}Bjxp!ky%6&)Szd_ydzLN})FSmlq5R-(j>EWLpVPa!79o5Xg-_v6fS)k4I)bD^qg z0xNlW_qhXv2DUNF3I^=k8CSCNB?irlv`}D$Boq{lcBr`5t`qAu4hE_U&IQD){F{_W9j( za&j^?{o>^twP}~E&BNs58))DAWrs?bs;a7tTO2<>f1mtRb$7S?3{{X4JuPk4pIs%{ z*;l+R_|7Oa|Ff&|HlFzC(W4Gi-Azp*l9KMlK9S>>2Pljl_H=f3iin6{y%R2-I6x&C zXL2Ob3zqVoUH8XHqfXTD)yON(HGcUc|w%@W) zrv0dfKXu{dciJ3-Oy&EJZ{50eKysU8N$F6<)@|FiZQc4+H(JIKOKWF+rDJB86@RkL zYPE5&5O8oLa&<1MuY5`g7NE-L6n0uMpcM^t95`Yia3rGtl;jb|zoVuC$2e@{<>fDr z^BbM?bCqD_SRm^0^=%DPOHRLVkULV?&eEyPN7M$}dZ)|Uu77`MYlasUet-9q9BR;ph z+)!IvTVJoCqLM!p--L~uKHpH+v9ennJCWL)p`WAr%hftZ-^a&C$dhZzn=w#Prtd3J zC-rK_WSv=dlr?R4eX*I4P=7&Nx$`?e{dAXNU4Pq(PR%FoE-o$3E56NE3?eRlmj(0F zj?ntq#qoq^$hdJwMsTBabWAEf=4a!x%4r*QdR*X*I^wt3r^*!>E$OaNznBu3AC;$J z&o}$lHK@Py=L$=dU)~FMb`L^+QG2v@_cn@q41Q#!=GNL_Gxb8KAohe26H!k&D25?+G(EYyIDxb?`3pVTg`SS=y zydVC6i?HdDtaS(%14E8gGf%#N!MZ_3T}f0TU+t)q3ziTUiKMBi87R`<*Y`0y8|4vo z*(&G8jT>xxxQ7=THrE^GNXh+9QWuXk{U%>gjTX3-iScoId8&Q;>Z_`%YHHLpG)k)E zb<$`~Rw%dpys%ZA@3x4t>ud@zCYr&(~I5Xt&9mI;bbt_Fi)ns8&QSH>`YI>eNZ#G;94sact|GMpplP{fpX_Pa4eo+yhk`wC- zTrXd~jE#+b@q#Wrn(^4w?~Dd6Z*Ol@<@@*Vn~JH)JWvVaY7j;6`LldB&8p4YFTPep z|I|TXn(;^A`M1qhLay9wq`qs~375VfSLi=tUtYbbLmZy5-bi+=sw^-Qon{{FF1wE; zmht^J45FH?PDiVUhlg{tgo;GEa~=$(G7`M($n$X`Kca?UUcK_dU|?Wr@-%g_QOFeI zt3vPbB~Icel38|8aBy%?P{5Bn4h~v!M}_m;*M8<{@kDSaxd#0jr2nU5ruT*Vv8J-J zd#q_SN7tIelzq<$iMt=@y=h@F!a?J4S}Z0#B}Mt`_&)}GZ^2RY)2+welg5Yd1ozV3 zy?eL0xp{GMk)EEuFZS)*w`h2{{Qdp8rAC_hG<)PoBO?}f$k${~&npS##KwVvfddB) zxaFD$^CBUJbO-XEXJrWyL-^4pF6$~ND<9|L>hLH8K=$H$?ct!p0{`aM9epDxD1@n!Oxy#%Xc{I<-c1-H86 z+|gR^V%JzlR?}s+4KMMWay|6WYp5?|s(SKjS$ai~1TAg{J&lnu_s_*0SZ>A#R^=PlujxYX7CMTXPk4DY>t;S_joNGGu{$HT6WF0i7HIXoyR$SB*YIq18| z&>Ka^`31%2nr)LViH#CcQc}Xg96pEH*-id*>LQyuzSo{srry2#T5aR-pp#UPQsU?9 zBh%ANCYdcqq$MPN=Y;7dHu^u6<>RaE-?IGYkDKGam#1f;L3ZemA3shoc@%rQTj?Sp zyFI6i3ksxW?L)&dzA&iHV7Qu^k;9MujfEetv@G zjppX&evcmQG|KCA{`>dul`B`!lW@t(0p<{dqX&*Nk|NmWUQ>#j#@zq?TW|JiN>gX; zM+(})!us0$izNQ_wA4!{zLb}9a&T~Pat>xn#Sub7Zo5ltEh` zkcEZ*UBRvv#Y1Zy1=ki zPi(g8{J5Abu;L`aYGh=D=3ZAW@l$>WS-;~vE|ixczRk}SqT^yoglpa`0*pZK`x(9(9FWZ0ut*& zZ^f5gD~=a|Er2zFp0u>WDBDLG@TLXHGboza3PQsL({KvflFD!2(3GmPw`I55WHiq@ zh{~TneOr_ne?25;8K|^EOH0e~57Wsaoz&tg^Dn+kbOG*x@7}#jH9CLk($jW_E$*^) zeUw8^Qkl8oe%5CMzX62g&m^U(COg#hb<(XQ8{FDPL7{VkOz`Cb6he%`tGN6|Gg4CC zykVTW-ZMPRZb8UDW=PpFRK+$zUm~fA37v-a1Tlahq)_@9^M(1 z7%3AN7#I}PJie&b>DAG^u;AqB>4|W>awRgvY?BLy??}jErsRR@z&I-^P*hhpN4ixPwwAp;P%+tsnXN zRwWo48g|U3$ZMoDT|f0HC+GC()6TB0HMVljQbzjv`Z_u~9v-V<8t3>PeZDT?G;+z@ z9E2w;E6cUZ-Q2<9qpRP*H_}$u1R`;{)3tkYbTpLfq@3JFM&Xp|g$pxNPl3JAld&5H z1~EnbpiUmea?;Y$$PjMs+wW?+hUv1M9Jb5L$V{xBRG;|E!o+m^<#{@K`p6r1{5lEo zQBih5J*YE7alf1{_9|`{%%wJdonq*o+q~HPIWRljbTh;~+wJlPpE_<6g5%GO6rhmj zn_asoD4sKumx(v3X*4z}>Yy{g+)>qEOu-btta934yO9>>P(NN?)MDLNIWqEgm(xy4 z$_fdlrmJTN$BuZseCX@TZz*;oM}P0m^R~9OCMNL*hl`xYv4NjVo)#W$=nS`0xu~g0 z%+1aH^vTK9l_f}tI6!EAf7M}lBq}PZtgP%dOH>R3Wq!E9q{Qpm2KLmd(L$P&^L$E^ zyY=;q3755m^L_$`c|A^2i1wPA8d8SQc!la@>TF$^Q5aWB)3wW&?brXzR#mC^p1Z82 zC>mpsk)garEq!PN44|84L7&nr!VT9 zI3N`#fTu=u$;#f9WZ?}kiW`(Y{&lx|({){|94VAt9v&V60RcHV??aClE*=XX`OPWL zXmCqjNJvBI>V8_<-c}~sl%|u+fAS`8bBN!HSyogyw%UxP39zpgWe%c|quxSsPmu${ z-}T%3Ww$783MMwXt9fEy^;z3f)jrUlEaa$KC8{EOWOrvy|~RFadEty|J&R~POzTOB@l zaDQ*%=j#VqS)axKW}s3uG&DrL#pUHyr29T0T_@FgL!hMKj((~(PvYy>eVIST7i+|R zjkgIIfC+;QJe+pO*$CU`3}~8T6l0yjoHaRFR7$4HO`{wef+5RGP)XGuk}*O&_-Vzy z*o>jhMUAi|@{-UD=%?%48n4l@n{<*=Y+?varzQybolE#(mE%xG3lt1Q$;@0J!|5a< zCU)%j#LfqwbL5|Vf6~|2M@L6zdh;gQ>T@SEQ=wzWjvWB0*`fPettvj*>_Y`Ha`Qny*t+qaV~7Rk3o=qv~eqw5~c;Xk$&pNmgN z$`8_wzIyfQ)2B~pWlx?wxlK@!CrwODAo~DaMn`GY{xLM?MgKx=9$fD<@I0!np%EMs z67uB9clt8?B_ZDDFYvdnKhw!L4Wdo+Ac#@Y3_);}Fn{Qu-;VA4z9g$0<9H#+=mfF? zJ#&mGP(VF#`*{8*!AMVE!HVElq+7z#hW(4k%Y50o3bO?Puto>lAY@Eh0m<4d)TtlM&8Ka{S5b=qr<0PB(B2+CeE9U~ ze!*bJTelQmvaqqTIyF#!7Xx6i!XtM)fVnHAGo ze*Wa>{*Fq6BE-vUy*Sp~^`6e?9_dOA)<01>giY3C;Q@`@ewKrV=~ZDYfabVD)1W(L z?c#*sQS+Q19lD~TLaupLNni4QA(x6+%w*a9ZRk({Ay!v(ThVvXjc3Ut|-Bq&t=SNS5_qzbZ`2wJ5ZE%x)!-NaCWRqT-|_ z-(AK9FYgk#!RfOu#J$8GGbsaNbISh3|m{^)sR6b(p7d-yPa zf!Oh5$BZZIQJat)g#`s)H!@JG`!}!4 z5apyxQM`HAo&)U*my}f72Z2xhM*r!~UD4>O|(@SyR zl;>Zx@3ow4%ONlJ=W7BgVG}N%uCB!2jW@1eKjXa%q~R7Wq<(Vp%CEfyQRYDx}}(u;`+q zzX-(Tg#`;yX7@*B1Y*3r&qncbm$b`-9wejB*Y$E6A%%F4U5WQt9ZeCx({?LMPa{^s zeyH|P=mfU$`Sa&P0|Olce4(9$OwL`=p@yJi#?8iaA>=oj1fe@izYu3pb6gk+*6 zLz$bCQzdO@CHmr@fBt#>`t{XR9d}nZM@iOTRIief68D%=Wktn+;j)2&Tiuoy!Mzx> zjun0T_6?oqMNAC3`k-pny?ggi{85M?xq%Rxj8k&N#KonjrlzK)O^l7v4X5en@CXVD zf<(&56aiVyJ$~_mnKu4zKTG%by1Kj5#mm9$@(8eE;R#gc!s(JVgYMOqk&%(v{z|m6 za|w7=XOa7S-!k)Q<{*yh^@SAq!wd|AtBI&Ka*MyNKweNgwWLUUxU0g_{ZV;$w@?4K zpuxdG?6ZGh;C##PhY<(!)WUu>HqOq~2)5hgN>An8oFA&|VyibjwCB;46b(dRUXS5*bDs;;YBY&GV90(Je=!qSqUewTkvN{adQ>t)VuM`UCSZK%QkSn28eIYmk^XD~HASKnR1 z$T#;S^Oe@SuerR!CVHQDQj|SD-?NXR?DhBb+TlCY0{NoJXwcXRq`_j#rQy@k(!6v* zh=_~~f&9%(r{uDW3qLQas?No2bK5AyL$tIi5Ll z23XA^PE<;2OsbtrztwBCDc*ao>Nv(5w{H*TI}X>!NxN>WuM7>D&Az>y+U&VJ^|xbK zj_9#ChI|wRBt~&SFnjRn^Bt z%A6D6l2@VhH#Z~b!np8Ax6RF&4ji~;X103akF=oBp$;^ZU%y0MOD(!vkGcp1R{ZSl z7W8OA;D1-!o5U+y2dEVu7N&LO%H2Er44m4hAtp}W8JcPpC?(FC&U=6%vyvI|P_LcD zH;A8Z#hID5Q>(N7{<~;1E79D(e*JU3VGB?_-O|()fi!b2EQ#DyZh+V>wl*}(PjQY- zPsamY0N92;f1kYd&9o{nA!e_S@B6@#+3Rs`S@-Zey<<#8G!p z0b`fD^A#il5s1;>RSt;w`l&owzd)nP!Ci9blaVO}0ELX?-QcpU_fsbtbtXx&3j@1* zeW1$;K*^ZqO=8gU zqM#_7<3vyJI@dbslD|-hk>ZrF6^4DboQx<_*%7}O1C!I!(-RYKPCZY7GB?LYfIuL} zrlqN&0Zm>Uih_$vb*KVnXdWH~MImopl}F5=Dx}E&9Yy5)`IA@Pdn#JpwbPlDBDeSs zQ3={iYH2B%{l>y1U^ugMsx$e`8$wr6ep;FhU}1iKJ^pdVZ^}nMjZ3OgOHFn|MZ8jFf$LtXBZVOHS3y0NJqrW zdM^D)IB(3FuAb7wz{tqRz<}Sl(^VuXAV9#Iym>R!$6(y?e&KmSqlK!Pn(I_YzWe+T z9xZuSjgChTKx3Vm=WGQNP%bKE>5Q+S8}EA;skqAE!{Z|(Cr+HmyYHWynK_LQd7b5{ zqthb0+|ge{{b=Ym#{fySho~2E(nv zDx@0VlBK1`o!NtrEHQtPl`Vet>NM{nZiuYGj z!@|QWI4rttX#2mJWh2PN0Jp`(1M4YpzY)~{I^eqhA|5vr<7?B^qfWU*qOPtkScm`4 z!#oi@A|j4;FHV!80K;{N?1yFCW`1YgWcU7qg)C~Tz+%nM&9$Umqi16)0jWkSvh|*i zLB|c_f(nmmJEo1ZuIO=~7eFXvNyY68r#4UX9b#uLdM!{QE>t6kv-;uGlarG#W&4hY z$H#YLg|8SJd#_CrhX)4uoV_Nf@2{blL=98Z&M zS2=EBzCm6dS};2I#TYUE&P$Uno*uAsM6l8m&hl{Sb>}0nyCt7$4sR6j`;47mZ$&-n86HLlbySym5txpMNs9ouHmcxhd;&yGjQR4hYp^yW>*Gwxk; z--b|_P|D`U&w;6+HbBqB?D4T%q%fu=-QC@QZmq4OZKcM^S^*o9AV|=Gcn6E&&J%wG z7HCIJ$8HD-qvM=Q)^AD3zEJin*P;qv#Kziy)md3NbV`VxIC0@qW?gl){3St5-+l<-1)sI9&?=)<%oi7B99K*cLk*?dVZW{+N_B5Wg`R4;caa zDEvc58(q8TseIu)xd>>8n(bEiFbZMt+5YX)sBjH}8* zbYoQ0XSJMt!*1YvXvL?)mCf6C?u7EsBP=Y;!=su>3Z$ozUAUyA^zCENXM_77Z_C*Y za=brl0S#A5-fO)B;=9G0xY8|| zW3X2?+KF{X)S-cRrRt={-(70Ounv)CeXK@TL`VpA+ZH1V6dKe3OpMZhOdV=!Y9eDl z&!serpB%;L75ev9uYs}xA7=M$J0ycpSVP;_&oH8~o|BWUqls?``EAZ2_>j~Nfgj`S8STILc=)XOTLXwgv ztA8sRxUB5ZfQO*uZC_$si1_2sfIEESZ;tf zbF4|LZDA|@l_8re@tgUdujgf%_$)Lkmo67i%Ysmlb)5DPbcMP3d0rl#fgM!h4Gj&p z2u~WBnKHzwVdDA3#y|1+ZJ+gicEt!;LX>_w;O)}#GKR{=*=BVi-V2co9*Gf0nkp3+Bp3QylwBO_YroER7<2M#k21Pc( zb&Lv}PKt>wH7c_k@H&Pu zCugFOH>?-%4;|Nhd0@A#x_T`-nWKXP5UZe3!9q1}=6WxUk6!Kbo!~AU?jUK)I_<8F zr`5W+bi%lbjRmEwSKPu~#s8fl)E3^b!QH#KEKzwJzn-P1FwgpVu}UGODIo49f*?mf zor!Wc#k~}AN7FeKUiGWFnfq~yp{_t`^B9KmC{|gUzp3=|`NrB5>Zb}gJ07Q6hqu~@ zU3T~lY3F@AEGoEJYHI4cj#-;z^)d7Aq_y~dKB@-PG^}}bbu~6pM*7rfb%qD#YJei3 zr9g5Z7tl0}-M+m}P9C&2S!)aBRF;u@sd>Qn+$@^jCd?m^#I4daJExG@+mpTq>sDxp_9j+> zAVl&B-|+m#ZoR(vbmT4mKRL9?F+Daq>i&0;6r^+$liaRiPiiVEsC+EuS$YE4!?9l{ zv*OLQwSNuO#XtdvY}jf;uG8dLpKmi=c}9OX61e~?`?d0x|H>v}x#T>pzfG!pO4&V^%H-3KCgp{jgOpy(Kt!-{oa~xlL+_ zDQHRPJm^gbqYQ>;ykD>b3StrOy1U%D+~F8vE%;)54ov;- z`fMerQNZz+diIWw=L_t5zx0;-rR!M3jZjV_KhaX;U6Iv33E)Xi&CE-9EryH^saMIA zyFKHjl=IlaXj4Y#I@$f@Gpc5?I_$FnDgO5ZN}8#5qGoFIw~7i(Uzq;8;FVnD7n7AW z0vt0k0>b344|wvVfn1WEn9XWLPFhi9mm}b!_wUj3O91A}Y$l3UN*#SX(32`f5?!pFKNpxi*6| zu6yZFqz$AJEZUnlN>g+Q1Bm@-y+~BukxFlsFpv?lRx;bC*tkbIwHdIR@xTGT62&zr z&F9aT_el>M7C2d=0A)}gez-VJ@|kjsU&A~BIEg=A5;MO)GrbrQ!t4Q+j>Ntj;&}y= z$$F&EN@RU~y)~PDV&gfQ9Xm<{?(r^}o|T@}i;#*w{8^%4xc{$_imteDPwPGW%Vw zp-bpKF4JAI(^o!q5~hJ$ArM-=>o}E^o$Y94#RJL!YaSB3`%tv4&ssZy zw4a5gaOyGQOTfrjMp#%2bHb}vxp@{)!^!MSU%$X%_yY38)6)}<7?=dsU%>Mb1BXat zB#~}Y00U1Q(Z`<8M(nv%!t~QM)YNJ~JAmy1e3&o@`3L#gV~~-n81QLN8q`lUB-j!Alyg#mPf>7@~sXEzNVU&O@TU~|cKb7_%eQku~X1hxvH zPWM03(0!}Nd1Y>pJgvfftNYJ4ah>Ym7Lurl$oyDpCgKDbRBqwNdDN{gwouC7lS`oV z$p^Dx|Upg`oBuZw!@)sH>@gHe748eGQic8#xg* z_g7pa+<1-MM0g?gYikYjoz>w+1LZ=1my{U)8eLmi!N(7RK@SY1jYKpOEPWv;*Vc9v zI9sD7a%6tC5M`71HdL2Kc`?Ue>eem8c`?WrG9C*fK#Q39HH|{qqG^bg?DyDGZ0s}f zJ8OO2OC=0(F_l03GDL3m!p6IE33>g&(k~INkdH~-Qcfd31btT2E+@1?S9~-uJiQV3X>*OA@QP;g*R~3Fd z(sceR-_MP|YnhUi**4EP?3n6b%C0RmY5JhH1{ST8N|tis*9VTz5uxitSb;rff73ZU z3t0?dlILIT3lzkF0VNjmp78>|sZ<-W_88leYX%0XTJNTcmyKr)ov5MIV0gzsAA}Bz z#!F~=P8!Gat+fzKa>^)wV$R^l<}ng&{_@(-9Fv_7dO>@z&Zcocoa+v)@vRgq!z8Nr z-NCwO`RVd=TN|5a;;(n@+eh9Sl+gP6eS7vSOzql2@stcdx?ouP59}it2Ok}Tr2$+7 zc_%B|8R<$gj555fbL9%>>eDXft7iXHm?D}a@2-COoyC9T$g8(+Ef6lGj-T)twfy=O zE9v+K(iI*WmyJ!@hYxn3k}TqcqO8w|&%bNSzw-Gc(hf!|*?= zACLE7VjAwG-AW->Mc&4mNvrr!K+>*ti8)*+oG?a*9{1tY$vaaMytb(?0gD}ElLUk z5||y3F5!|zP8-a$f?mDUjy|36+5r~~RE3Mh@Si$mhebe=m;Rl!-5j#r_;&piWCHKm zK$G>KktNS!V+|otUb*6Ebd!4T-n#=3Tah=A6AZIAh_E-A%dfSP`gb9WeyWktZ>P(ZT{JX4 zcyn-sjj0!w6Zf}KqH;qY+?Z(CsO9wWotAJMss;3ck>Jr@mZ_rodWJTdJ7`STpzNZj z!+IT|dR0qH3zfLs;4sYF0ziY%fI_l_G{oddC<82j>RS>P-k(OzNYU*g_#w;0%p0 zRuGevgd+*!GJgXHl$3%001^C!g*WH@fl=v?Yy2XSFf#+_&ThpHu)-C2>BN76rLFBW z;3T_S&wW&f{L&3*Aml=iY=wUbRecf297%ye%JZZ5A)j~*M(Cn!s$*V!i)!y)a=e|V zksWZ!0?LFM4i7D)1*F#0?<`I(u3G@Mn(}`?jjwShYvn^65;3p$U&V72wzvBL5TBqnp&mtpT`@RNP3$*Ep)zFit7QJ75 z1rZ@oiXD9x(Anx^0x+4ms;dj2jD~ImS@pw*nI>c(*d1eQt|`Q&O8Jdh$l50B6(--U zuMiHQ`k|P-sWXGb(GLBJE{AjZF`oTqW$;yPZJe(RQgVd53yp`b;yw&U-jE8&!WoX1 zXe%i_`h69WqAM!0+9#ebqfStASAZCRYr?pIq_NT%5O-}Y>`@I9#q<#H5e0Es3C>A? zf0UfP7zj@NCWN)x5HNKC9JREh4W#B)!R+?}=0wx7I#VSJ6!#*?-tZ5faP|W269o;( zXym$pik6eprxRvy;h5ytMBm1T4mZSSW@a)uUj=CcSi$&+*Q5WmE{GAtTxpL53*c#t z8FY0c4T$tUKAW&w%}95z)Q>f%7N5Q#4g;u-nBT*Pd~eoDL2L2Y3Kbsb&V4a*?POqL zA~iM5hoeKGdE{qpS#OR1+lplsyVFMAnDQKFC>eFS@L}R$$H5?_m^w)AwPqrdosn(8 zb~NmA6Pz*b0tP)0@E4KPeW0J|Z)cpH$9}y7XeW(BrK%dpfHRywk6 z%q&~-`0-)x%!?9jgKz{&4({4S-Q^wL?8PcO4MbTry3_^nvCw44&%bGzN^bPOXO)$ zhDN#$pajT;`K?=*=8=I~@I2h(#;g!dII;=Yq=e5UhwgAKRAA(X?fvA|pAo*p*aIdO z8=i=2L>Z=b(3lN4HHFZYgIV1tb4Y0V?M+QLvs;IZvD{vRye2EDrK`N%mfI1r-1-GI z)F(xm>&Pp{Dsjs8jwQTdX!4R6w(06Jv9ij*NduG)_s;Y;mu)|rn!pS}N1iD4V}mn@ zm%owGh{?uWBoOIB_%&|?0w4s07IYzuQ@|&F=R2klDY;c@4(3s#q|Ee|3!?tvGfp-{ z0AE0)6KL#(q9PBHqQ;o77Iq7UGOyVRNN~^)k-$czYBmT%U}a5BfYJRi^La3*paa1J z@Up@bBc0_gPg{5kQZkC5VhRe{cCn8xuEGs5x`^``?1vAhlg5b<%x_li(>$y%21Dv> zCA&$HTccSvat4AO<_ME5ZpS%Q!peJbtf1IwRO{x=M2k5#_`$sYu43B_64@{jE5cUi z=ITr((;qyThZ!|~00rEje=iF~8Huc5$)q72AiQK`Xk;iO=|H!UcSQBezrTOKpr}|; z5y+&-J`WOx5B=8@Cuc7LpHi2{c=|TVeejT&c0I+654{*%kL)mkHbUZ9ThdThXN5ru z=mHRm-0kNgOTEfD;bjGO*|Tq7%cv7@G<;kcX`8K3!6GufZg+J%tWnsnDlzK1Sfg3B7{g6J%(L_kJ20I!h+lYEHZU)w4#EBhAdsAxV?5 zuCItI@JCPCefISpO2{E|k2&P!OR=%!s&7Cf7(G8~5|5Qdp$vicMCJQBFV78zu9uIk zm#4eQq7TWzcFH&6*)y-T_UfhExqtuur=WLm4HzVbV({Fzix-P; z=j!1Y;Z`zXF!zr;hoRo!^H%_z;^M@&Z%10l)iA7S)W+6U-f>7Bwjj4HaGsMN28dAA zB*sRRIfPZxVdTeATK~e03u!{#pDdfuxL{m`lNyZ(_~$=%i?}Yv9*|Ml{i;V~R8YFw zoT(8f#XWWl#n;5=?_$L-ODWc1y{||*o2F*@WX7($wWHH^{ z^~lT)921EQYPIPq^&wYun4BQy7t6+SH+FXZ1%|uE_Z+nZyz={S`{WXS835tI=Tn%z zkVwn;d2>sP@uUZw&>xVmw-3!N;zTQ2wyeW|e2}Qb?+lEqrt5&zIdtekcjB z{WsjTx3|Zg(#ZYkK}j7DE(5oNV`VYUwM)`{ZUFOeFIkwF(eeQoeBe0iB!mOWce=FS zagf_6+eT9aG#OZR8tq|yBryaK*Xn)^yqz*+JxzA$ce6l`odharhv~Q{(lNo04H}fO z1l>pdbZT8G>;eWaj~`PdHs&ECz(X7A3k{3hW&wDGn1i75f~$bk2-9@k!^(NLXv2?X!yfZmR>a$*4As2 zwmvwG>?CCb-Rj+y6op>`@+tyHq@+BsxiDY3VMq~q? zCSdR;GFa3k%U>t8uBN6i;;|wHh4ES70cm^ygPU0s1Yahl;xQWB#0{8W+*boiN`&rBv>vpt_5 zP?HQd$4fWHT}$Qpl5(e&ECNY4X7d~X(&LkLH zaOVD$%=|VR4C8Zim+--+p%ssfj}PwCAR0?6P?R~4&5VYWffZW7 zrI#=F7R>%aZe!d@$O=kRZKebub6K31rliq@)hj_*2{}4pMQ@LxF1P)uzEr z&>3OZ_!^=SFGntGm;zWk%#yy~t@g3W9K>NNIyw%OpJee$esf;lQSi;B6D6}jwledz zB92Ws!}kYk%?^@^LdwdOEAzvGK*7cr(MMstg|(p6VLG1dc!hcjAcd}&Wnb{G)yc5Xq#Rr>q)QjSAUcD<^2^cHNX zI6_P*9H@v>IT*0|LKx2WIb!yP@hg0xU0oaGQ7D?KwXJPwmNllhq){iZWWu!QKMx*E zqX3~OExg$4zxk(9UheNglS3-UQ4Wqih&e+TIW@yl2|NaGX}pX(7>Sm#W#f+@N5&TG zVC01z;uM0{@mjHur~RcgbHw zz;w-{sCHwrdjl#IiGholgu%~nybns>#-Pc@VESy@xSd27Mu^aka$mnT?Nu9dDgZE= zLX|?^64jBpOoDO{FJYAEV*9=qXPf2RX0F4Bb6OCl`c;_y@Th8GI1OP}dDs;rEP=li z!o=!NpPCm=|VSjcjcrCt}A{iA- zdHWBf5P}^8Af5M?bYQGFp@l)DzacDJurHu!60*WvK3nB%_)K)V8eSo-Nz8ng z`1j|<#QkT^&^}GBkhQ<3|En!T$2uptZ7Jn&uui&X&)Zj*7`E(CxHY|(!}I&8i9@>% zmC8>MS7x^CIl7&0rf747nouvhe4k@LZaH=s<=K)zP#SBnvaoo<*8_xq$;c>(t1nBB zj~y-;d3pR37rvb1`Y8|zWIj*_DARYIQ$zoKO$5H-LS0?`AVY67OxO^mS>3mXR2pFP z)&|4>Z>$OE9sHD+BT@2UPE<&^q`)z|G})fE{hOE!TPe7W44eGj$m^OWCML$lY!Rx> z5Dav5aI9k;I#o2&@csQ5J(1td)U;@&hX3f%EfhTi178Ov-k4Zgo(#Q!UI-;)*oE&3 z3f-3vMI+REbhwePnaAbt1r9PvGOQb1tnZ^VQ;=0q3u^vse%*yX_% zVK&BhPyosx!3eishYH&R7JT;!{piMrBYXxWUXofm!56r2G9Sm}$X9Nz@KA4me|fJR zh!nnd0e4`dien;kp<5EJYj9YuZ;l`#BoBHeKp%)Lw%St~hojZm+?9DaI9|iSAt)$+{0h!Z!Ra~(Sr_xy69=ri z;0y%!m1YxCh-rs2=S3Zc0|#&>49-pa&2uljIM_eXn&UPC6zIq!H%3Mr zr_v6A9}5TsgILZQ;R`A%w7a$gSYlq4(gd{_tOrV3Yu?mDeEA2o6DB^rvIovaX!K}U znBW{>V1Q!r^Z}?28YULKBPeJY?{#;vSyv|Jd_Yjp4vM^j0te}*mZaupfJxs9Q=Aqa zI+Oen%TyV{E^?Byys{ESi0Ck=`tomUOd7a0=0XnAkKbXT9bH}H?L=Diw0Uqq71wj6 zL{NvL4RZNwE~aj7c?cym5rDpojD0JXxSP|$!gLG_+@Ti|zd>QcfZNtqkdsqnP9jLj z8iD%X%o4%v;S_!$skiqAo(Zx$+7C>vlJns*TCkl#W->8h|JZpyBt%nL*?g+`qaU_O zV#l$Lqr3ijwRx5UU$dfis59$nUj%v;cG=OU^wjI@Y!O74xHwb(ruOB_NB8f7ZM-Ac zx&S5+y#3KlM?|8mjLfk#4QdL=^m-`is;X3TC$&Czz@C8mX=2h{Tf67oZ@F+e?{z(6 zIC(Na+j1J7L(C9( zdBa0P8=IQWm*{~IVn4gow}w>>fYPA_;Wo@V-(WD8w)j$0QP) zMi1`!hC1{4^Nspvip&A3$iKtiS``-Zt#2oE-ulzW|;cf zsupLMAvh!MU?@SN3ta!v$nqC2$cnafj!{nqO-(_4!pj< z1kz71z*K0}0NlS2ouGZD8x=kmj~~9MgQ$t%)kVin$@xSQot>Xw`?W2s$^&r&?K^Z* z2PG4~s<;tWuY!-qZ*q3)@Ehh`Qc($Lx4#$&FC=1dV!|frD$a*B;&_0N5W*;iW%D69 z^iTe?+ZF$6FhWzpeQRj!b2#sRE&&nF&&LPPfVn5t+!bI{@J4vX4yt8+n~Hhqj23}K z`7J@~SB}vlsHCGz(kKpKptgWd;)w9IVjP~-Tteq+lcxOahG{Jp5eLM*;MWD) zyLXR*P5pPy-cQB0KAOzOwonYrI55*Oe_8M6BfyJif`Kj6?UW&SAe)<-wozb~)RkwS zSX$bR0$*2mXO$!V1{xgVxx{U@FKJcR@i1fHRqWelB;FmV_T3}_Zp^e&a~x#B(E`*c zoX5oE{mhZy?d=W4`onv^fBTHdLDE!5N0)?unhxMG4h7tF3Pm!bgT$6=>Y&CP(J6Z< zz5VQu;Z)46IXM%Hidb72c#j^vKk-=c`QLgKKw`W#IuVQ*jMj(-YwMb7I$O5oxj{92 znMB3snOD+gY#ob%%9%88JcL#hQ3+bPV+b* z0EXvl(Bm-{uCC6&)Z*4sv;xOb1{=H>iTjP;1Gxz}O9>fa;0i}*RAeNnvGM4NAS#b> zVW`scZ8uLv!7+RE&Xm&1Oz#66(W|8tGdOtgAiU(WZp~@fjC~aTIKH8xf?jhC-II88 zMgGCFbSwnJTf9E?FS!Ac1^Tsf>)4|fg~<~O)1hfSlqVU!N<%DQ$2CPeruj~BC+ zU~+bLry^7rXJ>`P#p7E9Z;jy`7CaSDk>M%x^YaU(j7Pj(u)VWqXVb4=4?kf%KzPY= zF(&l!Fgg|%4|5s)T$@%*nk(PVXe3+$|LHFE38^sU##e4|aiP=U4+ooT3kwTzJR9Rc z3JQQPNZ~g(j5H7B#6}%Rrl7kaTU(n|+QH6_tndJ5HpI)D-%7;ymjRk$`1Dj0(Y-NHMK8*1q^<3Q z5iVfgkV#@z)+|oNyh}-meERfEVj~*GT`w<~LUEAL7zqIGX<)E6+pi4RhSmh(_ef3{ zmKm!C8U)t{E^G@J5+Iqiwe=PX1TYxf&H3A?3qUP2R8%kKmY-~cUloi?G2zm4egiWr zE2*g{_{5CA_skqYm>)hI2QrSYL9>^BzT1nidl_nh{KlULAtAOXZACvGWWCR>9=47D z*`hU6{&2-Na-5&$6pfv>^LC1-Rky&vploMx!T|Rd>>*etEIuCAlq-e} zP7+RLoYVVnVue6KnkP0?&&-_K`QTcfT|!`B&7O5PRy0P;wm3s};hSyr^!W5XlwmYi zUj86rU=1Z6_H7u(=YA+&xzbco;Y+!kW=Hk02WWzrmbS;elH>Ssa~vPFv61mx7Cl48 zivOaQFs>4{6oJ)npSw#PkQCn`gVu+yNJX^(`mwcbpdO8Rhtp_z zWKE&aH6|wJxTgSfkeH|_*Zy6&1&FzTayTLYNQD)TwRw<-rAC+o-QkFoX_g+ox9aE5 z%^D@zT@N!$R;}Qa>F>H#T~!6(X+InbLGld>fo<0l(Ul^MwL!R_ay#^YF(uorP%3d= z6%-DpRSF7A%TYil*nV&n^4kU0eK?#3%gE6~hoTXj=xpR^Aa3#I{2x6&7dyMB8Y#Rd zPXfMpjs1kS2IktGXW$;7z(F=)XJ5+>tCHPy~8;i z<-?#V@JZ1zF`<80m-gfUBO?qIM4S~O5Cm|TkCyft zY|C0Y{t0j1n8DGBvSTV7f))!k30HV{lj!NT(UB2=?xS=8ahudD(t!8{@bNMRHln)& z^Wdy&(yP)(kG_R*tD%&paN4jnc6YR(0ZzoVu-To*$fYtwx zsWXquaecS=(>$nTN>NHBQ%Hp<8juiWE<%(FAw@-l2$?F$P{>p%ga#6#uv3{T)0Ps- zSVWFSBoK3BFVOE_wITD;zbmL(Q_?}o^&%5 zFOVe=P255{Sjmk><%f+OXm)t)gaFu?!;csG=odHe%U7<9Dp*Vcfh$M97o#FZJ5bG^ z(8Y+8(4)iqCMPA?p0ytPeQZ&2aqpuBefo$~V#i;%KXhPB4|)GJjsXSzY{twfaSVRE zCO*|X^}SKkL>mnfF|J1xUlwNZMc#%Dl@oWrXr;9yYJ$bT*X;rK)*VnbD!8R8U~eAA(T7}64JBf^xVEMb>UC*Y_&C)Bvd=*$1Q0hlrat9 z7O-#HsmI_7Ok;rho~PW>t9XDTR@%6e@Cd=C(5G#pI`5f@`o#~>f3iRb7#nTt`&XJ^E4(dK1b$Yza3Zcmk4il;jkC%NA0VJn%D?~>X$9ebGk5vA4DDRAWM9!WzEoRT2 zO*02gIPM78cJx+ID+dpSW|C)j+3=x^t@-*Md~)$4N`aM-A7l#ZsHY_lOG}+{12bY` zrZJ1fM`n^O)i4Wh3(hM*SVTu{@Hx_DU0vN$)8`z@-EY^9(;bQt4-bY?k%>4%LnWcH z;e|Ou1f~IEW`L4lFU8f3TsCH+K`ih5aBOTMQuu)b&!nc>B~Ry{Sgg$Npk^rFp~KkW zccZ8HcaWEdrn$i|1f@Ar;Fuk{F?KvwemC;EDOeY!R8<@%|2RAULPKNMZN5RellQuH zmuZk=>@c(0kD`wg&ukhrCq??%vn$8}L}ZnSo|jx(c1@f#X?<(UMMkKA<#S4mY+FD8 zQMZ|xY-})ZX`TWXzl+P4`W5AR=T z`b0`qIe%NL9bpeOU0seFB?H%dl#x+7rXl3}??YPPOfJDL#7rR7(#)ltKE2G{9p##3 zAKq|Vg!=r0O z_%C-{UP>JWm@{aQvh&Sd^&ZrgZ!da8YerPw<(DXR?5H<6Rc*)ui!-0!GAl5|CCBIe z11;Ote($KW0c!mlDnGt@g(fwK56zs?@U}|rF~MdCS3gx;+BHgFbir6#I}vM*@pud&Cy76bCbb?C}Tc<-T-Bgad9Cbjn1%@0U`cm zgMFTYz*j6974nW&kUR}zrZIsDGVyWs=&_@#-=(Z9^T5VqmoAOS?0j_IvgOM`Ek);%|Chh#XMkl3wYWg)oh3>t*?C_gFFdF|R}Fc^LhTpRH=CGagu z2pGxG+F8`@2qj`lRQQNjp%AFUkB;=)x=*Hv5J39k4j)~7xb!g{8o}f{@am(ove)(Z zuKItv;`>(d>*VNrH%-QHhCPx##=N^Cgdyd@-osr=H*>(v@^X#nLcif23m#Qe9Ey#- zmFg8;SVKE^HZ4v4r5as?*WitR8@0Ni(npI}2HI;&Jw@oNF0Of)7YmYs9C{DsU9w(!6y zFn26y8dGlc2~VEPLN9pg)JG@};vGg6l`1P9jw#uUU)m!WD;i0J{_Q?zWDk<;(@q*b zxc5XM-%_a96uEu7#=QIx(Yk>LOi)%=H!B!3kSd7lWq)J>r47>AsQO#+adA1`>Y3I76%SxI7q-vfN9T4vf=X3NWFlC>C$uuWU#==Gc#v0uo!KD4++&aF07- zTRcX5yDP)~d%KCm?2#iiPHEgs?Ui`$+=Ce1^xR#Ol0Dqrxl}QB`a&2HnDVp!+S=pO zPf>2dkRjPmhXN%1eq1EFC3JIu|?Hp+eDNSzw6HDJ*c|f?WpHX zh7?Uwub%!tEdT+78zD+z>gxRZ2!Bd`w!IFGnleF3N5M{Q;z@%PW9O~*iDeBh^A^sZ zf0i@2^wG)w4JoUAePLq<#Y)g~OG|ESTFMX@N)bDK+JKi-CZvB93I%T*I;%wBeNB6Z z-%QSi_O|!G0;5yXoU`7MWD=ie_>LnTl5=m}ym|Y3PtQY?t{{>;#3M(lC=*wBd%p`l z+ig_B0t9A9j?f%!)ORN>)_?l+KDc;-h?~g$1$ytV2ft;uk3rLnj81}%j*cs^LS_wIv-XS~@rB;dT8sYl&9HQ6QGH&Uk}|n?@1p3&cZ@b{PHX#yts#L(%^qyy?SMT`*san6ATTh zB1cQ!d`!h={_qw+CMwK-)0|Dd&iSnOWBZ@Hr61a-NzF8#mDxEHCmqXSNoYCY&ncKG zY4mowOqmUlw@Ic$T*?H5cF3Y)qDfW&VJPcStCSp>XlJ*pe$Rbr`eH}Nu-5o>n{m0J z$9Q^fzIj8>n`Fm}r%&JEaF>;>p7}PQ^Y)o8E*5lT)4KgiommUQ{PxWodP__v16x~~ znITt^-Bnlv3ZNi;6Fm(%)6C4IWErgy^>#_gg#9Z0-~cNs>S}8r{JLmN!u0F)-)mb8 z2%VEdFdRupWdfUtb85V)QyWNA_kNuIdW;!m35kspU$`={o43AMvA+S5?rZMFo#{S4 z?pSrZ`Nt22yQ=xuYdj`WKhsv=#sJ5_JLCf~gHJ35#_;?ymoNVUGyvJX`S26Lg$LaVaKm9fetZ#;3t`-tkc~}U4Vqg3?WywP z_m;eKKDy%OHQpZzE6Pd+uHt}*KPCBpT$t3iSK-!`#}1xeA9(jQ*)+JeSj>*-3myAC zCIFNN?Wd;kUb1A^>(EmSjMTrl+FdAp@d8qFOy;$03blz7iyIq#tgM8A1vhjSgcmHv z!2Jr7_E;T6r46<_?s%P<5UfSSQ+tr?&JR?olhZSpj~L5B$^)ntsDPpk#qOCA5pq2u zL0@7I9N-E$OrCrws_=@L=2Q?Das}Upl4*F`?IU~XYMJh(_y_W&)M9Lg=)_!1`PDuh zz?%Onl$;g%OT_=}Qx8&7r>&3^j+G&-`_ygV?BMp+AGr%JB#hG~>;oD>#27H=G-(nw z@<2#ze93-o=kZd^fE=7C^Fq49*QYaow^HuzN3l+(flE@$@Zrj;st1LI zs4>UssH%4yKx8H?gQ9Q;X$Nj+4}YtpzboeKcLRtd23bG~Z##7o)$&9vB*!7O%EiRz z34=c29=Lty&gCmtVr2mug}-q~Ys;{KOBy_H16QOB=`#v^lnk4lJ^cH6JCPPe5zyLt zcwp3xGa{X>t1G73sNcD#v$OrDTVArLHkp_+qu*Xs%*g!|w`6*i>AL?e;w5wP0CVo$ zzwc>wgpmBFjv;ckR0(Dj8hlAYt`@?!cJXNYF^Lh`O z{%w{IF4;ZHh}?j_k;!5pAMO^1iAqPrWDE=ruZS%GKoIryl-slx+}Kqj=k{(2ljo^h zrqL8rA91oMp}E1dz5Eqsa+jghzDc}yaVDs=R8=-SgCpzjf8@;MqvS#2B@qY1DvB*Z zSTkxgbldRZ`zIyS`mv;d4}^Mr0O&C7S97PPILKSn-#4Vt@O6@lc;?6U))Lj%1n-U4up;#cuHI8-mHs>akl;gWC;&q)vO=4betA+W5V zA1f8N=nfvNB5*zM4#pkKaL5qP3qSsGHKL(w{Pqppjo%6t`;zB%FXGPY9u0|(5`l_V zoxl>w0DPh5FJF563fgCL95GK~agT1f)0`|ArRY z%)l@b!r>D<@~2P4P9!v9)34QaGK&MI``xap3cayOhCEABf%?C8E#!?H06qBy_>@;z zv^bcz2vSezB^NC?_teH9ww>;s+nIzSV$!6}^3sG0nGR~qS>F5QpD88+rT-E^4?dmU zM|J&)XL&QOHzav+RW9W(aLpy;P&o2KRbD-Pc~aj6u+d*AkUvnDURqJHRlgFXxgE4V z$u$*dAtIvC@NB`oBUJY&?;JwN~)9p#mj-1}C?>jL=H)?OhGaaRCSqV6&7 z&;%#0B#Sdc{$ht$d2KDrdE7-Kod3GE&{0lbxUijqfl5Sk`wltA%jcsoE+~)@9G#u{ z|C|>rz@f|4h(d&Fo8*xY`DEk!={H9su*O-Y_*Qntxbfow>%^k_XG_b}rpvyQ#@^Za zrTfS!BO|Xxj@{e4fA9XYhR!mPG3max`@r!7O_zN;Ix}{l!4~b5p<3G|Qwv&mzQ1@M zoT2X1r}>wDjuha|ffBUZdBW z7W5IF&H)h_0(f4w4No zM_Nw5{>)3?E_p`B+r2Cf_(!Q2T>o)naeBr5OWF$qU1mF}2|kPgS&b8VN;oL0g-6cS zzGxTHNeHt^R9)H0xaWkKlT)M|<*oV(dj$3NlI_c?mzfU=kd2eGQ#3xaLIjmyC^D`) z&gaXfrposp-%V5V-oC|SR83z{t%BvCSu+V)br!u6_Mf(6WIe`G7!nzI93R$1!%g-fy6O z#Knu|9O;1V+0G^=S%~rs=U>@d6BNM?A|M7TIA;Iu-noPJ+|tNM5YiduA>ID<7Ij&( z#c0?~-mRTBE+*9g-KkYyb|G z?!|jhyyslKir>9$wpPR~;Qk{qIofluc%w+7c|$=%ITB+B?b`OUNiW7u^U$^fAP%vy zs7zTlv+%O-Tlz9IWAs=j8&~{HqNOLirH8ENn=>%Z-@_RUYnTx^jbR}&wB1~_2IHL zqeAMwo(=f&*}isewOP}``5RuWynZd?(zIV`#slM9`gbne?&)1py8mIQ(>I@xpDkrW zI!f$T&NmXS2u0DM)8ZBeM!b!Z@|Ww{c=TRRlxwhOS=TSQB4!7}mKHGJf564Q*`#VZ zdHaqXz0Cc+Nve;^j(jUioWKi3+qLh&0jyLQ`I>_t9UheRT?#g!Pgb9jFe>ca8_HsJc#O<^6QPOn_CU9TnuDK zj*Rhbyt8j06?jZEC61=1#nkPxWK8_ym?Ohk{q*TciDd+|xlT?jw7@1B^XGr`<0xM! zcDFU%wk6uI4vBZZaN!1$fSD!|J>9#1fB*m=3a_0Wn2Td(Gm+eU&pQaKT?z}oqFBb8Ku zmOg--j~>(akSprR4>>X8l*-} z08QR`QS-NI^~iaRU%$?CcE;WmO-WFt1P4GQoH(9Sri8S&jrLWIv@JO_f(f+qiHYIY z>h2U3QTOOv>`LM|FlZj;nX?uw0BH-aEQ-XPeY}pUrj{08pm2UXdYKzd2kX-qbhyG5 z&B^(h`s69`7jqR@+#Ww(Y{|_HMh5w%iP!WMJ)2P;cD&EQ(x8Pioa*8I`P1W-uEQV0 z52aK+A-j*CFd^%@^*`w1jvWgtxRLgZeuh5wnfVBm0whoBO~x?Xnz|0y$C!oxyL<5z zlmtUMSG2)sbM&>=F&M$DOGfv5X-1y=FGSz0QTV}ugBmcIyP(7Z0R_@wZYYqS*{igZ)x(AhNy5)>k46~E)D5f+ zdR&tlv#~5yaVAL|%?Ye2F@wWeGrY3bMCOIz+o=5U{NmBk>c+OM*YQ##GG|`6Kt|pb z6~!FwBIC}^$(Xx=&QKFSMCb7GCC*<63qPPgLFZfag5v{PAoN!)TriX1OW?O_oA2Pj ztBTI(L?JAW7N;i<;B0*UTRH0-2}^oTYN6eUnR%5Oq=(vRP$Vi+7{O%LO9mC~tWPcUf^hHm^5$e6 z;Lqi_@ffhf3tm}xbDhN@AC@S)eGwQc1d++zF*$x->s!Qs05EO+Lp~yHPRl_dHF7P0*^)GZS(eoqb z&78@6`-nviCHL?7RI zy}B*p-^OBfY~_B$x_lMB-p1`2VjULTX#Eo&vIdSiRw`t^|4u%u({ z>^|h3f8>R(!}G!6Mc3Da6z}Q72;1s4YsQV~(;4XuS`uxw_>DSG>DSgn#X#)Ny&xZP zi$qS-?mM7oxXp1&U@&q}7Erpw2?kDqznsilMOIO8&{l+FO*LkQ^QCHv#1`Ba=&xCWQPp=nMP=(P5Da;FY z2P*c87Kbqb9bD$mPicGcF2o|vX9HH4FkLvltiXCftYXGBnIx^YI}EfHxUczvK%60$Cl`)+Bzbl}<1gIq-5t=Mz^4jki)Y?M+=q zD5Br^_^g{g6FH!CG@MNCzIr7*5;cXD|FyO*My95s4w?xmf*38U?OMC1XBOBOz}Hi4 zE_8A-d(nN9M;Hh+-vuQ!z0UN)*k3=108n}q<-w=FeqyzclZ%1nBu3y~ZfH-4k9VFs zS9C}1+Vuhwo|yT$9Od(QZRcN363;(~1ji!qDn(|c%W``CB1myjPv z+02oBx8O?;E?-iJ=EDvFoN>K>Yagt$*yr>4p=4`ZpxawsOrixXXhsUGpDdpfNtN3?R0O+GhTIt)4xpb4D(+TDx{w;EatHUv|Mq^aMb>2;CYQLvr$D;FzO;_aAK>aBm&Aekn;5Q zXj_mQxn};G{OBWLLEnu8KoEGxNC*K`Vk5OS9n&x(Wm4)ZD@XFb(h}HzKPykoVcPBQfPkqVUzns0 zA_K*em6>^aN_TGML!ROlJtE9dQ`5r@XRIFGC@%i^&-O0hzV60br>4-JVUf=dz+1Fo zJJaopSFW6D5No-1uxxnD-n~eC$B!Xrj>e0LLD|^5-MV*YDY4AR~E<)MI`~eG2YhJ*Iadfv9Ed9(k+r!9l~6M9>Q)ZtH5d#L9kK`6NDo| zewyaL(v(d_?#606WrSBvKRJ|i+04PDTj~*a!fg{Fa{-ufi^bxAZiQ@1iQ{WNnBwbl z$G_^olXGa(h_{3^nlbPqu?A@}$r|?i--R0zHge)4?DTEvk|#`XFatC_fseDHVH)-K zwdDk0qDkcMhe)LONew58(V-wpTKw5p4@Vz>O_VfX$Z%m(f^X*0W-{+O{B=4yD3i=j zl-Rd!)zI~-U+yh*>e=&dOLF{g>`Cz5$PbSB4f4d;3<{&7Emdj#1`h__@L2N8(t#at ziV6ypcy0?xCFmBo3`b|3^*4g zcQ`!=_)XfMBd`1Oe*r=99?|&m1g8)wfrW*h!~1z@QuyO5D|IO`PQTMiIU}jZ5?(UL zdJ4LNui?=xviThZ3qhgYg(AuCO$xR}_4g#LOYhY-G>BylBmB(nFx=EnLk&4x# zM0m>I`1sE{R*?f`_wLP!l{lqu^144dYqIoCwLvZK4y}Tb273ZF;Z;*lkS^#YK{$#} zH3H}GNO#+-NjI52&H6-~6-%YdzRB0FjUHG-7~{jlD+N*%Aulm&8}gPD0d|eIzUa2w zr3*c=TbeP-J)7B&hB#-sXD+`&bpZl%VR6BZ@@XzT1yd-tA1}3ek~5b0;nMJM_FM+> zJjRCG;>uRVj+FX=4*1rw@YWuZ#SQ6}uM{^w7J1yxzsFNf4@`&6Pq3IFD}MQ7U& z<|iWOq^_15@DaE)5i)d3oA`j)B2e{cQ5y)AI{UCf!h$uVx{xFQQJDERRT} zkBSA0CvH&ywGb0By|-rk3XBd9ipZ*VMR|E-+MF)h+Ak|A&OpgviGBMX&o8S_#Y$Fs z<8ecNGjJn?5x5zmLu&0|Xyj$sdHdfcZnWu96V?a?AEHQH?e_p?OB@6qexnqOiFA2 zy##9;$OcxOaQxDCUAk}qfWjlqz5QpC+w9qDJtCRSbFVr1<3A;MT)nf2y^YOcG-8A+ z<6*-Re0>ReT(~J};naA7PF4(houZX^4MM3!sC9%70KMtAm0|G|Wy|z~EzHa?` z7O*%lsQ~58x6P>!w2mxXr<(}0k9JS{A z_!W6nBlHD1S~BL$Y|1~k48ML#-a^B6 z7bBX*tpYQJXOgg%Z{y09qoNz~Rds(YH<#<{|b$O5pPu>|2hyW%MpA-yfY4)7d zIdev!KftIZFfg$8D?}mZ8mz{5=2IHu(W4RfOlh5~`p*pHs-d(Tv`ZUK z-yY#fN$@nF-WnAw&;AEvdF8dA zgfMDl{IkA3I5djdpF{ZO^+w(U%F*21KS>@yfFlDMG%wE_kVI&!LP1im~a9?fKPkxg}Cq6hg zh?)r4hTd3ZrS@iKOq6bjvx=&}kz1p(0O|sq8*O2+fAIYE_+yDXG+O7NPCALj9ww9F z;ZoW!Hw5Srj+stt;we%PJ~|-1QK!Ksv5X?il57tWmF|>w^r-gNDZMl|7A!6gw96(^ z0vJV)VpISKf~0P%MaW=mY*gqU!JFHjg-h(bZe_z$6o0HgC}4f zOzc8d+eKcQk%Ru{qVKYCt?kccicb_t&X&trDvMf+(cu|V{Bl^T;9!d_#+MiCQAm>4 z-mUz;Xls`SrngahLYa*+U<#-*cOAP3`>5?)qKQ3b4sRWxgI{Cj7vC({uMhvn`>9~n zO|TK1B=c{(P3j>;3;o^)yO4c#`M1z7l|f54HkLkq{KnsmfSc9rFP)Q-h=iSEi5`## zL<*)GG-cNXt87{EMcUvtGe1B;w6n9bwwCyMYWEwi!d{Lhf2C1}r2q4)X2h7uQ>QXB z6}NQ=5orrrKh7G|B#enVdih(g`9r{UoQ90QsfbqSZx{O%(2tt>`STtkRC!2u_39={ zzl;(oY9v6I-Ju2B`b^%>)J16Jq-sDwvIhv8IC4`Y=N$`Dd?F=fgm3Y8CH$Lt_m~e} zf`OR%=FQw{C`iC?I)0RO6BEo#O=t4zfigj%nXqP_XV)&JsLiCbAFpmmA;XKhcYABR zeGbd2o|Tth+t405%3xu}VpeW{Na@jyc9cGyeCzXS(vkMzGOhNdLXl*cbeNhj$@{*M zbp90K&xiUJchMWXGw~wZJ?{NIK*6xB$|)G6^Ep&`}naOgAWeg z9z7FNQ_XliR^eb`;l9U*u}8CzmNh67>y$fBm>s&|gyAnxl3?cJvOVJr@tUIP>!G2sI@klH&x{#T zf~(t#1b&;?{A`r?vJ|BQV#x_75Jjc%(-VY37mDWTz5_^}d9Deq#(I$!`wIzlNt4b}UM zbvq@kRljL$$}>enVQ?G))2LAg?exDlH?Io{GI9P^R$jgoG0g1Q!yC?ER6%2kiR_`h zkKYV9>uVq`}t3$}c;B3NTeWLx0!yCtg`m4Pe;NA6!n zL+(?h|HL+fG)n3mzD1F3T8EOOps)~AR-B(8uCH9Z zin7$toN#)~+0Ed}Zm|%TplKDS#Z**8Q`&v|l#&0#EyNDmPc1?p@3&@+=I=e{&NaX) zGo>}U+&c)V5bQx;O$IyNmoM+h$Rt%Z1g+1qwSA?hbOH5i$2*yGO$$UqqT}*#XLlYm z4eP!n?b}BS_jt1(g%e=t0|p5vW+z0tH>5B%bTB?%YxMdx7*o7i4dsdgO~0aw!tig$ z%l$v8PWPjttejA-ZwP+%l^NocArb#y&J;HA_rhds|S;yN(^(-3MGsPA&k7L99bAK784!i*R(&CwpZ<5F&;27xpjI zg$Ju#HtKlI7Nb*XDeO}q5G)D@vy0ZM%s@N{A11nS7~mrSwzD8FbTlKZykuII6)Wy9 zuFK`R;Dli^hOb=7SwX*Y%fH(z4iVO9Tn*D648|~kCc0(l>iRamvSyxzRD*lr$J$!@ zmhbo!14bb0sGm;`3`4_5e<@xTzLWru`u)on77`{jjzc-YWT26AXOd}#@7p`mK7Nj& z8Q1^|Mq3Pm=ht|xRCIy@6Mb4Jib2Sy=t^mtj#el0yqHDL>_7G92`DS3<~|;32l1s0 zV=b-gkoQs0^87|V3g`y^)Vl;wp3D%6Sc?ts-}Ni`GIrM^lTE|)g~1X=*RG-_sOE;;K{~*BL`5GM zh#$tnS+j=Grva#3?l$*=R}7;2!yEo6akR&$Cn*s|O_=-B)s^foh*BjCN>0htzypx4 zxPNFq=pu;}Uf=d+tG#ae$!Q@-u7A9mGJ+2s_lL1g82-a|w&-}x1rQePVyL1Qd3Rx* z2@x#Ky+T6Z@}k7GmkkUGLc3H;@3g0V4?;E=V?Z5|#*! z-uHFn!^{N-Gfhg*+~}z(Pz?OA=?FEqCmIoi+!PSpOD6Sc<;b6$e3C9B9hE9-n{>7X z{H>=-f2Ph{#)r1Ck=$a#kSy3MlTb(N_0eyD={)LG)lYA^Ir$H{tefm$MQcOSFc~fj zc~N@0Dm^x4!)0YRYT6IUE%WyN1C5B-xNvlWl@9j)a?;YfEPMee!0X_m5gA7YJ!N%c# zoIRUd=0!n~*1b-94r@R1@+=<;VQZPHVUCyY2g+yib#ync2n zC@5@aN2)d^Z{T-i4hTZT3LG(x41=wk?$0DN+?Lre(neJ}G7;uZS9g=0K7+Uv+Mr_$ zke;%)(~V)lDP9JG07z&jp&TXRY1|>OS#HCcdmXJ~(c%KYiVKe^wM8k*_UF`K7$TEO zJiUK)Cs4kA-Gl&cl$n_zMD-edr{9Q9I4;cG#8(gHDR=!UD*Ne(+uHy0>#7hM`)*Dj z(JwQl-wE9lCywQ)T06S$P?DH->g?5q?77QVJegg$pkSj?yzVA>ukrtE>^InbK+l=O zjc>|Ntg>vF7uwZMzIU;*&-D#Id;h>cFmX_C3kkG1Ho^nD zff)>FwioY}@uBYnY7OqW-=>vDOdZA4NoJ!Ga_79{iwSCMO;^ z5b?>W)_VN-B|ydKNszFNX-IYp1SLV7@4=jaeeICdo2mKpFwPjXm@)5*85xUKb&x!> zLzpWe+bk9AHC^tflB05|yiP%b{!XFoox7v_CZ+N8-pp;AvGWZN5!6BiN;H{=Spfhz z!rw6O0s2?1r3b3~(pn)v+In|8vv2_R{0yXm9K^^T0xII_WUkewu2Y+D#k*yy*_=xe6J155PG?;q0D5gSr5QkliOHonpYUk4c zFk%@^JKk)DchFS^6&pM%B*GMT%NRvo9r1d?O<@30sz8V>PZ%fTs%h0r?v{%`DZt1eJR_3Se~Tavr3*$lI5DxnA0MXmU!==*rq=f)#Y#Y zp-)4rL_ee2x$|61vGU@*Fx5v|z}uiXM|-23dAP_5F*zMNV-H5!_@dMxZzgbPv&H~K zY4iiu=2+nPv~T@OLMzxC*epuY89&xLhOc2+1RfEqmt_y;E)s%7J71(vg?&FC2a7JT zY-bdU5~2I^t-&lHsu|yj%km` z;&gfogz3id!PvZrXu;*n8s>uy3`Deo+Ie=vTAnR6HQJi2=}V5Rr3j)>yH!QhCW(OAQ9u!=)0`0 z7mscC*1wN!H?V5=?h_1RL5qbr(^8%k2%`w4T zr@+P;84YlD)Iee_6(6rLZHlEG_;MJND=BNpY&qYHSmv%woYzEvXfpNrqo*|U*y zF@G%QhsFGoPU-S$q#)yJ9Hx0S)P6mA|wB>)< zSh`@ow6!hyHJe6naR(bn3Jz3;MUN;()7rshMXke-zL7e?HWMbi&)+BoVqJe{>!Xj~ z=+?pWNEqlCH%`UsDFAB?_L>;J#i{KozzPP^>3dc%O;~jI?xCS>NQ3^d`n;1yTHK6F za|QmTrm9+M-q#5Pl4UZ$eZub8*sr|%=4L*`l56L`P{<4Uk00;t`D7~7BcE8Q{qy22 zqU?``*Sp^)mj)9 zW)rr@TEDW{@ursb&nR*T6%{TxOiQ9M|13pVd5A&TfB}ry!c((@8^NnjK!98rs%H>U z)Iyz}Y}T|^O_Do&z(-ep)2r09w0aOvjs;WHycDQPGmna;rgN!oXsYneLaehX^OJl# zg62^H4K8SEuhOD=|D@jnprSZKFH`OmyVAo$O~M zwpbHXKS~|rLjD}OJK{ck3JP@IPXciksK=@LI$p165-2K|{JeJe{0}3JIW-%YkBD5u zR*w#K1N%W-{W)}Vvv&{;Aj5y#wiR7iTDhzS4DrSdhnsc5{R9Eo01E-3+sLR*Z4I}& zeZPP6uJ=_2`o8uUM`lehUZPl1{cA&jgssP;E=vUKu=B#g@&s!Mq0fEQ%|{8-G>iN~ zn39**fa-eAM8FQSge)N~EAchZtK0DgeD0kg1rD!g(`Pkz%b z`_v?mTfI*EL`Rm8Zy!2E+M;gDV12NoWB$N6;x8c`j4W`Y2smj^Z?r?kZ|zOXqiT@`yze!9@a)U6q=mQ z(}(3edv-p^`o3cnIv7HvQ?d+A0vKfml=hwkf_;S^R!eAkA?rMAR^drR|5V7irrwN> zyz8vbZ160XBcq7~&ldYF;8jsjm6nw?ef##N>1>4b@JV-Y%6F%Eci9mUgJhW7VWj<) z+G3>NyT+D(RZYUiTU_g%*RLgD%Wrpo&m8&E61Pdx)`2Wn`V2_tbnzSc&}rU0w^@(Z ziRS4v>BR$*X{G6ad6u~KxZU1G=s!OA1CP?`Lu5zm-JS3h88B*83y+N^fq9)Hlxs0| z|Mc0zcN6dR%e;1)%^c}49q;rD7jlDt!3r$Qyv+rp&*m*4P@YSc z;B(7B3U8&8d0^Y0bp|g~5aI_tK6~!$S%5vfQP=wTxc1SfA0d2EGEjF&SS{&uNLe~B z_!o29I?$U$IVWYwfgzsuMdkBV7>dIEq-Iu+=?@C9Q zIL>;emqe;;Kba!Ae(!yfRj~uS3}di~0QOR-Gcd@JV-c`7<8QdDx#FS!E8|0ayvelRHz7)den!Ms`bMrEh&IT5uLReLOSPdj$If# z#I4@rw*=0M)WQ27ws}2U`$KdHqWLAy)?G6R%OXF?`dtRzrga|KO{p$@SaZME5BgI_ z5IWzrh7cX@-brWq&enOIyd=`(oFrTY9c3#)RiNVQ5mW9j=t#JBYo1)5uxL1l-uKlL zHLbejYq~1udkB6)!}X)Ri{y3t^ttF&c7o~{sEVinR&Ts?ey<)qoV9 zPGn;?Z*Ei+y+_JU#9YqO(m3r=azu+aboT6huY9rvHeXnHeyFd%7wLa2j>`twe*JgM zt5>hS`1s+^7?`8+mSSPt~ekX(E)dcH>ICIFvEy| zqvP(0SySAPp~+cSY42cbd$KT~pI+tq=POi2?R2gChg}*b9!UA-5Bc$_0$lTH zVxdwB@XeNeFD8$sPel9#Nozp|&9edK0VMVH^$ze6bMmB8McNtL%_8t&x#44P8RJ8k^4iLT4(DkSRzqsnD*(jWn%UqsVNX)yANF5il&Gv z``Pu}>(|?;Er{nxtZ0PT+LAK;@{>83JnfsB0?N_!s)Dw*6@fwh{JNT&@W~3zM3Nqn zCn3UgV*)q)cs+@oMuh=%P(SHq1A`y6m&q87EB}67USgL-n6;s==O$^RF0NhjT`nB# zVErs9ElvD_RSvp12ck5=43O~r#BJCug2&55&)<}dw7d_Ro?*p>5dK!xMg7jj-~lgQ zAg9VCx$=O)zh8R?QUm`{2r-~$jsvF7A?H!GN{HH%+qbt?6lk`HXeaRItDfO;anH!f zNdFCb_eO_xftXBjGiCxIn2Kh@pPw;>opgg2v*QY?^ur~cAO>ME9|ApPOW(RK>ilP~ ziR#|ihTrXOZhrOL0sYSX87l`yIV}IlQXK7wk7p1X)Zc8(x>fj5(*X#(VTo#Hl1xz1 zBzB2K7i}nwOHH>hjtOpj^3pfSN^AyUq`N9;7n~#X95k3KFuA8aXwwit zCHyWlG&J7b635;7NTdsFXe2kL?3_IE>e}^u_R6AcDXaDCN3pXC@-(kK?l7{N^aaaC zi~2P*@HWT4tt;kR6%>qgTD4e6zhV`hHYWNT1&mYG%e_-m&eJ75PMt>oYrmBhUJv3; za5ULx5->|DPHwkMX;J*It-U*il?nTVZo(*+t2;Hr>cYr^f@Z7*|C z%5a>15ny>ZXrE8~C|Qoo9OfmeFdMPb4F_G=J+x~nDG`G<)AGbZzo$-1l(nQ6liy$? zq6}NlViW*^jp-~*4!q*4hvvMkx;ko!jPvmBD5)CnWCQ+wdMUcX`ZGHKP`PU>{v@D5 zDM8T&ojS#Q_~6AhAd2ONZk1L)BSE8}+49V7K#dq5&1lL!zwa9i@YE@cs$GQGntK1K z))t#}C=moK!hGD?BoJpKb70G8eQWwBhL%k{?&bFxfY{;VqrQ?G^Ha5l-0bBtJ4Z^` zVgu?^L3>C8d(TTb5lWuSK+hdOc%pe9bF|HW#G;#z%O8ThqCCeZ@fZFMwM6&}}qBx^-&-(`pYEIB>^z@&o&SYeMZ!i)gAJGnhR@Dy) z{0R^)y?N{n&J)yFndb)zWmRsS*w!SJDjkzOmfspQ zP2!>OC1-=4v_=aDJ!7tqH@XqeCON>o+P2WiI;wzBY-H)Hqfgu4d-) zlnm0V{=<_Q+Y;^_90o|!;o>U#?4N(ZwXKKvHqe92R-yl)IdgeBIg}fMa@e$ovaoHO z*zmw8`ky97pzD?tBsc2dr@riQDvq-0nUQ-%SH2l1?UBAoRdeNl0bJv5KhR46=*HPo8?c&(ctOYarO?^X2#6dH#k1GvQPnbGn@ZiuN4GA1c za*gZax*0r!(9r8N!yx($t}Y0Q0e8!h-nUmo;Xv%EE|)G}K4Z?DOPQIqr{CTTiZz(B zo>GfvjR53oU)_&u5P|0a$@7i&SB;`cLeb#)nY}YtajW2f8ut9(ww`ymMw^aj1pOqL z7R^076c?@YQ$yANeGINUWQ?uJ&C}k-AIB1-7Sh|T&#=m;PuZi25O3wOWv3HwUE7l% z0+Ht0)P3@7CNu}n%T9Z_h!GfA1*be?0Y>7}C52_YmPLz>Q_teO)i~GkLHiMlbx?c5 z=@JG%Db?-;Q7z$mEF?hhuLIKME}bUlUc2VJy&QZA&!*Y4_wS1w_G0|C9m}TwxzsgW z-AX1*U#OMIcaaNII^Sz@szj<(l3-N-beE1ik2;ll^~{;9(Nc+?$m&iY2$Kxs$niuV z69G-p`{rD}%;Y&kFb0$5s7RGDU`d#)?JAZ5C_s=<{ra*5|Buk_t%NP5-hY#<5p?!C zA_56jigbFN{s|^As>!JT`LfaTT9K_$yZY9iWEzwy1R??jO2gc=g9!;Zdd!_OM^1o= zqTZl+M3aa3Msvua9OkLPhnZ)bpBE}t^#7y*%*l+&R@2fuW$XPXtegraIXXDlOSlk(_g-iD)mEhqq@~WDA_VmnWX%D~1#JsEl$HtZ!nBpcWwc~BON^0J4g7gNN$OY!Rq4{3XUuiwH~9Gb zKYjQRzkL?eY15r^1ZWs}J)a$lsMJZIjJQ{1d3FpM_K4A$iuX;t9S$z&y0X^_;TC~qo zmIWeWmooah8w&+Snwfp5tHblwA>KHdr*-=Dj&Zt}Px`s}_45EFrViV{&^tv$&YBLJ zC*v@7cX77X^t)67^SGOHc(l5@UJi2>;^f^W3=Dhy-xPy zrm%4%#XkOKyj6tWU-jVx-57KpO;JnK=VrPq)UEi&MFj^3Df4ft9v@X1LYkAh&(zr^ z%fLnyr3P$xKvMR?fjXgCbC68>#fr%a0-G8H8DWXHx`vdaQYi_dbVCX-LX#ZKqQz)b1GMX9HhdbMP5ri#fQCNIh1{Vm;-8kn8ox9av{qziG^*KR7Xl! zNxm9rr6)|*(y-OH4jU@GrB=;Ndu^(i-}6 z0eL{I>EN&m4ijphn~LaX;Ow+#Iji*|Z7Z0S`Ft4DSz{w3_8f<$GXwy z=#Qv@hzwa{dJo~;qoL@-8a$u*~7x9h=llx&~cH+tvaWIZh*M(d+d_|Ag9b*yC zc&%K?ex3J$vvdtYVbh^-VrH1zT*2kUMLe1^9hjO68u2NZoERCYoM^aV+&JmP%|QfX zFgd)vc0cnA*Yoa%yh^cZqmt;}h}BdMYR%Z8gjXUc5~H5q?}gjxgS}Dl?3}hy@*PtP zSSqYSkK^e%qI6TekPh%6pvbrf{&ifT;qDcO zv;zpHJjaoK(%wF;E}2?BI=Y0G#xnE|YC3{BK6M_F8&x}XIt~q&lw|60Pn~Tt@W|+H z(&sxSznt)!*8E+?W^(}|lfA+em~6(C`)fdzF=wuvwd!UERmY7W_FMa5To)I&t=ozb z>`6c;>FBKWivUKgg1vV9p+jy*Pk;UTRlg-&Of`%k9v(*=>oq}(y+~E2TUwUvBhG`pfQqRKzWfG zCR;sw^C3ki)@C&V5kH03Z&xi6%|W!aOWYHwPHbrgkIq`c`~-9y(R9w)xdmspMQq{M zP_6TyPC0DW>9bSd01Jy;)W2v_paV{yRt&0mnZ8IW@#qrE_CJ3A9+m3M8a;-7QjM>I zpXBA`9Xd2Gx`xUplZvl#E^r>&w)HXOIsZ3 zr!n{xDm^fziU}wLRKEk43U8kCu^~Hfb~UB_G`>lALcV1+mQ7e`G14Dd zB-UrteIm{Jcs~zZfweea+aEF>=y2F9BcM-mD8*)m_CO)VPFx|$FKz${wJ*GJ8eOuX#cEDxnRcTMqy&Y^;4UP+%(y zsZc281#xOI`RZ}zOK-`IjnuqjzJ4U9?ZS_L@7_ud=I4QCOkDD0FQ=vL3cADu0>$K_ z3u-wIoEI~;fJcY_M==vqpIuoyaPHxPaqzUvE%c{!UHK6@K64dwf^}A$$cj2s!{VD-?XW zn-8=rwZZDu_#R#$$mkrFFO$0DZ?dn`<9rNA%Hh1~mR4{1wtOGjAp@+=Pl5 zISa7G<$wE&bDFps@Ho;!qN(vFgi z3Mrd^D}@aa&Nt=^+mxQqgiuehgn+JXVUZxOn;tIw-epEm#33B+BR|Q>L$xcPJiM z*ZcY`M@Lsr&wt(Iu7S`JM-vjD^}jMkO;Jo^PoENp zPRRqj)mPU<#wO?p8w2_iL=RL1MCW|3iwGcqYIFeo+RF~td3eZMM<;k5R^!Gb8=Iw! zRinC%fZ4)kMLbU4!-v%7N4dH6^@H!;U@A~sSJnG&_e~a+XhsPx+6_K|Fxy{mMpxag z5i6$Sg=aD@{Z-Fw#_+_8@O_!?g#8-MS*-x`qav8m$P!7J(DMYkiweUs`bt!9zi74S zVYs>?f-(`#EL^*G$SyNPZd)}=5mj1yRc65m0?7gs$L-m}Sg_+Tm2in~pA&zMn$`^H zDBdG~R`#r%Lv}CG7|{x8dy%Zs+hF~hq+r}D@>{5_eSnq>h<<-`w7h}>Kh?EZ9|YFu z0gm7Z01I@^B-vFkxeOViA%e6<@xcXrc)vVA0?R_{MqQ?1LwLJr_3BH956`oXPoS@C zmi_d{6oH+WD^&)ZWcl*bTwiiFC<8mDq#U;IODNQa-2MIFvaIm##;itF)?Q656NHt_ z;j4v)yKNhO{-n8C?36NZ&YS=sIxr7P278ce4yu3K>oR{nUL9bc_R+PviBVv`RV-h9&jz? zJ7z8`)Oj{)e;0o?ta@^GjQ*swB-PTn_2~)IU3<5eell~F`_g?y>8ZwZ-?o#Y5nyMh z6g+m3=Mnk>bb*OFwsYskbMf5WjZ4kEx^I=lnXM4ChKY$@%(h%VYwK?RUDXX1q54Xh zV0T=0e6aiX?)CQb!;hY0W$=V7FVfdXd%sso$?Al86o}skCW1t|hurXe^Ra zQ~lPiW$VzQ+SgC<`(f`rdD7;;IO1IePQ`EIQ^&_Ovve3|2TQXuBK`uC^4%CXVFQ}) z$+MO;>eDbJOW;#EF|Gi*vz(mpMuj8ks7-60hlGYk3bP+S^ZSdCJg6fYtvv3BYs=0v ze4>l`2%R>!v*t}LO;361UYyEcQ9&UgNv4Y;_2#$!hEySTpuE)%Bgx12ug)iGrKl!t@xm5N(#y=lm}og{9``R_5&doc-&Hv4m0lZYy-%kCxdqRUr%TDA7#1m z5)J~;PWajrw!7;wUnrD7+BGr=lhJ~{UEuzmQ`jE;q`Z6->>7U^F~F@(n#{$51RSMb z{Rd=_nb>4&r@eQsD*yXeh=QSI9$ka$Axl*z5&d-DCWZ#WsTYzzh4jrA8E zG-VJ@5xGe4CHy!RiX%cQ!-Qz-)bsivC`5>9UUY04%YBEOs5QBpS+sn^?cF_Zsf%nu zn%g3`rajv6W3#+m)o|$h3eWAX+dh;r_`>B8mofg#i;}pL*!TA=LR^V=YRR95<``Hm zPD8Yn44xGKoZJ_y=oES!TOh9?SG53rA5_6=H#eqLAB{tg8g4D_q{%O z(1bNQMl~<#hia1}WdjEh1m3PQXDT^%58iE8_+1!#c1r+^#n-8;%Aa1Fy>*GGiw` z>Pdxv$)=MBMe{gC5!~kGSzQ~;9eNnmYu;eC(LG#xji$xqRYbPzt9Sb}etD7*qN}C# z@T8kGEbI|oSb(P50sERw!uLbTJxcd{%kSS$j*N){9rG)1S$*U7K4o*Y)Fd~uZ_8&^ zcH1tJ_PH$9R}zWPQdT{81Z841?B^AR5h4-N8P-TaXw z^^r=Tds_WE872*3C8zjX9gS`Jc6tskW^pt>;WiParzWC0r6eY1SsfDdx7fT$Wo$(d z&hf-tkLs;>4yXbBIr-XSHtW|^Vdv&}Mz2c!1g@#9%r9$%=Sy-r-?6F_kOg?^e<67+G~w!5_IWDKO~Ost&?a{x}IkvEJ^02=n*{rlv4kx)vEhO3RuN${#w ziLi~r+}kM&ITe2;Ble26sIOXOj#vpG+E`>YN@+seGZ51C{;3Cw6rRdAhb|B)-EG)l zTFyAQhJJ=2mtMJ(hQ@&r>y5t^cMQwnF(8KkqVcMq--yFg4We+&v z(+o@+?BLihD@5tN#Q!~u6PP}U|D&Ph@q&ye#{EY`XdfC1hAH6E@{B6J=MxsFT3N+U zJwrl_rIi(Fx%=Mj7W396s!rzQl>O}*k-J{_A)P$EaeOAh}Oi* z_aEFS)9(*ZphJga-T~~gUhgkhEiY$e_hC~piqwYgkRk!Y?+BQCr?{}2H$TgT87d)~{4N@^7e(zc}6&(iY>xKcZG5?T{g6@+~eEElvbGKB) zo#IDjYX0t;e{ylSNU9}iFVdFmEw8jy?I{{Ab&(p2X1n$}unTGKk^7N)p39f-SR!Jr zO5c5t=xvcOqK)DwUD4`-;Q-9%ML|Jibq2DQ!qU>YbQ9Iu{vQ00d>^{|fWOUaSFO4L z@b}dzQeUY}Qp@6$y7t|6YwGA6j*4RSGCcean-n%9`oXY)-7-E9^sP?B&-LqsCwdTv zwPsBX_l6gfW|8w}^s1KwB36_#k{R^s#o98#yz%7FqmoDImyREo+0<8eDjKBWj16x# z|Jgn1l=srR+-)3yT1aQMq}-a!9shf&&^iw=Cyn4NWN7YW(Cro(tt-haBwK*Fh+ z&NbC>`k!|3!ELVBmmm9ct@iemKI6&jAS z6`D>Lx{F-=A4tO&a&-4-OB?OLTXo3FZ_sXAVN^MLR_m!C_h&#{_U9$9gMeQB@pfgM zZbn)fLjz+o>VwT&7r9bC5)f~VH#(^75 zdxgIVw*dG6)nVDPFT5ihm`tR=Eb+RM-5xf_#3SWD%f*SM zp0U3-O4VIuCAP+hHyFlr3+oq;=XJKV1v}1Rlvnt9e{$b_%<;%KN^T1y8;*kswzq7X zXCewBjw>)QgBcTZ`@SddQ8SJFPuO1>Iq4L)94S660r>)F&%ez`NcY5Z2rSCg9yI9k z>C*}#+uhwhaN)jxC*jCLcT3_bPfuYL6W9^>!kIIlp0+xt)4lTWz15Mw+nzTVHhk}1 zm0ea2=L(U|@hwoctKFLwsK%dB@u_3;7;_Q6R8-ZSfF%H#hb%h7iG5{FTz0$2*6B(#rD{!wW{DHi0>>yxWF&GDkyQ1m zszgCQ$@h|}v{7fus6Xj2s5O_UfGTB(WomB(sm@lsSzmH=B43`IxLV<}-Hf8mr-aiQV9vw^!^? zm%F1)r-%gl@#8KU8t8LpktJev{0J-t+0ks(fzuIzh2@sc`QcfmD{}5^2L(1mw{1mpI0K3}Q+R}ly58OX=BvH<|s`*t@nmU+uDtsB< zFu%mTrrFn*xZ~y|P8=X8BZ4_^c&pTE}go+y7r0ML3IW|=@@42^U)sUgRDgu$|WoKdj81m z?(C>geJaw=s~nIrV&AZ?8}}((qw<>$OW>S-mp{{9nw z>M=JENR2)R5y=7bm3tw<_!SeQdHaJ7!~*gTj19c;*@l1Sm(b%aT)MQdR%Y5#t;Cd+ zh{(v=hFO@NA+ZrC2lVJTxSg^xRcHOtmfWgKgniQH@&i-b@7!8A=mFm={l<;k0S%`M zk^~ng+P%V7I}89Qr-UvL*+%373>sW?P&f*^w0-|FF$*?N(5n9dmDr5)O%Tb$hD9#w ztQ-uYXvM$f0>OZZj!CxZT_zy8n)P4lrc39}u}eN8RLEBdQQa1RhO zt`_H+@Q5s&bX;vdJ3sMR2Fmw_$Rq&hmD_C)BZTl@F1I?5gV0;RUEl{})PhZ$({dmf z6;>YsFH>3rtW0Zy-hviN;A}!JHSh@tS=wiyb(4IOBtRADF)zBOYz5#ZG^zBv3>iFQ`@wF3S ze?bd4=$mP+N7owk?p-*$bJ~PKM>h2py$ml{E;1KuiS2wot~vBx&7q?B$20QOWPg`U z7kPz@>7Y4Hba<WuSl1z=cAaYa^U5Mi@%MMfUZd*xv(KW7 zig6Xi=iZ8^2G90CuUk30%!JkP`s3Oio@%}JZ4fYPh+12T-8B$Duo=n+O+K!9xQ~ir z_U!2CB_QM&bN}eYi+B^fWw!1?3>hD9^)!#xcgx$Hb}#+*V&=eLvg)W`Rewq+lQMk= zu(7k@Y+*!P8Z>sevfLQ2r)Wg9v>@Sn4;(0%idm-3U+itstJn6&mA^X?GJoRNkI^@{R|t(M2p1*<9Adhn z_N;l8c#Lglv{&3vR-7%akK4NIyr`RY!iP^mfwdhs$cY|oT~Ruux2U`5!TftZ%8Hhe zDpGZkwkWbKuI<<^Kao=X6>t`9MEb8@VKsS=lOFQdc?X-0-XQ=0`r#{+J=~#DKYbSh zRB&H{Qvi|`wMhrL!!=+@5V#&&A0&f?txWKJbH2CO9CO&XX%pgJMcux7cf46}@f@my zI^gz9cAI|Mf07&j4s%O!%Jvm@yjHVNF4E6toP?GO=_QmK?m5I0KUB|b!8-;tQM&I8DCqjRm){P7&CRNR|z8eIJM6{D_@zI(fKGUhCs^Rl&$KT?HQaw$CSLz zI(RZ&b6o9eP_z}^jSQzf=A4^w;u%luax&G)V?p05m_MH$8|RVlL((0VS;Q(PUz>A# z1%yxg;dA#^lXBBJ(bw(qJ{_f9B~5EI62uDo-3&wv-|U~=s`CEE5Rn1hwtgF~u-%c7 zc$re+`L=Bv>lC{Zh>0yMoKY1d>}O<7#tiVfpum%xM$@IcR7980VfDX_*_(X-EX3f? z{zQAb&{Hw0a7H5_RkN177o1?As+^}h?Lf{*r~D@b=|2qJ-fb9YhTy*8P2eK)Hvmgp zPaCQWi{)?t;H_nE#R8UxS5zgwr-5H;s{IGOWGk-ZFFvpIUzmr8?yGGS>)l<_8q;GF zY5AT8ccwF*3+3LmjNrQDWUng`;hFSyTJ!1VywauM;_hW zwM?{BY$Lvra$8;e(R;DWY>}t*Tic-NXTc^sN+DU45<;5{e8;wKWal#+)K6tXyXhq32~@9uL}&EJ zjzRSWFf=NCa$KOlh{Gp04MF9-4#(1xQc}n*k(DCsFmr!dSXL%rFiD$s$%+EScYo`J zR)&#l6Td*WT{}OO;IU!5ci*#8{>wB*o>lvH?I>$iI_(WH?EIW-n3`C(B~l6EMzHZA zyGCEI1UDQv8C*Dj@D`?BY0MW`=0gNrXJst}6Bc?mAV?ncjBC|dhT08djF-F4w$+j< zJrzq9nTRIHiK5pG{w22jRW7|guS;uFpYF4l*@-S~tUJ0*FaD3doi)b{Pn4ho;dwGM z1EanAPS7clNqr*a)kWGx2tkS_@DE!L)ViCoH3F1e*sEZ**T#S}vukVHZ|=pyO5zO( zAjc~Wax{9^8G-3(_aErd3xNb*1ce)@JNe=SP=P$`UOs~FS5M-G@bvp)Uzn#T zFmv=KciwO0lsE(qBvmuWF2=cDgp<~DB6$nR~dWN=)LAO%pN!Bb! z$DLteLtg)2s|itZPwpqnN%x6f4HmbE5)?Ih-tA5ywSVG>q@<|m#{jL3#K)scd8Z@) zFL8rucJ0;v(UX?V=*!LMP2RrE?*%g_Q)VnI23D6OO>l8}ouBUkL;?U~Z>u0D2UM%N z?qAP-veIYPBOPb&u+B^K>r*yS)MK#uDRH8lNOWGILfqxg%bZbF5h-H~#%b@iotuP; zeCVom>)VQDnnB*mXV!Tzpi^DYrtm0#A2^p6l7$`B4SrY2e&YVa#CJ$~-k(+#xB<|C zwqjT0gjMT#7d7@X1q5|vJ8v5n2pDA$-1Wc4SjczpNAJ$Oz<(P~IkDKF&U-=4(S*_7o~*xm_}h z@%q%zrN+4I%Y~s`2$>aiR;wF32iavWk>ZA*s@vRz=O^KRK?JzYZvROt5?XE8Hj@{m z@7bd&J#hl7g~!p-lO_y~G|qHTqap}0^LU+nu3++x5nydt7XU8M?BI^7)KLXel=<)N zTF?0dT6Odki(?bConYD-fipUpw1GCFVqwSS3;wdVEf z+KtzdwB zFt)ZPi+>A}jB>R#K)}_iuRx%>lU?xowTnlu0o~2QyALD2?z&&>VWe;Zciz|HHiumB zuPJ~|fd~yMsxVdlMgFl(zw8%J6_q$dqCbGh{IkO{KAoa-K(GMhg^_1*=%BEBxjH8O z5=A1QER0+i|DHEdsO%{%+M=dv9wMzY08=b@N7Z92&M(eXGwftI6=Mmt`L+r1Jj@l} zljd!`dUdTtk|kh|CpP5sGeMe=W8FwHQe%yszWQ>|z|Y@-5=!EI&z@KKY_=u1Pubeq zwnvby$+h0OhxFwV!!PN@{B@YEFx$m;M=&iiBh=J*i%Z|^Aa{{=2JU(>1lc#J0bm#) zJ8t4do*nt&kX?aX>OP>r+x2azj{kTRBd;aknUd1Nz$-sg702vZq$+4-tB%v`vJ3^O z2FkLD`}$VtJlQiHH15zLdzRbu=<)vj4)@|jIuaHTm~3%Lgtvm>YqTn|k(x^@PF?A* zsG)n;45|RZTlLyKQ_rx~C}NNAIRFo=sRZc{-SAn7%Xt0vZD^*2pKquC;=p@x;?Rx% z@@;B4;lV-EiMi4J<;6sR5l&c(?JFyb(2$EpZ`c&ji0-u4+PuHkBAr{RJH_gv*IF01 zJkW{pihciaU@`z(-1X<5ca0Q@kBX(I6mFH>*=*5qO!H(qpoI$;Hgy~XH_=uVqNiYX zhRFk??N$lq^fA*l;wL+xGR05CfL+?kD%US2^F;()dM;TqPG6mA%l6?J2e~nI+k^lJ zugMc9wtLxrGhoZvY5Lz-z0N|k-L_`KhSmOP=N~t5%9K%?|N3WU$B0IXKPN5u?iBGL z$V(hNc22rCLB?B-L<+gIKoS1IIc8uHTt#e?>wJ6yDfd1NlEAL2<7kx3yRqJNx#h2= zpaIyv0#GjS9GAhYWCBoujN$S-Y&dA8=<00a_H1EZ{UPaEI05yDFO!mdkWKshNOLpFw zqr5_PY})DL$M3=#jy)!lU_~JoG4Pf_h&uj6AZT3GS70xpDZqN^xe=VTuUK1!*+CPV zR=SgotRC+G1ONe)ufR~~*?$j=6AnLJ$qGW{<8uiXv_~H3b3xqQPj1cDN0l{1RB0dd(_cfV;)ZgdG`{ z|9b~VnjYXy0|qC|GL?m?H?y@T(adlUSc$@)$jR+!nY(WD=F$6-3`E7^e+v(WR{BQB zR2{{$fHV4aMFm#mHhR}=@0LrzbRbX&16vS1fZxzow2{$+S`-Cf=M+(g^}Ba$=~R<_ z?ube$Zb|q!R4L=ejztNtaIk+r6rDFt@`{WeT~S=@GxLRRbrUc|i)h*T;PA zlofr|l_;0oB&2b63|N6QwPB>Vczlb-6JOe((i0Gr^9z;%;hUSR0hQV$KWR8jjBfDQ zbVLTQddLOg;}Q$H`9Sy=aTCP?3`I$&ls zGzh)&IaWm>oZvOYCc)-i&Nw1Nfc-;l7GvMW>0Gg>UjCwcOWoY6Cp&;E@_99Q;x2kL zeIdR3`|IoEwVvj$nV2B|3izLa6amqlBa0InVM?N9m0i7U%p~%lN>?rmfi_hIE&3{95#iYGnDZ4d#n7Xkrb?Yv6j5Nsho4`vVxE359y zl>ePjJ*u&=hsg2dnNCMLO4JvsJX!l|w~9no>v3!M^)gBw>N=WAI!R4LwZ)>7;?DJd zPb=NkL3Cth1{8JS!n(Kv2j-A2my8HCdLnmviSB{I^t*Dube(Qf62tfyYE*dZXIakJN>+oreu8QF5|z<+p*}j z-lyC?`xpH_u;^vODgf_WU5#eGED5{>)s$;-n~+OR58670Al`R(>)j8JuAZx%lI>=! z8~LfKDvJF#5Y@EroNkX^%neo_`}J7#nIQG?zZv*QKSG+>ciIsT5BqPCr-bVPiV1Sx zL3d3F9L(!)j>is|Q_n$ot@F_l$Gg;sfJIBdq$WiEi*oQNIxob3ZT|g* zy>XGSyltPX+tLBXxc%sZ;42X2SpqU3FhiYZVrdx{kP8e{qO_n>Z`ml%;`9qX6EXRo z|ElWVyLG1fh1|2w+FtWM?CW^k9?0o67UA+<0xAW|>N6L|d;G9klGLID{sO}Q%K=qV z4ANzaOev4laSKyZVYfW<*elf#_2$2ywmU~{wSvWE8%$YMQ zJU!nuCJz!Y-1L+yM_r67rFyRZQN8FC;gYbs0V9tPrc`=0@gw~_ z_)K6+{V7Z=dwPxo_D*-b3?_!#o$|}lq&EzH!tlXjbD{ZalpT5=!UFmH`Eb|l-m-yG zQ;A-s$Wzp_wCB+C*UxvXF*Q*H_d1%Z(|KstkfDRbHlY{6Vw_T~&mieRM)dWFVEzK@ zPb98s$DLJ~HsD<4Ed8l)z8=P3L5I}Sva>YxRQdgqIcu+KR9CV3 zm2Dp2i5Affm(HH`$GpZxXYh~fjvp?S+4g_GyuHs~zI>Z)bdizMvX_2FSzy5`jxroA z#Q@LH;j|M|%Liyd${0jF#MiKDOHX<=T1%*PaMssXmxN$JWyPxZR*8Pmc%>-2Wd3lc za_*#^(WH+2mc5bH{pgI-vnz7%x30JsaH^wd#=IAw#2+Q2_gp!@ZR9CQ?>b2zAC2QK z^u&Uh?Ao%))lmfbV4`p1XTClGc{}AP(euq{?Obn^W<1)>$UDGk1;lxWuftA(AH{A= z;UjwRK48O(7yGJ1m3j^o_bF@FQyJBx&(F`(qwG3!aHpFs8*>V%gHHwkLKyiCzuG6h zmbpdL1DbYP50K^8BQ?~Tb(3@ExjR9-1B>-&8}N)+=JI}k25NG`0y2Y;P&m~ z*!@KJguW6u(sWBauBTmML+>J1Ho`XIp}BxI{QsTzMLZ!%TmF6j;p>7 zI6(puB6Z-LsRvAhjrUHz%>4rL2mhi+VRpTEsd1cAPtzCAKa3Ajmq%A%=~XGA_dpvq z*DG~eAHkUN^D`*qGdPNpi1A;5*}9URLt~2|-E_hsY5S~9@#UY$X!nThX8qf)F3KX{ ze=YB{?W%QbZx*s%5QG90v1up{k?zbAd%}qJS780P5P0+AMGwpxoOk)<+)FM53Rhg2 zB->3-Ieh1R=j7p4szliSVp1p>`j2tuQfmLR#86;qeDb7byV~fZ9vLUgwiZ-aI9yt4 z6?ZyWJpY=`xS0b)B6;KVw8yeH#0jEWaiKzJGG0PA#GC6Q5jOw}7Fi7>Wdi*arP9=X z$l@F&R?l)x`T&CIo^||Mno3VHjb4VgBsZ@prB<=0%@U#38N|{q^7vu>1k-aLm+O3$ zSA!rpF-wDX_A4x{N8LkY(=^cx|>6#d}DhrSQ$q+}xoOo|S_> zllV%5Ef%})F5N?{*eg{VSqAOoRmE!<8O9zn>DO;15d+|>yTig3`L@f z03o}nfc28MxYpNKRYj$T$-*pQ2thIhM$AAS+E}_A`^jL|-(GT2$1xq3QhFoWng$G?ZplpA0fu0E`0+{Z+Th z%hGK5-`WNbhyubn-3a|=n3GDSuPwgs{r2>jY{QU`9M(VY_v|t{!FthMIrM%!c!x&? z##DPL^*p#+xO63;k;H(;Jb1TT$0|m-uN}Vup?CmBJ8p-{A}h_J5k3m@ZhY1oZcv~# zL^8Zm<)&iV&@CgLjo``3q?LyJA*=lEy8kvFFzKS2LB$OiLfNQBFH>E8i=d(#)A%Rz zfUHnHAd(WKWVKt`=CZxDrX2>X<`tt3Fx)*RICA4i0j#?0dhV8>E@%30*rL;F2M+-^VbP5Zt zdW;QKIC1)1kh(U^3>iP2L_1Vf!`m@reQ>(U*(nmcv(f+bD3o;Ry??O z4=evD{4`Wv)M@-eQ;A%Yp~{}f?CTNI$%ixYOFjDN&nW(WNoSAD&qY?@wnN%A8AzIa zA4rW`WJXrT<$mg8vl2XnC?C`da{_b71VWF=l;2<2NVa16a#DeA;AhOp5NPTh{cx0r zbm*Q!qm2xVE|v2yc>EQ4WDWddp;<(hRf6xQv@}Uaqo+-;XUcwKLkB>x5M*VjuEarE z^X*$6m(!LP*49>8P6nr^VA9E+9{t&EUG>i0-9O+$OjA;lMo4>!7AhR=@3-#cJue@h zjLoeh_N^9{7i0V)LL5l6!i{jZgaV}G*MqjR!q-M$ogz$(0Q%de&(Fr~@W?=2&cv=c zcs`pUbyg-^ct$%1;1Cwpu1IeQCm2eplG4)5riwsZX(QKtev0E}hnn6Rz(G$>Yw!1V zqZ1tOKQ#WF;Fm5Pq%TupzInu-?_0YYue4W|=znM#Asyl%+qr+ALmvZVT~fO2N%j|n zTeo^$aJ+PWUe-EfhAn5@-rT;0VFKa|DS4Nes2G031Ij%Y3bbqf%T;l$3Pn%4~};X4vrflyIt|!k0mXNdGdS3gPzt_ zYs_7E{O`NHn#Z_FAn^$50JvBj!QCpqzRHPJhC@3;ItX4Wf*?*GJoj>Dsx%OUm-A+s zQawi%U9GS}t-o<$`rY8S)5T32XpDr-sGrB72IHJY6ydPeZeURVr(UvQ2c4p?%GPgH z%uNWDHUF0|b--ki@!)s!oz#x5Xjq|fyx-I#Bj?nH(jvoJ`;XM^yx&Wae9XnD)){qC zc=cZ@xx{h9AWHY%QCD}+$9=tf2AKy773$n!iaV_tt`$MgIl61dM+j=>;V#dv3hyy| zM*p3UdW;B)(7C$)!r%6#+FhmHj&^tO^Z7p3A|<`kdNZV{bYaSJ+YoH|z1fty=J8Kk zq2~f6zaG7!_w->^HE-WON1Lhrw)3slxh8BYt@?6sSIJUIyCxSGXGgp7H@jOo&z)^M z>Wl0p>4n?`7I{u;8<3KlRyo95UzEn z$_rMLCIzliqa^pa?^^kTSv7a z7KKRS8&kT@J$-RNxYpLIOOBLs z+)e<)lav1O?xO~*YuSh-40!K4FQa#(0UI@9K7HvHGUD`0oSS7QCa9&Ha9isy3ArEf zP1fNZe(^y4_Is9B7?ly=-t9qZ`mYUz)>SoVlS8C?khnKc3~q)Z_i4|H%NC38zTkWAp8U z)F;BP>y217c+9fD_;vg8r8|$OAhI zyh5_l^g)BB^l)km$`~cmSF{uDPi?5`;vhS6rB<62^obdHzUJpwL?ryW@a0A0{uBba-;Db zx&NK26s0aaEqmef5T~akCzEGvS$fs&B$NT|DvHYu7hLB?oSF9HSFxp+WMcLL|BRcr z&P6|3AX1cC_L(xRFcRM{vndP>rh`-E8_CljP`wVCN&!ojjK03U}TB%9eN$L&O>H|w>QdAB}g_k8H+SZVY0ST@(^oOS&79tSNi|7+*hU8*)q z_S05X>E3@1aS`VZJU1+3m9nx?|ADDvBqJQ|`f3F|%q=X$u-dqIs`Is_kJuU~FLMXm zCJ$%E>Qam07p^j*lHCYecZi{-(CD?H!F5_$R%{s<8h+y2AxrcK8K?A2W!8)x>IPBJ z25e!eYxxTd^Yz=X8*}4B8)zpWBx&;a5Sq@zj^6AsIreV$xPX#ICrLLHQ|6mg)n2u; zJ8awM;7aNW-6qLNz>l%V3RhMu`?YiG#59BkYHz>FK~*har3av@h{PaP4Q&mk+cpHG zuRGz=8YkUB}0qC9Mym`_PZvI*ByDZgQ&8D zm(B3CjxQ&sO`fcin`ZV?%Aq9*?Sbki-F0n%7EWq3uBL)hm3;M1T@7nD?0x#w0rCoB z$h7)R*en`H4zCL*PV6JjWbaKJCQbJ-PAn z!ToDjth?NhVPNyZZicfrE~1V9wp`GFDDF)r-8r$1=-`^h+^mA14J=wZ2FsOH&c^?-Ith*Bfl1?2$nn9F9@C5Np-YRZSKH}1V^ zX1}CZ&)C$-_21%E@@Kl62dy@U`pncVY>wwKoO2*~;)%B0f`WoakF=R#m`ho@hTbAAp zYUeTG*w&obMbq2Po37vYuvi+;cKc&bR%>gfn`O>lf7Uo#ysac+tNNTiq=E$!YyF3f z197E7p)M+F{hn0t-t|)j96CN3QaVO;uWX zUl6Rq@zQed)*7;{+S&X$O$IhV%N|eopaCOwORJ3R78_IqDBih~wsxF+(!Bj10fCpI zMMYg~f!-W--N>TwH-0BuiNKSf2Mv_kOX^jOl?UOpzh$3X0x(xFlv1i_=%eIDP;xvnL z{aE#1F=%L@HNLMzokT#6f*=nhynsXeN&K*BM=rm19W;!_B)bY2^B26CY2=B=%pG&D zyGQTa*K6F6abrVMptgJ39KvMCkwht2Q)Y>Pi4)e2Ymw?;^quLV{kh_epH%OMZ_TuR za%lSFpetL~NhWywYTV$THUDU4$L$8)YWWbf!1RoW#Axbiv(_S<`rTOl=aFFog47|O z;EblknXq&V0@sLvtl*QCrFqewDD&+T(`G)H^$38dgT55ECK2fc&F3lZw%%PdU*F3X`mr!I3QFKnz&=Wu?2?wpq2`TYT<6{Riq3Z#gH&Vw(l@vB*QSI$46s&3K4tG8`koWvTHy_OA|C0l9vp={y{ zM0CJJEITTu`NUmGyj(s})BsE<9no@$ur;F3nK^s5{6fGUd}>EylMUEP8+ zW&y$wzFqHnW-Q|ZgoW7~VLKxoPMbOM!VemS*1cfnznPQF5>hBR&96b+|_eFY@Pd7e& zmbkF+toKKQO4Tg+4U^hjdsTL>yZm;$!9W|R;mo$yTEX#dz2)DD$kDF>mO;2#*1%O+ zFzujuzuvu1HU@T%%_}1NEah}z#P_o&!#%!NpBsA8JSTSblEyFR8kGIaU$#$HuoTaAd%>_l7jGuQ)Cn2fe7Dr%Tym z3Xz2jS!rxDD4tKkCXU$XXzGyt5d&+$pWT}78e_Y~#>HX&-h{hCqnGW&wvwqjhz*l zU1fjBa{Bo*$b0+yZaLwFSD_lcz|QNaTA&lW8vjkvI>Hof z*9(=`fm0cJdKffK3djM$%7l-#v+r?N-6^5DTY8&r3dGd zoj7rNEXwO+uO_T=O1sdoA?I|edGn3t<$wFXdlj@~^y-bhwI3DbtdD5v5qoA3xDNQ; z?sadYE`?i3-+sKj`fT{KIv8{I>K`hjCv;DC-t;GOSz@;10A7!tfsG5cvCugzxe7`#*t3>+xO+t>Ft z00@5$BC{9?wz2ZFXGZ-NS#>@s@)HHh&$<#UuIrzuX*XTsYGcM~DzH_4rL25$pY}Z~ z3k>*&|4m_^SXuf^`wRV9F@ngG@5Na&mo?q|5C1{)Va+Zf<9D7DL6`o=-kqHspWLz2 zhb^r$P3T_ukzZCkE+|kmSyPsV6r9y0vmLM9kd9PK8{8OVaI{-mvFmj|Uv2U3J};>% z!qR13|H;*{6)$f2Rs9GK`qVChvh2*X%Q3chF5B zft}rEmMR6`1rDQ?@!@nId8GOH@*wp~Uh4p4NN-+JNES}6wd@y)?8ju{wcz_FXFmZ4LPB`CC~jFGozIiRP_GMArZ>+D3a%t3KE-qJ;zbhi?0~OJhFI*EDOo(tNcOz+jAvfn*)u7-J0Apx zvfl6g*&+AX4aIqtiw%=6oV~1GsAOZH5u07~?wfX92mdSn(Z?sHwbkaoJ)L_wQ{iNF zi&MM(qB&oa*M?uP=wH)LV^_f^di1U3FJzAUW6Nzrgg_l0R=LpsQR6o+iRm9;83 z!oE;3BwOgtsL1a97Xv1HmZntGnRF=jCs3T=mBv~Wb8K-)D(=*!%e_wm_IV|1*|OKj z=&=Ygs%(#61{NjG*lAs%NKHAnv$7YEW z9j4n{bNfEQ$YxQ;y(hJ70{T176-SEAvZkz@Y4>eN-G1TKmUwy9@pCK-tijJtEoHy@ zEE3pIwalG6x8)t31u9kHW$T^Oc&99~(K;w$$BG z{QY~%AYUZ3yabSN{FF+U+V-+AmEQpTAG^Q!`C_wxasl$$+2Y6B^NIXh=L=uwtG*I1 zj@j%e8k=SBdT!nGa7T%5)~Xt(OOtf?DCXIG@qwj(7Q)5gPXjU$>kl6u0AoU(V87PR zLkr9~T1fFERMdauk%WYVk>ggHajPKrguWYB|LS#L6nffNJzHi!_F@)tTmpmQ5eqTWA zX&I%bv%c(aJ6|0?Y3XUT&tjRQ+p6u{pB$v|0D=ycc{mdd9ablHiu(@eSm|B$Ika+NenRAl2|vDed6Mwp;+%z6 zsah<6>i6L7a1AfnW_c}@IN5UPfh@hO;gv%q3;Mb2#R~>+I0}ms$5n^o6*$_8ZsmPy zfUjgkH9-V8asFpyAqs3#nZ8xLs^`Z%>zV6=?8Xmm=ZEW$>;Z1+MRa4#`G8n2U%cql z={fUGx79%+X?7J@j!}PyiJ^lvZQJ<;n~0y5UGFg4ecS@~Fa_c)501QEjCyHC?L$x# z9#SEfffd#?d@y>vwNnq8ucV^yRV$^!60?A#hS=}}OI~<`pP^V9sXG{A7;sJi6{dIn zSrVi!q-$5g6d6Q?rrQ*NF`s8o9X*anK~4AK9$(w@_dlK3vc;n;^i#prwY{9rJGXZB zSJ0A~cXG>R^-zV;@;yWgDy=F9IGk?QYWD}Z8u)?WKcLFUx7Rc;@-gVy^H^gFG7Buu z&dzc8E`yRx+W9FeDz?bJBo8fixBJ&)$XO?hAAjAm?M?kW3MEx^BO*#JaO>&qseX_RlZKjxWT(SxzMuSVB5D~6u~=*nWyIFTMrHM}TKl~W zgG5<^&%VAsu0R>A{SHtrva@>wx9ld;u;ny|FHp_SF2U4w5sczFC0SXVk@1Z@=+6~A;%Ei5+I z-fGGzjK$;YN(TUVQ|5KfDkOUjqZ{R^v)i;fpwJ?a z)Ztd{^(}vq$b=3*mYn>P0WiNBPL!wA&hi@WN9+a?{e|ZjcPuH?j2XV=-^kLd>SGJH z-FVrxZ_wGNJcQU~(_L$@yq=2-&xbMI1Uaf3IShV3Wyy5)(PS_${O&x!HFS6PXEtK- zJ!84&B3=DOpH7=D9Gs|;cC0Kd^hWc~7t>Jo46b@aJ>zwPq9LVst&h(>UrwR(w01xI zN4{?ArFP80+0pU-2X9oCf=B?d6;A_ExpPE9{+h5Z$gGRY|0o^2gc!L2CFs{MK_RB( z*8xX=cuQti*1?vQZ3J*JHTCF8VnOoXW_>dyO-n5urw$=AGMpvL%adka} zHtA5Y6QUE*nRCkFLFxmiv!4y)HD7|vI8`kZX|g?+Hw{_U) zW>IcI{2}pW@%*fe$A?=~oE1I9%F#NVrgtZGgL%4Z?1kea=dc5blMJneU=}LMe`P>q z6uT(th3(Iuzt(MnQRjb9sltNR{!7w#c8SeHp^Ux))y25hzkiVxU^5ZI@o12UqoMq8 zy*85T&81nBlH|v=Olq}*#N@ySr0TvY8JjM%3@rMt-MgcIe2Ti`k#+vdge$V1(j%Tu z8J$Xci~C529qrqC@`~(~`P~g{x==HSWbZ!z=rc2X#6Wd7+)(g_>u!`{oQwCg#r<0UUco6^IK zw!kUSB#V6`_OZ_FZ!CnFaLakM-+gq2f;Qh+7P-Ye1EM4y>BTl z?o_jZfaeZ<%04Vn-Y**OzR%0E<p+3X3!a3ulLJIRffx z@ofI2vB|HwoY2F(@_eC#^S;;~H0T%>_iF$c_v%MOJN3|6`=z6Tnq!5^u&tA_v=djo z4N}bdBQacPwXF1dILc%$(X5+}pQ&r2oRfXSdK2IwY#~Y12_=$Oo1-kO+DNqU`N@fI zFNnP?dkkqiMP>*u%O;TP*S*MTb@QG5QNZR&>-#7-C>HF0=nS>|DEmQ{l}l z<9CA$KPtPl%bWgp+Pk>}l%~s*SU{}`3EWo9!Mf;iRBPnVGRf8Nz8DxH`n3mqy3q;aA5?WN=$9c-wxV=2MMVvS*hD_ntm@yF!N< ztwjS|sxGU)PQ0s=h55<(%CCY?4f9-Gmu}vG`yI&+5D;4C*@0ewLV}C1d0hd+266-! z=U4Wdt^n)^u39>8bOQT^+l4I+n<6*!?!2CH)^5MP#828~t27x#5(cE=#Dg}A6(fcZ zuP)DMqBQZ+`uh3BZrQoRX%yw2n_XBJ&8hdK-o7wt#WdP6reU`4<(fsr5cF3|%Us=c zbxL;6phWg!2Dx3KU*T`yoF-ZNs?IKj3+K+IdsWFu0WmHa6|wv#JLK7g*t?2PjlNEjkE&?=O{?c2NGH|*NCs^S{r4wE567PYP*v@H75 zYBz2QtdWctVB3ucXQsqA(h}?{NEh6ytY61O^Y%=omnB(xlkDwBZuoh2Y`w$o3*s7! zR->fOHzv*5x2pXniQ?HA@sqnI>&7PLpgAmgbMo}Gg!#3hu%(b*RH)46x9xGFzkcUk zWAOahvqh7_S)(0cdas^0Bq2DMH(_w$v6nr11`VV&u$j#JJ7ncs@`){qzJ=Spr7Pqu zw?GxbPGl?1*+a~s_YWQJVr86kv%D#x)_#ICB1=t_H&3ZuDGi$J(Hk!7i(N4jiV;Ul zz8xKJKB@bpT$B0zGA||jBb}@7JQ1<_iZulJW>kzz*wk18s&Q|N3+t+;!m2U3zxZxr z|GJfb3NIKt{PptQ!&=oZc{wRPDZTc^{o2FBjkh(xjuNYwJ!Ur!pe$Z0cHdR9^;1pF zZQd4CI;_+r3T$ndN5?M~vK6 zk3YIR|CVwkDB6sYCe73Jrw`AY*+D+^WL!|-uEG6)Q6W%r)~HYw87oY!Z>8Ldr(evT zAOQLN;9+fk8+iwz7buW-ks`ATb@WD~k4p&|hqdds>Tsay(?a*akGnxY>t|jtt?A;S zC`q0M%w*m2ejm+^QJ?{8E+lR@7MOq4R2*hz77x*h+yRe%+~(r?${+su+gdqb&Ypd| zzI_oo1$5ek(ZfJo(`nx`NJqHk-O&&73rMVk<8oR1)q7w}!R@HGOt~Dqxh;R*h3Iu2 z>TIAdH$vvVq(h?WXO%-U3P0O4;D3FbU~O$-;Yh1D)a>PDFQ>=r2F7t*p1XW``K`P% zBy29JYX&yFKyLQr`zI}Sbe%9%>0w!iRQPS15l5|H5&%p>@WOa++V*=2yDP~ET^1uY zuK3kA!mNMUxs&04<1$wcotXAwwB>Pcn!+QwAM1boIKcAk>Uqn91Lr~cf)~zw=nBlt zj$z;#`>C2qPNC+W5BK!Md%?M2H+k|BMkuBB%&nm>k-TvWhDqt0H8bBkoWsAv)@GT7 zSyHj>YOX{rU(m|XcDye&YGHySGKfH z4jA8<<~nF*?KgZZGFv4RliXxEy-v$(BqbdZF!S@LqqPmjCU>7X`3XHlad9kc(OmK~ z@I&n0J>^73?RA-i$TwSJx5Ujls+B17M0S4GvX%+G59XJZ-GuGe+gNu8bkN7!o70~_ zu6=v=ZbtDlJY(y`LG0wZc8&b?8h`eo4gb3Ftli zi};4*`iA{JkCs`9j&EXh$c5Z5?55y=_{8ir0NEJB7(!wfn4-PDjsY7s0Cw`wAsO$t zWMlO+MEPVWyslUY_=kIIZ1QAqE!OtL=IK~?#KjECb=*V$%>XIFlH*c7^Qz~9@E-j> zX@${(Sk^_o{yxRfc=@trzW`4j+`ms|WHrI|3??+m36^V*kNh>{{TTVOF5?47oR$%y zm2yA6ZD@gar4f6CI1)g6*rwm>f>ru=Rz}tNlMwMAXVzLC5_+D*#5#I00g2^{&0N7Y z7P^sDbe_b!O*zcU`9Xm>Z_CBr-K?h0UeDXc7+vHdV4U}TgpxfMk5}HQ;ts56?ZrxU}X7NnFaakKjXQG>Uv#F_^DG#8e zw5}}<1$9+jwv}P6$AERBS+i|53QvarStW^Sv$2`GjxP!Po2%90H{Rpten-SsQ>JwA z31keKK7CS)94-PO#U9!Hkl4v#y=lD>ynx{WCO_J6rR&&GW1-&}=uP`Bq@2aYnXJ+b z&6kt8Lk}%}>e*3r^Oi=B0S!r81( zF)`gOJocCs(oULQ5d@mcNRlMdAWBL~iI5}-r8JPpkWeW?iG)x@q?9p;k?fCyqxb^J*YZPE$=imXdFcGmv`<6HYgC7 zJOs$8Ss-oueWsJ6b`n!I_KF@;QSOq?*apf9r{i<@s@&ogi6w1X8f_->)`0=J2XW-( zFTl2nU*z)~vNEPdxYJ!w?Qf+yd)6#DQH_k&B>ko%rHfS#jEDzcKE<(Y5uxFan1Qc6Q$*2iN&CzwUK> z<^F2Yj6J)&wlkw4KVDRwIt026Tsj&kaGB3X!Z*PE_LWKsfXYBkTY6$Di;ejQrn0kt z6n|~jk2`dT^)L5F&B8FtZ~65(#6(&pM<*x9%L>ZMuq^AS-f9j=AGm(>-(x0FeWq~N zMU2=`OcZ|{oxwa{H7+`IIam-7BpCt&Q^Bkhdm%2nUh(%E=k)q49kbBE>Yll)eZ<=0 z3aWRj%x9PzDkjl9xCx)5B%fg0_%UTTSZGX{zLNDjU!x$NLjs>WU>$zxqKMtQPfcxI z+gy{If%*eA8Bk1hRJeSSrcir~fcHQQS~vDMa;ePLwlrzNEKd%SFSnYEoqOu^j_-A` zzrP%|nDi>Y{Fa8wKQCY2tTSC=@=rzVsm2!BQxiwjJ}EDEe$?BKD9VHkB5SXlhF<$^ zlHe)O1PVNc7dsYh{@QQX?ays(N4SO*# zBE+v6d9Yl|YJ_m>G6lgLY)Li+>{Oe$+d0fqBPV?%Xz)n)-?xin6iyrw`yzHAPNnB# zNuUgm@nLrjy`7fnX;xa+x&C91qXZDf;U0I{gO2ycQz-%nLL#mKd}P8(^5fCK z;O2Or0Etv?1tp!|ctoL9_Rgx86>CF%+@rfQc#-O<98K8DGoAzghNycxmf?^&=r@?q zUS-3i>KFm#0v>?CDtxe*J~O@fSr4KTufF{^Vg4o!r)@{3wt|u!^n2bnZ5bHzn>Rxg zWsj~O9u}>%pC;{62)2>6ONfBjrUC94Ak( zD(FRZ4gb$~+T*cwr50`%ZxtjZdGI4kPn;pTO&Dyy@lDmA6$iQ!Kf(iTSbIf8=W9Z% z%x8FNo($WXU|czVD`Y>ug0GM9Hj4{LbVUEF2|Y%37YO?MfFX;%<{i! z*%g)CM}TO6z3`MqwAeCv@cw((bqry(DCxT?Li|feC?HkhQ-Hbyo6=TLQo*{`X~_No zqph!;ntAv3?bG!cUT7rXEh(DMW#GaC1rbcEPyM}p#|{pd+QeX@!QJ(GVe)4Lwut@$ zmdg-_#pq)aoBQ0KuA_MO&YjRhd8Va>q8Ha9Cp8Xx)Y~DrtXt9{aI?9;6kuY*QO-KC z6{%0e^n5hl*{U;V7HZYb|1JA{xKqlgf{Af}&NI{ARAp)m*?Q{*%n{JP2Q55{0L-b( z%-kLb;(aXp&KDiO00SGf-RD@u(|^E0?aUX5eH3p$yYrf5_A}G3L*-N3r|+)8CuqyN zgdkdt?t(0jOD2)*o1%ohJBY8MT5kZ`yh`6ZdGg5%{ ze)_q{E71?kC|!1{IRmMH;9dE0I69YMfphj<>4I-21wW1YDN8n_87U`qr)|Xk?&x#$kBH@g6`~>{ zMvWS^*mRU31P~eBS6S+A7q9=J1l5cw@Be*|RT7xnh`>DzD{U`nsbUtm)|!0ur1u3L050@V%28gI11qOpTOoqC7XWCTEi<8P(-y8qz8xoZ^# zv+dkpU0?HN=Z+n>QK72KODq2DTb%UR-U)*;*~Ez3^`j2fLPc?I+fsEAY$4^HA2aV` z3$AN~>BtOyCGA}z*nF{=l|V*0a(U_F4K&n@ocY`&C7_eQ#`?$a>-83o+H6ocqpS1b zR-YcGgaoy*{)++O!Q?(#4;?(Twx7*Rg;vgA`cWNfwDIHTZ+w%tvZ|HaVLNB428}AE zZm-3pIw3H6KD|!01y&M&HGMNR&sBZ-c&rExBqkcP?v+&+D^6;EDSPYp?!#$5S5?%- zZCsuPSoPI|N?wm8rNPL<@uWbewxJK-L5C77Kqvvq2W-T3Q~dUI$BBa z#UR%$7#T#5?R&3WVbuNS0I^dybvst^Y|kz6#nNrIjoI>nkBA@uXEoQBEz`Y!uNbd* zsW|_+^7_;BgFaN+nZ%Dli=4?m53_KOm#+kI#hW)`zj?t#>6i=A6<9hFII7-Hp^U&_ z@oM5niH z@-3S3Y)+nM&bDoniTd+;T3bGl4T7g}S;AZ9l2*O2b&-q^IXo;$o&tqY=mAoW~w2-_b!NitA_T7|4t{5UM4Yco0G-tj&}!!8E$=DI*Wet zT4DEBrw(Xqs(68_atBv$INoHk`NN@#!(Q0NuYt7l`5g>?7JD|r94nX0(&^Q=_0#o^ zsP+_kr1(>(>iI)1m(OQ(qu#^iVzr&!z8~vfhsp0_v}@^>LOBcS{=TWn(64d#@gt2b z^mty?nOzM<^@ZgZTem&j*2A~k6xYU2pI&CnH9(fnfJX#WMet!nIPv)!lhbrp7|KnX zmdbeJztgfw1z9)x%%&Tt^Qh{Ank%Mnbn<19S$gBq(mC`-9OaW z(_c26sVM8Vk2vobVYO`8&>Zdaz$KF!%g(|M`t)gk-lE8eFY<^XqmCy2bp82(#=Z_-KfyjCTwu{H9R)LNjvBA058w229M=nFi<#hM};Q^2Eeiw zY_E&fJCxloDe1G@3SPAHxEUIkJj2KDxc6q<*s(g^ZCvCrE_O%sDH+<^+C~xGX$h%3 zzI;KQf@_PQ;)jn`$YCfk7v?@L{Z|uwtX#}p{}q&6JLlYCfX4`ERa1MSfKYV*c zErLY&a355A_U=8mIr%}&X{J6-8j77vR=%>@x{xv_t)D*Qug!^C$=#?X=B!_T8QP!I z%KgPn_*0Oxs;9w>@cHC-WrwC|p24$yVHaRx?782FQ8!)e*3QPmzPpC>N!LE@>UPk7 zmr>U{oAOo8MXO%kD67@c*T-#(Uu>(|s%k^6#ghS!`vLaSwqe46yQ_h@PEYTkDW#hf zb~SkfTY`Qwox`8pX6MG)5)C5n!d~kAHgpS+G){}|JyX%e#k#k$*mX(AZSyTu+GNkh zY;sL9;im~M@9==PLY{ljCneo>#*94{>Y%2AjQ?nvX_?9xUspC{@j$x1p5MxY{K)TK z?Q@%z$4{A(xXc@Z`wtq7AR&a86(o#T2>Ao??Ydxe42CMu%C7MvYn6`lci0%DUX?=jv=XOsFRPZrkyDN#R1VrI$kXw8Yo!zmcr4Q6}7S z>((xSQra%Cv9Bblz-#d!jTm2yr?tm9ipL)rwzPY(J$uwo zy(u=4j`QY~e90bQ?B#H}$bPpoKr8uE^aX`57_`;G!P|ETJglfF-(8lj9H-G(;(uKo z=N8#H>wdkz4%0%-7@G`*Rz4D~-MNB{)YSfi2I<*E15M-3x$^&j$ks3ygv~=g zI=D}t+20=npa4w%4?dZ{O+||1l1}!O;u)-lgAde^eCx zV%+EoGz1X8)4pZdXvxaS2@8W@wuB9NaD1Fo-C^}Vd1;=SgFEKyN+>!;JX2_MxHH!3 z8iEDE)t-TC7bX&Ha(!9hE!eW$_IPh6BP~4^_}A&YB^`s><}WcGAJ!a>iwkJ3XaYul z@PgzN`DtD-mo&v~fsSlPF3UXA($km3duysf^6`44E&`09KK+l&q{WD;Jc;52;s#eB zV}6iHuR!L7rKK}a?+S9mrH>_T&6dBh_8(iiaN-q3+Vi`2&kH-03wb|nJbO#d1H-gzf;$1P|{a$MCx3p{q3D0d`yPDGt3t=J_LRFl`@!>R)4{plY7iQN3x|@U_QJB z(l@_tVYbKA9Q%^8GMB}oUPyjXg}BU_GsCr4Vnh`j0SuP8;~ea4rejtymtK#M*KkW> zcWHGkhw#CAJ^gJqS{_>xoeSI@d#k<9IRENx_fUn_2FM>kFh00)J>O=tCrx{)pI_N} zb^Wl*{rp)Ww`A=#Kw|exUb9<1b8z+lCwuQTS{=BTHI*Wt{`=!uu&r;+fMW%-zvbGH zjmnT3s{Ij678sI!7#YXxa)6Pi4OXPgMF+~U9F=L_dJ~hWcmcx3fD=W|c;Y(&1dpPG zjNuR1o})cexTYAbPE3o!o|Y*V%Z)mBs}780--f;oN~1T~zG z31lqj9AuS^x321_5g!&RKBI4+a>4flaG)oRErtDq$Q@x> z3$7SpwYU6(z0(a8$)t+m%`NBGx7?~{E~#d&SK?H9RD6FaQ}~Dc<&4?M`cG1PIt5V@ zX@k$oa@CrSe|Gl{cyxDp2`t%eJ&weGNsJaf zI(MV&!S@y9a2+=nd+P~2Ne~tKiLBO`W%mzp))Vg^T$9s8CjzDy@~Tj5x>+t?vAEc# zdKf(}J8xdFh^k?HKkNO2^`9>g7TDR@*tlL<+en~+oy)2Wb8w$DYgW~+d~uEQ+jX<+ z*UhU{lUTvV(yZIHyiLJD3>@w6e8uhBtAD%QkuH`h6-~XA-c71aq@ZZ1sL{*z$fzY; zexnKOlddCz^iT9R7(RR)^dkg9o;_O=J)h|nU+>aA2uBUS{)G$ccyJ#o`wqFtX!H{h zE@uF`!qI&m;9#LMO6AKf*?|mb%7}^b0o10)KVPywBZM5Mkra3}=-%_BLx7E!UWI#A zT1$a^xyJdQ|M21b&C9I6Sv7FL0A#nF@vCpdw3H3S7zVpBJ{KA6u-5aDH(_C2+@vvM z+O&6^7B2cc|>X*fo#Yw+co|N$uiY)A&-Pz#b@BkfvvDzJ(F-@UDk-o29JQnD&-P95JZi zd%EIqO`Dw4ck8ZYe;;g8W_8-|@!8#mmD<)$A$r-vj#-^PtEJ?7R%6Co3o{+};DW24 z)P8L+m{hu^wxw?2(T9sJT+17;vG!xxzd^%>@2+X{>?<3de*L)Yv+8PrnI(7wRAwRu zbNV0w;Y$fa*#QGKwl<7=x+^uU_+_AM-&XgteNbvUA5?d^^`JRZIrRJF&R}K6+K4BzyL8B zR5RDQSqB+=Zdd;gGaTMDH9a!!{1ht{yPO(X^i?eF855s5+3wxbLBne2BMW6)<=Kpk zO}|?5#(%ZkW+7m}YFmEPQ-0!=KvkV0{k((NhyJ?XBIjkfU5ILns`5!PWKfxbfpht6FNav~{|c0yeCj16_txkE*Y`#j$qPJ4CI8J0Q($ zFqC1NG##P^3aw6&-GTffaHx@+t*)A8$#13h!v z-W&*dCfX^I6oq%Fd>$q~+lS&3YJXXAvBO_yI<5mR#(zc@9oywAIT`#o5oi~5X%H?^ z%ufU;TwsFmh4+{!8;)`)y7LZr_oC}LsI&d{dOz((r3U`U?s-C_?Y-^tNun+3RyJ=A z#>L@MM1S22+@Z*rh5Gx-%z>3xb*CWbVZkF6l82f69T9qdEGAP7!4x`-oh&L2(eyMux9Gcaq&GVd@ z-NWFT!`nk(fGmXZ-Vd)x+Xat@Hks)+nmIxiwKe zg7K`J)DQKI@{*sirw|pkuW!tB%WWpuX-FS8OP&ABS7;CfZc2c9f<;!Hun^2lzGa)t z_qSx%L-Fw={#;H<(!}?*Qw-o2@I}SY!wOSPn9sZuUS5#Pv}*IfU(a5Wbb*UmwHGze zH0$I^i>n3jC`hRccKy~bUw!I!*fkri8kh->?`yWDX!)ov?&)Cd9e!$jQUp&o} z_N`d8Dyn+D>LtQHmg9!1Q{OGVm9X}R|6xsON}L-9Hruj{hiHl!nvZ3(Uf|69|E*~{ zu!yo2Va06#AD&KWsji{n?0>(jp*<9No$q^#a5d@2D>hy%mR@|zeWA6;qN&z-Nb{`l zfVz{DcOVFX3`OaJBYFGOR%#)#vTt@w*>bWT{1ChyHeOsbOWtZ%_4;n$^ui`mO76JC zD|Q$$a5eZ^;G}e0PGwVb=d&4%g9D)B?L9o}x|Pl8`YASH#?JwlFI-P>gET7^O6R-e z=uTlgdQ?s<4TP(T2SN)qB}Jmi*r+~A%~!|jtzpUWl&EU~O$SmQ#xaXmexh;deqG&- zbLaFJL8A*XGHM4dp*TDIF8tz%T8a~#R>VbZ2d=v24(<%ucS|;CaA2yX*(dA^gmLWG zuiZkiF=(_OyY=sHCBIq;adE5#DPAx8R==*V*Z9>acAkLb1pbtiZysU zS|NF-q2yvQWAO;FvChY%55%ftfDiJ`nZ<>mx2&v3PBjGU8Cm~O$;OXe^O^~8$!Zw9 zzoF+{NK*GZ_nY6daLzNvinR#`NMjO(VVI5;N2D~e z1?Wj@bQ3BByQzor!1e@(cY>Y`M#&i&!cOnNz-4Ai`j4UM#m56V0LRbMt0W17@ZIcu zJ22&qWoda;RqviX1sxnroBRd)7U}Pj2`Y^lV5@4Mj~P)|SQv&Bqg5juX?AV}NE>Ue z=y|E?uDj2%m&Ow>pO~Rp9@0?J9oJLE%R8pM7hES^URjsge122?t!@NIjKFA(ac&}9 z1EaBTSX)aAiE{vTp`h;%MPr08(}%Vkjt&-T2X55fy$geWVtViSP;pIRGyVJ-yl>&- zGjo`{uzpWVVLGnuPqNj+6vJeK!ihUi1TdAo z3=W*BcQH2S){B3itvYU+_2@wF&bZ7S)0Ed{oO(Y&I(HdbW!)`@vv5;wdxhC4TiR!F zNwIIG56$y?o^t+t7xe&$%nI}kWiNe+&n1m(F=R3D&Nu`YEMtY!>Ol!Jt}sHD+Z7uZ zC+r&(UhLGxyx4tT+Ulq5wkn6mt+zV0loP`iSjrS)2Zi9K=)jTu4XbY$qCwEsUV)o% z&u-z0_m<}f=m0|*uX&9|o%Kq6TNO1&AGvzee}6>8`?>-?$Mf8!%O*~iCo+u>`O(G{ zurNTcf-k8ms*_n+{ZuS>UyW?g10xNy&z-;fjhJ((^~|i;A3uJ8v_&v8xA_9X&0k_V zbZB@jgW{(l$=0$NNqwHc~*D=H4#vf(35O0ncY?g;@BNd zO>BEFX(DNq#~vR)KYqGkBgHKHthsLT1#&vh8j(#pXXipEREoqV>dTi4(?%~V?wNAw zaNI};NrJ=}6y>N~7HxQgM$r|%;vd1iI%NP$hkX+;6UD&x?AfT z)eum#T^|JKx!r;~h6BBp0&WhYRC`#SeIj&dJL@|-X?;bHh|I$CU=%|M3=@k-DtuM0 zuBZ@S+yV*X4^Ckt*-8Xwql&M9!^+X9@Zg4;6$@5R)^}ey93iL~;G=os!vOU!ti~CO zi5Hty;h59%0FeX7GG?$_*|=%VnrsK1&-^+Ta}@ zscgFZ!4Zmi+;zejxU2TiA5}j~Dq%)`q*W5g%BW`Kq{+1UfkL-J!| zV_9hf=%Vv+G=j@(=!$4c*vE}JhB5)w(x3?&+ISt#?&4-g{oh>}du`gsl(uHK$n>yH zJIhyC*qBrJyQHS zV6JcZ6U+}e5*2QJ#6NY%tf95^65p|&NjbeZlv90UA68kf5f;djD&*uKXGI)%=mh`Z z=eL$k+}hgO1tNKANd|(#IuiaU+5w{5>c$<~G4A^tY}(EFxC0*86AXp@aId`ewYJew*Izsj~dNN%M;ebx|w&t*%NtU*5v8kQn4 zJDdT*-MiNCruz2nD+C~jR62^yFjyGktM+K2WhzO%e3qTyW(h~I+_7Z`!-Q!FY>9m9 zKUD71J9~WeiYW2vBL?s1flm7yd9cgnQ&>S?kG)eC)!dVKB_1J?+;ifTqG-iP&7EX7 ze`W;%K~`%50}pP|m)H57krYL;#!`duM7<+qak^hp6X1NxnI$>;VaDBsQeGLxVQ&!~ z@BXs8FBgKZzeq*yns$SzHu)E?m~A>9wt7vNelp1WBWtLH+C3nt$BxE41n< zMGi{X^T%H2&hngJUq48#RuGrg*ca+OKFoLu^()(8PMumpStr~wc68GwDn<5FRxTz_ zgxlr|gqLqi05sX}t3L*Z^090&!Lmq~ZL%2|pbM(*vy(0(oLhP)qL1ygQ)bT!6XZNw z4?I}vW18*CFwZ;Xw8Kgur??ktDdF6?;USrnm8BiM_zUO+fkT1C1!jp+&A*U^vB26l zXq+%um@pWZG{O1$VpkqCt>bZnesnuIy?$|Sf|2{Owf+lqJr)86q}E+C8!>jQtJ~zK z6FRe0i)WVk=wecgLws2cgr#?G#vv?Q}S zPOOmMnm>GiEe|JwR(1S@v8;hDIt0EFy9fy-z#rE})jZ_LPo3HGfd%JeEhq_4)SWu4 z_OoiJ+tnw9f2g_`webil@%E#&#oG1;UjwnX-2UD&GHU_?lAD{k5L9*pCk9`Fj6wRG z-@kihMTH>JK^`QSZ&5@tR+>FqV3#AvI)oQKfnS(l6-}73U7ddYKy>ykshnmth0hTpPK%_0n6`u#lqx==G#hz$~QlwI3J-DNeNF!Bisj8>|yfi ze`Uee|4JfVxE|`$CJk`>ARB~(n$mnUW0R*ZK05`J!P89A<@Oq3^7g!H9rTC63{5>I@-?8si3`-3C|~v zRDCsw72n4y)ozIUi+hc04I8&n*f0Ejp z^7bGWcPvcgD#VTxYNMQ-oXNYxHhs{4W<7lwUN%SMCZAy+)ri{cGd*(yQqR~j0i18Y z#adM%vPh^N(Ap6Vfz5`$fE6|h)6tE?5_IAHmi~J=XqHmpLy<{b!l$nM-VW0q9_<&~ zqisRd?PUFB4F(Uliuv1RACXUTr6ge`eQ4mUQiz*v-@Xl#wmh-i!)6PWrc~&&XRaUj z?~nd@o2I0BB<>fdPW=P#FEUbHd2(IXl1T%6FzhikF#(l8>`}b#I`Ce{If0k;p}P@P zr1Q?RonSj9uOIa`|FM|31((Tp%yYOOtf+?SPEB_Nzch~(mAQYF;XYcPdQ?&2{J$n= zPpfl&$A$^qqmzj@>nKt^dQ^NP$?+B7iOq7+Z5XDd{!wiCT`E%clVsX^DxBZhKwSLloVW zm_bRgeEG1>T;#O?3-bp>AD*^RZi*A*h^@GamZd)CDa(uQc&zC#dQRK$rTM8K&Cqw8 z%Pm#+bQxHezh($+Wb@glbNK;2KIsVwsyD7V3izX`X%!`eQ*3I&5+9$^0BIG$Mi6vH zVfW4z^H+*(>E0&se%5TMBSxaNo=cCL?OU$jU0(b+YcSM*Eph5+G10;(bo#V+A!5;I zmuEJ|{QI1VCma1fEIVwoMRGC`6HT;=vhw?y2z58A2G+b_ycE83=S5e&l-rY~b9+$f zrsWc2xnm6Dn3mI8a?A%e^sX!_>Xy?|v1i{t)~Bn@T^_3!B7A%+miw77iW$CFZ`e|I#VkX$MP-p<&0-%#6`q&Yt;spRNUTEq%jy+-efkuR5batoTVEtf6J@Xc zetdF-435I^_qP6M)3|)X$(ALz@LDi1!Nq5L?lZ-;K|v2oOM`!Y8BX2ixI*avHsce` zP?iTnN{BxakgwUlWCX_9&XyS3CRmJMCYPqK0d*Cws~LeBwYUn z1}wh3-%(g)e=W%1V7Ae{s;VH^Nr1I}H)eHCf>ixK7>|Mv9}mtZ?0Z+Ynu}{zGaZOb z-0KSWc`VZW?_>e7~}DJo3V;Ou>GetMrr1FTX?%#+zJEh9r;PO?@Z z9kax2detzs_q2ECKn%7pX7g+1ZLjXA*AZEmTbPHA;6WOMPIyw?Df%qxE#@=7rBv*F z-R=wC6&~AHnpkLs_O)0fniTqWtDmdLMbtgBwBv)Af|!RW-MhDvMkB;6%5TQtDH4yJ zaa;Ib3D3FU=eN{1HEqPmks2vIU3c8OeTyen`pAQWVdwb z5E1ojtVe}2#3SIIJ9AdMo#(5-L4ro&*ZP9OMC$xjnKtdhg`rPGy+s#AK7Uu|tTngj zQ|J`h!FuSwJ|mvX5v-dZEwKBsbwuqMS+SAgAG_s?+6*kjEc%MZnOx~35;cp~iY1B7 z68k8TzpZ+G@^lObj>=8m5o6Np+3i?2FdR~@!fq}0x(aYo3qzT(ia1w2$p2EIkczms z3_ijJ^{B3Uw<1{?Tq!nIBEddiB9v8ATrm)Zl5H8VRVEOeX;qV@{I95VRqeT5AJS1~ zDsZ}v-{VeU?S#1W+U3jNc)H9B1R^@(R>om*z2Ab5aKzd^RO$bE+w44I-FEe2-{Ieu zpIPAK)K`Q@hmoo@mij&*9+Ph@(#Q-VAu{#C7xsJ+IJo`BYqNLrbS~C~-0!Y_%_%}m zvb~#zWJGu6p)ddWQgU$Ijf1_T#nn}>+x>m993N7zsgYZfb4Jx?^@RHeM}{}f4BYzf z&e*e4s4H3h6}4}lD)LRG5C=<}5%u#2Tl(m-X*MfM5QyV*&yk-2-~@idB`zrV`9S?i zcZzC)45PL^PkVH1xDG}*^QJ&WjQ{lXORh8>C6d+l70;&wa{Z6Q|%3CdcpR$|PBm2m`H*3ZYA~qEDh`j1(!ad(iRcC|IelO z2Xwu7vX~ARN+RP3*&9oe)?;=&&djW`s_Kp2fUpWBArLwJ-yqOXHR7_yVdKkQ@3+NG z`xZNUdB8))|6uHPTmA@jMXLSGAU+b}$R#tZi=~w!P1d}=Bk;4}k?l!1b@HT0#PoXj zz8+A6s)A3u>VZla<@R@+&!r9hnGtVRGtD`wN? z(=^_=Vg5EeZK%R-0T%pK^2j2)d#gUHf@l2VCC*55;4K@TLo>*O!(B#>~{`xJMIrXg$<>$9RLC(1^9x0R9G@KaGSi7PNmYSW&cSy*U+SuJ%cqxh7ilnRq$ z5A>IAlDl|a7-s=6(CE2fZ3SS;9u?MMQsrmh_`ZF+xZJKct*u!PHZo1o{1Z%B+puB2 zBd;CcC+$Iri#KtPIhH_LZGZUSy-j{!$ACkNtaXk1WLQ{Ga zV3rJqeeCxZIi%c_^65KHD($Q7xQ(b*@TU>5Ug$?$rm~=1uNRA1@xeW2e!|ey;;5H* zF5i^~GCaM#?!S$8i=BAVprk40q)0qj^% zzU5VKNN`jnlLFq$i_j#=i|DZ1v4qUcTO2X+sc40m^RtPAFN!V%D>NlDiMw32y?5Xq z*5`_7qTg5=`p{=w$YaBwXHcG(Rd|=a4R14M=&yOnq8+t5d)+q6oZ>&E&%zW(r5H0In{! zH5kNQzkPa8XG7w-3l@st`G^sovO{;xn%S=!p<2l9&)jD-u3lpY^~+`B z(ZXz3oQAxVBArIVn@a%7JXR=$9}5f=-e4d}hly<_g<(%6><-ed)U#iFt^;^x1;rD(UCWX-VIz ztv!CLQ92^Io6L7X%jmT_Tz)u~f^e=@7QDdV`exUk)scD=T4sp;_GmkBxx-Zacy}G| zO{wW!OZzxNhjN;E%>S@}qzZR_A)iiWyZYRcAz>9#TmH4O*#}dA$<2lwDBbB?aLf)}2v$5tYCmc`5G#Wi~*}0Z` zMee6%GupFU-ZGtmeOQI`xE4sHlKq<1|>omvy3OUWk-e!#d+`m%KQy>$=u&sO!6ZlxyZwiS{g4GND7)b}K zQOGQUM>kB6_tMi3UbvND?iqeR!#en&T_qtvEjE`lmL2J}VKcGUrz@=7aFce6@v+kAP9OKQAvY5e1;*VJjPb z;$KC@qlsFR-`QL%eHEuziq=6)wEo~^n@piu4V(>n5);F=rW)UK+v0>~+TGo6)vB!K zqsz@g^;Ul>KhtAq!3C69EgwJ9mb?8{VlZ{}>p!?DL9RLRb3#Hhza>{&>sN_`x#2<2 z6)ObBUFCCNx?@$tZbI+oiu1_H&M0it0IKhIK^?!oH2CF z7;t+1BQ9r^$Hp6a)XP^^lG!PdoYzd~nj+E?A4F1%e%dr_^paUiQd5ox-+0^kY}L{d zecv&gAeR#kkhx8_w^tj#-nZioen%y_>Wqq#-%k>0n3O|BY**?(n^|}XCPsw#z-u=w(WsK2w;Tfz ze%RaCp2c6hR?^|1Bf*rRe78P%#7ExJBNz>ATgW-r+(}4=1&U8LfB2AH_sK%h&{k;C6JH&Dy|KQfhv~bQ zw)10^1`Y5H`DcSum)*pV!2!*+6luteHCJR^a6Lz4d(!bTRDQI$gv7=PgEvM-o<$kh zOT-k4nkKy1Sp2A?g>;&PP{}CaML@3w?W5$HywxeNDD1bm*rlh%H(U2A#B=9UMD1QSZW87RH`{Q39cY@{&G_@9YvOXk9;u-U5fgnK{_&9t#mep55*LaS zy0g?_(9HPb$01TkYlwtXAO|4cH4-}lC|*jMze-+}i!|BUKO&_#}Ox^NPOoW7GzxmII*86D^7thX^xNga@D7_y~ z&*`ECl1-Unam%b@+oVF-PL?K9)%!L3GGi4WPOJZ#?h0cvXY-`@H} zfvYu@FJrcnInl2MMb#t}M*rURUcOvOS$V8?c`|39OTeu-`QR|B^MG{U)__NMy0q=oF3f9=};XF<|v@iCxQmREsD=U&;+%AJ90PySuC zV#hR_S$L?1nm*MkySIs*Uq+Phw1W^ApPYMF+MEIc4Z+CN^zg%XZ|o1a3Cbx`)AQ-+ z!JX|x?bII0Teb^RjR&z&GhJfeD%WVSeM3tD4(s&s`!v%9v(7_@a05VaXZG()&H61| zAh4Rt88ViHw{HV77k!m}>EEv%`x#;HBZk&vp-iM|n4` z$z9#@>J&Yt)Z}E*x7brsR~E!9xEgWxAT|>*Hozd>KIJ|h9_7EESI(@8C!ilYeR_!M zk^nDCNPSC}!IR}ZpZdiQeW$zr{UZ%g1ooe1@}-Nz$8R>yI%5mY_#dNL+0X3>cj?=wz}Wp@>q^A!n}6}WuRb^ z;iPp@-~DP_`#L6x7{W00yE}I|K#mc#ILS~CK`abf{`<8Zu!q5>5)<@PCSJon&@4)&ZmVBcAxrGfcgu(nYa z^vchl0}OC*sZQ8P!QpebA-l(oVf@O+BT~j~S3jgT&ygAR+d4qYw;gkzTivKWu=={9 z3Zk<3Sa*5Hy?iUwuM|;d<`>TwDEF8%F7x!X$um_O6RJpzLcy?*+2Dc&0>v)ER2e0SC=G1|8QyHd#dxlgmSj@Q2D&%f{^#_ zpAE0RxwVV=l=r^WaNK&z*SLLc(v}d>v~yU|&AD_Ok2x;A9S+p8Y*!*L{Z_c~nKM2A z%LQ)%LyyWydhh31#s;bCU*{pxlMx$So^NRlG2e<)3vJ9j#t(R8VORHt0_WYk{z^(? z0F1fE>_c<8d!IS}jew?dF84RNQKLsM&32`At2lHKfl#l3V;nYECf~>6oWcuplK9o+ z%O%;a)c@t%q_j+~OneeR7;SrdTP2BIl#?Qhf^t2EtTSB0e+QBMx^ zYo+B1IKDuPC|r5$gvw3d>Xs0(>{ zHz`~;B^DJ29*4(JW}0q4G0eIH%3V&i!J->l@sBlpVlv(V#vYNA)cB7;t4#kc5Ti~8 zPVeTpkO_dR-ug9b{+SgSpst-#{=(jRPucRs2^-7lRYces;?+3h%`0f>JlC`8y39As z2EPLVp>L$^N`@)T%D4XcD>-@MMoV)q{2^Pgo!mX%2Ng(PW`1dpVN%yR!^_uSfh%~ z3v9rO%|pwUf0*U?gN#86(zuy2zFtm*SrIXZnc*#?9$KkL^USyWcKvo%yWKi(s`bLn z%^Jq4)mie-PdxeuAiktz_rrHf4~K*)3k-ba9n1ix))jc$z46Xp1Qi zn=*Ih_8wO24FL)_p(Aq1?)1`keGIH(iA{ToJgVBhL6Z0?oj$_@J@k>F90kFsAPe|BIGsUSurGR1C%+APk zK)NS0{*0)7+POqj9)LU|5nqfcQ+DiK$~7T^x+p2+U~J2<0{uqG$c3KM46d@N>pSS{ z)eh&=S3u5dF+?A}KL;AJ?X%M0kiXX3NKJKrrtuVwYmi;({CTLl1cMW0t&t5iV z%yJfe?o~0-H8VS=E`2a?^g4h4=+O!3%g$wHvP0URnuzJ($GU>}CjTSaf0kBocK8n~ z{Wzk~^+RyNX+OL-I`0}uO#50t63S!6OgYjegx9vWI|e2lVu(bKXQ5uGW?*Uik5D#a zt}P+L0UT^$76(FPanE9=ZNY&`fH>x2oYRr@ClGVK$(=Rtf-J*F1>iQ-qSC(vP?qrWtiA2 zb|c0cEtAdpJnB9i41zHL6FGpB+oM-67hf->jn{A<`Of>1u)xAsN6tAfMy=9+6~iXy z+j!dvK~^76i9S10)uoxETQ;n_2iOojbgZ;SzbBd3CWckq;iK{%3Az6pGWCPr zDOl%KPN0FHW%>syc=ik>t@$vMot$E!2mDOc^DgsZO7>_?4a_<7#MMaskee3XhXl8) z=YWf=UYIdl1S;eRFQKbjFfy;xkfK9yEoGjBuz^uJ;-qC0j;gP$Wb1tM#G7n6NBDQN$s#%n|CN~R(mfyTPL0QpQz&1+eFhG6 z@gMi1q;@mRIx4rXZEY-Gy1-41yu1lwHOFy&oq%tf#b+DMZ7R;HQdL1}ZDFq-J-@KX3QGS$l<<0pS3c4Z!=)>qrBt3}8|` zrP_r--PjE*v59-IctvzZ#>&X6VgoQK3j{-9&GuV0vp8-2wRyR@MLvT|192It3kjJL zH$>ZJDVhF1rm(Wb-?Aq$TZ}UMNInLHrd~Rd(h(cv+wfvw((x2ye<>09v-R4i@__cM zSIx|tZ_GCprdnh%h@4>2|FPHr%rohI%MRl#EXLazIOd#FW9+bD!+39aE5U_;xbcg4 zGYJv?TPeubB#B=jU9x{n)A|VIjZuBp30UHndl)7aEDvUYtQ!?J8BP#;Fy<_~rCQfe z%ck7Z$L>EaD=%M5HUs>FmCqvqsQ8zz=;1@{M74Ee2N`A5AqRRLPAa)17oB=AFYh~T z0bFD7O9QMdFv1y=p#!a%8+OQG(O>xJ)Yy?xea4rEjc;6G9qL!>Z9V4)L_7#1mRD`+ z?iFG0kD~!87=GB5t5=cjj&{|f7%e7ONQ#R!=0-z(F)-+TVcU4W;)erOV*I6!JNMu5L5wHuLZf_ybW~8;%-gAt9>OnJm+syzcPc+oszkptB{#?{QGY{(2%*O0dw;9tg0BT$A9i#hBpc4K+ zqTU1=%eMXEz73&Ck_Mp>Ng8MnN@%1+p@Eb{2}L3*g=iiPC23GesFb3Rj8BCILIWvO zij>f#6yNXa{eR!rTJKuV`_!ZRzOM5;hQ0T(k7fTX1rtCS)(v7c7$fxFFs(;-#*Twg z10tJwPwZXZWUtU=-6>xTH@uOw4}B7cvj?Gg_+ZuJQBmfn*&P0^P;`XWKtW-KVYQGd zz@q?O)C0O^IuaS{j{cpPe&8Bst&KS!VK-sX|PNpP119hr-IGO7ovORWNp*b?^OfOXs*eP4touxjw5{MN`x+B5H> zvnDPXrZ-(dl`t^MKAsIoG!Xz_`3+JDX z4JNWOId`V`{zOS{+61S?iaK3_{+wIE=_QdFZ{rSkY@idKY&2a$H{TUH&}4+&rk6a$jJ9zA=K4bHteqLB09D-v=iWh3>fmzO6Jb=XBAtem#E!K^?ghp!D0RGp!-* z@SfEfVs380D=}Af@026q08)kiuY|6Klzk>W1rI|eA{qIzcHS>iTe;KV3Qt4G;(TQX z{cf=vf3vUl&70EqV<@1nKi}8SZTVe`_ZBv12y{4gaX~H+<{;Sg^@TGy4MGd+&eFg zR2KHX@`hQMr%!E$g~EM~XI?X-iy(lu7QjI!=unYu0d?U-14vzO^wqbrG&38Yb?h^RAASioBsUF?nFx>_$1`5 z8Dg*^+(v$nm!$ELGZQA9yD+a&bCUkD?Cn!^bi%@{xF7NPs~Fr-l#??mta~Takr=N$ zsQ1ZtOlAOoqGP%~9qomVu0N^vpLR+OwO3c@=3JZr3;<@b%*15Jr0*NSD!dvGx<-3S ze_!5jEenh}>8S91{bE0b7>K^n^nqAiZ@jN4c#8?T~^8qyu(tGKr2RtLy ztCA(7)ge~`?VVl9uGr~{IHx%QIWh_IpQqpHZL*L$0N~attYWO-P5?lg zs)q4?MtRD&jyagQYI+1oVZFOM)55W$yb<-YrN+A!zmF$-KXWlTD_1T67bK~9y92!+@EG*{ z2USo6(kMdTJ{W&*`rlve?YCaXU%hJ4vEcpJUmqtmu;OCok2woxU90%SVIqK+(XpI< zYak4f;wz- zD9vM@Bb3rs<(*O=SWavKx281r#;!ACENz0do!zB()A!I}kR}TaSEJHQ?7SstF(_wK zUkF3bievRqY!WhJ`>sI>1<-~NvNTJu>}(^r-^t7rP>I4G5TdkDK)!_j7ZHBD+aT z8vv^|#A8F@-J(6Rgl5DQK>H_J7sw7B9TVq<)0^3g9D6A`xrXP|CA0GDe+WA3#f#xl z2|Jbp2mT)X$c)!UM6)RwKrN)PLh%+YfNZ#yu+{PMW$RWG&1MW*d4{a&J@ID|t1x+y zk8TfO4Uk~h2cx#`Z*tTkr#$=N&(^qTe78uuWOt%h!w%qny^ZyBV1f+4{?P0$m5oQ@ zZrVGSU%Bv*zm6`cdcN~ZDQ8mC1Z?&u zQkl`BY-}F8aL~;Sv;W6m??Vep*_T}5&hR!aHM8GI3poT-1jh}}^i#_NhOethI`MM7 zO6-QN{E?sJrGoK+b4^iUEN-nM!+vVMhVClimxJy|dMjC_HN7RZ$(JCv!eWNRy%b>$ zvkVt4_z-gY&Yh_@y{Bu^ll^FGS*6!&IShEes{EAaL(SLqX>v`~xenAz?p52J-|(qB zgFhASn`~^3PU+=`cJ*oEhTT)T{sc!!dENHR&g0QZz3^RoDk&6fQ3$j?>3?&>MYcVR z*qvWkT#V9yp}r9BE`lO1^yEq9-oM*&F9c(2iznv6p>}DaBn*1 z$M|C*)wU^_c{VF+P~{h&z=(^zr&c9jQd)S2&iujVSW=>^`u4Jr%g0>C4o|q*)wg0> zskP~f6$0bY&FQ5W-g_)QoU1CoxmyS{7yI$n3C;M<`VxXxt+uhT@fF>~)}K2w#ne4^ z^;RjEy}~Kja)uu23w*>7)8nfGL*LL%VCaVlfDoYgXMC|=aQu&M9>_eXElcQ_V;B<& z5Q1aNDQ266EsxLzC5tC5v9l8lUf&PT)Q<=aP3HVkpdfYxOOZWH>v#%OSzbG_64RXi zqit1-Lsta+^}%$IIUEHS)u$stD58JgiU`uR?=QEIVa_py0nH#m_4`8>5eCpI43Q!K z^jSB^DC=*S$6Z(9kI?eYn=K}~MjK5^8TH5O`mMB+DtfFh|Izg7QgdoNvd)Uv)07g3 z($ADAMeFy*_k<3jdP+>(_h;2^joI_9EH`8upE6M&MmK+?NDyH4%?-Kjt}Ht{%0J#x zgAHcRH!4op1Y9wuKa|;lG0+0{zhXE1ro7gz_P@a}{_imx03?xc;J^vL{I3~bg=CFc z#}AAUb;bhoVrZWnczl`N9hz3mCKBa7^5&b0f z$x*%O7qJ_=Mw?2@rMYotw=4FyC+X=ey(e~MR8{-82DaGE(GUJT4bFs%Z7fG2q)XQCOid2^qT2@5zhOP59w>~7o`4?}km zyS3yc?j9ajZnaISC{Ty@v(f8m}a?P!~Sz`X6FP=mg`@za8k&rcR%m9m-+wFcAV4nI#T)S z{S`-+H7%bd<6FG-RU@BdY6nf?ckf~&3schyxE{>O$o9>{fsvM_dtJaX2o8W0E{qj( zKHwjVvK|wcFby8bI-b*EN}C`)XzK*qj>cz?s;fIe6T+|iZincjJYxLnc3N8f$BzKU zY-0&P^adMx`9>@cEX!-f;>AC4qwFaob6nSh!ObJQ@GDo=eXe6}7)Do5ndNREQ4 zJ;(Ghu4Y;{ao>!D|K=##r1utgh@#A0_d0XwvBoHva5ntaU)|#<@JSzM?vqQKdp0R) zdvlGkUXz2hQip%|-;R&UvLEP2z>@d5M`-f0C|bgGHWc8;!oQxp>4WEFD1+M@KOBmR zQp_FLc}wYl?_T!y95{H;z`On$caaf&vIjd8!nAg6D}VabF2!Z2LN~RoPXcX03izaL ze}3JNKlDR9@TkJ?^Rl8NPk=`5Iwpfy?ATfwqutgzeexOO!T#RHZ8^Jasj|p&z`t1T zjJxv6ltr0@7wUVNUcE3v2;Jc(xP+lil&Nm7rM+V6Y_<%JwaNj>#Cohfu=~E=k%xIl z8lR1}Q?Mk2t){91ElqW=@B)hhd)mKuZ|>I$CQMow!3A2MF=GZOdE$@MT8gA+rKO2e zuhdgpwM{CJ5wv93`jA$jz;HlY*c6~3+2n1tSJqdiN^Cd=4*^^@qQA1f_Z(2~-+64{ zti0v1BK%&2_WWaCTZ)v^1p0yTKflGhdxKVP^!B#)R5SnVIa`L^=Yp>j6#J(|D2>8UZLBD@~_(RYJDfJsOoBcn;F?LJEBqd>kHi0sy z)h5{##RWAPa7V<)MfWbBjf;DRFoAr(y^Sr7uTM94p<^iM5DgL2-EC`UH{M>x4e~rD zU`?l({`#5GYa8~9-aa?I7KqI*>md(pxOn*B!Jd*$A~}g51CeTu z$Ty=lM@7G?A^%X0%G@pCgjMCHutbATx z?v8zRS?aZLqahkvT8IP8basVp6E;4XnXxLux@G?Q(u2HFQiqvRZ&=mmgHlY6vwjAN zEz&T-;RNLTXJ-dTU(hzWy16BClNb*kba-}$SI}w`Re2^H$3$Lw7hc8}z3<&MCLOZn z=!IxMC?Nz)^aYY;Vfl>ILzNxm1|K-!l$j(@1oz)!1fuytrT42>uL`UC2_iArJnMCw zjK!=YpbsEmn~wd)TurRV3~&_2ZMojnSvnIY@I|;xJ=OEzbqgOpR9(?G`uK?xumv=@ zc}F&!NLl~N*2-!;SfuHViy~2LP>zbIvUXzurQy4uZ=<^wihllnt0huXm8e?!OP27{ z$!8Zt6a7m?M+co4dlti!nh68$)=u|bw{G3)2M*dtT|8!&Jna%;#3B*`(&z_av_uD% zy;I$fidS#>&S@b>$IqRpt-Zm^YgqbS!JUZJUBw@)QcVhXx|km*0B^ zPgdmA*V81t3m!e1>E1O!shmjD+3_=5P+Q-;;Yhxn7nvhJ&SKYkP3;_@gsF%I8#F~m zkg~bH;T@V3avA$WgXx1|_Lax}H#o0IF>QDV`#oo^o<3!e2mC1q;e6&{G3h3PllhjT z0KC_ItUpy}cQQXGeC*8eRWF`;ft#V&0;E<2fyW>odNk> zwo{a|T`o<+=qksJroCs+gLHe^_TAl#Yv$j2FPF9oeFPzM-`>3~t*ttfCaum;o&fk3 zH`k%7OjW}!318iPt^A*dMRmCng9bB!AbvPgyY>Lg~8>Z_~22SDKI4Afn(taiz!HOHQ;z~pJu6(ov~ zG$koszx1mvNH+N$#?pHYMa;f_&%J@RDWTXoF(SL+Ud^dm1`O}n5;zwhVK6%`j_N_X zO82PxvN6v=EwuW*y&WSasu#ldw;h{xyu(v&je7ab^cfy2h`!!1?^soZh{N7Hc^UU0|zcYz3 zUQ^SRDy}?f(cHP+M{cM&RDVXZ4CDr^iq+&nao??!(%OFuF3XCY4a$06s=v-m4=Euh zBj@?aZoxfw9b4_L7Qc8gnG=d`Dc9i@Qv9aIX(ASc*xq#CTc0T>nX>L>zg%lYQN6VE zAW=zo>87@;17jp)t5!Pp+Quq5T*3hGZrm|DPv+n$K~jDu6R&!ZLgt6UMQl}EP%zoM z-V**=p~8_Oh<~U&J6(F_B5~LJU$T$4h*Tn`c`}~8pml4;j`!-UfxD*$J~GEm%?INZ z7<2t+2hQ6$XFUta%6U~-*uZQbrPC*Fn0d5Ot5g#>lg}Vx5d{h+it*dd3EO@5E!Nmg zjfg9vFo3MM-Rpnjgo65*wnyIr4I^{WasvYuq*rk#wu;qeC5TFTiu;OOtO@l;k1~~m zl|sJv=*ve>ojT|cXdvt~Ey>p1>w1%N6Q1!5P8(2nD2|^Q=9U4f^7`)h{}NcZ|8WZ_ zkM=S)cKC3l!7#RQkj^mgh5zN2VKlnh(ed27k}glKB4_YJQ`2jQ1L$PA z=nNgO*yvH*`a109Dp{_Gm3VnV_`5oO5O;ug95z3ta{L-r-MczF`_Q1amU&o<3l(uk z&NlJ@;W(#r#MrUL2r0Pam!2CJwfN5H{ms54?oW_`i3^xNxEY8>#N~D9$GO+%ooudK z0?IypI+}86^ys61rLHlo%x{8Q(4A6olu|_Ay5-@S%!{U2T4?Llht!gdobx*eM5KM} zF1QGPA1k)@=EnXF4B_5;+XA54So~ScI#A87irqyv#Xg5$Vp znp#@!PtJAuG^XSOwIDgVZ{NPntF+EAR_@{9p%XkCY@L>ADpLr*7w^#B2-3(qLi6s~ zJS&`Tm!6B!Y_&fz0G^g%#*(7)NCxF7^@-wh(|^r&b=7<&3?5RJYT2g9oKcNy=%0?h zgS~C4@*``dXRhNek^KRs_6awCU-Pt^#D(~H0rWCIp*ei`z1eY;YV3Dhp6<0XcOa$a z%T%|YfDVOc|DHSveb~QYU?ct3>*!ydMqn81Bdj$PG}BJw>`1mVGYfk{+-VEs>EMo>|deKYaA)&ot#loxxW$VIhcy_KOxt1sRx2 ziW@W3^)Os4aFLL{`v)0WLesLfk!8Ow6EB!z?a3-ZFf<3>Aa&|~taqucX`liJuS#EP zYs+9USb5}&ehBVrXTt+}iI+{Y^jo6M%wY>?Oe3b8z|Hs%g&Ks6!ZHia zAtivuNYfvqxxoVm4lMn)wu)|z@p}DdTDMW4n5GX4S&uUhrvwEamr6kp?hF{pK=dL@ z%aZf6d&MO>Msc9fr82pAp)$dtPx6wJY{Fi$1P+>ko8x1oMVoeTL^44CIfgyPM_y~<}&^i>tTB!PSc3ICvE{rh7 z+sB8pF)C?iDseFJ{Q2?jFUGY>?7!egZwXV~?7vwQQO$wkgd?)B%GO@M_NLK?@8^U%pmAoO8vt8vmWQ4&)cW{w6NS{i%QNikqMOg02F0E+YZm6R2UHA> z9r{jt0|rr+yt;yFcUQ%k~ z=Zt>O@>Y2;lTbT(py-5#&l)k2X3ydo<8^h{WXMfw|MP3SNjzVFUjIB>m~NS&LdDm8 z!Dh~jU{vt()`)8yhQQ9ZqFvJUZfnT($r@7V4YUS)Et;k;9^1Yy^ zbd%G1)uhRU&@RvA1`j6A%rw>3$=iDOTbCxlENI0ESC(x8Fm&{6OzU$YCMKt%Vl#s< zZP{swiAC6W)1rey1092`bnVq^_X~SN5*f)BfK)svu)%go_xlQ-)z<&3V!d;N3=DmG z)FY4$mUAVZKkRqW!q`}Bhpg{M)(jJ47!kO@t3o9lw|4a#(&fYn6Y7`T*q3)Dq67}P zs&;w6j}#qt4(-^xw<}dli6rlbBj|r>?Hn&(yY^qdz}$HIf*luifVG0gw5Q#w2zFO$ zdM+UI#j9j>+N9;*NlQDPWsWQ7lUrVj+Dd6}=POhlUD#gQC&)+;m2&js_yV!9{%FDx zii79{7p^v^mV*_PGYQ)-C93nRkyT-Hg|txWEnuJn*ZvC^oLyWBDD}F0b&?5`^(|r& z;>z+n`n(@H@|c(!+M)90(yKf?ifc~&7t!ZH#89KP235UHIHI2YyTy13+omursXWZK zwi^kN-^9Hl z(m9939+2^Z z9L#5R8H*lqpqdb&KCSPG+Cx2+CtK!DM3=NH%*<)`{h}wjHusQXF?l1L#~zc?d11agb=w-EjRNDLXln)8J5>l@nGa5o=*N#aLJLs^JnX=}w zvVY^~hh=3qD1OatS0ej}Pg+oy+rw8p;%i)j{KMDFdx_Hj;+({URj9Km(;dLK^!CuG z?3lBslH>6(OmyLPUR>Uz>_?iOLWWj5S|BUklp>og+q367&j5)P3jmO`Jzh`wee)33 z+9h}P-ow(A@&r{1C08n*nA}6K;IO&fW*r#74B|Q$mjOyjpqBdwU%ulj?G&^ow>E#O zQ8?D0=K}7hh>J8X#@?SPir4?++r6`=#DrXxrg2e`hSW%y;}V$HPM^>ZH;$Q|gOsSm zvB(><7%4RIIx)%*bp=body0YLXd{FXY*?&Ls?n7R&fzX zwyET1_+Qi?OR%M40Lk$`nd1{R4P>gi3N@Ck@oo-rV9u%ad?mj5ltH~tTy3zjwhoco zu}Z?Wc6e!}uSF`ehP-Ji7~UWz1xW#71rvP0{x6 zAN!iPaCyG>udhsP1dgyCwr+Okc7-zC>SkQdgR5hZ#;v zDlRFx#xg?lk4?GhBjV{%#UrK&VzX5llA?Dk8rcYj#DIZE)~{J!SN%{Z;}JnUyB?#s zmgEut#aGQy3@M>>RP;|*ZeHpyKK1?gFSC{}TC^)W#$!jOWKckiLfYU96xir!;elt$ z5Rph?Pgj(_d?^5cG^pcj;!K%9r@vUD^|-iL$ZMo1W~V8QgKrEJl^B~I-Y>FT%K~o( z5a4yLt(ZCZ_=xEu@3cOa+4*-4k^0bSAnh}~*Z0}9-(Av<%8UE{dkj}7qT(#htY5R{ zCyf_u7gJLem6c}e3*$|!*T?oSabcG&C|`S9%X$B?gD1Kwq<;7B8>HB@2SqP|xHg%DsEHpqSI0+|#soQAzEgtyYX?MB3~-)Rvh{bNYDJ_JrihOEQ%LD zXGT1}N3xfXPb&8Il&(}s<7rnbEmQ!E{ilvwxJ#s*HtMsFy}rIal*DS9PlcJ)1MWbf z>a?hJ48LG9zA8B|FpyPNMJ*-_614_wlc}1}_tM}P#)EWkzJpH#Cw+t?Lgf}8pNYX6 z$Egl?Zob7O0xjg*ziu#H{WvmM!LLY2=AtKBcb5cPkK+NYco zC;7+h{;)^<#Q*^v{LwS1r*sLqv_r8;QsdVgMJ+;7gS_ZS`2PJ5 zs3uWz&8*djdSPaP{Vm7F*lYINuXZORW#JQ9-w@ibNaYcqn>#dDPOgir%8oGPM5TT? zLJU8A_4G?2!r7QJND4-=;JT(>&8t`XU)3Dzi$|| z@M*2Y)LGm2p6I2#w5Cm5WHcHsGiJ%=&FMx%(5D9;4>N?Ig%5_Zx&B{-ks$$}W`lsg zKF{!R9#YBT|Ibke@Y$hbUT1Y>a?zG z;FU8$STJ>df#mQ1PYdv_fHRuQqw4Z|XAJATJO8Z5>n>_6muwac za!wiaf1D*c%C6<-97uX2jq72AZl+2QNCP?ols_pba3N!mz;cS;Y$)`$TDtb3zft$|EJO5&^yO>Ggg`W1VLYjZj?|@$P9&l@e6MV9=r3{ z-z^&r&jjFxOw~ED?Nh92xJ>676{>Xz0q|pCR}De{s(dvI*1FIm2Vh9q_L44qG+h@$ zPMNc?VO)BqcW`s}qN4Zi-<9IpvSYK3JS}b;VVXfO(FeDnBI+S$Ko0;6jr(q-6h6i; zf5F_~^XJbrK|XYt`Wx+SQ(TM}Tv!oQtUZ46HoNs;g61k(`PLi9G#wjK@^1N7&x2Y5 z%*SrFZcRx5?XWNqEwe(8YMjf=`~zf4yH{VW^1iaoe>>_p<_KZ;64^7>-TCFPXvGJ;#z3PF9vZeYCi(?@28Xafd~Qq6q>qw+}jY_5QMMUwp6w|JRMa zl}@t^UX&IYYbvoE%5e4LlNB{q)K=vY-zPGG7p1*wS9W$MN+D_!eQMEwfKG(&<;&IC z<~CtMN^I;q5El9u=8Rrq&O$|h%H}WnKn%5YuRMJ-k7mWTHphPLm*ci)Zr^T4AX&3$ zlu?~EFB@}|d-1j!3f#C&M0xrR(guBVX(ZL*#dG(rTD?lpkvR*#G^xQ`Ww=Vyo*L^Y zwr>_b*O6)hQ<>J$cD~9E?I!w&5gQ)_-6KagaB~iJX_6UQcv%U+2p`ZtK6I6+uVVYJ zM6~pO%Jh{^`xGX7?!L8WQCq9}@uR&&bwW6HYVa4EXw%&WWjn7ao;KTiSWRT! z9O@Y^{*!wRK&IPPjy6DMp2IRU3y4&16aUeM{ubM^4wWf)wP&|(88kPm9$*ZJ>I!10 z+bDky5jlkE)Mon!o^it;lnff8J0;aJ!- zfEBUh-HVg3V$68CRv$h^jo%yiC`>->?awp$wFofkxyc;ic3?HcFDNWgic)RA=JTSl z;WTdEvc;r(s6yMLAX#7A+(&E0V)k}h_NRNGYv_T9l?3%*SzmFo-f_@?cQRF&s^ReY z#NoW7x%nfMz8B4-XD!|KU5n&EU#K(29n`bm{_Kn;{5G$Raif2&D5xoKW}byb=eLIN z-MeT1oq}r`so@;OA=Mq#2-?mS8YS#|<)H#_q~E@M@xq0nA@7UN9FEC9CDV7{NGrOC z3N-Jv^AnBg@Ix$t&ysHk^dhT$2S4LkV8Ld8%2@mQ@JSIp&WPCvsiK5&1n2BYbG7XC?Z5j*U$-L+%h~0} za#V&+z)VbPa5av@92E}#!uDKh_%};jDFQ#%k)qkdCICa zl;0=jX(-?l(m*^$IK#pYz623_-&F#0!oI6B`f0wRKpZ&P(*fF!I?;LQ5^mEFxoZ&lT65O!`gGmVqp?{PNd_G!RT6%I{F_61ncWFTVzY0%e)Mvm* z3DHruOn~6*&es+Q;(q^5ASIyDAtCceEWbvoW8vB;+eO3S4@b5a3`7NsKV+BUea>sv z+)hs?8z>Kc$kMQFKVSKBr?1{v!Z~DeY5q&9kke67d*wAd1mkFNBk^pT>WBb$hXC=?|I-M(7^p=GJl~{d6UMraymz zxIXi3%cqL*-@f$h%fe6U^W_ZdYh(D2ghSG8u_+Z~Ah^^&scdA`R*}dErd%v$Aq!?K zHPF8g+4MHyeOKuw0m_>4psx^(hu6k!O6#SlBN_0drm7fSXe|SE5fO{;Lrgd?Tga+v zIxfaGs;jdTMtk@OGv54V|AWYyUL?Pz*HK#LPP)P#V$9gFx)UZ;5fk|tWWW|b$*LJ$ zRhm*3zT$j(zrEMfQE#}&Y_5E?d`zjX`CYaeWo0~sEoydhnpI=pU3`2M7<6wF^dxB8 z_g%jK>eXM8^Q1|WzMnav<6K1kR#>XHlj4@;j)V{!%7V;rt-ANpL>h`Z8MZ|YOkR>n zwuS+(xrk_rDT#{msX41T@Lj$cO=Q9|S@w5~^+SB$LBjI*K6r9cDfEH8KB z4CUYN<#&BjOjp^e=*rqGlyS(@*Z}#xp==GcgwJVswwC7Rn77wa@Gen|1kFa-@vq%n zF!4MgX~?u`*~x2otuWY3ir-;tJ4_)IayH;e+ej|6<=yBwGsH41pn6IEp4VSo6b|(| z%iXR`VrkJIxw_|^2BNOnQX_kNVZ1-g19WRnnvcSWbgy3DB2`|8_wKfH-|lu&Ecy1* zR|hz1>_yJjoJeRz=tP?h;*-cmn)>QfPC-T`FIp+;{HUZmDoaY5cMskkpWQ=kas0L8 zSQ(uu#=B`)bAHvy+`T>jhXGsfSTI7eW|S@yDImLb%`FmDMSB;u)fgYLnvK&7sm-1p zqi8w*M!e%JP}Z$bIShzi!Js)a-Cx2fxUY}t2Q@af~=FZPaZ6X=<%^Sds>!< z=5O7ypqx{SCeK;;gtI{(xT&eC>(?sdjqlMA@ECL~pPs5cWa{As+!D+6dG}Jd4=e+4 za@^xPTE@MF-k@zivcgemn(XJHKC3+JvUV-wAoEOr%tY-84n#s52Uqb&X8rLa@@d2# zyHabM-z#d8=D4`jbM9hO3MKs2jDyc_71=m=_Y!#vFpXyJqbXejE8a-rQ;gn<>No8` z;36;SCYiHL3c9Xc%akZc@i$5xpCmgpZo;F8h=f!wL7>izFaE6zP9XKhhuC6O|2Fnf zQhe*O&i7s=k&puTpd4$5vc2l|9k_bVlJ#1!<;{xXCmV8(kF`zsHb-&Z^yzOAaGS|D zii`#o=A7!HLJ@0YR2G<$p9M0CsrdivZ8a% z-<5)V%G5I zoFGux&`remyEX*9Cv4joyPF4)RyhQQhA!Y^?p=3CMWu;9eN4wDj;@ppbaw^Gd;9Ni zU55%QKz|3`t`o5IlCVGU7?RfiYI}D35afq*2kA<$x^Y= z!cc`WX05jQWPYs+nC4x_k+=2HD6hEb9)%|-_71__Ym|JmxBh(m{CWTNODl#55TC5C zs6J;^hDfxe3(*FgPXuzb%U{=goh4-!*pLuPDtjf_-AdwqqDfGKx-zLJ)dIUkDl6eF zOjR)?1ehc6a3S&Y&Ye4)49)Z%?})O9%)C+x1SJD6GdCb&2mUF0glb1QZSD^Fr@~ku zUi^34Cx}^&X0UbW=DY(u8R6J;vR<=%^SB{H95@;bj~$u9;z!kA`as@5QVf2?-kzir zw3V&N?-~V};DH_?mZ)mEFQe{bv)MQaQk&JG7|`PnI$2L|!J>Famc$MpHVjeKqJTq3 z4jmFS8Ad~ncsaB}lyR=gJyurmU-I_U4$5)}_!|GbPw(Cky&k!4;Y(>3&3bBVSpf-G z`(HkngL_hp@J^dsZWw!?F{uM`Z@&H_@Xnh*|1m27rZBTjF`@0h>;u2*>UN^-eDg-C z*C2l?lu7FuVWq^WrAGPZJZj{~vam_&s zJ-I>kl%)nUv_Q*wlmH*6?eDyLVa3DywVs}CGg09?#co}>vX<(H%`~6YzP!3E9kg|u zfblf-48_)h01%7GrS%!2(2Z?@0IKn>S(F>=n_DOcfJL6p ze+eDMehE#z_(o{9&!z*BDgld=pDQYsUbs4XD$~LsCE#vEC>}zJ{|wvgib+c9j+(o4!fgsDnO1p*k! z(|!~+{^E~d;r226eoD>F)iplxU~f8v1DrcEGlG0ckc6~LPn8pT6g!sog4EkT*xO$! zg0N*$kdsqG{t4^tN?86LxtT?7r)HZ>pWbysTOSuM=4(){e*fBn=&A6p?&69~hP!(z zy=Q{>#f|HdO=K)$1)t#{-wC+=#AiQ1UaxoRp?p@CmUv%Ax#;&+{thROw%#m=cIFkf) z(zxB$D5?THdmz-G2Ye=C$0yFH*fZlCgWX9p>uE@dtB=|q8)% z*Q<{md_M+i$^-fyzMtQxc7} zs7mO5RgK|#s>-i*bGvc==)$$ak*!l{>iNcVGC2*lqkE4Y{~h*6tWJ^Q(+@cB;G+@F z;lw7Y(AvQsMnfn0@Ro>BGyL+TMDrAh`L6IdXm z1--#_X&hVA)WllCF*QNeN8g`ZH9v(R0NR|HPh5A)kjPoGi>p5r(+gpgqzxyu`CLU1%OVEav1AKMu`s z#B2XKCbO0Nfd7TQ0?oK!!BBilSj4eAYEe-IunT%vi88e#L*)0Wo1YN6=(z4HCHhG> z9Y^m$jD95%DK=yma1uakkM*bSzXi&E-=|T_?&jsk=BF8@sz&8yt83PVJ^x;N$u4jy#LGG}o# z)c?9hgdRhTKL$3d)sJCk9sBMgt=vjNj!gbmkuV71SKiedr1fXo)&CYhO;AAPtnucthR_su=`cKd6yG(^J+*02ge?05>v=K z*hN4J5}UKKWJE?%e4~e%aY|0Pk{atiOngwY%E5oiWoufRs4+n&@vmVrno)yuM9i=j zL&V{@AtS0>jXzR&co`w;Xmhq{LQT5dP@{Lx42Mx|m=w{PH0c1*KVWVCiH?A96 z_dX@iq|LuqX0gb!3;8cz?8e=~oUI~~y_w#c{WlJy&28%_el!~;%c1hyK8v@#FPhzJM)Hm3mN*;Sk>kfsT`2VeZ=& zywVIIcFEG>sbY0p+rjrd9=@p3C#rB^Ajed16}Z>DUb1>bzx^n|D!GBEWaY+~&fEMaj)dSMP@4E{#EH7VJQ6>XoY-QI^;T9(WAtjXQ`hA`WtHZuMzBrRiZn|F{ zJgFVSmXXu!cBGR=IG66WUKYSpLU>(IwPX)6CA@lnxEOV5PLKg#)Lc)(cTD8Vd5%_k z7<1tYh1;y~XvmQBBG1n_Q8-7jtB=oj3SbKD-7orqTQC*$!ds=gLZy)zDWPRF2 zVVWUce7LhHM(QE3gH}JxGQB1%7wlNOGuoS+yZ+xW74E%dWo1!GCJ7+?Z2E2o&8YVO z+OsTGW9RCpwTIBMfzlGyfC%oGj)hX#;OXhYKLePWXh0n5>)USGQ$oc>tMRh3631zc zgNnQ-b+59)}uud}w< z$uB^sBGsh}yijCVFDE8wxI(Y916H)yi1nSgwp3M3@nlcVQ;bvWLvl7E;$d z=0{KZO#gClTPt0$!T&ZrEnJl4*YbwLGcGHCDQ5zEN@k7<(lQx1fZwXTxo-dA*$Rpy zC7k}N^P->S8?pyyKxfcO?XJ;?%y#KWH_eNT8Aui2;1IJ!tAje} zc+$?5kFMpby!D(+<46d5NjQadY#i(0;sUKQ?eUpu)!3&bAFXd_Fh4#{EP#*jiBBG~ zb0@neEuwTTz-E`9z9;-yJfp^{1(ubUD{DK>VCr(GQWvv4m~b$Vd5c@73Ca*NabY78 zNR=Qb>9B%0qhFc!_nXzKt6ZGV6dtiB7j5qB*yir8^>#$iiHMuSL+GrqvLF3xQEsS? z(JbCFk^nZYdWM(`7O)T7M@=O%q7yY%x%>r-;2&RUW#rCL)M?fpmvwo00+OAb4f57f zkE>Rm-um^E@M0ee`wggUfO9ban=^=m+#~YY!v9wb@E6=2>p-|x-;ry#ZUYuTHV5iE zV4Q=f&O^}S3l78jz1~_ZWNv~%Qvq-*&%DFKLevpBPxqbbN)a(ZxCX}m?{ zIoo=c_?wTC*->a&`Pl7Pu5qxuR1@LBAw$w;nEYPZK~oC6`}T0VsnR5m#DyJ4c4lTp z5Zs7|y+D!~i>Du+tLXVKg8a1A&kqD%ao|9>0k%0^U|tX(5j8dEC+B7|(m`FGPMy86 zquNOg?HUk#+@-c@ZPN3K0zG0TCq8z?1>+3KIro)G=o|$(Ibk;D-tzXRZtsuxtYYo4 z!04&p`R~!A&xFO);$3fkF3s(uRCB3WY)EEt$_^!YBpxrKqyh)FjqT%tN#>550=sxO?k5suK8N+kb%htx_pm zE`Bomg-94+j04fVpB5s|@E*hO3Fc)@O^+Qy1JP31^6D%T&zOQN#&}w0MMvAMT317l ziPsIe+@*Obrk4$Ft2fzx>ox7q5IGsAWykYtL3LU=Ayjr(|4ugSEA}|OZyv422i=S zGm{dZJXGGOjwL4*Y&2=m?3hM(Ve~oX4+UXm@B_EG=H@C>{5)yD|6U~F5BqB|ot&jH z(n8puduZRjux*=3R`Arn55JY|%lxJkpl*$>;$v5l5&u^##>m|K;6L-FqGP9$dys|2 z_yc=p;9v2u&g*Dmo!pIU*8&?3df}+(hw8D+W*jN+hoZi>3oc=xY{$n)Y82(?uRshXqr4&WFz_2sQ|E7C*sHI)9&XUu9?U+x3{$| z^6smdQ1N;ywA!N5^7227uQO{FHAb?a_~FA(m@zHPt2PJg46f{>q%134U7DV2zu{y$ zAac^L9Z3*2uQE4>H^?8Sz_DBF>e_+z`@F?s@8Dag zSkVOE^&Z-jezk||#Ucl~rKy`+oq{b8o(uk8)ZVFsQB;uI%bq-0+pOl(Pkj|#yzcrc zm(sc0JAQq*cN%fC@QivWyX3U@5UB~!m-sk-9-nf0RP@!Q)Ac0S;^QUrTww#f(EH5= zJ%bGPXAAYOwnEK&#z)%o}Dgb?oU z5a%A$P765Azb%JXbvZUxP_8#<4xmTg&sb_+&@Ii6PtM=xk3=P%TOgMfZd`r&594eT zHuX92=8Yp~S6??6HOyMiS~5w=-&LL@J>*vu3k1i_etwtjZ!bFJ=}$W1H{6;>lFk$X ze5DRVhy|JmP`4PtFz~UPPIHhVVI^;Oq?vpgEz}nR9e_^J$;a{g-s{;&iTm~w>cBF! zKy?_B43>yt)>*c50$wFL_1&vzf+%&BwoV#3axMQ^>foh>7UIKSHE>oVBhj{X4@g}~ zxFPcfY2^AYJ&a$izK?70t%%*c8^Qtq6N$PB&2^U{GV0UyE_z<;Whh#Ic|%uAlZ4mr zgkq4{k@{@Byw z_v1l9l{MR>0!_>|#PX{Z)u!#=iaB*RS6$ zP*q5m+T3T(yi5Iil3B4+r(ice)zuw6ecBLDBF4b%>|R#RC0m>}@SUIQh|Hq#Wb=G; z^9w≺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 literal 0 HcmV?d00001 diff --git a/previews/PR239/call_notes.html b/previews/PR239/call_notes.html new file mode 100644 index 000000000..ff97cf5c8 --- /dev/null +++ b/previews/PR239/call_notes.html @@ -0,0 +1,25 @@ + + + + + + GeometryOps.jl + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/previews/PR239/experiments/accurate_accumulators.html b/previews/PR239/experiments/accurate_accumulators.html new file mode 100644 index 000000000..aa422d317 --- /dev/null +++ b/previews/PR239/experiments/accurate_accumulators.html @@ -0,0 +1,30 @@ + + + + + + Accurate accumulation | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Accurate accumulation

    Accurate arithmetic is a technique which allows you to calculate using more precision than the provided numeric type.

    We will use the accurate sum routines from AccurateArithmetic.jl to show the difference!

    julia
    import GeometryOps as GO, GeoInterface as GI
    +using GeoJSON
    +using AccurateArithmetic
    +using NaturalEarth
    +
    +all_adm0 = naturalearth("admin_0_countries", 10)
    FeatureCollection with 258 Features
    julia
    GO.area(all_adm0)
    21427.909318372607
    julia
    AccurateArithmetic.sum_oro(GO.area.(all_adm0.geometry))
    21427.909318372607
    julia
    AccurateArithmetic.sum_kbn(GO.area.(all_adm0.geometry))
    21427.909318372607
    julia
    GI.Polygon.(GO.flatten(Union{GI.LineStringTrait, GI.LinearRingTrait}, all_adm0) |> collect .|> x -> [x]) .|> GO.signed_area |> sum
    -21427.90063612163
    julia
    GI.Polygon.(GO.flatten(Union{GI.LineStringTrait, GI.LinearRingTrait}, all_adm0) |> collect .|> x -> [x]) .|> GO.signed_area |> sum_oro
    -21427.90063612163

    @example accurate GI.Polygon.(GO.flatten(Union{GI.LineStringTrait, GI.LinearRingTrait}, all_adm0) |> collect .|> x -> [x]) .|> GO.signed_area |> sum_kbn ```

    + + + + \ No newline at end of file diff --git a/previews/PR239/experiments/predicates.html b/previews/PR239/experiments/predicates.html new file mode 100644 index 000000000..0422e9739 --- /dev/null +++ b/previews/PR239/experiments/predicates.html @@ -0,0 +1,122 @@ + + + + + + Predicates | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Predicates

    Exact vs fast predicates

    Orient

    julia
    using CairoMakie
    +import GeometryOps as GO, GeoInterface as GI, LibGEOS as LG
    +import ExactPredicates
    +using MultiFloats
    +using Chairmarks: @be
    +using BenchmarkTools: prettytime
    +using Statistics
    +
    +function orient_f64(p, q, r)
    +    return sign((GI.x(p) - GI.x(r))*(GI.y(q) - GI.y(r)) - (GI.y(p) - GI.y(r))*(GI.x(q) - GI.x(r)))
    +end
    +
    +function orient_adaptive(p, q, r)
    +    px, py = Float64x2(GI.x(p)), Float64x2(GI.y(p))
    +    qx, qy = Float64x2(GI.x(q)), Float64x2(GI.y(q))
    +    rx, ry = Float64x2(GI.x(r)), Float64x2(GI.y(r))
    +    return sign((px - rx)*(qy - ry) - (py - ry)*(qx - rx))
    +end
    +# Create an interactive Makie dashboard which can show what is done here
    +labels = ["Float64", "Adaptive", "Exact"]
    +funcs = [orient_f64, orient_adaptive, ExactPredicates.orient]
    +fig = Figure()
    +axs = [Axis(fig[1, i]; aspect = DataAspect(), xticklabelrotation = pi/4, title) for (i, title) in enumerate(labels)]
    +w, r, q, p = 42.0, 0.95, 18.0, 16.8
    +function generate_heatmap_args(func, w, r, q, p, heatmap_size = 1000)
    +    w_range = LinRange(0, 0+2.0^(-w), heatmap_size)
    +    orient_field = [func((p, p), (q, q), (r+x, r+y)) for x in w_range, y in w_range]
    +    return (w_range, w_range, orient_field)
    +end
    +for (i, (ax, func)) in enumerate(zip(axs, funcs))
    +    heatmap!(ax, generate_heatmap_args(func, w, r, q, p)...)
    +    # now get timing
    +    w_range = LinRange(0, 0+2.0^(-w), 5) # for timing - we want to sample stable + unstable points
    +    @time timings = [@be $(func)($((p, p)), $((q, q)), $((r+x, r+y))) for x in w_range, y in w_range]
    +    median_timings = map.(x -> getproperty(x, :time), getproperty.(timings, :samples)) |> Iterators.flatten |> collect
    +    ax.subtitle = prettytime(Statistics.median(median_timings)*10^9)
    +    # create time histogram plot
    +    # hist(fig[2, i], median_timings; axis = (; xticklabelrotation = pi/4))
    +    display(fig)
    +end
    +resize!(fig, 1000, 450)
    +fig

    Dashboard

    julia
    using WGLMakie
    +import GeometryOps as GO, GeoInterface as GI, LibGEOS as LG
    +import ExactPredicates
    +using MultiFloats
    +
    +function orient_f64(p, q, r)
    +    return sign((GI.x(p) - GI.x(r))*(GI.y(q) - GI.y(r)) - (GI.y(p) - GI.y(r))*(GI.x(q) - GI.x(r)))
    +end
    +
    +function orient_adaptive(p, q, r)
    +    px, py = Float64x2(GI.x(p)), Float64x2(GI.y(p))
    +    qx, qy = Float64x2(GI.x(q)), Float64x2(GI.y(q))
    +    rx, ry = Float64x2(GI.x(r)), Float64x2(GI.y(r))
    +    return sign((px - rx)*(qy - ry) - (py - ry)*(qx - rx))
    +end
    +# Create an interactive Makie dashboard which can show what is done here
    +fig = Figure()
    +ax = Axis(fig[1, 1]; aspect = DataAspect())
    +sliders = SliderGrid(fig[2, 1],
    +        (label = L"w = 2^{-v} (zoom)", range = LinRange(40, 44, 100), startvalue = 42),
    +        (label = L"r = (x, y),~ x, y ∈ v + [0..w)", range = 0:0.01:3, startvalue = 0.95),
    +        (label = L"q = (k, k),~ k = v", range = LinRange(0, 30, 100), startvalue = 18),
    +        (label = L"p = (k, k),~ k = v", range = LinRange(0, 30, 100), startvalue = 16.8),
    +)
    +orient_funcs = [orient_f64, orient_adaptive, ExactPredicates.orient]
    +menu = Menu(fig[3, 1], options = zip(string.(orient_funcs), orient_funcs))
    +w_obs, r_obs, q_obs, p_obs = getproperty.(sliders.sliders, :value)
    +orient_obs = menu.selection
    +
    +heatmap_size = @lift maximum(widths($(ax.scene.viewport)))*4
    +
    +matrix_observable = lift(orient_obs, w_obs, r_obs, q_obs, p_obs, heatmap_size) do orient, w, r, q, p, heatmap_size
    +    return [orient((p, p), (q, q), (r+x, r+y)) for x in LinRange(0, 0+2.0^(-w), heatmap_size), y in LinRange(0, 0+2.0^(-w), heatmap_size)]
    +end
    +heatmap!(ax, matrix_observable; colormap = [:red, :green, :blue])
    +resize!(fig, 500, 700)
    +fig

    Testing robust vs regular predicates

    julia
    
    +import GeoInterface as GI, GeometryOps as GO, LibGEOS as LG
    +using MultiFloats
    +c1 = [[-28083.868447876892, -58059.13401805979], [-9833.052704767595, -48001.726711609794], [-16111.439295815226, -2.856614689791036e-11], [-76085.95770326033, -2.856614689791036e-11], [-28083.868447876892, -58059.13401805979]]
    +c2 = [[-53333.333333333336, 0.0], [0.0, 0.0], [0.0, -80000.0], [-60000.0, -80000.0], [-53333.333333333336, 0.0]]
    +
    +p1 = GI.Polygon([c1])
    +p2 = GI.Polygon([c2])
    +GO.intersection(p1, p2; target = GI.PolygonTrait(), fix_multipoly = nothing)
    +
    +p1_m, p2_m = GO.transform(x -> (Float64x2.(x)), [p1, p2])
    +GO.intersection(p1_m, p2_m; target = GI.PolygonTrait(), fix_multipoly = nothing)
    +
    +p1 = GI.Polygon([[[-57725.80869813739, -52709.704377648755], [-53333.333333333336, 0.0], [-41878.01362848005, 0.0], [-36022.23699059147, -43787.61366192682], [-48268.44121252392, -52521.18593721105], [-57725.80869813739, -52709.704377648755]]])
    +p2 = GI.Polygon([[[-60000.0, 80000.0], [0.0, 80000.0], [0.0, 0.0], [-53333.33333333333, 0.0], [-50000.0, 40000.0], [-60000.0, 80000.0]]])
    +p1_m, p2_m = GO.transform(x -> (Float64x2.(x)), [p1, p2])
    +f, a, p__1 = poly(p1; label = "p1")
    +p__2 = poly!(a, p2; label = "p2")
    +
    +GO.intersection(p1_m, p2_m; target = GI.PolygonTrait(), fix_multipoly = nothing)
    +LG.intersection(p1_m, p2_m)

    Incircle

    + + + + \ No newline at end of file diff --git a/previews/PR239/explanations/crs.html b/previews/PR239/explanations/crs.html new file mode 100644 index 000000000..bb56b9874 --- /dev/null +++ b/previews/PR239/explanations/crs.html @@ -0,0 +1,25 @@ + + + + + + GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content
    + + + + \ No newline at end of file diff --git a/previews/PR239/explanations/paradigms.html b/previews/PR239/explanations/paradigms.html new file mode 100644 index 000000000..7d5be27f4 --- /dev/null +++ b/previews/PR239/explanations/paradigms.html @@ -0,0 +1,25 @@ + + + + + + Paradigms | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Paradigms

    GeometryOps exposes functions like apply and applyreduce, as well as the fix and prepare APIs, that represent paradigms of programming, by which we mean the ability to program in a certain way, and in so doing, fit neatly into the tools we've built without needing to re-implement the wheel.

    Below, we'll describe some of the foundational paradigms of GeometryOps, and why you should care!

    apply

    The apply function allows you to decompose a given collection of geometries down to a certain level, operate on it, and reconstruct it back to the same nested form as the original. In general, its invocation is:

    julia
    apply(f, trait::Trait, geom)

    Functionally, it's similar to map in the way you apply it to geometries - except that you tell it at which level it should stop, by passing a trait to it.

    apply will start by decomposing the geometry, feature, featurecollection, iterable, or table that you pass to it, and stop when it encounters a geometry for which GI.trait(geom) isa Trait. This encompasses unions of traits especially, but beware that any geometry which is not explicitly handled, and hits GI.PointTrait, will cause an error.

    apply is unlike map in that it returns reconstructed geometries, instead of the raw output of the function. If you want a purely map-like behaviour, like calculating the length of each linestring in your feature collection, then call GO.flatten(f, trait, geom), which will decompose each geometry to the given trait and apply f to it, returning the decomposition as a flattened vector.

    applyreduce

    applyreduce is like the previous map-based approach that we mentioned, except that it reduces the result of f by op. Note that applyreduce does not guarantee associativity, so it's best to have typeof(init) == returntype(op).

    fix and prepare

    The fix and prepare paradigms are different from apply, though they are built on top of it. They involve the use of structs as "actions", where a constructed object indicates an action that should be taken. A trait like interface prescribes the level (polygon, linestring, point, etc) at which each action should be applied.

    In general, the idea here is to be able to invoke several actions efficiently and simultaneously, for example when correcting invalid geometries, or instantiating a Prepared geometry with several preparations (sorted edge lists, rtrees, monotone chains, etc.)

    + + + + \ No newline at end of file diff --git a/previews/PR239/explanations/peculiarities.html b/previews/PR239/explanations/peculiarities.html new file mode 100644 index 000000000..7770e104e --- /dev/null +++ b/previews/PR239/explanations/peculiarities.html @@ -0,0 +1,25 @@ + + + + + + Peculiarities | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Peculiarities

    What does apply return and why?

    apply returns the target geometries returned by f, whatever type/package they are from, but geometries, features or feature collections that wrapped the target are replaced with GeoInterace.jl wrappers with matching GeoInterface.trait to the originals. All non-geointerface iterables become Arrays. Tables.jl compatible tables are converted either back to the original type if a Tables.materializer is defined, and if not then returned as generic NamedTuple column tables (i.e., a NamedTuple of vectors).

    It is recommended for consistency that f returns GeoInterface geometries unless there is a performance/conversion overhead to doing that.

    Why do you want me to provide a target in set operations?

    In polygon set operations like intersection, difference, and union, many different geometry types may be obtained - depending on the relationship between the polygons. For example, when performing an union on two nonintersecting polygons, one would technically have two disjoint polygons as an output.

    We use the target keyword to allow the user to control which kinds of geometry they want back. For example, setting target to PolygonTrait will cause a vector of polygons to be returned (this is the only currently supported behaviour). In future, we may implement MultiPolygonTrait or GeometryCollectionTrait targets which will return a single geometry, as LibGEOS and ArchGDAL do.

    This also allows for a lot more type stability - when you ask for polygons, we won't return a geometrycollection with line segments. Especially in simulation workflows, this is excellent for simplified data processing.

    _True and _False (or BoolsAsTypes)

    Warning

    These are internals and explicitly not public API, meaning they may change at any time!

    When dispatch can be controlled by the value of a boolean variable, this introduces type instability. Instead of introducing type instability, we chose to encode our boolean decision variables, like threaded and calc_extent in apply, as types. This allows the compiler to reason about what will happen, and call the correct compiled method, in a stable way without worrying about

    + + + + \ No newline at end of file diff --git a/previews/PR239/explanations/winding_order.html b/previews/PR239/explanations/winding_order.html new file mode 100644 index 000000000..d503ae661 --- /dev/null +++ b/previews/PR239/explanations/winding_order.html @@ -0,0 +1,25 @@ + + + + + + GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content
    + + + + \ No newline at end of file diff --git a/previews/PR239/favicon.ico b/previews/PR239/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..468a7af73ea3037f8f9e2f22674a92565d1b3163 GIT binary patch literal 23866 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 literal 0 HcmV?d00001 diff --git a/previews/PR239/hashmap.json b/previews/PR239/hashmap.json new file mode 100644 index 000000000..5fee5a780 --- /dev/null +++ b/previews/PR239/hashmap.json @@ -0,0 +1 @@ +{"api.md":"BkfD-VZg","call_notes.md":"D1Aj_9mC","experiments_accurate_accumulators.md":"C1U7KOjF","experiments_predicates.md":"C2d7Qctz","explanations_crs.md":"BdkIxIey","explanations_paradigms.md":"B5COLxNa","explanations_peculiarities.md":"Cphx4jNo","explanations_winding_order.md":"0V2FnJmC","index.md":"C-gmTcRS","introduction.md":"FQTtykEQ","source_geometryops.md":"D_V6MfpH","source_geometryopsflexijoinsext_geometryopsflexijoinsext.md":"BtiH8and","source_geometryopslibgeosext_buffer.md":"BIbTaNIz","source_geometryopslibgeosext_geometryopslibgeosext.md":"BX97MBsi","source_geometryopslibgeosext_segmentize.md":"C7teKqJd","source_geometryopslibgeosext_simple_overrides.md":"PL-RH0TF","source_geometryopslibgeosext_simplify.md":"DqcZcvcS","source_geometryopsprojext_geometryopsprojext.md":"CF-5wcua","source_geometryopsprojext_reproject.md":"Cm7Q7Ebj","source_geometryopsprojext_segmentize.md":"DOG0-rtA","source_methods_angles.md":"B9lhXIGg","source_methods_area.md":"42EUHlu6","source_methods_barycentric.md":"BiNAbdvJ","source_methods_buffer.md":"Wvk7coQv","source_methods_centroid.md":"CPAUzyVU","source_methods_clipping_clipping_processor.md":"Ci1IQvdb","source_methods_clipping_coverage.md":"C89Y2dMt","source_methods_clipping_cut.md":"D8NjrBmq","source_methods_clipping_difference.md":"KRJn9sdE","source_methods_clipping_intersection.md":"bcPofDGt","source_methods_clipping_predicates.md":"BJITr_Uq","source_methods_clipping_union.md":"DlTyWPn1","source_methods_convex_hull.md":"DkVMD0Lv","source_methods_distance.md":"DLCaGxsq","source_methods_equals.md":"BsnJrmWL","source_methods_geom_relations_contains.md":"CTaz5DgK","source_methods_geom_relations_coveredby.md":"BNo4Y8zx","source_methods_geom_relations_covers.md":"Ds8aZwNW","source_methods_geom_relations_crosses.md":"-nyWl6CC","source_methods_geom_relations_disjoint.md":"DH85oHhz","source_methods_geom_relations_geom_geom_processors.md":"CmpKdMyB","source_methods_geom_relations_intersects.md":"Z6dLYNxj","source_methods_geom_relations_overlaps.md":"BjDDEk4_","source_methods_geom_relations_touches.md":"C3wGt7mS","source_methods_geom_relations_within.md":"UHYdg8yN","source_methods_orientation.md":"Cx8oaEg5","source_methods_polygonize.md":"CCOlggGo","source_not_implemented_yet.md":"BRH4xbkQ","source_primitives.md":"Dyw7zzpW","source_src_apply.md":"C1jwRpiI","source_src_applyreduce.md":"vbUWBm8w","source_src_geometry_utils.md":"CpDbCg3A","source_src_geometryopscore.md":"BF7KPh3I","source_src_keyword_docs.md":"BxLB2oH3","source_src_other_primitives.md":"BVzBrNUT","source_src_types.md":"BulrghgC","source_transformations_correction_closed_ring.md":"DlzJm4wM","source_transformations_correction_geometry_correction.md":"DSGv3LiX","source_transformations_correction_intersecting_polygons.md":"CLhMqjHy","source_transformations_extent.md":"CrI7_2Lj","source_transformations_flip.md":"CbHFKr9B","source_transformations_forcedims.md":"_lugiyHg","source_transformations_reproject.md":"DZgumE25","source_transformations_segmentize.md":"DQ-jJDsI","source_transformations_simplify.md":"CnWLEC8c","source_transformations_transform.md":"BWclfchr","source_transformations_tuples.md":"BFXQMbxF","source_types.md":"BzRqHlPc","source_utils.md":"Cy9C-nnj","tutorials_creating_geometry.md":"BW0vmesq","tutorials_geodesic_paths.md":"BlU0MlUq","tutorials_spatial_joins.md":"B67GghbG"} diff --git a/previews/PR239/index.html b/previews/PR239/index.html new file mode 100644 index 000000000..c1320ec82 --- /dev/null +++ b/previews/PR239/index.html @@ -0,0 +1,25 @@ + + + + + + What is GeometryOps.jl? | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    GeometryOps.jl

    Blazing fast geometry operations in pure Julia

    GeometryOps

    What is GeometryOps.jl?

    GeometryOps.jl is a package for geometric calculations on (primarily 2D) geometries.

    The driving idea behind this package is to unify all the disparate packages for geometric calculations in Julia, and make them GeoInterface.jl-compatible. We seem to be focusing primarily on 2/2.5D geometries for now.

    Most of the usecases are driven by GIS and similar Earth data workflows, so this might be a bit specialized towards that, but methods should always be general to any coordinate space.

    We welcome contributions, either as pull requests or discussion on issues!

    How to navigate the docs

    GeometryOps' docs are divided into three main sections: tutorials, explanations and source code.
    Documentation and examples for many functions can be found in the source code section, since we use literate programming in GeometryOps.

    • Tutorials are meant to teach the fundamental concepts behind GeometryOps, and how to perform certain operations.
    • Explanations usually contain little code, and explain in more detail how GeometryOps works.
    • Source code usually contains explanations and examples at the top of the page, followed by annotated source code from that file.
    + + + + \ No newline at end of file diff --git a/previews/PR239/introduction.html b/previews/PR239/introduction.html new file mode 100644 index 000000000..7fa3333df --- /dev/null +++ b/previews/PR239/introduction.html @@ -0,0 +1,25 @@ + + + + + + Introduction | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Introduction

    GeometryOps.jl is a package for geometric calculations on (primarily 2D) geometries.

    The driving idea behind this package is to unify all the disparate packages for geometric calculations in Julia, and make them GeoInterface.jl-compatible. We seem to be focusing primarily on 2/2.5D geometries for now.

    Most of the usecases are driven by GIS and similar Earth data workflows, so this might be a bit specialized towards that, but methods should always be general to any coordinate space.

    We welcome contributions, either as pull requests or discussion on issues!

    Main concepts

    The apply paradigm

    Note

    See the Primitive Functions page for more information on this.

    The apply function allows you to decompose a given collection of geometries down to a certain level, and then operate on it.

    Functionally, it's similar to map in the way you apply it to geometries.

    apply and applyreduce take any geometry, vector of geometries, collection of geometries, or table (like Shapefile.Table, DataFrame, or GeoTable)!

    What's this GeoInterface.Wrapper thing?

    Write a comment about GeoInterface.Wrapper and why it helps in type stability to guarantee a particular return type.

    + + + + \ No newline at end of file diff --git a/previews/PR239/logo.png b/previews/PR239/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8a3120119f5fb9fc512cf7c86c6adb6396b1c663 GIT binary patch literal 87252 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 G%zps%(o>rN literal 0 HcmV?d00001 diff --git a/previews/PR239/siteinfo.js b/previews/PR239/siteinfo.js new file mode 100644 index 000000000..317f8612b --- /dev/null +++ b/previews/PR239/siteinfo.js @@ -0,0 +1 @@ +var DOCUMENTER_CURRENT_VERSION = "previews/PR239"; diff --git a/previews/PR239/source/GeometryOps.html b/previews/PR239/source/GeometryOps.html new file mode 100644 index 000000000..a577d7637 --- /dev/null +++ b/previews/PR239/source/GeometryOps.html @@ -0,0 +1,109 @@ + + + + + + GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    GeometryOps.jl

    julia
    module GeometryOps
    +
    +import GeometryOpsCore
    +import GeometryOpsCore:
    +                TraitTarget,
    +                Manifold, Planar, Spherical, Geodesic,
    +                BoolsAsTypes, _True, _False, _booltype,
    +                apply, applyreduce,
    +                flatten, reconstruct, rebuild, unwrap, _linearring,
    +                APPLY_KEYWORDS, THREADED_KEYWORD, CRS_KEYWORD, CALC_EXTENT_KEYWORD
    +
    +export TraitTarget, Manifold, Planar, Spherical, Geodesic, apply, applyreduce, flatten, reconstruct, rebuild, unwrap
    +
    +using GeoInterface
    +using GeometryBasics
    +using LinearAlgebra, Statistics
    +
    +import Tables, DataAPI
    +import GeometryBasics.StaticArrays
    +import DelaunayTriangulation # for convex hull and triangulation
    +import ExactPredicates
    +import Base.@kwdef
    +import GeoInterface.Extents: Extents
    +
    +const GI = GeoInterface
    +const GB = GeometryBasics
    +
    +const TuplePoint{T} = Tuple{T, T} where T <: AbstractFloat
    +const Edge{T} = Tuple{TuplePoint{T},TuplePoint{T}} where T
    +
    +include("types.jl")
    +include("primitives.jl")
    +include("utils.jl")
    +include("not_implemented_yet.jl")
    +
    +include("methods/angles.jl")
    +include("methods/area.jl")
    +include("methods/barycentric.jl")
    +include("methods/buffer.jl")
    +include("methods/centroid.jl")
    +include("methods/convex_hull.jl")
    +include("methods/distance.jl")
    +include("methods/equals.jl")
    +include("methods/clipping/predicates.jl")
    +include("methods/clipping/clipping_processor.jl")
    +include("methods/clipping/coverage.jl")
    +include("methods/clipping/cut.jl")
    +include("methods/clipping/intersection.jl")
    +include("methods/clipping/difference.jl")
    +include("methods/clipping/union.jl")
    +include("methods/geom_relations/contains.jl")
    +include("methods/geom_relations/coveredby.jl")
    +include("methods/geom_relations/covers.jl")
    +include("methods/geom_relations/crosses.jl")
    +include("methods/geom_relations/disjoint.jl")
    +include("methods/geom_relations/geom_geom_processors.jl")
    +include("methods/geom_relations/intersects.jl")
    +include("methods/geom_relations/overlaps.jl")
    +include("methods/geom_relations/touches.jl")
    +include("methods/geom_relations/within.jl")
    +include("methods/orientation.jl")
    +include("methods/polygonize.jl")
    +
    +include("transformations/extent.jl")
    +include("transformations/flip.jl")
    +include("transformations/reproject.jl")
    +include("transformations/segmentize.jl")
    +include("transformations/simplify.jl")
    +include("transformations/tuples.jl")
    +include("transformations/transform.jl")
    +include("transformations/correction/geometry_correction.jl")
    +include("transformations/correction/closed_ring.jl")
    +include("transformations/correction/intersecting_polygons.jl")

    Import all names from GeoInterface and Extents, so users can do GO.extent or GO.trait.

    julia
    for name in names(GeoInterface)
    +    @eval using GeoInterface: $name
    +end
    +for name in names(Extents)
    +    @eval using GeoInterface.Extents: $name
    +end
    +
    +function __init__()

    Handle all available errors!

    julia
        Base.Experimental.register_error_hint(_reproject_error_hinter, MethodError)
    +    Base.Experimental.register_error_hint(_geodesic_segments_error_hinter, MethodError)
    +    Base.Experimental.register_error_hint(_buffer_error_hinter, MethodError)
    +end
    +
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/GeometryOpsFlexiJoinsExt/GeometryOpsFlexiJoinsExt.html b/previews/PR239/source/GeometryOpsFlexiJoinsExt/GeometryOpsFlexiJoinsExt.html new file mode 100644 index 000000000..806cea8ff --- /dev/null +++ b/previews/PR239/source/GeometryOpsFlexiJoinsExt/GeometryOpsFlexiJoinsExt.html @@ -0,0 +1,40 @@ + + + + + + GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content
    julia
    module GeometryOpsFlexiJoinsExt
    +
    +using GeometryOps
    +using FlexiJoins
    +
    +import GeometryOps as GO, GeoInterface as GI
    +using SortTileRecursiveTree, Tables

    This module defines the FlexiJoins APIs for GeometryOps' boolean comparison functions, taken from DE-9IM.

    First, we define the joining modes (Tree, NestedLoopFast) that the GO DE-9IM functions support.

    julia
    const GO_DE9IM_FUNCS = Union{typeof(GO.contains), typeof(GO.within), typeof(GO.intersects), typeof(GO.disjoint), typeof(GO.touches), typeof(GO.crosses), typeof(GO.overlaps), typeof(GO.covers), typeof(GO.coveredby), typeof(GO.equals)}

    NestedLoopFast is the naive fallback method

    julia
    FlexiJoins.supports_mode(::FlexiJoins.Mode.NestedLoopFast, ::FlexiJoins.ByPred{F}, datas) where F <: GO_DE9IM_FUNCS = true

    This method allows you to cache a tree, which we do by using an STRtree. TODO: wrap GO predicate functions in a TreeJoiner struct or something, to indicate that we want to use trees, since they can be slower in some situations.

    julia
    FlexiJoins.supports_mode(::FlexiJoins.Mode.Tree, ::FlexiJoins.ByPred{F}, datas) where F <: GO_DE9IM_FUNCS = true

    Nested loop support is simple, and needs no further support. However, for trees, we need to define how the tree is prepared and how it is used. This is done by defining the prepare_for_join function to return an STRTree, and by defining the findmatchix function as querying that tree before checking intersections.

    In theory, one could extract the tree from e.g a GeoPackage or some future GeoDataFrame.

    julia
    FlexiJoins.prepare_for_join(::FlexiJoins.Mode.Tree, X, cond::FlexiJoins.ByPred{<: GO_DE9IM_FUNCS}) = (X, SortTileRecursiveTree.STRtree(map(cond.Rf, X)))
    +function FlexiJoins.findmatchix(::FlexiJoins.Mode.Tree, cond::FlexiJoins.ByPred{F}, ix_a, a, (B, tree)::Tuple, multi::typeof(identity)) where F <: GO_DE9IM_FUNCS

    Implementation note: here, a is a row, and b is the full table. We extract the relevant columns using cond.Lf and cond.Rf.

    julia
        idxs = SortTileRecursiveTree.query(tree, cond.Lf(a))
    +    intersecting_idxs = filter!(idxs) do idx
    +        cond.pred(cond.Lf(a), cond.Rf(B[idx]))
    +    end
    +    return intersecting_idxs
    +end

    Finally, for completeness, we define the swap_sides function for those predicates which are defined as inversions.

    julia
    FlexiJoins.swap_sides(::typeof(GO.contains)) = GO.within
    +FlexiJoins.swap_sides(::typeof(GO.within)) = GO.contains
    +FlexiJoins.swap_sides(::typeof(GO.coveredby)) = GO.covers
    +FlexiJoins.swap_sides(::typeof(GO.covers)) = GO.coveredby

    That's a wrap, folks!

    julia
    end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/GeometryOpsLibGEOSExt/GeometryOpsLibGEOSExt.html b/previews/PR239/source/GeometryOpsLibGEOSExt/GeometryOpsLibGEOSExt.html new file mode 100644 index 000000000..1e9a9a17c --- /dev/null +++ b/previews/PR239/source/GeometryOpsLibGEOSExt/GeometryOpsLibGEOSExt.html @@ -0,0 +1,55 @@ + + + + + + GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content
    julia
    module GeometryOpsLibGEOSExt
    +
    +import GeometryOps as GO, LibGEOS as LG
    +import GeoInterface as GI
    +
    +import GeometryOps: GEOS, enforce, _True, _False, _booltype
    +
    +using GeometryOps

    The filter statement is required because in Julia, each module has its own versions of these functions, which serve to evaluate or include code inside the scope of the module. However, if you import those from another module (which you would with all=true), that creates an ambiguity which causes a warning during precompile/load time. In order to avoid this, we filter out these special functions.

    julia
    for name in filter(!in((:var"#eval", :eval, :var"#include", :include)), names(GeometryOps))
    +    @eval import GeometryOps: $name
    +end
    +
    +"""
    +    _wrap(geom; crs, calc_extent)
    +
    +Wraps `geom` in a GI wrapper geometry of its geometry trait.  This allows us
    +to attach CRS and extent info to geometry types which otherwise could not hold
    +those, like LibGEOS and WKB geometries.
    +
    +Returns a GI wrapper geometry, for which `parent(result) == geom`.
    +"""
    +function _wrap(geom; crs=GI.crs(geom), calc_extent = true)
    +    return GI.geointerface_geomtype(GI.geomtrait(geom))(geom; crs, extent = GI.extent(geom, calc_extent))
    +end
    +
    +include("buffer.jl")
    +include("segmentize.jl")
    +include("simplify.jl")
    +
    +include("simple_overrides.jl")
    +
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/GeometryOpsLibGEOSExt/buffer.html b/previews/PR239/source/GeometryOpsLibGEOSExt/buffer.html new file mode 100644 index 000000000..ad2e5754d --- /dev/null +++ b/previews/PR239/source/GeometryOpsLibGEOSExt/buffer.html @@ -0,0 +1,55 @@ + + + + + + GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content
    julia
    const _GEOS_CAPSTYLE_LOOKUP = Dict{Symbol, LG.GEOSBufCapStyles}(
    +    :round => LG.GEOSBUF_CAP_ROUND,
    +    :flat => LG.GEOSBUF_CAP_FLAT,
    +    :square => LG.GEOSBUF_CAP_SQUARE,
    +)
    +
    +const _GEOS_JOINSTYLE_LOOKUP = Dict{Symbol, LG.GEOSBufJoinStyles}(
    +    :round => LG.GEOSBUF_JOIN_ROUND,
    +    :mitre => LG.GEOSBUF_JOIN_MITRE,
    +    :bevel => LG.GEOSBUF_JOIN_BEVEL,
    +)
    +
    +to_cap_style(style::Symbol) = _GEOS_CAPSTYLE_LOOKUP[style]
    +to_cap_style(style::LG.GEOSBufCapStyles) = style
    +to_cap_style(num::Integer) = num
    +
    +to_join_style(style::Symbol) = _GEOS_JOINSTYLE_LOOKUP[style]
    +to_join_style(style::LG.GEOSBufJoinStyles) = style
    +to_join_style(num::Integer) = num
    +
    +function GO.buffer(alg::GEOS, geometry, distance; calc_extent = true, kwargs...)

    The reason we use apply here is so that this also works with featurecollections, tables, vectors of geometries, etc!

    julia
        return apply(TraitTarget{GI.AbstractGeometryTrait}(), geometry; kwargs...) do geom
    +        newgeom = LG.bufferWithStyle(
    +            GI.convert(LG, geom), distance;
    +            quadsegs = get(alg, :quadsegs, 8),
    +            endCapStyle = to_cap_style(get(alg, :endCapStyle, :round)),
    +            joinStyle = to_join_style(get(alg, :joinStyle, :round)),
    +            mitreLimit = get(alg, :mitreLimit, 5.0),
    +        )
    +        return _wrap(newgeom; crs = GI.crs(geom), calc_extent)
    +    end
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/GeometryOpsLibGEOSExt/segmentize.html b/previews/PR239/source/GeometryOpsLibGEOSExt/segmentize.html new file mode 100644 index 000000000..8abf37461 --- /dev/null +++ b/previews/PR239/source/GeometryOpsLibGEOSExt/segmentize.html @@ -0,0 +1,45 @@ + + + + + + Segmentize | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Segmentize

    julia
    import GeometryOps: segmentize, apply

    This file implements the LibGEOS segmentization method for GeometryOps.

    julia
    function _segmentize_geos(geom::LG.AbstractGeometry, max_distance)
    +    context = LG.get_context(geom)
    +    result = LG.GEOSDensify_r(context, geom, max_distance)
    +    if result == C_NULL
    +        error("LibGEOS: Error in GEOSDensify")
    +    end
    +    return LG.geomFromGEOS(result, context)
    +end
    +
    +_segmentize_geos(geom, max_distance) = _segmentize_geos(GI.convert(LG, geom), max_distance)
    +
    +function _wrap_and_segmentize_geos(geom, max_distance)
    +    _wrap(_segmentize_geos(geom, max_distance); crs = GI.crs(geom), calc_extent = false)
    +end

    2 behaviours:

    • enforce: enforce the presence of a kwargs

    • fetch: fetch the value of a kwargs, or return a default value

    julia
    @inline function GO.segmentize(alg::GEOS, geom; threaded::Union{Bool, GO.BoolsAsTypes} = _False())
    +    max_distance = enforce(alg, :max_distance, GO.segmentize)
    +    return GO.apply(
    +        Base.Fix2(_wrap_and_segmentize_geos, max_distance),

    TODO: should this just be a target on GI.AbstractGeometryTrait()? But Geos doesn't support eg RectangleTrait Maybe we need an abstract trait GI.AbstractWKBGeomTrait?

    julia
            GO.TraitTarget(GI.GeometryCollectionTrait(), GI.MultiPolygonTrait(), GI.PolygonTrait(), GI.MultiLineStringTrait(), GI.LineStringTrait(), GI.LinearRingTrait(), GI.MultiPointTrait(), GI.PointTrait()),
    +        geom;
    +        threaded
    +    )
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/GeometryOpsLibGEOSExt/simple_overrides.html b/previews/PR239/source/GeometryOpsLibGEOSExt/simple_overrides.html new file mode 100644 index 000000000..3d459fe5b --- /dev/null +++ b/previews/PR239/source/GeometryOpsLibGEOSExt/simple_overrides.html @@ -0,0 +1,70 @@ + + + + + + Simple overrides | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Simple overrides

    This file contains simple overrides for GEOS, essentially only those functions which have direct counterparts in LG and only require conversion before calling.

    Polygon set operations

    Difference

    julia
    function GO.difference(::GEOS, geom_a, geom_b; target=nothing, calc_extent = false)
    +    return _wrap(LG.difference(GI.convert(LG, geom_a), GI.convert(LG, geom_b)); crs = GI.crs(geom_a), calc_extent)
    +end

    Union

    julia
    function GO.union(::GEOS, geom_a, geom_b; target=nothing, calc_extent = false)
    +    return _wrap(LG.union(GI.convert(LG, geom_a), GI.convert(LG, geom_b)); crs = GI.crs(geom_a), calc_extent)
    +end

    Intersection

    julia
    function GO.intersection(::GEOS, geom_a, geom_b; target=nothing, calc_extent = false)
    +    return _wrap(LG.intersection(GI.convert(LG, geom_a), GI.convert(LG, geom_b)); crs = GI.crs(geom_a), calc_extent)
    +end

    Symmetric difference

    julia
    function GO.symdifference(::GEOS, geom_a, geom_b; target=nothing, calc_extent = false)
    +    return _wrap(LG.symmetric_difference(GI.convert(LG, geom_a), GI.convert(LG, geom_b)); crs = GI.crs(geom_a), calc_extent)
    +end

    DE-9IM boolean methods

    Equals

    julia
    function GO.equals(::GEOS, geom_a, geom_b)
    +    return LG.equals(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Disjoint

    julia
    function GO.disjoint(::GEOS, geom_a, geom_b)
    +    return LG.disjoint(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Touches

    julia
    function GO.touches(::GEOS, geom_a, geom_b)
    +    return LG.touches(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Crosses

    julia
    function GO.crosses(::GEOS, geom_a, geom_b)
    +    return LG.crosses(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Within

    julia
    function GO.within(::GEOS, geom_a, geom_b)
    +    return LG.within(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Contains

    julia
    function GO.contains(::GEOS, geom_a, geom_b)
    +    return LG.contains(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Overlaps

    julia
    function GO.overlaps(::GEOS, geom_a, geom_b)
    +    return LG.overlaps(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Covers

    julia
    function GO.covers(::GEOS, geom_a, geom_b)
    +    return LG.covers(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    CoveredBy

    julia
    function GO.coveredby(::GEOS, geom_a, geom_b)
    +    return LG.coveredby(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Intersects

    julia
    function GO.intersects(::GEOS, geom_a, geom_b)
    +    return LG.intersects(GI.convert(LG, geom_a), GI.convert(LG, geom_b))
    +end

    Convex hull

    julia
    function GO.convex_hull(::GEOS, geoms)
    +    chull = LG.convexhull(
    +        LG.MultiPoint(
    +            collect(
    +                GO.flatten(
    +                    x -> GI.convert(LG.Point, x),
    +                    GI.PointTrait,
    +                    geoms
    +                )
    +            )
    +        )
    +    );
    +    return _wrap(
    +        chull;
    +        crs = GI.crs(geoms),
    +        calc_extent = false
    +    )
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/GeometryOpsLibGEOSExt/simplify.html b/previews/PR239/source/GeometryOpsLibGEOSExt/simplify.html new file mode 100644 index 000000000..3dd3a3b62 --- /dev/null +++ b/previews/PR239/source/GeometryOpsLibGEOSExt/simplify.html @@ -0,0 +1,53 @@ + + + + + + GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Address potential ambiguities

    julia
    GO._simplify(::GI.PointTrait, ::GO.GEOS, geom; kw...) = geom
    +GO._simplify(::GI.MultiPointTrait, ::GO.GEOS, geom; kw...) = geom
    +
    +function GO._simplify(::GI.AbstractGeometryTrait, alg::GO.GEOS, geom; kwargs...)
    +    method = get(alg, :method, :TopologyPreserve)
    +    @assert haskey(alg.params, :tol) """
    +        The `:tol` parameter is required for the GEOS algorithm in `simplify`,
    +        but it was not provided.
    +
    +        Provide it by passing `GEOS(; tol = ...,) as the algorithm.
    +        """
    +    tol = alg.params.tol
    +    if method == :TopologyPreserve
    +        return LG.topologyPreserveSimplify(GI.convert(LG, geom), tol)
    +    elseif method == :DouglasPeucker
    +        return LG.simplify(GI.convert(LG, geom), tol)
    +    else
    +        error("Invalid method passed to `GO.simplify(GEOS(...), ...)`: $method. Please use :TopologyPreserve or :DouglasPeucker")
    +    end
    +end
    +
    +function GO._simplify(trait::GI.AbstractCurveTrait, alg::GO.GEOS, geom; kw...)
    +    Base.invoke(
    +        GO._simplify,
    +        Tuple{GI.AbstractGeometryTrait, GO.GEOS, typeof(geom)},
    +        trait, alg, geom;
    +        kw...
    +    )
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/GeometryOpsProjExt/GeometryOpsProjExt.html b/previews/PR239/source/GeometryOpsProjExt/GeometryOpsProjExt.html new file mode 100644 index 000000000..a8a77eceb --- /dev/null +++ b/previews/PR239/source/GeometryOpsProjExt/GeometryOpsProjExt.html @@ -0,0 +1,32 @@ + + + + + + GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content
    julia
    module GeometryOpsProjExt
    +
    +using GeometryOps, Proj
    +
    +include("reproject.jl")
    +include("segmentize.jl")
    +
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/GeometryOpsProjExt/reproject.html b/previews/PR239/source/GeometryOpsProjExt/reproject.html new file mode 100644 index 000000000..5183717c9 --- /dev/null +++ b/previews/PR239/source/GeometryOpsProjExt/reproject.html @@ -0,0 +1,68 @@ + + + + + + GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content
    julia
    import GeometryOps: GI, GeoInterface, reproject, apply, transform, _is3d, _True, _False
    +import Proj
    +
    +function reproject(geom;
    +    source_crs=nothing, target_crs=nothing, transform=nothing, kw...
    +)
    +    if isnothing(transform)
    +        if isnothing(source_crs)
    +            source_crs = if GI.trait(geom) isa Nothing && geom isa AbstractArray
    +                GeoInterface.crs(first(geom))
    +            else
    +                GeoInterface.crs(geom)
    +            end
    +        end

    If its still nothing, error

    julia
            isnothing(source_crs) && throw(ArgumentError("geom has no crs attached. Pass a `source_crs` keyword"))

    Otherwise reproject

    julia
            reproject(geom, source_crs, target_crs; kw...)
    +    else
    +        reproject(geom, transform; kw...)
    +    end
    +end
    +function reproject(geom, source_crs, target_crs;
    +    time=Inf,
    +    always_xy=true,
    +    transform=nothing,
    +    kw...
    +)
    +    transform = if isnothing(transform)
    +        s = source_crs isa Proj.CRS ? source_crs : convert(String, source_crs)
    +        t = target_crs isa Proj.CRS ? target_crs : convert(String, target_crs)
    +        Proj.Transformation(s, t; always_xy)
    +    else
    +        transform
    +    end
    +    reproject(geom, transform; time, target_crs, kw...)
    +end
    +function reproject(geom, transform::Proj.Transformation; time=Inf, target_crs=nothing, kw...)
    +    if _is3d(geom)
    +        return apply(GI.PointTrait(), geom; crs=target_crs, kw...) do p
    +            transform(GI.x(p), GI.y(p), GI.z(p))
    +        end
    +    else
    +        return apply(GI.PointTrait(), geom; crs=target_crs, kw...) do p
    +            transform(GI.x(p), GI.y(p))
    +        end
    +    end
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/GeometryOpsProjExt/segmentize.html b/previews/PR239/source/GeometryOpsProjExt/segmentize.html new file mode 100644 index 000000000..8bed57560 --- /dev/null +++ b/previews/PR239/source/GeometryOpsProjExt/segmentize.html @@ -0,0 +1,55 @@ + + + + + + GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    This holds the segmentize geodesic functionality.

    julia
    import GeometryOps: GeodesicSegments, _segmentize, _fill_linear_kernel!
    +import Proj
    +
    +function GeometryOps.GeodesicSegments(; max_distance, equatorial_radius::Real=6378137, flattening::Real=1/298.257223563, geodesic::Proj.geod_geodesic = Proj.geod_geodesic(equatorial_radius, flattening))
    +    return GeometryOps.GeodesicSegments{Proj.geod_geodesic}(geodesic, max_distance)
    +end

    This is the same method as in transformations/segmentize.jl, but it constructs a Proj geodesic line every time. Maybe this should be better...

    julia
    function _segmentize(method::Geodesic, geom, ::Union{GI.LineStringTrait, GI.LinearRingTrait}; max_distance)
    +    proj_geodesic = Proj.geod_geodesic(method.semimajor_axis #= same thing as equatorial radius =#, 1/method.inv_flattening)
    +    first_coord = GI.getpoint(geom, 1)
    +    x1, y1 = GI.x(first_coord), GI.y(first_coord)
    +    new_coords = NTuple{2, Float64}[]
    +    sizehint!(new_coords, GI.npoint(geom))
    +    push!(new_coords, (x1, y1))
    +    for coord in Iterators.drop(GI.getpoint(geom), 1)
    +        x2, y2 = GI.x(coord), GI.y(coord)
    +        _fill_linear_kernel!(method, new_coords, x1, y1, x2, y2; max_distance, proj_geodesic)
    +        x1, y1 = x2, y2
    +    end
    +    return rebuild(geom, new_coords)
    +end
    +
    +function GeometryOps._fill_linear_kernel!(method::Geodesic, new_coords::Vector, x1, y1, x2, y2; max_distance, proj_geodesic)
    +    geod_line = Proj.geod_inverseline(proj_geodesic, y1, x1, y2, x2)

    This is the distance in meters computed between the two points. It's s13 because geod_inverseline sets point 3 to the second input point.

    julia
        distance = geod_line.s13
    +    if distance > max_distance
    +        n_segments = ceil(Int, distance / max_distance)
    +        for i in 1:(n_segments - 1)
    +            y, x, _ = Proj.geod_position(geod_line, i / n_segments * distance)
    +            push!(new_coords, (x, y))
    +        end
    +    end

    End the line with the original coordinate, to avoid any multiplication errors.

    julia
        push!(new_coords, (x2, y2))
    +    return nothing
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/angles.html b/previews/PR239/source/methods/angles.html new file mode 100644 index 000000000..1a96542e8 --- /dev/null +++ b/previews/PR239/source/methods/angles.html @@ -0,0 +1,148 @@ + + + + + + Angles | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Angles

    julia
    export angles

    What is angles?

    Angles are the angles formed by a given geometries line segments, if it has line segments.

    To provide an example, consider this rectangle:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie, CairoMakie
    +
    +rect = GI.Polygon([[(0.0, 0.0), (0.0, 1.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0)]])
    +f, a, p = poly(collect(GI.getpoint(rect)); axis = (; aspect = DataAspect()))

    This is clearly a rectangle, with angles of 90 degrees.

    julia
    GO.angles(rect)  # [90, 90, 90, 90]
    4-element Vector{Float64}:
    + 90.0
    + 90.0
    + 90.0
    + 90.0

    Implementation

    This is the GeoInterface-compatible implementation. First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait. This is also used in the implementation, since it's a lot less work!

    julia
    const _ANGLE_TARGETS = TraitTarget{Union{GI.PolygonTrait,GI.AbstractCurveTrait,GI.MultiPointTrait,GI.PointTrait}}()
    +
    +"""
    +    angles(geom, ::Type{T} = Float64)
    +
    +Returns the angles of a geometry or collection of geometries.
    +This is computed differently for different geometries:
    +
    +    - The angles of a point is an empty vector.
    +    - The angles of a single line segment is an empty vector.
    +    - The angles of a linestring or linearring is a vector of angles formed by the curve.
    +    - The angles of a polygon is a vector of vectors of angles formed by each ring.
    +    - The angles of a multi-geometry collection is a vector of the angles of each of the
    +        sub-geometries as defined above.
    +
    +Result will be a Vector, or nested set of vectors, of type T where an optional argument with
    +a default value of Float64.
    +"""
    +function angles(geom, ::Type{T} = Float64; threaded =false) where T <: AbstractFloat
    +    applyreduce(vcat, _ANGLE_TARGETS, geom; threaded, init = Vector{T}()) do g
    +        _angles(T, GI.trait(g), g)
    +    end
    +end

    Points and single line segments have no angles

    julia
    _angles(::Type{T}, ::Union{GI.PointTrait, GI.MultiPointTrait, GI.LineTrait}, geom) where T = T[]
    +
    +#= The angles of a linestring are the angles formed by the line. If the first and last point
    +are not explicitly repeated, the geom is not considered closed. The angles should all be on
    +one side of the line, but a particular side is not guaranteed by this function. =#
    +function _angles(::Type{T}, ::GI.LineStringTrait, geom) where T
    +    npoints = GI.npoint(geom)
    +    first_last_equal = equals(GI.getpoint(geom, 1), GI.getpoint(geom, npoints))
    +    angle_list = Vector{T}(undef, npoints - (first_last_equal ? 1 : 2))
    +    _find_angles!(
    +        T, angle_list, geom;
    +        offset = first_last_equal, close_geom = false,
    +    )
    +    return angle_list
    +end
    +
    +#= The angles of a linearring are the angles within the closed line and include the angles
    +formed by connecting the first and last points of the curve. =#
    +function _angles(::Type{T}, ::GI.LinearRingTrait, geom; interior = true) where T
    +    npoints = GI.npoint(geom)
    +    first_last_equal = equals(GI.getpoint(geom, 1), GI.getpoint(geom, npoints))
    +    angle_list = Vector{T}(undef, npoints - (first_last_equal ? 1 : 0))
    +    _find_angles!(
    +        T, angle_list, geom;
    +        offset = true, close_geom = !first_last_equal, interior = interior,
    +    )
    +    return angle_list
    +end
    +
    +#= The angles of a polygon is a vector of polygon angles. Note that if there are holes
    +within the polygon, the angles will be listed after the exterior ring angles in order of the
    +holes. All angles, including the hole angles, are interior angles of the polygon.=#
    +function _angles(::Type{T}, ::GI.PolygonTrait, geom) where T
    +    angles = _angles(T, GI.LinearRingTrait(), GI.getexterior(geom); interior = true)
    +    for h in GI.gethole(geom)
    +        append!(angles, _angles(T, GI.LinearRingTrait(), h; interior = false))
    +    end
    +    return angles
    +end

    Find angles of a curve and insert the values into the angle_list. If offset is true, then save space for the angle at the first vertex, as the curve is closed, at the front of angle_list. If close_geom is true, then despite the first and last point not being explicitly repeated, the curve is closed and the angle of the last point should be added to angle_list. If interior is true, then all angles will be on the same side of the line

    julia
    function _find_angles!(
    +    ::Type{T}, angle_list, geom;
    +    offset, close_geom, interior = true,
    +) where T
    +    local p1, prev_p1_diff, p2_p1_diff
    +    local start_point, start_diff
    +    local extreem_idx, extreem_x, extreem_y
    +    i_offset = offset ? 1 : 0

    Loop through the curve and find each of the angels

    julia
        for (i, p2) in enumerate(GI.getpoint(geom))
    +        xp2, yp2 = GI.x(p2), GI.y(p2)
    +        #= Find point with smallest x values (and smallest y in case of a tie) as this point
    +        is know to be convex. =#
    +        if i == 1 || (xp2 < extreem_x || (xp2 == extreem_x && yp2 < extreem_y))
    +            extreem_idx = i
    +            extreem_x, extreem_y = xp2, yp2
    +        end
    +        if i > 1
    +            p2_p1_diff = (xp2 - GI.x(p1), yp2 - GI.y(p1))
    +            if i == 2
    +                start_point = p1
    +                start_diff = p2_p1_diff
    +            else
    +                angle_list[i - 2 + i_offset] = _diffs_calc_angle(T, prev_p1_diff, p2_p1_diff)
    +            end
    +            prev_p1_diff = -1 .* p2_p1_diff
    +        end
    +        p1 = p2
    +    end

    If the last point of geometry should be the same as the first, calculate closing angle

    julia
        if close_geom
    +        p2_p1_diff = (GI.x(start_point) - GI.x(p1), GI.y(start_point) - GI.y(p1))
    +        angle_list[end] = _diffs_calc_angle(T, prev_p1_diff, p2_p1_diff)
    +        prev_p1_diff = -1 .* p2_p1_diff
    +    end

    If needed, calculate first angle corresponding to the first point

    julia
        if offset
    +        angle_list[1] = _diffs_calc_angle(T, prev_p1_diff, start_diff)
    +    end
    +    #= Make sure that all of the angles are on the same side of the line and inside of the
    +    closed ring if the input geometry is closed. =#
    +    inside_sgn = sign(angle_list[extreem_idx]) * (interior ? 1 : -1)
    +    for i in eachindex(angle_list)
    +        idx_sgn = sign(angle_list[i])
    +        if idx_sgn == -1
    +            angle_list[i] = abs(angle_list[i])
    +        end
    +        if idx_sgn != inside_sgn
    +            angle_list[i] = 360 - angle_list[i]
    +        end
    +    end
    +    return
    +end

    Calculate the angle between two vectors defined by the previous and current Δx and Δys. Angle will have a sign corresponding to the sign of the cross product between the two vectors. All angles of one sign in a given geometry are convex, while those of the other sign are concave. However, the sign corresponding to each of these can vary based on geometry and thus you must compare to an angle that is know to be convex or concave.

    julia
    function _diffs_calc_angle(::Type{T}, (Δx_prev, Δy_prev), (Δx_curr, Δy_curr)) where T
    +    cross_prod = Δx_prev * Δy_curr - Δy_prev * Δx_curr
    +    dot_prod = Δx_prev * Δx_curr + Δy_prev * Δy_curr
    +    prev_mag = max(sqrt(Δx_prev^2 + Δy_prev^2), eps(T))
    +    curr_mag = max(sqrt(Δx_curr^2 + Δy_curr^2), eps(T))
    +    val = clamp(dot_prod / (prev_mag * curr_mag), -one(T), one(T))
    +    angle = real(acos(val) * 180 / π)
    +    return angle * (cross_prod < 0 ? -1 : 1)
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/area.html b/previews/PR239/source/methods/area.html new file mode 100644 index 000000000..12fbd98c5 --- /dev/null +++ b/previews/PR239/source/methods/area.html @@ -0,0 +1,111 @@ + + + + + + Area and signed area | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Area and signed area

    julia
    export area, signed_area

    What is area? What is signed area?

    Area is the amount of space occupied by a two-dimensional figure. It is always a positive value. Signed area is simply the integral over the exterior path of a polygon, minus the sum of integrals over its interior holes. It is signed such that a clockwise path has a positive area, and a counterclockwise path has a negative area. The area is the absolute value of the signed area.

    To provide an example, consider this rectangle:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +rect = GI.Polygon([[(0,0), (0,1), (1,1), (1,0), (0, 0)]])
    +f, a, p = poly(collect(GI.getpoint(rect)); axis = (; aspect = DataAspect()))

    This is clearly a rectangle, etc. But now let's look at how the points look:

    julia
    lines!(
    +    collect(GI.getpoint(rect));
    +    color = 1:GI.npoint(rect), linewidth = 10.0)
    +f

    The points are ordered in a counterclockwise fashion, which means that the signed area is negative. If we reverse the order of the points, we get a positive area.

    julia
    GO.signed_area(rect)  # -1.0
    -1.0

    Implementation

    This is the GeoInterface-compatible implementation. First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait. This is also used in the implementation, since it's a lot less work!

    Note that area and signed area are zero for all points and curves, even if the curves are closed like with a linear ring. Also note that signed area really only makes sense for polygons, given with a multipolygon can have several polygons each with a different orientation and thus the absolute value of the signed area might not be the area. This is why signed area is only implemented for polygons.

    Targets for applys functions

    julia
    const _AREA_TARGETS = TraitTarget{Union{GI.PolygonTrait,GI.AbstractCurveTrait,GI.MultiPointTrait,GI.PointTrait}}()
    +
    +"""
    +    area(geom, [T = Float64])::T
    +
    +Returns the area of a geometry or collection of geometries.
    +This is computed slightly differently for different geometries:
    +
    +    - The area of a point/multipoint is always zero.
    +    - The area of a curve/multicurve is always zero.
    +    - The area of a polygon is the absolute value of the signed area.
    +    - The area multi-polygon is the sum of the areas of all of the sub-polygons.
    +    - The area of a geometry collection, feature collection of array/iterable
    +        is the sum of the areas of all of the sub-geometries.
    +
    +Result will be of type T, where T is an optional argument with a default value
    +of Float64.
    +"""
    +function area(geom, ::Type{T} = Float64; threaded=false) where T <: AbstractFloat
    +    applyreduce(+, _AREA_TARGETS, geom; threaded, init=zero(T)) do g
    +        _area(T, GI.trait(g), g)
    +    end
    +end
    +
    +"""
    +    signed_area(geom, [T = Float64])::T
    +
    +Returns the signed area of a single geometry, based on winding order.
    +This is computed slightly differently for different geometries:
    +
    +    - The signed area of a point is always zero.
    +    - The signed area of a curve is always zero.
    +    - The signed area of a polygon is computed with the shoelace formula and is
    +    positive if the polygon coordinates wind clockwise and negative if
    +    counterclockwise.
    +    - You cannot compute the signed area of a multipolygon as it doesn't have a
    +    meaning as each sub-polygon could have a different winding order.
    +
    +Result will be of type T, where T is an optional argument with a default value
    +of Float64.
    +"""
    +signed_area(geom, ::Type{T} = Float64) where T <: AbstractFloat =
    +    _signed_area(T, GI.trait(geom), geom)

    Points, MultiPoints, Curves, MultiCurves

    julia
    _area(::Type{T}, ::GI.AbstractGeometryTrait, geom) where T = zero(T)
    +
    +_signed_area(::Type{T}, ::GI.AbstractGeometryTrait, geom) where T = zero(T)

    LibGEOS treats linear rings as zero area. I disagree with that but we should probably maintain compatibility...

    julia
    _area(::Type{T}, tr::GI.LinearRingTrait, geom) where T = 0 # could be abs(_signed_area(T, tr, geom))
    +
    +_signed_area(::Type{T}, ::GI.LinearRingTrait, geom) where T = 0 # could be _signed_area(T, tr, geom)

    Polygons

    julia
    _area(::Type{T}, trait::GI.PolygonTrait, poly) where T =
    +    abs(_signed_area(T, trait, poly))
    +
    +function _signed_area(::Type{T}, ::GI.PolygonTrait, poly) where T
    +    GI.isempty(poly) && return zero(T)
    +    s_area = _signed_area(T, GI.getexterior(poly))
    +    area = abs(s_area)
    +    area == 0 && return area

    Remove hole areas from total

    julia
        for hole in GI.gethole(poly)
    +        area -= abs(_signed_area(T, hole))
    +    end

    Winding of exterior ring determines sign

    julia
        return area * sign(s_area)
    +end

    One term of the shoelace area formula

    julia
    _area_component(p1, p2) = GI.x(p1) * GI.y(p2) - GI.y(p1) * GI.x(p2)
    +
    +#= Calculates the signed area of a given curve. This is equivalent to integrating
    +to find the area under the curve. Even if curve isn't explicitly closed by
    +repeating the first point at the end of the coordinates, curve is still assumed
    +to be closed. =#
    +function _signed_area(::Type{T}, geom) where T
    +    area = zero(T)
    +    np = GI.npoint(geom)
    +    np == 0 && return area
    +
    +    first = true
    +    local pfirst, p1

    Integrate the area under the curve

    julia
        for p2 in GI.getpoint(geom)

    Skip the first and do it later This lets us work within one iteration over geom, which means on C call when using points from external libraries.

    julia
            if first
    +            p1 = pfirst = p2
    +            first = false
    +            continue
    +        end

    Accumulate the area into area

    julia
            area += _area_component(p1, p2)
    +        p1 = p2
    +    end

    Complete the last edge. If the first and last where the same this will be zero

    julia
        p2 = pfirst
    +    area += _area_component(p1, p2)
    +    return T(area / 2)
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/barycentric.html b/previews/PR239/source/methods/barycentric.html new file mode 100644 index 000000000..49f17aed0 --- /dev/null +++ b/previews/PR239/source/methods/barycentric.html @@ -0,0 +1,439 @@ + + + + + + Barycentric coordinates | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Barycentric coordinates

    julia
    export barycentric_coordinates, barycentric_coordinates!, barycentric_interpolate
    +export MeanValue

    Generalized barycentric coordinates are a generalization of barycentric coordinates, which are typically used in triangles, to arbitrary polygons.

    They provide a way to express a point within a polygon as a weighted average of the polygon's vertices.

    In the case of a triangle, barycentric coordinates are a set of three numbers (λ1,λ2,λ3), each associated with a vertex of the triangle. Any point within the triangle can be expressed as a weighted average of the vertices, where the weights are the barycentric coordinates. The weights sum to 1, and each is non-negative.

    For a polygon with n vertices, generalized barycentric coordinates are a set of n numbers (λ1,λ2,...,λn), each associated with a vertex of the polygon. Any point within the polygon can be expressed as a weighted average of the vertices, where the weights are the generalized barycentric coordinates.

    As with the triangle case, the weights sum to 1, and each is non-negative.

    Example

    This example was taken from this page of CGAL's documentation.

    julia
    using GeometryOps
    +using GeometryOps.GeometryBasics
    +using Makie
    +using CairoMakie
    +# Define a polygon
    +polygon_points = Point3f[
    +(0.03, 0.05, 0.00), (0.07, 0.04, 0.02), (0.10, 0.04, 0.04),
    +(0.14, 0.04, 0.06), (0.17, 0.07, 0.08), (0.20, 0.09, 0.10),
    +(0.22, 0.11, 0.12), (0.25, 0.11, 0.14), (0.27, 0.10, 0.16),
    +(0.30, 0.07, 0.18), (0.31, 0.04, 0.20), (0.34, 0.03, 0.22),
    +(0.37, 0.02, 0.24), (0.40, 0.03, 0.26), (0.42, 0.04, 0.28),
    +(0.44, 0.07, 0.30), (0.45, 0.10, 0.32), (0.46, 0.13, 0.34),
    +(0.46, 0.19, 0.36), (0.47, 0.26, 0.38), (0.47, 0.31, 0.40),
    +(0.47, 0.35, 0.42), (0.45, 0.37, 0.44), (0.41, 0.38, 0.46),
    +(0.38, 0.37, 0.48), (0.35, 0.36, 0.50), (0.32, 0.35, 0.52),
    +(0.30, 0.37, 0.54), (0.28, 0.39, 0.56), (0.25, 0.40, 0.58),
    +(0.23, 0.39, 0.60), (0.21, 0.37, 0.62), (0.21, 0.34, 0.64),
    +(0.23, 0.32, 0.66), (0.24, 0.29, 0.68), (0.27, 0.24, 0.70),
    +(0.29, 0.21, 0.72), (0.29, 0.18, 0.74), (0.26, 0.16, 0.76),
    +(0.24, 0.17, 0.78), (0.23, 0.19, 0.80), (0.24, 0.22, 0.82),
    +(0.24, 0.25, 0.84), (0.21, 0.26, 0.86), (0.17, 0.26, 0.88),
    +(0.12, 0.24, 0.90), (0.07, 0.20, 0.92), (0.03, 0.15, 0.94),
    +(0.01, 0.10, 0.97), (0.02, 0.07, 1.00)]
    +# Plot it!
    +# First, we'll plot the polygon using Makie's rendering:
    +f, a1, p1 = poly(
    +    Point2d.(polygon_points);
    +    color = last.(polygon_points),
    +    colormap = cgrad(:jet, 18; categorical = true),
    +    axis = (;
    +       type = Axis, aspect = DataAspect(), title = "Makie mesh based polygon rendering", subtitle = "CairoMakie"
    +    ),
    +    figure = (; size = (800, 400),)
    +)
    +hidedecorations!(a1)
    +
    +ext = GeometryOps.GI.Extent(X = (0, 0.5), Y = (0, 0.42))
    +
    +a2 = Axis(
    +        f[1, 2],
    +        aspect = DataAspect(),
    +        title = "Barycentric coordinate based polygon rendering", subtitle = "GeometryOps",
    +        limits = (ext.X, ext.Y)
    +    )
    +hidedecorations!(a2)
    +
    +p2box = poly!( # Now, we plot a cropping rectangle around the axis so we only show the polygon
    +    a2,
    +    GeometryOps.GeometryBasics.Polygon( # This is a rectangle with an internal hole shaped like the polygon.
    +        Point2f[(ext.X[1], ext.Y[1]), (ext.X[2], ext.Y[1]), (ext.X[2], ext.Y[2]), (ext.X[1], ext.Y[2]), (ext.X[1], ext.Y[1])], # exterior
    +        [reverse(Point2f.(polygon_points))] # hole
    +    ); color = :white, xautolimits = false, yautolimits = false
    +)
    +cb = Colorbar(f[2, :], p1.plots[1]; vertical = false, flipaxis = true)
    +# Finally, we perform barycentric interpolation on a grid,
    +xrange = LinRange(ext.X..., 400)
    +yrange = LinRange(ext.Y..., 400)
    +@time mean_values = barycentric_interpolate.(
    +    (MeanValue(),), # The barycentric coordinate algorithm (MeanValue is the only one for now)
    +    (Point2f.(polygon_points),), # The polygon points as `Point2f`
    +    (last.(polygon_points,),),   # The values per polygon point - can be anything which supports addition and division
    +    Point2f.(xrange, yrange')    # The points at which to interpolate
    +)
    +# and render!
    +hm = heatmap!(a2, xrange, yrange, mean_values; colormap = p1.colormap, colorrange = p1.plots[1].colorrange[], xautolimits = false, yautolimits = false)
    +translate!(hm, 0, 0, -1) # translate the heatmap behind the cropping polygon!
    +f # finally, display the figure

    Barycentric-coordinate API

    In some cases, we actually want barycentric interpolation, and have no interest in the coordinates themselves.

    However, the coordinates can be useful for debugging, and when performing 3D rendering, multiple barycentric values (depth, uv) are needed for depth buffering.

    julia
    const _VecTypes = Union{Tuple{Vararg{T, N}}, GeometryBasics.StaticArraysCore.StaticArray{Tuple{N}, T, 1}} where {N, T}
    +
    +"""
    +    abstract type AbstractBarycentricCoordinateMethod
    +
    +Abstract supertype for barycentric coordinate methods.
    +The subtypes may serve as dispatch types, or may cache
    +some information about the target polygon.
    +
    +# API
    +The following methods must be implemented for all subtypes:
    +- `barycentric_coordinates!(λs::Vector{<: Real}, method::AbstractBarycentricCoordinateMethod, exterior::Vector{<: Point{2, T1}}, point::Point{2, T2})`
    +- `barycentric_interpolate(method::AbstractBarycentricCoordinateMethod, exterior::Vector{<: Point{2, T1}}, values::Vector{V}, point::Point{2, T2})::V`
    +- `barycentric_interpolate(method::AbstractBarycentricCoordinateMethod, exterior::Vector{<: Point{2, T1}}, interiors::Vector{<: Vector{<: Point{2, T1}}} values::Vector{V}, point::Point{2, T2})::V`
    +The rest of the methods will be implemented in terms of these, and have efficient dispatches for broadcasting.
    +"""
    +abstract type AbstractBarycentricCoordinateMethod end
    +
    +Base.@propagate_inbounds function barycentric_coordinates!(λs::Vector{<: Real}, method::AbstractBarycentricCoordinateMethod, polypoints::AbstractVector{<: Point{N1, T1}}, point::Point{N2, T2}) where {N1, N2, T1 <: Real, T2 <: Real}
    +    @boundscheck @assert length(λs) == length(polypoints)
    +    @boundscheck @assert length(polypoints) >= 3
    +
    +    @error("Not implemented yet for method $(method).")
    +end
    +Base.@propagate_inbounds barycentric_coordinates!(λs::Vector{<: Real}, polypoints::AbstractVector{<: Point{N1, T1}}, point::Point{N2, T2}) where {N1, N2, T1 <: Real, T2 <: Real} = barycentric_coordinates!(λs, MeanValue(), polypoints, point)

    This is the GeoInterface-compatible method.

    julia
    """
    +    barycentric_coordinates!(λs::Vector{<: Real}, method::AbstractBarycentricCoordinateMethod, polygon, point)
    +
    +Loads the barycentric coordinates of `point` in `polygon` into `λs` using the barycentric coordinate method `method`.
    +
    +`λs` must be of the length of the polygon plus its holes.
    +
    +!!! tip
    +    Use this method to avoid excess allocations when you need to calculate barycentric coordinates for many points.
    +"""
    +Base.@propagate_inbounds function barycentric_coordinates!(λs::Vector{<: Real}, method::AbstractBarycentricCoordinateMethod, polygon, point)
    +    @assert GeoInterface.trait(polygon) isa GeoInterface.PolygonTrait
    +    @assert GeoInterface.trait(point) isa GeoInterface.PointTrait
    +    passable_polygon = GeoInterface.convert(GeometryBasics, polygon)
    +    @assert passable_polygon isa GeometryBasics.Polygon "The polygon was converted to a $(typeof(passable_polygon)), which is not a `GeometryBasics.Polygon`."
    +    passable_point = GeoInterface.convert(GeometryBasics, point)
    +    return barycentric_coordinates!(λs, method, passable_polygon, Point2(passable_point))
    +end
    +
    +Base.@propagate_inbounds function barycentric_coordinates(method::AbstractBarycentricCoordinateMethod, polypoints::AbstractVector{<: Point{N1, T1}}, point::Point{N2, T2}) where {N1, N2, T1 <: Real, T2 <: Real}
    +    λs = zeros(promote_type(T1, T2), length(polypoints))
    +    barycentric_coordinates!(λs, method, polypoints, point)
    +    return λs
    +end
    +Base.@propagate_inbounds barycentric_coordinates(polypoints::AbstractVector{<: Point{N1, T1}}, point::Point{N2, T2}) where {N1, N2, T1 <: Real, T2 <: Real} = barycentric_coordinates(MeanValue(), polypoints, point)

    This is the GeoInterface-compatible method.

    julia
    """
    +    barycentric_coordinates(method = MeanValue(), polygon, point)
    +
    +Returns the barycentric coordinates of `point` in `polygon` using the barycentric coordinate method `method`.
    +"""
    +Base.@propagate_inbounds function barycentric_coordinates(method::AbstractBarycentricCoordinateMethod, polygon, point)
    +    @assert GeoInterface.trait(polygon) isa GeoInterface.PolygonTrait
    +    @assert GeoInterface.trait(point) isa GeoInterface.PointTrait
    +    passable_polygon = GeoInterface.convert(GeometryBasics, polygon)
    +    @assert passable_polygon isa GeometryBasics.Polygon "The polygon was converted to a $(typeof(passable_polygon)), which is not a `GeometryBasics.Polygon`."
    +    passable_point = GeoInterface.convert(GeometryBasics, point)
    +    return barycentric_coordinates(method, passable_polygon, Point2(passable_point))
    +end
    +
    +Base.@propagate_inbounds function barycentric_interpolate(method::AbstractBarycentricCoordinateMethod, polypoints::AbstractVector{<: Point{N, T1}}, values::AbstractVector{V}, point::Point{N, T2}) where {N, T1 <: Real, T2 <: Real, V}
    +    @boundscheck @assert length(values) == length(polypoints)
    +    @boundscheck @assert length(polypoints) >= 3
    +    λs = barycentric_coordinates(method, polypoints, point)
    +    return sum(λs .* values)
    +end
    +Base.@propagate_inbounds barycentric_interpolate(polypoints::AbstractVector{<: Point{N, T1}}, values::AbstractVector{V}, point::Point{N, T2}) where {N, T1 <: Real, T2 <: Real, V} = barycentric_interpolate(MeanValue(), polypoints, values, point)
    +
    +Base.@propagate_inbounds function barycentric_interpolate(method::AbstractBarycentricCoordinateMethod, exterior::AbstractVector{<: Point{N, T1}}, interiors::AbstractVector{<: Point{N, T1}}, values::AbstractVector{V}, point::Point{N, T2}) where {N, T1 <: Real, T2 <: Real, V}
    +    @boundscheck @assert length(values) == length(exterior) + isempty(interiors) ? 0 : sum(length.(interiors))
    +    @boundscheck @assert length(exterior) >= 3
    +    λs = barycentric_coordinates(method, exterior, interiors, point)
    +    return sum(λs .* values)
    +end
    +Base.@propagate_inbounds barycentric_interpolate(exterior::AbstractVector{<: Point{N, T1}}, interiors::AbstractVector{<: Point{N, T1}}, values::AbstractVector{V}, point::Point{N, T2}) where {N, T1 <: Real, T2 <: Real, V} = barycentric_interpolate(MeanValue(), exterior, interiors, values, point)
    +
    +Base.@propagate_inbounds function barycentric_interpolate(method::AbstractBarycentricCoordinateMethod, polygon::Polygon{2, T1}, values::AbstractVector{V}, point::Point{2, T2}) where {T1 <: Real, T2 <: Real, V}
    +    exterior = decompose(Point{2, promote_type(T1, T2)}, polygon.exterior)
    +    if isempty(polygon.interiors)
    +        @boundscheck @assert length(values) == length(exterior)
    +        return barycentric_interpolate(method, exterior, values, point)
    +    else # the poly has interiors
    +        interiors = reverse.(decompose.((Point{2, promote_type(T1, T2)},), polygon.interiors))
    +        @boundscheck @assert length(values) == length(exterior) + sum(length.(interiors))
    +        return barycentric_interpolate(method, exterior, interiors, values, point)
    +    end
    +end
    +Base.@propagate_inbounds barycentric_interpolate(polygon::Polygon{2, T1}, values::AbstractVector{V}, point::Point{2, T2}) where {T1 <: Real, T2 <: Real, V} = barycentric_interpolate(MeanValue(), polygon, values, point)

    3D polygons are considered to have their vertices in the XY plane, and the Z coordinate must represent some value. This is to say that the Z coordinate is interpreted as an M coordinate.

    julia
    Base.@propagate_inbounds function barycentric_interpolate(method::AbstractBarycentricCoordinateMethod, polygon::Polygon{3, T1}, point::Point{2, T2}) where {T1 <: Real, T2 <: Real}
    +    exterior_point3s = decompose(Point{3, promote_type(T1, T2)}, polygon.exterior)
    +    exterior_values = getindex.(exterior_point3s, 3)
    +    exterior_points = Point2f.(exterior_point3s)
    +    if isempty(polygon.interiors)
    +        return barycentric_interpolate(method, exterior_points, exterior_values, point)
    +    else # the poly has interiors
    +        interior_point3s = decompose.((Point{3, promote_type(T1, T2)},), polygon.interiors)
    +        interior_values = collect(Iterators.flatten((getindex.(point3s, 3) for point3s in interior_point3s)))
    +        interior_points = map(point3s -> Point2f.(point3s), interior_point3s)
    +        return barycentric_interpolate(method, exterior_points, interior_points, vcat(exterior_values, interior_values), point)
    +    end
    +end
    +Base.@propagate_inbounds barycentric_interpolate(polygon::Polygon{3, T1}, point::Point{2, T2}) where {T1 <: Real, T2 <: Real} = barycentric_interpolate(MeanValue(), polygon, point)

    This method is the one which supports GeoInterface.

    julia
    """
    +    barycentric_interpolate(method = MeanValue(), polygon, values::AbstractVector{V}, point)
    +
    +Returns the interpolated value at `point` within `polygon` using the barycentric coordinate method `method`.
    +`values` are the per-point values for the polygon which are to be interpolated.
    +
    +Returns an object of type `V`.
    +
    +!!! warning
    +    Barycentric interpolation is currently defined only for 2-dimensional polygons.
    +    If you pass a 3-D polygon in, the Z coordinate will be used as per-vertex value to be interpolated
    +    (the M coordinate in GIS parlance).
    +"""
    +Base.@propagate_inbounds function barycentric_interpolate(method::AbstractBarycentricCoordinateMethod, polygon, values::AbstractVector{V}, point) where V
    +    @assert GeoInterface.trait(polygon) isa GeoInterface.PolygonTrait
    +    @assert GeoInterface.trait(point) isa GeoInterface.PointTrait
    +    passable_polygon = GeoInterface.convert(GeometryBasics, polygon)
    +    @assert passable_polygon isa GeometryBasics.Polygon "The polygon was converted to a $(typeof(passable_polygon)), which is not a `GeometryBasics.Polygon`."
    +    # first_poly_point = GeoInterface.getpoint(GeoInterface.getexterior(polygon))
    +    passable_point = GeoInterface.convert(GeometryBasics, point)
    +    return barycentric_interpolate(method, passable_polygon, Point2(passable_point))
    +end
    +Base.@propagate_inbounds barycentric_interpolate(polygon, values::AbstractVector{V}, point) where V = barycentric_interpolate(MeanValue(), polygon, values, point)
    +
    +"""
    +    weighted_mean(weight::Real, x1, x2)
    +
    +Returns the weighted mean of `x1` and `x2`, where `weight` is the weight of `x1`.
    +
    +Specifically, calculates `x1 * weight + x2 * (1 - weight)`.
    +
    +!!! note
    +    The idea for this method is that you can override this for custom types, like Color types, in extension modules.
    +"""
    +function weighted_mean(weight::WT, x1, x2) where {WT <: Real}
    +    return muladd(x1, weight, x2 * (oneunit(WT) - weight))
    +end
    +
    +
    +"""
    +    MeanValue() <: AbstractBarycentricCoordinateMethod
    +
    +This method calculates barycentric coordinates using the mean value method.
    +
    +# References
    +
    +"""
    +struct MeanValue <: AbstractBarycentricCoordinateMethod
    +end

    Before we go to the actual implementation, there are some quick and simple utility functions that we need to implement. These are mainly for convenience and code brevity.

    julia
    """
    +    _det(s1::Point2{T1}, s2::Point2{T2}) where {T1 <: Real, T2 <: Real}
    +
    +Returns the determinant of the matrix formed by `hcat`'ing two points `s1` and `s2`.
    +
    +Specifically, this is:
    +```julia
    +s1[1] * s2[2] - s1[2] * s2[1]
    +```
    +"""
    +function _det(s1::_VecTypes{2, T1}, s2::_VecTypes{2, T2}) where {T1 <: Real, T2 <: Real}
    +    return s1[1] * s2[2] - s1[2] * s2[1]
    +end
    +
    +"""
    +    t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)
    +
    +Returns the "T-value" as described in Hormann's presentation [^HormannPresentation] on how to calculate
    +the mean-value coordinate.
    +
    +Here, `sᵢ` is the vector from vertex `vᵢ` to the point, and `rᵢ` is the norm (length) of `sᵢ`.
    +`s` must be `Point` and `r` must be real numbers.
    +
    +```math
    +tᵢ = \\frac{\\mathrm{det}\\left(sᵢ, sᵢ₊₁\\right)}{rᵢ * rᵢ₊₁ + sᵢ ⋅ sᵢ₊₁}
    +```
    +
    +[^HormannPresentation]: K. Hormann and N. Sukumar. Generalized Barycentric Coordinates in Computer Graphics and Computational Mechanics. Taylor & Fancis, CRC Press, 2017.
    +```
    +
    +"""
    +function t_value(sᵢ::_VecTypes{N, T1}, sᵢ₊₁::_VecTypes{N, T1}, rᵢ::T2, rᵢ₊₁::T2) where {N, T1 <: Real, T2 <: Real}
    +    return _det(sᵢ, sᵢ₊₁) / muladd(rᵢ, rᵢ₊₁, dot(sᵢ, sᵢ₊₁))
    +end
    +
    +
    +function barycentric_coordinates!(λs::Vector{<: Real}, ::MeanValue, polypoints::AbstractVector{<: Point{2, T1}}, point::Point{2, T2}) where {T1 <: Real, T2 <: Real}
    +    @boundscheck @assert length(λs) == length(polypoints)
    +    @boundscheck @assert length(polypoints) >= 3
    +    n_points = length(polypoints)
    +    # Initialize counters and register variables
    +    # Points - these are actually vectors from point to vertices
    +    #  polypoints[i-1], polypoints[i], polypoints[i+1]
    +    sᵢ₋₁ = polypoints[end] - point
    +    sᵢ   = polypoints[begin] - point
    +    sᵢ₊₁ = polypoints[begin+1] - point
    +    # radius / Euclidean distance between points.
    +    rᵢ₋₁ = norm(sᵢ₋₁)
    +    rᵢ   = norm(sᵢ  )
    +    rᵢ₊₁ = norm(sᵢ₊₁)
    +    # Perform the first computation explicitly, so we can cut down on
    +    # a mod in the loop.
    +    λs[1] = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +    # Loop through the rest of the vertices, compute, store in λs
    +    for i in 2:n_points
    +        # Increment counters + set variables
    +        sᵢ₋₁ = sᵢ
    +        sᵢ   = sᵢ₊₁
    +        sᵢ₊₁ = polypoints[mod1(i+1, n_points)] - point
    +        rᵢ₋₁ = rᵢ
    +        rᵢ   = rᵢ₊₁
    +        rᵢ₊₁ = norm(sᵢ₊₁) # radius / Euclidean distance between points.
    +        λs[i] = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +    end
    +    # Normalize λs to the 1-norm (sum=1)
    +    λs ./= sum(λs)
    +    return λs
    +end
    julia
    function barycentric_coordinates(::MeanValue, polypoints::NTuple{N, Point{2, T2}}, point::Point{2, T1},) where {N, T1, T2}
    +    ## Initialize counters and register variables
    +    ## Points - these are actually vectors from point to vertices
    +    ##  polypoints[i-1], polypoints[i], polypoints[i+1]
    +    sᵢ₋₁ = polypoints[end] - point
    +    sᵢ   = polypoints[begin] - point
    +    sᵢ₊₁ = polypoints[begin+1] - point
    +    ## radius / Euclidean distance between points.
    +    rᵢ₋₁ = norm(sᵢ₋₁)
    +    rᵢ   = norm(sᵢ  )
    +    rᵢ₊₁ = norm(sᵢ₊₁)
    +    λ₁ = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +    λs = ntuple(N) do i
    +        if i == 1
    +            return λ₁
    +        end
    +        ## Increment counters + set variables
    +        sᵢ₋₁ = sᵢ
    +        sᵢ   = sᵢ₊₁
    +        sᵢ₊₁ = polypoints[mod1(i+1, N)] - point
    +        rᵢ₋₁ = rᵢ
    +        rᵢ   = rᵢ₊₁
    +        rᵢ₊₁ = norm(sᵢ₊₁) # radius / Euclidean distance between points.
    +        return (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +    end
    +
    +    ∑λ = sum(λs)
    +
    +    return ntuple(N) do i
    +        λs[i] / ∑λ
    +    end
    +end

    This performs an inplace accumulation, using less memory and is faster. That's particularly good if you are using a polygon with a large number of points...

    julia
    function barycentric_interpolate(::MeanValue, polypoints::AbstractVector{<: Point{2, T1}}, values::AbstractVector{V}, point::Point{2, T2}) where {T1 <: Real, T2 <: Real, V}
    +    @boundscheck @assert length(values) == length(polypoints)
    +    @boundscheck @assert length(polypoints) >= 3
    +
    +    n_points = length(polypoints)
    +    # Initialize counters and register variables
    +    # Points - these are actually vectors from point to vertices
    +    #  polypoints[i-1], polypoints[i], polypoints[i+1]
    +    sᵢ₋₁ = polypoints[end] - point
    +    sᵢ   = polypoints[begin] - point
    +    sᵢ₊₁ = polypoints[begin+1] - point
    +    # radius / Euclidean distance between points.
    +    rᵢ₋₁ = norm(sᵢ₋₁)
    +    rᵢ   = norm(sᵢ  )
    +    rᵢ₊₁ = norm(sᵢ₊₁)
    +    # Now, we set the interpolated value to the first point's value, multiplied
    +    # by the weight computed relative to the first point in the polygon.
    +    wᵢ = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +    wₜₒₜ = wᵢ
    +    interpolated_value = values[begin] * wᵢ
    +    for i in 2:n_points
    +        # Increment counters + set variables
    +        sᵢ₋₁ = sᵢ
    +        sᵢ   = sᵢ₊₁
    +        sᵢ₊₁ = polypoints[mod1(i+1, n_points)] - point
    +        rᵢ₋₁ = rᵢ
    +        rᵢ   = rᵢ₊₁
    +        rᵢ₊₁ = norm(sᵢ₊₁)
    +        # Now, we calculate the weight:
    +        wᵢ = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +        # perform a weighted sum with the interpolated value:
    +        interpolated_value += values[i] * wᵢ
    +        # and add the weight to the total weight accumulator.
    +        wₜₒₜ += wᵢ
    +    end
    +    # Return the normalized interpolated value.
    +    return interpolated_value / wₜₒₜ
    +end

    When you have holes, then you have to be careful about the order you iterate around points.

    Specifically, you have to iterate around each linear ring separately and ensure there are no degenerate/repeated points at the start and end!

    julia
    function barycentric_interpolate(::MeanValue, exterior::AbstractVector{<: Point{N, T1}}, interiors::AbstractVector{<: AbstractVector{<: Point{N, T1}}}, values::AbstractVector{V}, point::Point{N, T2}) where {N, T1 <: Real, T2 <: Real, V}
    +    # @boundscheck @assert length(values) == (length(exterior) + isempty(interiors) ? 0 : sum(length.(interiors)))
    +    # @boundscheck @assert length(exterior) >= 3
    +
    +    current_index = 1
    +    l_exterior = length(exterior)
    +
    +    sᵢ₋₁ = exterior[end] - point
    +    sᵢ   = exterior[begin] - point
    +    sᵢ₊₁ = exterior[begin+1] - point
    +    rᵢ₋₁ = norm(sᵢ₋₁) # radius / Euclidean distance between points.
    +    rᵢ   = norm(sᵢ  ) # radius / Euclidean distance between points.
    +    rᵢ₊₁ = norm(sᵢ₊₁) # radius / Euclidean distance between points.

    Now, we set the interpolated value to the first point's value, multiplied by the weight computed relative to the first point in the polygon.

    julia
        wᵢ = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +    wₜₒₜ = wᵢ
    +    interpolated_value = values[begin] * wᵢ
    +
    +    for i in 2:l_exterior

    Increment counters + set variables

    julia
            sᵢ₋₁ = sᵢ
    +        sᵢ   = sᵢ₊₁
    +        sᵢ₊₁ = exterior[mod1(i+1, l_exterior)] - point
    +        rᵢ₋₁ = rᵢ
    +        rᵢ   = rᵢ₊₁
    +        rᵢ₊₁ = norm(sᵢ₊₁) # radius / Euclidean distance between points.
    +        wᵢ = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ

    Updates - first the interpolated value,

    julia
            interpolated_value += values[current_index] * wᵢ

    then the accumulators for total weight and current index.

    julia
            wₜₒₜ += wᵢ
    +        current_index += 1
    +
    +    end
    +    for hole in interiors
    +        l_hole = length(hole)
    +        sᵢ₋₁ = hole[end] - point
    +        sᵢ   = hole[begin] - point
    +        sᵢ₊₁ = hole[begin+1] - point
    +        rᵢ₋₁ = norm(sᵢ₋₁) # radius / Euclidean distance between points.
    +        rᵢ   = norm(sᵢ  ) # radius / Euclidean distance between points.
    +        rᵢ₊₁ = norm(sᵢ₊₁) # radius / Euclidean distance between points.
    +        # Now, we set the interpolated value to the first point's value, multiplied
    +        # by the weight computed relative to the first point in the polygon.
    +        wᵢ = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +
    +        interpolated_value += values[current_index] * wᵢ
    +
    +        wₜₒₜ += wᵢ
    +        current_index += 1
    +
    +        for i in 2:l_hole
    +            # Increment counters + set variables
    +            sᵢ₋₁ = sᵢ
    +            sᵢ   = sᵢ₊₁
    +            sᵢ₊₁ = hole[mod1(i+1, l_hole)] - point
    +            rᵢ₋₁ = rᵢ
    +            rᵢ   = rᵢ₊₁
    +            rᵢ₊₁ = norm(sᵢ₊₁) ## radius / Euclidean distance between points.
    +            wᵢ = (t_value(sᵢ₋₁, sᵢ, rᵢ₋₁, rᵢ) + t_value(sᵢ, sᵢ₊₁, rᵢ, rᵢ₊₁)) / rᵢ
    +            interpolated_value += values[current_index] * wᵢ
    +            wₜₒₜ += wᵢ
    +            current_index += 1
    +        end
    +    end
    +    return interpolated_value / wₜₒₜ
    +
    +end
    +
    +struct Wachspress <: AbstractBarycentricCoordinateMethod
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/buffer.html b/previews/PR239/source/methods/buffer.html new file mode 100644 index 000000000..7c97d5d89 --- /dev/null +++ b/previews/PR239/source/methods/buffer.html @@ -0,0 +1,35 @@ + + + + + + Buffer | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Buffer

    Buffering a geometry means computing the region distance away from it, and returning that region as the new geometry.

    As of now, we only support GEOS as the backend, meaning that LibGEOS must be loaded.

    julia
    function buffer(geometry, distance; kwargs...)
    +    buffered = buffer(GEOS(; kwargs...), geometry, distance)
    +    return tuples(buffered)
    +end

    Below is an error handler similar to the others we have for e.g. segmentize, which checks if there is a method error for the geos backend.

    Add an error hint for buffer if LibGEOS is not loaded!

    julia
    function _buffer_error_hinter(io, exc, argtypes, kwargs)
    +    if isnothing(Base.get_extension(GeometryOps, :GeometryOpsLibGEOSExt)) && exc.f == buffer && first(argtypes) == GEOS
    +        print(io, "\n\nThe `buffer` method requires the LibGEOS.jl package to be explicitly loaded.\n")
    +        print(io, "You can do this by simply typing ")
    +        printstyled(io, "using LibGEOS"; color = :cyan, bold = true)
    +        println(io, " in your REPL, \nor otherwise loading LibGEOS.jl via using or import.")
    +    end
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/centroid.html b/previews/PR239/source/methods/centroid.html new file mode 100644 index 000000000..447649a24 --- /dev/null +++ b/previews/PR239/source/methods/centroid.html @@ -0,0 +1,117 @@ + + + + + + Centroid | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Centroid

    julia
    export centroid, centroid_and_length, centroid_and_area

    What is the centroid?

    The centroid is the geometric center of a line string or area(s). Note that the centroid does not need to be inside of a concave area.

    Further note that by convention a line, or linear ring, is calculated by weighting the line segments by their length, while polygons and multipolygon centroids are calculated by weighting edge's by their 'area components'.

    To provide an example, consider this concave polygon in the shape of a 'C':

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +cshape = GI.Polygon([[(0,0), (0,3), (3,3), (3,2), (1,2), (1,1), (3,1), (3,0), (0,0)]])
    +f, a, p = poly(collect(GI.getpoint(cshape)); axis = (; aspect = DataAspect()))

    Let's see what the centroid looks like (plotted in red):

    julia
    cent = GO.centroid(cshape)
    +scatter!(GI.x(cent), GI.y(cent), color = :red)
    +f

    Implementation

    This is the GeoInterface-compatible implementation.

    First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait. This is also used in the implementation, since it's a lot less work!

    Note that if you call centroid on a LineString or LinearRing, the centroid_and_length function will be called due to the weighting scheme described above, while centroid_and_area is called for polygons and multipolygons. However, centroid_and_area can still be called on a LineString or LinearRing when they are closed, for example as the interior hole of a polygon.

    The helper functions centroid_and_length and centroid_and_area are made available just in case the user also needs the area or length to decrease repeat computation.

    julia
    """
    +    centroid(geom, [T=Float64])::Tuple{T, T}
    +
    +Returns the centroid of a given line segment, linear ring, polygon, or
    +mutlipolygon.
    +"""
    +centroid(geom, ::Type{T} = Float64; threaded=false) where T =
    +    centroid(GI.trait(geom), geom, T; threaded)
    +function centroid(
    +    trait::Union{GI.LineStringTrait, GI.LinearRingTrait}, geom, ::Type{T}=Float64; threaded=false
    +) where T
    +    centroid_and_length(trait, geom, T)[1]
    +end
    +centroid(trait, geom, ::Type{T}; threaded=false) where T =
    +    centroid_and_area(geom, T; threaded)[1]
    +
    +"""
    +    centroid_and_length(geom, [T=Float64])::(::Tuple{T, T}, ::Real)
    +
    +Returns the centroid and length of a given line/ring. Note this is only valid
    +for line strings and linear rings.
    +"""
    +centroid_and_length(geom, ::Type{T}=Float64) where T =
    +    centroid_and_length(GI.trait(geom), geom, T)
    +function centroid_and_length(
    +    ::Union{GI.LineStringTrait, GI.LinearRingTrait}, geom, ::Type{T},
    +) where T

    Initialize starting values

    julia
        xcentroid = T(0)
    +    ycentroid = T(0)
    +    length = T(0)
    +    point₁ = GI.getpoint(geom, 1)

    Loop over line segments of line string

    julia
        for point₂ in GI.getpoint(geom)

    Calculate length of line segment

    julia
            length_component = sqrt(
    +            (GI.x(point₂) - GI.x(point₁))^2 +
    +            (GI.y(point₂) - GI.y(point₁))^2
    +        )

    Accumulate the line segment length into length

    julia
            length += length_component

    Weighted average of line segment centroids

    julia
            xcentroid += (GI.x(point₁) + GI.x(point₂)) * (length_component / 2)
    +        ycentroid += (GI.y(point₁) + GI.y(point₂)) * (length_component / 2)
    +        #centroid = centroid .+ ((point₁ .+ point₂) .* (length_component / 2))

    Advance the point buffer by 1 point to move to next line segment

    julia
            point₁ = point₂
    +    end
    +    xcentroid /= length
    +    ycentroid /= length
    +    return (xcentroid, ycentroid), length
    +end
    +
    +"""
    +    centroid_and_area(geom, [T=Float64])::(::Tuple{T, T}, ::Real)
    +
    +Returns the centroid and area of a given geometry.
    +"""
    +function centroid_and_area(geom, ::Type{T}=Float64; threaded=false) where T
    +    target = TraitTarget{Union{GI.PolygonTrait,GI.LineStringTrait,GI.LinearRingTrait}}()
    +    init = (zero(T), zero(T)), zero(T)
    +    applyreduce(_combine_centroid_and_area, target, geom; threaded, init) do g
    +        _centroid_and_area(GI.trait(g), g, T)
    +    end
    +end
    +
    +function _centroid_and_area(
    +    ::Union{GI.LineStringTrait, GI.LinearRingTrait}, geom, ::Type{T}
    +) where T

    Check that the geometry is closed

    julia
        @assert(
    +        GI.getpoint(geom, 1) == GI.getpoint(geom, GI.ngeom(geom)),
    +        "centroid_and_area should only be used with closed geometries"
    +    )

    Initialize starting values

    julia
        xcentroid = T(0)
    +    ycentroid = T(0)
    +    area = T(0)
    +    point₁ = GI.getpoint(geom, 1)

    Loop over line segments of linear ring

    julia
        for point₂ in GI.getpoint(geom)
    +        area_component = GI.x(point₁) * GI.y(point₂) -
    +            GI.x(point₂) * GI.y(point₁)

    Accumulate the area component into area

    julia
            area += area_component

    Weighted average of centroid components

    julia
            xcentroid += (GI.x(point₁) + GI.x(point₂)) * area_component
    +        ycentroid += (GI.y(point₁) + GI.y(point₂)) * area_component

    Advance the point buffer by 1 point

    julia
            point₁ = point₂
    +    end
    +    area /= 2
    +    xcentroid /= 6area
    +    ycentroid /= 6area
    +    return (xcentroid, ycentroid), abs(area)
    +end
    +function _centroid_and_area(::GI.PolygonTrait, geom, ::Type{T}) where T

    Exterior ring's centroid and area

    julia
        (xcentroid, ycentroid), area = centroid_and_area(GI.getexterior(geom), T)

    Weight exterior centroid by area

    julia
        xcentroid *= area
    +    ycentroid *= area

    Loop over any holes within the polygon

    julia
        for hole in GI.gethole(geom)

    Hole polygon's centroid and area

    julia
            (xinterior, yinterior), interior_area = centroid_and_area(hole, T)

    Accumulate the area component into area

    julia
            area -= interior_area

    Weighted average of centroid components

    julia
            xcentroid -= xinterior * interior_area
    +        ycentroid -= yinterior * interior_area
    +    end
    +    xcentroid /= area
    +    ycentroid /= area
    +    return (xcentroid, ycentroid), area
    +end

    The op argument for _applyreduce and point / area It combines two (point, area) tuples into one, taking the average of the centroid points weighted by the area of the geom they are from.

    julia
    function _combine_centroid_and_area(((x1, y1), area1), ((x2, y2), area2))
    +    area = area1 + area2
    +    x = (x1 * area1 + x2 * area2) / area
    +    y = (y1 * area1 + y2 * area2) / area
    +    return (x, y), area
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/clipping/clipping_processor.html b/previews/PR239/source/methods/clipping/clipping_processor.html new file mode 100644 index 000000000..7dd28d678 --- /dev/null +++ b/previews/PR239/source/methods/clipping/clipping_processor.html @@ -0,0 +1,532 @@ + + + + + + Polygon clipping helpers | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Polygon clipping helpers

    This file contains the shared helper functions for the polygon clipping functionalities.

    This enum defines which side of an edge a point is on

    julia
    @enum PointEdgeSide left=1 right=2 unknown=3

    Constants assigned for readability

    julia
    const enter, exit = true, false
    +const crossing, bouncing = true, false
    +
    +#= A point can either be the start or end of an overlapping chain of points between two
    +polygons, or not an endpoint of a chain. =#
    +@enum EndPointType start_chain=1 end_chain=2 not_endpoint=3
    +
    +#= This is the struct that makes up a_list and b_list. Many values are only used if point is
    +an intersection point (ipt). =#
    +@kwdef struct PolyNode{T <: AbstractFloat}
    +    point::Tuple{T,T}          # (x, y) values of given point
    +    inter::Bool = false        # If ipt, true, else 0
    +    neighbor::Int = 0          # If ipt, index of equivalent point in a_list or b_list, else 0
    +    idx::Int = 0               # If crossing point, index within sorted a_idx_list
    +    ent_exit::Bool = false     # If ipt, true if enter and false if exit, else false
    +    crossing::Bool = false     # If ipt, true if intersection crosses from out/in polygon, else false
    +    endpoint::EndPointType = not_endpoint # If ipt, denotes if point is the start or end of an overlapping chain
    +    fracs::Tuple{T,T} = (0., 0.) # If ipt, fractions along edges to ipt (a_frac, b_frac), else (0, 0)
    +end
    +
    +#= Create a new node with all of the same field values as the given PolyNode unless
    +alternative values are provided, in which case those should be used. =#
    +PolyNode(node::PolyNode{T};
    +    point = node.point, inter = node.inter, neighbor = node.neighbor, idx = node.idx,
    +    ent_exit = node.ent_exit, crossing = node.crossing, endpoint = node.endpoint,
    +    fracs = node.fracs,
    +) where T = PolyNode{T}(;
    +    point = point, inter = inter, neighbor = neighbor, idx = idx, ent_exit = ent_exit,
    +    crossing = crossing, endpoint = endpoint, fracs = fracs)

    Checks equality of two PolyNodes by backing point value, fractional value, and intersection status

    julia
    equals(pn1::PolyNode, pn2::PolyNode) = pn1.point == pn2.point && pn1.inter == pn2.inter && pn1.fracs == pn2.fracs
    _build_ab_list(::Type{T}, poly_a, poly_b, delay_cross_f, delay_bounce_f; exact) ->
    +    (a_list, b_list, a_idx_list)

    This function takes in two polygon rings and calls '_build_a_list', '_build_b_list', and '_flag_ent_exit' in order to fully form a_list and b_list. The 'a_list' and 'b_list' that it returns are the fully updated vectors of PolyNodes that represent the rings 'poly_a' and 'poly_b', respectively. This function also returns 'a_idx_list', which at its "ith" index stores the index in 'a_list' at which the "ith" intersection point lies.

    julia
    function _build_ab_list(::Type{T}, poly_a, poly_b, delay_cross_f::F1, delay_bounce_f::F2; exact) where {T, F1, F2}

    Make a list for nodes of each polygon

    julia
        a_list, a_idx_list, n_b_intrs = _build_a_list(T, poly_a, poly_b; exact)
    +    b_list = _build_b_list(T, a_idx_list, a_list, n_b_intrs, poly_b)

    Flag crossings

    julia
        _classify_crossing!(T, a_list, b_list; exact)

    Flag the entry and exits

    julia
        _flag_ent_exit!(T, GI.LinearRingTrait(), poly_b, a_list, delay_cross_f, Base.Fix2(delay_bounce_f, true); exact)
    +    _flag_ent_exit!(T, GI.LinearRingTrait(), poly_a, b_list, delay_cross_f, Base.Fix2(delay_bounce_f, false); exact)

    Set node indices and filter a_idx_list to just crossing points

    julia
        _index_crossing_intrs!(a_list, b_list, a_idx_list)
    +
    +    return a_list, b_list, a_idx_list
    +end
    _build_a_list(::Type{T}, poly_a, poly_b) -> (a_list, a_idx_list)

    This function take in two polygon rings and creates a vector of PolyNodes to represent poly_a, including its intersection points with poly_b. The information stored in each PolyNode is needed for clipping using the Greiner-Hormann clipping algorithm.

    Note: After calling this function, a_list is not fully formed because the neighboring indices of the intersection points in b_list still need to be updated. Also we still have not update the entry and exit flags for a_list.

    The a_idx_list is a list of the indices of intersection points in a_list. The value at index i of a_idx_list is the location in a_list where the ith intersection point lies.

    julia
    function _build_a_list(::Type{T}, poly_a, poly_b; exact) where T
    +    n_a_edges = _nedge(poly_a)
    +    a_list = PolyNode{T}[]  # list of points in poly_a
    +    sizehint!(a_list, n_a_edges)
    +    a_idx_list = Vector{Int}()  # finds indices of intersection points in a_list
    +    a_count = 0  # number of points added to a_list
    +    n_b_intrs = 0

    Loop through points of poly_a

    julia
        local a_pt1
    +    for (i, a_p2) in enumerate(GI.getpoint(poly_a))
    +        a_pt2 = (T(GI.x(a_p2)), T(GI.y(a_p2)))
    +        if i <= 1 || (a_pt1 == a_pt2)  # don't repeat points
    +            a_pt1 = a_pt2
    +            continue
    +        end

    Add the first point of the edge to the list of points in a_list

    julia
            new_point = PolyNode{T}(;point = a_pt1)
    +        a_count += 1
    +        push!(a_list, new_point)

    Find intersections with edges of poly_b

    julia
            local b_pt1
    +        prev_counter = a_count
    +        for (j, b_p2) in enumerate(GI.getpoint(poly_b))
    +            b_pt2 = _tuple_point(b_p2, T)
    +            if j <= 1 || (b_pt1 == b_pt2)  # don't repeat points
    +                b_pt1 = b_pt2
    +                continue
    +            end

    Determine if edges intersect and how they intersect

    julia
                line_orient, intr1, intr2 = _intersection_point(T, (a_pt1, a_pt2), (b_pt1, b_pt2); exact)
    +            if line_orient != line_out  # edges intersect
    +                if line_orient == line_cross  # Intersection point that isn't a vertex
    +                    int_pt, fracs = intr1
    +                    new_intr = PolyNode{T}(;
    +                        point = int_pt, inter = true, neighbor = j - 1,
    +                        crossing = true, fracs = fracs,
    +                    )
    +                    a_count += 1
    +                    n_b_intrs += 1
    +                    push!(a_list, new_intr)
    +                    push!(a_idx_list, a_count)
    +                else
    +                    (_, (α1, β1)) = intr1

    Determine if a1 or b1 should be added to a_list

    julia
                        add_a1 = α1 == 0 && 0 β1 < 1
    +                    a1_β = add_a1 ? β1 : zero(T)
    +                    add_b1 = β1 == 0 && 0 < α1 < 1
    +                    b1_α = add_b1 ? α1 : zero(T)

    If lines are collinear and overlapping, a second intersection exists

    julia
                        if line_orient == line_over
    +                        (_, (α2, β2)) = intr2
    +                        if α2 == 0 && 0 β2 < 1
    +                            add_a1, a1_β = true, β2
    +                        end
    +                        if β2 == 0 && 0 < α2 < 1
    +                            add_b1, b1_α = true, α2
    +                        end
    +                    end

    Add intersection points determined above

    julia
                        if add_a1
    +                        n_b_intrs += a1_β == 0 ? 0 : 1
    +                        a_list[prev_counter] = PolyNode{T}(;
    +                            point = a_pt1, inter = true, neighbor = j - 1,
    +                            fracs = (zero(T), a1_β),
    +                        )
    +                        push!(a_idx_list, prev_counter)
    +                    end
    +                    if add_b1
    +                        new_intr = PolyNode{T}(;
    +                            point = b_pt1, inter = true, neighbor = j - 1,
    +                            fracs = (b1_α, zero(T)),
    +                        )
    +                        a_count += 1
    +                        push!(a_list, new_intr)
    +                        push!(a_idx_list, a_count)
    +                    end
    +                end
    +            end
    +            b_pt1 = b_pt2
    +        end

    Order intersection points by placement along edge using fracs value

    julia
            if prev_counter < a_count
    +            Δintrs = a_count - prev_counter
    +            inter_points = @view a_list[(a_count - Δintrs + 1):a_count]
    +            sort!(inter_points, by = x -> x.fracs[1])
    +        end
    +        a_pt1 = a_pt2
    +    end
    +    return a_list, a_idx_list, n_b_intrs
    +end
    _build_b_list(::Type{T}, a_idx_list, a_list, poly_b) -> b_list

    This function takes in the a_list and a_idx_list build in _build_a_list and poly_b and creates a vector of PolyNodes to represent poly_b. The information stored in each PolyNode is needed for clipping using the Greiner-Hormann clipping algorithm.

    Note: after calling this function, b_list is not fully updated. The entry/exit flags still need to be updated. However, the neighbor value in a_list is now updated.

    julia
    function _build_b_list(::Type{T}, a_idx_list, a_list, n_b_intrs, poly_b) where T

    Sort intersection points by insertion order in b_list

    julia
        sort!(a_idx_list, by = x-> a_list[x].neighbor + a_list[x].fracs[2])

    Initialize needed values and lists

    julia
        n_b_edges = _nedge(poly_b)
    +    n_intr_pts = length(a_idx_list)
    +    b_list = PolyNode{T}[]
    +    sizehint!(b_list, n_b_edges + n_b_intrs)
    +    intr_curr = 1
    +    b_count = 0

    Loop over points in poly_b and add each point and intersection point

    julia
        local b_pt1
    +    for (i, b_p2) in enumerate(GI.getpoint(poly_b))
    +        b_pt2 = _tuple_point(b_p2, T)
    +        if i  1 || (b_pt1 == b_pt2)  # don't repeat points
    +            b_pt1 = b_pt2
    +            continue
    +        end
    +        b_count += 1
    +        push!(b_list, PolyNode{T}(; point = b_pt1))
    +        if intr_curr  n_intr_pts
    +            curr_idx = a_idx_list[intr_curr]
    +            curr_node = a_list[curr_idx]
    +            prev_counter = b_count
    +            while curr_node.neighbor == i - 1  # Add all intersection points on current edge
    +                b_idx = 0
    +                new_intr = PolyNode(curr_node; neighbor = curr_idx)
    +                if curr_node.fracs[2] == 0  # if curr_node is segment start point

    intersection point is vertex of b

    julia
                        b_idx = prev_counter
    +                    b_list[b_idx] = new_intr
    +                else
    +                    b_count += 1
    +                    b_idx = b_count
    +                    push!(b_list, new_intr)
    +                end
    +                a_list[curr_idx] = PolyNode(curr_node; neighbor = b_idx)
    +                intr_curr += 1
    +                intr_curr > n_intr_pts && break
    +                curr_idx = a_idx_list[intr_curr]
    +                curr_node = a_list[curr_idx]
    +            end
    +        end
    +        b_pt1 = b_pt2
    +    end
    +    sort!(a_idx_list)  # return a_idx_list to order of points in a_list
    +    return b_list
    +end
    _classify_crossing!(T, poly_b, a_list; exact)

    This function marks all intersection points as either bouncing or crossing points. "Delayed" crossing or bouncing intersections (a chain of edges where the central edges overlap and thus only the first and last edge of the chain determine if the chain is bounding or crossing) are marked as follows: the first and the last points are marked as crossing if the chain is crossing and delayed otherwise and all middle points are marked as bouncing. Additionally, the start and end points of the chain are marked as endpoints using the endpoints field.

    julia
    function _classify_crossing!(::Type{T}, a_list, b_list; exact) where T
    +    napts = length(a_list)
    +    nbpts = length(b_list)

    start centered on last point

    julia
        a_prev = a_list[end - 1]
    +    curr_pt = a_list[end]
    +    i = napts

    keep track of unmatched bouncing chains

    julia
        start_chain_edge, start_chain_idx = unknown, 0
    +    unmatched_end_chain_edge, unmatched_end_chain_idx = unknown, 0
    +    same_winding = true

    loop over list points

    julia
        for next_idx in 1:napts
    +        a_next = a_list[next_idx]
    +        if curr_pt.inter && !curr_pt.crossing
    +            j = curr_pt.neighbor
    +            b_prev = j == 1 ? b_list[end] : b_list[j-1]
    +            b_next = j == nbpts ? b_list[1] : b_list[j+1]

    determine if any segments are on top of one another

    julia
                a_prev_is_b_prev = a_prev.inter && equals(a_prev, b_prev)
    +            a_prev_is_b_next = a_prev.inter && equals(a_prev, b_next)
    +            a_next_is_b_prev = a_next.inter && equals(a_next, b_prev)
    +            a_next_is_b_next = a_next.inter && equals(a_next, b_next)

    determine which side of a segments the p points are on

    julia
                b_prev_side, b_next_side = _get_sides(b_prev, b_next, a_prev, curr_pt, a_next,
    +                i, j, a_list, b_list; exact)

    no sides overlap

    julia
                if !a_prev_is_b_prev && !a_prev_is_b_next && !a_next_is_b_prev && !a_next_is_b_next
    +                if b_prev_side != b_next_side  # lines cross
    +                    a_list[i] = PolyNode(curr_pt; crossing = true)
    +                    b_list[j] = PolyNode(b_list[j]; crossing = true)
    +                end

    end of overlapping chain

    julia
                elseif !a_next_is_b_prev && !a_next_is_b_next
    +                b_side = a_prev_is_b_prev ? b_next_side : b_prev_side
    +                if start_chain_edge == unknown  # start loop on overlapping chain
    +                    unmatched_end_chain_edge = b_side
    +                    unmatched_end_chain_idx = i
    +                    same_winding = a_prev_is_b_prev
    +                else  # close overlapping chain

    update end of chain with endpoint and crossing / bouncing tags

    julia
                        crossing = b_side != start_chain_edge
    +                    a_list[i] = PolyNode(curr_pt;
    +                        crossing = crossing,
    +                        endpoint = end_chain,
    +                    )
    +                    b_list[j] = PolyNode(b_list[j];
    +                        crossing = crossing,
    +                        endpoint = same_winding ? end_chain : start_chain,
    +                    )

    update start of chain with endpoint and crossing / bouncing tags

    julia
                        start_pt = a_list[start_chain_idx]
    +                    a_list[start_chain_idx] = PolyNode(start_pt;
    +                        crossing = crossing,
    +                        endpoint = start_chain,
    +                    )
    +                    b_list[start_pt.neighbor] = PolyNode(b_list[start_pt.neighbor];
    +                        crossing = crossing,
    +                        endpoint = same_winding ? start_chain : end_chain,
    +                    )
    +                end

    start of overlapping chain

    julia
                elseif !a_prev_is_b_prev && !a_prev_is_b_next
    +                b_side = a_next_is_b_prev ? b_next_side : b_prev_side
    +                start_chain_edge = b_side
    +                start_chain_idx = i
    +                same_winding = a_next_is_b_next
    +            end
    +        end
    +        a_prev = curr_pt
    +        curr_pt = a_next
    +        i = next_idx
    +    end

    if we started in the middle of overlapping chain, close chain

    julia
        if unmatched_end_chain_edge != unknown
    +        crossing = unmatched_end_chain_edge != start_chain_edge

    update end of chain with endpoint and crossing / bouncing tags

    julia
            end_chain_pt = a_list[unmatched_end_chain_idx]
    +        a_list[unmatched_end_chain_idx] = PolyNode(end_chain_pt;
    +            crossing = crossing,
    +            endpoint = end_chain,
    +        )
    +        b_list[end_chain_pt.neighbor] = PolyNode(b_list[end_chain_pt.neighbor];
    +            crossing = crossing,
    +            endpoint = same_winding ? end_chain : start_chain,
    +        )

    update start of chain with endpoint and crossing / bouncing tags

    julia
            start_pt = a_list[start_chain_idx]
    +        a_list[start_chain_idx] = PolyNode(start_pt;
    +            crossing = crossing,
    +            endpoint = start_chain,
    +        )
    +        b_list[start_pt.neighbor] = PolyNode(b_list[start_pt.neighbor];
    +            crossing = crossing,
    +            endpoint = same_winding ? start_chain : end_chain,
    +        )
    +    end
    +end

    Check if PolyNode is a vertex of original polygon

    julia
    _is_vertex(pt) = !pt.inter || pt.fracs[1] == 0 || pt.fracs[1] == 1 || pt.fracs[2] == 0 || pt.fracs[2] == 1
    +
    +#= Determines which side (right or left) of the segment a_prev-curr_pt-a_next the points
    +b_prev and b_next are on. Given this is only called when curr_pt is an intersection point
    +that wasn't initially classified as crossing, we know that curr_pt is either from a hinge or
    +overlapping intersection and thus is an original vertex of either poly_a or poly_b. Due to
    +floating point error when calculating new intersection points, we only want to use original
    +vertices to determine orientation. Thus, for other points, find nearest point that is a
    +vertex. Given other intersection points will be collinear along existing segments, this
    +won't change the orientation. =#
    +function _get_sides(b_prev, b_next, a_prev, curr_pt, a_next, i, j, a_list, b_list; exact)
    +    b_prev_pt = if _is_vertex(b_prev)
    +        b_prev.point
    +    else  # Find original start point of segment formed by b_prev and curr_pt
    +        prev_idx = findprev(_is_vertex, b_list, j - 1)
    +        prev_idx = isnothing(prev_idx) ? findlast(_is_vertex, b_list) : prev_idx
    +        b_list[prev_idx].point
    +    end
    +    b_next_pt = if _is_vertex(b_next)
    +        b_next.point
    +    else  # Find original end point of segment formed by curr_pt and b_next
    +        next_idx = findnext(_is_vertex, b_list, j + 1)
    +        next_idx = isnothing(next_idx) ? findfirst(_is_vertex, b_list) : next_idx
    +        b_list[next_idx].point
    +    end
    +    a_prev_pt = if _is_vertex(a_prev)
    +        a_prev.point
    +    else   # Find original start point of segment formed by a_prev and curr_pt
    +        prev_idx = findprev(_is_vertex, a_list, i - 1)
    +        prev_idx = isnothing(prev_idx) ? findlast(_is_vertex, a_list) : prev_idx
    +        a_list[prev_idx].point
    +    end
    +    a_next_pt = if _is_vertex(a_next)
    +        a_next.point
    +    else  # Find original end point of segment formed by curr_pt and a_next
    +        next_idx = findnext(_is_vertex, a_list, i + 1)
    +        next_idx = isnothing(next_idx) ? findfirst(_is_vertex, a_list) : next_idx
    +        a_list[next_idx].point
    +    end

    Determine side orientation of b_prev and b_next

    julia
        b_prev_side = _get_side(b_prev_pt, a_prev_pt, curr_pt.point, a_next_pt; exact)
    +    b_next_side = _get_side(b_next_pt, a_prev_pt, curr_pt.point, a_next_pt; exact)
    +    return b_prev_side, b_next_side
    +end

    Determines if Q lies to the left or right of the line formed by P1-P2-P3

    julia
    function _get_side(Q, P1, P2, P3; exact)
    +    s1 = Predicates.orient(Q, P1, P2; exact)
    +    s2 = Predicates.orient(Q, P2, P3; exact)
    +    s3 = Predicates.orient(P1, P2, P3; exact)
    +
    +    side = if s3  0
    +        (s1 < 0) || (s2 < 0) ? right : left
    +    else #  s3 < 0
    +        (s1 > 0) || (s2 > 0) ? left : right
    +    end
    +    return side
    +end
    +
    +#= Given a list of PolyNodes, find the first element that isn't an intersection point. Then,
    +test if this element is in or out of the given polygon. Return the next index, as well as
    +the enter/exit status of the next intersection point (the opposite of the in/out check). If
    +all points are intersection points, find the first element that either is the end of a chain
    +or a crossing point that isn't in a chain. Then take the midpoint of this point and the next
    +point in the list and perform the in/out check. If none of these points exist, return
    +a `next_idx` of `nothing`. =#
    +function _pt_off_edge_status(::Type{T}, pt_list, poly, npts; exact) where T
    +    start_idx, is_non_intr_pt = findfirst(_is_not_intr, pt_list), true
    +    if isnothing(start_idx)
    +        start_idx, is_non_intr_pt = findfirst(_next_edge_off, pt_list), false
    +        isnothing(start_idx) && return (start_idx, false)
    +    end
    +    next_idx = start_idx < npts ? (start_idx + 1) : 1
    +    start_pt = if is_non_intr_pt
    +        pt_list[start_idx].point
    +    else
    +        (pt_list[start_idx].point .+ pt_list[next_idx].point) ./ 2
    +    end
    +    start_status = !_point_filled_curve_orientation(start_pt, poly; in = true, on = false, out = false, exact)
    +    return next_idx, start_status
    +end

    Check if a PolyNode is an intersection point

    julia
    _is_not_intr(pt) = !pt.inter
    +#= Check if a PolyNode is the last point of a chain or a non-overlapping crossing point.
    +The next midpoint of one of these points and the next point within a polygon must not be on
    +the polygon edge. =#
    +_next_edge_off(pt) = (pt.endpoint == end_chain) || (pt.crossing && pt.endpoint == not_endpoint)
    _flag_ent_exit!(::Type{T}, ::GI.LinearRingTrait, poly, pt_list, delay_cross_f, delay_bounce_f; exact)

    This function flags all the intersection points as either an 'entry' or 'exit' point in relation to the given polygon. For non-delayed crossings we simply alternate the enter/exit status. This also holds true for the first and last points of a delayed bouncing, where they both have an opposite entry/exit flag. Conversely, the first and last point of a delayed crossing have the same entry/exit status. Furthermore, the crossing/bouncing flag of delayed crossings and bouncings may be updated. This depends on function specific rules that determine which of the start or end points (if any) should be marked as crossing for used during polygon tracing. A consistent rule is that the start and end points of a delayed crossing will have different crossing/bouncing flags, while a the endpoints of a delayed bounce will be the same.

    Used for clipping polygons by other polygons.

    julia
    function _flag_ent_exit!(::Type{T}, ::GI.LinearRingTrait, poly, pt_list, delay_cross_f, delay_bounce_f; exact) where T
    +    npts = length(pt_list)

    Find starting index if there is one

    julia
        next_idx, status = _pt_off_edge_status(T, pt_list, poly, npts; exact)
    +    isnothing(next_idx) && return
    +    start_idx = next_idx - 1

    Loop over points and mark entry and exit status

    julia
        start_chain_idx = 0
    +    for ii in Iterators.flatten((next_idx:npts, 1:start_idx))
    +        curr_pt = pt_list[ii]
    +        if curr_pt.endpoint == start_chain
    +            start_chain_idx = ii
    +        elseif curr_pt.crossing || curr_pt.endpoint == end_chain
    +            start_crossing, end_crossing = curr_pt.crossing, curr_pt.crossing
    +            if curr_pt.endpoint == end_chain  # ending overlapping chain
    +                start_pt = pt_list[start_chain_idx]
    +                if curr_pt.crossing  # delayed crossing
    +                    #= start and end crossing status are different and depend on current
    +                    entry/exit status =#
    +                    start_crossing, end_crossing = delay_cross_f(status)
    +                else  # delayed bouncing
    +                    next_idx = ii < npts ? (ii + 1) : 1
    +                    next_val = (curr_pt.point .+ pt_list[next_idx].point) ./ 2
    +                    pt_in_poly = _point_filled_curve_orientation(next_val, poly; in = true, on = false, out = false, exact)
    +                    #= start and end crossing status are the same and depend on if adjacent
    +                    edges of pt_list are within poly =#
    +                    start_crossing = delay_bounce_f(pt_in_poly)
    +                    end_crossing = start_crossing
    +                end

    update start of chain point

    julia
                    pt_list[start_chain_idx] = PolyNode(start_pt; ent_exit = status, crossing = start_crossing)
    +                if !curr_pt.crossing
    +                    status = !status
    +                end
    +            end
    +            pt_list[ii] = PolyNode(curr_pt; ent_exit = status, crossing = end_crossing)
    +            status = !status
    +        end
    +    end
    +    return
    +end
    _flag_ent_exit!(::GI.LineTrait, line, pt_list; exact)

    This function flags all the intersection points as either an 'entry' or 'exit' point in relation to the given line. Returns true if there are crossing points to classify, else returns false. Used for cutting polygons by lines.

    Assumes that the first point is outside of the polygon and not on an edge.

    julia
    function _flag_ent_exit!(::GI.LineTrait, poly, pt_list; exact)
    +    status = !_point_filled_curve_orientation(pt_list[1].point, poly; in = true, on = false, out = false, exact)

    Loop over points and mark entry and exit status

    julia
        for (ii, curr_pt) in enumerate(pt_list)
    +        if curr_pt.crossing
    +            pt_list[ii] = PolyNode(curr_pt; ent_exit = status)
    +            status = !status
    +        end
    +    end
    +    return
    +end
    +
    +#= Filters a_idx_list to just include crossing points and sets the index of all crossing
    +points (which element they correspond to within a_idx_list). =#
    +function _index_crossing_intrs!(a_list, b_list, a_idx_list)
    +    filter!(x -> a_list[x].crossing, a_idx_list)
    +    for (i, a_idx) in enumerate(a_idx_list)
    +        curr_node = a_list[a_idx]
    +        neighbor_node = b_list[curr_node.neighbor]
    +        a_list[a_idx] = PolyNode(curr_node; idx = i)
    +        b_list[curr_node.neighbor] = PolyNode(neighbor_node; idx = i)
    +    end
    +    return
    +end
    _trace_polynodes(::Type{T}, a_list, b_list, a_idx_list, f_step)::Vector{GI.Polygon}

    This function takes the outputs of _build_ab_list and traces the lists to determine which polygons are formed as described in Greiner and Hormann. The function f_step determines in which direction the lists are traced. This function is different for intersection, difference, and union. f_step must take in two arguments: the most recent intersection node's entry/exit status and a boolean that is true if we are currently tracing a_list and false if we are tracing b_list. The functions used for each clipping operation are follows: - Intersection: (x, y) -> x ? 1 : (-1) - Difference: (x, y) -> (x ⊻ y) ? 1 : (-1) - Union: (x, y) -> x ? (-1) : 1

    A list of GeoInterface polygons is returned from this function.

    Note: poly_a and poly_b are temporary inputs used for debugging and can be removed eventually.

    julia
    function _trace_polynodes(::Type{T}, a_list, b_list, a_idx_list, f_step, poly_a, poly_b) where T
    +    n_a_pts, n_b_pts = length(a_list), length(b_list)
    +    total_pts = n_a_pts + n_b_pts
    +    n_cross_pts = length(a_idx_list)
    +    return_polys = Vector{_get_poly_type(T)}(undef, 0)

    Keep track of number of processed intersection points

    julia
        visited_pts = 0
    +    processed_pts = 0
    +    first_idx = 1
    +    while processed_pts < n_cross_pts
    +        curr_list, curr_npoints = a_list, n_a_pts
    +        on_a_list = true

    Find first unprocessed intersecting point in subject polygon

    julia
            visited_pts += 1
    +        processed_pts += 1
    +        first_idx = findnext(x -> x != 0, a_idx_list, first_idx)
    +        idx = a_idx_list[first_idx]
    +        a_idx_list[first_idx] = 0
    +        start_pt = a_list[idx]

    Set first point in polygon

    julia
            curr = curr_list[idx]
    +        pt_list = [curr.point]
    +
    +        curr_not_start = true
    +        while curr_not_start
    +            step = f_step(curr.ent_exit, on_a_list)

    changed curr_not_intr to curr_not_same_ent_flag

    julia
                same_status, prev_status = true, curr.ent_exit
    +            while same_status
    +                @assert visited_pts < total_pts "Clipping tracing hit every point - clipping error. Please open an issue with polygons: $(GI.coordinates(poly_a)) and $(GI.coordinates(poly_b))."

    Traverse polygon either forwards or backwards

    julia
                    idx += step
    +                idx = (idx > curr_npoints) ? mod(idx, curr_npoints) : idx
    +                idx = (idx == 0) ? curr_npoints : idx

    Get current node and add to pt_list

    julia
                    curr = curr_list[idx]
    +                push!(pt_list, curr.point)
    +                if (curr.crossing || curr.endpoint != not_endpoint)

    Keep track of processed intersection points

    julia
                        same_status = curr.ent_exit == prev_status
    +                    curr_not_start = curr != start_pt && curr != b_list[start_pt.neighbor]
    +                    !curr_not_start && break
    +                    if (on_a_list && curr.crossing) || (!on_a_list && a_list[curr.neighbor].crossing)
    +                        processed_pts += 1
    +                        a_idx_list[curr.idx] = 0
    +                    end
    +                end
    +                visited_pts += 1
    +            end

    Switch to next list and next point

    julia
                curr_list, curr_npoints = on_a_list ? (b_list, n_b_pts) : (a_list, n_a_pts)
    +            on_a_list = !on_a_list
    +            idx = curr.neighbor
    +            curr = curr_list[idx]
    +        end
    +        push!(return_polys, GI.Polygon([pt_list]))
    +    end
    +    return return_polys
    +end

    Get type of polygons that will be made TODO: Increase type options

    julia
    _get_poly_type(::Type{T}) where T =
    +    GI.Polygon{false, false, Vector{GI.LinearRing{false, false, Vector{Tuple{T, T}}, Nothing, Nothing}}, Nothing, Nothing}
    _find_non_cross_orientation(a_list, b_list, a_poly, b_poly; exact)

    For polygons with no crossing intersection points, either one polygon is inside of another, or they are separate polygons with no intersection (other than an edge or point).

    Return two booleans that represent if a is inside b (potentially with shared edges / points) and visa versa if b is inside of a.

    julia
    function _find_non_cross_orientation(a_list, b_list, a_poly, b_poly; exact)
    +    non_intr_a_idx = findfirst(x -> !x.inter, a_list)
    +    non_intr_b_idx = findfirst(x -> !x.inter, b_list)
    +    #= Determine if non-intersection point is in or outside of polygon - if there isn't A
    +    non-intersection point, then all points are on the polygon edge =#
    +    a_pt_orient = isnothing(non_intr_a_idx) ? point_on :
    +        _point_filled_curve_orientation(a_list[non_intr_a_idx].point, b_poly; exact)
    +    b_pt_orient = isnothing(non_intr_b_idx) ? point_on :
    +        _point_filled_curve_orientation(b_list[non_intr_b_idx].point, a_poly; exact)
    +    a_in_b = a_pt_orient != point_out && b_pt_orient != point_in
    +    b_in_a = b_pt_orient != point_out && a_pt_orient != point_in
    +    return a_in_b, b_in_a
    +end
    _add_holes_to_polys!(::Type{T}, return_polys, hole_iterator, remove_poly_idx; exact)

    The holes specified by the hole iterator are added to the polygons in the return_polys list. If this creates more polygons, they are added to the end of the list. If this removes polygons, they are removed from the list

    julia
    function _add_holes_to_polys!(::Type{T}, return_polys, hole_iterator, remove_poly_idx; exact) where T
    +    n_polys = length(return_polys)
    +    remove_hole_idx = Int[]

    Remove set of holes from all polygons

    julia
        for i in 1:n_polys
    +        n_new_per_poly = 0
    +        for curr_hole in Iterators.map(tuples, hole_iterator) # loop through all holes
    +            curr_hole = _linearring(curr_hole)

    loop through all pieces of original polygon (new pieces added to end of list)

    julia
                for j in Iterators.flatten((i:i, (n_polys + 1):(n_polys + n_new_per_poly)))
    +                curr_poly = return_polys[j]
    +                remove_poly_idx[j] && continue
    +                curr_poly_ext = GI.nhole(curr_poly) > 0 ? GI.Polygon(StaticArrays.SVector(GI.getexterior(curr_poly))) : curr_poly
    +                in_ext, on_ext, out_ext = _line_polygon_interactions(curr_hole, curr_poly_ext; exact, closed_line = true)
    +                if in_ext  # hole is at least partially within the polygon's exterior
    +                    new_hole, new_hole_poly, n_new_pieces = _combine_holes!(T, curr_hole, curr_poly, return_polys, remove_hole_idx)
    +                    if n_new_pieces > 0
    +                        append!(remove_poly_idx, falses(n_new_pieces))
    +                        n_new_per_poly += n_new_pieces
    +                    end
    +                    if !on_ext && !out_ext  # hole is completely within exterior
    +                        push!(curr_poly.geom, new_hole)
    +                    else  # hole is partially within and outside of polygon's exterior
    +                        new_polys = difference(curr_poly_ext, new_hole_poly, T; target=GI.PolygonTrait())
    +                        n_new_polys = length(new_polys) - 1

    replace original

    julia
                            curr_poly.geom[1] = GI.getexterior(new_polys[1])
    +                        append!(curr_poly.geom, GI.gethole(new_polys[1]))
    +                        if n_new_polys > 0  # add any extra pieces
    +                            append!(return_polys, @view new_polys[2:end])
    +                            append!(remove_poly_idx, falses(n_new_polys))
    +                            n_new_per_poly += n_new_polys
    +                        end
    +                    end

    polygon is completely within hole

    julia
                    elseif coveredby(curr_poly_ext, GI.Polygon(StaticArrays.SVector(curr_hole)))
    +                    remove_poly_idx[j] = true
    +                end
    +            end
    +        end
    +        n_polys += n_new_per_poly
    +    end

    Remove all polygon that were marked for removal

    julia
        deleteat!(return_polys, remove_poly_idx)
    +    return
    +end
    _combine_holes!(::Type{T}, new_hole, curr_poly, return_polys)

    The new hole is combined with any existing holes in curr_poly. The holes can be combined into a larger hole if they are intersecting. If this happens, then the new, combined hole is returned with the original holes making up the new hole removed from curr_poly. Additionally, if the combined holes form a ring, the interior is added to the return_polys as a new polygon piece. Additionally, holes leftover after combination will be checked for it they are in the "main" polygon or in one of these new pieces and moved accordingly.

    If the holes don't touch or curr_poly has no holes, then new_hole is returned without any changes.

    julia
    function _combine_holes!(::Type{T}, new_hole, curr_poly, return_polys, remove_hole_idx) where T
    +    n_new_polys = 0
    +    empty!(remove_hole_idx)
    +    new_hole_poly = GI.Polygon(StaticArrays.SVector(new_hole))

    Combine any existing holes in curr_poly with new hole

    julia
        for (k, old_hole) in enumerate(GI.gethole(curr_poly))
    +        old_hole_poly = GI.Polygon(StaticArrays.SVector(old_hole))
    +        if intersects(new_hole_poly, old_hole_poly)

    If the holes intersect, combine them into a bigger hole

    julia
                hole_union = union(new_hole_poly, old_hole_poly, T; target = GI.PolygonTrait())[1]
    +            push!(remove_hole_idx, k + 1)
    +            new_hole = GI.getexterior(hole_union)
    +            new_hole_poly = GI.Polygon(StaticArrays.SVector(new_hole))
    +            n_pieces = GI.nhole(hole_union)
    +            if n_pieces > 0  # if the hole has a hole, then this is a new polygon piece!
    +                append!(return_polys, [GI.Polygon([h]) for h in GI.gethole(hole_union)])
    +                n_new_polys += n_pieces
    +            end
    +        end
    +    end

    Remove redundant holes

    julia
        deleteat!(curr_poly.geom, remove_hole_idx)
    +    empty!(remove_hole_idx)

    If new polygon pieces created, make sure remaining holes are in the correct piece

    julia
        @views for piece in return_polys[end - n_new_polys + 1:end]
    +        for (k, old_hole) in enumerate(GI.gethole(curr_poly))
    +            if !(k in remove_hole_idx) && within(old_hole, piece)
    +                push!(remove_hole_idx, k + 1)
    +                push!(piece.geom, old_hole)
    +            end
    +        end
    +    end
    +    deleteat!(curr_poly.geom, remove_hole_idx)
    +    return new_hole, new_hole_poly, n_new_polys
    +end
    +
    +#= Remove collinear edge points, other than the first and last edge vertex, to simplify
    +polygon - including both the exterior ring and any holes=#
    +function _remove_collinear_points!(polys, remove_idx, poly_a, poly_b)
    +    for (i, poly) in Iterators.reverse(enumerate(polys))
    +        for (j, ring) in Iterators.reverse(enumerate(GI.getring(poly)))
    +            n = length(ring.geom)

    resize and reset removing index buffer

    julia
                resize!(remove_idx, n)
    +            fill!(remove_idx, false)
    +            local p1, p2
    +            for (i, p) in enumerate(ring.geom)
    +                if i == 1
    +                    p1 = p
    +                    continue
    +                elseif i == 2
    +                    p2 = p
    +                    continue
    +                else
    +                    p3 = p

    check if p2 is approximately on the edge formed by p1 and p3 - remove if so

    julia
                        if Predicates.orient(p1, p2, p3; exact = _False()) == 0
    +                        remove_idx[i - 1] = true
    +                    end
    +                end
    +                p1, p2 = p2, p3
    +            end

    Check if the first point (which is repeated as the last point) is needed

    julia
                if Predicates.orient(ring.geom[end - 1], ring.geom[1], ring.geom[2]; exact = _False()) == 0
    +                remove_idx[1], remove_idx[end] = true, true
    +            end

    Remove unneeded collinear points

    julia
                deleteat!(ring.geom, remove_idx)

    Check if enough points are left to form a polygon

    julia
                if length(ring.geom)  (remove_idx[1] ? 2 : 3)
    +                if j == 1
    +                    deleteat!(polys, i)
    +                    break
    +                else
    +                    deleteat!(poly.geom, j)
    +                    continue
    +                end
    +            end
    +            if remove_idx[1]  # make sure the last point is repeated
    +                push!(ring.geom, ring.geom[1])
    +            end
    +        end
    +    end
    +    return
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/clipping/coverage.html b/previews/PR239/source/methods/clipping/coverage.html new file mode 100644 index 000000000..8fa9f13e4 --- /dev/null +++ b/previews/PR239/source/methods/clipping/coverage.html @@ -0,0 +1,247 @@ + + + + + + GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content
    julia
    export coverage

    What is coverage?

    Coverage is the amount of geometry area within a bounding box defined by the minimum and maximum x and y-coordinates of that bounding box, or an Extent containing that information.

    To provide an example, consider this rectangle:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +rect = GI.Polygon([[(-1,0), (-1,1), (1,1), (1,0), (-1,0)]])
    +cell = GI.Polygon([[(0, 0), (0, 2), (2, 2), (2, 0), (0, 0)]])
    +xmin, xmax, ymin, ymax = 0, 2, 0, 2
    +f, a, p = poly(collect(GI.getpoint(cell)); axis = (; aspect = DataAspect()))
    +poly!(collect(GI.getpoint(rect)))
    +f

    It is clear that half of the polygon is within the cell, so the coverage should be 1.0, half of the area of the rectangle.

    julia
    GO.coverage(rect, xmin, xmax, ymin, ymax)
    1.0

    Implementation

    This is the GeoInterface-compatible implementation. First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait. This is also used in the implementation, since it's a lot less work!

    Note that the coverage is zero for all points and curves, even if the curves are closed like with a linear ring.

    Targets for applys functions

    julia
    const _COVERAGE_TARGETS = TraitTarget{Union{GI.PolygonTrait,GI.AbstractCurveTrait,GI.MultiPointTrait,GI.PointTrait}}()

    Wall types for coverage

    julia
    const UNKNOWN, NORTH, EAST, SOUTH, WEST = 0:4
    +
    +"""
    +    coverage(geom, xmin, xmax, ymin, ymax, [T = Float64])::T
    +
    +Returns the area of intersection between given geometry and grid cell defined by its minimum
    +and maximum x and y-values. This is computed differently for different geometries:
    +
    +- The signed area of a point is always zero.
    +- The signed area of a curve is always zero.
    +- The signed area of a polygon is calculated by tracing along its edges and switching to the
    +    cell edges if needed.
    +- The coverage of a geometry collection, multi-geometry, feature collection of
    +    array/iterable is the sum of the coverages of all of the sub-geometries.
    +
    +Result will be of type T, where T is an optional argument with a default value
    +of Float64.
    +"""
    +function coverage(geom, xmin, xmax, ymin, ymax,::Type{T} = Float64; threaded=false) where T <: AbstractFloat
    +    applyreduce(+, _COVERAGE_TARGETS, geom; threaded, init=zero(T)) do g
    +        _coverage(T, GI.trait(g), g, T(xmin), T(xmax), T(ymin), T(ymax))
    +    end
    +end
    +
    +function coverage(geom, cell_ext::Extents.Extent, ::Type{T} = Float64; threaded=false) where T <: AbstractFloat
    +    (xmin, xmax), (ymin, ymax) = values(cell_ext)
    +    return coverage(geom, xmin, xmax, ymin, ymax, T; threaded = threaded)
    +end

    Points, MultiPoints, Curves, MultiCurves

    julia
    _coverage(::Type{T}, ::GI.AbstractGeometryTrait, geom, xmin, xmax, ymin, ymax; kwargs...) where T = zero(T)

    Polygons

    julia
    function _coverage(::Type{T}, ::GI.PolygonTrait, poly, xmin, xmax, ymin, ymax; exact = _False()) where T
    +    GI.isempty(poly) && return zero(T)
    +    cov_area = _coverage(T, GI.getexterior(poly), xmin, xmax, ymin, ymax; exact)
    +    cov_area == 0 && return cov_area

    Remove hole coverage from total

    julia
        for hole in GI.gethole(poly)
    +        cov_area -= _coverage(T, hole, xmin, xmax, ymin, ymax; exact)
    +    end
    +    return cov_area
    +end
    +
    +#= Calculates the area of the filled ring within the cell defined by corners with (xmin, ymin),
    +(xmin, ymax), (xmax, ymax), and (xmax, ymin). =#
    +function _coverage(::Type{T}, ring, xmin, xmax, ymin, ymax; exact) where T
    +    cov_area = zero(T)
    +    unmatched_out_wall, unmatched_out_point = UNKNOWN, (zero(T), zero(T))
    +    unmatched_in_wall, unmatched_in_point = unmatched_out_wall, unmatched_out_point

    Loop over edges of polygon

    julia
        start_idx = 1
    +    for (i, p) in enumerate(GI.getpoint(ring))
    +        if !_point_in_cell(p, xmin, xmax, ymin, ymax)
    +            start_idx = i
    +            break
    +        end
    +    end
    +    ring_cw = isclockwise(ring)
    +    p1 = _tuple_point(GI.getpoint(ring, start_idx), T)

    Must rotate clockwise for the algorithm to work

    julia
        point_idx = ring_cw ? Iterators.flatten((start_idx + 1:GI.npoint(ring), 1:start_idx)) :
    +        Iterators.flatten((start_idx - 1:-1:1, GI.npoint(ring):-1:start_idx))
    +    for i in point_idx
    +        p2 = _tuple_point(GI.getpoint(ring, i), T)

    Determine if edge points are within the cell

    julia
            p1_in_cell = _point_in_cell(p1, xmin, xmax, ymin, ymax)
    +        p2_in_cell = _point_in_cell(p2, xmin, xmax, ymin, ymax)

    If entire line segment is inside cell

    julia
            if p1_in_cell && p2_in_cell
    +            cov_area += _area_component(p1, p2)
    +            p1 = p2
    +            continue
    +        end

    If edge passes outside of rectangle, determine which edge segments are added

    julia
            inter1, inter2 = _line_intersect_cell(T, p1, p2, xmin, xmax, ymin, ymax)

    Endpoints of segment within the cell and wall they are on if known

    julia
            (start_wall, start_point), (end_wall, end_point) =
    +            if p1_in_cell
    +                ((UNKNOWN, p1), inter1)
    +            elseif p2_in_cell
    +                (inter1, (UNKNOWN, p2))
    +            else
    +                i1_to_p1 = _squared_euclid_distance(T, inter1[2], p1)
    +                i2_to_p1 = _squared_euclid_distance(T, inter2[2], p1)
    +                i1_to_p1 < i2_to_p1 ? (inter1, inter2) : (inter2, inter1)
    +            end

    Add edge component

    julia
            cov_area += _area_component(start_point, end_point)
    +
    +        if start_wall != UNKNOWN  # p1 out of cell
    +            if unmatched_out_wall == UNKNOWN
    +                unmatched_in_point = start_point
    +                unmatched_in_wall = start_wall
    +            else
    +                check_point = find_point_on_cell(unmatched_out_point, start_point,
    +                    unmatched_out_wall, start_wall,xmin, xmax, ymin, ymax)
    +                if _point_filled_curve_orientation(check_point, ring; in = true, on = false, out = false, exact)
    +                    cov_area += connect_edges(T, unmatched_out_point, start_point,
    +                        unmatched_out_wall, start_wall,xmin, xmax, ymin, ymax)
    +                else
    +                    cov_area += connect_edges(T, unmatched_out_point, unmatched_in_point,
    +                        unmatched_out_wall, unmatched_in_wall,xmin, xmax, ymin, ymax)
    +                    unmatched_out_wall == UNKNOWN
    +                end
    +            end
    +        end
    +        if end_wall != UNKNOWN  # p2 out of cell
    +            unmatched_out_wall, unmatched_out_point = end_wall, end_point
    +        end
    +        p1 = p2
    +    end

    if unmatched in-point at beginning, close polygon with last out point

    julia
        if unmatched_in_wall != UNKNOWN
    +        cov_area += connect_edges(T, unmatched_out_point, unmatched_in_point,
    +            unmatched_out_wall, unmatched_in_wall,xmin, xmax, ymin, ymax)
    +    end
    +    cov_area = abs(cov_area) / 2

    if grid cell is within polygon then the area is grid cell area

    julia
        if cov_area == 0
    +        if _point_filled_curve_orientation((xmin, ymin), ring; in = true, on = true, out = false, exact)
    +            cov_area = abs((xmax - xmin) * (ymax - ymin))
    +        end
    +    end
    +    return cov_area
    +end

    Returns true of the given point is within the bounding box determined by x and y values

    julia
    _point_in_cell(p, xmin, xmax, ymin, ymax) = xmin <= GI.x(p) <= xmax && ymin <= GI.y(p) <= ymax

    Returns true if b is between a and c, exclusive of the maximum value, else false.

    julia
    _between(b, a, c) = a  b < c || c  b < a
    +
    +#= Determine intersections of the line from (x1, y1) to (x2, y2) with the bounding box
    +defined by the minimum and maximum x/y values. Since we are dealing with a single line
    +segment, we know that there is at maximum two intersection points.
    +
    +For each intersection point that we find, return the wall that it passes through, as well as
    +the intersection point itself as a a tuple. If an intersection point isn't found, return the
    +wall as UNKNOWN and the point as a pair of zeros. =#
    +function _line_intersect_cell(::Type{T}, (x1, y1), (x2, y2), xmin, xmax, ymin, ymax) where T
    +    Δx, Δy = x2 - x1, y2 - y1
    +    inter1 = (UNKNOWN, (zero(T), zero(T)))
    +    inter2 = inter1
    +    if Δx == 0  # If line is vertical, only consider north and south
    +        if xmin  x1  xmax
    +            inter1 = _between(ymax, y1, y2) ? (NORTH, (x1, ymax)) : inter1
    +            inter2 = _between(ymin, y1, y2) ? (SOUTH, (x1, ymin)) : inter2
    +        end
    +    elseif Δy == 0 # If line is horizontal, only consider east and west
    +        if ymin  y1  ymax
    +            inter1 = _between(xmax, x1, x2) ? (EAST, (xmax, y1)) : inter1
    +            inter2 = _between(xmin, x1, x2) ? (WEST, (xmin, y1)) : inter2
    +        end
    +    else  # Line is tilted, must consider all edges, but only two can intersect
    +        m = Δy / Δx
    +        b = y1 - m * x1

    Calculate and check potential intersections

    julia
            xn = (ymax - b) / m
    +        if xmin  xn  xmax && _between(xn, x1, x2) && _between(ymax, y1, y2)
    +            inter1 = (NORTH, (xn, ymax))
    +        end
    +        xs = (ymin - b) / m
    +        if xmin  xs  xmax && _between(xs, x1, x2) && _between(ymin, y1, y2)
    +            new_intr = (SOUTH, (xs, ymin))
    +            (inter1[1] == UNKNOWN) ? (inter1 = new_intr) : (inter2 = new_intr)
    +        end
    +        ye =  m * xmax + b
    +        if ymin  ye  ymax && _between(ye, y1, y2) && _between(xmax, x1, x2)
    +            new_intr = (EAST, (xmax, ye))
    +            (inter1[1] == UNKNOWN) ? (inter1 = new_intr) : (inter2 = new_intr)
    +        end
    +        yw = m * xmin + b
    +        if ymin  yw  ymax && _between(yw, y1, y2) && _between(xmin, x1, x2)
    +            new_intr = (WEST, (xmin, yw))
    +            (inter1[1] == UNKNOWN) ? (inter1 = new_intr) : (inter2 = new_intr)
    +        end
    +    end
    +    if inter1[1] == UNKNOWN  # first intersection must be known, if one exists
    +        inter1, inter2 = inter2, inter1
    +    end
    +    return inter1, inter2
    +end

    Finds point of cell edge between p1 and p2 given which walls they are on

    julia
    function find_point_on_cell(p1, p2, wall1, wall2, xmin, xmax, ymin, ymax)
    +    x1, y1 = p1
    +    x2, y2 = p2
    +    mid_point = if wall1 == wall2 && _is_clockwise_from(p1, p2, wall1)
    +        (x1 + x2) / 2, (y1 + y2) / 2
    +    elseif wall1 == NORTH
    +        (xmax, ymax)
    +    elseif wall1 == EAST
    +        (xmax, ymin)
    +    elseif wall1 == SOUTH
    +        (xmin, ymin)
    +    else
    +        (xmin, ymax)
    +    end
    +    return mid_point
    +end
    +
    +#= Area component of shoelace formula coming from the distance between point 1 and point 2
    +along grid cell walls in between the two points. =#
    +function connect_edges(::Type{T}, p1, p2, wall1, wall2, xmin, xmax, ymin, ymax) where {T}
    +    connect_area = zero(T)
    +    if wall1 == wall2 && _is_clockwise_from(p1, p2, wall1)
    +        connect_area += _area_component(p1, p2)
    +    else

    From the point to the corner of wall 1

    julia
            connect_area += _partial_edge_out_area(p1, xmin, xmax, ymin, ymax, wall1)

    Any intermediate walls (full length)

    julia
            next_wall, last_wall = wall1 + 1, wall2 - 1
    +        if wall2 > wall1
    +            for wall in next_wall:last_wall
    +                connect_area += _full_edge_area(xmin, xmax, ymin, ymax, wall)
    +            end
    +        else
    +            for wall in Iterators.flatten((next_wall:WEST, NORTH:last_wall))
    +                connect_area += _full_edge_area(xmin, xmax, ymin, ymax, wall)
    +            end
    +        end

    From the corner of wall 2 to the point

    julia
            connect_area += _partial_edge_in_area(p2, xmin, xmax, ymin, ymax, wall2)
    +    end
    +    return connect_area
    +end

    True if (x1, y1) is clockwise from (x2, y2) on the same wall

    julia
    _is_clockwise_from((x1, y1), (x2, y2), wall) = (wall == NORTH && x2 > x1) ||
    +    (wall == EAST && y2 < y1) || (wall == SOUTH && x2 < x1) || (wall == WEST && y2 > y1)
    +
    +#= Returns the area component of a full edge of the bounding box defined by the min and max
    +values and the wall. =#
    +_full_edge_area(xmin, xmax, ymin, ymax, wall) = if wall == NORTH
    +        ymax * (xmin - xmax)
    +    elseif wall == EAST
    +        xmax * (ymin - ymax)
    +    elseif wall == SOUTH
    +        ymin * (xmax - xmin)
    +    else
    +        xmin * (ymax - ymin)
    +    end
    +
    +#= Returns the area component of part of one wall, from its "starting corner" (going
    +clockwise) to the point (x2, y2). =#
    +function _partial_edge_in_area((x2, y2), xmin, xmax, ymin, ymax, wall)
    +    x_wall = (wall == NORTH || wall == WEST) ? xmin : xmax
    +    y_wall = (wall == NORTH || wall == EAST) ? ymax : ymin
    +    return x_wall * y2 - x2 * y_wall
    +end
    +
    +#= Returns the area component of part of one wall, from the point (x1, y1) to its
    +"ending corner" (going clockwise). =#
    +function _partial_edge_out_area((x1, y1), xmin, xmax, ymin, ymax, wall)
    +    x_wall = (wall == NORTH || wall == EAST) ? xmax : xmin
    +    y_wall = (wall == NORTH || wall == WEST) ? ymax : ymin
    +    return x1 * y_wall - x_wall * y1
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/clipping/cut.html b/previews/PR239/source/methods/clipping/cut.html new file mode 100644 index 000000000..a7fe6f764 --- /dev/null +++ b/previews/PR239/source/methods/clipping/cut.html @@ -0,0 +1,111 @@ + + + + + + Polygon cutting | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Polygon cutting

    julia
    export cut

    What is cut?

    The cut function cuts a polygon through a line segment. This is inspired by functions such as Matlab's cutpolygon function.

    To provide an example, consider the following polygon and line:

    julia
    import GeoInterface as GI, GeometryOps as GO
    +using CairoMakie
    +using Makie
    +
    +poly = GI.Polygon([[(0.0, 0.0), (10.0, 0.0), (10.0, 10.0), (0.0, 10.0), (0.0, 0.0)]])
    +line = GI.Line([(5.0, -5.0), (5.0, 15.0)])
    +cut_polys = GO.cut(poly, line)
    +
    +f, a, p1 = Makie.poly(collect(GI.getpoint(cut_polys[1])); color = (:blue, 0.5))
    +Makie.poly!(collect(GI.getpoint(cut_polys[2])); color = (:orange, 0.5))
    +Makie.lines!(GI.getpoint(line); color = :black)
    +f

    Implementation

    This function depends on polygon clipping helper function and is inspired by the Greiner-Hormann clipping algorithm used elsewhere in this library. The inspiration came from this Stack Overflow discussion.

    julia
    """
    +    cut(geom, line, [T::Type])
    +
    +Return given geom cut by given line as a list of geometries of the same type as the input
    +geom. Return the original geometry as only list element if none are found. Line must cut
    +fully through given geometry or the original geometry will be returned.
    +
    +Note: This currently doesn't work for degenerate cases there line crosses through vertices.
    +
    +# Example
    +
    +```jldoctest
    +import GeoInterface as GI, GeometryOps as GO
    +
    +poly = GI.Polygon([[(0.0, 0.0), (10.0, 0.0), (10.0, 10.0), (0.0, 10.0), (0.0, 0.0)]])
    +line = GI.Line([(5.0, -5.0), (5.0, 15.0)])
    +cut_polys = GO.cut(poly, line)
    +GI.coordinates.(cut_polys)

    output

    julia
    2-element Vector{Vector{Vector{Vector{Float64}}}}:
    + [[[0.0, 0.0], [5.0, 0.0], [5.0, 10.0], [0.0, 10.0], [0.0, 0.0]]]
    + [[[5.0, 0.0], [10.0, 0.0], [10.0, 10.0], [5.0, 10.0], [5.0, 0.0]]]
    +```
    +"""
    +cut(geom, line, ::Type{T} = Float64) where {T <: AbstractFloat} =
    +    _cut(T, GI.trait(geom), geom, GI.trait(line), line; exact = _True())
    +
    +#= Cut a given polygon by given line. Add polygon holes back into resulting pieces if there
    +are any holes. =#
    +function _cut(::Type{T}, ::GI.PolygonTrait, poly, ::GI.LineTrait, line; exact) where T
    +    ext_poly = GI.getexterior(poly)
    +    poly_list, intr_list = _build_a_list(T, ext_poly, line; exact)
    +    n_intr_pts = length(intr_list)

    If an impossible number of intersection points, return original polygon

    julia
        if n_intr_pts < 2 || isodd(n_intr_pts)
    +        return [tuples(poly)]
    +    end

    Cut polygon by line

    julia
        cut_coords = _cut(T, ext_poly, line, poly_list, intr_list, n_intr_pts; exact)

    Close coords and create polygons

    julia
        for c in cut_coords
    +        push!(c, c[1])
    +    end
    +    cut_polys = [GI.Polygon([c]) for c in cut_coords]

    Add original polygon holes back in

    julia
        remove_idx = falses(length(cut_polys))
    +    _add_holes_to_polys!(T, cut_polys, GI.gethole(poly), remove_idx; exact)
    +    return cut_polys
    +end

    Many types aren't implemented

    julia
    function _cut(::Type{T}, trait::GI.AbstractTrait, geom, line; kwargs...) where T
    +    @assert(
    +        false,
    +        "Cutting of $trait isn't implemented yet.",
    +    )
    +    return nothing
    +end
    +
    +#= Cutting algorithm inspired by Greiner and Hormann clipping algorithm. Returns coordinates
    +of cut geometry in Vector{Vector{Tuple}} format.
    +
    +Note: degenerate cases where intersection points are vertices do not work right now. =#
    +function _cut(::Type{T}, geom, line, geom_list, intr_list, n_intr_pts; exact) where T

    Sort and categorize the intersection points

    julia
        sort!(intr_list, by = x -> geom_list[x].fracs[2])
    +    _flag_ent_exit!(GI.LineTrait(), line, geom_list; exact)

    Add first point to output list

    julia
        return_coords = [[geom_list[1].point]]
    +    cross_backs = [(T(Inf),T(Inf))]
    +    poly_idx = 1
    +    n_polys = 1

    Walk around original polygon to find split polygons

    julia
        for (pt_idx, curr) in enumerate(geom_list)
    +        if pt_idx > 1
    +            push!(return_coords[poly_idx], curr.point)
    +        end
    +        if curr.inter

    Find cross back point for current polygon

    julia
                intr_idx = findfirst(x -> equals(curr.point, geom_list[x].point), intr_list)
    +            cross_idx = intr_idx + (curr.ent_exit ? 1 : -1)
    +            cross_idx = cross_idx < 1 ? n_intr_pts : cross_idx
    +            cross_idx = cross_idx > n_intr_pts ? 1 : cross_idx
    +            cross_backs[poly_idx] = geom_list[intr_list[cross_idx]].point

    Check if current point is a cross back point

    julia
                next_poly_idx = findfirst(x -> equals(x, curr.point), cross_backs)
    +            if isnothing(next_poly_idx)
    +                push!(return_coords, [curr.point])
    +                push!(cross_backs, curr.point)
    +                n_polys += 1
    +                poly_idx = n_polys
    +            else
    +                push!(return_coords[next_poly_idx], curr.point)
    +                poly_idx = next_poly_idx
    +            end
    +        end
    +    end
    +    return return_coords
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/clipping/difference.html b/previews/PR239/source/methods/clipping/difference.html new file mode 100644 index 000000000..77d7376c8 --- /dev/null +++ b/previews/PR239/source/methods/clipping/difference.html @@ -0,0 +1,190 @@ + + + + + + Difference Polygon Clipping | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Difference Polygon Clipping

    julia
    export difference
    +
    +
    +"""
    +    difference(geom_a, geom_b, [T::Type]; target::Type, fix_multipoly = UnionIntersectingPolygons())
    +
    +Return the difference between two geometries as a list of geometries. Return an empty list
    +if none are found. The type of the list will be constrained as much as possible given the
    +input geometries. Furthermore, the user can provide a `taget` type as a keyword argument and
    +a list of target geometries found in the difference will be returned. The user can also
    +provide a float type that they would like the points of returned geometries to be. If the
    +user is taking a intersection involving one or more multipolygons, and the multipolygon
    +might be comprised of polygons that intersect, if `fix_multipoly` is set to an
    +`IntersectingPolygons` correction (the default is `UnionIntersectingPolygons()`), then the
    +needed multipolygons will be fixed to be valid before performing the intersection to ensure
    +a correct answer. Only set `fix_multipoly` to false if you know that the multipolygons are
    +valid, as it will avoid unneeded computation.
    +
    +# Example
    +
    +```jldoctest
    +import GeoInterface as GI, GeometryOps as GO
    +
    +poly1 = GI.Polygon([[[0.0, 0.0], [5.0, 5.0], [10.0, 0.0], [5.0, -5.0], [0.0, 0.0]]])
    +poly2 = GI.Polygon([[[3.0, 0.0], [8.0, 5.0], [13.0, 0.0], [8.0, -5.0], [3.0, 0.0]]])
    +diff_poly = GO.difference(poly1, poly2; target = GI.PolygonTrait())
    +GI.coordinates.(diff_poly)

    output

    julia
    1-element Vector{Vector{Vector{Vector{Float64}}}}:
    + [[[6.5, 3.5], [5.0, 5.0], [0.0, 0.0], [5.0, -5.0], [6.5, -3.5], [3.0, 0.0], [6.5, 3.5]]]
    +```
    +"""
    +function difference(
    +    geom_a, geom_b, ::Type{T} = Float64; target=nothing, kwargs...,
    +) where {T<:AbstractFloat}
    +    return _difference(
    +        TraitTarget(target), T, GI.trait(geom_a), geom_a, GI.trait(geom_b), geom_b;
    +        exact = _True(), kwargs...,
    +    )
    +end
    +
    +#= The 'difference' function returns the difference of two polygons as a list of polygons.
    +The algorithm to determine the difference was adapted from "Efficient clipping of efficient
    +polygons," by Greiner and Hormann (1998). DOI: https://doi.org/10.1145/274363.274364 =#
    +function _difference(
    +    ::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.PolygonTrait, poly_a,
    +    ::GI.PolygonTrait, poly_b;
    +    exact, kwargs...
    +) where T

    Get the exterior of the polygons

    julia
        ext_a = GI.getexterior(poly_a)
    +    ext_b = GI.getexterior(poly_b)

    Find the difference of the exterior of the polygons

    julia
        a_list, b_list, a_idx_list = _build_ab_list(T, ext_a, ext_b, _diff_delay_cross_f, _diff_delay_bounce_f; exact)
    +    polys = _trace_polynodes(T, a_list, b_list, a_idx_list, _diff_step, poly_a, poly_b)

    if no crossing points, determine if either poly is inside of the other

    julia
        if isempty(polys)
    +        a_in_b, b_in_a = _find_non_cross_orientation(a_list, b_list, ext_a, ext_b; exact)

    add case for if they polygons are the same (all intersection points!) add a find_first check to find first non-inter poly!

    julia
            if b_in_a && !a_in_b  # b in a and can't be the same polygon
    +            poly_a_b_hole = GI.Polygon([tuples(ext_a), tuples(ext_b)])
    +            push!(polys, poly_a_b_hole)
    +        elseif !b_in_a && !a_in_b # polygons don't intersect
    +            push!(polys, tuples(poly_a))
    +            return polys
    +        end
    +    end
    +    remove_idx = falses(length(polys))

    If the original polygons had holes, take that into account.

    julia
        if GI.nhole(poly_a) != 0
    +        _add_holes_to_polys!(T, polys, GI.gethole(poly_a), remove_idx; exact)
    +    end
    +    if GI.nhole(poly_b) != 0
    +        for hole in GI.gethole(poly_b)
    +            hole_poly = GI.Polygon(StaticArrays.SVector(hole))
    +            new_polys = intersection(hole_poly, poly_a, T; target = GI.PolygonTrait)
    +            if length(new_polys) > 0
    +                append!(polys, new_polys)
    +            end
    +        end
    +    end

    Remove unneeded collinear points on same edge

    julia
        _remove_collinear_points!(polys, remove_idx, poly_a, poly_b)
    +    return polys
    +end

    Helper functions for Differences with Greiner and Hormann Polygon Clipping

    julia
    #= When marking the crossing status of a delayed crossing, the chain start point is crossing
    +when the start point is a entry point and is a bouncing point when the start point is an
    +exit point. The end of the chain has the opposite crossing / bouncing status. =#
    +_diff_delay_cross_f(x) = (x, !x)
    +#= When marking the crossing status of a delayed bouncing, the chain start and end points
    +are crossing if the current polygon's adjacent edges are within the non-tracing polygon and
    +we are tracing b_list or if the edges are outside and we are on a_list. Otherwise the
    +endpoints are marked as crossing. x is a boolean representing if the edges are inside or
    +outside of the polygon and y is a variable that is true if we are on a_list and false if we
    +are on b_list. =#
    +_diff_delay_bounce_f(x, y) = x  y
    +#= When tracing polygons, step forwards if the most recent intersection point was an entry
    +point and we are currently tracing b_list or if it was an exit point and we are currently
    +tracing a_list, else step backwards, where x is the entry/exit status and y is a variable
    +that is true if we are on a_list and false if we are on b_list. =#
    +_diff_step(x, y) = (x  y) ? 1 : (-1)
    +
    +#= Polygon with multipolygon difference - note that all intersection regions between
    +`poly_a` and any of the sub-polygons of `multipoly_b` are removed from `poly_a`. =#
    +function _difference(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.PolygonTrait, poly_a,
    +    ::GI.MultiPolygonTrait, multipoly_b;
    +    kwargs...,
    +) where T
    +    polys = [tuples(poly_a, T)]
    +    for poly_b in GI.getpolygon(multipoly_b)
    +        isempty(polys) && break
    +        polys = mapreduce(p -> difference(p, poly_b; target), append!, polys)
    +    end
    +    return polys
    +end
    +
    +#= Multipolygon with polygon difference - note that all intersection regions between
    +sub-polygons of `multipoly_a` and `poly_b` will be removed from the corresponding
    +sub-polygon. Unless specified with `fix_multipoly = nothing`, `multipolygon_a` will be
    +validated using the given (default is `UnionIntersectingPolygons()`) correction. =#
    +function _difference(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.MultiPolygonTrait, multipoly_a,
    +    ::GI.PolygonTrait, poly_b;
    +    fix_multipoly = UnionIntersectingPolygons(), kwargs...,
    +) where T
    +    if !isnothing(fix_multipoly) # Fix multipoly_a to prevent returning an invalid multipolygon
    +        multipoly_a = fix_multipoly(multipoly_a)
    +    end
    +    polys = Vector{_get_poly_type(T)}()
    +    sizehint!(polys, GI.npolygon(multipoly_a))
    +    for poly_a in GI.getpolygon(multipoly_a)
    +        append!(polys, difference(poly_a, poly_b; target))
    +    end
    +    return polys
    +end
    +
    +#= Multipolygon with multipolygon difference - note that all intersection regions between
    +sub-polygons of `multipoly_a` and sub-polygons of `multipoly_b` will be removed from the
    +corresponding sub-polygon of `multipoly_a`. Unless specified with `fix_multipoly = nothing`,
    +`multipolygon_a` will be validated using the given (default is `UnionIntersectingPolygons()`)
    +correction. =#
    +function _difference(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.MultiPolygonTrait, multipoly_a,
    +    ::GI.MultiPolygonTrait, multipoly_b;
    +    fix_multipoly = UnionIntersectingPolygons(), kwargs...,
    +) where T
    +    if !isnothing(fix_multipoly) # Fix multipoly_a to prevent returning an invalid multipolygon
    +        multipoly_a = fix_multipoly(multipoly_a)
    +        fix_multipoly = nothing
    +    end
    +    local polys
    +    for (i, poly_b) in enumerate(GI.getpolygon(multipoly_b))
    +        #= Removing intersections of `multipoly_a`` with pieces of `multipoly_b`` - as
    +        pieces of `multipolygon_a`` are removed, continue to take difference with new shape
    +        `polys` =#
    +        polys = if i == 1
    +            difference(multipoly_a, poly_b; target, fix_multipoly)
    +        else
    +            difference(GI.MultiPolygon(polys), poly_b; target, fix_multipoly)
    +        end
    +        #= One multipoly_a has been completely covered (and thus removed) there is no need to
    +        continue taking the difference =#
    +        isempty(polys) && break
    +    end
    +    return polys
    +end

    Many type and target combos aren't implemented

    julia
    function _difference(
    +    ::TraitTarget{Target}, ::Type{T},
    +    trait_a::GI.AbstractTrait, geom_a,
    +    trait_b::GI.AbstractTrait, geom_b,
    +) where {Target, T}
    +    @assert(
    +        false,
    +        "Difference between $trait_a and $trait_b with target $Target isn't implemented yet.",
    +    )
    +    return nothing
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/clipping/intersection.html b/previews/PR239/source/methods/clipping/intersection.html new file mode 100644 index 000000000..6b1f13a8f --- /dev/null +++ b/previews/PR239/source/methods/clipping/intersection.html @@ -0,0 +1,407 @@ + + + + + + Geometry Intersection | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Geometry Intersection

    julia
    export intersection, intersection_points
    +
    +"""
    +    Enum LineOrientation
    +Enum for the orientation of a line with respect to a curve. A line can be
    +`line_cross` (crossing over the curve), `line_hinge` (crossing the endpoint of the curve),
    +`line_over` (collinear with the curve), or `line_out` (not interacting with the curve).
    +"""
    +@enum LineOrientation line_cross=1 line_hinge=2 line_over=3 line_out=4
    +
    +"""
    +    intersection(geom_a, geom_b, [T::Type]; target::Type, fix_multipoly = UnionIntersectingPolygons())
    +
    +Return the intersection between two geometries as a list of geometries. Return an empty list
    +if none are found. The type of the list will be constrained as much as possible given the
    +input geometries. Furthermore, the user can provide a `target` type as a keyword argument and
    +a list of target geometries found in the intersection will be returned. The user can also
    +provide a float type that they would like the points of returned geometries to be. If the
    +user is taking a intersection involving one or more multipolygons, and the multipolygon
    +might be comprised of polygons that intersect, if `fix_multipoly` is set to an
    +`IntersectingPolygons` correction (the default is `UnionIntersectingPolygons()`), then the
    +needed multipolygons will be fixed to be valid before performing the intersection to ensure
    +a correct answer. Only set `fix_multipoly` to nothing if you know that the multipolygons are
    +valid, as it will avoid unneeded computation.
    +
    +# Example
    +
    +```jldoctest
    +import GeoInterface as GI, GeometryOps as GO
    +
    +line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)])
    +line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)])
    +inter_points = GO.intersection(line1, line2; target = GI.PointTrait())
    +GI.coordinates.(inter_points)

    output

    julia
    1-element Vector{Vector{Float64}}:
    + [125.58375366067548, -14.83572303404496]
    +```
    +"""
    +function intersection(
    +    geom_a, geom_b, ::Type{T}=Float64; target=nothing, kwargs...,
    +) where {T<:AbstractFloat}
    +    return _intersection(
    +        TraitTarget(target), T, GI.trait(geom_a), geom_a, GI.trait(geom_b), geom_b;
    +        exact = _True(), kwargs...,
    +    )
    +end

    Curve-Curve Intersections with target Point

    julia
    _intersection(
    +    ::TraitTarget{GI.PointTrait}, ::Type{T},
    +    trait_a::Union{GI.LineTrait, GI.LineStringTrait, GI.LinearRingTrait}, geom_a,
    +    trait_b::Union{GI.LineTrait, GI.LineStringTrait, GI.LinearRingTrait}, geom_b;
    +    kwargs...,
    +) where T = _intersection_points(T, trait_a, geom_a, trait_b, geom_b)
    +
    +#= Polygon-Polygon Intersections with target Polygon
    +The algorithm to determine the intersection was adapted from "Efficient clipping
    +of efficient polygons," by Greiner and Hormann (1998).
    +DOI: https://doi.org/10.1145/274363.274364 =#
    +function _intersection(
    +    ::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.PolygonTrait, poly_a,
    +    ::GI.PolygonTrait, poly_b;
    +    exact, kwargs...,
    +) where {T}

    First we get the exteriors of 'poly_a' and 'poly_b'

    julia
        ext_a = GI.getexterior(poly_a)
    +    ext_b = GI.getexterior(poly_b)

    Then we find the intersection of the exteriors

    julia
        a_list, b_list, a_idx_list = _build_ab_list(T, ext_a, ext_b, _inter_delay_cross_f, _inter_delay_bounce_f; exact)
    +    polys = _trace_polynodes(T, a_list, b_list, a_idx_list, _inter_step, poly_a, poly_b)
    +    if isempty(polys) # no crossing points, determine if either poly is inside the other
    +        a_in_b, b_in_a = _find_non_cross_orientation(a_list, b_list, ext_a, ext_b; exact)
    +        if a_in_b
    +            push!(polys, GI.Polygon([tuples(ext_a)]))
    +        elseif b_in_a
    +            push!(polys, GI.Polygon([tuples(ext_b)]))
    +        end
    +    end
    +    remove_idx = falses(length(polys))

    If the original polygons had holes, take that into account.

    julia
        if GI.nhole(poly_a) != 0 || GI.nhole(poly_b) != 0
    +        hole_iterator = Iterators.flatten((GI.gethole(poly_a), GI.gethole(poly_b)))
    +        _add_holes_to_polys!(T, polys, hole_iterator, remove_idx; exact)
    +    end

    Remove unneeded collinear points on same edge

    julia
        _remove_collinear_points!(polys, remove_idx, poly_a, poly_b)
    +    return polys
    +end

    Helper functions for Intersections with Greiner and Hormann Polygon Clipping

    julia
    #= When marking the crossing status of a delayed crossing, the chain start point is bouncing
    +when the start point is a entry point and is a crossing point when the start point is an
    +exit point. The end of the chain has the opposite crossing / bouncing status. x is the
    +entry/exit status. =#
    +_inter_delay_cross_f(x) = (!x, x)
    +#= When marking the crossing status of a delayed bouncing, the chain start and end points
    +are crossing if the current polygon's adjacent edges are within the non-tracing polygon. If
    +the edges are outside then the chain endpoints are marked as bouncing. x is a boolean
    +representing if the edges are inside or outside of the polygon. =#
    +_inter_delay_bounce_f(x, _) = x
    +#= When tracing polygons, step forward if the most recent intersection point was an entry
    +point, else step backwards where x is the entry/exit status. =#
    +_inter_step(x, _) =  x ? 1 : (-1)
    +
    +#= Polygon with multipolygon intersection - note that all intersection regions between
    +`poly_a` and any of the sub-polygons of `multipoly_b` are counted as intersection polygons.
    +Unless specified with `fix_multipoly = nothing`, `multipolygon_b` will be validated using
    +the given (default is `UnionIntersectingPolygons()`) correction. =#
    +function _intersection(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.PolygonTrait, poly_a,
    +    ::GI.MultiPolygonTrait, multipoly_b;
    +    fix_multipoly = UnionIntersectingPolygons(), kwargs...,
    +) where T
    +    if !isnothing(fix_multipoly) # Fix multipoly_b to prevent duplicated intersection regions
    +        multipoly_b = fix_multipoly(multipoly_b)
    +    end
    +    polys = Vector{_get_poly_type(T)}()
    +    for poly_b in GI.getpolygon(multipoly_b)
    +        append!(polys, intersection(poly_a, poly_b; target))
    +    end
    +    return polys
    +end
    +
    +#= Multipolygon with polygon intersection is equivalent to taking the intersection of the
    +polygon with the multipolygon and thus simply switches the order of operations and calls the
    +above method. =#
    +_intersection(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.MultiPolygonTrait, multipoly_a,
    +    ::GI.PolygonTrait, poly_b;
    +    kwargs...,
    +) where T = intersection(poly_b, multipoly_a; target , kwargs...)
    +
    +#= Multipolygon with multipolygon intersection - note that all intersection regions between
    +any sub-polygons of `multipoly_a` and any of the sub-polygons of `multipoly_b` are counted
    +as intersection polygons. Unless specified with `fix_multipoly = nothing`, both
    +`multipolygon_a` and `multipolygon_b` will be validated using the given (default is
    +`UnionIntersectingPolygons()`) correction. =#
    +function _intersection(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.MultiPolygonTrait, multipoly_a,
    +    ::GI.MultiPolygonTrait, multipoly_b;
    +    fix_multipoly = UnionIntersectingPolygons(), kwargs...,
    +) where T
    +    if !isnothing(fix_multipoly) # Fix both multipolygons to prevent duplicated regions
    +        multipoly_a = fix_multipoly(multipoly_a)
    +        multipoly_b = fix_multipoly(multipoly_b)
    +        fix_multipoly = nothing
    +    end
    +    polys = Vector{_get_poly_type(T)}()
    +    for poly_a in GI.getpolygon(multipoly_a)
    +        append!(polys, intersection(poly_a, multipoly_b; target, fix_multipoly))
    +    end
    +    return polys
    +end

    Many type and target combos aren't implemented

    julia
    function _intersection(
    +    ::TraitTarget{Target}, ::Type{T},
    +    trait_a::GI.AbstractTrait, geom_a,
    +    trait_b::GI.AbstractTrait, geom_b;
    +    kwargs...,
    +) where {Target, T}
    +    @assert(
    +        false,
    +        "Intersection between $trait_a and $trait_b with target $Target isn't implemented yet.",
    +    )
    +    return nothing
    +end
    +
    +"""
    +    intersection_points(geom_a, geom_b, [T::Type])
    +
    +Return a list of intersection tuple points between two geometries. If no intersection points
    +exist, returns an empty list.
    +
    +# Example
    +
    +```jldoctest
    +import GeoInterface as GI, GeometryOps as GO
    +
    +line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)])
    +line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)])
    +inter_points = GO.intersection_points(line1, line2)

    output

    julia
    1-element Vector{Tuple{Float64, Float64}}:
    + (125.58375366067548, -14.83572303404496)
    +"""
    +intersection_points(geom_a, geom_b, ::Type{T} = Float64) where T <: AbstractFloat =
    +    _intersection_points(T, GI.trait(geom_a), geom_a, GI.trait(geom_b), geom_b)
    +
    +
    +#= Calculates the list of intersection points between two geometries, including line
    +segments, line strings, linear rings, polygons, and multipolygons. =#
    +function _intersection_points(::Type{T}, ::GI.AbstractTrait, a, ::GI.AbstractTrait, b; exact = _True()) where T

    Initialize an empty list of points

    julia
        result = Tuple{T, T}[]

    Check if the geometries extents even overlap

    julia
        Extents.intersects(GI.extent(a), GI.extent(b)) || return result

    Create a list of edges from the two input geometries

    julia
        edges_a, edges_b = map(sort!  to_edges, (a, b))

    Loop over pairs of edges and add any unique intersection points to results

    julia
        for a_edge in edges_a, b_edge in edges_b
    +        line_orient, intr1, intr2 = _intersection_point(T, a_edge, b_edge; exact)
    +        line_orient == line_out && continue  # no intersection points
    +        pt1, _ = intr1
    +        push!(result, pt1)  # if not line_out, there is at least one intersection point
    +        if line_orient == line_over # if line_over, there are two intersection points
    +            pt2, _ = intr2
    +            push!(result, pt2)
    +        end
    +    end
    +    #= TODO: We might be able to just add unique points with checks on the α and β values
    +    returned from `_intersection_point`, but this would be different for curves vs polygons
    +    vs multipolygons depending on if the shape is closed. This then wouldn't allow using the
    +    `to_edges` functionality.  =#
    +    unique!(sort!(result))
    +    return result
    +end
    +
    +#= Calculates the intersection points between two lines if they exists and the fractional
    +component of each line from the initial end point to the intersection point where α is the
    +fraction along (a1, a2) and β is the fraction along (b1, b2).
    +
    +Note that the first return is the type of intersection (line_cross, line_hinge, line_over,
    +or line_out). The type of intersection determines how many intersection points there are.
    +If the intersection is line_out, then there are no intersection points and the two
    +intersections aren't valid and shouldn't be used. If the intersection is line_cross or
    +line_hinge then the lines meet at one point and the first intersection is valid, while the
    +second isn't. Finally, if the intersection is line_over, then both points are valid and they
    +are the two points that define the endpoints of the overlapping region between the two
    +lines.
    +
    +Also note again that each intersection is a tuple of two tuples. The first is the
    +intersection point (x,y) while the second is the ratio along the initial lines (α, β) for
    +that point.
    +
    +Calculation derivation can be found here: https://stackoverflow.com/questions/563198/ =#
    +function _intersection_point(::Type{T}, (a1, a2)::Edge, (b1, b2)::Edge; exact) where T

    Default answer for no intersection

    julia
        line_orient = line_out
    +    intr1 = ((zero(T), zero(T)), (zero(T), zero(T)))
    +    intr2 = intr1
    +    no_intr_result = (line_orient, intr1, intr2)

    Seperate out line segment points

    julia
        (a1x, a1y), (a2x, a2y) = _tuple_point(a1, T), _tuple_point(a2, T)
    +    (b1x, b1y), (b2x, b2y) = _tuple_point(b1, T), _tuple_point(b2, T)

    Check if envelopes of lines intersect

    julia
        a_ext = Extent(X = minmax(a1x, a2x), Y = minmax(a1y, a2y))
    +    b_ext = Extent(X = minmax(b1x, b2x), Y = minmax(b1y, b2y))
    +    !Extents.intersects(a_ext, b_ext) && return no_intr_result

    Check orientation of two line segments with respect to one another

    julia
        a1_orient = Predicates.orient(b1, b2, a1; exact)
    +    a2_orient = Predicates.orient(b1, b2, a2; exact)
    +    a1_orient != 0 && a1_orient == a2_orient && return no_intr_result  # α < 0 or α > 1
    +    b1_orient = Predicates.orient(a1, a2, b1; exact)
    +    b2_orient = Predicates.orient(a1, a2, b2; exact)
    +    b1_orient != 0 && b1_orient == b2_orient && return no_intr_result  # β < 0 or β > 1

    Determine intersection type and intersection point(s)

    julia
        if a1_orient == a2_orient == b1_orient == b2_orient == 0

    Intersection is collinear if all endpoints lie on the same line

    julia
            line_orient, intr1, intr2 = _find_collinear_intersection(T, a1, a2, b1, b2, a_ext, b_ext, no_intr_result)
    +    elseif a1_orient == 0 || a2_orient == 0 || b1_orient == 0 || b2_orient == 0

    Intersection is a hinge if the intersection point is an endpoint

    julia
            line_orient = line_hinge
    +        intr1 = _find_hinge_intersection(T, a1, a2, b1, b2, a1_orient, a2_orient, b1_orient)
    +    else

    Intersection is a cross if there is only one non-endpoint intersection point

    julia
            line_orient = line_cross
    +        intr1 = _find_cross_intersection(T, a1, a2, b1, b2, a_ext, b_ext)
    +    end
    +    return line_orient, intr1, intr2
    +end
    +
    +#= If lines defined by (a1, a2) and (b1, b2) are collinear, find endpoints of overlapping
    +region if they exist. This could result in three possibilities. First, there could be no
    +overlapping region, in which case, the default 'no_intr_result' intersection information is
    +returned. Second, the two regions could just meet at one shared endpoint, in which case it
    +is a hinge intersection with one intersection point. Otherwise, it is a overlapping
    +intersection defined by two of the endpoints of the line segments. =#
    +function _find_collinear_intersection(::Type{T}, a1, a2, b1, b2, a_ext, b_ext, no_intr_result) where T

    Define default return for no intersection points

    julia
        line_orient, intr1, intr2 = no_intr_result

    Determine collinear line overlaps

    julia
        a1_in_b = _point_in_extent(a1, b_ext)
    +    a2_in_b = _point_in_extent(a2, b_ext)
    +    b1_in_a = _point_in_extent(b1, a_ext)
    +    b2_in_a = _point_in_extent(b2, a_ext)

    Determine line distances

    julia
        a_dist, b_dist = distance(a1, a2, T), distance(b1, b2, T)

    Set collinear intersection points if they exist

    julia
        if a1_in_b && a2_in_b      # 1st vertex of a and 2nd vertex of a form overlap
    +        line_orient = line_over
    +        β1 = _clamped_frac(distance(a1, b1, T), b_dist)
    +        β2 = _clamped_frac(distance(a2, b1, T), b_dist)
    +        intr1 = (_tuple_point(a1, T), (zero(T), β1))
    +        intr2 = (_tuple_point(a2, T), (one(T), β2))
    +    elseif b1_in_a && b2_in_a  # 1st vertex of b and 2nd vertex of b form overlap
    +        line_orient = line_over
    +        α1 = _clamped_frac(distance(b1, a1, T), a_dist)
    +        α2 = _clamped_frac(distance(b2, a1, T), a_dist)
    +        intr1 = (_tuple_point(b1, T), (α1, zero(T)))
    +        intr2 = (_tuple_point(b2, T), (α2, one(T)))
    +    elseif a1_in_b && b1_in_a  # 1st vertex of a and 1st vertex of b form overlap
    +        if equals(a1, b1)
    +            line_orient = line_hinge
    +            intr1 = (_tuple_point(a1, T), (zero(T), zero(T)))
    +        else
    +            line_orient = line_over
    +            intr1, intr2 = _set_ab_collinear_intrs(T, a1, b1, zero(T), zero(T), a1, b1, a_dist, b_dist)
    +        end
    +    elseif a1_in_b && b2_in_a  # 1st vertex of a and 2nd vertex of b form overlap
    +        if equals(a1, b2)
    +            line_orient = line_hinge
    +            intr1 = (_tuple_point(a1, T), (zero(T), one(T)))
    +        else
    +            line_orient = line_over
    +            intr1, intr2 = _set_ab_collinear_intrs(T, a1, b2, zero(T), one(T), a1, b1, a_dist, b_dist)
    +        end
    +    elseif a2_in_b && b1_in_a  # 2nd vertex of a and 1st vertex of b form overlap
    +        if equals(a2, b1)
    +            line_orient = line_hinge
    +            intr1 = (_tuple_point(a2, T), (one(T), zero(T)))
    +        else
    +            line_orient = line_over
    +            intr1, intr2 = _set_ab_collinear_intrs(T, a2, b1, one(T), zero(T), a1, b1, a_dist, b_dist)
    +        end
    +    elseif a2_in_b && b2_in_a  # 2nd vertex of a and 2nd vertex of b form overlap
    +        if equals(a2, b2)
    +            line_orient = line_hinge
    +            intr1 = (_tuple_point(a2, T), (one(T), one(T)))
    +        else
    +            line_orient = line_over
    +            intr1, intr2 = _set_ab_collinear_intrs(T, a2, b2, one(T), one(T), a1, b1, a_dist, b_dist)
    +        end
    +    end
    +    return line_orient, intr1, intr2
    +end
    +
    +#= Determine intersection points and segment fractions when overlap is made up one one
    +endpoint of segment (a1, a2) and one endpoint of segment (b1, b2). =#
    +_set_ab_collinear_intrs(::Type{T}, a_pt, b_pt, a_pt_α, b_pt_β, a1, b1, a_dist, b_dist) where T =
    +    (
    +        (_tuple_point(a_pt, T), (a_pt_α, _clamped_frac(distance(a_pt, b1, T), b_dist))),
    +        (_tuple_point(b_pt, T), (_clamped_frac(distance(b_pt, a1, T), a_dist), b_pt_β))
    +    )
    +
    +#= If lines defined by (a1, a2) and (b1, b2) are just touching at one of those endpoints and
    +are not collinear, then they form a hinge, with just that one shared intersection point.
    +Point equality is checked before segment orientation to have maximal accurary on fractions
    +to avoid floating point errors. If the points are not equal, we know that the hinge does not
    +take place at an endpoint and the fractions must be between 0 or 1 (exclusive). =#
    +function _find_hinge_intersection(::Type{T}, a1, a2, b1, b2, a1_orient, a2_orient, b1_orient) where T
    +    pt, α, β = if equals(a1, b1)
    +        _tuple_point(a1, T), zero(T), zero(T)
    +    elseif equals(a1, b2)
    +        _tuple_point(a1, T), zero(T), one(T)
    +    elseif equals(a2, b1)
    +        _tuple_point(a2, T), one(T), zero(T)
    +    elseif equals(a2, b2)
    +        _tuple_point(a2, T), one(T), one(T)
    +    elseif a1_orient == 0
    +        β_val = _clamped_frac(distance(b1, a1, T), distance(b1, b2, T), eps(T))
    +        _tuple_point(a1, T), zero(T), β_val
    +    elseif a2_orient == 0
    +        β_val = _clamped_frac(distance(b1, a2, T), distance(b1, b2, T), eps(T))
    +        _tuple_point(a2, T), one(T), β_val
    +    elseif b1_orient == 0
    +        α_val = _clamped_frac(distance(a1, b1, T), distance(a1, a2, T), eps(T))
    +        _tuple_point(b1, T), α_val, zero(T)
    +    else  # b2_orient == 0
    +        α_val = _clamped_frac(distance(a1, b2, T), distance(a1, a2, T), eps(T))
    +        _tuple_point(b2, T), α_val, one(T)
    +    end
    +    return pt, (α, β)
    +end
    +
    +#= If lines defined by (a1, a2) and (b1, b2) meet at one point that is not an endpoint of
    +either segment, they form a crossing intersection with a singular intersection point. That
    +point is calculated by finding the fractional distance along each segment the point occurs
    +at (α, β). If the point is too close to an endpoint to be distinct, the point shares a value
    +with the endpoint, but with a non-zero and non-one fractional value. If the intersection
    +point calculated is outside of the envelope of the two segments due to floating point error,
    +it is set to the endpoint of the two segments that is closest to the other segment.
    +Regardless of point value, we know that it does not actually occur at an endpoint so the
    +fractions must be between 0 or 1 (exclusive). =#
    +function _find_cross_intersection(::Type{T}, a1, a2, b1, b2, a_ext, b_ext) where T

    First line runs from a to a + Δa

    julia
        (a1x, a1y), (a2x, a2y) = _tuple_point(a1, T), _tuple_point(a2, T)
    +    Δax, Δay = a2x - a1x, a2y - a1y

    Second line runs from b to b + Δb

    julia
        (b1x, b1y), (b2x, b2y) = _tuple_point(b1, T), _tuple_point(b2, T)
    +    Δbx, Δby = b2x - b1x, b2y - b1y

    Differences between starting points

    julia
        Δbax = b1x - a1x
    +    Δbay = b1y - a1y
    +    a_cross_b = Δax * Δby - Δay * Δbx

    Determine α value where 0 < α < 1 and β value where 0 < β < 1

    julia
        α = _clamped_frac(Δbax * Δby - Δbay * Δbx, a_cross_b, eps(T))
    +    β = _clamped_frac(Δbax * Δay - Δbay * Δax, a_cross_b, eps(T))
    +
    +    #= Intersection will be where a1 + α * Δa = b1 + β * Δb. However, due to floating point
    +    inaccuracies, α and β calculations may yield different intersection points. Average
    +    both points together to minimize difference from real value, as long as segment isn't
    +    vertical or horizontal as this will almost certainly lead to the point being outside the
    +    envelope due to floating point error. Also note that floating point limitations could
    +    make intersection be endpoint if α≈0 or α≈1.=#
    +    x = if Δax == 0
    +        a1x
    +    elseif Δbx == 0
    +        b1x
    +    else
    +        (a1x + α * Δax + b1x + β * Δbx) / 2
    +    end
    +    y = if Δay == 0
    +        a1y
    +    elseif Δby == 0
    +        b1y
    +    else
    +        (a1y + α * Δay + b1y + β * Δby) / 2
    +    end
    +    pt = (x, y)

    Check if point is within segment envelopes and adjust to endpoint if not

    julia
        if !_point_in_extent(pt, a_ext) || !_point_in_extent(pt, b_ext)
    +        pt, α, β = _nearest_endpoint(T, a1, a2, b1, b2)
    +    end
    +    return (pt, (α, β))
    +end

    Find endpoint of either segment that is closest to the opposite segment

    julia
    function _nearest_endpoint(::Type{T}, a1, a2, b1, b2) where T

    Create lines from segments and calculate segment length

    julia
        a_line, a_dist = GI.Line(StaticArrays.SVector(a1, a2)), distance(a1, a2, T)
    +    b_line, b_dist = GI.Line(StaticArrays.SVector(b1, b2)), distance(b1, b2, T)

    Determine distance from a1 to segment b

    julia
        min_pt, min_dist = a1, distance(a1, b_line, T)
    +    α, β = eps(T), _clamped_frac(distance(min_pt, b1, T), b_dist, eps(T))

    Determine distance from a2 to segment b

    julia
        dist = distance(a2, b_line, T)
    +    if dist < min_dist
    +        min_pt, min_dist = a2, dist
    +        α, β = one(T) - eps(T), _clamped_frac(distance(min_pt, b1, T), b_dist, eps(T))
    +    end

    Determine distance from b1 to segment a

    julia
        dist = distance(b1, a_line, T)
    +    if dist < min_dist
    +        min_pt, min_dist = b1, dist
    +        α, β = _clamped_frac(distance(min_pt, a1, T), a_dist, eps(T)), eps(T)
    +    end

    Determine distance from b2 to segment a

    julia
        dist = distance(b2, a_line, T)
    +    if dist < min_dist
    +        min_pt, min_dist = b2, dist
    +        α, β = _clamped_frac(distance(min_pt, a2, T), a_dist, eps(T)), one(T) - eps(T)
    +    end

    Return point with smallest distance

    julia
        return _tuple_point(min_pt, T), α, β
    +end

    Return value of x/y clamped between ϵ and 1 - ϵ

    julia
    _clamped_frac(x::T, y::T, ϵ = zero(T)) where T = clamp(x / y, ϵ, one(T) - ϵ)

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/clipping/predicates.html b/previews/PR239/source/methods/clipping/predicates.html new file mode 100644 index 000000000..dc8c722ae --- /dev/null +++ b/previews/PR239/source/methods/clipping/predicates.html @@ -0,0 +1,68 @@ + + + + + + If we want to inject adaptivity, we would do something like: | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content
    julia
    module Predicates
    +    using ExactPredicates, ExactPredicates.Codegen
    +    import ExactPredicates: ext
    +    import ExactPredicates.Codegen: group!, @genpredicate
    +    import GeometryOps: _False, _True, _booltype, _tuple_point
    +    import GeoInterface as GI
    +
    +    #= Determine the orientation of c with regards to the oriented segment (a, b).
    +    Return 1 if c is to the left of (a, b).
    +    Return -1 if c is to the right of (a, b).
    +    Return 0 if c is on (a, b) or if a == b. =#
    +    orient(a, b, c; exact) = _orient(_booltype(exact), a, b, c)

    If exact is true, use ExactPredicates to calculate the orientation.

    julia
        _orient(::_True, a, b, c) = ExactPredicates.orient(_tuple_point(a, Float64), _tuple_point(b, Float64), _tuple_point(c, Float64))

    If exact is false, calculate the orientation without using ExactPredicates.

    julia
        function _orient(exact::_False, a, b, c)
    +        a = a .- c
    +        b = b .- c
    +        return _cross(exact, a, b)
    +    end
    +
    +    #= Determine the sign of the cross product of a and b.
    +    Return 1 if the cross product is positive.
    +    Return -1 if the cross product is negative.
    +    Return 0 if the cross product is 0. =#
    +    cross(a, b; exact) = _cross(_booltype(exact), a, b)
    +
    +    #= If `exact` is `true`, use exact cross product calculation created using
    +    `ExactPredicates`generated predicate. Note that as of now `ExactPredicates` requires
    +    Float64 so we must convert points a and b. =#
    +    _cross(::_True, a, b) = _cross_exact(_tuple_point(a, Float64), _tuple_point(b, Float64))

    Exact cross product calculation using ExactPredicates.

    julia
        @genpredicate function _cross_exact(a :: 2, b :: 2)
    +        group!(a...)
    +        group!(b...)
    +        ext(a, b)
    +    end

    If exact is false, calculate the cross product without using ExactPredicates.

    julia
        function _cross(::_False, a, b)
    +        c_t1 = GI.x(a) * GI.y(b)
    +        c_t2 = GI.y(a) * GI.x(b)
    +        c_val = if isapprox(c_t1, c_t2)
    +            0
    +        else
    +            sign(c_t1 - c_t2)
    +        end
    +        return c_val
    +    end
    +
    +end
    +
    +import .Predicates

    If we want to inject adaptivity, we would do something like:

    function cross(a, b, c) # try Predicates._cross_naive(a, b, c) # check the error bound there # then try Predicates._cross_adaptive(a, b, c) # then try Predicates._cross_exact end


    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/clipping/union.html b/previews/PR239/source/methods/clipping/union.html new file mode 100644 index 000000000..4252dd52b --- /dev/null +++ b/previews/PR239/source/methods/clipping/union.html @@ -0,0 +1,275 @@ + + + + + + Union Polygon Clipping | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Union Polygon Clipping

    julia
    export union
    +
    +"""
    +    union(geom_a, geom_b, [::Type{T}]; target::Type, fix_multipoly = UnionIntersectingPolygons())
    +
    +Return the union between two geometries as a list of geometries. Return an empty list if
    +none are found. The type of the list will be constrained as much as possible given the input
    +geometries. Furthermore, the user can provide a `taget` type as a keyword argument and a
    +list of target geometries found in the difference will be returned. The user can also
    +provide a float type 'T' that they would like the points of returned geometries to be. If
    +the user is taking a intersection involving one or more multipolygons, and the multipolygon
    +might be comprised of polygons that intersect, if `fix_multipoly` is set to an
    +`IntersectingPolygons` correction (the default is `UnionIntersectingPolygons()`), then the
    +needed multipolygons will be fixed to be valid before performing the intersection to ensure
    +a correct answer. Only set `fix_multipoly` to false if you know that the multipolygons are
    +valid, as it will avoid unneeded computation.
    +
    +Calculates the union between two polygons.
    +# Example
    +
    +```jldoctest
    +import GeoInterface as GI, GeometryOps as GO
    +
    +p1 = GI.Polygon([[(0.0, 0.0), (5.0, 5.0), (10.0, 0.0), (5.0, -5.0), (0.0, 0.0)]])
    +p2 = GI.Polygon([[(3.0, 0.0), (8.0, 5.0), (13.0, 0.0), (8.0, -5.0), (3.0, 0.0)]])
    +union_poly = GO.union(p1, p2; target = GI.PolygonTrait())
    +GI.coordinates.(union_poly)

    output

    julia
    1-element Vector{Vector{Vector{Vector{Float64}}}}:
    + [[[6.5, 3.5], [5.0, 5.0], [0.0, 0.0], [5.0, -5.0], [6.5, -3.5], [8.0, -5.0], [13.0, 0.0], [8.0, 5.0], [6.5, 3.5]]]
    +```
    +"""
    +function union(
    +    geom_a, geom_b, ::Type{T}=Float64; target=nothing, kwargs...
    +) where {T<:AbstractFloat}
    +    return _union(
    +        TraitTarget(target), T, GI.trait(geom_a), geom_a, GI.trait(geom_b), geom_b;
    +        exact = _True(), kwargs...,
    +    )
    +end
    +
    +#= This 'union' implementation returns the union of two polygons. The algorithm to determine
    +the union was adapted from "Efficient clipping of efficient polygons," by Greiner and
    +Hormann (1998). DOI: https://doi.org/10.1145/274363.274364 =#
    +function _union(
    +    ::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.PolygonTrait, poly_a,
    +    ::GI.PolygonTrait, poly_b;
    +    exact, kwargs...,
    +) where T

    First, I get the exteriors of the two polygons

    julia
        ext_a = GI.getexterior(poly_a)
    +    ext_b = GI.getexterior(poly_b)

    Then, I get the union of the exteriors

    julia
        a_list, b_list, a_idx_list = _build_ab_list(T, ext_a, ext_b, _union_delay_cross_f, _union_delay_bounce_f; exact)
    +    polys = _trace_polynodes(T, a_list, b_list, a_idx_list, _union_step, poly_a, poly_b)
    +    n_pieces = length(polys)

    Check if one polygon totally within other and if so, return the larger polygon

    julia
        a_in_b, b_in_a = false, false
    +    if n_pieces == 0 # no crossing points, determine if either poly is inside the other
    +        a_in_b, b_in_a = _find_non_cross_orientation(a_list, b_list, ext_a, ext_b; exact)
    +        if a_in_b
    +            push!(polys, GI.Polygon([_linearring(tuples(ext_b))]))
    +        elseif b_in_a
    +            push!(polys,  GI.Polygon([_linearring(tuples(ext_a))]))
    +        else
    +            push!(polys, tuples(poly_a))
    +            push!(polys, tuples(poly_b))
    +            return polys
    +        end
    +    elseif n_pieces > 1
    +        #= extra polygons are holes (n_pieces == 1 is the desired state) and since
    +        holes are formed by regions exterior to both poly_a and poly_b, they can't interact
    +        with pre-existing holes =#
    +        sort!(polys, by = area, rev = true)  # sort by area so first element is the exterior

    the first element is the exterior, the rest are holes

    julia
            @views append!(polys[1].geom, (GI.getexterior(p) for p in polys[2:end]))
    +        keepat!(polys, 1)
    +    end

    Add in holes

    julia
        if GI.nhole(poly_a) != 0 || GI.nhole(poly_b) != 0
    +        _add_union_holes!(polys, a_in_b, b_in_a, poly_a, poly_b; exact)
    +    end

    Remove unneeded collinear points on same edge

    julia
        _remove_collinear_points!(polys, [false], poly_a, poly_b)
    +    return polys
    +end

    Helper functions for Unions with Greiner and Hormann Polygon Clipping

    julia
    #= When marking the crossing status of a delayed crossing, the chain start point is crossing
    +when the start point is a entry point and is a bouncing point when the start point is an
    +exit point. The end of the chain has the opposite crossing / bouncing status. =#
    +_union_delay_cross_f(x) = (x, !x)
    +
    +#= When marking the crossing status of a delayed bouncing, the chain start and end points
    +are bouncing if the current polygon's adjacent edges are within the non-tracing polygon. If
    +the edges are outside then the chain endpoints are marked as crossing. x is a boolean
    +representing if the edges are inside or outside of the polygon. =#
    +_union_delay_bounce_f(x, _) = !x
    +
    +#= When tracing polygons, step backwards if the most recent intersection point was an entry
    +point, else step forwards where x is the entry/exit status. =#
    +_union_step(x, _) = x ? (-1) : 1
    +
    +#= Add holes from two polygons to the exterior polygon formed by their union. If adding the
    +the holes reveals that the polygons aren't actually intersecting, return the original
    +polygons. =#
    +function _add_union_holes!(polys, a_in_b, b_in_a, poly_a, poly_b; exact)
    +    if a_in_b
    +        _add_union_holes_contained_polys!(polys, poly_a, poly_b; exact)
    +    elseif b_in_a
    +        _add_union_holes_contained_polys!(polys, poly_b, poly_a; exact)
    +    else  # Polygons intersect, but neither is contained in the other
    +        n_a_holes = GI.nhole(poly_a)
    +        ext_poly_a = GI.Polygon(StaticArrays.SVector(GI.getexterior(poly_a)))
    +        ext_poly_b = GI.Polygon(StaticArrays.SVector(GI.getexterior(poly_b)))
    +        #= Start with poly_b when comparing with holes from poly_a and then switch to poly_a
    +        to compare with holes from poly_b. For current_poly, use ext_poly_b to avoid
    +        repeating overlapping holes in poly_a and poly_b =#
    +        curr_exterior_poly = n_a_holes > 0 ? ext_poly_b : ext_poly_a
    +        current_poly = n_a_holes > 0 ? ext_poly_b : poly_a

    Loop over all holes in both original polygons

    julia
            for (i, ih) in enumerate(Iterators.flatten((GI.gethole(poly_a), GI.gethole(poly_b))))
    +            ih = _linearring(ih)
    +            in_ext, _, _ = _line_polygon_interactions(ih, curr_exterior_poly; exact, closed_line = true)
    +            if !in_ext
    +                #= if the hole isn't in the overlapping region between the two polygons, add
    +                the hole to the resulting polygon as we know it can't interact with any
    +                other holes =#
    +                push!(polys[1].geom, ih)
    +            else
    +                #= if the hole is at least partially in the overlapping region, take the
    +                difference of the hole from the polygon it didn't originate from - note that
    +                when current_poly is poly_a this includes poly_a holes so overlapping holes
    +                between poly_a and poly_b within the overlap are added, in addition to all
    +                holes in non-overlapping regions =#
    +                h_poly = GI.Polygon(StaticArrays.SVector(ih))
    +                new_holes = difference(h_poly, current_poly; target = GI.PolygonTrait())
    +                append!(polys[1].geom, (GI.getexterior(new_h) for new_h in new_holes))
    +            end
    +            if i == n_a_holes
    +                curr_exterior_poly = ext_poly_a
    +                current_poly = poly_a
    +            end
    +        end
    +    end
    +    return
    +end
    +
    +#= Add holes holes to the union of two polygons where one of the original polygons was
    +inside of the other. If adding the the holes reveal that the polygons aren't actually
    +intersecting, return the original polygons.=#
    +function _add_union_holes_contained_polys!(polys, interior_poly, exterior_poly; exact)
    +    union_poly = polys[1]
    +    ext_int_ring = GI.getexterior(interior_poly)
    +    for (i, ih) in enumerate(GI.gethole(exterior_poly))
    +        poly_ih = GI.Polygon(StaticArrays.SVector(ih))
    +        in_ih, on_ih, out_ih = _line_polygon_interactions(ext_int_ring, poly_ih; exact, closed_line = true)
    +        if in_ih  # at least part of interior polygon exterior is within the ith hole
    +            if !on_ih && !out_ih
    +                #= interior polygon is completely within the ith hole - polygons aren't
    +                touching and do not actually form a union =#
    +                polys[1] = tuples(interior_poly)
    +                push!(polys, tuples(exterior_poly))
    +                return polys
    +            else
    +                #= interior polygon is partially within the ith hole - area of interior
    +                polygon reduces the size of the hole =#
    +                new_holes = difference(poly_ih, interior_poly; target = GI.PolygonTrait())
    +                append!(union_poly.geom, (GI.getexterior(new_h) for new_h in new_holes))
    +            end
    +        else  # none of interior polygon exterior is within the ith hole
    +            if !out_ih
    +                #= interior polygon's exterior is the same as the ith hole - polygons do
    +                form a union, but do not overlap so all holes stay in final polygon =#
    +                append!(union_poly.geom, Iterators.drop(GI.gethole(exterior_poly), i))
    +                append!(union_poly.geom, GI.gethole(interior_poly))
    +                return polys
    +            else
    +                #= interior polygon's exterior is outside of the ith hole - the interior
    +                polygon could either be disjoint from the hole, or contain the hole =#
    +                ext_int_poly = GI.Polygon(StaticArrays.SVector(ext_int_ring))
    +                in_int, _, _ = _line_polygon_interactions(ih, ext_int_poly; exact, closed_line = true)
    +                if in_int
    +                    #= interior polygon contains the hole - overlapping holes between the
    +                    interior and exterior polygons will be added =#
    +                    for jh in GI.gethole(interior_poly)
    +                        poly_jh = GI.Polygon(StaticArrays.SVector(jh))
    +                        if intersects(poly_ih, poly_jh)
    +                            new_holes = intersection(poly_ih, poly_jh; target = GI.PolygonTrait())
    +                            append!(union_poly.geom, (GI.getexterior(new_h) for new_h in new_holes))
    +                        end
    +                    end
    +                else
    +                    #= interior polygon and the exterior polygon are disjoint - add the ith
    +                    hole as it is not covered by the interior polygon =#
    +                    push!(union_poly.geom, ih)
    +                end
    +            end
    +        end
    +    end
    +    return
    +end
    +
    +#= Polygon with multipolygon union - note that all sub-polygons of `multipoly_b` will be
    +included, unioning these sub-polygons with `poly_a` where they intersect. Unless specified
    +with `fix_multipoly = nothing`, `multipolygon_b` will be validated using the given (default
    +is `UnionIntersectingPolygons()`) correction. =#
    +function _union(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.PolygonTrait, poly_a,
    +    ::GI.MultiPolygonTrait, multipoly_b;
    +    fix_multipoly = UnionIntersectingPolygons(), kwargs...,
    +) where T
    +    if !isnothing(fix_multipoly) # Fix multipoly_b to prevent repeated regions in the output
    +        multipoly_b = fix_multipoly(multipoly_b)
    +    end
    +    polys = [tuples(poly_a, T)]
    +    for poly_b in GI.getpolygon(multipoly_b)
    +        if intersects(polys[1], poly_b)

    If polygons intersect and form a new polygon, swap out polygon

    julia
                new_polys = union(polys[1], poly_b; target)
    +            if length(new_polys) > 1 # case where they intersect by just one point
    +                push!(polys, tuples(poly_b, T))  # add poly_b to list
    +            else
    +                polys[1] = new_polys[1]
    +            end
    +        else

    If they don't intersect, poly_b is now a part of the union as its own polygon

    julia
                push!(polys, tuples(poly_b, T))
    +        end
    +    end
    +    return polys
    +end
    +
    +#= Multipolygon with polygon union is equivalent to taking the union of the polygon with the
    +multipolygon and thus simply switches the order of operations and calls the above method. =#
    +_union(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.MultiPolygonTrait, multipoly_a,
    +    ::GI.PolygonTrait, poly_b;
    +    kwargs...,
    +) where T = union(poly_b, multipoly_a; target, kwargs...)
    +
    +#= Multipolygon with multipolygon union - note that all of the sub-polygons of `multipoly_a`
    +and the sub-polygons of `multipoly_b` are included and combined together where there are
    +intersections. Unless specified with `fix_multipoly = nothing`, `multipolygon_b` will be
    +validated using the given (default is `UnionIntersectingPolygons()`) correction. =#
    +function _union(
    +    target::TraitTarget{GI.PolygonTrait}, ::Type{T},
    +    ::GI.MultiPolygonTrait, multipoly_a,
    +    ::GI.MultiPolygonTrait, multipoly_b;
    +    fix_multipoly = UnionIntersectingPolygons(), kwargs...,
    +) where T
    +    if !isnothing(fix_multipoly) # Fix multipoly_b to prevent repeated regions in the output
    +        multipoly_b = fix_multipoly(multipoly_b)
    +        fix_multipoly = nothing
    +    end
    +    multipolys = multipoly_b
    +    local polys
    +    for poly_a in GI.getpolygon(multipoly_a)
    +        polys = union(poly_a, multipolys; target, fix_multipoly)
    +        multipolys = GI.MultiPolygon(polys)
    +    end
    +    return polys
    +end

    Many type and target combos aren't implemented

    julia
    function _union(
    +    ::TraitTarget{Target}, ::Type{T},
    +    trait_a::GI.AbstractTrait, geom_a,
    +    trait_b::GI.AbstractTrait, geom_b;
    +    kwargs...
    +) where {Target,T}
    +    throw(ArgumentError("Union between $trait_a and $trait_b with target $Target isn't implemented yet."))
    +    return nothing
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/convex_hull.html b/previews/PR239/source/methods/convex_hull.html new file mode 100644 index 000000000..5d71e52ba --- /dev/null +++ b/previews/PR239/source/methods/convex_hull.html @@ -0,0 +1,81 @@ + + + + + + Convex hull | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Convex hull

    The convex hull of a set of points is the smallest convex polygon that contains all the points.

    GeometryOps.jl provides a number of methods for computing the convex hull of a set of points, usually linked to other Julia packages.

    For now, we expose one algorithm, MonotoneChainMethod, which uses the DelaunayTriangulation.jl package. The GEOS() interface also supports convex hulls.

    Future work could include other algorithms, such as Quickhull.jl, or similar, via package extensions.

    Example

    Simple hull

    julia
    import GeometryOps as GO, GeoInterface as GI
    +using CairoMakie # to plot
    +
    +points = randn(GO.Point2f, 100)
    +f, a, p = plot(points; label = "Points")
    +hull_poly = GO.convex_hull(points)
    +lines!(a, hull_poly; label = "Convex hull", color = Makie.wong_colors()[2])
    +axislegend(a)
    +f

    Convex hull of the USA

    julia
    import GeometryOps as GO, GeoInterface as GI
    +using CairoMakie # to plot
    +using NaturalEarth # for data
    +
    +all_adm0 = naturalearth("admin_0_countries", 110)
    +usa = all_adm0.geometry[findfirst(==("USA"), all_adm0.ADM0_A3)]
    +f, a, p = lines(usa)
    +lines!(a, GO.convex_hull(usa); color = Makie.wong_colors()[2])
    +f

    Investigating the winding order

    The winding order of the monotone chain method is counterclockwise, while the winding order of the GEOS method is clockwise.

    GeometryOps' convexity detection says that the GEOS hull is convex, while the monotone chain method hull is not. However, they are both going over the same points (we checked), it's just that the winding order is different.

    In reality, both sets are convex, but we need to fix the GeometryOps convexity detector (isconcave)!

    We may also decide at a later date to change the returned winding order of the polygon, but most algorithms are robust to that, and you can always fix it...

    julia
    import GeoInterface as GI, GeometryOps as GO, LibGEOS as LG
    +using CairoMakie # to plot
    +
    +points = rand(Point2{Float64}, 100)
    +go_hull = GO.convex_hull(GO.MonotoneChainMethod(), points)
    +lg_hull = GO.convex_hull(GO.GEOS(), points)
    +
    +fig = Figure()
    +a1, p1 = lines(fig[1, 1], go_hull; color = 1:GI.npoint(go_hull), axis = (; title = "MonotoneChainMethod()"))
    +a2, p2 = lines(fig[2, 1], lg_hull; color = 1:GI.npoint(lg_hull), axis = (; title = "GEOS()"))
    +cb = Colorbar(fig[1:2, 2], p1; label = "Vertex number")
    +fig

    Implementation

    julia
    """
    +    convex_hull([method], geometries)
    +
    +Compute the convex hull of the points in `geometries`.
    +Returns a `GI.Polygon` representing the convex hull.
    +
    +Note that the polygon returned is wound counterclockwise
    +as in the Simple Features standard by default.  If you
    +choose GEOS, the winding order will be inverted.
    +
    +!!! warning
    +    This interface only computes the 2-dimensional convex hull!
    +
    +    For higher dimensional hulls, use the relevant package (Qhull.jl, Quickhull.jl, or similar).
    +"""
    +function convex_hull end
    +
    +"""
    +    MonotoneChainMethod()
    +
    +This is an algorithm for the `convex_hull` function.
    +
    +Uses [`DelaunayTriangulation.jl`](https://github.com/JuliaGeometry/DelaunayTriangulation.jl) to compute the convex hull.
    +This is a pure Julia algorithm which provides an optimal Delaunay triangulation.
    +
    +See also `convex_hull`
    +"""
    +struct MonotoneChainMethod end

    GrahamScanMethod, etc. can be implemented in GO as well, if someone wants to. If we add an extension on Quickhull.jl, then that would be another algorithm.

    julia
    convex_hull(geometries) = convex_hull(MonotoneChainMethod(), geometries)

    TODO: have this respect the CRS by pulling it out of geometries.

    julia
    function convex_hull(::MonotoneChainMethod, geometries)

    Extract all points as tuples. We have to collect and allocate here, because DelaunayTriangulation only accepts vectors of point-like geoms.

    Cleanest would be to use the iterable from GO.flatten directly, but that would require us to implement the convex hull algorithm directly.

    TODO: create a specialized method that extracts only the information required, GeometryBasics points can be passed through directly.

    julia
        points = collect(flatten(tuples, GI.PointTrait, geometries))

    Compute the convex hull using DelTri (shorthand for DelaunayTriangulation.jl).

    julia
        hull = DelaunayTriangulation.convex_hull(points)

    Convert the result to a GI.Polygon and return it. View would be more efficient here, but re-allocating is cleaner.

    julia
        point_vec = DelaunayTriangulation.get_points(hull)[DelaunayTriangulation.get_vertices(hull)]
    +    return GI.Polygon([GI.LinearRing(point_vec)])
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/distance.html b/previews/PR239/source/methods/distance.html new file mode 100644 index 000000000..ef340e664 --- /dev/null +++ b/previews/PR239/source/methods/distance.html @@ -0,0 +1,205 @@ + + + + + + Distance and signed distance | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Distance and signed distance

    julia
    export distance, signed_distance

    What is distance? What is signed distance?

    Distance is the distance of a point to another geometry. This is always a positive number. If a point is inside of geometry, so on a curve or inside of a polygon, the distance will be zero. Signed distance is mainly used for polygons and multipolygons. If a point is outside of a geometry, signed distance has the same value as distance. However, points within the geometry have a negative distance representing the distance of a point to the closest boundary. Therefore, for all "non-filled" geometries, like curves, the distance will either be positive or 0.

    To provide an example, consider this rectangle:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +rect = GI.Polygon([[(0,0), (0,1), (1,1), (1,0), (0, 0)]])
    +point_in = (0.5, 0.5)
    +point_out = (0.5, 1.5)
    +f, a, p = poly(collect(GI.getpoint(rect)); axis = (; aspect = DataAspect()))
    +scatter!(GI.x(point_in), GI.y(point_in); color = :red)
    +scatter!(GI.x(point_out), GI.y(point_out); color = :orange)
    +f

    This is clearly a rectangle with one point inside and one point outside. The points are both an equal distance to the polygon. The distance to point_in is negative while the distance to point_out is positive.

    julia
    (
    +GO.distance(point_in, rect),  # == 0
    +GO.signed_distance(point_in, rect),  # < 0
    +GO.signed_distance(point_out, rect)  # > 0
    +)
    (0.0, -0.5, 0.5)

    Consider also a heatmap of signed distances around this object:

    julia
    xrange = yrange = LinRange(-0.5, 1.5, 300)
    +f, a, p = heatmap(xrange, yrange, GO.signed_distance.(Point2f.(xrange, yrange'), Ref(rect)); colormap = :RdBu, colorrange = (-0.75, 0.75))
    +a.aspect = DataAspect(); Colorbar(f[1, 2], p, label = "Signed distance"); lines!(a, GI.convert(GO.GeometryBasics, rect)); f

    Implementation

    This is the GeoInterface-compatible implementation. First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait. This is also used in the implementation, since it's a lot less work!

    Distance and signed distance are only implemented for points to other geometries right now. This could be extended to include distance from other geometries in the future.

    The distance calculated is the Euclidean distance using the Pythagorean theorem. Also note that singed_distance only makes sense for "filled-in" shapes, like polygons, so it isn't implemented for curves.

    julia
    const _DISTANCE_TARGETS = TraitTarget{Union{GI.AbstractPolygonTrait,GI.LineStringTrait,GI.LinearRingTrait,GI.LineTrait,GI.PointTrait}}()
    +
    +"""
    +    distance(point, geom, ::Type{T} = Float64)::T
    +
    +Calculates the  ditance from the geometry `g1` to the `point`. The distance
    +will always be positive or zero.
    +
    +The method will differ based on the type of the geometry provided:
    +    - The distance from a point to a point is just the Euclidean distance
    +    between the points.
    +    - The distance from a point to a line is the minimum distance from the point
    +    to the closest point on the given line.
    +    - The distance from a point to a linestring is the minimum distance from the
    +    point to the closest segment of the linestring.
    +    - The distance from a point to a linear ring is the minimum distance from
    +    the point to the closest segment of the linear ring.
    +    - The distance from a point to a polygon is zero if the point is within the
    +    polygon and otherwise is the minimum distance from the point to an edge of
    +    the polygon. This includes edges created by holes.
    +    - The distance from a point to a multigeometry or a geometry collection is
    +    the minimum distance between the point and any of the sub-geometries.
    +
    +Result will be of type T, where T is an optional argument with a default value
    +of Float64.
    +"""
    +function distance(
    +    geom1, geom2, ::Type{T} = Float64; threaded=false
    +) where T<:AbstractFloat
    +    distance(GI.trait(geom1), geom1, GI.trait(geom2), geom2, T; threaded)
    +end
    +function distance(
    +    trait1, geom, trait2::GI.PointTrait, point, ::Type{T} = Float64;
    +    threaded=false
    +) where T<:AbstractFloat
    +    distance(trait2, point, trait1, geom, T) # Swap order
    +end
    +function distance(
    +    trait1::GI.PointTrait, point, trait2, geom, ::Type{T} = Float64;
    +    threaded=false
    +) where T<:AbstractFloat
    +    applyreduce(min, _DISTANCE_TARGETS, geom; threaded, init=typemax(T)) do g
    +        _distance(T, trait1, point, GI.trait(g), g)
    +    end
    +end

    Needed for method ambiguity

    julia
    function distance(
    +    trait1::GI.PointTrait, point1, trait2::GI.PointTrait, point2, ::Type{T} = Float64;
    +    threaded=false
    +) where T<:AbstractFloat
    +    _distance(T, trait1, point1, trait2, point2)
    +end

    Point-Point, Point-Line, Point-LineString, Point-LinearRing

    julia
    _distance(::Type{T}, ::GI.PointTrait, point, ::GI.PointTrait, geom) where T =
    +    _euclid_distance(T, point, geom)
    +_distance(::Type{T}, ::GI.PointTrait, point, ::GI.LineTrait, geom) where T =
    +    _distance_line(T, point, GI.getpoint(geom, 1), GI.getpoint(geom, 2))
    +_distance(::Type{T}, ::GI.PointTrait, point, ::GI.LineStringTrait, geom) where T =
    +    _distance_curve(T, point, geom; close_curve = false)
    +_distance(::Type{T}, ::GI.PointTrait, point, ::GI.LinearRingTrait, geom) where T =
    +    _distance_curve(T, point, geom; close_curve = true)

    Point-Polygon

    julia
    function _distance(::Type{T}, ::GI.PointTrait, point, ::GI.PolygonTrait, geom) where T
    +    within(point, geom) && return zero(T)
    +    return _distance_polygon(T, point, geom)
    +end
    +
    +"""
    +    signed_distance(point, geom, ::Type{T} = Float64)::T
    +
    +Calculates the signed distance from the geometry `geom` to the given point.
    +Points within `geom` have a negative signed distance, and points outside of
    +`geom` have a positive signed distance.
    +    - The signed distance from a point to a point, line, linestring, or linear
    +    ring is equal to the distance between the two.
    +    - The signed distance from a point to a polygon is negative if the point is
    +    within the polygon and is positive otherwise. The value of the distance is
    +    the minimum distance from the point to an edge of the polygon. This includes
    +    edges created by holes.
    +    - The signed distance from a point to a multigeometry or a geometry
    +    collection is the minimum signed distance between the point and any of the
    +    sub-geometries.
    +
    +Result will be of type T, where T is an optional argument with a default value
    +of Float64.
    +"""
    +function signed_distance(
    +    geom1, geom2, ::Type{T} = Float64; threaded=false
    +) where T<:AbstractFloat
    +    signed_distance(GI.trait(geom1), geom1, GI.trait(geom2), geom2, T; threaded)
    +end
    +function signed_distance(
    +    trait1, geom, trait2::GI.PointTrait, point, ::Type{T} = Float64;
    +    threaded=false
    +) where T<:AbstractFloat
    +    signed_distance(trait2, point, trait1, geom, T; threaded) # Swap order
    +end
    +function signed_distance(
    +    trait1::GI.PointTrait, point, trait2, geom, ::Type{T} = Float64;
    +    threaded=false
    +) where T<:AbstractFloat
    +    applyreduce(min, _DISTANCE_TARGETS, geom; threaded, init=typemax(T)) do g
    +        _signed_distance(T, trait1, point, GI.trait(g), g)
    +    end
    +end

    Needed for method ambiguity

    julia
    function signed_distance(
    +    trait1::GI.PointTrait, point1, trait2::GI.PointTrait, point2, ::Type{T} = Float64;
    +    threaded=false
    +) where T<:AbstractFloat
    +    _signed_distance(T, trait1, point1, trait2, point2)
    +end

    Point-Geom (just calls _distance)

    julia
    function _signed_distance(
    +    ::Type{T}, ptrait::GI.PointTrait, point, gtrait::GI.AbstractGeometryTrait, geom
    +) where T
    +    _distance(T, ptrait, point, gtrait, geom)
    +end

    Point-Polygon

    julia
    function _signed_distance(::Type{T}, ::GI.PointTrait, point, ::GI.PolygonTrait, geom) where T
    +    min_dist = _distance_polygon(T, point, geom)
    +    return within(point, geom) ? -min_dist : min_dist

    negative if point is inside polygon

    julia
    end

    Returns the Euclidean distance between two points.

    julia
    Base.@propagate_inbounds _euclid_distance(::Type{T}, p1, p2) where T =
    +    sqrt(_squared_euclid_distance(T, p1, p2))

    Returns the square of the euclidean distance between two points

    julia
    Base.@propagate_inbounds _squared_euclid_distance(::Type{T}, p1, p2) where T =
    +    _squared_euclid_distance(
    +        T,
    +        GeoInterface.x(p1), GeoInterface.y(p1),
    +        GeoInterface.x(p2), GeoInterface.y(p2),
    +    )

    Returns the Euclidean distance between two points given their x and y values.

    julia
    Base.@propagate_inbounds _euclid_distance(::Type{T}, x1, y1, x2, y2) where T =
    +    sqrt(_squared_euclid_distance(T, x1, y1, x2, y2))

    Returns the squared Euclidean distance between two points given their x and y values.

    julia
    Base.@propagate_inbounds _squared_euclid_distance(::Type{T}, x1, y1, x2, y2) where T =
    +    T((x2 - x1)^2 + (y2 - y1)^2)

    Returns the minimum distance from point p0 to the line defined by endpoints p1 and p2.

    julia
    _distance_line(::Type{T}, p0, p1, p2) where T =
    +    sqrt(_squared_distance_line(T, p0, p1, p2))

    Returns the squared minimum distance from point p0 to the line defined by endpoints p1 and p2.

    julia
    function _squared_distance_line(::Type{T}, p0, p1, p2) where T
    +    x0, y0 = GeoInterface.x(p0), GeoInterface.y(p0)
    +    x1, y1 = GeoInterface.x(p1), GeoInterface.y(p1)
    +    x2, y2 = GeoInterface.x(p2), GeoInterface.y(p2)
    +
    +    xfirst, yfirst, xlast, ylast = x1 < x2 ? (x1, y1, x2, y2) : (x2, y2, x1, y1)
    +
    +    #=
    +    Vectors from first point to last point (v) and from first point to point of
    +    interest (w) to find the projection of w onto v to find closest point
    +    =#
    +    v = (xlast - xfirst, ylast - yfirst)
    +    w = (x0 - xfirst, y0 - yfirst)
    +
    +    c1 = sum(w .* v)
    +    if c1 <= 0  # p0 is closest to first endpoint
    +        return _squared_euclid_distance(T, x0, y0, xfirst, yfirst)
    +    end
    +
    +    c2 = sum(v .* v)
    +    if c2 <= c1 # p0 is closest to last endpoint
    +        return _squared_euclid_distance(T, x0, y0, xlast, ylast)
    +    end
    +
    +    b2 = c1 / c2  # projection fraction
    +    return _squared_euclid_distance(T, x0, y0, xfirst + (b2 * v[1]), yfirst + (b2 * v[2]))
    +end

    Returns the minimum distance from the given point to the given curve. If close_curve is true, make sure to include the edge from the first to last point of the curve, even if it isn't explicitly repeated.

    julia
    function _distance_curve(::Type{T}, point, curve; close_curve = false) where T

    see if linear ring has explicitly repeated last point in coordinates

    julia
        np = GI.npoint(curve)
    +    first_last_equal = equals(GI.getpoint(curve, 1), GI.getpoint(curve, np))
    +    close_curve &= first_last_equal
    +    np -= first_last_equal ? 1 : 0

    find minimum distance

    julia
        min_dist = typemax(T)
    +    p1 = GI.getpoint(curve, close_curve ? np : 1)
    +    for i in (close_curve ? 1 : 2):np
    +        p2 = GI.getpoint(curve, i)
    +        dist = _distance_line(T, point, p1, p2)
    +        min_dist = dist < min_dist ? dist : min_dist
    +        p1 = p2
    +    end
    +    return min_dist
    +end

    Returns the minimum distance from the given point to an edge of the given polygon, including from edges created by holes. Assumes polygon isn't filled and treats the exterior and each hole as a linear ring.

    julia
    function _distance_polygon(::Type{T}, point, poly) where T
    +    min_dist = _distance_curve(T, point, GI.getexterior(poly); close_curve = true)
    +    @inbounds for hole in GI.gethole(poly)
    +        dist = _distance_curve(T, point, hole; close_curve = true)
    +        min_dist = dist < min_dist ? dist : min_dist
    +    end
    +    return min_dist
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/equals.html b/previews/PR239/source/methods/equals.html new file mode 100644 index 000000000..ad8c967b6 --- /dev/null +++ b/previews/PR239/source/methods/equals.html @@ -0,0 +1,289 @@ + + + + + + Equals | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Equals

    julia
    export equals

    What is equals?

    The equals function checks if two geometries are equal. They are equal if they share the same set of points and edges to define the same shape.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +l1 = GI.LineString([(0.0, 0.0), (0.0, 10.0)])
    +l2 = GI.LineString([(0.0, -10.0), (0.0, 3.0)])
    +f, a, p = lines(GI.getpoint(l1), color = :blue)
    +scatter!(GI.getpoint(l1), color = :blue)
    +lines!(GI.getpoint(l2), color = :orange)
    +scatter!(GI.getpoint(l2), color = :orange)
    +f

    We can see that the two lines do not share a common set of points and edges in the plot, so they are not equal:

    julia
    GO.equals(l1, l2)  # returns false
    false

    Implementation

    This is the GeoInterface-compatible implementation.

    First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait. This is also used in the implementation, since it's a lot less work!

    Note that while we need the same set of points and edges, they don't need to be provided in the same order for polygons. For for example, we need the same set points for two multipoints to be equal, but they don't have to be saved in the same order. The winding order also doesn't have to be the same to represent the same geometry. This requires checking every point against every other point in the two geometries we are comparing. Also, some geometries must be "closed" like polygons and linear rings. These will be assumed to be closed, even if they don't have a repeated last point explicitly written in the coordinates. Additionally, geometries and multi-geometries can be equal if the multi-geometry only includes that single geometry.

    julia
    """
    +    equals(geom1, geom2)::Bool
    +
    +Compare two Geometries return true if they are the same geometry.
    +
    +# Examples
    +```jldoctest
    +import GeometryOps as GO, GeoInterface as GI
    +poly1 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
    +poly2 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
    +
    +GO.equals(poly1, poly2)

    output

    julia
    true
    +```
    +"""
    +equals(geom_a, geom_b) = equals(
    +    GI.trait(geom_a), geom_a,
    +    GI.trait(geom_b), geom_b,
    +)
    +
    +"""
    +    equals(::T, geom_a, ::T, geom_b)::Bool
    +
    +Two geometries of the same type, which don't have a equals function to dispatch
    +off of should throw an error.
    +"""
    +equals(::T, geom_a, ::T, geom_b) where T = error("Cant compare $T yet")
    +
    +"""
    +    equals(trait_a, geom_a, trait_b, geom_b)
    +
    +Two geometries which are not of the same type cannot be equal so they always
    +return false.
    +"""
    +equals(trait_a, geom_a, trait_b, geom_b) = false
    +
    +"""
    +    equals(::GI.PointTrait, p1, ::GI.PointTrait, p2)::Bool
    +
    +Two points are the same if they have the same x and y (and z if 3D) coordinates.
    +"""
    +function equals(::GI.PointTrait, p1, ::GI.PointTrait, p2)
    +    GI.ncoord(p1) == GI.ncoord(p2) || return false
    +    GI.x(p1) == GI.x(p2) || return false
    +    GI.y(p1) == GI.y(p2) || return false
    +    if GI.is3d(p1)
    +        GI.z(p1) == GI.z(p2) || return false
    +    end
    +    return true
    +end
    +
    +"""
    +    equals(::GI.PointTrait, p1, ::GI.MultiPointTrait, mp2)::Bool
    +
    +A point and a multipoint are equal if the multipoint is composed of a single
    +point that is equivalent to the given point.
    +"""
    +function equals(::GI.PointTrait, p1, ::GI.MultiPointTrait, mp2)
    +    GI.npoint(mp2) == 1 || return false
    +    return equals(p1, GI.getpoint(mp2, 1))
    +end
    +
    +"""
    +    equals(::GI.MultiPointTrait, mp1, ::GI.PointTrait, p2)::Bool
    +
    +A point and a multipoint are equal if the multipoint is composed of a single
    +point that is equivalent to the given point.
    +"""
    +equals(trait1::GI.MultiPointTrait, mp1, trait2::GI.PointTrait, p2) =
    +    equals(trait2, p2, trait1, mp1)
    +
    +"""
    +    equals(::GI.MultiPointTrait, mp1, ::GI.MultiPointTrait, mp2)::Bool
    +
    +Two multipoints are equal if they share the same set of points.
    +"""
    +function equals(::GI.MultiPointTrait, mp1, ::GI.MultiPointTrait, mp2)
    +    GI.npoint(mp1) == GI.npoint(mp2) || return false
    +    for p1 in GI.getpoint(mp1)
    +        has_match = false  # if point has a matching point in other multipoint
    +        for p2 in GI.getpoint(mp2)
    +            if equals(p1, p2)
    +                has_match = true
    +                break
    +            end
    +        end
    +        has_match || return false  # if no matching point, can't be equal
    +    end
    +    return true  # all points had a match
    +end
    +
    +"""
    +    _equals_curves(c1, c2, closed_type1, closed_type2)::Bool
    +
    +Two curves are equal if they share the same set of point, representing the same
    +geometry. Both curves must must be composed of the same set of points, however,
    +they do not have to wind in the same direction, or start on the same point to be
    +equivalent.
    +Inputs:
    +    c1 first geometry
    +    c2 second geometry
    +    closed_type1::Bool true if c1 is closed by definition (polygon, linear ring)
    +    closed_type2::Bool true if c2 is closed by definition (polygon, linear ring)
    +"""
    +function _equals_curves(c1, c2, closed_type1, closed_type2)

    Check if both curves are closed or not

    julia
        n1 = GI.npoint(c1)
    +    n2 = GI.npoint(c2)
    +    c1_repeat_point = GI.getpoint(c1, 1) == GI.getpoint(c1, n1)
    +    n2 = GI.npoint(c2)
    +    c2_repeat_point = GI.getpoint(c2, 1) == GI.getpoint(c2, n2)
    +    closed1 = closed_type1 || c1_repeat_point
    +    closed2 = closed_type2 || c2_repeat_point
    +    closed1 == closed2 || return false

    How many points in each curve

    julia
        n1 -= c1_repeat_point ? 1 : 0
    +    n2 -= c2_repeat_point ? 1 : 0
    +    n1 == n2 || return false
    +    n1 == 0 && return true

    Find offset between curves

    julia
        jstart = nothing
    +    p1 = GI.getpoint(c1, 1)
    +    for i in 1:n2
    +        if equals(p1, GI.getpoint(c2, i))
    +            jstart = i
    +            break
    +        end
    +    end

    no point matches the first point

    julia
        isnothing(jstart) && return false

    found match for only point

    julia
        n1 == 1 && return true

    if isn't closed and first or last point don't match, not same curve

    julia
        !closed_type1 && (jstart != 1 && jstart != n1) && return false

    Check if curves are going in same direction

    julia
        i = 2
    +    j = jstart + 1
    +    j -= j > n2 ? n2 : 0
    +    same_direction = equals(GI.getpoint(c1, i), GI.getpoint(c2, j))

    if only 2 points, we have already compared both

    julia
        n1 == 2 && return same_direction

    Check all remaining points are the same wrapping around line

    julia
        jstep = same_direction ? 1 : -1
    +    for i in 2:n1
    +        ip = GI.getpoint(c1, i)
    +        j = jstart + (i - 1) * jstep
    +        j += (0 < j <= n2) ? 0 : (n2 * -jstep)
    +        jp = GI.getpoint(c2, j)
    +        equals(ip, jp) || return false
    +    end
    +    return true
    +end
    +
    +"""
    +    equals(
    +        ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
    +        ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
    +    )::Bool
    +
    +Two lines/linestrings are equal if they share the same set of points going
    +along the curve. Note that lines/linestrings aren't closed by definition.
    +"""
    +equals(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
    +) = _equals_curves(l1, l2, false, false)
    +
    +"""
    +    equals(
    +        ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
    +        ::GI.LinearRingTrait, l2,
    +    )::Bool
    +
    +A line/linestring and a linear ring are equal if they share the same set of
    +points going along the curve. Note that lines aren't closed by definition, but
    +rings are, so the line must have a repeated last point to be equal
    +"""
    +equals(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, l1,
    +    ::GI.LinearRingTrait, l2,
    +) = _equals_curves(l1, l2, false, true)
    +
    +"""
    +    equals(
    +        ::GI.LinearRingTrait, l1,
    +        ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
    +    )::Bool
    +
    +A linear ring and a line/linestring are equal if they share the same set of
    +points going along the curve. Note that lines aren't closed by definition, but
    +rings are, so the line must have a repeated last point to be equal
    +"""
    +equals(
    +    ::GI.LinearRingTrait, l1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, l2,
    +) = _equals_curves(l1, l2, true, false)
    +
    +"""
    +    equals(
    +        ::GI.LinearRingTrait, l1,
    +        ::GI.LinearRingTrait, l2,
    +    )::Bool
    +
    +Two linear rings are equal if they share the same set of points going along the
    +curve. Note that rings are closed by definition, so they can have, but don't
    +need, a repeated last point to be equal.
    +"""
    +equals(
    +    ::GI.LinearRingTrait, l1,
    +    ::GI.LinearRingTrait, l2,
    +) = _equals_curves(l1, l2, true, true)
    +
    +"""
    +    equals(::GI.PolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool
    +
    +Two polygons are equal if they share the same exterior edge and holes.
    +"""
    +function equals(::GI.PolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)

    Check if exterior is equal

    julia
        _equals_curves(
    +        GI.getexterior(geom_a), GI.getexterior(geom_b),
    +        true, true,  # linear rings are closed by definition
    +    ) || return false

    Check if number of holes are equal

    julia
        GI.nhole(geom_a) == GI.nhole(geom_b) || return false

    Check if holes are equal

    julia
        for ihole in GI.gethole(geom_a)
    +        has_match = false
    +        for jhole in GI.gethole(geom_b)
    +            if _equals_curves(
    +                ihole, jhole,
    +                true, true,  # linear rings are closed by definition
    +            )
    +                has_match = true
    +                break
    +            end
    +        end
    +        has_match || return false
    +    end
    +    return true
    +end
    +
    +"""
    +    equals(::GI.PolygonTrait, geom_a, ::GI.MultiPolygonTrait, geom_b)::Bool
    +
    +A polygon and a multipolygon are equal if the multipolygon is composed of a
    +single polygon that is equivalent to the given polygon.
    +"""
    +function equals(::GI.PolygonTrait, geom_a, ::MultiPolygonTrait, geom_b)
    +    GI.npolygon(geom_b) == 1 || return false
    +    return equals(geom_a, GI.getpolygon(geom_b, 1))
    +end
    +
    +"""
    +    equals(::GI.MultiPolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool
    +
    +A polygon and a multipolygon are equal if the multipolygon is composed of a
    +single polygon that is equivalent to the given polygon.
    +"""
    +equals(trait_a::GI.MultiPolygonTrait, geom_a, trait_b::PolygonTrait, geom_b) =
    +    equals(trait_b, geom_b, trait_a, geom_a)
    +
    +"""
    +    equals(::GI.PolygonTrait, geom_a, ::GI.PolygonTrait, geom_b)::Bool
    +
    +Two multipolygons are equal if they share the same set of polygons.
    +"""
    +function equals(::GI.MultiPolygonTrait, geom_a, ::GI.MultiPolygonTrait, geom_b)

    Check if same number of polygons

    julia
        GI.npolygon(geom_a) == GI.npolygon(geom_b) || return false

    Check if each polygon has a matching polygon

    julia
        for poly_a in GI.getpolygon(geom_a)
    +        has_match = false
    +        for poly_b in GI.getpolygon(geom_b)
    +            if equals(poly_a, poly_b)
    +                has_match = true
    +                break
    +            end
    +        end
    +        has_match || return false
    +    end
    +    return true
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/geom_relations/contains.html b/previews/PR239/source/methods/geom_relations/contains.html new file mode 100644 index 000000000..16ce2df2b --- /dev/null +++ b/previews/PR239/source/methods/geom_relations/contains.html @@ -0,0 +1,57 @@ + + + + + + Contains | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Contains

    julia
    export contains

    What is contains?

    The contains function checks if a given geometry completely contains another geometry, or in other words, that the second geometry is completely within the first. This requires that the two interiors intersect and that the interior and boundary of the second geometry is not in the exterior of the first geometry.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +l1 = GI.LineString([(0.0, 0.0), (1.0, 0.0), (0.0, 0.1)])
    +l2 = GI.LineString([(0.25, 0.0), (0.75, 0.0)])
    +f, a, p = lines(GI.getpoint(l1), color = :blue)
    +scatter!(GI.getpoint(l1), color = :blue)
    +lines!(GI.getpoint(l2), color = :orange)
    +scatter!(GI.getpoint(l2), color = :orange)
    +f

    We can see that all of the points and edges of l2 are within l1, so l1 contains l2. However, l2 does not contain l1.

    julia
    GO.contains(l1, l2)  # returns true
    +GO.contains(l2, l1)  # returns false
    false

    Implementation

    This is the GeoInterface-compatible implementation.

    Given that contains is the exact opposite of within, we simply pass the two inputs variables, swapped in order, to within.

    julia
    """
    +    contains(g1::AbstractGeometry, g2::AbstractGeometry)::Bool
    +
    +Return true if the second geometry is completely contained by the first
    +geometry. The interiors of both geometries must intersect and the interior and
    +boundary of the secondary (g2) must not intersect the exterior of the first
    +(g1).
    +
    +`contains` returns the exact opposite result of `within`.
    +
    +# Examples
    +
    +```jldoctest
    +import GeometryOps as GO, GeoInterface as GI
    +line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
    +point = GI.Point((1, 2))
    +
    +GO.contains(line, point)

    output

    julia
    true
    +```
    +"""
    +contains(g1, g2) = GeometryOps.within(g2, g1)

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/geom_relations/coveredby.html b/previews/PR239/source/methods/geom_relations/coveredby.html new file mode 100644 index 000000000..c3e870bc1 --- /dev/null +++ b/previews/PR239/source/methods/geom_relations/coveredby.html @@ -0,0 +1,207 @@ + + + + + + CoveredBy | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    CoveredBy

    julia
    export coveredby

    What is coveredby?

    The coveredby function checks if one geometry is covered by another geometry. This is an extension of within that does not require the interiors of the two geometries to intersect, but still does require that the interior and boundary of the first geometry isn't outside of the second geometry.

    To provide an example, consider this point and line:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +p1 = (0.0, 0.0)
    +l1 = GI.Line([p1, (1.0, 1.0)])
    +f, a, p = lines(GI.getpoint(l1))
    +scatter!(p1, color = :red)
    +f

    As we can see, p1 is on the endpoint of l1. This means it is not within, but it does meet the definition of coveredby.

    julia
    GO.coveredby(p1, l1)  # true
    true

    Implementation

    This is the GeoInterface-compatible implementation.

    First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait.

    Each of these calls a method in the geom_geom_processors file. The methods in this file determine if the given geometries meet a set of criteria. For the coveredby function and arguments g1 and g2, this criteria is as follows: - points of g1 are allowed to be in the interior of g2 (either through overlap or crossing for lines) - points of g1 are allowed to be on the boundary of g2 - points of g1 are not allowed to be in the exterior of g2 - no points of g1 are required to be in the interior of g2 - no points of g1 are required to be on the boundary of g2 - no points of g1 are required to be in the exterior of g2

    The code for the specific implementations is in the geom_geom_processors file.

    julia
    const COVEREDBY_ALLOWS = (in_allow = true, on_allow = true, out_allow = false)
    +const COVEREDBY_CURVE_ALLOWS = (over_allow = true, cross_allow = true, on_allow = true, out_allow = false)
    +const COVEREDBY_CURVE_REQUIRES = (in_require = false, on_require = false, out_require = false)
    +const COVEREDBY_POLYGON_REQUIRES = (in_require = true, on_require = false, out_require = false,)
    +const COVEREDBY_EXACT = (exact = _False(),)
    +
    +"""
    +    coveredby(g1, g2)::Bool
    +
    +Return `true` if the first geometry is completely covered by the second
    +geometry. The interior and boundary of the primary geometry (g1) must not
    +intersect the exterior of the secondary geometry (g2).
    +
    +Furthermore, `coveredby` returns the exact opposite result of `covers`. They are
    +equivalent with the order of the arguments swapped.
    +
    +# Examples
    +```jldoctest setup=:(using GeometryOps, GeometryBasics)
    +import GeometryOps as GO, GeoInterface as GI
    +p1 = GI.Point(0.0, 0.0)
    +p2 = GI.Point(1.0, 1.0)
    +l1 = GI.Line([p1, p2])
    +
    +GO.coveredby(p1, l1)

    output

    julia
    true
    +```
    +"""
    +coveredby(g1, g2) = _coveredby(trait(g1), g1, trait(g2), g2)

    Convert features to geometries

    julia
    _coveredby(::GI.FeatureTrait, g1, ::Any, g2) = coveredby(GI.geometry(g1), g2)
    +_coveredby(::Any, g1, t2::GI.FeatureTrait, g2) = coveredby(g1, GI.geometry(g2))
    +_coveredby(::FeatureTrait, g1, ::FeatureTrait, g2) = coveredby(GI.geometry(g1), GI.geometry(g2))

    Points coveredby geometries

    Point is coveredby another point if those points are equal

    julia
    _coveredby(
    +    ::GI.PointTrait, g1,
    +    ::GI.PointTrait, g2,
    +) = equals(g1, g2)

    Point is coveredby a line/linestring if it is on a line vertex or an edge

    julia
    _coveredby(
    +    ::GI.PointTrait, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _point_curve_process(
    +    g1, g2;
    +    COVEREDBY_ALLOWS...,
    +    closed_curve = false,
    +)

    Point is coveredby a linearring if it is on a vertex or an edge of ring

    julia
    _coveredby(
    +    ::GI.PointTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _point_curve_process(
    +    g1, g2;
    +    COVEREDBY_ALLOWS...,
    +    closed_curve = true,
    +)

    Point is coveredby a polygon if it is inside polygon, including edges/vertices

    julia
    _coveredby(
    +    ::GI.PointTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _point_polygon_process(
    +    g1, g2;
    +    COVEREDBY_ALLOWS...,
    +    COVEREDBY_EXACT...,
    +)

    Points cannot cover any geometry other than points

    julia
    _coveredby(
    +    ::Union{GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    ::GI.PointTrait, g2,
    +) = false

    Lines coveredby geometries

    julia
    #= Linestring is coveredby a line if all interior and boundary points of the
    +first line are on the interior/boundary points of the second line. =#
    +_coveredby(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    COVEREDBY_CURVE_ALLOWS...,
    +    COVEREDBY_CURVE_REQUIRES...,
    +    COVEREDBY_EXACT...,
    +    closed_line = false,
    +    closed_curve = false,
    +)
    +
    +#= Linestring is coveredby a ring if all interior and boundary points of the
    +line are on the edges of the ring. =#
    +_coveredby(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    COVEREDBY_CURVE_ALLOWS...,
    +    COVEREDBY_CURVE_REQUIRES...,
    +    COVEREDBY_EXACT...,
    +    closed_line = false,
    +    closed_curve = true,
    +)
    +
    +#= Linestring is coveredby a polygon if all interior and boundary points of the
    +line are in the polygon interior or on its edges, including hole edges. =#
    +_coveredby(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    COVEREDBY_ALLOWS...,
    +    COVEREDBY_CURVE_REQUIRES...,
    +    COVEREDBY_EXACT...,
    +    closed_line = false,
    +)

    Rings covered by geometries

    julia
    #= Linearring is covered by a line if all vertices and edges of the ring are on
    +the edges and vertices of the line. =#
    +_coveredby(
    +    ::GI.LinearRingTrait, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    COVEREDBY_CURVE_ALLOWS...,
    +    COVEREDBY_CURVE_REQUIRES...,
    +    COVEREDBY_EXACT...,
    +    closed_line = true,
    +    closed_curve = false,
    +)
    +
    +#= Linearring is covered by another linear ring if all vertices and edges of the
    +first ring are on the edges/vertices of the second ring. =#
    +_coveredby(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    COVEREDBY_CURVE_ALLOWS...,
    +    COVEREDBY_CURVE_REQUIRES...,
    +    COVEREDBY_EXACT...,
    +    closed_line = true,
    +    closed_curve = true,
    +)
    +
    +#= Linearring is coveredby a polygon if all vertices and edges of the ring are
    +in the polygon interior or on the polygon edges, including hole edges. =#
    +_coveredby(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    COVEREDBY_ALLOWS...,
    +    COVEREDBY_CURVE_REQUIRES...,
    +    COVEREDBY_EXACT...,
    +    closed_line = true,
    +)

    Polygons covered by geometries

    julia
    #= Polygon is covered by another polygon if if the interior and edges of the
    +first polygon are in the second polygon interior or on polygon edges, including
    +hole edges.=#
    +_coveredby(
    +    ::GI.PolygonTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _polygon_polygon_process(
    +    g1, g2;
    +    COVEREDBY_ALLOWS...,
    +    COVEREDBY_POLYGON_REQUIRES...,
    +    COVEREDBY_EXACT...,
    +)

    Polygons cannot covered by any curves

    julia
    _coveredby(
    +    ::GI.PolygonTrait, g1,
    +    ::GI.AbstractCurveTrait, g2,
    +) = false

    Geometries coveredby multi-geometry/geometry collections

    julia
    #= Geometry is covered by a multi-geometry or a collection if one of the elements
    +of the collection cover the geometry. =#
    +function _coveredby(
    +    ::Union{GI.PointTrait, GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g2,
    +)
    +    for sub_g2 in GI.getgeom(g2)
    +        coveredby(g1, sub_g2) && return true
    +    end
    +    return false
    +end

    Multi-geometry/geometry collections coveredby geometries

    julia
    #= Multi-geometry or a geometry collection is covered by a geometry if all
    +elements of the collection are covered by the geometry. =#
    +function _coveredby(
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g1,
    +    ::GI.AbstractGeometryTrait, g2,
    +)
    +    for sub_g1 in GI.getgeom(g1)
    +        !coveredby(sub_g1, g2) && return false
    +    end
    +    return true
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/geom_relations/covers.html b/previews/PR239/source/methods/geom_relations/covers.html new file mode 100644 index 000000000..557e15b1d --- /dev/null +++ b/previews/PR239/source/methods/geom_relations/covers.html @@ -0,0 +1,57 @@ + + + + + + Covers | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Covers

    julia
    export covers

    What is covers?

    The covers function checks if a given geometry completely covers another geometry. For this to be true, the "contained" geometry's interior and boundaries must be covered by the "covering" geometry's interior and boundaries. The interiors do not need to overlap.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +p1 = (0.0, 0.0)
    +p2 = (1.0, 1.0)
    +l1 = GI.Line([p1, p2])
    +
    +f, a, p = lines(GI.getpoint(l1))
    +scatter!(p1, color = :red)
    +f

    julia
    GO.covers(l1, p1)  # returns true
    +GO.covers(p1, l1)  # returns false
    false

    Implementation

    This is the GeoInterface-compatible implementation.

    Given that covers is the exact opposite of coveredby, we simply pass the two inputs variables, swapped in order, to coveredby.

    julia
    """
    +    covers(g1::AbstractGeometry, g2::AbstractGeometry)::Bool
    +
    +Return true if the first geometry is completely covers the second geometry,
    +The exterior and boundary of the second geometry must not be outside of the
    +interior and boundary of the first geometry. However, the interiors need not
    +intersect.
    +
    +`covers` returns the exact opposite result of `coveredby`.
    +
    +# Examples
    +
    +```jldoctest
    +import GeometryOps as GO, GeoInterface as GI
    +l1 = GI.LineString([(1.0, 1.0), (1.0, 2.0), (1.0, 3.0), (1.0, 4.0)])
    +l2 = GI.LineString([(1.0, 1.0), (1.0, 2.0)])
    +
    +GO.covers(l1, l2)

    output

    julia
    true
    +```
    +"""
    +covers(g1, g2)::Bool = GeometryOps.coveredby(g2, g1)

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/geom_relations/crosses.html b/previews/PR239/source/methods/geom_relations/crosses.html new file mode 100644 index 000000000..8f08ce933 --- /dev/null +++ b/previews/PR239/source/methods/geom_relations/crosses.html @@ -0,0 +1,144 @@ + + + + + + Crossing checks | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Crossing checks

    julia
    """
    +     crosses(geom1, geom2)::Bool
    +
    +Return `true` if the intersection results in a geometry whose dimension is one less than
    +the maximum dimension of the two source geometries and the intersection set is interior to
    +both source geometries.
    +
    +TODO: broken
    +
    +# Examples
    +```julia
    +import GeoInterface as GI, GeometryOps as GO

    TODO: Add working example

    julia
    ```
    +"""
    +crosses(g1, g2)::Bool = crosses(trait(g1), g1, trait(g2), g2)::Bool
    +crosses(t1::FeatureTrait, g1, t2, g2)::Bool = crosses(GI.geometry(g1), g2)
    +crosses(t1, g1, t2::FeatureTrait, g2)::Bool = crosses(g1, geometry(g2))
    +crosses(::MultiPointTrait, g1, ::LineStringTrait, g2)::Bool = multipoint_crosses_line(g1, g2)
    +crosses(::MultiPointTrait, g1, ::PolygonTrait, g2)::Bool = multipoint_crosses_poly(g1, g2)
    +crosses(::LineStringTrait, g1, ::MultiPointTrait, g2)::Bool = multipoint_crosses_lines(g2, g1)
    +crosses(::LineStringTrait, g1, ::PolygonTrait, g2)::Bool = line_crosses_poly(g1, g2)
    +crosses(::LineStringTrait, g1, ::LineStringTrait, g2)::Bool = line_crosses_line(g1, g2)
    +crosses(::PolygonTrait, g1, ::MultiPointTrait, g2)::Bool = multipoint_crosses_poly(g2, g1)
    +crosses(::PolygonTrait, g1, ::LineStringTrait, g2)::Bool = line_crosses_poly(g2, g1)
    +
    +function multipoint_crosses_line(geom1, geom2)
    +    int_point = false
    +    ext_point = false
    +    i = 1
    +    np2 = GI.npoint(geom2)
    +
    +    while i < GI.npoint(geom1) && !int_point && !ext_point
    +        for j in 1:GI.npoint(geom2) - 1
    +            exclude_boundary = (j === 1 || j === np2 - 2) ? :none : :both
    +            if _point_on_segment(GI.getpoint(geom1, i), (GI.getpoint(geom2, j), GI.getpoint(geom2, j + 1)); exclude_boundary)
    +                int_point = true
    +            else
    +                ext_point = true
    +            end
    +        end
    +        i += 1
    +    end
    +    return int_point && ext_point
    +end
    +
    +function line_crosses_line(line1, line2)
    +    np2 = GI.npoint(line2)
    +    if GeometryOps.intersects(line1, line2)
    +        for i in 1:GI.npoint(line1) - 1
    +            for j in 1:GI.npoint(line2) - 1
    +                exclude_boundary = (j === 1 || j === np2 - 2) ? :none : :both
    +                pa = GI.getpoint(line1, i)
    +                pb = GI.getpoint(line1, i + 1)
    +                p = GI.getpoint(line2, j)
    +                _point_on_segment(p, (pa, pb); exclude_boundary) && return true
    +            end
    +        end
    +    end
    +    return false
    +end
    +
    +function line_crosses_poly(line, poly)
    +    for l in flatten(AbstractCurveTrait, poly)
    +        intersects(line, l) && return true
    +    end
    +    return false
    +end
    +
    +function multipoint_crosses_poly(mp, poly)
    +    int_point = false
    +    ext_point = false
    +
    +    for p in GI.getpoint(mp)
    +        if _point_polygon_process(
    +            p, poly;
    +            in_allow = true, on_allow = true, out_allow = false, exact = _False()
    +        )
    +            int_point = true
    +        else
    +            ext_point = true
    +        end
    +        int_point && ext_point && return true
    +    end
    +    return false
    +end
    +
    +#= TODO: Once crosses is swapped over to use the geom relations workflow, can
    +delete these helpers. =#
    +
    +function _point_on_segment(point, (start, stop); exclude_boundary::Symbol=:none)::Bool
    +    x, y = GI.x(point), GI.y(point)
    +    x1, y1 = GI.x(start), GI.y(start)
    +    x2, y2 = GI.x(stop), GI.y(stop)
    +
    +    dxc = x - x1
    +    dyc = y - y1
    +    dx1 = x2 - x1
    +    dy1 = y2 - y1

    TODO use better predicate for crossing here

    julia
        cross = dxc * dy1 - dyc * dx1
    +    cross != 0 && return false

    Will constprop optimise these away?

    julia
        if exclude_boundary === :none
    +        if abs(dx1) >= abs(dy1)
    +            return dx1 > 0 ? x1 <= x && x <= x2 : x2 <= x && x <= x1
    +        end
    +        return dy1 > 0 ? y1 <= y && y <= y2 : y2 <= y && y <= y1
    +    elseif exclude_boundary === :start
    +        if abs(dx1) >= abs(dy1)
    +             return dx1 > 0 ? x1 < x && x <= x2 : x2 <= x && x < x1
    +        end
    +        return dy1 > 0 ? y1 < y && y <= y2 : y2 <= y && y < y1
    +    elseif exclude_boundary === :end
    +        if abs(dx1) >= abs(dy1)
    +            return dx1 > 0 ? x1 <= x && x < x2 : x2 < x && x <= x1
    +        end
    +        return dy1 > 0 ? y1 <= y && y < y2 : y2 < y && y <= y1
    +    elseif exclude_boundary === :both
    +        if abs(dx1) >= abs(dy1)
    +            return dx1 > 0 ? x1 < x && x < x2 : x2 < x && x < x1
    +        end
    +        return dy1 > 0 ? y1 < y && y < y2 : y2 < y && y < y1
    +    end
    +    return false
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/geom_relations/disjoint.html b/previews/PR239/source/methods/geom_relations/disjoint.html new file mode 100644 index 000000000..3b0b82b1b --- /dev/null +++ b/previews/PR239/source/methods/geom_relations/disjoint.html @@ -0,0 +1,202 @@ + + + + + + Disjoint | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Disjoint

    julia
    export disjoint

    What is disjoint?

    The disjoint function checks if one geometry is outside of another geometry, without sharing any boundaries or interiors.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +l1 = GI.LineString([(0.0, 0.0), (1.0, 0.0), (0.0, 0.1)])
    +l2 = GI.LineString([(2.0, 0.0), (2.75, 0.0)])
    +f, a, p = lines(GI.getpoint(l1), color = :blue)
    +scatter!(GI.getpoint(l1), color = :blue)
    +lines!(GI.getpoint(l2), color = :orange)
    +scatter!(GI.getpoint(l2), color = :orange)
    +f

    We can see that none of the edges or vertices of l1 interact with l2 so they are disjoint.

    julia
    GO.disjoint(l1, l2)  # returns true
    true

    Implementation

    This is the GeoInterface-compatible implementation.

    First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait.

    Each of these calls a method in the geom_geom_processors file. The methods in this file determine if the given geometries meet a set of criteria. For the disjoint function and arguments g1 and g2, this criteria is as follows: - points of g1 are not allowed to be in the interior of g2 - points of g1 are not allowed to be on the boundary of g2 - points of g1 are allowed to be in the exterior of g2 - no points required to be in the interior of g2 - no points of g1 are required to be on the boundary of g2 - no points of g1 are required to be in the exterior of g2

    The code for the specific implementations is in the geom_geom_processors file.

    julia
    const DISJOINT_ALLOWS = (in_allow = false, on_allow = false, out_allow = true)
    +const DISJOINT_CURVE_ALLOWS = (over_allow = false, cross_allow = false, on_allow = false, out_allow = true)
    +const DISJOINT_REQUIRES = (in_require = false, on_require = false, out_require = false)
    +const DISJOINT_EXACT = (exact = _False(),)
    +
    +"""
    +    disjoint(geom1, geom2)::Bool
    +
    +Return `true` if the first geometry is disjoint from the second geometry.
    +
    +Return `true` if the first geometry is disjoint from the second geometry. The
    +interiors and boundaries of both geometries must not intersect.
    +
    +# Examples
    +```jldoctest setup=:(using GeometryOps, GeoInterface)
    +import GeometryOps as GO, GeoInterface as GI
    +
    +line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
    +point = (2, 2)
    +GO.disjoint(point, line)

    output

    julia
    true
    +```
    +"""
    +disjoint(g1, g2) = _disjoint(trait(g1), g1, trait(g2), g2)

    Convert features to geometries

    julia
    _disjoint(::FeatureTrait, g1, ::Any, g2) = disjoint(GI.geometry(g1), g2)
    +_disjoint(::Any, g1, ::FeatureTrait, g2) = disjoint(g1, geometry(g2))
    +_disjoint(::FeatureTrait, g1, ::FeatureTrait, g2) = disjoint(GI.geometry(g1), GI.geometry(g2))

    Point disjoint geometries

    Point is disjoint from another point if the points are not equal.

    julia
    _disjoint(
    +    ::GI.PointTrait, g1,
    +    ::GI.PointTrait, g2,
    +) = !equals(g1, g2)

    Point is disjoint from a linestring if it is not on the line's edges/vertices.

    julia
    _disjoint(
    +    ::GI.PointTrait, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _point_curve_process(
    +    g1, g2;
    +    DISJOINT_ALLOWS...,
    +    closed_curve = false,
    +)

    Point is disjoint from a linearring if it is not on the ring's edges/vertices.

    julia
    _disjoint(
    +    ::GI.PointTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _point_curve_process(
    +    g1, g2;
    +    DISJOINT_ALLOWS...,
    +    closed_curve = true,
    +)
    +
    +#= Point is disjoint from a polygon if it is not on any edges, vertices, or
    +within the polygon's interior. =#
    +_disjoint(
    +    ::GI.PointTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _point_polygon_process(
    +    g1, g2;
    +    DISJOINT_ALLOWS...,
    +    DISJOINT_EXACT...,
    +)
    +
    +#= Geometry is disjoint from a point if the point is not in the interior or on
    +the boundary of the geometry. =#
    +_disjoint(
    +    trait1::Union{GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    trait2::GI.PointTrait, g2,
    +) = _disjoint(trait2, g2, trait1, g1)

    Lines disjoint geometries

    julia
    #= Linestring is disjoint from another line if they do not share any interior
    +edge/vertex points or boundary points. =#
    +_disjoint(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    DISJOINT_CURVE_ALLOWS...,
    +    DISJOINT_REQUIRES...,
    +    DISJOINT_EXACT...,
    +    closed_line = false,
    +    closed_curve = false,
    +)
    +
    +#= Linestring is disjoint from a linearring if they do not share any interior
    +edge/vertex points or boundary points. =#
    +_disjoint(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    DISJOINT_CURVE_ALLOWS...,
    +    DISJOINT_REQUIRES...,
    +    DISJOINT_EXACT...,
    +    closed_line = false,
    +    closed_curve = true,
    +)
    +
    +#= Linestring is disjoint from a polygon if the interior and boundary points of
    +the line are not in the polygon's interior or on the polygon's boundary. =#
    +_disjoint(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    DISJOINT_ALLOWS...,
    +    DISJOINT_REQUIRES...,
    +    DISJOINT_EXACT...,
    +    closed_line = false,
    +)
    +
    +#= Geometry is disjoint from a linestring if the line's interior and boundary
    +points don't intersect with the geometry's interior and boundary points. =#
    +_disjoint(
    +    trait1::Union{GI.LinearRingTrait, GI.PolygonTrait}, g1,
    +    trait2::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _disjoint(trait2, g2, trait1, g1)

    Rings disjoint geometries

    julia
    #= Linearrings is disjoint from another linearring if they do not share any
    +interior edge/vertex points or boundary points.=#
    +_disjoint(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    DISJOINT_CURVE_ALLOWS...,
    +    DISJOINT_REQUIRES...,
    +    DISJOINT_EXACT...,
    +    closed_line = true,
    +    closed_curve = true,
    +)
    +
    +#= Linearring is disjoint from a polygon if the interior and boundary points of
    +the ring are not in the polygon's interior or on the polygon's boundary. =#
    +_disjoint(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    DISJOINT_ALLOWS...,
    +    DISJOINT_REQUIRES...,
    +    DISJOINT_EXACT...,
    +    closed_line = true,
    +)

    Polygon disjoint geometries

    julia
    #= Polygon is disjoint from another polygon if they do not share any edges or
    +vertices and if their interiors do not intersect, excluding any holes. =#
    +_disjoint(
    +    ::GI.PolygonTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _polygon_polygon_process(
    +    g1, g2;
    +    DISJOINT_ALLOWS...,
    +    DISJOINT_REQUIRES...,
    +    DISJOINT_EXACT...,
    +)

    Geometries disjoint multi-geometry/geometry collections

    julia
    #= Geometry is disjoint from a multi-geometry or a collection if all of the
    +elements of the collection are disjoint from the geometry. =#
    +function _disjoint(
    +    ::Union{GI.PointTrait, GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g2,
    +)
    +    for sub_g2 in GI.getgeom(g2)
    +        !disjoint(g1, sub_g2) && return false
    +    end
    +    return true
    +end

    Multi-geometry/geometry collections coveredby geometries

    julia
    #= Multi-geometry or a geometry collection is covered by a geometry if all
    +elements of the collection are covered by the geometry. =#
    +function _disjoint(
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g1,
    +    ::GI.AbstractGeometryTrait, g2,
    +)
    +    for sub_g1 in GI.getgeom(g1)
    +        !disjoint(sub_g1, g2) && return false
    +    end
    +    return true
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/geom_relations/geom_geom_processors.html b/previews/PR239/source/methods/geom_relations/geom_geom_processors.html new file mode 100644 index 000000000..4a17334ae --- /dev/null +++ b/previews/PR239/source/methods/geom_relations/geom_geom_processors.html @@ -0,0 +1,461 @@ + + + + + + Line-curve interaction | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Line-curve interaction

    julia
    #= Code is based off of DE-9IM Standards (https://en.wikipedia.org/wiki/DE-9IM)
    +and attempts a standardized solution for most of the functions.
    +=#
    +
    +"""
    +    Enum PointOrientation
    +
    +Enum for the orientation of a point with respect to a curve. A point can be
    +`point_in` the curve, `point_on` the curve, or `point_out` of the curve.
    +"""
    +@enum PointOrientation point_in=1 point_on=2 point_out=3

    Determines if a point meets the given checks with respect to a curve.

    If in_allow is true, the point can be on the curve interior. If on_allow is true, the point can be on the curve boundary. If out_allow is true, the point can be disjoint from the curve.

    If the point is in an "allowed" location, return true. Else, return false.

    If closed_curve is true, curve is treated as a closed curve where the first and last point are connected by a segment.

    julia
    function _point_curve_process(
    +    point, curve;
    +    in_allow, on_allow, out_allow,
    +    closed_curve = false,
    +)

    Determine if curve is closed

    julia
        n = GI.npoint(curve)
    +    first_last_equal = equals(GI.getpoint(curve, 1), GI.getpoint(curve, n))
    +    closed_curve |= first_last_equal
    +    n -= first_last_equal ? 1 : 0

    Loop through all curve segments

    julia
        p_start = GI.getpoint(curve, closed_curve ? n : 1)
    +    @inbounds for i in (closed_curve ? 1 : 2):n
    +        p_end = GI.getpoint(curve, i)
    +        seg_val = _point_segment_orientation(point, p_start, p_end)
    +        seg_val == point_in && return in_allow
    +        if seg_val == point_on
    +            if !closed_curve  # if point is on curve endpoints, it is "on"
    +                i == 2 && equals(point, p_start) && return on_allow
    +                i == n && equals(point, p_end) && return on_allow
    +            end
    +            return in_allow
    +        end
    +        p_start = p_end
    +    end
    +    return out_allow
    +end

    Determines if a point meets the given checks with respect to a polygon.

    If in_allow is true, the point can be within the polygon interior If on_allow is true, the point can be on the polygon boundary. If out_allow is true, the point can be disjoint from the polygon.

    If the point is in an "allowed" location, return true. Else, return false.

    julia
    function _point_polygon_process(
    +    point, polygon;
    +    in_allow, on_allow, out_allow, exact,
    +)

    Check interaction of geom with polygon's exterior boundary

    julia
        ext_val = _point_filled_curve_orientation(point, GI.getexterior(polygon); exact)

    If a point is outside, it isn't interacting with any holes

    julia
        ext_val == point_out && return out_allow

    if a point is on an external boundary, it isn't interacting with any holes

    julia
        ext_val == point_on && return on_allow

    If geom is within the polygon, need to check interactions with holes

    julia
        for hole in GI.gethole(polygon)
    +        hole_val = _point_filled_curve_orientation(point, hole; exact)

    If a point in in a hole, it is outside of the polygon

    julia
            hole_val == point_in && return out_allow

    If a point in on a hole edge, it is on the edge of the polygon

    julia
            hole_val == point_on && return on_allow
    +    end

    Point is within external boundary and on in/on any holes

    julia
        return in_allow
    +end

    Determines if a line meets the given checks with respect to a curve.

    If over_allow is true, segments of the line and curve can be co-linear. If cross_allow is true, segments of the line and curve can cross. If on_allow is true, endpoints of either the line or curve can intersect a segment of the other geometry. If cross_allow is true, segments of the line and curve can be disjoint.

    If in_require is true, the interiors of the line and curve must meet in at least one point. If on_require is true, the boundary of one of the two geometries can meet the interior or boundary of the other geometry in at least one point. If out_require is true, there must be at least one point of the given line that is exterior of the curve.

    If the point is in an "allowed" location and meets all requirements, return true. Else, return false.

    If closed_line is true, line is treated as a closed line where the first and last point are connected by a segment. Same with closed_curve.

    julia
    @inline function _line_curve_process(line, curve;
    +    over_allow, cross_allow, kw...
    +)
    +    skip, returnval = _maybe_skip_disjoint_extents(line, curve;
    +        in_allow=(over_allow | cross_allow), kw...
    +    )
    +    skip && return returnval
    +
    +    return _inner_line_curve_process(line, curve; over_allow, cross_allow, kw...)
    +end
    +
    +function _inner_line_curve_process(
    +    line, curve;
    +    over_allow, cross_allow, on_allow, out_allow,
    +    in_require, on_require, out_require,
    +    closed_line = false, closed_curve = false,
    +    exact,
    +)

    Set up requirements

    julia
        in_req_met = !in_require
    +    on_req_met = !on_require
    +    out_req_met = !out_require

    Determine curve endpoints

    julia
        nl = GI.npoint(line)
    +    nc = GI.npoint(curve)
    +    first_last_equal_line = equals(GI.getpoint(line, 1), GI.getpoint(line, nl))
    +    first_last_equal_curve = equals(GI.getpoint(curve, 1), GI.getpoint(curve, nc))
    +    nl -= first_last_equal_line ? 1 : 0
    +    nc -= first_last_equal_curve ? 1 : 0
    +    closed_line |= first_last_equal_line
    +    closed_curve |= first_last_equal_curve

    Loop over each line segment

    julia
        l_start = _tuple_point(GI.getpoint(line, closed_line ? nl : 1))
    +    i = closed_line ? 1 : 2
    +    while i  nl
    +        l_end = _tuple_point(GI.getpoint(line, i))
    +        c_start = _tuple_point(GI.getpoint(curve, closed_curve ? nc : 1))

    Loop over each curve segment

    julia
            for j in (closed_curve ? 1 : 2):nc
    +            c_end = _tuple_point(GI.getpoint(curve, j))

    Check if line and curve segments meet

    julia
                seg_val, intr1, _ = _intersection_point(Float64, (l_start, l_end), (c_start, c_end); exact)

    If segments are co-linear

    julia
                if seg_val == line_over
    +                !over_allow && return false

    at least one point in, meets requirements

    julia
                    in_req_met = true
    +                point_val = _point_segment_orientation(l_start, c_start, c_end)

    If entire segment isn't covered, consider remaining section

    julia
                    if point_val != point_out
    +                    i, l_start, break_off = _find_new_seg(i, l_start, l_end, c_start, c_end)
    +                    break_off && break
    +                end
    +            else
    +                if seg_val == line_cross
    +                    !cross_allow && return false
    +                    in_req_met = true
    +                elseif seg_val == line_hinge  # could cross or overlap

    Determine location of intersection point on each segment

    julia
                        (_, (α, β)) = intr1
    +                    if ( # Don't consider edges of curves as they can't cross
    +                        (!closed_line && ((α == 0 && i == 2) ||== 1 && i == nl))) ||
    +                        (!closed_curve && ((β == 0 && j == 2) ||== 1 && j == nc)))
    +                    )
    +                        !on_allow && return false
    +                        on_req_met = true
    +                    else
    +                        in_req_met = true

    If needed, determine if hinge actually crosses

    julia
                            if (!cross_allow || !over_allow) && α != 0 && β != 0

    Find next pieces of hinge to see if line and curve cross

    julia
                                l, c = _find_hinge_next_segments(
    +                                α, β, l_start, l_end, c_start, c_end,
    +                                i, line, j, curve,
    +                            )
    +                            next_val, _, _ = _intersection_point(Float64, l, c; exact)
    +                            if next_val == line_hinge
    +                                !cross_allow && return false
    +                            else
    +                                !over_allow && return false
    +                            end
    +                        end
    +                    end
    +                end

    no overlap for a give segment, some of segment must be out of curve

    julia
                    if j == nc
    +                    !out_allow && return false
    +                    out_req_met = true
    +                end
    +            end
    +            c_start = c_end  # consider next segment of curve
    +            if j == nc  # move on to next line segment
    +                i += 1
    +                l_start = l_end
    +            end
    +        end
    +    end
    +    return in_req_met && on_req_met && out_req_met
    +end
    +
    +#= If entire segment (le to ls) isn't covered by segment (cs to ce), find remaining section
    +part of section outside of cs to ce. If completely covered, increase segment index i. =#
    +function _find_new_seg(i, ls, le, cs, ce)
    +    break_off = true
    +    if _point_segment_orientation(le, cs, ce) != point_out
    +        ls = le
    +        i += 1
    +    elseif !equals(ls, cs) && _point_segment_orientation(cs, ls, le) != point_out
    +        ls = cs
    +    elseif !equals(ls, ce) && _point_segment_orientation(ce, ls, le) != point_out
    +        ls = ce
    +    else
    +        break_off = false
    +    end
    +    return i, ls, break_off
    +end
    +
    +#= Find next set of segments needed to determine if given hinge segments cross or not.=#
    +function _find_hinge_next_segments(α, β, ls, le, cs, ce, i, line, j, curve)
    +    next_seg = if β == 1
    +        if α == 1  # hinge at endpoints, so next segment of both is needed
    +            ((le, _tuple_point(GI.getpoint(line, i + 1))), (ce, _tuple_point(GI.getpoint(curve, j + 1))))
    +        else  # hinge at curve endpoint and line interior point, curve next segment needed
    +            ((ls, le), (ce, _tuple_point(GI.getpoint(curve, j + 1))))
    +        end
    +    else  # hinge at curve interior point and line endpoint, line next segment needed
    +        ((le, _tuple_point(GI.getpoint(line, i + 1))), (cs, ce))
    +    end
    +    return next_seg
    +end

    Determines if a line meets the given checks with respect to a polygon.

    If in_allow is true, segments of the line can be in the polygon interior. If on_allow is true, segments of the line can be on the polygon's boundary. If out_allow is true, segments of the line can be outside of the polygon.

    If in_require is true, the interiors of the line and polygon must meet in at least one point. If on_require is true, the line must have at least one point on the polygon'same boundary. If out_require is true, the line must have at least one point outside of the polygon.

    If the point is in an "allowed" location and meets all requirements, return true. Else, return false.

    If closed_line is true, line is treated as a closed line where the first and last point are connected by a segment.

    julia
    @inline function _line_polygon_process(line, polygon; kw...)
    +    skip, returnval = _maybe_skip_disjoint_extents(line, polygon; kw...)
    +    skip && return returnval
    +    return _inner_line_polygon_process(line, polygon; kw...)
    +end
    +
    +function _inner_line_polygon_process(
    +    line, polygon;
    +    in_allow, on_allow, out_allow,
    +    in_require, on_require, out_require,
    +    exact, closed_line = false,
    +)
    +    in_req_met = !in_require
    +    on_req_met = !on_require
    +    out_req_met = !out_require

    Check interaction of line with polygon's exterior boundary

    julia
        in_curve, on_curve, out_curve = _line_filled_curve_interactions(
    +        line, GI.getexterior(polygon);
    +        exact, closed_line = closed_line,
    +    )
    +    if on_curve
    +        !on_allow && return false
    +        on_req_met = true
    +    end
    +    if out_curve
    +        !out_allow && return false
    +        out_req_met = true
    +    end

    If no points within the polygon, the line is disjoint and we are done

    julia
        !in_curve && return in_req_met && on_req_met && out_req_met

    Loop over polygon holes

    julia
        for hole in GI.gethole(polygon)
    +        in_hole, on_hole, out_hole =_line_filled_curve_interactions(
    +            line, hole;
    +            exact, closed_line = closed_line,
    +        )
    +        if in_hole  # line in hole is equivalent to being out of polygon
    +            !out_allow && return false
    +            out_req_met = true
    +        end
    +        if on_hole  # hole boundary is polygon boundary
    +            !on_allow && return false
    +            on_req_met = true
    +        end
    +        if !out_hole  # entire line is in/on hole, can't be in/on other holes
    +            in_curve = false
    +            break
    +        end
    +    end
    +    if in_curve  # entirely of curve isn't within a hole
    +        !in_allow && return false
    +        in_req_met = true
    +    end
    +    return in_req_met && on_req_met && out_req_met
    +end

    Determines if a polygon meets the given checks with respect to a polygon.

    If in_allow is true, the polygon's interiors must intersect. If on_allow is true, the one of the polygon's boundaries must either interact with the other polygon's boundary or interior. If out_allow is true, the first polygon must have interior regions outside of the second polygon.

    If in_require is true, the polygon interiors must meet in at least one point. If on_require is true, one of the polygon's must have at least one boundary point in or on the other polygon. If out_require is true, the first polygon must have at least one interior point outside of the second polygon.

    If the point is in an "allowed" location and meets all requirements, return true. Else, return false.

    julia
    @inline function _polygon_polygon_process(poly1, poly2; kw...)
    +    skip, returnval = _maybe_skip_disjoint_extents(poly1, poly2; kw...)
    +    skip && return returnval
    +    return _inner_polygon_polygon_process(poly1, poly2; kw...)
    +end
    +
    +function _inner_polygon_polygon_process(
    +    poly1, poly2;
    +    in_allow, on_allow, out_allow,
    +    in_require, on_require, out_require,
    +    exact,
    +)
    +    in_req_met = !in_require
    +    on_req_met = !on_require
    +    out_req_met = !out_require

    Check if exterior of poly1 is within poly2

    julia
        ext1 = GI.getexterior(poly1)
    +    ext2 = GI.getexterior(poly2)

    Check if exterior of poly1 is in polygon 2

    julia
        e1_in_p2, e1_on_p2, e1_out_p2 = _line_polygon_interactions(
    +        ext1, poly2;
    +        exact, closed_line = true,
    +    )
    +    if e1_on_p2
    +        !on_allow && return false
    +        on_req_met = true
    +    end
    +    if e1_out_p2
    +        !out_allow && return false
    +        out_req_met = true
    +    end
    +
    +    if !e1_in_p2

    if exterior ring isn't in poly2, check if it surrounds poly2

    julia
            _, _, e2_out_e1 = _line_filled_curve_interactions(
    +            ext2, ext1;
    +            exact, closed_line = true,
    +        )  # if they really are disjoint, we are done
    +        e2_out_e1 && return in_req_met && on_req_met && out_req_met
    +    end

    If interiors interact, check if poly2 interacts with any of poly1's holes

    julia
        for h1 in GI.gethole(poly1)
    +        h1_in_p2, h1_on_p2, h1_out_p2 = _line_polygon_interactions(
    +            h1, poly2;
    +            exact, closed_line = true,
    +        )
    +        if h1_on_p2
    +            !on_allow && return false
    +            on_req_met = true
    +        end
    +        if h1_out_p2
    +            !out_allow && return false
    +            out_req_met = true
    +        end
    +        if !h1_in_p2

    If hole isn't in poly2, see if poly2 is in hole

    julia
                _, _, e2_out_h1 = _line_filled_curve_interactions(
    +                ext2, h1;
    +                exact, closed_line = true,
    +            )

    hole encompasses all of poly2

    julia
                !e2_out_h1 && return in_req_met && on_req_met && out_req_met
    +            break
    +        end
    +    end
    +    #=
    +    poly2 isn't outside of poly1 and isn't in a hole, poly1 interior must
    +    interact with poly2 interior
    +    =#
    +    !in_allow && return false
    +    in_req_met = true

    If any of poly2 holes are within poly1, part of poly1 is exterior to poly2

    julia
        for h2 in GI.gethole(poly2)
    +        h2_in_p1, h2_on_p1, _ = _line_polygon_interactions(
    +            h2, poly1;
    +            exact, closed_line = true,
    +        )
    +        if h2_on_p1
    +            !on_allow && return false
    +            on_req_met = true
    +        end
    +        if h2_in_p1
    +            !out_allow && return false
    +            out_req_met = true
    +        end
    +    end
    +    return in_req_met && on_req_met && out_req_met
    +end

    Determines if a point is in, on, or out of a segment. If the point is on the segment it is on one of the segments endpoints. If it is in, it is on any other point of the segment. If the point is not on any part of the segment, it is out of the segment.

    Point should be an object of point trait and curve should be an object with a linestring or linearring trait.

    Can provide values of in, on, and out keywords, which determines return values for each scenario.

    julia
    function _point_segment_orientation(
    +    point, start, stop;
    +    in::T = point_in, on::T = point_on, out::T = point_out,
    +) where {T}

    Parse out points

    julia
        x, y = GI.x(point), GI.y(point)
    +    x1, y1 = GI.x(start), GI.y(start)
    +    x2, y2 = GI.x(stop), GI.y(stop)
    +    Δx_seg = x2 - x1
    +    Δy_seg = y2 - y1
    +    Δx_pt = x - x1
    +    Δy_pt = y - y1
    +    if (Δx_pt == 0 && Δy_pt == 0) || (Δx_pt == Δx_seg && Δy_pt == Δy_seg)

    If point is equal to the segment start or end points

    julia
            return on
    +    else
    +        #=
    +        Determine if the point is on the segment -> see if vector from segment
    +        start to point is parallel to segment and if point is between the
    +        segment endpoints
    +        =#
    +        on_line = _isparallel(Δx_seg, Δy_seg, Δx_pt, Δy_pt)
    +        !on_line && return out
    +        between_endpoints =
    +            (x2 > x1 ? x1 <= x <= x2 : x2 <= x <= x1) &&
    +            (y2 > y1 ? y1 <= y <= y2 : y2 <= y <= y1)
    +        !between_endpoints && return out
    +    end
    +    return in
    +end

    Determine if point is in, on, or out of a closed curve, which includes the space enclosed by the closed curve.

    In means the point is within the closed curve (excluding edges and vertices). On means the point is on an edge or a vertex of the closed curve. Out means the point is outside of the closed curve.

    Point should be an object of point trait and curve should be an object with a linestring or linearring trait, that is assumed to be closed, regardless of repeated last point.

    Can provide values of in, on, and out keywords, which determines return values for each scenario.

    Note that this uses the Algorithm by Hao and Sun (2018): https://doi.org/10.3390/sym10100477 Paper separates orientation of point and edge into 26 cases. For each case, it is either a case where the point is on the edge (returns on), where a ray from the point (x, y) to infinity along the line y = y cut through the edge (k += 1), or the ray does not pass through the edge (do nothing and continue). If the ray passes through an odd number of edges, it is within the curve, else outside of of the curve if it didn't return 'on'. See paper for more information on cases denoted in comments.

    julia
    function _point_filled_curve_orientation(
    +    point, curve;
    +    in::T = point_in, on::T = point_on, out::T = point_out, exact,
    +) where {T}
    +    x, y = GI.x(point), GI.y(point)
    +    n = GI.npoint(curve)
    +    n -= equals(GI.getpoint(curve, 1), GI.getpoint(curve, n)) ? 1 : 0
    +    k = 0  # counter for ray crossings
    +    p_start = GI.getpoint(curve, n)
    +    for (i, p_end) in enumerate(GI.getpoint(curve))
    +        i > n && break
    +        v1 = GI.y(p_start) - y
    +        v2 = GI.y(p_end) - y
    +        if !((v1 < 0 && v2 < 0) || (v1 > 0 && v2 > 0)) # if not cases 11 or 26
    +            u1, u2 = GI.x(p_start) - x, GI.x(p_end) - x
    +            f = Predicates.cross((u1, u2), (v1, v2); exact)
    +            if v2 > 0 && v1  0                # Case 3, 9, 16, 21, 13, or 24
    +                f == 0 && return on         # Case 16 or 21
    +                f > 0 && (k += 1)              # Case 3 or 9
    +            elseif v1 > 0 && v2  0            # Case 4, 10, 19, 20, 12, or 25
    +                f == 0 && return on         # Case 19 or 20
    +                f < 0 && (k += 1)              # Case 4 or 10
    +            elseif v2 == 0 && v1 < 0           # Case 7, 14, or 17
    +                f == 0 && return on         # Case 17
    +            elseif v1 == 0 && v2 < 0           # Case 8, 15, or 18
    +                f == 0 && return on         # Case 18
    +            elseif v1 == 0 && v2 == 0          # Case 1, 2, 5, 6, 22, or 23
    +                u2  0 && u1  0 && return on  # Case 1
    +                u1  0 && u2  0 && return on  # Case 2
    +            end
    +        end
    +        p_start = p_end
    +    end
    +    return iseven(k) ? out : in
    +end

    Determines the types of interactions of a line with a filled-in curve. By filled-in curve, I am referring to the exterior ring of a poylgon, for example.

    Returns a tuple of booleans: (in_curve, on_curve, out_curve).

    If in_curve is true, some of the lines interior points interact with the curve's interior points. If on_curve is true, endpoints of either the line intersect with the curve or the line interacts with the polygon boundary. If out_curve is true, at least one segments of the line is outside the curve.

    If closed_line is true, line is treated as a closed line where the first and last point are connected by a segment.

    julia
    function _line_filled_curve_interactions(
    +    line, curve;
    +    exact, closed_line = false,
    +)
    +    in_curve = false
    +    on_curve = false
    +    out_curve = false

    Determine number of points in curve and line

    julia
        nl = GI.npoint(line)
    +    nc = GI.npoint(curve)
    +    first_last_equal_line = equals(GI.getpoint(line, 1), GI.getpoint(line, nl))
    +    first_last_equal_curve = equals(GI.getpoint(curve, 1), GI.getpoint(curve, nc))
    +    nl -= first_last_equal_line ? 1 : 0
    +    nc -= first_last_equal_curve ? 1 : 0
    +    closed_line |= first_last_equal_line

    See if first point is in an acceptable orientation

    julia
        l_start = _tuple_point(GI.getpoint(line, closed_line ? nl : 1))
    +    point_val = _point_filled_curve_orientation(l_start, curve; exact)
    +    if point_val == point_in
    +        in_curve = true
    +    elseif point_val == point_on
    +        on_curve = true
    +    else  # point_val == point_out
    +        out_curve = true
    +    end

    Check for any intersections between line and curve

    julia
        for i in (closed_line ? 1 : 2):nl
    +        l_end = _tuple_point(GI.getpoint(line, i))
    +        c_start = _tuple_point(GI.getpoint(curve, nc))

    If already interacted with all regions of curve, can stop

    julia
            in_curve && on_curve && out_curve && break

    Check next segment of line against curve

    julia
            for j in 1:nc
    +            c_end = _tuple_point(GI.getpoint(curve, j))

    Check if two line and curve segments meet

    julia
                seg_val, _, _ = _intersection_point(Float64, (l_start, l_end), (c_start, c_end); exact)
    +            if seg_val != line_out

    If line and curve meet, then at least one point is on boundary

    julia
                    on_curve = true
    +                if seg_val == line_cross

    When crossing boundary, line is both in and out of curve

    julia
                        in_curve = true
    +                    out_curve = true
    +                else
    +                    if seg_val == line_over
    +                        sp = _point_segment_orientation(l_start, c_start, c_end)
    +                        lp = _point_segment_orientation(l_end, c_start, c_end)
    +                        if sp != point_in || lp != point_in
    +                            #=
    +                            Line crosses over segment endpoint, creating a hinge
    +                            with another segment.
    +                            =#
    +                            seg_val = line_hinge
    +                        end
    +                    end
    +                    if seg_val == line_hinge
    +                        #=
    +                        Can't determine all types of interactions (in, out) with
    +                        hinge as it could pass through multiple other segments
    +                        so calculate if segment endpoints and intersections are
    +                        in/out of filled curve
    +                        =#
    +                        ipoints = intersection_points(GI.Line(StaticArrays.SVector(l_start, l_end)), curve)
    +                        npoints = length(ipoints)  # since hinge, at least one
    +                        dist_from_lstart = let l_start = l_start
    +                            x -> _euclid_distance(Float64, x, l_start)
    +                        end
    +                        sort!(ipoints, by = dist_from_lstart)
    +                        p_start = _tuple_point(l_start)
    +                        for i in 1:(npoints + 1)
    +                            p_end = i  npoints ? _tuple_point(ipoints[i]) : l_end
    +                            mid_val = _point_filled_curve_orientation((p_start .+ p_end) ./ 2, curve; exact)
    +                            if mid_val == point_in
    +                                in_curve = true
    +                            elseif mid_val == point_out
    +                                out_curve = true
    +                            end
    +                        end

    already checked segment against whole filled curve

    julia
                            l_start = l_end
    +                        break
    +                    end
    +                end
    +            end
    +            c_start = c_end
    +        end
    +        l_start = l_end
    +    end
    +    return in_curve, on_curve, out_curve
    +end

    Determines the types of interactions of a line with a polygon.

    Returns a tuple of booleans: (in_poly, on_poly, out_poly).

    If in_poly is true, some of the lines interior points interact with the polygon interior points. If in_poly is true, endpoints of either the line intersect with the polygon or the line interacts with the polygon boundary, including hole boundaries. If out_curve is true, at least one segments of the line is outside the polygon, including inside of holes.

    If closed_line is true, line is treated as a closed line where the first and last point are connected by a segment.

    julia
    function _line_polygon_interactions(
    +    line, polygon;
    +    exact, closed_line = false,
    +)
    +
    +    in_poly, on_poly, out_poly = _line_filled_curve_interactions(
    +        line, GI.getexterior(polygon);
    +        exact, closed_line = closed_line,
    +    )
    +    !in_poly && return (in_poly, on_poly, out_poly)

    Loop over polygon holes

    julia
        for hole in GI.gethole(polygon)
    +        in_hole, on_hole, out_hole =_line_filled_curve_interactions(
    +            line, hole;
    +            exact, closed_line = closed_line,
    +        )
    +        if in_hole
    +            out_poly = true
    +        end
    +        if on_hole
    +            on_poly = true
    +        end
    +        if !out_hole  # entire line is in/on hole, can't be in/on other holes
    +            in_poly = false
    +            return (in_poly, on_poly, out_poly)
    +        end
    +    end
    +    return in_poly, on_poly, out_poly
    +end

    Disjoint extent optimisation: skip work based on geom extent intersection returns Tuple{Bool, Bool} for (skip, returnval)

    julia
    @inline function _maybe_skip_disjoint_extents(a, b;
    +    in_allow, on_allow, out_allow,
    +    in_require, on_require, out_require,
    +    kw...
    +)
    +    ext_disjoint = Extents.disjoint(GI.extent(a), GI.extent(b))
    +    skip, returnval = if !ext_disjoint

    can't tell anything about this case

    julia
            false, false
    +    elseif out_allow # && ext_disjoint
    +        if in_require || on_require
    +            true, false
    +        else
    +            true, true
    +        end
    +    else  # !out_allow && ext_disjoint

    points not allowed in exterior, but geoms are disjoint

    julia
            true, false
    +    end
    +    return skip, returnval
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/geom_relations/intersects.html b/previews/PR239/source/methods/geom_relations/intersects.html new file mode 100644 index 000000000..929cdeb67 --- /dev/null +++ b/previews/PR239/source/methods/geom_relations/intersects.html @@ -0,0 +1,51 @@ + + + + + + Intersection checks | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Intersection checks

    julia
    export intersects

    What is intersects?

    The intersects function checks if a given geometry intersects with another geometry, or in other words, the either the interiors or boundaries of the two geometries intersect.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)])
    +line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)])
    +f, a, p = lines(GI.getpoint(line1))
    +lines!(GI.getpoint(line2))
    +f

    We can see that they intersect, so we expect intersects to return true, and we can visualize the intersection point in red.

    julia
    GO.intersects(line1, line2)  # true
    true

    Implementation

    This is the GeoInterface-compatible implementation.

    Given that intersects is the exact opposite of disjoint, we simply pass the two inputs variables, swapped in order, to disjoint.

    julia
    """
    +    intersects(geom1, geom2)::Bool
    +
    +Return true if the interiors or boundaries of the two geometries interact.
    +
    +`intersects` returns the exact opposite result of `disjoint`.
    +
    +# Example
    +
    +```jldoctest
    +import GeoInterface as GI, GeometryOps as GO
    +
    +line1 = GI.Line([(124.584961,-12.768946), (126.738281,-17.224758)])
    +line2 = GI.Line([(123.354492,-15.961329), (127.22168,-14.008696)])
    +GO.intersects(line1, line2)

    output

    julia
    true
    +```
    +"""
    +intersects(geom1, geom2) = !disjoint(geom1, geom2)

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/geom_relations/overlaps.html b/previews/PR239/source/methods/geom_relations/overlaps.html new file mode 100644 index 000000000..7743e0a5e --- /dev/null +++ b/previews/PR239/source/methods/geom_relations/overlaps.html @@ -0,0 +1,236 @@ + + + + + + Overlaps | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Overlaps

    julia
    export overlaps

    What is overlaps?

    The overlaps function checks if two geometries overlap. Two geometries can only overlap if they have the same dimension, and if they overlap, but one is not contained, within, or equal to the other.

    Note that this means it is impossible for a single point to overlap with a single point and a line only overlaps with another line if only a section of each line is collinear.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +l1 = GI.LineString([(0.0, 0.0), (0.0, 10.0)])
    +l2 = GI.LineString([(0.0, -10.0), (0.0, 3.0)])
    +f, a, p = lines(GI.getpoint(l1), color = :blue)
    +scatter!(GI.getpoint(l1), color = :blue)
    +lines!(GI.getpoint(l2), color = :orange)
    +scatter!(GI.getpoint(l2), color = :orange)
    +f

    We can see that the two lines overlap in the plot:

    julia
    GO.overlaps(l1, l2)  # true
    true

    Implementation

    This is the GeoInterface-compatible implementation.

    First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait. This is also used in the implementation, since it's a lot less work!

    Note that that since only elements of the same dimension can overlap, any two geometries with traits that are of different dimensions automatically can return false.

    For geometries with the same trait dimension, we must make sure that they share a point, an edge, or area for points, lines, and polygons/multipolygons respectively, without being contained.

    julia
    """
    +    overlaps(geom1, geom2)::Bool
    +
    +Compare two Geometries of the same dimension and return true if their
    +intersection set results in a geometry different from both but of the same
    +dimension. This means one geometry cannot be within or contain the other and
    +they cannot be equal
    +
    +# Examples
    +```jldoctest
    +import GeometryOps as GO, GeoInterface as GI
    +poly1 = GI.Polygon([[(0,0), (0,5), (5,5), (5,0), (0,0)]])
    +poly2 = GI.Polygon([[(1,1), (1,6), (6,6), (6,1), (1,1)]])
    +
    +GO.overlaps(poly1, poly2)

    output

    julia
    true
    +```
    +"""
    +overlaps(geom1, geom2)::Bool = overlaps(
    +    GI.trait(geom1),
    +    geom1,
    +    GI.trait(geom2),
    +    geom2,
    +)
    +
    +"""
    +    overlaps(::GI.AbstractTrait, geom1, ::GI.AbstractTrait, geom2)::Bool
    +
    +For any non-specified pair, all have non-matching dimensions, return false.
    +"""
    +overlaps(::GI.AbstractTrait, geom1, ::GI.AbstractTrait, geom2) = false
    +
    +"""
    +    overlaps(
    +        ::GI.MultiPointTrait, points1,
    +        ::GI.MultiPointTrait, points2,
    +    )::Bool
    +
    +If the multipoints overlap, meaning some, but not all, of the points within the
    +multipoints are shared, return true.
    +"""
    +function overlaps(
    +    ::GI.MultiPointTrait, points1,
    +    ::GI.MultiPointTrait, points2,
    +)
    +    one_diff = false  # assume that all the points are the same
    +    one_same = false  # assume that all points are different
    +    for p1 in GI.getpoint(points1)
    +        match_point = false
    +        for p2 in GI.getpoint(points2)
    +            if equals(p1, p2)  # Point is shared
    +                one_same = true
    +                match_point = true
    +                break
    +            end
    +        end
    +        one_diff |= !match_point  # Point isn't shared
    +        one_same && one_diff && return true
    +    end
    +    return false
    +end
    +
    +"""
    +    overlaps(::GI.LineTrait, line1, ::GI.LineTrait, line)::Bool
    +
    +If the lines overlap, meaning that they are collinear but each have one endpoint
    +outside of the other line, return true. Else false.
    +"""
    +overlaps(::GI.LineTrait, line1, ::GI.LineTrait, line) =
    +    _overlaps((a1, a2), (b1, b2))
    +
    +"""
    +    overlaps(
    +        ::Union{GI.LineStringTrait, GI.LinearRing}, line1,
    +        ::Union{GI.LineStringTrait, GI.LinearRing}, line2,
    +    )::Bool
    +
    +If the curves overlap, meaning that at least one edge of each curve overlaps,
    +return true. Else false.
    +"""
    +function overlaps(
    +    ::Union{GI.LineStringTrait, GI.LinearRing}, line1,
    +    ::Union{GI.LineStringTrait, GI.LinearRing}, line2,
    +)
    +    edges_a, edges_b = map(sort! ∘ to_edges, (line1, line2))
    +    for edge_a in edges_a
    +        for edge_b in edges_b
    +            _overlaps(edge_a, edge_b) && return true
    +        end
    +    end
    +    return false
    +end
    +
    +"""
    +    overlaps(
    +        trait_a::GI.PolygonTrait, poly_a,
    +        trait_b::GI.PolygonTrait, poly_b,
    +    )::Bool
    +
    +If the two polygons intersect with one another, but are not equal, return true.
    +Else false.
    +"""
    +function overlaps(
    +    trait_a::GI.PolygonTrait, poly_a,
    +    trait_b::GI.PolygonTrait, poly_b,
    +)
    +    edges_a, edges_b = map(sort! ∘ to_edges, (poly_a, poly_b))
    +    return _line_intersects(edges_a, edges_b) &&
    +        !equals(trait_a, poly_a, trait_b, poly_b)
    +end
    +
    +"""
    +    overlaps(
    +        ::GI.PolygonTrait, poly1,
    +        ::GI.MultiPolygonTrait, polys2,
    +    )::Bool
    +
    +Return true if polygon overlaps with at least one of the polygons within the
    +multipolygon. Else false.
    +"""
    +function overlaps(
    +    ::GI.PolygonTrait, poly1,
    +    ::GI.MultiPolygonTrait, polys2,
    +)
    +    for poly2 in GI.getgeom(polys2)
    +        overlaps(poly1, poly2) && return true
    +    end
    +    return false
    +end
    +
    +"""
    +    overlaps(
    +        ::GI.MultiPolygonTrait, polys1,
    +        ::GI.PolygonTrait, poly2,
    +    )::Bool
    +
    +Return true if polygon overlaps with at least one of the polygons within the
    +multipolygon. Else false.
    +"""
    +overlaps(trait1::GI.MultiPolygonTrait, polys1, trait2::GI.PolygonTrait, poly2) =
    +    overlaps(trait2, poly2, trait1, polys1)
    +
    +"""
    +    overlaps(
    +        ::GI.MultiPolygonTrait, polys1,
    +        ::GI.MultiPolygonTrait, polys2,
    +    )::Bool
    +
    +Return true if at least one pair of polygons from multipolygons overlap. Else
    +false.
    +"""
    +function overlaps(
    +    ::GI.MultiPolygonTrait, polys1,
    +    ::GI.MultiPolygonTrait, polys2,
    +)
    +    for poly1 in GI.getgeom(polys1)
    +        overlaps(poly1, polys2) && return true
    +    end
    +    return false
    +end
    +
    +#= If the edges overlap, meaning that they are collinear but each have one endpoint
    +outside of the other edge, return true. Else false. =#
    +function _overlaps(
    +    (a1, a2)::Edge,
    +    (b1, b2)::Edge,
    +    exact = _False(),
    +)

    meets in more than one point

    julia
        seg_val, _, _ = _intersection_point(Float64, (a1, a2), (b1, b2); exact)

    one end point is outside of other segment

    julia
        a_fully_within = _point_on_seg(a1, b1, b2) && _point_on_seg(a2, b1, b2)
    +    b_fully_within = _point_on_seg(b1, a1, a2) && _point_on_seg(b2, a1, a2)
    +    return seg_val == line_over && (!a_fully_within && !b_fully_within)
    +end
    +
    +#= TODO: Once overlaps is swapped over to use the geom relations workflow, can
    +delete these helpers. =#

    Checks if point is on a segment

    julia
    function _point_on_seg(point, start, stop)

    Parse out points

    julia
        x, y = GI.x(point), GI.y(point)
    +    x1, y1 = GI.x(start), GI.y(start)
    +    x2, y2 = GI.x(stop), GI.y(stop)
    +    Δxl = x2 - x1
    +    Δyl = y2 - y1

    Determine if point is on segment

    julia
        cross = (x - x1) * Δyl - (y - y1) * Δxl
    +    if cross == 0  # point is on line extending to infinity

    is line between endpoints

    julia
            if abs(Δxl) >= abs(Δyl)  # is line between endpoints
    +            return Δxl > 0 ? x1 <= x <= x2 : x2 <= x <= x1
    +        else
    +            return Δyl > 0 ? y1 <= y <= y2 : y2 <= y <= y1
    +        end
    +    end
    +    return false
    +end
    +
    +#= Returns true if there is at least one intersection between edges within the
    +two lists of edges. =#
    +function _line_intersects(
    +    edges_a::Vector{<:Edge},
    +    edges_b::Vector{<:Edge};
    +)

    Extents.intersects(to_extent(edges_a), to_extent(edges_b)) || return false

    julia
        for edge_a in edges_a
    +        for edge_b in edges_b
    +            _line_intersects(edge_a, edge_b) && return true
    +        end
    +    end
    +    return false
    +end

    Returns true if there is at least one intersection between two edges.

    julia
    function _line_intersects(edge_a::Edge, edge_b::Edge)
    +    seg_val, _, _ = _intersection_point(Float64, edge_a, edge_b; exact = _False())
    +    return seg_val != line_out
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/geom_relations/touches.html b/previews/PR239/source/methods/geom_relations/touches.html new file mode 100644 index 000000000..67ad8fec4 --- /dev/null +++ b/previews/PR239/source/methods/geom_relations/touches.html @@ -0,0 +1,198 @@ + + + + + + Touches | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Touches

    julia
    export touches

    What is touches?

    The touches function checks if one geometry touches another geometry. In other words, the interiors of the two geometries don't interact, but one of the geometries must have a boundary point that interacts with either the other geometry's interior or boundary.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +l1 = GI.Line([(0.0, 0.0), (1.0, 0.0)])
    +l2 = GI.Line([(1.0, 0.0), (1.0, -1.0)])
    +
    +f, a, p = lines(GI.getpoint(l1))
    +lines!(GI.getpoint(l2))
    +f

    We can see that these two lines touch only at their endpoints.

    julia
    GO.touches(l1, l2)  # true
    true

    Implementation

    This is the GeoInterface-compatible implementation.

    First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait.

    Each of these calls a method in the geom_geom_processors file. The methods in this file determine if the given geometries meet a set of criteria. For the touches function and arguments g1 and g2, this criteria is as follows: - points of g1 are not allowed to be in the interior of g2 - points of g1 are allowed to be on the boundary of g2 - points of g1 are allowed to be in the exterior of g2 - no points of g1 are required to be in the interior of g2 - at least one point of g1 is required to be on the boundary of g2 - no points of g1 are required to be in the exterior of g2

    The code for the specific implementations is in the geom_geom_processors file.

    julia
    const TOUCHES_POINT_ALLOWED = (in_allow = false, on_allow = true, out_allow = false)
    +const TOUCHES_CURVE_ALLOWED = (over_allow = false, cross_allow = false, on_allow = true, out_allow = true)
    +const TOUCHES_POLYGON_ALLOWS = (in_allow = false, on_allow = true, out_allow = true)
    +const TOUCHES_REQUIRES = (in_require = false, on_require = true, out_require = false)
    +const TOUCHES_EXACT = (exact = _False(),)
    +
    +"""
    +    touches(geom1, geom2)::Bool
    +
    +Return `true` if the first geometry touches the second geometry. In other words,
    +the two interiors cannot interact, but one of the geometries must have a
    +boundary point that interacts with either the other geometry's interior or
    +boundary.
    +
    +# Examples
    +```jldoctest setup=:(using GeometryOps, GeometryBasics)
    +import GeometryOps as GO, GeoInterface as GI
    +
    +l1 = GI.Line([(0.0, 0.0), (1.0, 0.0)])
    +l2 = GI.Line([(1.0, 1.0), (1.0, -1.0)])
    +
    +GO.touches(l1, l2)

    output

    julia
    true
    +```
    +"""
    +touches(g1, g2)::Bool = _touches(trait(g1), g1, trait(g2), g2)

    Convert features to geometries

    julia
    _touches(::GI.FeatureTrait, g1, ::Any, g2) = touches(GI.geometry(g1), g2)
    +_touches(::Any, g1, t2::GI.FeatureTrait, g2) = touches(g1, GI.geometry(g2))
    +_touches(::FeatureTrait, g1, ::FeatureTrait, g2) = touches(GI.geometry(g1), GI.geometry(g2))

    Point touches geometries

    Point cannot touch another point as if they are equal, interiors interact

    julia
    _touches(
    +    ::GI.PointTrait, g1,
    +    ::GI.PointTrait, g2,
    +) = false

    Point touches a linestring if it equal to the first of last point of the line

    julia
    function _touches(
    +    ::GI.PointTrait, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +)
    +    n = GI.npoint(g2)
    +    p1 = GI.getpoint(g2, 1)
    +    pn = GI.getpoint(g2, n)
    +    equals(p1, pn) && return false
    +    return equals(g1, p1) || equals(g1, pn)
    +end

    Point cannot 'touch' a linearring given that the ring has no boundary points

    julia
    _touches(
    +    ::GI.PointTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = false

    Point touches a polygon if it is on the boundary of that polygon

    julia
    _touches(
    +    ::GI.PointTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _point_polygon_process(
    +    g1, g2;
    +    TOUCHES_POINT_ALLOWED...,
    +    TOUCHES_EXACT...,
    +)
    +
    +#= Geometry touches a point if the point is on the geometry boundary. =#
    +_touches(
    +    trait1::Union{GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    trait2::GI.PointTrait, g2,
    +) = _touches(trait2, g2, trait1, g1)

    Lines touching geometries

    julia
    #= Linestring touches another line if at least one boundary point interacts with
    +the boundary of interior of the other line, but the interiors don't interact. =#
    +_touches(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    TOUCHES_CURVE_ALLOWED...,
    +    TOUCHES_REQUIRES...,
    +    TOUCHES_EXACT...,
    +    closed_line = false,
    +    closed_curve = false,
    +)
    +
    +
    +#= Linestring touches a linearring if at least one of the boundary points of the
    +line interacts with the linear ring, but their interiors can't interact. =#
    +_touches(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    TOUCHES_CURVE_ALLOWED...,
    +    TOUCHES_REQUIRES...,
    +    TOUCHES_EXACT...,
    +    closed_line = false,
    +    closed_curve = true,
    +)
    +
    +#= Linestring touches a polygon if at least one of the boundary points of the
    +line interacts with the boundary of the polygon. =#
    +_touches(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    TOUCHES_POLYGON_ALLOWS...,
    +    TOUCHES_REQUIRES...,
    +    TOUCHES_EXACT...,
    +    closed_line = false,
    +)

    Rings touch geometries

    julia
    #= Linearring touches a linestring if at least one of the boundary points of the
    +line interacts with the linear ring, but their interiors can't interact. =#
    +_touches(
    +    trait1::GI.LinearRingTrait, g1,
    +    trait2::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _touches(trait2, g2, trait1, g1)
    +
    +#= Linearring cannot touch another linear ring since they are both exclusively
    +made up of interior points and no boundary points =#
    +_touches(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = false
    +
    +#= Linearring touches a polygon if at least one of the points of the ring
    +interact with the polygon boundary and non are in the polygon interior. =#
    +_touches(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    TOUCHES_POLYGON_ALLOWS...,
    +    TOUCHES_REQUIRES...,
    +    TOUCHES_EXACT...,
    +    closed_line = true,
    +)

    Polygons touch geometries

    julia
    #= Polygon touches a curve if at least one of the curve boundary points interacts
    +with the polygon's boundary and no curve points interact with the interior.=#
    +_touches(
    +    trait1::GI.PolygonTrait, g1,
    +    trait2::GI.AbstractCurveTrait, g2
    +) = _touches(trait2, g2, trait1, g1)
    +
    +
    +#= Polygon touches another polygon if they share at least one boundary point and
    +no interior points. =#
    +_touches(
    +    ::GI.PolygonTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _polygon_polygon_process(
    +    g1, g2;
    +    TOUCHES_POLYGON_ALLOWS...,
    +    TOUCHES_REQUIRES...,
    +    TOUCHES_EXACT...,
    +)

    Geometries touch multi-geometry/geometry collections

    julia
    #= Geometry touch a multi-geometry or a collection if the geometry touches at
    +least one of the elements of the collection. =#
    +function _touches(
    +    ::Union{GI.PointTrait, GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g2,
    +)
    +    for sub_g2 in GI.getgeom(g2)
    +        !touches(g1, sub_g2) && return false
    +    end
    +    return true
    +end

    Multi-geometry/geometry collections cross geometries

    julia
    #= Multi-geometry or a geometry collection touches a geometry if at least one
    +elements of the collection touches the geometry. =#
    +function _touches(
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g1,
    +    ::GI.AbstractGeometryTrait, g2,
    +)
    +    for sub_g1 in GI.getgeom(g1)
    +        !touches(sub_g1, g2) && return false
    +    end
    +    return true
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/geom_relations/within.html b/previews/PR239/source/methods/geom_relations/within.html new file mode 100644 index 000000000..e728e5eea --- /dev/null +++ b/previews/PR239/source/methods/geom_relations/within.html @@ -0,0 +1,217 @@ + + + + + + Within | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Within

    julia
    export within

    What is within?

    The within function checks if one geometry is inside another geometry. This requires that the two interiors intersect and that the interior and boundary of the first geometry is not in the exterior of the second geometry.

    To provide an example, consider these two lines:

    julia
    import GeometryOps as GO
    +import GeoInterface as GI
    +using Makie
    +using CairoMakie
    +
    +l1 = GI.LineString([(0.0, 0.0), (1.0, 0.0), (0.0, 0.1)])
    +l2 = GI.LineString([(0.25, 0.0), (0.75, 0.0)])
    +f, a, p = lines(GI.getpoint(l1), color = :blue)
    +scatter!(GI.getpoint(l1), color = :blue)
    +lines!(GI.getpoint(l2), color = :orange)
    +scatter!(GI.getpoint(l2), color = :orange)
    +f

    We can see that all of the points and edges of l2 are within l1, so l2 is within l1, but l1 is not within l2

    julia
    GO.within(l1, l2)  # false
    +GO.within(l2, l1)  # true
    true

    Implementation

    This is the GeoInterface-compatible implementation.

    First, we implement a wrapper method that dispatches to the correct implementation based on the geometry trait.

    Each of these calls a method in the geom_geom_processors file. The methods in this file determine if the given geometries meet a set of criteria. For the within function and arguments g1 and g2, this criteria is as follows: - points of g1 are allowed to be in the interior of g2 (either through overlap or crossing for lines) - points of g1 are allowed to be on the boundary of g2 - points of g1 are not allowed to be in the exterior of g2 - at least one point of g1 is required to be in the interior of g2 - no points of g1 are required to be on the boundary of g2 - no points of g1 are required to be in the exterior of g2

    The code for the specific implementations is in the geom_geom_processors file.

    julia
    const WITHIN_POINT_ALLOWS = (in_allow = true, on_allow = false, out_allow = false)
    +const WITHIN_CURVE_ALLOWS = (over_allow = true, cross_allow = true, on_allow = true, out_allow = false)
    +const WITHIN_POLYGON_ALLOWS = (in_allow = true, on_allow = true, out_allow = false)
    +const WITHIN_REQUIRES = (in_require = true, on_require = false, out_require = false)
    +const WITHIN_EXACT = (exact = _False(),)
    +
    +"""
    +    within(geom1, geom2)::Bool
    +
    +Return `true` if the first geometry is completely within the second geometry.
    +The interiors of both geometries must intersect and the interior and boundary of
    +the primary geometry (geom1) must not intersect the exterior of the secondary
    +geometry (geom2).
    +
    +Furthermore, `within` returns the exact opposite result of `contains`.
    +
    +# Examples
    +```jldoctest setup=:(using GeometryOps, GeometryBasics)
    +import GeometryOps as GO, GeoInterface as GI
    +
    +line = GI.LineString([(1, 1), (1, 2), (1, 3), (1, 4)])
    +point = (1, 2)
    +GO.within(point, line)

    output

    julia
    true
    +```
    +"""
    +within(g1, g2) = _within(trait(g1), g1, trait(g2), g2)

    Convert features to geometries

    julia
    _within(::GI.FeatureTrait, g1, ::Any, g2) = within(GI.geometry(g1), g2)
    +_within(::Any, g1, t2::GI.FeatureTrait, g2) = within(g1, GI.geometry(g2))
    +_within(::FeatureTrait, g1, ::FeatureTrait, g2) = within(GI.geometry(g1), GI.geometry(g2))

    Points within geometries

    Point is within another point if those points are equal.

    julia
    _within(
    +    ::GI.PointTrait, g1,
    +    ::GI.PointTrait, g2,
    +) = equals(g1, g2)
    +
    +#= Point is within a linestring if it is on a vertex or an edge of that line,
    +excluding the start and end vertex if the line is not closed. =#
    +_within(
    +    ::GI.PointTrait, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _point_curve_process(
    +    g1, g2;
    +    WITHIN_POINT_ALLOWS...,
    +    closed_curve = false,
    +)

    Point is within a linearring if it is on a vertex or an edge of that ring.

    julia
    _within(
    +    ::GI.PointTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _point_curve_process(
    +    g1, g2;
    +    WITHIN_POINT_ALLOWS...,
    +    closed_curve = true,
    +)
    +
    +#= Point is within a polygon if it is inside of that polygon, excluding edges,
    +vertices, and holes. =#
    +_within(
    +    ::GI.PointTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _point_polygon_process(
    +    g1, g2;
    +    WITHIN_POINT_ALLOWS...,
    +    WITHIN_EXACT...,
    +)

    No geometries other than points can be within points

    julia
    _within(
    +    ::Union{GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    ::GI.PointTrait, g2,
    +) = false

    Lines within geometries

    julia
    #= Linestring is within another linestring if their interiors intersect and no
    +points of the first line are in the exterior of the second line. =#
    +_within(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    WITHIN_CURVE_ALLOWS...,
    +    WITHIN_REQUIRES...,
    +    WITHIN_EXACT...,
    +    closed_line = false,
    +    closed_curve = false,
    +)
    +
    +#= Linestring is within a linear ring if their interiors intersect and no points
    +of the line are in the exterior of the ring. =#
    +_within(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    WITHIN_CURVE_ALLOWS...,
    +    WITHIN_REQUIRES...,
    +    WITHIN_EXACT...,
    +    closed_line = false,
    +    closed_curve = true,
    +)
    +
    +#= Linestring is within a polygon if their interiors intersect and no points of
    +the line are in the exterior of the polygon, although they can be on an edge. =#
    +_within(
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    WITHIN_POLYGON_ALLOWS...,
    +    WITHIN_REQUIRES...,
    +    WITHIN_EXACT...,
    +    closed_line = false,
    +)

    Rings covered by geometries

    julia
    #= Linearring is within a linestring if their interiors intersect and no points
    +of the ring are in the exterior of the line. =#
    +_within(
    +    ::GI.LinearRingTrait, g1,
    +    ::Union{GI.LineTrait, GI.LineStringTrait}, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    WITHIN_CURVE_ALLOWS...,
    +    WITHIN_REQUIRES...,
    +    WITHIN_EXACT...,
    +    closed_line = true,
    +    closed_curve = false,
    +)
    +
    +#= Linearring is within another linearring if their interiors intersect and no
    +points of the first ring are in the exterior of the second ring. =#
    +_within(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.LinearRingTrait, g2,
    +) = _line_curve_process(
    +    g1, g2;
    +    WITHIN_CURVE_ALLOWS...,
    +    WITHIN_REQUIRES...,
    +    WITHIN_EXACT...,
    +    closed_line = true,
    +    closed_curve = true,
    +)
    +
    +#= Linearring is within a polygon if their interiors intersect and no points of
    +the ring are in the exterior of the polygon, although they can be on an edge. =#
    +_within(
    +    ::GI.LinearRingTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _line_polygon_process(
    +    g1, g2;
    +    WITHIN_POLYGON_ALLOWS...,
    +    WITHIN_REQUIRES...,
    +    WITHIN_EXACT...,
    +    closed_line = true,
    +)

    Polygons within geometries

    julia
    #= Polygon is within another polygon if the interior of the first polygon
    +intersects with the interior of the second and no points of the first polygon
    +are outside of the second polygon. =#
    +_within(
    +    ::GI.PolygonTrait, g1,
    +    ::GI.PolygonTrait, g2,
    +) = _polygon_polygon_process(
    +    g1, g2;
    +    WITHIN_POLYGON_ALLOWS...,
    +    WITHIN_REQUIRES...,
    +    WITHIN_EXACT...,
    +)

    Polygons cannot be within any curves

    julia
    _within(
    +    ::GI.PolygonTrait, g1,
    +    ::GI.AbstractCurveTrait, g2,
    +) = false

    Geometries within multi-geometry/geometry collections

    julia
    #= Geometry is within a multi-geometry or a collection if the geometry is within
    +at least one of the collection elements. =#
    +function _within(
    +    ::Union{GI.PointTrait, GI.AbstractCurveTrait, GI.PolygonTrait}, g1,
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g2,
    +)
    +    for sub_g2 in GI.getgeom(g2)
    +        within(g1, sub_g2) && return true
    +    end
    +    return false
    +end

    Multi-geometry/geometry collections within geometries

    julia
    #= Multi-geometry or a geometry collection is within a geometry if all
    +elements of the collection are within the geometry. =#
    +function _within(
    +    ::Union{
    +        GI.MultiPointTrait, GI.AbstractMultiCurveTrait,
    +        GI.MultiPolygonTrait, GI.GeometryCollectionTrait,
    +    }, g1,
    +    ::GI.AbstractGeometryTrait, g2,
    +)
    +    for sub_g1 in GI.getgeom(g1)
    +        !within(sub_g1, g2) && return false
    +    end
    +    return true
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/orientation.html b/previews/PR239/source/methods/orientation.html new file mode 100644 index 000000000..a35900cb9 --- /dev/null +++ b/previews/PR239/source/methods/orientation.html @@ -0,0 +1,124 @@ + + + + + + Orientation | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Orientation

    julia
    export isclockwise, isconcave

    isclockwise

    The orientation of a geometry is whether it runs clockwise or counter-clockwise.

    This is defined for linestrings, linear rings, or vectors of points.

    isconcave

    A polygon is concave if it has at least one interior angle greater than 180 degrees, meaning that the interior of the polygon is not a convex set.

    These are all adapted from Turf.jl.

    The may not necessarily be what want in the end but work for now!

    julia
    """
    +    isclockwise(line::Union{LineString, Vector{Position}})::Bool
    +
    +Take a ring and return `true` if the line goes clockwise, or `false` if the line goes
    +counter-clockwise.  "Going clockwise" means, mathematically,
    +
    +```math
    +\\left(\\sum_{i=2}^n (x_i - x_{i-1}) \\cdot (y_i + y_{i-1})\\right) > 0
    +```
    +
    +# Example
    +
    +```julia
    +julia> import GeoInterface as GI, GeometryOps as GO
    +julia> ring = GI.LinearRing([(0, 0), (1, 1), (1, 0), (0, 0)]);
    +julia> GO.isclockwise(ring)

    output

    julia
    true
    +```
    +"""
    +isclockwise(geom)::Bool = isclockwise(GI.trait(geom), geom)
    +
    +function isclockwise(::AbstractCurveTrait, line)::Bool
    +    sum = 0.0
    +    prev = GI.getpoint(line, 1)
    +    for p in GI.getpoint(line)

    sum will be zero for the first point as x is subtracted from itself

    julia
            sum += (GI.x(p) - GI.x(prev)) * (GI.y(p) + GI.y(prev))
    +        prev = p
    +    end
    +
    +    return sum > 0.0
    +end
    +
    +"""
    +    isconcave(poly::Polygon)::Bool
    +
    +Take a polygon and return true or false as to whether it is concave or not.
    +
    +# Examples
    +```jldoctest
    +import GeoInterface as GI, GeometryOps as GO
    +
    +poly = GI.Polygon([[(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)]])
    +GO.isconcave(poly)

    output

    julia
    false
    +```
    +"""
    +function isconcave(poly)::Bool
    +    sign = false
    +
    +    exterior = GI.getexterior(poly)

    FIXME handle not closed polygons

    julia
        GI.npoint(exterior) <= 4 && return false
    +    n = GI.npoint(exterior) - 1
    +
    +    for i in 1:n
    +        j = ((i + 1) % n) === 0 ? 1 : (i + 1) % n
    +        m = ((i + 2) % n) === 0 ? 1 : (i + 2) % n
    +
    +        pti = GI.getpoint(exterior, i)
    +        ptj = GI.getpoint(exterior, j)
    +        ptm = GI.getpoint(exterior, m)
    +
    +        dx1 = GI.x(ptm) - GI.x(ptj)
    +        dy1 = GI.y(ptm) - GI.y(ptj)
    +        dx2 = GI.x(pti) - GI.x(ptj)
    +        dy2 = GI.y(pti) - GI.y(ptj)
    +
    +        cross = (dx1 * dy2) - (dy1 * dx2)
    +
    +        if i === 0
    +            sign = cross > 0
    +        elseif sign !== (cross > 0)
    +            return true
    +        end
    +    end
    +
    +    return false
    +end

    This is commented out.

    julia
    """
    +    isparallel(line1::LineString, line2::LineString)::Bool
    +
    +Return `true` if each segment of `line1` is parallel to the correspondent segment of `line2`
    +
    +## Examples

    julia import GeoInterface as GI, GeometryOps as GO julia> line1 = GI.LineString([(9.170356, 45.477985), (9.164434, 45.482551), (9.166644, 45.484003)]) GeoInterface.Wrappers.LineString{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(9.170356, 45.477985), (9.164434, 45.482551), (9.166644, 45.484003)], nothing, nothing)

    julia> line2 = GI.LineString([(9.169356, 45.477985), (9.163434, 45.482551), (9.165644, 45.484003)]) GeoInterface.Wrappers.LineString{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(9.169356, 45.477985), (9.163434, 45.482551), (9.165644, 45.484003)], nothing, nothing)

    julia> GO.isparallel(line1, line2) true

    """
    +function isparallel(line1, line2)::Bool
    +    seg1 = linesegment(line1)
    +    seg2 = linesegment(line2)
    +
    +    for i in eachindex(seg1)
    +        coors2 = nothing
    +        coors1 = seg1[i]
    +        coors2 = seg2[i]
    +        _isparallel(coors1, coors2) == false && return false
    +    end
    +    return true
    +end
    +
    +@inline function _isparallel(p1, p2)
    +    slope1 = bearing_to_azimuth(rhumb_bearing(GI.x(p1), GI.x(p2)))
    +    slope2 = bearing_to_azimuth(rhumb_bearing(GI.y(p1), GI.y(p2)))
    +
    +    return slope1 === slope2
    +end

    This is actual code:

    julia
    _isparallel(((ax, ay), (bx, by)), ((cx, cy), (dx, dy))) =
    +    _isparallel(bx - ax, by - ay, dx - cx, dy - cy)
    +
    +_isparallel(Δx1, Δy1, Δx2, Δy2) = (Δx1 * Δy2 == Δy1 * Δx2)

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/methods/polygonize.html b/previews/PR239/source/methods/polygonize.html new file mode 100644 index 000000000..453f268ed --- /dev/null +++ b/previews/PR239/source/methods/polygonize.html @@ -0,0 +1,313 @@ + + + + + + Polygonizing raster data | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Polygonizing raster data

    julia
    export polygonize
    +
    +#=
    +The methods in this file convert a raster image into a set of polygons,
    +by contour detection using a clockwise Moore neighborhood method.
    +
    +The resulting polygons are snapped to the boundaries of the cells of the input raster,
    +so they will look different from traditional contours from a plotting package.
    +
    +The main entry point is the `polygonize` function.
    +
    +```@docs
    +polygonize
    +```
    +
    +# Example
    +
    +Here's a basic example, using the `Makie.peaks()` function.  First, let's investigate the nature of the function:
    +```@example polygonize
    +using Makie, GeometryOps
    +n = 49
    +xs, ys = LinRange(-3, 3, n), LinRange(-3, 3, n)
    +zs = Makie.peaks(n)
    +z_max_value = maximum(abs.(extrema(zs)))
    +f, a, p = heatmap(
    +    xs, ys, zs;
    +    axis = (; aspect = DataAspect(), title = "Exact function")
    +)
    +cb = Colorbar(f[1, 2], p; label = "Z-value")
    +f
    +```
    +
    +Now, we can use the `polygonize` function to convert the raster data into polygons.
    +
    +For this particular example, we chose a range of z-values between 0.8 and 3.2,
    +which would provide two distinct polygons with holes.
    +
    +```@example polygonize
    +polygons = polygonize(xs, ys, 0.8 .< zs .< 3.2)
    +```
    +This returns a `GI.MultiPolygon`, which is directly plottable.  Let's see how these look:
    +
    +```@example polygonize
    +f, a, p = poly(polygons; label = "Polygonized polygons", axis = (; aspect = DataAspect()))
    +```
    +
    +Finally, let's plot the Makie contour lines on top, to see how the polygonization compares:
    +```@example polygonize
    +contour!(a, xs, ys, zs; labels = true, levels = [0.8, 3.2], label = "Contour lines")
    +f
    +```
    +
    +# Implementation
    +
    +The implementation follows:
    +=#
    +
    +"""
    +    polygonize(A::AbstractMatrix{Bool}; kw...)
    +    polygonize(f, A::AbstractMatrix; kw...)
    +    polygonize(xs, ys, A::AbstractMatrix{Bool}; kw...)
    +    polygonize(f, xs, ys, A::AbstractMatrix; kw...)
    +
    +Polygonize an `AbstractMatrix` of values, currently to a single class of polygons.
    +
    +Returns a `MultiPolygon` for `Bool` values and `f` return values, and
    +a `FeatureCollection` of `Feature`s holding `MultiPolygon` for all other values.
    +
    +
    +Function `f` should return either `true` or `false` or a transformation
    +of values into simpler groups, especially useful for floating point arrays.
    +
    +If `xs` and `ys` are ranges, they are used as the pixel/cell center points.
    +If they are `Vector` of `Tuple` they are used as the lower and upper bounds of each pixel/cell.

    Keywords

    julia
    - `minpoints`: ignore polygons with less than `minpoints` points.
    +- `values`: the values to turn into polygons. By default these are `union(A)`,
    +    If function `f` is passed these refer to the return values of `f`, by
    +    default `union(map(f, A)`. If values `Bool`, false is ignored and a single
    +    `MultiPolygon` is returned rather than a `FeatureCollection`.

    Example

    julia
    ```julia
    +using GeometryOps
    +A = rand(100, 100)
    +multipolygon = polygonize(>(0.5), A);
    +```
    +"""
    +polygonize(A::AbstractMatrix{Bool}; kw...) = polygonize(identity, A; kw...)
    +polygonize(f::Base.Callable, A::AbstractMatrix; kw...) = polygonize(f, axes(A)..., A; kw...)
    +polygonize(A::AbstractMatrix; kw...) = polygonize(axes(A)..., A; kw...)
    +polygonize(xs::AbstractVector, ys::AbstractVector, A::AbstractMatrix{Bool}; kw...) =
    +    _polygonize(identity, xs, ys, A)
    +function polygonize(xs::AbstractVector, ys::AbstractVector, A::AbstractMatrix;
    +    values=sort!(Base.union(A)), kw...
    +)
    +    _polygonize_featurecollection(identity, xs, ys, A; values, kw...)
    +end
    +function polygonize(f::Base.Callable, xs::AbstractRange, ys::AbstractRange, A::AbstractMatrix;
    +    values=_default_values(f, A), kw...
    +)
    +    if isnothing(values)
    +        _polygonize(f, xs, ys, A; kw...)
    +    else
    +        _polygonize_featurecollection(f, xs, ys, A; kw...)
    +    end
    +end
    +function _polygonize(f::Base.Callable, xs::AbstractRange, ys::AbstractRange, A::AbstractMatrix;
    +    kw...
    +)

    Make vectors of pixel bounds

    julia
        xhalf = step(xs) / 2
    +    yhalf = step(ys) / 2

    Make bounds ranges first to avoid floating point error making gaps or overlaps

    julia
        xbounds = range(first(xs) - xhalf; step = step(xs), length = length(xs) + 1)
    +    ybounds = range(first(ys) - yhalf; step = step(ys), length = length(ys) + 1)
    +    Tx = eltype(xbounds)
    +    Ty = eltype(ybounds)
    +    xvec = similar(Vector{Tuple{Tx,Tx}}, length(xs))
    +    yvec = similar(Vector{Tuple{Ty,Ty}}, length(ys))
    +    for (xind, i) in enumerate(eachindex(xvec))
    +        xvec[i] = xbounds[xind], xbounds[xind+1]
    +    end
    +    for (yind, i) in enumerate(eachindex(yvec))
    +        yvec[i] = ybounds[yind], ybounds[yind+1]
    +    end
    +    return _polygonize(f, xvec, yvec, A; kw...)
    +end
    +function _polygonize(f, xs::AbstractVector{T}, ys::AbstractVector{T}, A::AbstractMatrix;
    +    minpoints=0,
    +) where T<:Tuple
    +    (length(xs), length(ys)) == size(A) || throw(ArgumentError("length of xs and ys must match the array size"))

    Extract the CRS of the array (if it is some kind of geo array / raster)

    julia
        crs = GI.crs(A)

    Define buffers for edges and rings

    julia
        rings = Vector{T}[]
    +
    +    strait = true
    +    turning = false

    Get edges from the array A

    julia
        edges = _pixel_edges(f, xs, ys, A)

    Keep dict keys separately in a vector for performance

    julia
        edgekeys = collect(keys(edges))

    We don't delete keys we just reduce length with nkeys

    julia
        nkeys = length(edgekeys)

    Now create rings from the edges, looping until there are no edge keys left

    julia
        while nkeys > 0
    +        found = false
    +        local firstnode, nextnodes, nodestatus

    Loop until we find a key that hasn't been removed, decrementing nkeys as we go.

    julia
            while nkeys > 0

    Take the first node from the array

    julia
                firstnode::T = edgekeys[nkeys]
    +            nextnodes = edges[firstnode]
    +            nodestatus = map(!=(typemax(first(firstnode)))  first, nextnodes)
    +            if any(nodestatus)
    +                found = true
    +                break
    +            else
    +                nkeys -= 1
    +            end
    +        end

    If we found nothing this time, we are done

    julia
            found == false && break

    Check if there are one or two lines going through this node and take one of them, then update the status

    julia
            if nodestatus[2]
    +            nextnode = nextnodes[2]
    +            edges[firstnode] = (nextnodes[1], map(typemax, nextnode))
    +        else
    +            nkeys -= 1
    +            nextnode = nextnodes[1]
    +            edges[firstnode] = (map(typemax, nextnode), map(typemax, nextnode))
    +        end

    Start a new ring

    julia
            currentnode = firstnode
    +        ring = [currentnode, nextnode]
    +        push!(rings, ring)

    Loop until we close a the ring and break

    julia
            while true

    Find a node that matches the next node

    julia
                (c1, c2) = possiblenodes = edges[nextnode]
    +            nodestatus = map(!=(typemax(first(firstnode)))  first, possiblenodes)
    +            if nodestatus[2]

    When there are two possible node, choose the node that is the furthest to the left We also need to check if we are on a straight line to avoid adding unnecessary points.

    julia
                    selectednode, remainingnode, straightline = if currentnode[1] == nextnode[1] # vertical
    +                    wasincreasing = nextnode[2] > currentnode[2]
    +                    firstisstraight = nextnode[1] == c1[1]
    +                    firstisleft = nextnode[1] > c1[1]
    +                    secondisstraight = nextnode[1] == c2[1]
    +                    secondisleft = nextnode[1] > c2[1]
    +                    if firstisstraight
    +                        if secondisleft
    +                            if wasincreasing
    +                                (c2, c1, turning)
    +                            else
    +                                (c1, c2, straight)
    +                            end
    +                        else
    +                            if wasincreasing
    +                                (c1, c2, straight)
    +                            else
    +                                (c2, c1, secondisstraight)
    +                            end
    +                        end
    +                    elseif firstisleft
    +                        if wasincreasing
    +                            (c1, c2, turning)
    +                        else
    +                            (c2, c1, secondisstraight)
    +                        end
    +                    else # firstisright
    +                        if wasincreasing
    +                            (c2, c1, secondisstraight)
    +                        else
    +                            (c1, c2, turning)
    +                        end
    +                    end
    +                else # horizontal
    +                    wasincreasing = nextnode[1] > currentnode[1]
    +                    firstisstraight = nextnode[2] == c1[2]
    +                    firstisleft = nextnode[2] > c1[2]
    +                    secondisleft = nextnode[2] > c2[2]
    +                    secondisstraight = nextnode[2] == c2[2]
    +                    if firstisstraight
    +                        if secondisleft
    +                            if wasincreasing
    +                                (c1, c2, straight)
    +                            else
    +                                (c2, c1, turning)
    +                            end
    +                        else
    +                            if wasincreasing
    +                                (c2, c1, turning)
    +                            else
    +                                (c1, c2, straight)
    +                            end
    +                        end
    +                    elseif firstisleft
    +                        if wasincreasing
    +                            (c2, c1, secondisstraight)
    +                        else
    +                            (c1, c2, turning)
    +                        end
    +                    else # firstisright
    +                        if wasincreasing
    +                            (c1, c2, turning)
    +                        else
    +                            (c2, c1, secondisstraight)
    +                        end
    +                    end
    +                end

    Update edges

    julia
                    edges[nextnode] = (remainingnode, map(typemax, remainingnode))
    +            else

    Here we simply choose the first (and only valid) node

    julia
                    selectednode = c1

    Replace the edge nodes with empty nodes, they will be skipped later

    julia
                    edges[nextnode] = (map(typemax, c1), map(typemax, c1))

    Check if we are on a straight line

    julia
                    straightline = currentnode[1] == nextnode[1] == c1[1] ||
    +                               currentnode[2] == nextnode[2] == c1[2]
    +            end

    Update the current and next nodes with the next and selected nodes

    julia
                currentnode, nextnode = nextnode, selectednode

    Update the current node or add a new node to the ring

    julia
                if straightline

    replace the last node we don't need it

    julia
                    ring[end] = nextnode
    +            else

    add a new node, we have turned a corner

    julia
                    push!(ring, nextnode)
    +            end

    If the ring is closed, break the loop and start a new one

    julia
                nextnode == firstnode && break
    +        end
    +    end

    Define wrapped LinearRings, with embedded extents so we only calculate them once

    julia
        linearrings = map(rings) do ring
    +        extent = GI.extent(GI.LinearRing(ring))
    +        GI.LinearRing(ring; extent, crs)
    +    end

    Separate exteriors from holes by winding direction

    julia
        direction = (last(last(xs)) - first(first(xs))) * (last(last(ys)) - first(first(ys)))
    +    exterior_inds = if direction > 0
    +        .!isclockwise.(linearrings)
    +    else
    +        isclockwise.(linearrings)
    +    end
    +    holes = linearrings[.!exterior_inds]
    +    polygons = map(view(linearrings, exterior_inds)) do lr
    +        GI.Polygon([lr]; extent=GI.extent(lr), crs)
    +    end

    Then we add the holes to the polygons they are inside of

    julia
        assigned = fill(false, length(holes))
    +    for i in eachindex(holes)
    +        hole = holes[i]
    +        prepared_hole = GI.LinearRing(holes[i]; extent=GI.extent(holes[i]))
    +        for poly in polygons
    +            exterior = GI.Polygon(StaticArrays.SVector(GI.getexterior(poly)); extent=GI.extent(poly))
    +            if covers(exterior, prepared_hole)

    Hole is in the exterior, so add it to the polygon

    julia
                    push!(poly.geom, hole)
    +                assigned[i] = true
    +                break
    +            end
    +        end
    +    end
    +
    +    assigned_holes = count(assigned)
    +    assigned_holes == length(holes) || @warn "Not all holes were assigned to polygons, $(length(holes) - assigned_holes) where missed from $(length(holes)) holes and $(length(polygons)) polygons"
    +
    +    if isempty(polygons)

    TODO: this really should return an empty MultiPolygon but GeoInterface wrappers cant do that yet, which is not ideal...

    julia
            @warn "No polgons found, check your data or try another function for `f`"
    +        return nothing
    +    else

    Otherwise return a wrapped MultiPolygon

    julia
            return GI.MultiPolygon(polygons; crs, extent = mapreduce(GI.extent, Extents.union, polygons))
    +    end
    +end
    +
    +function _polygonize_featurecollection(f::Base.Callable, xs::AbstractRange, ys::AbstractRange, A::AbstractMatrix;
    +    values=_default_values(f, A), kw...
    +)
    +    crs = GI.crs(A)

    Create one feature per value

    julia
        features = map(values) do value
    +        multipolygon = _polygonize(x -> isequal(f(x), value), xs, ys, A; kw...)
    +        GI.Feature(multipolygon; properties=(; value), extent = GI.extent(multipolygon), crs)
    +    end
    +
    +    return GI.FeatureCollection(features; extent = mapreduce(GI.extent, Extents.union, features), crs)
    +end
    +
    +function _default_values(f, A)

    Get union of f return values with resolved eltype

    julia
        values = map(identity, sort!(Base.union(Iterators.map(f, A))))

    We ignore pure Bool

    julia
        return eltype(values) == Bool ? nothing : collect(skipmissing(values))
    +end
    +
    +function update_edge!(dict, key, node)
    +    newnodes = (node, map(typemax, node))

    Get or write in one go, to skip a hash lookup

    julia
        existingnodes = get!(() -> newnodes, dict, key)

    If we actually fetched an existing node, update it

    julia
        if existingnodes[1] != node
    +        dict[key] = (existingnodes[1], node)
    +    end
    +end
    +
    +function _pixel_edges(f, xs::AbstractVector{T}, ys::AbstractVector{T}, A) where T<:Tuple
    +    edges = Dict{T,Tuple{T,T}}()

    First we collect all the edges around target pixels

    julia
        fi, fj = map(first, axes(A))
    +    li, lj = map(last, axes(A))
    +    for j in axes(A, 2)
    +        y1, y2 = ys[j]
    +        for i in axes(A, 1)
    +            if f(A[i, j]) # This is a pixel inside a polygon

    xs and ys hold pixel bounds

    julia
                    x1, x2 = xs[i]

    We check the Von Neumann neighborhood to decide what edges are needed, if any.

    julia
                    (j == fi || !f(A[i, j-1])) && update_edge!(edges, (x1, y1), (x2, y1)) # S
    +                (i == fj || !f(A[i-1, j])) && update_edge!(edges, (x1, y2), (x1, y1)) # W
    +                (j == lj || !f(A[i, j+1])) && update_edge!(edges, (x2, y2), (x1, y2)) # N
    +                (i == li || !f(A[i+1, j])) && update_edge!(edges, (x2, y1), (x2, y2)) # E
    +            end
    +        end
    +    end
    +    return edges
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/not_implemented_yet.html b/previews/PR239/source/not_implemented_yet.html new file mode 100644 index 000000000..8279cc9c4 --- /dev/null +++ b/previews/PR239/source/not_implemented_yet.html @@ -0,0 +1,28 @@ + + + + + + Not implemented yet | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Not implemented yet

    All of the functions in this file are not implemented in Julia yet. Some of them may have implementations in LibGEOS which we can use via an extension, but there is no native-Julia implementation for them.

    julia
    function symdifference end
    +function buffer end
    +function convexhull end
    +function concavehull end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/primitives.html b/previews/PR239/source/primitives.html new file mode 100644 index 000000000..5859d4963 --- /dev/null +++ b/previews/PR239/source/primitives.html @@ -0,0 +1,25 @@ + + + + + + GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content
    + + + + \ No newline at end of file diff --git a/previews/PR239/source/src/GeometryOpsCore.html b/previews/PR239/source/src/GeometryOpsCore.html new file mode 100644 index 000000000..31c588e5a --- /dev/null +++ b/previews/PR239/source/src/GeometryOpsCore.html @@ -0,0 +1,49 @@ + + + + + + GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content
    julia
    module GeometryOpsCore
    +
    +using Base.Threads: nthreads, @threads, @spawn
    +
    +import GeoInterface
    +import GeoInterface as GI
    +import GeoInterface: Extents

    Import all names from GeoInterface and Extents, so users can do GO.extent or GO.trait.

    julia
    for name in names(GeoInterface)
    +    @eval using GeoInterface: $name
    +end
    +for name in names(Extents)
    +    @eval using GeoInterface.Extents: $name
    +end
    +
    +using Tables
    +using DataAPI
    +
    +include("keyword_docs.jl")
    +include("types.jl")
    +
    +include("apply.jl")
    +include("applyreduce.jl")
    +include("other_primitives.jl")
    +include("geometry_utils.jl")
    +
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/src/apply.html b/previews/PR239/source/src/apply.html new file mode 100644 index 000000000..c92ed3c42 --- /dev/null +++ b/previews/PR239/source/src/apply.html @@ -0,0 +1,170 @@ + + + + + + apply | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    apply

    julia
    export apply

    This file mainly defines the apply function.

    In general, the idea behind the apply framework is to take as input any geometry, vector of geometries, or feature collection, deconstruct it to the given trait target (any arbitrary GI.AbstractTrait or TraitTarget union thereof, like PointTrait or PolygonTrait) and perform some operation on it. Then, the geometry or structure is rebuilt.

    This allows for a simple and consistent framework within which users can define their own operations trivially easily, and removes a lot of the complexity involved with handling complex geometry structures.

    For example, a simple way to flip the x and y coordinates of a geometry is:

    julia
    flipped_geom = GO.apply(GI.PointTrait(), geom) do p
    +    (GI.y(p), GI.x(p))
    +end

    As simple as that. There's no need to implement your own decomposition because it's done for you.

    Functions like flip, reproject, transform, even segmentize and simplify have been implemented using the apply framework. Similarly, centroid, area and distance have been implemented using the applyreduce framework.

    Docstrings

    Functions

    GeometryOpsCore.apply Function
    julia
    apply(f, target::Union{TraitTarget, GI.AbstractTrait}, obj; kw...)

    Reconstruct a geometry, feature, feature collection, or nested vectors of either using the function f on the target trait.

    f(target_geom) => x where x also has the target trait, or a trait that can be substituted. For example, swapping PolgonTrait to MultiPointTrait will fail if the outer object has MultiPolygonTrait, but should work if it has FeatureTrait.

    Objects "shallower" than the target trait are always completely rebuilt, like a Vector of FeatureCollectionTrait of FeatureTrait when the target has PolygonTrait and is held in the features. These will always be GeoInterface geometries/feature/feature collections. But "deeper" objects may remain unchanged or be whatever GeoInterface compatible objects f returns.

    The result is a functionally similar geometry with values depending on f.

    • threaded: true or false. Whether to use multithreading. Defaults to false.

    • crs: The CRS to attach to geometries. Defaults to nothing.

    • calc_extent: true or false. Whether to calculate the extent. Defaults to false.

    Example

    Flipped point the order in any feature or geometry, or iterables of either:

    julia
    import GeoInterface as GI
    +import GeometryOps as GO
    +geom = GI.Polygon([GI.LinearRing([(1, 2), (3, 4), (5, 6), (1, 2)]),
    +                   GI.LinearRing([(3, 4), (5, 6), (6, 7), (3, 4)])])
    +
    +flipped_geom = GO.apply(GI.PointTrait, geom) do p
    +    (GI.y(p), GI.x(p))
    +end

    source

    GeometryOpsCore.applyreduce Function
    julia
    applyreduce(f, op, target::Union{TraitTarget, GI.AbstractTrait}, obj; threaded)

    Apply function f to all objects with the target trait, and reduce the result with an op like +.

    The order and grouping of application of op is not guaranteed.

    If threaded==true threads will be used over arrays and iterables, feature collections and nested geometries.

    source

    What is apply?

    apply applies some function to every geometry matching the Target GeoInterface trait, in some arbitrarily nested object made up of:

    • AbstractArrays (we also try to iterate other non-GeoInteface compatible object)

    • FeatureCollectionTrait objects

    • FeatureTrait objects

    • AbstractGeometryTrait objects

    apply recursively calls itself through these nested layers until it reaches objects with the Target GeoInterface trait. When found apply applies the function f, and stops.

    The outer recursive functions then progressively rebuild the object using GeoInterface objects matching the original traits.

    If PointTrait is found but it is not the Target, an error is thrown. This likely means the object contains a different geometry trait to the target, such as MultiPointTrait when LineStringTrait was specified.

    To handle this possibility it may be necessary to make Target a Union of traits found at the same level of nesting, and define methods of f to handle all cases.

    Be careful making a union across "levels" of nesting, e.g. Union{FeatureTrait,PolygonTrait}, as _apply will just never reach PolygonTrait when all the polygons are wrapped in a FeatureTrait object.

    Embedding:

    extent and crs can be embedded in all geometries, features, and feature collections as part of apply. Geometries deeper than Target will of course not have new extent or crs embedded.

    • calc_extent signals to recalculate an Extent and embed it.

    • crs will be embedded as-is

    Threading

    Threading is used at the outermost level possible - over an array, feature collection, or e.g. a MultiPolygonTrait where each PolygonTrait sub-geometry may be calculated on a different thread.

    Currently, threading defaults to false for all objects, but can be turned on by passing the keyword argument threaded=true to apply.

    julia
    """
    +    apply(f, target::Union{TraitTarget, GI.AbstractTrait}, obj; kw...)
    +
    +Reconstruct a geometry, feature, feature collection, or nested vectors of
    +either using the function `f` on the `target` trait.
    +
    +`f(target_geom) => x` where `x` also has the `target` trait, or a trait that can
    +be substituted. For example, swapping `PolgonTrait` to `MultiPointTrait` will fail
    +if the outer object has `MultiPolygonTrait`, but should work if it has `FeatureTrait`.
    +
    +Objects "shallower" than the target trait are always completely rebuilt, like
    +a `Vector` of `FeatureCollectionTrait` of `FeatureTrait` when the target
    +has `PolygonTrait` and is held in the features. These will always be GeoInterface
    +geometries/feature/feature collections. But "deeper" objects may remain
    +unchanged or be whatever GeoInterface compatible objects `f` returns.
    +
    +The result is a functionally similar geometry with values depending on `f`.
    +
    +$APPLY_KEYWORDS
    +
    +# Example
    +
    +Flipped point the order in any feature or geometry, or iterables of either:
    +
    +```julia
    +import GeoInterface as GI
    +import GeometryOps as GO
    +geom = GI.Polygon([GI.LinearRing([(1, 2), (3, 4), (5, 6), (1, 2)]),
    +                   GI.LinearRing([(3, 4), (5, 6), (6, 7), (3, 4)])])
    +
    +flipped_geom = GO.apply(GI.PointTrait, geom) do p
    +    (GI.y(p), GI.x(p))
    +end
    +```
    +"""
    +@inline function apply(
    +    f::F, target, geom; calc_extent=false, threaded=false, kw...
    +) where F
    +    threaded = _booltype(threaded)
    +    calc_extent = _booltype(calc_extent)
    +    _apply(f, TraitTarget(target), geom; threaded, calc_extent, kw...)
    +end

    Call _apply again with the trait of geom

    julia
    @inline _apply(f::F, target, geom; kw...)  where F =
    +    _apply(f, target, GI.trait(geom), geom; kw...)

    There is no trait and this is an AbstractArray - so just iterate over it calling _apply on the contents

    julia
    @inline function _apply(f::F, target, ::Nothing, A::AbstractArray; threaded, kw...) where F

    For an Array there is nothing else to do but map _apply over all values _maptasks may run this level threaded if threaded==true, but deeper _apply called in the closure will not be threaded

    julia
        apply_to_array(i) = _apply(f, target, A[i]; threaded=_False(), kw...)
    +    _maptasks(apply_to_array, eachindex(A), threaded)
    +end

    There is no trait and this is not an AbstractArray. Try to call _apply over it. We can't use threading as we don't know if we can can index into it. So just map.

    julia
    @inline function _apply(f::F, target, ::Nothing, iterable::IterableType; threaded, kw...) where {F, IterableType}

    Try the Tables.jl interface first

    julia
        if Tables.istable(iterable)
    +    _apply_table(f, target, iterable; threaded, kw...)
    +    else # this is probably some form of iterable...
    +        if threaded isa _True

    collect first so we can use threads

    julia
                _apply(f, target, collect(iterable); threaded, kw...)
    +        else
    +            apply_to_iterable(x) = _apply(f, target, x; kw...)
    +            map(apply_to_iterable, iterable)
    +        end
    +    end
    +end
    +#=
    +Doing this inline in `_apply` is _heavily_ type unstable, so it's best to separate this
    +by a function barrier.
    +
    +This function operates `apply` on the `geometry` column of the table, and returns a new table
    +with the same schema, but with the new geometry column.
    +
    +This new table may be of the same type as the old one iff `Tables.materializer` is defined for
    +that table.  If not, then a `NamedTuple` is returned.
    +=#
    +function _apply_table(f::F, target, iterable::IterableType; threaded, kw...) where {F, IterableType}
    +    _get_col_pair(colname) = colname => Tables.getcolumn(iterable, colname)

    We extract the geometry column and run apply on it.

    julia
        geometry_column = first(GI.geometrycolumns(iterable))
    +    new_geometry = _apply(f, target, Tables.getcolumn(iterable, geometry_column); threaded, kw...)

    Then, we obtain the schema of the table,

    julia
        old_schema = Tables.schema(iterable)

    filter the geometry column out,

    julia
        new_names = filter(Base.Fix1(!==, geometry_column), old_schema.names)

    and try to rebuild the same table as the best type - either the original type of iterable, or a named tuple which is the default fallback.

    julia
        result = Tables.materializer(iterable)(
    +        merge(
    +            NamedTuple{(geometry_column,), Base.Tuple{typeof(new_geometry)}}((new_geometry,)),
    +            NamedTuple(Iterators.map(_get_col_pair, new_names))
    +        )
    +    )

    Finally, we ensure that metadata is propagated correctly. This can only happen if the original table supports metadata reads, and the result supports metadata writes.

    julia
        if DataAPI.metadatasupport(typeof(result)).write

    Copy over all metadata from the original table to the new table, if the original table supports metadata reading.

    julia
            if DataAPI.metadatasupport(IterableType).read
    +            for (key, (value, style)) in DataAPI.metadata(iterable; style = true)

    Default styles are not preserved on data transformation, so we must skip them!

    julia
                    style == :default && continue

    We assume that any other style is preserved.

    julia
                    DataAPI.metadata!(result, key, value; style)
    +            end
    +        end

    We don't usually care about the original table's metadata for GEOINTERFACE namespaced keys, so we should set the crs and geometrycolumns metadata if they are present. Ensure that GEOINTERFACE:geometrycolumns and GEOINTERFACE:crs are set!

    julia
            mdk = DataAPI.metadatakeys(result)

    If the user has asked for geometry columns to persist, they would be here, so we don't need to set them.

    julia
            if !("GEOINTERFACE:geometrycolumns" in mdk)

    If the geometry columns are not already set, we need to set them.

    julia
                DataAPI.metadata!(result, "GEOINTERFACE:geometrycolumns", (geometry_column,); style = :default)
    +        end

    Force reset CRS always, since you can pass crs to apply.

    julia
            new_crs = if haskey(kw, :crs)
    +            kw[:crs]
    +        else
    +            GI.crs(iterable) # this will automatically check `GEOINTERFACE:crs` unless the type has a specialized implementation.
    +        end
    +
    +        DataAPI.metadata!(result, "GEOINTERFACE:crs", new_crs; style = :default)
    +    end
    +
    +    return result
    +end

    Rewrap all FeatureCollectionTrait feature collections as GI.FeatureCollection Maybe use threads to call _apply on component features

    julia
    @inline function _apply(f::F, target, ::GI.FeatureCollectionTrait, fc;
    +    crs=GI.crs(fc), calc_extent=_False(), threaded
    +) where F

    Run _apply on all features in the feature collection, possibly threaded

    julia
        apply_to_feature(i) =
    +        _apply(f, target, GI.getfeature(fc, i); crs, calc_extent, threaded=_False())::GI.Feature
    +    features = _maptasks(apply_to_feature, 1:GI.nfeature(fc), threaded)
    +    if calc_extent isa _True

    Calculate the extent of the features

    julia
            extent = mapreduce(GI.extent, Extents.union, features)

    Return a FeatureCollection with features, crs and calculated extent

    julia
            return GI.FeatureCollection(features; crs, extent)
    +    else

    Return a FeatureCollection with features and crs

    julia
            return GI.FeatureCollection(features; crs)
    +    end
    +end

    Rewrap all FeatureTrait features as GI.Feature, keeping the properties

    julia
    @inline function _apply(f::F, target, ::GI.FeatureTrait, feature;
    +    crs=GI.crs(feature), calc_extent=_False(), threaded
    +) where F

    Run _apply on the contained geometry

    julia
        geometry = _apply(f, target, GI.geometry(feature); crs, calc_extent, threaded)

    Get the feature properties

    julia
        properties = GI.properties(feature)
    +    if calc_extent isa _True

    Calculate the extent of the geometry

    julia
            extent = GI.extent(geometry)

    Return a new Feature with the new geometry and calculated extent, but the original properties and crs

    julia
            return GI.Feature(geometry; properties, crs, extent)
    +    else

    Return a new Feature with the new geometry, but the original properties and crs

    julia
            return GI.Feature(geometry; properties, crs)
    +    end
    +end

    Reconstruct nested geometries, maybe using threads to call _apply on component geoms

    julia
    @inline function _apply(f::F, target, trait, geom;
    +    crs=GI.crs(geom), calc_extent=_False(), threaded
    +)::(GI.geointerface_geomtype(trait)) where F

    Map _apply over all sub geometries of geom to create a new vector of geometries TODO handle zero length

    julia
        apply_to_geom(i) = _apply(f, target, GI.getgeom(geom, i); crs, calc_extent, threaded=_False())
    +    geoms = _maptasks(apply_to_geom, 1:GI.ngeom(geom), threaded)
    +    return _apply_inner(geom, geoms, crs, calc_extent)
    +end
    +@inline function _apply(f::F, target::TraitTarget{<:PointTrait}, trait::GI.PolygonTrait, geom;
    +    crs=GI.crs(geom), calc_extent=_False(), threaded
    +)::(GI.geointerface_geomtype(trait)) where F

    We need to force rebuilding a LinearRing not a LineString

    julia
        geoms = _maptasks(1:GI.ngeom(geom), threaded) do i
    +        lr = GI.getgeom(geom, i)
    +        points = map(GI.getgeom(lr)) do p
    +            _apply(f, target, p; crs, calc_extent, threaded=_False())
    +        end
    +        _linearring(_apply_inner(lr, points, crs, calc_extent))
    +    end
    +    return _apply_inner(geom, geoms, crs, calc_extent)
    +end
    +function _apply_inner(geom, geoms, crs, calc_extent::_True)

    Calculate the extent of the sub geometries

    julia
        extent = mapreduce(GI.extent, Extents.union, geoms)

    Return a new geometry of the same trait as geom, holding the new geoms with crs and calculated extent

    julia
        return rebuild(geom, geoms; crs, extent)
    +end
    +function _apply_inner(geom, geoms, crs, calc_extent::_False)

    Return a new geometry of the same trait as geom, holding the new geoms with crs

    julia
        return rebuild(geom, geoms; crs)
    +end

    Fail loudly if we hit PointTrait without running f (after PointTrait there is no further to dig with _apply) @inline _apply(f, ::TraitTarget{Target}, trait::GI.PointTrait, geom; crs=nothing, kw...) where Target = throw(ArgumentError("target Target not found, but reached a PointTrait leaf")) Finally, these short methods are the main purpose of apply. The Trait is a subtype of the Target (or identical to it) So the Target is found. We apply f to geom and return it to previous _apply calls to be wrapped with the outer geometries/feature/featurecollection/array.

    julia
    _apply(f::F, ::TraitTarget{Target}, ::Trait, geom; crs=GI.crs(geom), kw...) where {F,Target,Trait<:Target} = f(geom)

    Define some specific cases of this match to avoid method ambiguity

    julia
    for T in (
    +    GI.PointTrait, GI.LinearRing, GI.LineString,
    +    GI.MultiPoint, GI.FeatureTrait, GI.FeatureCollectionTrait
    +)
    +    @eval _apply(f::F, target::TraitTarget{<:$T}, trait::$T, x; kw...) where F = f(x)
    +end
    +
    +
    +### `_maptasks` - flexible, threaded `map`
    +
    +using Base.Threads: nthreads, @threads, @spawn

    Threading utility, modified Mason Protters threading PSA run f over ntasks, where f receives an AbstractArray/range of linear indices

    julia
    @inline function _maptasks(f::F, taskrange, threaded::_True)::Vector where F
    +    ntasks = length(taskrange)

    Customize this as needed. More tasks have more overhead, but better load balancing

    julia
        tasks_per_thread = 2
    +    chunk_size = max(1, ntasks ÷ (tasks_per_thread * nthreads()))

    partition the range into chunks

    julia
        task_chunks = Iterators.partition(taskrange, chunk_size)

    Map over the chunks

    julia
        tasks = map(task_chunks) do chunk

    Spawn a task to process this chunk

    julia
            @spawn begin

    Where we map f over the chunk indices

    julia
                map(f, chunk)
    +        end
    +    end

    Finally we join the results into a new vector

    julia
        return mapreduce(fetch, vcat, tasks)
    +end

    Here we use the compiler directive @assume_effects :foldable to force the compiler to lookup through the closure. This alone makes e.g. flip 2.5x faster!

    julia
    Base.@assume_effects :foldable @inline function _maptasks(f::F, taskrange, threaded::_False)::Vector where F
    +    map(f, taskrange)
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/src/applyreduce.html b/previews/PR239/source/src/applyreduce.html new file mode 100644 index 000000000..c6825a5c6 --- /dev/null +++ b/previews/PR239/source/src/applyreduce.html @@ -0,0 +1,96 @@ + + + + + + applyreduce | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    applyreduce

    julia
    export applyreduce

    This file mainly defines the applyreduce function.

    This performs apply, but then reduces the result after flattening instead of rebuilding the geometry.

    In general, the idea behind the apply framework is to take as input any geometry, vector of geometries, or feature collection, deconstruct it to the given trait target (any arbitrary GI.AbstractTrait or TraitTarget union thereof, like PointTrait or PolygonTrait) and perform some operation on it.

    centroid, area and distance have been implemented using the applyreduce framework.

    julia
    """
    +    applyreduce(f, op, target::Union{TraitTarget, GI.AbstractTrait}, obj; threaded)
    +
    +Apply function `f` to all objects with the `target` trait,
    +and reduce the result with an `op` like `+`.
    +
    +The order and grouping of application of `op` is not guaranteed.
    +
    +If `threaded==true` threads will be used over arrays and iterables,
    +feature collections and nested geometries.
    +"""
    +@inline function applyreduce(
    +    f::F, op::O, target, geom; threaded=false, init=nothing
    +) where {F, O}
    +    threaded = _booltype(threaded)
    +    _applyreduce(f, op, TraitTarget(target), geom; threaded, init)
    +end
    +
    +@inline _applyreduce(f::F, op::O, target, geom; threaded, init) where {F, O} =
    +    _applyreduce(f, op, target, GI.trait(geom), geom; threaded, init)

    Maybe use threads reducing over arrays

    julia
    @inline function _applyreduce(f::F, op::O, target, ::Nothing, A::AbstractArray; threaded, init) where {F, O}
    +    applyreduce_array(i) = _applyreduce(f, op, target, A[i]; threaded=_False(), init)
    +    _mapreducetasks(applyreduce_array, op, eachindex(A), threaded; init)
    +end

    Try to applyreduce over iterables

    julia
    @inline function _applyreduce(f::F, op::O, target, ::Nothing, iterable::IterableType; threaded, init) where {F, O, IterableType}
    +    if Tables.istable(iterable)
    +        _applyreduce_table(f, op, target, iterable; threaded, init)
    +    else
    +        applyreduce_iterable(i) = _applyreduce(f, op, target, i; threaded=_False(), init)
    +        if threaded isa _True # Try to `collect` and reduce over the vector with threads
    +            _applyreduce(f, op, target, collect(iterable); threaded, init)
    +        else

    Try to mapreduce the iterable as-is

    julia
                mapreduce(applyreduce_iterable, op, iterable; init)
    +        end
    +    end
    +end

    In this case, we don't reconstruct the table, but only operate on the geometry column.

    julia
    function _applyreduce_table(f::F, op::O, target, iterable::IterableType; threaded, init) where {F, O, IterableType}

    We extract the geometry column and run applyreduce on it.

    julia
        geometry_column = first(GI.geometrycolumns(iterable))
    +    return _applyreduce(f, op, target, Tables.getcolumn(iterable, geometry_column); threaded, init)
    +end

    If applyreduce wants features, then applyreduce over the rows as GI.Features.

    julia
    function _applyreduce_table(f::F, op::O, target::GI.FeatureTrait, iterable::IterableType; threaded, init) where {F, O, IterableType}

    We extract the geometry column and run apply on it.

    julia
        geometry_column = first(GI.geometrycolumns(iterable))
    +    property_names = Iterators.filter(!=(geometry_column), Tables.schema(iterable).names)
    +    features = map(Tables.rows(iterable)) do row
    +        GI.Feature(Tables.getcolumn(row, geometry_column), properties=NamedTuple(Iterators.map(Base.Fix1(_get_col_pair, row), property_names)))
    +    end
    +    return _applyreduce(f, op, target, features; threaded, init)
    +end

    Maybe use threads reducing over features of feature collections

    julia
    @inline function _applyreduce(f::F, op::O, target, ::GI.FeatureCollectionTrait, fc; threaded, init) where {F, O}
    +    applyreduce_fc(i) = _applyreduce(f, op, target, GI.getfeature(fc, i); threaded=_False(), init)
    +    _mapreducetasks(applyreduce_fc, op, 1:GI.nfeature(fc), threaded; init)
    +end

    Features just applyreduce to their geometry

    julia
    @inline _applyreduce(f::F, op::O, target, ::GI.FeatureTrait, feature; threaded, init) where {F, O} =
    +    _applyreduce(f, op, target, GI.geometry(feature); threaded, init)

    Maybe use threads over components of nested geometries

    julia
    @inline function _applyreduce(f::F, op::O, target, trait, geom; threaded, init) where {F, O}
    +    applyreduce_geom(i) = _applyreduce(f, op, target, GI.getgeom(geom, i); threaded=_False(), init)
    +    _mapreducetasks(applyreduce_geom, op, 1:GI.ngeom(geom), threaded; init)
    +end

    Don't thread over points it won't pay off

    julia
    @inline function _applyreduce(
    +    f::F, op::O, target, trait::Union{GI.LinearRing,GI.LineString,GI.MultiPoint}, geom;
    +    threaded, init
    +) where {F, O}
    +    _applyreduce(f, op, target, GI.getgeom(geom); threaded=_False(), init)
    +end

    Apply f to the target

    julia
    @inline function _applyreduce(f::F, op::O, ::TraitTarget{Target}, ::Trait, x; kw...) where {F,O,Target,Trait<:Target}
    +    f(x)
    +end

    Fail if we hit PointTrait _applyreduce(f, op, target::TraitTarget{Target}, trait::PointTrait, geom; kw...) where Target = throw(ArgumentError("target target not found")) Specific cases to avoid method ambiguity

    julia
    for T in (
    +    GI.PointTrait, GI.LinearRing, GI.LineString,
    +    GI.MultiPoint, GI.FeatureTrait, GI.FeatureCollectionTrait
    +)
    +    @eval _applyreduce(f::F, op::O, ::TraitTarget{<:$T}, trait::$T, x; kw...) where {F, O} = f(x)
    +end
    +
    +### `_mapreducetasks` - flexible, threaded mapreduce
    +
    +import Base.Threads: nthreads, @threads, @spawn

    Threading utility, modified Mason Protters threading PSA run f over ntasks, where f receives an AbstractArray/range of linear indices

    WARNING: this will not work for mean/median - only ops where grouping is possible. That's because the implementation operates in chunks, and not globally.

    If you absolutely need a single chunk, then threaded = false will always decompose to straight mapreduce without grouping.

    julia
    @inline function _mapreducetasks(f::F, op, taskrange, threaded::_True; init) where F
    +    ntasks = length(taskrange)

    Customize this as needed. More tasks have more overhead, but better load balancing

    julia
        tasks_per_thread = 2
    +    chunk_size = max(1, ntasks ÷ (tasks_per_thread * nthreads()))

    partition the range into chunks

    julia
        task_chunks = Iterators.partition(taskrange, chunk_size)

    Map over the chunks

    julia
        tasks = map(task_chunks) do chunk

    Spawn a task to process this chunk

    julia
            @spawn begin

    Where we map f over the chunk indices

    julia
                mapreduce(f, op, chunk; init)
    +        end
    +    end

    Finally we join the results into a new vector

    julia
        return mapreduce(fetch, op, tasks; init)
    +end
    +Base.@assume_effects :foldable function _mapreducetasks(f::F, op, taskrange, threaded::_False; init) where F
    +    mapreduce(f, op, taskrange; init)
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/src/geometry_utils.html b/previews/PR239/source/src/geometry_utils.html new file mode 100644 index 000000000..f3b258464 --- /dev/null +++ b/previews/PR239/source/src/geometry_utils.html @@ -0,0 +1,26 @@ + + + + + + GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content
    julia
    _linearring(geom::GI.LineString) = GI.LinearRing(parent(geom); extent=geom.extent, crs=geom.crs)
    +_linearring(geom::GI.LinearRing) = geom

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/src/keyword_docs.html b/previews/PR239/source/src/keyword_docs.html new file mode 100644 index 000000000..42cd835da --- /dev/null +++ b/previews/PR239/source/src/keyword_docs.html @@ -0,0 +1,33 @@ + + + + + + Keyword docs | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Keyword docs

    This file defines common keyword documentation, that can be spliced into docstrings.

    julia
    const THREADED_KEYWORD = "- `threaded`: `true` or `false`. Whether to use multithreading. Defaults to `false`."
    +const CRS_KEYWORD = "- `crs`: The CRS to attach to geometries. Defaults to `nothing`."
    +const CALC_EXTENT_KEYWORD = "- `calc_extent`: `true` or `false`. Whether to calculate the extent. Defaults to `false`."
    +
    +const APPLY_KEYWORDS = """
    +$THREADED_KEYWORD
    +$CRS_KEYWORD
    +$CALC_EXTENT_KEYWORD
    +"""

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/src/other_primitives.html b/previews/PR239/source/src/other_primitives.html new file mode 100644 index 000000000..6faf67d7f --- /dev/null +++ b/previews/PR239/source/src/other_primitives.html @@ -0,0 +1,155 @@ + + + + + + Other primitives (unwrap, flatten, etc) | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Other primitives (unwrap, flatten, etc)

    This file defines the following primitives:

    GeometryOpsCore.unwrap Function
    julia
    unwrap(target::Type{<:AbstractTrait}, obj)
    +unwrap(f, target::Type{<:AbstractTrait}, obj)

    Unwrap the object to vectors, down to the target trait.

    If f is passed in it will be applied to the target geometries as they are found.

    source

    GeometryOpsCore.flatten Function
    julia
    flatten(target::Type{<:GI.AbstractTrait}, obj)
    +flatten(f, target::Type{<:GI.AbstractTrait}, obj)

    Lazily flatten any AbstractArray, iterator, FeatureCollectionTrait, FeatureTrait or AbstractGeometryTrait object obj, so that objects with the target trait are returned by the iterator.

    If f is passed in it will be applied to the target geometries.

    source

    GeometryOpsCore.reconstruct Function
    julia
    reconstruct(geom, components)

    Reconstruct geom from an iterable of component objects that match its structure.

    All objects in components must have the same GeoInterface.trait.

    Usually used in combination with flatten.

    source

    GeometryOpsCore.rebuild Function
    julia
    rebuild(geom, child_geoms)

    Rebuild a geometry from child geometries.

    By default geometries will be rebuilt as a GeoInterface.Wrappers geometry, but rebuild can have methods added to it to dispatch on geometries from other packages and specify how to rebuild them.

    (Maybe it should go into GeoInterface.jl)

    source

    julia
    """
    +    unwrap(target::Type{<:AbstractTrait}, obj)
    +    unwrap(f, target::Type{<:AbstractTrait}, obj)
    +
    +Unwrap the object to vectors, down to the target trait.
    +
    +If `f` is passed in it will be applied to the target geometries
    +as they are found.
    +"""
    +function unwrap end
    +unwrap(target::Type, geom) = unwrap(identity, target, geom)

    Add dispatch argument for trait

    julia
    unwrap(f, target::Type, geom) = unwrap(f, target, GI.trait(geom), geom)

    Try to unwrap over iterables

    julia
    unwrap(f, target::Type, ::Nothing, iterable) =
    +    map(x -> unwrap(f, target, x), iterable)

    Rewrap feature collections

    julia
    unwrap(f, target::Type, ::GI.FeatureCollectionTrait, fc) =
    +    map(x -> unwrap(f, target, x), GI.getfeature(fc))
    +unwrap(f, target::Type, ::GI.FeatureTrait, feature) =
    +    unwrap(f, target, GI.geometry(feature))
    +unwrap(f, target::Type, trait, geom) = map(g -> unwrap(f, target, g), GI.getgeom(geom))

    Apply f to the target geometry

    julia
    unwrap(f, ::Type{Target}, ::Trait, geom) where {Target,Trait<:Target} = f(geom)

    Fail if we hit PointTrait

    julia
    unwrap(f, target::Type, trait::GI.PointTrait, geom) =
    +    throw(ArgumentError("target $target not found, but reached a `PointTrait` leaf"))

    Specific cases to avoid method ambiguity

    julia
    unwrap(f, target::Type{GI.PointTrait}, trait::GI.PointTrait, geom) = f(geom)
    +unwrap(f, target::Type{GI.FeatureTrait}, ::GI.FeatureTrait, feature) = f(feature)
    +unwrap(f, target::Type{GI.FeatureCollectionTrait}, ::GI.FeatureCollectionTrait, fc) = f(fc)
    +
    +"""
    +    flatten(target::Type{<:GI.AbstractTrait}, obj)
    +    flatten(f, target::Type{<:GI.AbstractTrait}, obj)
    +
    +Lazily flatten any `AbstractArray`, iterator, `FeatureCollectionTrait`,
    +`FeatureTrait` or `AbstractGeometryTrait` object `obj`, so that objects
    +with the `target` trait are returned by the iterator.
    +
    +If `f` is passed in it will be applied to the target geometries.
    +"""
    +flatten(::Type{Target}, geom) where {Target<:GI.AbstractTrait} = flatten(identity, Target, geom)
    +flatten(f, ::Type{Target}, geom) where {Target<:GI.AbstractTrait} = _flatten(f, Target, geom)
    +
    +_flatten(f, ::Type{Target}, geom) where Target = _flatten(f, Target, GI.trait(geom), geom)

    Try to flatten over iterables

    julia
    function _flatten(f, ::Type{Target}, ::Nothing, iterable) where Target
    +    if Tables.istable(iterable)
    +        column = Tables.getcolumn(iterable, first(GI.geometrycolumns(iterable)))
    +        Iterators.map(x -> _flatten(f, Target, x), column) |> Iterators.flatten
    +    else
    +        Iterators.map(x -> _flatten(f, Target, x), iterable) |> Iterators.flatten
    +    end
    +end

    Flatten feature collections

    julia
    function _flatten(f, ::Type{Target}, ::GI.FeatureCollectionTrait, fc) where Target
    +    Iterators.map(GI.getfeature(fc)) do feature
    +        _flatten(f, Target, feature)
    +    end |> Iterators.flatten
    +end
    +_flatten(f, ::Type{Target}, ::GI.FeatureTrait, feature) where Target =
    +    _flatten(f, Target, GI.geometry(feature))

    Apply f to the target geometry

    julia
    _flatten(f, ::Type{Target}, ::Trait, geom) where {Target,Trait<:Target} = (f(geom),)
    +_flatten(f, ::Type{Target}, trait, geom) where Target =
    +    Iterators.flatten(Iterators.map(g -> _flatten(f, Target, g), GI.getgeom(geom)))

    Fail if we hit PointTrait without running f

    julia
    _flatten(f, ::Type{Target}, trait::GI.PointTrait, geom) where Target =
    +    throw(ArgumentError("target $Target not found, but reached a `PointTrait` leaf"))

    Specific cases to avoid method ambiguity

    julia
    _flatten(f, ::Type{<:GI.PointTrait}, ::GI.PointTrait, geom) = (f(geom),)
    +_flatten(f, ::Type{<:GI.FeatureTrait}, ::GI.FeatureTrait, feature) = (f(feature),)
    +_flatten(f, ::Type{<:GI.FeatureCollectionTrait}, ::GI.FeatureCollectionTrait, fc) = (f(fc),)
    +
    +
    +"""
    +    reconstruct(geom, components)
    +
    +Reconstruct `geom` from an iterable of component objects that match its structure.
    +
    +All objects in `components` must have the same `GeoInterface.trait`.
    +
    +Usually used in combination with `flatten`.
    +"""
    +function reconstruct(geom, components)
    +    obj, iter = _reconstruct(geom, components)
    +    return obj
    +end
    +
    +_reconstruct(geom, components) =
    +    _reconstruct(typeof(GI.trait(first(components))), geom, components, 1)
    +_reconstruct(::Type{Target}, geom, components, iter) where Target =
    +    _reconstruct(Target, GI.trait(geom), geom, components, iter)

    Try to reconstruct over iterables

    julia
    function _reconstruct(::Type{Target}, ::Nothing, iterable, components, iter) where Target
    +    vect = map(iterable) do x

    iter is updated by _reconstruct here

    julia
            obj, iter = _reconstruct(Target, x, components, iter)
    +        obj
    +    end
    +    return vect, iter
    +end

    Reconstruct feature collections

    julia
    function _reconstruct(::Type{Target}, ::GI.FeatureCollectionTrait, fc, components, iter) where Target
    +    features = map(GI.getfeature(fc)) do feature

    iter is updated by _reconstruct here

    julia
            newfeature, iter = _reconstruct(Target, feature, components, iter)
    +        newfeature
    +    end
    +    return GI.FeatureCollection(features; crs=GI.crs(fc)), iter
    +end
    +function _reconstruct(::Type{Target}, ::GI.FeatureTrait, feature, components, iter) where Target
    +    geom, iter = _reconstruct(Target, GI.geometry(feature), components, iter)
    +    return GI.Feature(geom; properties=GI.properties(feature), crs=GI.crs(feature)), iter
    +end
    +function _reconstruct(::Type{Target}, trait, geom, components, iter) where Target
    +    geoms = map(GI.getgeom(geom)) do subgeom

    iter is updated by _reconstruct here

    julia
            subgeom1, iter = _reconstruct(Target, GI.trait(subgeom), subgeom, components, iter)
    +        subgeom1
    +    end
    +    return rebuild(geom, geoms), iter
    +end

    Apply f to the target geometry

    julia
    _reconstruct(::Type{Target}, ::Trait, geom, components, iter) where {Target,Trait<:Target} =
    +    iterate(components, iter)

    Specific cases to avoid method ambiguity

    julia
    _reconstruct(::Type{<:GI.PointTrait}, ::GI.PointTrait, geom, components, iter) = iterate(components, iter)
    +_reconstruct(::Type{<:GI.FeatureTrait}, ::GI.FeatureTrait, feature, components, iter) = iterate(feature, iter)
    +_reconstruct(::Type{<:GI.FeatureCollectionTrait}, ::GI.FeatureCollectionTrait, fc, components, iter) = iterate(fc, iter)

    Fail if we hit PointTrait without running f

    julia
    _reconstruct(::Type{Target}, trait::GI.PointTrait, geom, components, iter) where Target =
    +    throw(ArgumentError("target $Target not found, but reached a `PointTrait` leaf"))
    +
    +"""
    +    rebuild(geom, child_geoms)
    +
    +Rebuild a geometry from child geometries.
    +
    +By default geometries will be rebuilt as a `GeoInterface.Wrappers`
    +geometry, but `rebuild` can have methods added to it to dispatch
    +on geometries from other packages and specify how to rebuild them.
    +
    +(Maybe it should go into GeoInterface.jl)
    +"""
    +rebuild(geom, child_geoms; kw...) = rebuild(GI.trait(geom), geom, child_geoms; kw...)
    +function rebuild(trait::GI.AbstractTrait, geom, child_geoms; crs=GI.crs(geom), extent=nothing)
    +    T = GI.geointerface_geomtype(trait)
    +    haveZ = (GI.is3d(child) for child in child_geoms)
    +    haveM = (GI.ismeasured(child) for child in child_geoms)
    +
    +    consistentZ = length(child_geoms) == 1 ? true : all(==(first(haveZ)), haveZ)
    +    consistentM = length(child_geoms) == 1 ? true : all(==(first(haveM)), haveM)
    +
    +    if !consistentZ || !consistentM
    +        @show consistentZ consistentM
    +        @show GI.is3d.(child_geoms)
    +        @show GI.ismeasured.(child_geoms)
    +        throw(ArgumentError("child geometries do not have consistent 3d or measure attributes."))
    +    end
    +
    +    hasZ = first(haveZ)
    +    hasM = first(haveM)
    +
    +    return T{hasZ,hasM}(child_geoms; crs, extent)
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/src/types.html b/previews/PR239/source/src/types.html new file mode 100644 index 000000000..1e36ed178 --- /dev/null +++ b/previews/PR239/source/src/types.html @@ -0,0 +1,135 @@ + + + + + + Types | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Types

    This defines core types that the GeometryOps ecosystem uses, and that are usable in more than just GeometryOps.

    Manifold

    A manifold is mathematically defined as a topological space that resembles Euclidean space locally.

    In GeometryOps (and geodesy more generally), there are three manifolds we care about:

    • Planar: the 2d plane, a completely Euclidean manifold

    • Spherical: the unit sphere, but one where areas are multiplied by the radius of the Earth. This is not Euclidean globally, but all map projections attempt to represent the sphere on the Euclidean 2D plane to varying degrees of success.

    • Geodesic: the ellipsoid, the closest we can come to representing the Earth by a simple geometric shape. Parametrized by semimajor_axis and inv_flattening.

    Generally, we aim to have Linear and Spherical be operable everywhere, whereas Geodesic will only apply in specific circumstances. Currently, those circumstances are area and segmentize, but this could be extended with time and https://github.com/JuliaGeo/SphericalGeodesics.jl.

    julia
    export Planar, Spherical, Geodesic
    +export TraitTarget
    +export BoolsAsTypes, _True, _False, _booltype
    +
    +"""
    +    abstract type Manifold
    +
    +A manifold is mathematically defined as a topological space that resembles Euclidean space locally.
    +
    +We use the manifold definition to define the space in which an operation should be performed, or where a geometry lies.
    +
    +Currently we have `Planar`, `Spherical`, and `Geodesic` manifolds.
    +"""
    +abstract type Manifold end
    +
    +"""
    +    Planar()
    +
    +A planar manifold refers to the 2D Euclidean plane.
    +
    +Z coordinates may be accepted but will not influence geometry calculations, which
    +are done purely on 2D geometry.  This is the standard "2.5D" model used by e.g. GEOS.
    +"""
    +struct Planar <: Manifold
    +end
    +
    +"""
    +    Spherical(; radius)
    +
    +A spherical manifold means that the geometry is on the 3-sphere (but is represented by 2-D longitude and latitude).
    +
    +By default, the radius is defined as the mean radius of the Earth, `6371008.8 m`.
    +
    +# Extended help
    +
    +!!! note
    +    The traditional definition of spherical coordinates in physics and mathematics,
    +    ``r, \\theta, \\phi``, uses the _colatitude_, that measures angular displacement from the `z`-axis.
    +
    +    Here, we use the geographic definition of longitude and latitude, meaning
    +    that `lon` is longitude between -180 and 180, and `lat` is latitude between
    +    `-90` (south pole) and `90` (north pole).
    +"""
    +Base.@kwdef struct Spherical{T} <: Manifold
    +    radius::T = 6371008.8
    +end
    +
    +"""
    +    Geodesic(; semimajor_axis, inv_flattening)
    +
    +A geodesic manifold means that the geometry is on a 3-dimensional ellipsoid, parameterized by `semimajor_axis` (``a`` in mathematical parlance)
    +and `inv_flattening` (``1/f``).
    +
    +Usually, this is only relevant for area and segmentization calculations.  It becomes more relevant as one grows closer to the poles (or equator).
    +"""
    +Base.@kwdef struct Geodesic{T} <: Manifold
    +    semimajor_axis::T = 6378137.0
    +    inv_flattening::T = 298.257223563
    +end

    TraitTarget

    This struct holds a trait parameter or a union of trait parameters. It's essentially a way to construct unions.

    julia
    """
    +    TraitTarget{T}
    +
    +This struct holds a trait parameter or a union of trait parameters.
    +
    +It is primarily used for dispatch into methods which select trait levels,
    +like `apply`, or as a parameter to `target`.
    +
    +# Constructors
    +```julia
    +TraitTarget(GI.PointTrait())
    +TraitTarget(GI.LineStringTrait(), GI.LinearRingTrait()) # and other traits as you may like
    +TraitTarget(TraitTarget(...))

    There are also type based constructors available, but that's not advised.

    julia
    TraitTarget(GI.PointTrait)
    +TraitTarget(Union{GI.LineStringTrait, GI.LinearRingTrait})

    etc.

    julia
    ```
    +
    +"""
    +struct TraitTarget{T} end
    +TraitTarget(::Type{T}) where T = TraitTarget{T}()
    +TraitTarget(::T) where T<:GI.AbstractTrait = TraitTarget{T}()
    +TraitTarget(::TraitTarget{T}) where T = TraitTarget{T}()
    +TraitTarget(::Type{<:TraitTarget{T}}) where T = TraitTarget{T}()
    +TraitTarget(traits::GI.AbstractTrait...) = TraitTarget{Union{map(typeof, traits)...}}()
    +
    +
    +Base.in(::Trait, ::TraitTarget{Target}) where {Trait <: GI.AbstractTrait, Target} = Trait <: Target

    BoolsAsTypes

    In apply and applyreduce, we pass threading and calc_extent as types, not simple boolean values.

    This is to help compilation - with a type to hold on to, it's easier for the compiler to separate threaded and non-threaded code paths.

    Note that if we didn't include the parent abstract type, this would have been really type unstable, since the compiler couldn't tell what would be returned!

    We had to add the type annotation on the _booltype(::Bool) method for this reason as well.

    TODO: should we switch to Static.jl?

    julia
    """
    +    abstract type BoolsAsTypes
    +
    +"""
    +abstract type BoolsAsTypes end
    +
    +"""
    +    struct _True <: BoolsAsTypes
    +
    +A struct that means `true`.
    +"""
    +struct _True <: BoolsAsTypes end
    +
    +"""
    +    struct _False <: BoolsAsTypes
    +
    +A struct that means `false`.
    +"""
    +struct _False <: BoolsAsTypes end
    +
    +"""
    +    _booltype(x)
    +
    +Returns a `BoolsAsTypes` from `x`, whether it's a boolean or a BoolsAsTypes.
    +"""
    +function _booltype end
    +
    +@inline _booltype(x::Bool)::BoolsAsTypes = x ? _True() : _False()
    +@inline _booltype(x::BoolsAsTypes)::BoolsAsTypes = x

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/transformations/correction/closed_ring.html b/previews/PR239/source/transformations/correction/closed_ring.html new file mode 100644 index 000000000..9b7b08a6c --- /dev/null +++ b/previews/PR239/source/transformations/correction/closed_ring.html @@ -0,0 +1,54 @@ + + + + + + Closed Rings | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Closed Rings

    julia
    export ClosedRing

    A closed ring is a ring that has the same start and end point. This is a requirement for a valid polygon (technically, for a valid LinearRing). This correction is used to ensure that the polygon is valid.

    The reason this operates on the polygon level is that several packages are loose about whether they return LinearRings (which is correct) or LineStrings (which is incorrect) for the contents of a polygon. Therefore, we decompose manually to ensure correctness.

    Example

    Many polygon providers do not close their polygons, which makes them invalid according to the specification. Quite a few geometry algorithms assume that polygons are closed, and leaving them open can lead to incorrect results!

    For example, the following polygon is not valid:

    julia
    import GeoInterface as GI
    +polygon = GI.Polygon([[(0, 0), (1, 0), (1, 1), (0, 1)]])
    GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Int64, Int64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Int64, Int64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Int64, Int64}}, Nothing, Nothing}([(0, 0), (1, 0), (1, 1), (0, 1)], nothing, nothing)], nothing, nothing)

    even though it will look correct when visualized, and indeed appears correct.

    julia
    import GeometryOps as GO
    +GO.fix(polygon, corrections = [GO.ClosedRing()])
    GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(0.0, 0.0), (1.0, 0.0), (1.0, 1.0), (0.0, 1.0), (0.0, 0.0)], nothing, nothing)], nothing, nothing)

    You can see that the last point of the ring here is equal to the first point. For a polygon with n sides, there should be n+1 vertices.

    Implementation

    julia
    """
    +    ClosedRing() <: GeometryCorrection
    +
    +This correction ensures that a polygon's exterior and interior rings are closed.
    +
    +It can be called on any geometry correction as usual.
    +
    +See also `GeometryCorrection`.
    +"""
    +struct ClosedRing <: GeometryCorrection end
    +
    +application_level(::ClosedRing) = GI.PolygonTrait
    +
    +function (::ClosedRing)(::GI.PolygonTrait, polygon)
    +    exterior = _close_linear_ring(GI.getexterior(polygon))
    +
    +    holes = map(GI.gethole(polygon)) do hole
    +        _close_linear_ring(hole) # TODO: make this more efficient, or use tuples!
    +    end
    +
    +    return GI.Wrappers.Polygon([exterior, holes...])
    +end
    +
    +function _close_linear_ring(ring)
    +    if GI.getpoint(ring, 1) == GI.getpoint(ring, GI.npoint(ring))

    the ring is closed, all hail the ring

    julia
            return ring
    +    else

    Assemble the ring as a vector

    julia
            tups = tuples.(GI.getpoint(ring))

    Close the ring

    julia
            push!(tups, tups[1])

    Return an actual ring

    julia
            return GI.LinearRing(tups)
    +    end
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/transformations/correction/geometry_correction.html b/previews/PR239/source/transformations/correction/geometry_correction.html new file mode 100644 index 000000000..1d8fe8530 --- /dev/null +++ b/previews/PR239/source/transformations/correction/geometry_correction.html @@ -0,0 +1,55 @@ + + + + + + Geometry Corrections | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Geometry Corrections

    julia
    export fix

    This file simply defines the GeometryCorrection abstract type, and the interface that any GeometryCorrection must implement.

    A geometry correction is a transformation that is applied to a geometry to correct it in some way.

    For example, a ClosedRing correction might be applied to a Polygon to ensure that its exterior ring is closed.

    Interface

    All GeometryCorrections are callable structs which, when called, apply the correction to the given geometry, and return either a copy or the original geometry (if nothing needed to be corrected).

    See below for the full interface specification.

    GeometryOps.GeometryCorrection Type
    julia
    abstract type GeometryCorrection

    This abstract type represents a geometry correction.

    Interface

    Any GeometryCorrection must implement two functions: * application_level(::GeometryCorrection)::AbstractGeometryTrait: This function should return the GeoInterface trait that the correction is intended to be applied to, like PointTrait or LineStringTrait or PolygonTrait. * (::GeometryCorrection)(::AbstractGeometryTrait, geometry)::(some_geometry): This function should apply the correction to the given geometry, and return a new geometry.

    source

    Any geometry correction must implement the interface as given above.

    julia
    """
    +    abstract type GeometryCorrection
    +
    +This abstract type represents a geometry correction.
    +
    +# Interface
    +
    +Any `GeometryCorrection` must implement two functions:
    +    * `application_level(::GeometryCorrection)::AbstractGeometryTrait`: This function should return the `GeoInterface` trait that the correction is intended to be applied to, like `PointTrait` or `LineStringTrait` or `PolygonTrait`.
    +    * `(::GeometryCorrection)(::AbstractGeometryTrait, geometry)::(some_geometry)`: This function should apply the correction to the given geometry, and return a new geometry.
    +"""
    +abstract type GeometryCorrection end
    +
    +application_level(gc::GeometryCorrection) = error("Not implemented yet for $(gc)")
    +
    +(gc::GeometryCorrection)(geometry) = gc(GI.trait(geometry), geometry)
    +
    +(gc::GeometryCorrection)(trait::GI.AbstractGeometryTrait, geometry) = error("Not implemented yet for $(gc) and $(trait).")
    +
    +function fix(geometry; corrections = GeometryCorrection[ClosedRing(),], kwargs...)
    +    traits = application_level.(corrections)
    +    final_geometry = geometry
    +    for Trait in (GI.PointTrait, GI.MultiPointTrait, GI.LineStringTrait, GI.LinearRingTrait, GI.MultiLineStringTrait, GI.PolygonTrait, GI.MultiPolygonTrait)
    +        available_corrections = findall(x -> x == Trait, traits)
    +        isempty(available_corrections) && continue
    +        @debug "Correcting for $(Trait)"
    +        net_function = reduce(, corrections[available_corrections])
    +        final_geometry = apply(net_function, Trait, final_geometry; kwargs...)
    +    end
    +    return final_geometry
    +end

    Available corrections

    GeometryOps.ClosedRing Type
    julia
    ClosedRing() <: GeometryCorrection

    This correction ensures that a polygon's exterior and interior rings are closed.

    It can be called on any geometry correction as usual.

    See also GeometryCorrection.

    source

    GeometryOps.DiffIntersectingPolygons Type
    julia
    DiffIntersectingPolygons() <: GeometryCorrection

    This correction ensures that the polygons included in a multipolygon aren't intersecting. If any polygon's are intersecting, they will be made nonintersecting through the difference operation to create a unique set of disjoint (other than potentially connections by a single point) polygons covering the same area. See also GeometryCorrection, UnionIntersectingPolygons.

    source

    GeometryOps.GeometryCorrection Type
    julia
    abstract type GeometryCorrection

    This abstract type represents a geometry correction.

    Interface

    Any GeometryCorrection must implement two functions: * application_level(::GeometryCorrection)::AbstractGeometryTrait: This function should return the GeoInterface trait that the correction is intended to be applied to, like PointTrait or LineStringTrait or PolygonTrait. * (::GeometryCorrection)(::AbstractGeometryTrait, geometry)::(some_geometry): This function should apply the correction to the given geometry, and return a new geometry.

    source

    GeometryOps.UnionIntersectingPolygons Type
    julia
    UnionIntersectingPolygons() <: GeometryCorrection

    This correction ensures that the polygon's included in a multipolygon aren't intersecting. If any polygon's are intersecting, they will be combined through the union operation to create a unique set of disjoint (other than potentially connections by a single point) polygons covering the same area.

    See also GeometryCorrection.

    source


    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/transformations/correction/intersecting_polygons.html b/previews/PR239/source/transformations/correction/intersecting_polygons.html new file mode 100644 index 000000000..2a41cc054 --- /dev/null +++ b/previews/PR239/source/transformations/correction/intersecting_polygons.html @@ -0,0 +1,121 @@ + + + + + + Intersecting Polygons | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Intersecting Polygons

    julia
    export UnionIntersectingPolygons

    If the sub-polygons of a multipolygon are intersecting, this makes them invalid according to specification. Each sub-polygon of a multipolygon being disjoint (other than by a single point) is a requirement for a valid multipolygon. However, different libraries may achieve this in different ways.

    For example, taking the union of all sub-polygons of a multipolygon will create a new multipolygon where each sub-polygon is disjoint. This can be done with the UnionIntersectingPolygons correction.

    The reason this operates on a multipolygon level is that it is easy for users to mistakenly create multipolygon's that overlap, which can then be detrimental to polygon clipping performance and even create wrong answers.

    Example

    Multipolygon providers may not check that the polygons making up their multipolygons do not intersect, which makes them invalid according to the specification.

    For example, the following multipolygon is not valid:

    julia
    import GeoInterface as GI
    +polygon = GI.Polygon([[(0.0, 0.0), (3.0, 0.0), (3.0, 3.0), (0.0, 3.0), (0.0, 0.0)]])
    +multipolygon = GI.MultiPolygon([polygon, polygon])
    GeoInterface.Wrappers.MultiPolygon{false, false, Vector{GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}[GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(0.0, 0.0), (3.0, 0.0), (3.0, 3.0), (0.0, 3.0), (0.0, 0.0)], nothing, nothing)], nothing, nothing), GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(0.0, 0.0), (3.0, 0.0), (3.0, 3.0), (0.0, 3.0), (0.0, 0.0)], nothing, nothing)], nothing, nothing)], nothing, nothing)

    given that the two sub-polygons are the exact same shape.

    julia
    import GeometryOps as GO
    +GO.fix(multipolygon, corrections = [GO.UnionIntersectingPolygons()])
    GeoInterface.Wrappers.MultiPolygon{false, false, Vector{GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}[GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(0.0, 0.0), (3.0, 0.0), (3.0, 3.0), (0.0, 3.0), (0.0, 0.0)], nothing, nothing)], nothing, nothing)], nothing, nothing)

    You can see that the the multipolygon now only contains one sub-polygon, rather than the two identical ones provided.

    Implementation

    julia
    """
    +    UnionIntersectingPolygons() <: GeometryCorrection
    +
    +This correction ensures that the polygon's included in a multipolygon aren't intersecting.
    +If any polygon's are intersecting, they will be combined through the union operation to
    +create a unique set of disjoint (other than potentially connections by a single point)
    +polygons covering the same area.
    +
    +See also `GeometryCorrection`.
    +"""
    +struct UnionIntersectingPolygons <: GeometryCorrection end
    +
    +application_level(::UnionIntersectingPolygons) = GI.MultiPolygonTrait
    +
    +function (::UnionIntersectingPolygons)(::GI.MultiPolygonTrait, multipoly)
    +    union_multipoly = tuples(multipoly)
    +    n_polys = GI.npolygon(multipoly)
    +    if n_polys > 1
    +        keep_idx = trues(n_polys)  # keep track of sub-polygons to remove

    Combine any sub-polygons that intersect

    julia
            for (curr_idx, _) in Iterators.filter(last, Iterators.enumerate(keep_idx))
    +            curr_poly = union_multipoly.geom[curr_idx]
    +            poly_disjoint = false
    +            while !poly_disjoint
    +                poly_disjoint = true  # assume current polygon is disjoint from others
    +                for (next_idx, _) in Iterators.filter(last, Iterators.drop(Iterators.enumerate(keep_idx), curr_idx))
    +                    next_poly = union_multipoly.geom[next_idx]
    +                    if intersects(curr_poly, next_poly)  # if two polygons intersect
    +                        new_polys = union(curr_poly, next_poly; target = GI.PolygonTrait())
    +                        n_new_polys = length(new_polys)
    +                        if n_new_polys == 1  # if polygons combined
    +                            poly_disjoint = false
    +                            union_multipoly.geom[curr_idx] = new_polys[1]
    +                            curr_poly = union_multipoly.geom[curr_idx]
    +                            keep_idx[next_idx] = false
    +                        end
    +                    end
    +                end
    +            end
    +        end
    +        keepat!(union_multipoly.geom, keep_idx)
    +    end
    +    return union_multipoly
    +end
    +
    +"""
    +    DiffIntersectingPolygons() <: GeometryCorrection
    +This correction ensures that the polygons included in a multipolygon aren't intersecting.
    +If any polygon's are intersecting, they will be made nonintersecting through the `difference`
    +operation to create a unique set of disjoint (other than potentially connections by a single point)
    +polygons covering the same area.
    +See also `GeometryCorrection`, `UnionIntersectingPolygons`.
    +"""
    +struct DiffIntersectingPolygons <: GeometryCorrection end
    +
    +application_level(::DiffIntersectingPolygons) = GI.MultiPolygonTrait
    +
    +function (::DiffIntersectingPolygons)(::GI.MultiPolygonTrait, multipoly)
    +    diff_multipoly = tuples(multipoly)
    +    n_starting_polys = GI.npolygon(multipoly)
    +    n_polys = n_starting_polys
    +    if n_polys > 1
    +        keep_idx = trues(n_polys)  # keep track of sub-polygons to remove

    Break apart any sub-polygons that intersect

    julia
            for curr_idx in 1:n_starting_polys
    +            !keep_idx[curr_idx] && continue
    +            for next_idx in (curr_idx + 1):n_starting_polys
    +                !keep_idx[next_idx] && continue
    +                next_poly = diff_multipoly.geom[next_idx]
    +                n_new_polys = 0
    +                curr_pieces_added = (n_polys + 1):(n_polys + n_new_polys)
    +                for curr_piece_idx in Iterators.flatten((curr_idx:curr_idx, curr_pieces_added))
    +                    !keep_idx[curr_piece_idx] && continue
    +                    curr_poly = diff_multipoly.geom[curr_piece_idx]
    +                    if intersects(curr_poly, next_poly)  # if two polygons intersect
    +                        new_polys = difference(curr_poly, next_poly; target = GI.PolygonTrait())
    +                        n_new_pieces = length(new_polys) - 1
    +                        if n_new_pieces < 0  # current polygon is covered by next_polygon
    +                            keep_idx[curr_piece_idx] = false
    +                            break
    +                        elseif n_new_pieces  0
    +                            diff_multipoly.geom[curr_piece_idx] = new_polys[1]
    +                            curr_poly = diff_multipoly.geom[curr_piece_idx]
    +                            if n_new_pieces > 0 # current polygon breaks into several pieces
    +                                append!(diff_multipoly.geom, @view new_polys[2:end])
    +                                append!(keep_idx, trues(n_new_pieces))
    +                                n_new_polys += n_new_pieces
    +                            end
    +                        end
    +                    end
    +                end
    +                n_polys += n_new_polys
    +            end
    +        end
    +        keepat!(diff_multipoly.geom, keep_idx)
    +    end
    +    return diff_multipoly
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/transformations/extent.html b/previews/PR239/source/transformations/extent.html new file mode 100644 index 000000000..0292594a4 --- /dev/null +++ b/previews/PR239/source/transformations/extent.html @@ -0,0 +1,37 @@ + + + + + + Extent embedding | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Extent embedding

    julia
    """
    +    embed_extent(obj)
    +
    +Recursively wrap the object with a GeoInterface.jl geometry,
    +calculating and adding an `Extents.Extent` to all objects.
    +
    +This can improve performance when extents need to be checked multiple times,
    +such when needing to check if many points are in geometries, and using their extents
    +as a quick filter for obviously exterior points.

    Keywords

    julia
    $THREADED_KEYWORD
    +$CRS_KEYWORD
    +"""
    +embed_extent(x; threaded=false, crs=nothing) =
    +    apply(identity, GI.PointTrait(), x; calc_extent=true, threaded, crs)

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/transformations/flip.html b/previews/PR239/source/transformations/flip.html new file mode 100644 index 000000000..146352e2b --- /dev/null +++ b/previews/PR239/source/transformations/flip.html @@ -0,0 +1,46 @@ + + + + + + Coordinate flipping | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Coordinate flipping

    This is a simple example of how to use the apply functionality in a function, by flipping the x and y coordinates of a geometry.

    julia
    """
    +    flip(obj)
    +
    +Swap all of the x and y coordinates in obj, otherwise
    +keeping the original structure (but not necessarily the
    +original type).
    +
    +# Keywords
    +
    +$APPLY_KEYWORDS
    +"""
    +function flip(geom; kw...)
    +    if _is3d(geom)
    +        return apply(PointTrait(), geom; kw...) do p
    +            (GI.y(p), GI.x(p), GI.z(p))
    +        end
    +    else
    +        return apply(PointTrait(), geom; kw...) do p
    +            (GI.y(p), GI.x(p))
    +        end
    +    end
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/transformations/forcedims.html b/previews/PR239/source/transformations/forcedims.html new file mode 100644 index 000000000..c9f040f09 --- /dev/null +++ b/previews/PR239/source/transformations/forcedims.html @@ -0,0 +1,29 @@ + + + + + + GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content
    julia
    function forcexy(geom)
    +    return GO.apply(GO.GI.PointTrait(), geom) do point
    +        (GI.x(point), GI.y(point))
    +    end
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/transformations/reproject.html b/previews/PR239/source/transformations/reproject.html new file mode 100644 index 000000000..57a718e67 --- /dev/null +++ b/previews/PR239/source/transformations/reproject.html @@ -0,0 +1,65 @@ + + + + + + Geometry reprojection | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Geometry reprojection

    julia
    export reproject

    This file is pretty simple - it simply reprojects a geometry pointwise from one CRS to another. It uses the Proj package for the transformation, but this could be moved to an extension if needed.

    Note that the actual implementation is in the GeometryOpsProjExt extension module.

    This works using the apply functionality.

    julia
    """
    +    reproject(geometry; source_crs, target_crs, transform, always_xy, time)
    +    reproject(geometry, source_crs, target_crs; always_xy, time)
    +    reproject(geometry, transform; always_xy, time)
    +
    +Reproject any GeoInterface.jl compatible `geometry` from `source_crs` to `target_crs`.
    +
    +The returned object will be constructed from `GeoInterface.WrapperGeometry`
    +geometries, wrapping views of a `Vector{Proj.Point{D}}`, where `D` is the dimension.
    +
    +!!! tip
    +    The `Proj.jl` package must be loaded for this method to work,
    +    since it is implemented in a package extension.
    +
    +# Arguments
    +
    +- `geometry`: Any GeoInterface.jl compatible geometries.
    +- `source_crs`: the source coordinate reference system, as a GeoFormatTypes.jl object or a string.
    +- `target_crs`: the target coordinate reference system, as a GeoFormatTypes.jl object or a string.
    +
    +If these a passed as keywords, `transform` will take priority.
    +Without it `target_crs` is always needed, and `source_crs` is
    +needed if it is not retrievable from the geometry with `GeoInterface.crs(geometry)`.
    +
    +# Keywords
    +
    +- `always_xy`: force x, y coordinate order, `true` by default.
    +    `false` will expect and return points in the crs coordinate order.
    +- `time`: the time for the coordinates. `Inf` by default.
    +$APPLY_KEYWORDS
    +"""
    +function reproject end

    Method error handling

    We also inject a method error handler, which prints a suggestion if the Proj extension is not loaded.

    julia
    function _reproject_error_hinter(io, exc, argtypes, kwargs)
    +    if isnothing(Base.get_extension(GeometryOps, :GeometryOpsProjExt)) && exc.f == reproject
    +        print(io, "\n\nThe `reproject` method requires the Proj.jl package to be explicitly loaded.\n")
    +        print(io, "You can do this by simply typing ")
    +        printstyled(io, "using Proj"; color = :cyan, bold = true)
    +        println(io, " in your REPL, \nor otherwise loading Proj.jl via using or import.")
    +    else # this is a more general error
    +        nothing
    +    end
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/transformations/segmentize.html b/previews/PR239/source/transformations/segmentize.html new file mode 100644 index 000000000..75e01ed13 --- /dev/null +++ b/previews/PR239/source/transformations/segmentize.html @@ -0,0 +1,185 @@ + + + + + + Segmentize | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Segmentize

    julia
    export segmentize
    +export LinearSegments, GeodesicSegments

    This function "segmentizes" or "densifies" a geometry by adding extra vertices to the geometry so that no segment is longer than a given distance. This is useful for plotting geometries with a limited number of vertices, or for ensuring that a geometry is not too "coarse" for a given application.

    Info

    We plan to add interpolated segmentization from DataInterpolations.jl in the future, which will be available to any vector of point-like objects.

    For now, this function only works on 2D geometries.  We will also support 3D geometries, as well as measure interpolation, in the future.

    Examples

    julia
    import GeometryOps as GO, GeoInterface as GI
    +rectangle = GI.Wrappers.Polygon([[(0.0, 50.0), (7.071, 57.07), (0, 64.14), (-7.07, 57.07), (0.0, 50.0)]])
    +linear = GO.segmentize(rectangle; max_distance = 5)
    +collect(GI.getpoint(linear))
    9-element Vector{Tuple{Float64, Float64}}:
    + (0.0, 50.0)
    + (3.5355, 53.535)
    + (7.071, 57.07)
    + (3.5355, 60.605000000000004)
    + (0.0, 64.14)
    + (-3.535, 60.605000000000004)
    + (-7.07, 57.07)
    + (-3.535, 53.535)
    + (0.0, 50.0)

    You can see that this geometry was segmentized correctly, and now has 8 vertices where it previously had only 4.

    Now, we'll also segmentize this using the geodesic method, which is more accurate for lat/lon coordinates.

    julia
    using Proj # required to activate the `GeodesicSegments` method!
    +geodesic = GO.segmentize(GO.GeodesicSegments(max_distance = 1000), rectangle)
    +length(GI.getpoint(geodesic) |> collect)
    3585

    This has a lot of points! It's important to keep in mind that the max_distance is in meters, so this is a very fine-grained segmentation.

    Now, let's see what they look like! To make this fair, we'll use approximately the same number of points for both.

    julia
    using CairoMakie
    +linear = GO.segmentize(rectangle; max_distance = 0.01)
    +geodesic = GO.segmentize(GO.GeodesicSegments(; max_distance = 1000), rectangle)
    +f, a, p = poly(collect(GI.getpoint(linear)); label = "Linear", axis = (; aspect = DataAspect()))
    +p2 = poly!(collect(GI.getpoint(geodesic)); label = "Geodesic")
    +axislegend(a; position = :lt)
    +f

    There are two methods available for segmentizing geometries at the moment:

    Missing docstring.

    Missing docstring for LinearSegments. Check Documenter's build log for details.

    Missing docstring.

    Missing docstring for GeodesicSegments. Check Documenter's build log for details.

    Benchmark

    We benchmark our method against LibGEOS's GEOSDensify method, which is a similar method for densifying geometries.

    julia
    using BenchmarkTools: BenchmarkGroup
    +using Chairmarks: @be
    +using Main: plot_trials
    +using CairoMakie
    +
    +import GeometryOps as GO, GeoInterface as GI, LibGEOS as LG
    +
    +segmentize_suite = BenchmarkGroup(["title:Segmentize", "subtitle:Segmentize a rectangle"])
    +
    +rectangle = GI.Wrappers.Polygon([[(0.0, 50.0), (7.071, 57.07), (0.0, 64.14), (-7.07, 57.07), (0.0, 50.0)]])
    +lg_rectangle = GI.convert(LG, rectangle)
    POLYGON ((0 50, 7.071 57.07, 0 64.14, -7.07 57.07, 0 50))
    julia
    # These are initial distances, which yield similar numbers of points
    +# in the final geometry.
    +init_lin = 0.01
    +init_geo = 900
    +
    +# LibGEOS.jl doesn't offer this function, so we just wrap it ourselves!
    +function densify(obj::LG.Geometry, tol::Real, context::LG.GEOSContext = LG.get_context(obj))
    +    result = LG.GEOSDensify_r(context, obj, tol)
    +    if result == C_NULL
    +        error("LibGEOS: Error in GEOSDensify")
    +    end
    +    LG.geomFromGEOS(result, context)
    +end
    +# now, we get to the actual benchmarking:
    +for scalefactor in exp10.(LinRange(log10(0.1), log10(10), 5))
    +    lin_dist = init_lin * scalefactor
    +    geo_dist = init_geo * scalefactor
    +
    +    npoints_linear = GI.npoint(GO.segmentize(rectangle; max_distance = lin_dist))
    +    npoints_geodesic = GO.segmentize(GO.GeodesicSegments(; max_distance = geo_dist), rectangle) |> GI.npoint
    +    npoints_libgeos = GI.npoint(densify(lg_rectangle, lin_dist))
    +
    +    segmentize_suite["Linear"][npoints_linear] = @be GO.segmentize(GO.LinearSegments(; max_distance = $lin_dist), $rectangle) seconds=1
    +    segmentize_suite["Geodesic"][npoints_geodesic] = @be GO.segmentize(GO.GeodesicSegments(; max_distance = $geo_dist), $rectangle) seconds=1
    +    segmentize_suite["LibGEOS"][npoints_libgeos] = @be densify($lg_rectangle, $lin_dist) seconds=1
    +
    +end
    +
    +plot_trials(segmentize_suite)

    julia
    abstract type SegmentizeMethod end
    +"""
    +    LinearSegments(; max_distance::Real)
    +
    +A method for segmentizing geometries by adding extra vertices to the geometry so that no segment is longer than a given distance.
    +
    +Here, `max_distance` is a purely nondimensional quantity and will apply in the input space.   This is to say, that if the polygon is
    +provided in lat/lon coordinates then the `max_distance` will be in degrees of arc.  If the polygon is provided in meters, then the
    +`max_distance` will be in meters.
    +"""
    +Base.@kwdef struct LinearSegments <: SegmentizeMethod
    +    max_distance::Float64
    +end
    +
    +"""
    +    GeodesicSegments(; max_distance::Real, equatorial_radius::Real=6378137, flattening::Real=1/298.257223563)
    +
    +A method for segmentizing geometries by adding extra vertices to the geometry so that no segment is longer than a given distance.
    +This method calculates the distance between points on the geodesic, and assumes input in lat/long coordinates.
    +
    +!!! warning
    +    Any input geometries must be in lon/lat coordinates!  If not, the method may fail or error.
    +
    +# Arguments
    +- `max_distance::Real`: The maximum distance, **in meters**, between vertices in the geometry.
    +- `equatorial_radius::Real=6378137`: The equatorial radius of the Earth, in meters.  Passed to `Proj.geod_geodesic`.
    +- `flattening::Real=1/298.257223563`: The flattening of the Earth, which is the ratio of the difference between the equatorial and polar radii to the equatorial radius.  Passed to `Proj.geod_geodesic`.
    +
    +One can also omit the `equatorial_radius` and `flattening` keyword arguments, and pass a `geodesic` object directly to the eponymous keyword.
    +
    +This method uses the Proj/GeographicLib API for geodesic calculations.
    +"""
    +struct GeodesicSegments{T} <: SegmentizeMethod
    +    geodesic::T# ::Proj.geod_geodesic
    +    max_distance::Float64
    +end

    Add an error hint for GeodesicSegments if Proj is not loaded!

    julia
    function _geodesic_segments_error_hinter(io, exc, argtypes, kwargs)
    +    if isnothing(Base.get_extension(GeometryOps, :GeometryOpsProjExt)) && exc.f == GeodesicSegments
    +        print(io, "\n\nThe `Geodesic` method requires the Proj.jl package to be explicitly loaded.\n")
    +        print(io, "You can do this by simply typing ")
    +        printstyled(io, "using Proj"; color = :cyan, bold = true)
    +        println(io, " in your REPL, \nor otherwise loading Proj.jl via using or import.")
    +    end
    +end

    Implementation

    julia
    """
    +    segmentize([method = Planar()], geom; max_distance::Real, threaded)
    +
    +Segmentize a geometry by adding extra vertices to the geometry so that no segment is longer than a given distance.
    +This is useful for plotting geometries with a limited number of vertices, or for ensuring that a geometry is not too "coarse" for a given application.
    +
    +# Arguments
    +- `method::Manifold = Planar()`: The method to use for segmentizing the geometry.  At the moment, only `Planar` (assumes a flat plane) and `Geodesic` (assumes geometry on the ellipsoidal Earth and uses Vincenty's formulae) are available.
    +- `geom`: The geometry to segmentize.  Must be a `LineString`, `LinearRing`, `Polygon`, `MultiPolygon`, or `GeometryCollection`, or some vector or table of those.
    +- `max_distance::Real`: The maximum distance between vertices in the geometry.  **Beware: for `Planar`, this is in the units of the geometry, but for `Geodesic` and `Spherical` it's in units of the radius of the sphere.**
    +
    +Returns a geometry of similar type to the input geometry, but resampled.
    +"""
    +function segmentize(geom; max_distance, threaded::Union{Bool, BoolsAsTypes} = _False())
    +    return segmentize(Planar(), geom; max_distance, threaded = _booltype(threaded))
    +end

    allow three-arg method as well, just in case

    julia
    segmentize(geom, max_distance::Real; threaded = _False()) = segmentize(Planar(), geom, max_distance; threaded)
    +segmentize(method::Manifold, geom, max_distance::Real; threaded = _False()) = segmentize(Planar(), geom; max_distance, threaded)

    generic implementation

    julia
    function segmentize(method::Manifold, geom; max_distance, threaded::Union{Bool, BoolsAsTypes} = _False())
    +    @assert max_distance > 0 "`max_distance` should be positive and nonzero!  Found $(method.max_distance)."
    +    _segmentize_function(geom) = _segmentize(method, geom, GI.trait(geom); max_distance)
    +    return apply(_segmentize_function, TraitTarget(GI.LinearRingTrait(), GI.LineStringTrait()), geom; threaded)
    +end
    +
    +function segmentize(method::SegmentizeMethod, geom; threaded::Union{Bool, BoolsAsTypes} = _False())
    +    @warn "`segmentize(method::$(typeof(method)), geom) is deprecated; use `segmentize($(method isa LinearSegments ? "Planar()" : "Geodesic()"), geom; max_distance, threaded) instead!"  maxlog=3
    +    @assert method.max_distance > 0 "`max_distance` should be positive and nonzero!  Found $(method.max_distance)."
    +    new_method = method isa LinearSegments ? Planar() : Geodesic()
    +    segmentize(new_method, geom; max_distance = method.max_distance, threaded)
    +end
    +
    +_segmentize(method, geom) = _segmentize(method, geom, GI.trait(geom))
    +#=
    +This is a method which performs the common functionality for both linear and geodesic algorithms,
    +and calls out to the "kernel" function which we've defined per linesegment.
    +=#
    +function _segmentize(method::Union{Planar, Spherical}, geom, T::Union{GI.LineStringTrait, GI.LinearRingTrait}; max_distance)
    +    first_coord = GI.getpoint(geom, 1)
    +    x1, y1 = GI.x(first_coord), GI.y(first_coord)
    +    new_coords = NTuple{2, Float64}[]
    +    sizehint!(new_coords, GI.npoint(geom))
    +    push!(new_coords, (x1, y1))
    +    for coord in Iterators.drop(GI.getpoint(geom), 1)
    +        x2, y2 = GI.x(coord), GI.y(coord)
    +        _fill_linear_kernel!(method, new_coords, x1, y1, x2, y2; max_distance)
    +        x1, y1 = x2, y2
    +    end
    +    return rebuild(geom, new_coords)
    +end
    +
    +function _fill_linear_kernel!(::Planar, new_coords::Vector, x1, y1, x2, y2; max_distance)
    +    dx, dy = x2 - x1, y2 - y1
    +    distance = hypot(dx, dy) # this is a more stable way to compute the Euclidean distance
    +    if distance > max_distance
    +        n_segments = ceil(Int, distance / max_distance)
    +        for i in 1:(n_segments - 1)
    +            t = i / n_segments
    +            push!(new_coords, (x1 + t * dx, y1 + t * dy))
    +        end
    +    end

    End the line with the original coordinate, to avoid any multiplication errors.

    julia
        push!(new_coords, (x2, y2))
    +    return nothing
    +end

    Note

    The _fill_linear_kernel definition for GeodesicSegments is in the GeometryOpsProjExt extension module, in the segmentize.jl file.


    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/transformations/simplify.html b/previews/PR239/source/transformations/simplify.html new file mode 100644 index 000000000..f7c613c15 --- /dev/null +++ b/previews/PR239/source/transformations/simplify.html @@ -0,0 +1,514 @@ + + + + + + Geometry simplification | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Geometry simplification

    This file holds implementations for the RadialDistance, Douglas-Peucker, and Visvalingam-Whyatt algorithms for simplifying geometries (specifically for polygons and lines).

    The GEOS extension also allows for GEOS's topology preserving simplification as well as Douglas-Peucker simplification implemented in GEOS. Call this by passing GEOS(; method = :TopologyPreserve) or GEOS(; method = :DouglasPeucker) to the algorithm.

    Examples

    A quick and dirty example is:

    julia
    using Makie, GeoInterfaceMakie
    +import GeoInterface as GI
    +import GeometryOps as GO
    +
    +original = GI.Polygon([[[-70.603637, -33.399918], [-70.614624, -33.395332], [-70.639343, -33.392466], [-70.659942, -33.394759], [-70.683975, -33.404504], [-70.697021, -33.419406], [-70.701141, -33.434306], [-70.700454, -33.446339], [-70.694274, -33.458369], [-70.682601, -33.465816], [-70.668869, -33.472117], [-70.646209, -33.473835], [-70.624923, -33.472117], [-70.609817, -33.468107], [-70.595397, -33.458369], [-70.587158, -33.442901], [-70.587158, -33.426283], [-70.590591, -33.414248], [-70.594711, -33.406224], [-70.603637, -33.399918]]])
    +
    +simple = GO.simplify(original; number=6)
    +
    +f, a, p = poly(original; label = "Original")
    +poly!(simple; label = "Simplified")
    +axislegend(a)
    +f

    Benchmark

    We benchmark these methods against LibGEOS's simplify implementation, which uses the Douglas-Peucker algorithm.

    julia
    using BenchmarkTools, Chairmarks, GeoJSON, CairoMakie
    +import GeometryOps as GO, LibGEOS as LG, GeoInterface as GI
    +using CoordinateTransformations
    +using NaturalEarth
    +lg_and_go(geometry) = (GI.convert(LG, geometry), GO.tuples(geometry))
    +# Load in the Natural Earth admin GeoJSON, then extract the USA's geometry
    +fc = NaturalEarth.naturalearth("admin_0_countries", 10)
    +usa_multipoly = fc.geometry[findfirst(==("United States of America"), fc.NAME)] |> x -> GI.convert(LG, x) |> LG.makeValid |> GO.tuples
    +include(joinpath(dirname(dirname(pathof(GO))), "test", "data", "polygon_generation.jl"))
    +
    +usa_poly = GI.getgeom(usa_multipoly, findmax(GO.area.(GI.getgeom(usa_multipoly)))[2]) # isolate the poly with the most area
    +usa_centroid = GO.centroid(usa_poly)
    +usa_reflected = GO.transform(Translation(usa_centroid...)  LinearMap(Makie.rotmatrix2d(π))  Translation((-).(usa_centroid)...), usa_poly)
    +f, a, p = plot(usa_poly; label = "Original", axis = (; aspect = DataAspect()))#; plot!(usa_reflected; label = "Reflected")

    This is the complex polygon we'll be benchmarking.

    julia
    simplify_suite = BenchmarkGroup(["Simplify"])
    +singlepoly_suite = BenchmarkGroup(["Polygon", "title:Polygon simplify", "subtitle:Random blob"])
    +
    +include(joinpath(dirname(dirname(pathof(GO))), "test", "data", "polygon_generation.jl"))
    +
    +for n_verts in round.(Int, exp10.(LinRange(log10(10), log10(10_000), 10)))
    +    geom = GI.Wrappers.Polygon(generate_random_poly(0, 0, n_verts, 2, 0.2, 0.3))
    +    geom_lg, geom_go = lg_and_go(LG.makeValid(GI.convert(LG, geom)))
    +    singlepoly_suite["GO-DP"][GI.npoint(geom)] = @be GO.simplify($geom_go; tol = 0.1) seconds=1
    +    singlepoly_suite["GO-VW"][GI.npoint(geom)] = @be GO.simplify($(GO.VisvalingamWhyatt(; tol = 0.1)), $geom_go) seconds=1
    +    singlepoly_suite["GO-RD"][GI.npoint(geom)] = @be GO.simplify($(GO.RadialDistance(; tol = 0.1)), $geom_go) seconds=1
    +    singlepoly_suite["LibGEOS"][GI.npoint(geom)] = @be LG.simplify($geom_lg, 0.1) seconds=1
    +end
    +
    +plot_trials(singlepoly_suite; legend_position=(1, 1, TopRight()), legend_valign = -2, legend_halign = 1.2, legend_orientation = :horizontal)

    julia
    multipoly_suite = BenchmarkGroup(["MultiPolygon", "title:Multipolygon simplify", "subtitle:USA multipolygon"])
    +
    +for frac in exp10.(LinRange(log10(0.3), log10(1), 6)) # TODO: this example isn't the best.  How can we get this better?
    +    geom = GO.simplify(usa_multipoly; ratio = frac)
    +    geom_lg, geom_go = lg_and_go(geom)
    +    _tol = 0.001
    +    multipoly_suite["GO-DP"][GI.npoint(geom)] = @be GO.simplify($geom_go; tol = $_tol) seconds=1
    +    # multipoly_suite["GO-VW"][GI.npoint(geom)] = @be GO.simplify($(GO.VisvalingamWhyatt(; tol = $_tol)), $geom_go) seconds=1
    +    multipoly_suite["GO-RD"][GI.npoint(geom)] = @be GO.simplify($(GO.RadialDistance(; tol = _tol)), $geom_go) seconds=1
    +    multipoly_suite["LibGEOS"][GI.npoint(geom)] = @be LG.simplify($geom_lg, $_tol) seconds=1
    +    println("""
    +    For $(GI.npoint(geom)) points, the algorithms generated polygons with the following number of vertices:
    +    GO-DP : $(GI.npoint( GO.simplify(geom_go; tol = _tol)))
    +    GO-RD : $(GI.npoint( GO.simplify((GO.RadialDistance(; tol = _tol)), geom_go)))
    +    LGeos : $(GI.npoint( LG.simplify(geom_lg, _tol)))
    +    """)
    +    # GO-VW : $(GI.npoint( GO.simplify((GO.VisvalingamWhyatt(; tol = _tol)), geom_go)))
    +    println()
    +end
    +plot_trials(multipoly_suite)

    julia
    export simplify, VisvalingamWhyatt, DouglasPeucker, RadialDistance
    +
    +const _SIMPLIFY_TARGET = TraitTarget{Union{GI.PolygonTrait, GI.AbstractCurveTrait, GI.MultiPointTrait, GI.PointTrait}}()
    +const MIN_POINTS = 3
    +const SIMPLIFY_ALG_KEYWORDS = """
    +# Keywords
    +
    +- `ratio`: the fraction of points that should remain after `simplify`.
    +    Useful as it will generalise for large collections of objects.
    +- `number`: the number of points that should remain after `simplify`.
    +    Less useful for large collections of mixed size objects.
    +"""
    +const DOUGLAS_PEUCKER_KEYWORDS = """
    +$SIMPLIFY_ALG_KEYWORDS
    +- `tol`: the minimum distance a point will be from the line
    +    joining its neighboring points.
    +"""
    +
    +"""
    +    abstract type SimplifyAlg
    +
    +Abstract type for simplification algorithms.
    +
    +# API
    +
    +For now, the algorithm must hold the `number`, `ratio` and `tol` properties.
    +
    +Simplification algorithm types can hook into the interface by implementing
    +the `_simplify(trait, alg, geom)` methods for whichever traits are necessary.
    +"""
    +abstract type SimplifyAlg end
    +
    +"""
    +    simplify(obj; kw...)
    +    simplify(::SimplifyAlg, obj; kw...)
    +
    +Simplify a geometry, feature, feature collection,
    +or nested vectors or a table of these.
    +
    +`RadialDistance`, `DouglasPeucker`, or
    +`VisvalingamWhyatt` algorithms are available,
    +listed in order of increasing quality but decreasing performance.
    +
    +`PoinTrait` and `MultiPointTrait` are returned unchanged.
    +
    +The default behaviour is `simplify(DouglasPeucker(; kw...), obj)`.
    +Pass in other `SimplifyAlg` to use other algorithms.

    Keywords

    julia
    - `prefilter_alg`: `SimplifyAlg` algorithm used to pre-filter object before
    +    using primary filtering algorithm.
    +$APPLY_KEYWORDS
    +
    +
    +Keywords for DouglasPeucker are allowed when no algorithm is specified:
    +
    +$DOUGLAS_PEUCKER_KEYWORDS

    Example

    julia
    Simplify a polygon to have six points:
    +
    +```jldoctest
    +import GeoInterface as GI
    +import GeometryOps as GO
    +
    +poly = GI.Polygon([[
    +    [-70.603637, -33.399918],
    +    [-70.614624, -33.395332],
    +    [-70.639343, -33.392466],
    +    [-70.659942, -33.394759],
    +    [-70.683975, -33.404504],
    +    [-70.697021, -33.419406],
    +    [-70.701141, -33.434306],
    +    [-70.700454, -33.446339],
    +    [-70.694274, -33.458369],
    +    [-70.682601, -33.465816],
    +    [-70.668869, -33.472117],
    +    [-70.646209, -33.473835],
    +    [-70.624923, -33.472117],
    +    [-70.609817, -33.468107],
    +    [-70.595397, -33.458369],
    +    [-70.587158, -33.442901],
    +    [-70.587158, -33.426283],
    +    [-70.590591, -33.414248],
    +    [-70.594711, -33.406224],
    +    [-70.603637, -33.399918]]])
    +
    +simple = GO.simplify(poly; number=6)
    +GI.npoint(simple)

    output

    julia
    6
    +```
    +"""
    +simplify(alg::SimplifyAlg, data; kw...) = _simplify(alg, data; kw...)
    +simplify(alg::GEOS, data; kw...) = _simplify(alg, data; kw...)

    Default algorithm is DouglasPeucker

    julia
    simplify(
    +    data; prefilter_alg = nothing,
    +    calc_extent=false, threaded=false, crs=nothing, kw...,
    + ) = _simplify(DouglasPeucker(; kw...), data; prefilter_alg, calc_extent, threaded, crs)
    +
    +
    +#= For each algorithm, apply simplification to all curves, multipoints, and
    +points, reconstructing everything else around them. =#
    +function _simplify(alg::Union{SimplifyAlg, GEOS}, data; prefilter_alg=nothing, kw...)
    +    simplifier(geom) = _simplify(GI.trait(geom), alg, geom; prefilter_alg)
    +    return apply(simplifier, _SIMPLIFY_TARGET, data; kw...)
    +end
    +
    +
    +# For Point and MultiPoint traits we do nothing
    +_simplify(::GI.PointTrait, alg, geom; kw...) = geom
    +_simplify(::GI.MultiPointTrait, alg, geom; kw...) = geom
    +
    +# For curves, rings, and polygon we simplify
    +function _simplify(
    +    ::GI.AbstractCurveTrait, alg, geom;
    +    prefilter_alg, preserve_endpoint = true,
    +)
    +    points = if isnothing(prefilter_alg)
    +        tuple_points(geom)
    +    else
    +        _simplify(prefilter_alg, tuple_points(geom), preserve_endpoint)
    +    end
    +    return rebuild(geom, _simplify(alg, points, preserve_endpoint))
    +end
    +
    +function _simplify(::GI.PolygonTrait, alg, geom;  kw...)
    +    # Force treating children as LinearRing
    +    simplifier(g) = _simplify(
    +        GI.LinearRingTrait(), alg, g;
    +        kw..., preserve_endpoint = false,
    +    )
    +    lrs = map(simplifier, GI.getgeom(geom))
    +    return rebuild(geom, lrs)
    +end

    Simplify with RadialDistance Algorithm

    julia
    """
    +    RadialDistance <: SimplifyAlg
    +
    +Simplifies geometries by removing points less than
    +`tol` distance from the line between its neighboring points.
    +
    +$SIMPLIFY_ALG_KEYWORDS
    +- `tol`: the minimum distance between points.
    +
    +Note: user input `tol` is squared to avoid unnecessary computation in algorithm.
    +"""
    +@kwdef struct RadialDistance <: SimplifyAlg
    +    number::Union{Int64,Nothing} = nothing
    +    ratio::Union{Float64,Nothing} = nothing
    +    tol::Union{Float64,Nothing} = nothing
    +
    +    function RadialDistance(number, ratio, tol)
    +        _checkargs(number, ratio, tol)

    square tolerance for reduced computation

    julia
            tol = isnothing(tol) ? tol : tol^2
    +        new(number, ratio, tol)
    +    end
    +end
    +
    +function _simplify(alg::RadialDistance, points::Vector, _)
    +    previous = first(points)
    +    distances = Array{Float64}(undef, length(points))
    +    for i in eachindex(points)
    +        point = points[i]
    +        distances[i] = _squared_euclid_distance(Float64, point, previous)
    +        previous = point
    +    end
    +    # Never remove the end points
    +    distances[begin] = distances[end] = Inf
    +    return _get_points(alg, points, distances)
    +end

    Simplify with DouglasPeucker Algorithm

    julia
    """
    +    DouglasPeucker <: SimplifyAlg
    +
    +    DouglasPeucker(; number, ratio, tol)
    +
    +Simplifies geometries by removing points below `tol`
    +distance from the line between its neighboring points.
    +
    +$DOUGLAS_PEUCKER_KEYWORDS
    +Note: user input `tol` is squared to avoid unnecessary computation in algorithm.
    +"""
    +@kwdef struct DouglasPeucker <: SimplifyAlg
    +    number::Union{Int64,Nothing} = nothing
    +    ratio::Union{Float64,Nothing} = nothing
    +    tol::Union{Float64,Nothing} = nothing
    +
    +    function DouglasPeucker(number, ratio, tol)
    +        _checkargs(number, ratio, tol)

    square tolerance for reduced computation

    julia
            tol = isnothing(tol) ? tol : tol^2
    +        return new(number, ratio, tol)
    +    end
    +end
    +
    +#= Simplify using the DouglasPeucker algorithm - nice gif of process on wikipedia:
    +(https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm). =#
    +function _simplify(alg::DouglasPeucker, points::Vector, preserve_endpoint)
    +    npoints = length(points)
    +    npoints <= MIN_POINTS && return points

    Determine stopping criteria

    julia
        max_points = if !isnothing(alg.tol)
    +        npoints
    +    else
    +        npts = !isnothing(alg.number) ? alg.number : max(3, round(Int, alg.ratio * npoints))
    +        npts  npoints && return points
    +        npts
    +    end
    +    max_tol = !isnothing(alg.tol) ? alg.tol : zero(Float64)

    Set up queue

    julia
        queue = Vector{Tuple{Int, Int, Int, Float64}}()
    +    queue_idx, queue_dist = 0, zero(Float64)
    +    len_queue = 0

    Set up results vector

    julia
        results = Vector{Int}(undef, max_points + (preserve_endpoint ? 0 : 1))
    +    results[1], results[2] = 1, npoints

    Loop through points until stopping criteria are fulfilled

    julia
        i = 2  # already have first and last point added
    +    start_idx, end_idx = 1, npoints
    +    max_idx, max_dist = _find_max_squared_dist(points, start_idx, end_idx)
    +    while i  min(MIN_POINTS + 1, max_points) || (i < max_points && max_dist > max_tol)

    Add next point to results

    julia
            i += 1
    +        results[i] = max_idx

    Determine which point to add next by checking left and right of point

    julia
            left_idx, left_dist = _find_max_squared_dist(points, start_idx, max_idx)
    +        right_idx, right_dist = _find_max_squared_dist(points, max_idx, end_idx)
    +        left_vals = (start_idx, left_idx, max_idx, left_dist)
    +        right_vals = (max_idx, right_idx, end_idx, right_dist)

    Add and remove values from queue

    julia
            if queue_dist > left_dist && queue_dist > right_dist

    Value in queue is next value to add to results

    julia
                start_idx, max_idx, end_idx, max_dist = queue[queue_idx]

    Add left and/or right values to queue or delete used queue value

    julia
                if left_dist > 0
    +                queue[queue_idx] = left_vals
    +                if right_dist > 0
    +                    push!(queue, right_vals)
    +                    len_queue += 1
    +                end
    +            elseif right_dist > 0
    +                queue[queue_idx] = right_vals
    +            else
    +                deleteat!(queue, queue_idx)
    +                len_queue -= 1
    +            end

    Determine new maximum queue value

    julia
                queue_dist, queue_idx = !isempty(queue) ?
    +                findmax(x -> x[4], queue) : (zero(Float64), 0)
    +        elseif left_dist > right_dist  # use left value as next value to add to results
    +            push!(queue, right_vals)  # add right value to queue
    +            len_queue += 1
    +            if right_dist > queue_dist
    +                queue_dist = right_dist
    +                queue_idx = len_queue
    +            end
    +            start_idx, max_idx, end_idx, max_dist = left_vals
    +        else  # use right value as next value to add to results
    +            push!(queue, left_vals)  # add left value to queue
    +            len_queue += 1
    +            if left_dist > queue_dist
    +                queue_dist = left_dist
    +                queue_idx = len_queue
    +            end
    +            start_idx, max_idx, end_idx, max_dist = right_vals
    +        end
    +    end
    +    sorted_results = sort!(@view results[1:i])
    +    if !preserve_endpoint && i > 3

    Check start/endpoint distance to other points to see if it meets criteria

    julia
            pre_pt, post_pt = points[sorted_results[end - 1]], points[sorted_results[2]]
    +        endpt_dist = _squared_distance_line(Float64, points[1], pre_pt, post_pt)
    +        if !isnothing(alg.tol)

    Remove start point and replace with second point

    julia
                if endpt_dist < max_tol
    +                results[i] = results[2]
    +                sorted_results = @view results[2:i]
    +            end
    +        else

    Remove start point and add point with maximum distance still remaining

    julia
                if endpt_dist < max_dist
    +                insert!(results, searchsortedfirst(sorted_results, max_idx), max_idx)
    +                results[i+1] = results[2]
    +                sorted_results = @view results[2:i+1]
    +            end
    +        end
    +    end
    +    return points[sorted_results]
    +end
    +
    +#= find maximum distance of any point between the start_idx and end_idx to the line formed
    +by connecting the points at start_idx and end_idx. Note that the first index of maximum
    +value will be used, which might cause differences in results from other algorithms.=#
    +function _find_max_squared_dist(points, start_idx, end_idx)
    +    max_idx = start_idx
    +    max_dist = zero(Float64)
    +    for i in (start_idx + 1):(end_idx - 1)
    +        d = _squared_distance_line(Float64, points[i], points[start_idx], points[end_idx])
    +        if d > max_dist
    +            max_dist = d
    +            max_idx = i
    +        end
    +    end
    +    return max_idx, max_dist
    +end

    Simplify with VisvalingamWhyatt Algorithm

    julia
    """
    +    VisvalingamWhyatt <: SimplifyAlg
    +
    +    VisvalingamWhyatt(; kw...)
    +
    +Simplifies geometries by removing points below `tol`
    +distance from the line between its neighboring points.
    +
    +$SIMPLIFY_ALG_KEYWORDS
    +- `tol`: the minimum area of a triangle made with a point and
    +    its neighboring points.
    +Note: user input `tol` is doubled to avoid unnecessary computation in algorithm.
    +"""
    +@kwdef struct VisvalingamWhyatt <: SimplifyAlg
    +    number::Union{Int,Nothing} = nothing
    +    ratio::Union{Float64,Nothing} = nothing
    +    tol::Union{Float64,Nothing} = nothing
    +
    +    function VisvalingamWhyatt(number, ratio, tol)
    +        _checkargs(number, ratio, tol)

    double tolerance for reduced computation

    julia
            tol = isnothing(tol) ? tol : tol*2
    +        return new(number, ratio, tol)
    +    end
    +end
    +
    +function _simplify(alg::VisvalingamWhyatt, points::Vector, _)
    +    length(points) <= MIN_POINTS && return points
    +    areas = _build_tolerances(_triangle_double_area, points)
    +    return _get_points(alg, points, areas)
    +end

    Calculates double the area of a triangle given its vertices

    julia
    _triangle_double_area(p1, p2, p3) =
    +    abs(p1[1] * (p2[2] - p3[2]) + p2[1] * (p3[2] - p1[2]) + p3[1] * (p1[2] - p2[2]))

    Shared utils

    julia
    function _build_tolerances(f, points)
    +    nmax = length(points)
    +    real_tolerances = _flat_tolerances(f, points)
    +
    +    tolerances = copy(real_tolerances)
    +    i = [n for n in 1:nmax]
    +
    +    this_tolerance, min_vert = findmin(tolerances)
    +    _remove!(tolerances, min_vert)
    +    deleteat!(i, min_vert)
    +
    +    while this_tolerance < Inf
    +        skip = false
    +
    +        if min_vert < length(i)
    +            right_tolerance = f(
    +                points[i[min_vert - 1]],
    +                points[i[min_vert]],
    +                points[i[min_vert + 1]],
    +            )
    +            if right_tolerance <= this_tolerance
    +                right_tolerance = this_tolerance
    +                skip = min_vert == 1
    +            end
    +
    +            real_tolerances[i[min_vert]] = right_tolerance
    +            tolerances[min_vert] = right_tolerance
    +        end
    +
    +        if min_vert > 2
    +            left_tolerance = f(
    +                points[i[min_vert - 2]],
    +                points[i[min_vert - 1]],
    +                points[i[min_vert]],
    +            )
    +            if left_tolerance <= this_tolerance
    +                left_tolerance = this_tolerance
    +                skip = min_vert == 2
    +            end
    +            real_tolerances[i[min_vert - 1]] = left_tolerance
    +            tolerances[min_vert - 1] = left_tolerance
    +        end
    +
    +        if !skip
    +            min_vert = argmin(tolerances)
    +        end
    +        deleteat!(i, min_vert)
    +        this_tolerance = tolerances[min_vert]
    +        _remove!(tolerances, min_vert)
    +    end
    +
    +    return real_tolerances
    +end
    +
    +function tuple_points(geom)
    +    points = Array{Tuple{Float64,Float64}}(undef, GI.npoint(geom))
    +    for (i, p) in enumerate(GI.getpoint(geom))
    +        points[i] = (GI.x(p), GI.y(p))
    +    end
    +    return points
    +end
    +
    +function _get_points(alg, points, tolerances)
    +    # This assumes that `alg` has the properties
    +    # `tol`, `number`, and `ratio` available...
    +    tol = alg.tol
    +    number = alg.number
    +    ratio = alg.ratio
    +    bit_indices = if !isnothing(tol)
    +        _tol_indices(alg.tol::Float64, points, tolerances)
    +    elseif !isnothing(number)
    +        _number_indices(alg.number::Int64, points, tolerances)
    +    else
    +        _ratio_indices(alg.ratio::Float64, points, tolerances)
    +    end
    +    return points[bit_indices]
    +end
    +
    +function _tol_indices(tol, points, tolerances)
    +    tolerances .>= tol
    +end
    +
    +function _number_indices(n, points, tolerances)
    +    tol = partialsort(tolerances, length(points) - n + 1)
    +    bit_indices = _tol_indices(tol, points, tolerances)
    +    nselected = sum(bit_indices)
    +    # If there are multiple values exactly at `tol` we will get
    +    # the wrong output length. So we need to remove some.
    +    while nselected > n
    +        min_tol = Inf
    +        min_i = 0
    +        for i in eachindex(bit_indices)
    +            bit_indices[i] || continue
    +            if tolerances[i] < min_tol
    +                min_tol = tolerances[i]
    +                min_i = i
    +            end
    +        end
    +        nselected -= 1
    +        bit_indices[min_i] = false
    +    end
    +    return bit_indices
    +end
    +
    +function _ratio_indices(r, points, tolerances)
    +    n = max(3, round(Int, r * length(points)))
    +    return _number_indices(n, points, tolerances)
    +end
    +
    +function _flat_tolerances(f, points)::Vector{Float64}
    +    result = Vector{Float64}(undef, length(points))
    +    result[1] = result[end] = Inf
    +
    +    for i in 2:length(result) - 1
    +        result[i] = f(points[i-1], points[i], points[i+1])
    +    end
    +    return result
    +end
    +
    +function _remove!(s, i)
    +    for j in i:lastindex(s)-1
    +        s[j] = s[j+1]
    +    end
    +end

    Check SimplifyAlgs inputs to make sure they are valid for below algorithms

    julia
    function _checkargs(number, ratio, tol)
    +    count(isnothing, (number, ratio, tol)) == 2 ||
    +        error("Must provide one of `number`, `ratio` or `tol` keywords")
    +    if !isnothing(number)
    +        if number < MIN_POINTS
    +            error("`number` must be $MIN_POINTS or larger. Got $number")
    +        end
    +    elseif !isnothing(ratio)
    +        if ratio <= 0 || ratio > 1
    +            error("`ratio` must be 0 < ratio <= 1. Got $ratio")
    +        end
    +    else  # !isnothing(tol)
    +        if tol  0
    +            error("`tol` must be a positive number. Got $tol")
    +        end
    +    end
    +    return nothing
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/transformations/transform.html b/previews/PR239/source/transformations/transform.html new file mode 100644 index 000000000..0f103b918 --- /dev/null +++ b/previews/PR239/source/transformations/transform.html @@ -0,0 +1,79 @@ + + + + + + Pointwise transformation | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Pointwise transformation

    julia
    """
    +    transform(f, obj)
    +
    +Apply a function `f` to all the points in `obj`.
    +
    +Points will be passed to `f` as an `SVector` to allow
    +using CoordinateTransformations.jl and Rotations.jl
    +without hassle.
    +
    +`SVector` is also a valid GeoInterface.jl point, so will
    +work in all GeoInterface.jl methods.
    +
    +# Example
    +
    +```julia
    +julia> import GeoInterface as GI
    +
    +julia> import GeometryOps as GO
    +
    +julia> geom = GI.Polygon([GI.LinearRing([(1, 2), (3, 4), (5, 6), (1, 2)]), GI.LinearRing([(3, 4), (5, 6), (6, 7), (3, 4)])]);
    +
    +julia> f = CoordinateTransformations.Translation(3.5, 1.5)
    +Translation(3.5, 1.5)
    +
    +julia> GO.transform(f, geom)
    +GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Linea
    +rRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticArraysCo
    +re.SVector{2, Float64}[[4.5, 3.5], [6.5, 5.5], [8.5, 7.5], [4.5, 3.5]], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticA
    +rraysCore.SVector{2, Float64}[[6.5, 5.5], [8.5, 7.5], [9.5, 8.5], [6.5, 5.5]], nothing, nothing)], nothing, nothing)
    +```
    +
    +With Rotations.jl you need to actually multiply the Rotation
    +by the `SVector` point, which is easy using an anonymous function.
    +
    +```julia
    +julia> using Rotations
    +
    +julia> GO.transform(p -> one(RotMatrix{2}) * p, geom)
    +GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearR
    +ing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}(StaticArraysCore.SVe
    +ctor{2, Int64}[[2, 1], [4, 3], [6, 5], [2, 1]], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Int64}}, Nothing, Nothing}(StaticArraysCore.SVector{2, Int64
    +}[[4, 3], [6, 5], [7, 6], [4, 3]], nothing, nothing)], nothing, nothing)
    +```
    +"""
    +function transform(f, geom; kw...)
    +    if _is3d(geom)
    +        return apply(PointTrait(), geom; kw...) do p
    +            f(StaticArrays.SVector{3}((GI.x(p), GI.y(p), GI.z(p))))
    +        end
    +    else
    +        return apply(PointTrait(), geom; kw...) do p
    +            f(StaticArrays.SVector{2}((GI.x(p), GI.y(p))))
    +        end
    +    end
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/transformations/tuples.html b/previews/PR239/source/transformations/tuples.html new file mode 100644 index 000000000..0413ca05c --- /dev/null +++ b/previews/PR239/source/transformations/tuples.html @@ -0,0 +1,43 @@ + + + + + + Tuple conversion | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Tuple conversion

    julia
    """
    +    tuples(obj)
    +
    +Convert all points in `obj` to `Tuple`s, wherever the are nested.
    +
    +Returns a similar object or collection of objects using GeoInterface.jl
    +geometries wrapping `Tuple` points.

    Keywords

    julia
    $APPLY_KEYWORDS
    +"""
    +function tuples(geom, ::Type{T} = Float64; kw...) where T
    +    if _is3d(geom)
    +        return apply(PointTrait(), geom; kw...) do p
    +            (T(GI.x(p)), T(GI.y(p)), T(GI.z(p)))
    +        end
    +    else
    +        return apply(PointTrait(), geom; kw...) do p
    +            (T(GI.x(p)), T(GI.y(p)))
    +        end
    +    end
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/types.html b/previews/PR239/source/types.html new file mode 100644 index 000000000..0af974698 --- /dev/null +++ b/previews/PR239/source/types.html @@ -0,0 +1,62 @@ + + + + + + Types | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Types

    This file defines some fundamental types used in GeometryOps.

    Warning

    Unlike in other Julia packages, only some types are defined in this file, not all. This is because we define types in the files where they are used, to make it easier to understand the code.

    julia
    export GEOS

    GEOS

    GEOS is a struct which instructs the method it's passed to as an algorithm to use the appropriate GEOS function via LibGEOS.jl for the operation.

    It's generally a lot slower than the native Julia implementations, but it's useful for two reasons:

    1. Functionality which doesn't exist in GeometryOps can be accessed through the GeometryOps API, but use GEOS in the backend until someone implements a native Julia version.

    2. It's a good way to test the correctness of the native implementations.

    julia
    """
    +    GEOS(; params...)
    +
    +A struct which instructs the method it's passed to as an algorithm
    +to use the appropriate GEOS function via `LibGEOS.jl` for the operation.
    +
    +Dispatch is generally carried out using the names of the keyword arguments.
    +For example, `segmentize` will only accept a `GEOS` struct with only a
    +`max_distance` keyword, and no other.
    +
    +It's generally a lot slower than the native Julia implementations, since
    +it must convert to the LibGEOS implementation and back - so be warned!
    +"""
    +struct GEOS
    +    params::NamedTuple
    +end
    +
    +function GEOS(; params...)
    +    nt = NamedTuple(params)
    +    return GEOS(nt)
    +end

    These are definitions for convenience, so we don't have to type out alg.params every time.

    julia
    Base.get(alg::GEOS, key, value) = Base.get(alg.params, key, value)
    +Base.get(f::Function, alg::GEOS, key) = Base.get(f, alg.params, key)
    +
    +"""
    +    enforce(alg::GO.GEOS, kw::Symbol, f)
    +
    +Enforce the presence of a keyword argument in a `GEOS` algorithm, and return `alg.params[kw]`.
    +
    +Throws an error if the key is not present, and mentions `f` in the error message (since there isn't
    +a good way to get the name of the function that called this method).
    +"""
    +function enforce(alg::GEOS, kw::Symbol, f)
    +    if haskey(alg.params, kw)
    +        return alg.params[kw]
    +    else
    +        error("$(f) requires a `$(kw)` keyword argument to the `GEOS` algorithm, which was not provided.")
    +    end
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/source/utils.html b/previews/PR239/source/utils.html new file mode 100644 index 000000000..91c0b6633 --- /dev/null +++ b/previews/PR239/source/utils.html @@ -0,0 +1,144 @@ + + + + + + Utility functions | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Utility functions

    julia
    _is3d(geom)::Bool = _is3d(GI.trait(geom), geom)
    +_is3d(::GI.AbstractGeometryTrait, geom)::Bool = GI.is3d(geom)
    +_is3d(::GI.FeatureTrait, feature)::Bool = _is3d(GI.geometry(feature))
    +_is3d(::GI.FeatureCollectionTrait, fc)::Bool = _is3d(GI.getfeature(fc, 1))
    +_is3d(::Nothing, geom)::Bool = _is3d(first(geom)) # Otherwise step into an itererable
    +
    +_npoint(x) = _npoint(trait(x), x)
    +_npoint(::Nothing, xs::AbstractArray) = sum(_npoint, xs)
    +_npoint(::GI.FeatureCollectionTrait, fc) = sum(_npoint, GI.getfeature(fc))
    +_npoint(::GI.FeatureTrait, f) = _npoint(GI.geometry(f))
    +_npoint(::GI.AbstractGeometryTrait, x) = GI.npoint(trait(x), x)
    +
    +_nedge(x) = _nedge(trait(x), x)
    +_nedge(::Nothing, xs::AbstractArray) = sum(_nedge, xs)
    +_nedge(::GI.FeatureCollectionTrait, fc) = sum(_nedge, GI.getfeature(fc))
    +_nedge(::GI.FeatureTrait, f) = _nedge(GI.geometry(f))
    +function _nedge(::GI.AbstractGeometryTrait, x)
    +    n = 0
    +    for g in GI.getgeom(x)
    +        n += _nedge(g)
    +    end
    +    return n
    +end
    +_nedge(::GI.AbstractCurveTrait, x) = GI.npoint(x) - 1
    +_nedge(::GI.PointTrait, x) = error("Cant get edges from points")
    +
    +
    +"""
    +    polygon_to_line(poly::Polygon)
    +
    +Converts a Polygon to LineString or MultiLineString

    Examples

    julia
    ```jldoctest
    +import GeometryOps as GO, GeoInterface as GI
    +
    +poly = GI.Polygon([[(-2.275543, 53.464547), (-2.275543, 53.489271), (-2.215118, 53.489271), (-2.215118, 53.464547), (-2.275543, 53.464547)]])
    +GO.polygon_to_line(poly)

    output

    julia
    GeoInterface.Wrappers.LineString{false, false, Vector{Tuple{Float64, Float64}}, Nothing, Nothing}([(-2.275543, 53.464547), (-2.275543, 53.489271), (-2.215118, 53.489271), (-2.215118, 53.464547), (-2.275543, 53.464547)], nothing, nothing)
    +```
    +"""
    +function polygon_to_line(poly)
    +    @assert GI.trait(poly) isa PolygonTrait
    +    GI.ngeom(poly) > 1 && return GI.MultiLineString(collect(GI.getgeom(poly)))
    +    return GI.LineString(collect(GI.getgeom(GI.getgeom(poly, 1))))
    +end
    +
    +
    +"""
    +    to_edges()
    +
    +Convert any geometry or collection of geometries into a flat
    +vector of `Tuple{Tuple{Float64,Float64},Tuple{Float64,Float64}}` edges.
    +"""
    +function to_edges(x, ::Type{T} = Float64) where T
    +    edges = Vector{Edge{T}}(undef, _nedge(x))
    +    _to_edges!(edges, x, 1)
    +    return edges
    +end
    +
    +_to_edges!(edges::Vector, x, n) = _to_edges!(edges, trait(x), x, n)
    +function _to_edges!(edges::Vector, ::GI.FeatureCollectionTrait, fc, n)
    +    for f in GI.getfeature(fc)
    +        n = _to_edges!(edges, f, n)
    +    end
    +end
    +_to_edges!(edges::Vector, ::GI.FeatureTrait, f, n) = _to_edges!(edges, GI.geometry(f), n)
    +function _to_edges!(edges::Vector, ::GI.AbstractGeometryTrait, fc, n)
    +    for f in GI.getgeom(fc)
    +        n = _to_edges!(edges, f, n)
    +    end
    +end
    +function _to_edges!(edges::Vector, ::GI.AbstractCurveTrait, geom, n)
    +    p1 = GI.getpoint(geom, 1)
    +    p1x, p1y = GI.x(p1), GI.y(p1)
    +    for i in 2:GI.npoint(geom)
    +        p2 = GI.getpoint(geom, i)
    +        p2x, p2y = GI.x(p2), GI.y(p2)
    +        edges[n] = (p1x, p1y), (p2x, p2y)
    +        p1x, p1y = p2x, p2y
    +        n += 1
    +    end
    +    return n
    +end
    +
    +_tuple_point(p) = GI.x(p), GI.y(p)
    +_tuple_point(p, ::Type{T}) where T = T(GI.x(p)), T(GI.y(p))
    +
    +function to_extent(edges::Vector{Edge})
    +    x, y = extrema(first, edges)
    +    Extents.Extent(X=x, Y=y)
    +end
    +
    +function to_points(x, ::Type{T} = Float64) where T
    +    points = Vector{TuplePoint{T}}(undef, _npoint(x))
    +    _to_points!(points, x, 1)
    +    return points
    +end
    +
    +_to_points!(points::Vector, x, n) = _to_points!(points, trait(x), x, n)
    +function _to_points!(points::Vector, ::FeatureCollectionTrait, fc, n)
    +    for f in GI.getfeature(fc)
    +        n = _to_points!(points, f, n)
    +    end
    +end
    +_to_points!(points::Vector, ::FeatureTrait, f, n) = _to_points!(points, GI.geometry(f), n)
    +function _to_points!(points::Vector, ::AbstractGeometryTrait, fc, n)
    +    for f in GI.getgeom(fc)
    +        n = _to_points!(points, f, n)
    +    end
    +end
    +function _to_points!(points::Vector, ::Union{AbstractCurveTrait,MultiPointTrait}, geom, n)
    +    n = 0
    +    for p in GI.getpoint(geom)
    +        n += 1
    +        points[n] = _tuple_point(p)
    +    end
    +    return n
    +end
    +
    +function _point_in_extent(p, extent::Extents.Extent)
    +    (x1, x2), (y1, y2) = extent.X, extent.Y
    +    return x1 ≤ GI.x(p) ≤ x2 && y1 ≤ GI.y(p) ≤ y2
    +end

    This page was generated using Literate.jl.

    + + + + \ No newline at end of file diff --git a/previews/PR239/tutorials/creating_geometry.html b/previews/PR239/tutorials/creating_geometry.html new file mode 100644 index 000000000..2e8c3b023 --- /dev/null +++ b/previews/PR239/tutorials/creating_geometry.html @@ -0,0 +1,113 @@ + + + + + + Creating Geometry | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Creating Geometry

    In this tutorial, we're going to:

    1. Create and plot geometries

    2. Plot geometries on a map using GeoMakie and coordinate reference system (CRS)

    3. Create geospatial geometries with embedded coordinate reference system information

    4. Assign attributes to geospatial geometries

    5. Save geospatial geometries to common geospatial file formats

    First, we load some required packages.

    julia
    # Geospatial packages from Julia
    +import GeoInterface as GI
    +import GeometryOps as GO
    +import GeoFormatTypes as GFT
    +using GeoJSON # to load some data
    +# Packages for coordinate transformation and projection
    +import CoordinateTransformations
    +import Proj
    +# Plotting
    +using CairoMakie
    +using GeoMakie

    Creating and plotting geometries

    Let's start by making a single Point.

    julia
    point = GI.Point(0, 0)
    GeoInterface.Wrappers.Point{false, false, Tuple{Int64, Int64}, Nothing}((0, 0), nothing)

    Now, let's plot our point.

    julia
    fig, ax, plt = plot(point)

    Let's create a set of points, and have a bit more fun with plotting.

    julia
    x = [-5, 0, 5, 0];
    +y = [0, -5, 0, 5];
    +points = GI.Point.(zip(x,y));
    +plot!(ax, points; marker = '✈', markersize = 30)
    +fig

    Points can be combined into a single MultiPoint geometry.

    julia
    x = [-5, -5, 5, 5];
    +y = [-5, 5, 5, -5];
    +multipoint = GI.MultiPoint(GI.Point.(zip(x, y)));
    +plot!(ax, multipoint; marker = '☁', markersize = 30)
    +fig

    Let's create a LineString connecting two points.

    julia
    p1 = GI.Point.(-5, 0);
    +p2 = GI.Point.(5, 0);
    +line = GI.LineString([p1,p2])
    +plot!(ax, line; color = :red)
    +fig

    Now, let's create a line connecting multiple points (i.e. a LineString). This time we get a bit more fancy with point creation.

    julia
    r = 2;
    +k = 10;
    +ϴ = 0:0.01:2pi;
    +x = r .* (k + 1) .* cos.(ϴ) .- r .* cos.((k + 1) .* ϴ);
    +y = r .* (k + 1) .* sin.(ϴ) .- r .* sin.((k + 1) .* ϴ);
    +lines = GI.LineString(GI.Point.(zip(x,y)));
    +plot!(ax, lines; linewidth = 5)
    +fig

    We can also create a single LinearRing trait, the building block of a polygon. A LinearRing is simply a LineString with the same beginning and endpoint, i.e., an arbitrary closed shape composed of point pairs.

    A LinearRing is composed of a series of points.

    julia
    ring1 = GI.LinearRing(GI.getpoint(lines));
    GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}[GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.0, 0.0), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.010987813253244, 0.0004397316773170068), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.043805248003498, 0.0035114210915891397), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.098016055420953, 0.011814947665167774), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.172899020101585, 0.027886421973952302), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.267456684570245, 0.05416726609360478), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.380427415579764, 0.09297443860091348), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.51030066635026, 0.1464721641710074), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.655335250260467, 0.21664550952386064), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.813580405100698, 0.30527612515520186), nothing)  …  GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.866418416586406, -0.3376428491230612), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.704405820024185, -0.24279488312757858), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.55494217175954, -0.16692537029320365), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.420040147662014, -0.10832215707812454), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.30151010318639, -0.0650624499034016), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.200938172182195, -0.03503632062070827), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.119667078681967, -0.01597247419241532), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.058779893613323, -0.005465967083412071), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.019086932781654, -0.0010075412835199304), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.001115954499138, -1.4219350464667047e-5), nothing)], nothing, nothing)

    Now, let's make the LinearRing into a Polygon.

    julia
    polygon1 = GI.Polygon([ring1]);
    GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}[GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.0, 0.0), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.010987813253244, 0.0004397316773170068), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.043805248003498, 0.0035114210915891397), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.098016055420953, 0.011814947665167774), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.172899020101585, 0.027886421973952302), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.267456684570245, 0.05416726609360478), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.380427415579764, 0.09297443860091348), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.51030066635026, 0.1464721641710074), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.655335250260467, 0.21664550952386064), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.813580405100698, 0.30527612515520186), nothing)  …  GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.866418416586406, -0.3376428491230612), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.704405820024185, -0.24279488312757858), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.55494217175954, -0.16692537029320365), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.420040147662014, -0.10832215707812454), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.30151010318639, -0.0650624499034016), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.200938172182195, -0.03503632062070827), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.119667078681967, -0.01597247419241532), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.058779893613323, -0.005465967083412071), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.019086932781654, -0.0010075412835199304), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.001115954499138, -1.4219350464667047e-5), nothing)], nothing, nothing)], nothing, nothing)

    Now, we can use GeometryOps and CoordinateTransformations to shift polygon1 up, to avoid plotting over our earlier results. This is done through the GeometryOps.transform function.

    julia
    xoffset = 0.;
    +yoffset = 50.;
    +f = CoordinateTransformations.Translation(xoffset, yoffset);
    +polygon1 = GO.transform(f, polygon1);
    +plot!(polygon1)
    +fig

    Polygons can contain "holes". The first LinearRing in a polygon is the exterior, and all subsequent LinearRings are treated as holes in the leading LinearRing.

    GeoInterface offers the GI.getexterior(poly) and GI.gethole(poly) methods to get the exterior ring and an iterable of holes, respectively.

    julia
    hole = GI.LinearRing(GI.getpoint(multipoint))
    +polygon2 = GI.Polygon([ring1, hole])
    GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, T, Nothing, Nothing} where T}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, T, Nothing, Nothing} where T[GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}[GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.0, 0.0), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.010987813253244, 0.0004397316773170068), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.043805248003498, 0.0035114210915891397), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.098016055420953, 0.011814947665167774), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.172899020101585, 0.027886421973952302), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.267456684570245, 0.05416726609360478), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.380427415579764, 0.09297443860091348), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.51030066635026, 0.1464721641710074), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.655335250260467, 0.21664550952386064), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.813580405100698, 0.30527612515520186), nothing)  …  GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.866418416586406, -0.3376428491230612), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.704405820024185, -0.24279488312757858), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.55494217175954, -0.16692537029320365), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.420040147662014, -0.10832215707812454), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.30151010318639, -0.0650624499034016), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.200938172182195, -0.03503632062070827), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.119667078681967, -0.01597247419241532), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.058779893613323, -0.005465967083412071), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.019086932781654, -0.0010075412835199304), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((20.001115954499138, -1.4219350464667047e-5), nothing)], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Int64, Int64}, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Point{false, false, Tuple{Int64, Int64}, Nothing}[GeoInterface.Wrappers.Point{false, false, Tuple{Int64, Int64}, Nothing}((-5, -5), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Int64, Int64}, Nothing}((-5, 5), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Int64, Int64}, Nothing}((5, 5), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Int64, Int64}, Nothing}((5, -5), nothing)], nothing, nothing)], nothing, nothing)

    Shift polygon2 to the right, to avoid plotting over our earlier results.

    julia
    xoffset = 50.;
    +yoffset = 0.;
    +f = CoordinateTransformations.Translation(xoffset, yoffset);
    +polygon2 = GO.transform(f, polygon2);
    +plot!(polygon2)
    +fig

    Polygons can also be grouped together as a MultiPolygon.

    julia
    r = 5;
    +x = cos.(reverse(ϴ)) .* r .+ xoffset;
    +y = sin.(reverse(ϴ)) .* r .+ yoffset;
    +ring2 =  GI.LinearRing(GI.Point.(zip(x,y)));
    +polygon3 = GI.Polygon([ring2]);
    +multipolygon = GI.MultiPolygon([polygon2, polygon3])
    GeoInterface.Wrappers.MultiPolygon{false, false, Vector{GeoInterface.Wrappers.Polygon{false, false, T, Nothing, Nothing} where T}, Nothing, Nothing}(GeoInterface.Wrappers.Polygon{false, false, T, Nothing, Nothing} where T[GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticArraysCore.SVector{2, Float64}[[70.0, 0.0], [70.01098781325325, 0.0004397316773170068], [70.0438052480035, 0.0035114210915891397], [70.09801605542096, 0.011814947665167774], [70.17289902010158, 0.027886421973952302], [70.26745668457025, 0.05416726609360478], [70.38042741557976, 0.09297443860091348], [70.51030066635026, 0.1464721641710074], [70.65533525026046, 0.21664550952386064], [70.8135804051007, 0.30527612515520186]  …  [70.86641841658641, -0.3376428491230612], [70.70440582002419, -0.24279488312757858], [70.55494217175954, -0.16692537029320365], [70.42004014766201, -0.10832215707812454], [70.30151010318639, -0.0650624499034016], [70.20093817218219, -0.03503632062070827], [70.11966707868197, -0.01597247419241532], [70.05877989361332, -0.005465967083412071], [70.01908693278165, -0.0010075412835199304], [70.00111595449914, -1.4219350464667047e-5]], nothing, nothing), GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, Nothing}(StaticArraysCore.SVector{2, Float64}[[45.0, -5.0], [45.0, 5.0], [55.0, 5.0], [55.0, -5.0]], nothing, nothing)], nothing, nothing), GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}[GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.999974634566875, -0.01592650896568995), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.999565375483215, -0.06592462566760626), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.99865616402829, -0.11591614996189725), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.997247091122496, -0.16589608273778408), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.99533829767195, -0.2158594260436434), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.99292997455441, -0.2658011835867806), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.990022362600165, -0.31571636123306385), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.98661575256801, -0.3655999675063154), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.98271048511609, -0.41544701408748197), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.9783069507679, -0.46525251631344455), nothing)  …  GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.97976366505997, 0.4493927459900552), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.9840085315131, 0.3995734698458635), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.9877550012664, 0.3497142366876638), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.991002699676024, 0.299820032397223), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.99375130197483, 0.24989584635339165), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.99600053330489, 0.1999466709331708), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.997750168744936, 0.1499775010124783), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.99900003333289, 0.0999933334666654), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((54.999750002083324, 0.049999166670833324), nothing), GeoInterface.Wrappers.Point{false, false, Tuple{Float64, Float64}, Nothing}((55.0, 0.0), nothing)], nothing, nothing)], nothing, nothing)], nothing, nothing)

    Shift multipolygon up, to avoid plotting over our earlier results.

    julia
    xoffset = 0.;
    +yoffset = 50.;
    +f = CoordinateTransformations.Translation(xoffset, yoffset);
    +multipolygon = GO.transform(f, multipolygon);
    +plot!(multipolygon)
    +fig

    Great, now we can make Points, MultiPoints, Lines, LineStrings, Polygons (with holes), and MultiPolygons and modify them using [CoordinateTransformations] and [GeometryOps].

    Plot geometries on a map using GeoMakie and coordinate reference system (CRS)

    In geospatial sciences we often have data in one Coordinate Reference System (CRS) (source) and would like to display it in different (destination) CRS. GeoMakie allows us to do this by automatically projecting from source to destination CRS.

    Here, our source CRS is common geographic (i.e. coordinates of latitude and longitude), WGS84.

    julia
    source_crs1 = GFT.EPSG(4326)
    GeoFormatTypes.EPSG{1}((4326,))

    Now let's pick a destination CRS for displaying our map. Here we'll pick natearth2.

    julia
    destination_crs = "+proj=natearth2"
    "+proj=natearth2"

    Let's add land area for context. First, download and open the Natural Earth global land polygons at 110 m resolution.GeoMakie ships with this particular dataset, so we will access it from there.

    julia
    land_path = GeoMakie.assetpath("ne_110m_land.geojson")
    "/home/runner/.julia/packages/GeoMakie/t8Vkb/assets/ne_110m_land.geojson"

    Note

    Natural Earth has lots of other datasets, and there is a Julia package that provides an interface to it called NaturalEarth.jl.

    Read the land MultiPolygons as a GeoJSON.FeatureCollection.

    julia
    land_geo = GeoJSON.read(land_path)
    FeatureCollection with 127 Features

    We then need to create a figure with a GeoAxis that can handle the projection between source and destination CRS. For GeoMakie, source is the CRS of the input and dest is the CRS you want to visualize in.

    julia
    fig = Figure(size=(1000, 500));
    +ga = GeoAxis(
    +    fig[1, 1];
    +    source = source_crs1,
    +    dest = destination_crs,
    +    xticklabelsvisible = false,
    +    yticklabelsvisible = false,
    +);

    Plot land for context.

    julia
    poly!(ga, land_geo, color=:black)
    +fig

    Now let's plot a Polygon like before, but this time with a CRS that differs from our source data

    julia
    plot!(multipolygon; color = :green)
    +fig

    But what if we want to plot geometries with a different source CRS on the same figure?

    To show how to do this let's create a geometry with coordinates in UTM (Universal Transverse Mercator) zone 10N EPSG:32610.

    julia
    source_crs2 = GFT.EPSG(32610)
    GeoFormatTypes.EPSG{1}((32610,))

    Create a polygon (we're working in meters now, not latitude and longitude)

    julia
    r = 1000000;
    +ϴ = 0:0.01:2pi;
    +x = r .* cos.(ϴ).^3 .+ 500000;
    +y = r .* sin.(ϴ) .^ 3 .+5000000;
    629-element Vector{Float64}:
    + 5.0e6
    + 5.0e6
    + 5.00001e6
    +
    + 5.0e6
    + 5.0e6

    Now create a LinearRing from Points

    julia
    ring3 = GI.LinearRing(Point.(zip(x, y)))
    GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}(Point{2, Float64}[[1.5e6, 5.0e6], [1.4998500087497458e6, 5.000000999950001e6], [1.4994001399837343e6, 5.000007998400139e6], [1.4986507085647392e6, 5.000026987852369e6], [1.4976022389592e6, 5.000063948817746e6], [1.4962554647802354e6, 5.000124843834609e6], [1.4946113281484335e6, 5.000215611503127e6], [1.4926709788709967e6, 5.000342160541625e6], [1.4904357734399722e6, 5.000510363870095e6], [1.4879072738504685e6, 5.0007260527263e6]  …  [1.4870405593989636e6, 4.999194331880103e6], [1.4896621210021754e6, 4.999426363321033e6], [1.491990928929295e6, 4.999609061508909e6], [1.4940253560034204e6, 4.999748243174828e6], [1.4957639801366436e6, 4.999849768598615e6], [1.497205585568957e6, 4.999919535736425e6], [1.4983491639274692e6, 4.999963474314044e6], [1.4991939151049731e6, 4.999987539891298e6], [1.4997392479570867e6, 4.999997707902938e6], [1.499984780817334e6, 4.999999967681458e6]], nothing, nothing)

    Now create a Polygon from the LineRing

    julia
    polygon3 = GI.Polygon([ring3])
    GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}}, Nothing, Nothing}(GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}(Point{2, Float64}[[1.5e6, 5.0e6], [1.4998500087497458e6, 5.000000999950001e6], [1.4994001399837343e6, 5.000007998400139e6], [1.4986507085647392e6, 5.000026987852369e6], [1.4976022389592e6, 5.000063948817746e6], [1.4962554647802354e6, 5.000124843834609e6], [1.4946113281484335e6, 5.000215611503127e6], [1.4926709788709967e6, 5.000342160541625e6], [1.4904357734399722e6, 5.000510363870095e6], [1.4879072738504685e6, 5.0007260527263e6]  …  [1.4870405593989636e6, 4.999194331880103e6], [1.4896621210021754e6, 4.999426363321033e6], [1.491990928929295e6, 4.999609061508909e6], [1.4940253560034204e6, 4.999748243174828e6], [1.4957639801366436e6, 4.999849768598615e6], [1.497205585568957e6, 4.999919535736425e6], [1.4983491639274692e6, 4.999963474314044e6], [1.4991939151049731e6, 4.999987539891298e6], [1.4997392479570867e6, 4.999997707902938e6], [1.499984780817334e6, 4.999999967681458e6]], nothing, nothing)], nothing, nothing)

    Now plot on the existing GeoAxis.

    Note

    The keyword argument source is used to specify the source CRS of that particular plot, when plotting on an existing GeoAxis.

    julia
    plot!(ga,polygon3; color=:red, source = source_crs2)
    +fig

    Create geospatial geometries with embedded coordinate reference system information

    Great, we can make geometries and plot them on a map... now let's export the data to common geospatial data formats. To do this we now need to create geometries with embedded CRS information, making it a geospatial geometry. All that's needed is to include ; crs = crs as a keyword argument when constructing the geometry.

    Let's do this for a new Polygon

    julia
    r = 3;
    +k = 7;
    +ϴ = 0:0.01:2pi;
    +x = r .* (k + 1) .* cos.(ϴ) .- r .* cos.((k + 1) .* ϴ);
    +y = r .* (k + 1) .* sin.(ϴ) .- r .* sin.((k + 1) .* ϴ);
    +ring4 = GI.LinearRing(Point.(zip(x, y)))
    GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}(Point{2, Float64}[[21.0, 0.0], [21.00839489109211, 0.00025191811248184703], [21.033518309870985, 0.0020133807972559925], [21.075186885419612, 0.006784125578492062], [21.13309630561615, 0.016044338630866517], [21.206823267470536, 0.031245035570328428], [21.29582819010705, 0.053798628882221644], [21.39945867303846, 0.08506974233813636], [21.516953677609987, 0.12636633117296836], [21.64744840486518, 0.17893116483784577]  …  [21.69159119078359, -0.19823293781563178], [21.557153362189904, -0.14182952335952814], [21.43541888381864, -0.09707519809793252], [21.327284472232776, -0.06274967861547665], [21.233544778745394, -0.03756486776283019], [21.15488729606723, -0.020173244847778715], [21.091887951911644, -0.0091766360295773], [21.045007417743918, -0.0031353088009582475], [21.01458815628695, -0.0005773323690041465], [21.00085222666982, -8.14404531208901e-6]], nothing, nothing)

    But this time when we create the Polygon we need to specify the CRS at the time of creation, making it a geospatial polygon

    julia
    geopoly1 = GI.Polygon([ring4], crs = source_crs1)
    GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}}, Nothing, GeoFormatTypes.EPSG{1}}(GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}[GeoInterface.Wrappers.LinearRing{false, false, Vector{Point{2, Float64}}, Nothing, Nothing}(Point{2, Float64}[[21.0, 0.0], [21.00839489109211, 0.00025191811248184703], [21.033518309870985, 0.0020133807972559925], [21.075186885419612, 0.006784125578492062], [21.13309630561615, 0.016044338630866517], [21.206823267470536, 0.031245035570328428], [21.29582819010705, 0.053798628882221644], [21.39945867303846, 0.08506974233813636], [21.516953677609987, 0.12636633117296836], [21.64744840486518, 0.17893116483784577]  …  [21.69159119078359, -0.19823293781563178], [21.557153362189904, -0.14182952335952814], [21.43541888381864, -0.09707519809793252], [21.327284472232776, -0.06274967861547665], [21.233544778745394, -0.03756486776283019], [21.15488729606723, -0.020173244847778715], [21.091887951911644, -0.0091766360295773], [21.045007417743918, -0.0031353088009582475], [21.01458815628695, -0.0005773323690041465], [21.00085222666982, -8.14404531208901e-6]], nothing, nothing)], nothing, GeoFormatTypes.EPSG{1}((4326,)))

    Note

    It is good practice to only include CRS information with the highest-level geometry. Not doing so can bloat the memory footprint of the geometry. CRS information can be included at the individual Point level but is discouraged.

    And let's create second Polygon by shifting the first using CoordinateTransformations

    julia
    xoffset = 20.;
    +yoffset = -25.;
    +f = CoordinateTransformations.Translation(xoffset, yoffset);
    +geopoly2 = GO.transform(f, geopoly1);
    GeoInterface.Wrappers.Polygon{false, false, Vector{GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, GeoFormatTypes.EPSG{1}}}, Nothing, GeoFormatTypes.EPSG{1}}(GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, GeoFormatTypes.EPSG{1}}[GeoInterface.Wrappers.LinearRing{false, false, Vector{StaticArraysCore.SVector{2, Float64}}, Nothing, GeoFormatTypes.EPSG{1}}(StaticArraysCore.SVector{2, Float64}[[41.0, -25.0], [41.00839489109211, -24.999748081887518], [41.033518309870985, -24.997986619202745], [41.07518688541961, -24.99321587442151], [41.13309630561615, -24.983955661369134], [41.20682326747054, -24.96875496442967], [41.295828190107045, -24.946201371117777], [41.39945867303846, -24.914930257661865], [41.51695367760999, -24.873633668827033], [41.64744840486518, -24.821068835162155]  …  [41.69159119078359, -25.198232937815632], [41.55715336218991, -25.14182952335953], [41.43541888381864, -25.097075198097933], [41.327284472232776, -25.062749678615475], [41.2335447787454, -25.037564867762832], [41.15488729606723, -25.02017324484778], [41.091887951911644, -25.009176636029576], [41.04500741774392, -25.003135308800957], [41.01458815628695, -25.000577332369005], [41.00085222666982, -25.000008144045314]], nothing, GeoFormatTypes.EPSG{1}((4326,)))], nothing, GeoFormatTypes.EPSG{1}((4326,)))

    Creating a table with attributes and geometry

    Typically, you'll also want to include attributes with your geometries. Attributes are simply data that are attributed to each geometry. The easiest way to do this is to create a table with a :geometry column. Let's do this using DataFrames.

    julia
    using DataFrames
    +df = DataFrame(geometry=[geopoly1, geopoly2])

    Now let's add a couple of attributes to the geometries. We do this using DataFrames' ! mutation syntax that allows you to add a new column to an existing data frame.

    julia
    df[!,:id] = ["a", "b"]
    +df[!, :name] = ["polygon 1", "polygon 2"]
    +df

    Saving your geospatial data

    There are Julia packages for most commonly used geographic data formats. Below, we show how to export that data to each of these.

    We begin with GeoJSON, which is a JSON format for geospatial feature collections. It's human-readable and widely supported by most web-based and desktop geospatial libraries.

    julia
    import GeoJSON
    +fn = "shapes.json"
    +GeoJSON.write(fn, df)
    "shapes.json"

    Now, let's save as a Shapefile. Shapefiles are actually a set of files (usually 4) that hold geometry information, a CRS, and additional attribute information as a separate table. When you give Shapefile.write a file name, it will write 4 files of the same name but with different extensions.

    julia
    import Shapefile
    +fn = "shapes.shp"
    +Shapefile.write(fn, df)
    20340

    Now, let's save as a GeoParquet. GeoParquet is a geospatial extension to the Parquet format, which is a high-performance data store. It's great for storing large amounts of data in a single file.

    julia
    import GeoParquet
    +fn = "shapes.parquet"
    +GeoParquet.write(fn, df, (:geometry,))
    "shapes.parquet"

    Finally, if there's no Julia-native package that can write data to your desired format (e.g. .gpkg, .gml, etc), you can use GeoDataFrames. This package uses the GDAL library under the hood which supports writing to nearly all geospatial formats.

    julia
    import GeoDataFrames
    +fn = "shapes.gpkg"
    +GeoDataFrames.write(fn, df)
    "shapes.gpkg"

    And there we go, you can now create mapped geometries from scratch, manipulate them, plot them on a map, and save them in multiple geospatial data formats.

    + + + + \ No newline at end of file diff --git a/previews/PR239/tutorials/geodesic_paths.html b/previews/PR239/tutorials/geodesic_paths.html new file mode 100644 index 000000000..0ce357761 --- /dev/null +++ b/previews/PR239/tutorials/geodesic_paths.html @@ -0,0 +1,35 @@ + + + + + + Geodesic paths | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Geodesic paths

    Geodesic paths are paths computed on an ellipsoid, as opposed to a plane.

    julia
    import GeometryOps as GO, GeoInterface as GI
    +using CairoMakie, GeoMakie
    +
    +
    +IAH = (-95.358421, 29.749907)
    +AMS = (4.897070, 52.377956)
    +
    +
    +fig, ga, _cp = lines(GeoMakie.coastlines(); axis = (; type = GeoAxis))
    +lines!(ga, GO.segmentize(GO.GeodesicSegments(; max_distance = 100_000), GI.LineString([IAH, AMS])); color = Makie.wong_colors()[2])
    +fig

    + + + + \ No newline at end of file diff --git a/previews/PR239/tutorials/spatial_joins.html b/previews/PR239/tutorials/spatial_joins.html new file mode 100644 index 000000000..f113cd50d --- /dev/null +++ b/previews/PR239/tutorials/spatial_joins.html @@ -0,0 +1,76 @@ + + + + + + Spatial joins | GeometryOps.jl + + + + + + + + + + + + + + +
    Skip to content

    Spatial joins

    Spatial joins are table joins which are based not on equality, but on some predicate p(x,y), which takes two geometries, and returns a value of either true or false. For geometries, the DE-9IM spatial relationship model is used to determine the spatial relationship between two geometries.

    Spatial joins can be done between any geometry types (from geometrycollections to points), just as geometrical predicates can be evaluated on any geometries.

    In this tutorial, we will show how to perform a spatial join on first a toy dataset and then two Natural Earth datasets, to show how this can be used in the real world.

    In order to perform the spatial join, we use FlexiJoins.jl to perform the join, specifically using its by_pred joining method. This allows the user to specify a predicate in the following manner, for any kind of table join operation:

    julia
    using FlexiJoins
    +innerjoin((table1, table1),
    +    by_pred(:table1_column, predicate_function, :table2_column) # & add other conditions here
    +)
    +leftjoin((table1, table1),
    +    by_pred(:table1_column, predicate_function, :table2_column) # & add other conditions here
    +)
    +rightjoin((table1, table1),
    +    by_pred(:table1_column, predicate_function, :table2_column) # & add other conditions here
    +)
    +outerjoin((table1, table1),
    +    by_pred(:table1_column, predicate_function, :table2_column) # & add other conditions here
    +)

    We have enabled the use of all of GeometryOps' boolean comparisons here. These are:

    julia
    GO.contains, GO.within, GO.intersects, GO.touches, GO.crosses, GO.disjoint, GO.overlaps, GO.covers, GO.coveredby, GO.equals

    Tip

    Always place the dataframe with more complex geometries second, as that is the one which will be sorted into a tree.

    Simple example

    This example demonstrates how to perform a spatial join between two datasets: a set of polygons and a set of randomly generated points.

    The polygons are represented as a DataFrame with geometries and colors, while the points are stored in a separate DataFrame.

    The spatial join is performed using the contains predicate from GeometryOps, which checks if each point is contained within any of the polygons. The resulting joined DataFrame is then used to plot the points, colored according to the containing polygon.

    First, we generate our data. We create two triangle polygons which, together, span the rectangle (0, 0, 1, 1), and a set of points which are randomly distributed within this rectangle.

    julia
    import GeoInterface as GI, GeometryOps as GO
    +using FlexiJoins, DataFrames
    +
    +using CairoMakie, GeoInterfaceMakie
    +
    +pl = GI.Polygon([GI.LinearRing([(0, 0), (1, 0), (1, 1), (0, 0)])])
    +pu = GI.Polygon([GI.LinearRing([(0, 0), (0, 1), (1, 1), (0, 0)])])
    +poly_df = DataFrame(geometry = [pl, pu], color = [:red, :blue])
    +f, a, p = poly(poly_df.geometry; color = tuple.(poly_df.color, 0.3))

    Here, the upper polygon is blue, and the lower polygon is red. Keep this in mind!

    Now, we generate the points.

    julia
    points = tuple.(rand(1000), rand(1000))
    +points_df = DataFrame(geometry = points)
    +scatter!(points_df.geometry)
    +f

    You can see that they are evenly distributed around the box. But how do we know which points are in which polygons?

    We have to join the two dataframes based on which polygon (if any) each point lies within.

    Now, we can perform the "spatial join" using FlexiJoins. We are performing an outer join here

    julia
    @time joined_df = FlexiJoins.innerjoin(
    +    (points_df, poly_df),
    +    by_pred(:geometry, GO.within, :geometry)
    +)
    julia
    scatter!(a, joined_df.geometry; color = joined_df.color)
    +f

    Here, you can see that the colors were assigned appropriately to the scattered points!

    Real-world example

    Suppose I have a list of polygons representing administrative regions (or mining sites, or what have you), and I have a list of polygons for each country. I want to find the country each region is in.

    julia
    import GeoInterface as GI, GeometryOps as GO
    +using FlexiJoins, DataFrames, GADM # GADM gives us country and sublevel geometry
    +
    +using CairoMakie, GeoInterfaceMakie
    +
    +country_df = GADM.get.(["JPN", "USA", "IND", "DEU", "FRA"]) |> DataFrame
    +country_df.geometry = GI.GeometryCollection.(GO.tuples.(country_df.geom))
    +
    +state_doublets = [
    +    ("USA", "New York"),
    +    ("USA", "California"),
    +    ("IND", "Karnataka"),
    +    ("DEU", "Berlin"),
    +    ("FRA", "Grand Est"),
    +    ("JPN", "Tokyo"),
    +]
    +
    +state_full_df = (x -> GADM.get(x...)).(state_doublets) |> DataFrame
    +state_full_df.geom = GO.tuples.(only.(state_full_df.geom))
    +state_compact_df = state_full_df[:, [:geom, :NAME_1]]
    julia
    innerjoin((state_compact_df, country_df), by_pred(:geom, GO.within, :geometry))
    +innerjoin((state_compact_df,  view(country_df, 1:1, :)), by_pred(:geom, GO.within, :geometry))

    Warning

    This is how you would do this, but it doesn't work yet, since the GeometryOps predicates are quite slow on large polygons. If you try this, the code will continue to run for a very, very long time (it took 12 hours on my laptop, but with minimal CPU usage).

    Enabling custom predicates

    In case you want to use a custom predicate, you only need to define a method to tell FlexiJoins how to use it.

    For example, let's suppose you wanted to perform a spatial join on geometries which are some distance away from each other:

    julia
    my_predicate_function = <(5)  abs  GO.distance

    You would need to define FlexiJoins.supports_mode on your predicate:

    julia
    FlexiJoins.supports_mode(
    +    ::FlexiJoins.Mode.NestedLoopFast, 
    +    ::FlexiJoins.ByPred{typeof(my_predicate_function)}, 
    +    datas
    +) = true

    This will enable FlexiJoins to support your custom function, when it's passed to by_pred(:geometry, my_predicate_function, :geometry).

    + + + + \ No newline at end of file diff --git a/previews/PR239/vp-icons.css b/previews/PR239/vp-icons.css new file mode 100644 index 000000000..ddc5bd8ed --- /dev/null +++ b/previews/PR239/vp-icons.css @@ -0,0 +1 @@ +.vpi-social-github{--icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24'%3E%3Cpath fill='black' d='M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")} \ No newline at end of file
    Skip to content

    20th April, 2024

    See GeometryOps#114.

    • [ ] Exact predicates can be defined for lower-level, more atomic predicates within GeometryOps.

    • [ ] Add Shewchuck's adaptive math as a stage for exact predicates.

    • [x] @skygering to write docstrings for the predicates

    29th Feb, 2024

    To do

    • [ ] Finish clipping degeneracies

    • [ ] Fix cross & overlap functions

    • [x] Benchmarks to show why things you couldn't concieve of in R are doable in Julia

    • [x] profile functions for exponential improvements

    • [ ] A list of projects people can work on...the beauty here is that each function is kind of self-contained so it's an undergrad level project

    • [ ] Doc improvements

      • more

      • benchmarks page

    • Methods to validate and fix geometry

      • [ ] Polygons and LinearRings:

        • [ ] self-intersection

        • [ ] holes are actually within the polygon

        • [ ] Polygon exteriors must be counterclockwise, holes clockwise.

        • [ ] length of all rings > 4

        • [ ] repeated last point

      • [ ] LineStrings: NaN/Inf points

      • [x] Fix linear rings at some point to make sure the ring is closed, i.e., points[end] == points[begin]

    • Tests

      • [x] Simplify functions

      • [x] Polygonize

      • Barycentric tests for n_vertices > 4

    Done

    • Rename bools.jl to something more relevant to the actual code -> orientation.jl

    • Doc improvements:

      • organise sections

    Introduction

    N-UK*|Y8uNm#K&MqE(7-RC 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 z%0DiI_Ukzbz83joZMt+@@$^4e!4 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",{"2":{"11":8,"13":2,"156":3,"175":1,"176":1,"180":3,"199":2}}],["↩︎",{"2":{"6":1}}],["ᵢᵢᵢ₊₁ᵢᵢ₊₁ᵢᵢ₊₁tᵢ=det",{"2":{"6":1}}],["⋅",{"2":{"6":1,"59":1}}],["qy",{"2":{"13":2,"14":2}}],["qx",{"2":{"13":2,"14":2}}],["q",{"2":{"13":13,"14":12,"64":4}}],["qhull",{"2":{"6":1,"82":1}}],["queue",{"2":{"182":41}}],["questions",{"2":{"73":1}}],["quite",{"2":{"162":1,"199":1}}],["quickhull",{"2":{"6":1,"77":1,"82":2}}],["quick",{"2":{"4":1,"6":1,"59":1,"170":1,"179":1}}],["quality",{"2":{"6":1,"180":1}}],["quantity",{"2":{"6":1,"176":1}}],["quot",{"2":{"1":4,"6":6,"20":2,"64":8,"84":2,"85":2,"88":2,"103":4,"116":10,"150":4,"151":2,"153":2,"154":2,"174":6,"191":2,"198":2}}],["zone",{"2":{"192":1}}],["zoom",{"2":{"14":1}}],["zs",{"2":{"146":5}}],["zip",{"2":{"13":1,"14":1,"191":4,"192":1,"193":1}}],["zeros",{"2":{"59":1,"66":1}}],["zero",{"2":{"4":6,"6":8,"56":11,"63":3,"64":4,"66":11,"73":22,"84":1,"85":3,"145":1,"153":1,"182":4}}],["z",{"2":{"4":1,"5":1,"6":2,"59":3,"88":3,"146":3,"158":1,"171":1,"185":1,"186":1}}],["0e6",{"2":{"192":6}}],["0example",{"2":{"6":1}}],["097075198097933",{"2":{"193":1}}],["09707519809793252",{"2":{"193":2}}],["091887951911644",{"2":{"193":3}}],["0999933334666654",{"2":{"191":1}}],["09801605542096",{"2":{"191":1}}],["098016055420953",{"2":{"191":3}}],["09297443860091348",{"2":{"191":4}}],["09",{"2":{"58":1}}],["08506974233813636",{"2":{"193":2}}],["08",{"2":{"58":1}}],["062749678615475",{"2":{"193":1}}],["06274967861547665",{"2":{"193":2}}],["06592462566760626",{"2":{"191":1}}],["0650624499034016",{"2":{"191":4}}],["06",{"2":{"58":1}}],["02017324484778",{"2":{"193":1}}],["020173244847778715",{"2":{"193":2}}],["027886421973952302",{"2":{"191":4}}],["02",{"2":{"58":3}}],["04500741774392",{"2":{"193":1}}],["045007417743918",{"2":{"193":2}}],["049999166670833324",{"2":{"191":1}}],["0438052480035",{"2":{"191":1}}],["043805248003498",{"2":{"191":3}}],["04",{"2":{"58":6}}],["07518688541961",{"2":{"193":1}}],["075186885419612",{"2":{"193":2}}],["071",{"2":{"175":2,"176":2}}],["07",{"2":{"58":6,"175":6,"176":6}}],["009176636029576",{"2":{"193":1}}],["0091766360295773",{"2":{"193":2}}],["003135308800957",{"2":{"193":1}}],["0031353088009582475",{"2":{"193":2}}],["0035114210915891397",{"2":{"191":4}}],["006784125578492062",{"2":{"193":2}}],["0020133807972559925",{"2":{"193":2}}],["00839489109211",{"2":{"193":3}}],["008696",{"2":{"3":1,"6":3,"72":1,"73":1,"118":1,"119":1}}],["005465967083412071",{"2":{"191":4}}],["00111595449914",{"2":{"191":1}}],["001115954499138",{"2":{"191":3}}],["0010075412835199304",{"2":{"191":4}}],["001",{"2":{"180":1}}],["00085222666982",{"2":{"193":3}}],["000577332369005",{"2":{"193":1}}],["0005773323690041465",{"2":{"193":2}}],["000510363870095e6",{"2":{"192":2}}],["00025191811248184703",{"2":{"193":2}}],["000215611503127e6",{"2":{"192":2}}],["0007260527263e6",{"2":{"192":2}}],["000342160541625e6",{"2":{"192":2}}],["000124843834609e6",{"2":{"192":2}}],["000063948817746e6",{"2":{"192":2}}],["000026987852369e6",{"2":{"192":2}}],["000008144045314",{"2":{"193":1}}],["000007998400139e6",{"2":{"192":2}}],["000000999950001e6",{"2":{"192":2}}],["00001e6",{"2":{"192":1}}],["0004397316773170068",{"2":{"191":4}}],["000",{"2":{"180":1,"196":1}}],["00",{"2":{"58":2}}],["053798628882221644",{"2":{"193":2}}],["05877989361332",{"2":{"191":1}}],["058779893613323",{"2":{"191":3}}],["05416726609360478",{"2":{"191":4}}],["05",{"2":{"58":1}}],["052704767595",{"2":{"15":1}}],["037564867762832",{"2":{"193":1}}],["03756486776283019",{"2":{"193":2}}],["031245035570328428",{"2":{"193":2}}],["033518309870985",{"2":{"193":3}}],["03503632062070827",{"2":{"191":4}}],["03",{"2":{"58":4}}],["01458815628695",{"2":{"193":3}}],["016044338630866517",{"2":{"193":2}}],["01592650896568995",{"2":{"191":1}}],["01597247419241532",{"2":{"191":4}}],["01908693278165",{"2":{"191":1}}],["019086932781654",{"2":{"191":3}}],["01098781325325",{"2":{"191":1}}],["010987813253244",{"2":{"191":3}}],["011814947665167774",{"2":{"191":4}}],["01362848005",{"2":{"15":1}}],["01",{"2":{"14":1,"58":1,"175":1,"176":1,"191":1,"192":1,"193":1}}],["0^",{"2":{"13":2,"14":2}}],["0+2",{"2":{"13":2,"14":2}}],["0",{"2":{"3":35,"4":12,"6":190,"11":1,"13":5,"14":8,"15":32,"52":20,"53":3,"55":9,"56":4,"58":155,"59":2,"62":6,"63":6,"64":49,"65":13,"66":5,"68":22,"69":49,"70":42,"72":2,"73":21,"75":46,"76":2,"80":1,"84":20,"85":2,"87":13,"88":18,"90":16,"93":6,"94":6,"103":6,"104":12,"105":9,"107":15,"116":37,"121":13,"122":9,"124":12,"125":11,"134":16,"145":21,"146":7,"158":1,"162":24,"168":64,"169":4,"175":16,"176":13,"177":2,"180":11,"182":7,"184":4,"189":2,"191":129,"192":2,"193":46,"198":13}}],[">=",{"2":{"59":6,"105":4,"122":1,"184":1}}],[">geometryops",{"2":{"6":2}}],[">",{"2":{"1":1,"6":6,"11":2,"13":1,"15":2,"50":1,"53":1,"59":1,"64":17,"66":3,"69":5,"70":1,"71":1,"73":2,"75":1,"76":3,"84":1,"88":1,"105":8,"116":10,"122":2,"145":4,"146":12,"156":6,"165":1,"169":3,"177":3,"180":1,"182":12,"184":3,"185":1,"189":1,"199":1}}],["914930257661865",{"2":{"193":1}}],["96875496442967",{"2":{"193":1}}],["961329",{"2":{"3":1,"6":3,"72":1,"73":1,"118":1,"119":1}}],["983955661369134",{"2":{"193":1}}],["9833",{"2":{"15":1}}],["9877550012664",{"2":{"191":1}}],["9840085315131",{"2":{"191":1}}],["98271048511609",{"2":{"191":1}}],["98661575256801",{"2":{"191":1}}],["99321587442151",{"2":{"193":1}}],["99375130197483",{"2":{"191":1}}],["997986619202745",{"2":{"193":1}}],["997750168744936",{"2":{"191":1}}],["997247091122496",{"2":{"191":1}}],["99600053330489",{"2":{"191":1}}],["991002699676024",{"2":{"191":1}}],["990022362600165",{"2":{"191":1}}],["99292997455441",{"2":{"191":1}}],["99533829767195",{"2":{"191":1}}],["99865616402829",{"2":{"191":1}}],["999999967681458e6",{"2":{"192":2}}],["999997707902938e6",{"2":{"192":2}}],["999987539891298e6",{"2":{"192":2}}],["999963474314044e6",{"2":{"192":2}}],["999919535736425e6",{"2":{"192":2}}],["999974634566875",{"2":{"191":1}}],["999849768598615e6",{"2":{"192":2}}],["999748081887518",{"2":{"193":1}}],["999748243174828e6",{"2":{"192":2}}],["999750002083324",{"2":{"191":1}}],["999609061508909e6",{"2":{"192":2}}],["999426363321033e6",{"2":{"192":2}}],["999194331880103e6",{"2":{"192":2}}],["99900003333289",{"2":{"191":1}}],["999565375483215",{"2":{"191":1}}],["97976366505997",{"2":{"191":1}}],["9783069507679",{"2":{"191":1}}],["97",{"2":{"58":1}}],["946201371117777",{"2":{"193":1}}],["94",{"2":{"58":1}}],["92",{"2":{"58":1}}],["9im",{"0":{"39":1},"1":{"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1},"2":{"116":2,"197":1}}],["95770326033",{"2":{"15":1}}],["95",{"2":{"13":1,"14":1,"196":1}}],["900",{"2":{"176":1}}],["90063612163",{"2":{"11":2}}],["90`",{"2":{"158":1}}],["90",{"2":{"52":9,"58":1}}],["909318372607",{"2":{"11":3}}],["9f0e22db49f7b49d5352750e9f69705f13c06d64",{"2":{"6":2}}],["9",{"2":{"1":1,"6":1,"116":2,"145":12,"175":1,"185":1}}],["897070",{"2":{"196":1}}],["873633668827033",{"2":{"193":1}}],["8135804051007",{"2":{"191":1}}],["813580405100698",{"2":{"191":3}}],["88",{"2":{"58":1}}],["86641841658641",{"2":{"191":1}}],["866418416586406",{"2":{"191":3}}],["86",{"2":{"58":1}}],["868447876892",{"2":{"15":2}}],["84",{"2":{"58":1}}],["821068835162155",{"2":{"193":1}}],["82",{"2":{"58":1}}],["800",{"2":{"58":1}}],["80000",{"2":{"15":5}}],["80",{"2":{"58":1}}],["80869813739",{"2":{"15":2}}],["856614689791036e",{"2":{"15":2}}],["83572303404496",{"2":{"6":2,"72":1,"73":1}}],["8",{"2":{"1":3,"6":9,"13":1,"14":1,"70":2,"75":4,"116":1,"146":3,"158":2,"175":1,"185":3,"193":2}}],["karnataka",{"2":{"199":1}}],["kbn",{"2":{"11":2}}],["kinds",{"2":{"23":1}}],["kind",{"2":{"9":1,"146":1,"197":1}}],["k",{"2":{"6":1,"14":6,"59":1,"64":5,"116":5,"191":5,"193":5}}],["kernel",{"2":{"177":4}}],["keepat",{"2":{"75":1,"169":2}}],["keep",{"2":{"64":3,"146":1,"169":14,"175":1,"198":1}}],["keeping",{"2":{"6":1,"153":1,"171":1}}],["keys",{"2":{"146":4,"153":1}}],["key",{"2":{"6":1,"146":4,"153":2,"188":5}}],["keyword",{"0":{"155":1},"2":{"6":8,"23":1,"31":3,"70":1,"72":1,"75":1,"153":1,"155":7,"170":2,"176":2,"188":4,"192":1,"193":1}}],["keywords",{"2":{"1":2,"4":1,"6":10,"31":1,"116":2,"146":1,"153":1,"155":1,"170":1,"171":2,"172":3,"180":8,"181":1,"182":1,"183":1,"184":1,"186":2}}],["known",{"2":{"66":2}}],["know",{"2":{"6":3,"53":2,"64":1,"66":1,"70":1,"72":1,"73":2,"75":1,"76":1,"153":1,"198":1}}],["kwargs",{"2":{"32":2,"60":3,"66":1,"69":1,"70":3,"71":3,"72":4,"73":5,"75":3,"76":5,"165":2,"173":1,"176":1}}],["kwdef",{"2":{"31":1,"64":1,"158":2,"176":1,"181":1,"182":1,"183":1}}],["kw",{"2":{"1":1,"6":10,"116":10,"146":20,"150":1,"153":18,"154":3,"156":2,"171":3,"180":15,"183":1,"185":3,"186":3,"188":6}}],["json",{"2":{"195":3}}],["jstep",{"2":{"88":3}}],["jstart",{"2":{"88":7}}],["joined",{"2":{"198":4}}],["joins",{"0":{"197":1},"1":{"198":1,"199":1,"200":1},"2":{"197":3}}],["joinpath",{"2":{"180":2}}],["join",{"2":{"153":1,"154":1,"197":4,"198":5,"200":1}}],["joining",{"2":{"6":2,"180":1,"197":1}}],["jpn",{"2":{"199":2}}],["jp",{"2":{"88":2}}],["jhole",{"2":{"88":2}}],["jh",{"2":{"76":5}}],["j+1",{"2":{"64":1,"146":1,"184":1}}],["j",{"2":{"64":24,"88":8,"105":9,"116":12,"145":2,"146":8,"184":2}}],["jet",{"2":{"58":1}}],["just",{"2":{"4":1,"6":1,"32":1,"63":1,"64":2,"73":4,"76":1,"81":1,"85":2,"146":1,"151":1,"153":2,"154":1,"157":1,"176":1,"177":1,"197":1}}],["julialand",{"2":{"192":2}}],["julialines",{"2":{"55":1}}],["julialinearsegments",{"2":{"6":1}}],["juliahole",{"2":{"191":1}}],["juliaplot",{"2":{"192":2}}],["juliap1",{"2":{"191":1}}],["juliapoly",{"2":{"192":1}}],["juliapolygon3",{"2":{"192":1}}],["juliapolygon1",{"2":{"191":1}}],["juliapolygonize",{"2":{"6":1}}],["juliapolygon",{"2":{"6":1}}],["juliapoints",{"2":{"198":1}}],["juliapoint",{"2":{"191":1}}],["juliaxoffset",{"2":{"191":3,"193":1}}],["juliax",{"2":{"191":2}}],["juliaxrange",{"2":{"84":1}}],["julia$apply",{"2":{"186":1}}],["julia$threaded",{"2":{"170":1}}],["julia6",{"2":{"180":1}}],["julia```jldoctest",{"2":{"189":1}}],["julia```julia",{"2":{"146":1}}],["julia```",{"2":{"105":1,"159":1}}],["julia1",{"2":{"70":1,"72":1,"73":1,"75":1}}],["julia2",{"2":{"69":1}}],["juliabase",{"2":{"59":1,"85":4,"153":1,"188":1}}],["juliabarycentric",{"2":{"5":3,"6":3}}],["juliafig",{"2":{"191":1,"192":1}}],["juliaflexijoins",{"2":{"200":1}}],["juliaflatten",{"2":{"156":1}}],["juliaflipped",{"2":{"148":1}}],["juliaflip",{"2":{"6":1}}],["juliafalse",{"2":{"145":1}}],["juliafunction",{"2":{"32":1,"35":1,"36":1,"37":1,"38":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"53":2,"59":3,"60":2,"63":1,"64":11,"66":2,"69":1,"71":1,"73":2,"76":1,"82":1,"85":8,"116":6,"122":2,"127":1,"147":1,"154":2,"156":4,"173":1,"176":1,"177":1,"184":2}}],["juliafor",{"2":{"31":1,"153":1,"154":1}}],["juliagi",{"2":{"11":2}}],["juliago",{"2":{"11":1,"52":1,"55":1,"65":1,"87":1,"90":1,"93":1,"103":1,"107":1,"118":1,"121":1,"124":1,"134":1,"197":1}}],["juliageopoly1",{"2":{"193":1}}],["juliageointerface",{"2":{"189":1}}],["juliageometry",{"2":{"82":1}}],["juliageo",{"2":{"6":2,"158":1}}],["juliageodesicsegments",{"2":{"6":1}}],["juliageos",{"2":{"6":1}}],["juliaweighted",{"2":{"6":1}}],["juliawithin",{"2":{"3":1,"6":1}}],["juliaunwrap",{"2":{"156":7}}],["juliaunion",{"2":{"6":1}}],["juliaunionintersectingpolygons",{"2":{"6":1,"166":1}}],["juliausing",{"2":{"6":1,"13":1,"14":1,"58":1,"175":2,"176":1,"179":1,"180":1,"194":1,"197":1}}],["juliascatter",{"2":{"198":1}}],["juliasource",{"2":{"192":2}}],["juliasimplify",{"2":{"6":1,"180":3}}],["juliasigned",{"2":{"4":2,"6":2}}],["juliasegmentize",{"2":{"6":1,"177":1}}],["julias1",{"2":{"6":1}}],["juliavisvalingamwhyatt",{"2":{"6":1}}],["juliaring3",{"2":{"192":1}}],["juliaring1",{"2":{"191":1}}],["juliar",{"2":{"191":2,"192":1,"193":1}}],["juliarebuild",{"2":{"156":1}}],["juliareconstruct",{"2":{"156":1}}],["juliareproject",{"2":{"1":1}}],["juliaradialdistance",{"2":{"6":1}}],["juliamy",{"2":{"200":1}}],["juliamultipoly",{"2":{"180":1}}],["juliamodule",{"2":{"31":1}}],["juliamonotonechainmethod",{"2":{"6":1}}],["juliameanvalue",{"2":{"6":1}}],["juliadf",{"2":{"194":1}}],["juliadestination",{"2":{"192":1}}],["juliadouglaspeucker",{"2":{"6":1}}],["juliadifference",{"2":{"6":1}}],["juliadiffintersectingpolygons",{"2":{"6":1,"166":1}}],["juliadistance",{"2":{"4":1,"6":1}}],["juliadisjoint",{"2":{"3":1,"6":1}}],["juliaexport",{"2":{"51":1,"54":1,"57":1,"61":1,"67":1,"70":1,"72":1,"75":1,"83":1,"86":1,"89":1,"92":1,"102":1,"106":1,"117":1,"120":1,"123":1,"133":1,"143":1,"146":1,"148":1,"154":1,"158":1,"161":1,"164":1,"167":1,"172":1,"174":1,"180":1,"187":1}}],["juliaend",{"2":{"85":1}}],["juliaenforce",{"2":{"6":1}}],["juliaenum",{"2":{"6":2}}],["juliaembed",{"2":{"4":1,"6":1}}],["juliaequals",{"2":{"4":15,"6":15,"64":1}}],["juliaaccuratearithmetic",{"2":{"11":2}}],["juliaabstract",{"2":{"6":3,"165":1,"166":1,"176":1}}],["juliaangles",{"2":{"4":1,"6":1}}],["juliaarea",{"2":{"4":1,"6":1}}],["juliaapplyreduce",{"2":{"1":1,"150":1}}],["juliaapply",{"2":{"1":1,"18":1,"150":1}}],["juliacent",{"2":{"62":1}}],["juliacentroid",{"2":{"4":1,"6":3}}],["juliacut",{"2":{"6":1}}],["juliaclosedring",{"2":{"6":1,"166":1}}],["juliaconst",{"2":{"53":1,"56":1,"59":1,"64":1,"66":2,"85":1,"94":1,"108":1,"125":1,"135":1,"155":1}}],["juliaconvex",{"2":{"6":1,"82":1}}],["juliacontains",{"2":{"3":1,"6":1}}],["juliacoverage",{"2":{"6":1}}],["juliacovers",{"2":{"3":1,"6":1}}],["juliacoveredby",{"2":{"3":1,"6":1}}],["juliatraittarget",{"2":{"159":1}}],["juliatransform",{"2":{"1":1,"6":1}}],["juliatrue",{"2":{"88":1,"91":1,"94":1,"104":1,"108":1,"119":1,"122":1,"125":1,"135":1,"145":1}}],["juliatuples",{"2":{"6":1}}],["juliat",{"2":{"6":1}}],["juliatouches",{"2":{"3":1,"6":1}}],["juliaoverlaps",{"2":{"3":9,"6":9}}],["juliainnerjoin",{"2":{"199":1}}],["juliaintersection",{"2":{"6":2}}],["juliaintersects",{"2":{"3":1}}],["juliaisconcave",{"2":{"6":1}}],["juliaisclockwise",{"2":{"6":1}}],["juliaimport",{"2":{"1":1,"3":9,"4":1,"6":17,"11":1,"32":1,"52":1,"55":1,"62":1,"65":1,"68":1,"79":1,"80":1,"81":1,"84":1,"87":1,"90":1,"93":1,"103":1,"107":1,"118":1,"121":1,"124":1,"134":1,"150":1,"162":2,"168":2,"175":1,"195":4,"196":1,"198":1,"199":1}}],["julia",{"2":{"3":1,"6":5,"9":1,"15":1,"25":1,"27":1,"31":1,"32":2,"53":4,"56":10,"59":8,"63":19,"64":60,"66":18,"69":10,"70":6,"71":1,"72":5,"73":29,"75":6,"76":4,"77":1,"82":5,"84":1,"85":4,"88":15,"91":1,"95":1,"96":5,"97":1,"98":1,"99":2,"100":1,"101":1,"104":1,"105":3,"109":1,"110":3,"111":1,"112":1,"113":1,"114":1,"115":1,"116":50,"119":1,"122":7,"126":1,"127":3,"128":1,"129":1,"130":1,"131":1,"132":1,"136":1,"137":3,"138":1,"139":1,"140":2,"141":1,"142":1,"145":9,"146":40,"147":2,"153":44,"154":18,"156":10,"159":1,"160":1,"163":5,"165":1,"169":3,"170":1,"171":1,"172":1,"176":1,"177":2,"180":1,"181":2,"182":15,"183":3,"185":1,"186":1,"187":1,"188":4,"189":1,"190":2,"192":2,"195":2,"198":1}}],["julia>",{"2":{"1":5,"6":7,"145":3,"185":7}}],["juliajulia>",{"2":{"1":2,"6":3}}],["jl`",{"2":{"82":1,"172":1,"188":1}}],["jlmethod",{"2":{"6":2}}],["jlobjecttype",{"2":{"6":2}}],["jlbinding",{"2":{"6":2}}],["jldocstring",{"2":{"6":2}}],["jldoctest",{"2":{"6":1}}],["jl",{"0":{"25":1,"31":1},"2":{"1":10,"4":1,"6":15,"10":2,"11":1,"22":2,"25":2,"27":2,"31":42,"32":1,"50":1,"53":1,"56":1,"59":1,"60":3,"63":1,"64":1,"66":1,"69":1,"71":1,"73":1,"74":1,"76":1,"77":3,"82":6,"85":1,"88":1,"91":1,"101":1,"104":1,"105":1,"115":1,"116":1,"119":1,"122":1,"132":1,"142":1,"145":2,"146":1,"147":1,"153":2,"154":1,"155":1,"156":3,"158":1,"160":2,"163":1,"166":1,"169":1,"170":2,"171":1,"172":4,"173":3,"174":1,"176":3,"177":2,"180":2,"184":1,"185":6,"186":2,"188":2,"189":1,"192":1,"197":1}}],["+5000000",{"2":{"192":1}}],["+proj=natearth2",{"2":{"192":2}}],["+=",{"2":{"56":2,"59":11,"63":6,"64":17,"66":10,"69":1,"88":1,"105":1,"116":5,"145":1,"169":2,"182":4,"189":3}}],["+",{"2":{"1":1,"6":1,"13":1,"14":1,"53":4,"56":1,"59":20,"63":10,"64":15,"66":7,"69":1,"73":10,"85":3,"88":2,"105":2,"116":6,"145":6,"146":2,"150":1,"169":3,"177":2,"182":3,"183":2,"184":2,"191":6,"192":1,"193":4}}],["yticklabelsvisible",{"2":{"192":1}}],["york",{"2":{"199":1}}],["yoffset",{"2":{"191":7,"193":2}}],["your",{"0":{"195":1},"2":{"18":1,"60":1,"146":1,"148":1,"173":1,"176":1,"194":1,"195":1,"200":2}}],["you",{"0":{"23":1},"2":{"1":1,"4":1,"5":2,"6":9,"9":1,"11":1,"17":1,"18":5,"23":1,"29":2,"53":1,"56":1,"59":8,"60":1,"63":1,"70":1,"72":1,"75":1,"81":1,"82":1,"148":1,"153":1,"154":1,"159":1,"162":1,"168":1,"173":1,"175":1,"176":1,"185":1,"192":1,"194":2,"195":3,"198":2,"199":3,"200":4}}],["y=y",{"2":{"189":1}}],["yvec",{"2":{"146":4}}],["ybounds",{"2":{"146":4}}],["yhalf",{"2":{"146":2}}],["ylast",{"2":{"85":3}}],["yfirst",{"2":{"85":5}}],["y0",{"2":{"85":5}}],["yw",{"2":{"66":4}}],["ye",{"2":{"66":4}}],["yet",{"0":{"147":1},"2":{"31":1,"59":1,"69":1,"71":1,"73":1,"76":1,"88":1,"146":1,"147":1,"165":2,"199":1}}],["y2",{"2":{"63":2,"66":18,"85":7,"105":10,"116":5,"122":4,"146":5,"177":6,"189":2}}],["y1",{"2":{"63":2,"66":22,"85":7,"105":11,"116":6,"122":5,"146":5,"177":7,"189":2}}],["yind+1",{"2":{"146":1}}],["yind",{"2":{"146":2}}],["yinterior",{"2":{"63":2}}],["yield",{"2":{"73":1,"176":1}}],["yi+yi−1",{"2":{"6":1}}],["ycentroid",{"2":{"63":13}}],["yrange",{"2":{"58":3,"84":3}}],["yautolimits",{"2":{"58":2}}],["yp2",{"2":{"53":4}}],["ys",{"2":{"6":3,"146":30}}],["ymax",{"2":{"6":1,"65":2,"66":48}}],["ymin",{"2":{"6":1,"65":2,"66":49}}],["y",{"2":{"1":2,"4":1,"6":3,"13":9,"14":10,"53":8,"56":2,"58":8,"62":1,"63":10,"64":6,"65":1,"66":8,"71":6,"73":8,"84":2,"85":7,"88":3,"105":21,"116":16,"122":7,"145":10,"148":2,"150":1,"153":1,"171":4,"172":1,"177":2,"184":1,"185":2,"186":2,"189":7,"191":8,"192":2,"193":2,"197":1}}],["75",{"2":{"84":2,"90":1,"107":1,"134":1}}],["78",{"2":{"58":1}}],["749907",{"2":{"196":1}}],["74",{"2":{"58":1}}],["72",{"2":{"58":1}}],["726711609794",{"2":{"15":1}}],["76",{"2":{"58":1}}],["76085",{"2":{"15":1}}],["768946",{"2":{"3":1,"6":3,"72":1,"73":1,"118":1,"119":1}}],["70440582002419",{"2":{"191":1}}],["704405820024185",{"2":{"191":3}}],["704377648755",{"2":{"15":2}}],["700",{"2":{"14":1}}],["700454",{"2":{"6":1,"179":1,"180":1}}],["701141",{"2":{"6":1,"179":1,"180":1}}],["70",{"2":{"6":20,"58":1,"179":20,"180":20,"191":20}}],["738281",{"2":{"3":1,"6":3,"72":1,"73":1,"118":1,"119":1}}],["7",{"2":{"1":5,"6":4,"116":1,"150":1,"153":1,"175":4,"176":4,"185":4,"193":1}}],["65533525026046",{"2":{"191":1}}],["655335250260467",{"2":{"191":3}}],["659942",{"2":{"6":1,"179":1,"180":1}}],["6378137",{"2":{"158":1}}],["6371008",{"2":{"158":1}}],["639343",{"2":{"6":1,"179":1,"180":1}}],["6area",{"2":{"63":2}}],["66",{"2":{"58":1}}],["668869",{"2":{"6":1,"179":1,"180":1}}],["64744840486518",{"2":{"193":3}}],["64",{"2":{"58":1,"175":2,"176":2}}],["646209",{"2":{"6":1,"179":1,"180":1}}],["629",{"2":{"192":1}}],["62",{"2":{"58":1}}],["624923",{"2":{"6":1,"179":1,"180":1}}],["61366192682",{"2":{"15":1}}],["614624",{"2":{"6":1,"179":1,"180":1}}],["605000000000004",{"2":{"175":2}}],["60",{"2":{"58":1,"175":2}}],["60000",{"2":{"15":3}}],["609817",{"2":{"6":1,"179":1,"180":1}}],["603637",{"2":{"6":2,"179":2,"180":2}}],["68",{"2":{"58":1}}],["682601",{"2":{"6":1,"179":1,"180":1}}],["683975",{"2":{"6":1,"179":1,"180":1}}],["69159119078359",{"2":{"193":3}}],["694274",{"2":{"6":1,"179":1,"180":1}}],["697021",{"2":{"6":1,"179":1,"180":1}}],["6",{"2":{"1":12,"3":4,"6":20,"70":3,"75":3,"116":1,"122":4,"150":3,"153":3,"180":1,"185":9,"193":2}}],["51695367760999",{"2":{"193":1}}],["516953677609987",{"2":{"193":2}}],["51030066635026",{"2":{"191":4}}],["5e6",{"2":{"192":2}}],["55715336218991",{"2":{"193":1}}],["557153362189904",{"2":{"193":2}}],["55",{"2":{"191":3}}],["55494217175954",{"2":{"191":4}}],["57",{"2":{"175":4,"176":4}}],["57725",{"2":{"15":2}}],["5x",{"2":{"153":1}}],["563198",{"2":{"73":1}}],["56",{"2":{"58":1}}],["54",{"2":{"58":1,"191":19}}],["50",{"2":{"58":1,"175":4,"176":4,"191":3}}],["500000",{"2":{"192":1}}],["50000",{"2":{"15":1}}],["500",{"2":{"14":1,"192":1}}],["5d",{"2":{"25":1,"27":1,"158":1}}],["52",{"2":{"58":1,"196":1}}],["52521",{"2":{"15":1}}],["52709",{"2":{"15":2}}],["594711",{"2":{"6":1,"179":1,"180":1}}],["590591",{"2":{"6":1,"179":1,"180":1}}],["595397",{"2":{"6":1,"179":1,"180":1}}],["535",{"2":{"175":4}}],["5355",{"2":{"175":2}}],["53333",{"2":{"15":4}}],["53",{"2":{"6":10,"175":2,"189":10}}],["58",{"2":{"58":1}}],["58059",{"2":{"15":2}}],["587158",{"2":{"6":2,"179":2,"180":2}}],["58375366067548",{"2":{"6":2,"72":1,"73":1}}],["584961",{"2":{"3":1,"6":3,"72":1,"73":1,"118":1,"119":1}}],["5",{"2":{"1":29,"3":4,"4":8,"6":82,"13":1,"58":1,"68":5,"69":8,"70":16,"75":18,"84":8,"88":8,"116":1,"122":4,"146":1,"150":2,"153":2,"175":1,"176":1,"185":27,"191":32,"192":25,"200":1}}],["4983491639274692e6",{"2":{"192":2}}],["4986507085647392e6",{"2":{"192":2}}],["497205585568957e6",{"2":{"192":2}}],["4976022389592e6",{"2":{"192":2}}],["4957639801366436e6",{"2":{"192":2}}],["4940253560034204e6",{"2":{"192":2}}],["4946113281484335e6",{"2":{"192":2}}],["491990928929295e6",{"2":{"192":2}}],["4904357734399722e6",{"2":{"192":2}}],["4926709788709967e6",{"2":{"192":2}}],["4962554647802354e6",{"2":{"192":2}}],["499984780817334e6",{"2":{"192":2}}],["4997392479570867e6",{"2":{"192":2}}],["4991939151049731e6",{"2":{"192":2}}],["4994001399837343e6",{"2":{"192":2}}],["4998500087497458e6",{"2":{"192":2}}],["49",{"2":{"146":1}}],["43541888381864",{"2":{"193":3}}],["4326",{"2":{"192":2,"193":3}}],["43787",{"2":{"15":1}}],["439295815226",{"2":{"15":1}}],["434306",{"2":{"6":1,"179":1,"180":1}}],["4896621210021754e6",{"2":{"192":2}}],["489271",{"2":{"6":4,"189":4}}],["4870405593989636e6",{"2":{"192":2}}],["4879072738504685e6",{"2":{"192":2}}],["484003",{"2":{"145":4}}],["482551",{"2":{"145":4}}],["48268",{"2":{"15":1}}],["48",{"2":{"58":1}}],["48001",{"2":{"15":1}}],["45",{"2":{"58":2,"145":12,"191":2}}],["450",{"2":{"13":1}}],["458369",{"2":{"6":2,"179":2,"180":2}}],["42004014766201",{"2":{"191":1}}],["420040147662014",{"2":{"191":3}}],["4219350464667047e",{"2":{"191":4}}],["42",{"2":{"13":1,"14":1,"58":3}}],["426283",{"2":{"6":1,"179":1,"180":1}}],["400",{"2":{"58":3}}],["40000",{"2":{"15":1}}],["40",{"2":{"14":1,"58":3}}],["406224",{"2":{"6":1,"179":1,"180":1}}],["404504",{"2":{"6":1,"179":1,"180":1}}],["41544701408748197",{"2":{"191":1}}],["41",{"2":{"58":1,"193":20}}],["41878",{"2":{"15":1}}],["414248",{"2":{"6":1,"179":1,"180":1}}],["419406",{"2":{"6":1,"179":1,"180":1}}],["4493927459900552",{"2":{"191":1}}],["44121252392",{"2":{"15":1}}],["44",{"2":{"14":1,"58":2}}],["442901",{"2":{"6":1,"179":1,"180":1}}],["446339",{"2":{"6":1,"179":1,"180":1}}],["477985",{"2":{"145":4}}],["47",{"2":{"58":3}}],["473835",{"2":{"6":1,"179":1,"180":1}}],["472117",{"2":{"6":2,"179":2,"180":2}}],["46525251631344455",{"2":{"191":1}}],["465816",{"2":{"6":1,"179":1,"180":1}}],["46",{"2":{"58":3}}],["468107",{"2":{"6":1,"179":1,"180":1}}],["464547",{"2":{"6":6,"189":6}}],["4",{"2":{"1":11,"3":4,"6":12,"9":2,"13":2,"14":1,"52":1,"66":1,"91":1,"104":1,"108":1,"116":2,"135":1,"145":1,"150":3,"153":3,"175":1,"182":1,"185":8,"192":20,"195":2,"196":1}}],["358421",{"2":{"196":1}}],["3585",{"2":{"175":1}}],["35",{"2":{"58":3}}],["354492",{"2":{"3":1,"6":3,"72":1,"73":1,"118":1,"119":1}}],["38042741557976",{"2":{"191":1}}],["380427415579764",{"2":{"191":3}}],["38",{"2":{"58":3}}],["3655999675063154",{"2":{"191":1}}],["36",{"2":{"58":2}}],["360",{"2":{"53":1}}],["36022",{"2":{"15":1}}],["327284472232776",{"2":{"193":3}}],["32610",{"2":{"192":3}}],["32",{"2":{"58":3}}],["377956",{"2":{"196":1}}],["37",{"2":{"58":5}}],["3497142366876638",{"2":{"191":1}}],["34",{"2":{"58":3}}],["31571636123306385",{"2":{"191":1}}],["31",{"2":{"58":2}}],["30151010318639",{"2":{"191":4}}],["30527612515520186",{"2":{"191":4}}],["300",{"2":{"84":1}}],["30",{"2":{"14":2,"58":3,"191":2}}],["3376428491230612",{"2":{"191":4}}],["3390",{"2":{"116":1}}],["33333333333",{"2":{"15":1}}],["333333333336",{"2":{"15":3}}],["33",{"2":{"6":20,"179":20,"180":20}}],["3d",{"2":{"4":1,"6":1,"59":2,"88":1,"156":1,"174":1}}],["3",{"2":{"1":13,"3":4,"5":1,"6":26,"14":2,"59":13,"62":6,"64":1,"70":6,"75":5,"87":1,"91":1,"104":1,"108":1,"116":2,"121":1,"135":1,"146":7,"150":3,"153":3,"158":2,"168":16,"175":4,"180":3,"182":2,"184":1,"185":11,"192":1,"193":1,"198":1}}],["39945867303846",{"2":{"193":3}}],["3995734698458635",{"2":{"191":1}}],["399918",{"2":{"6":2,"179":2,"180":2}}],["394759",{"2":{"6":1,"179":1,"180":1}}],["392466",{"2":{"6":1,"179":1,"180":1}}],["395332",{"2":{"6":1,"179":1,"180":1}}],["39",{"0":{"30":1},"2":{"0":1,"3":1,"4":5,"6":22,"7":1,"9":2,"17":2,"18":1,"19":1,"23":1,"29":1,"32":1,"53":1,"55":1,"56":1,"57":1,"58":3,"59":2,"62":6,"63":3,"64":28,"66":1,"68":1,"69":1,"71":1,"72":4,"73":1,"76":2,"81":2,"85":4,"88":7,"93":1,"103":2,"110":2,"116":19,"122":1,"124":2,"127":2,"146":3,"148":2,"153":5,"154":4,"159":2,"160":3,"166":6,"167":1,"175":6,"176":1,"178":1,"180":2,"188":6,"190":1,"191":6,"192":6,"193":4,"194":4,"195":5,"197":1,"199":1,"200":2}}],["2pi",{"2":{"191":1,"192":1,"193":1}}],["2nd",{"2":{"73":6}}],["2335447787454",{"2":{"193":1}}],["233544778745394",{"2":{"193":2}}],["23",{"2":{"58":3,"116":1}}],["23699059147",{"2":{"15":1}}],["28",{"2":{"58":2}}],["28083",{"2":{"15":2}}],["2658011835867806",{"2":{"191":1}}],["26745668457025",{"2":{"191":1}}],["267456684570245",{"2":{"191":3}}],["26",{"2":{"58":5,"116":2}}],["24989584635339165",{"2":{"191":1}}],["24279488312757858",{"2":{"191":4}}],["24",{"2":{"58":7,"116":1,"193":9}}],["274364",{"2":{"70":1,"72":1,"75":1}}],["274363",{"2":{"70":1,"72":1,"75":1}}],["27",{"2":{"58":2}}],["275543",{"2":{"6":6,"189":6}}],["2d",{"2":{"25":1,"27":1,"158":4,"174":1}}],["2^",{"2":{"14":1}}],["2158594260436434",{"2":{"191":1}}],["215118",{"2":{"6":4,"189":4}}],["21664550952386064",{"2":{"191":4}}],["21",{"2":{"58":4,"116":2,"193":40}}],["21427",{"2":{"11":5}}],["25",{"2":{"58":3,"90":1,"116":1,"134":1,"193":12}}],["258",{"2":{"11":1}}],["257223563`",{"2":{"176":1}}],["257223563",{"2":{"6":2,"158":1,"176":1}}],["295828190107045",{"2":{"193":1}}],["29582819010705",{"2":{"193":2}}],["299820032397223",{"2":{"191":1}}],["29",{"2":{"58":3,"196":1}}],["29th",{"0":{"8":1},"1":{"9":1,"10":1}}],["298",{"2":{"6":2,"158":1,"176":2}}],["20340",{"2":{"195":1}}],["20682326747054",{"2":{"193":1}}],["206823267470536",{"2":{"193":2}}],["20093817218219",{"2":{"191":1}}],["200938172182195",{"2":{"191":3}}],["2018",{"2":{"116":1}}],["2017",{"2":{"6":1,"59":1}}],["20",{"2":{"58":3,"116":2,"191":60,"193":1}}],["2024",{"0":{"7":1,"8":1},"1":{"9":1,"10":1}}],["20th",{"0":{"7":1}}],["22",{"2":{"58":3,"116":1}}],["22168",{"2":{"3":1,"6":3,"72":1,"73":1,"118":1,"119":1}}],["224758",{"2":{"3":1,"6":3,"72":1,"73":1,"118":1,"119":1}}],["2",{"2":{"1":19,"3":9,"5":1,"6":48,"13":1,"14":1,"15":3,"25":2,"27":2,"32":1,"53":3,"56":1,"58":6,"59":32,"62":2,"63":4,"64":10,"65":6,"66":7,"68":1,"69":2,"73":2,"75":1,"79":1,"80":1,"81":3,"82":1,"84":1,"85":3,"88":4,"91":2,"104":2,"105":2,"107":2,"108":3,"116":11,"135":2,"145":2,"146":23,"150":2,"153":4,"154":1,"158":2,"169":1,"177":1,"180":5,"182":7,"183":7,"184":5,"185":18,"189":11,"191":7,"192":6,"193":10,"194":1,"196":1}}],["1st",{"2":{"73":6}}],["198232937815632",{"2":{"193":1}}],["19823293781563178",{"2":{"193":2}}],["1999466709331708",{"2":{"191":1}}],["1998",{"2":{"70":1,"72":1,"75":1}}],["19",{"2":{"58":2,"116":2}}],["11591614996189725",{"2":{"191":1}}],["11966707868197",{"2":{"191":1}}],["119667078681967",{"2":{"191":3}}],["110m",{"2":{"192":2}}],["110",{"2":{"80":1,"192":1}}],["11",{"2":{"15":2,"58":2,"116":1}}],["1145",{"2":{"70":1,"72":1,"75":1}}],["114",{"2":{"7":1}}],["16589608273778408",{"2":{"191":1}}],["165644",{"2":{"145":2}}],["16692537029320365",{"2":{"191":4}}],["166644",{"2":{"145":2}}],["163434",{"2":{"145":2}}],["169356",{"2":{"145":2}}],["164434",{"2":{"145":2}}],["16111",{"2":{"15":1}}],["16",{"2":{"13":1,"14":1,"58":2,"116":2}}],["180",{"2":{"53":1,"145":1,"158":2}}],["18593721105",{"2":{"15":1}}],["18",{"2":{"13":1,"14":1,"58":3,"116":2}}],["13309630561615",{"2":{"193":3}}],["13401805979",{"2":{"15":2}}],["13",{"2":{"6":3,"58":1,"70":1,"75":2,"116":1}}],["10n",{"2":{"192":1}}],["10832215707812454",{"2":{"191":4}}],["10^9",{"2":{"13":1}}],["1000000",{"2":{"192":1}}],["1000",{"2":{"13":2,"175":2,"192":1,"198":2}}],["100",{"2":{"6":2,"14":3,"79":1,"81":1,"146":2,"196":1}}],["10",{"2":{"6":12,"11":1,"55":1,"58":5,"68":4,"69":10,"70":2,"72":1,"75":2,"87":2,"116":3,"121":2,"176":1,"180":4,"191":1}}],["14182952335953",{"2":{"193":1}}],["14182952335952814",{"2":{"193":2}}],["14404531208901e",{"2":{"193":2}}],["1499775010124783",{"2":{"191":1}}],["1464721641710074",{"2":{"191":4}}],["14",{"2":{"3":1,"6":5,"58":2,"72":2,"73":2,"116":1,"118":1,"119":1,"175":2,"176":2}}],["15488729606723",{"2":{"193":3}}],["15",{"2":{"3":1,"6":4,"58":1,"68":1,"69":1,"72":1,"73":1,"116":1,"118":1,"119":1}}],["17893116483784577",{"2":{"193":2}}],["17289902010158",{"2":{"191":1}}],["172899020101585",{"2":{"191":3}}],["170356",{"2":{"145":2}}],["17",{"2":{"3":1,"6":3,"58":3,"72":1,"73":1,"116":2,"118":1,"119":1}}],["125",{"2":{"6":2,"72":1,"73":1}}],["127",{"2":{"3":1,"6":3,"72":1,"73":1,"118":1,"119":1,"192":1}}],["123",{"2":{"3":1,"6":3,"72":1,"73":1,"118":1,"119":1}}],["12636633117296836",{"2":{"193":2}}],["126",{"2":{"3":1,"6":3,"72":1,"73":1,"118":1,"119":1}}],["12",{"2":{"3":1,"6":3,"58":2,"72":1,"73":1,"116":1,"118":1,"119":1,"199":1}}],["124",{"2":{"3":1,"6":3,"72":1,"73":1,"118":1,"119":1}}],["1",{"2":{"1":8,"3":38,"6":59,"13":1,"14":4,"15":1,"52":4,"53":15,"55":7,"57":2,"58":11,"59":16,"62":4,"63":7,"64":72,"65":9,"66":15,"68":1,"69":10,"71":3,"73":9,"75":4,"76":11,"81":6,"84":7,"85":6,"88":16,"90":2,"91":6,"93":2,"94":2,"103":2,"104":8,"105":12,"107":2,"108":5,"116":38,"122":6,"124":4,"125":5,"127":1,"134":2,"135":6,"145":16,"146":27,"150":2,"153":6,"154":3,"156":3,"162":12,"163":2,"169":9,"176":1,"177":4,"180":8,"182":15,"183":3,"184":15,"185":6,"189":9,"191":8,"192":44,"193":12,"194":1,"198":8,"199":3}}],["nselected",{"2":{"184":3}}],["nmax",{"2":{"184":2}}],["nice",{"2":{"182":1}}],["n+1",{"2":{"162":1}}],["nfeature",{"2":{"153":1,"154":1}}],["nkeys",{"2":{"146":8}}],["nc",{"2":{"116":13}}],["ncoord",{"2":{"88":2}}],["nl",{"2":{"116":11}}],["nhole",{"2":{"64":2,"70":2,"72":2,"75":2,"76":1,"88":2}}],["nbpts",{"2":{"64":2}}],["ngeom",{"2":{"63":1,"153":2,"154":1,"189":1}}],["nt",{"2":{"188":2}}],["ntasks",{"2":{"153":3,"154":3}}],["nthreads",{"2":{"153":2,"154":2}}],["nthe",{"2":{"60":1,"173":1,"176":1}}],["ntuple",{"2":{"59":3,"177":1}}],["n2",{"2":{"59":8,"88":10}}],["n1",{"2":{"59":8,"88":9}}],["np2",{"2":{"105":4}}],["npolygon",{"2":{"71":1,"88":3,"169":2}}],["npoints",{"2":{"53":6,"64":5,"116":3,"176":6,"182":7}}],["npoint",{"2":{"6":1,"53":2,"55":1,"56":1,"66":2,"81":2,"85":1,"88":6,"105":6,"116":6,"127":1,"145":2,"163":1,"176":3,"177":1,"180":14,"184":1,"189":13}}],["npts",{"2":{"64":6,"182":3}}],["np",{"2":{"56":2,"85":5}}],["null",{"2":{"32":1,"176":1}}],["numeric",{"2":{"11":1}}],["numbers",{"2":{"6":1,"7":1,"57":2,"59":1,"176":1}}],["number=6",{"2":{"6":1,"179":1,"180":1}}],["number",{"2":{"6":11,"59":1,"64":2,"69":1,"77":1,"81":1,"84":1,"88":2,"116":2,"174":1,"175":1,"177":1,"180":2,"181":4,"182":7,"183":4,"184":12}}],["n",{"2":{"6":1,"9":1,"57":2,"59":36,"60":2,"64":51,"69":10,"75":4,"76":4,"116":11,"127":2,"145":6,"146":5,"162":1,"169":25,"173":2,"176":2,"177":3,"180":2,"184":7,"189":32}}],["naive",{"2":{"74":1}}],["napts",{"2":{"64":3}}],["navigate",{"0":{"26":1}}],["natearth2",{"2":{"192":1}}],["natural",{"2":{"180":1,"192":2,"197":1}}],["naturalearth",{"2":{"11":2,"80":2,"180":3,"192":1}}],["nature",{"2":{"146":1}}],["native",{"2":{"6":1,"147":1,"188":4,"195":1}}],["nan",{"2":{"9":1}}],["named",{"2":{"153":1}}],["namedtuple",{"2":{"22":2,"153":2,"188":2}}],["name",{"2":{"6":1,"31":2,"180":1,"188":1,"194":1,"195":2,"199":1}}],["namespaced",{"2":{"153":1}}],["names",{"2":{"6":1,"31":3,"153":3,"154":3,"188":1}}],["nodestatus",{"2":{"146":6}}],["nodes",{"2":{"64":1,"146":4}}],["node",{"2":{"64":26,"146":17}}],["north",{"2":{"66":12,"158":1}}],["nor",{"2":{"60":1,"173":1,"176":1}}],["normalized",{"2":{"59":1}}],["normalize",{"2":{"59":1}}],["norm",{"2":{"6":1,"59":22}}],["now",{"2":{"6":1,"13":1,"25":1,"27":1,"55":1,"58":2,"59":4,"60":1,"64":1,"69":1,"76":1,"77":1,"85":1,"145":1,"146":2,"168":1,"174":1,"175":3,"176":1,"180":1,"191":5,"192":6,"193":2,"194":1,"195":3,"198":2}}],["no",{"2":{"6":6,"53":1,"59":2,"64":4,"70":1,"71":1,"72":1,"73":14,"75":1,"88":2,"94":3,"108":3,"116":2,"125":2,"127":1,"129":1,"130":2,"135":2,"137":1,"138":3,"139":3,"140":1,"146":2,"147":1,"148":1,"153":3,"174":1,"176":2,"177":1,"180":1,"188":1,"195":1}}],["nonzero",{"2":{"177":2}}],["none",{"2":{"6":4,"64":1,"69":1,"70":1,"72":1,"75":1,"76":1,"105":4,"107":1}}],["nondimensional",{"2":{"6":1,"176":1}}],["nonintersecting",{"2":{"6":1,"23":1,"166":1,"169":1}}],["non",{"2":{"3":2,"6":2,"22":1,"57":2,"64":15,"70":2,"71":1,"72":1,"73":4,"75":1,"76":2,"84":1,"122":2,"129":1,"151":1,"160":1}}],["note",{"2":{"4":4,"6":11,"19":1,"29":1,"53":1,"56":2,"59":1,"62":2,"63":2,"64":3,"66":1,"69":2,"71":3,"73":5,"76":3,"82":1,"85":1,"88":5,"116":1,"121":1,"122":1,"158":1,"160":1,"172":1,"177":1,"181":1,"182":2,"183":1,"192":2,"193":1}}],["not",{"0":{"147":1},"2":{"1":2,"3":8,"4":1,"6":16,"18":1,"19":1,"22":1,"24":1,"31":1,"53":4,"56":1,"59":4,"60":1,"62":1,"64":18,"69":1,"72":1,"73":7,"76":3,"81":1,"87":2,"88":4,"90":2,"91":1,"93":2,"94":2,"103":1,"104":2,"108":3,"110":5,"111":3,"112":2,"113":2,"116":5,"121":1,"122":2,"125":1,"134":2,"135":2,"137":1,"145":4,"146":2,"147":1,"150":1,"151":1,"152":1,"153":7,"154":4,"156":4,"158":2,"159":1,"160":1,"162":2,"165":2,"168":3,"171":1,"172":1,"173":1,"174":1,"176":2,"177":1,"187":1,"188":2,"192":1,"193":1,"197":1}}],["nothing`",{"2":{"71":2,"73":2,"76":2}}],["nothing",{"2":{"1":34,"4":1,"6":41,"15":3,"64":4,"69":1,"71":2,"72":1,"73":2,"76":2,"88":1,"116":1,"145":9,"146":3,"150":1,"153":3,"154":2,"156":3,"162":24,"165":1,"168":60,"173":1,"177":1,"180":2,"181":6,"182":6,"183":6,"184":1,"185":32,"189":7,"191":252,"192":16,"193":20}}],["ne",{"2":{"192":2}}],["net",{"2":{"165":2}}],["never",{"2":{"151":1,"181":1}}],["nesting",{"2":{"151":2}}],["nestedloopfast",{"2":{"200":1}}],["nested",{"2":{"1":2,"4":1,"6":3,"18":1,"53":1,"150":2,"151":2,"153":2,"154":2,"180":1,"186":1}}],["neumann",{"2":{"146":1}}],["neither",{"2":{"76":1}}],["neighborhood",{"2":{"146":2}}],["neighbor",{"2":{"64":27}}],["neighboring",{"2":{"6":6,"64":1,"180":1,"181":1,"182":1,"183":2}}],["nearly",{"2":{"195":1}}],["nearest",{"2":{"64":1,"73":2}}],["neatly",{"2":{"17":1}}],["nedge",{"2":{"64":2,"189":13}}],["nextnode",{"2":{"146":27}}],["nextnodes",{"2":{"146":6}}],["next",{"2":{"63":1,"64":81,"66":3,"69":4,"116":14,"146":3,"169":13,"182":5}}],["necessarily",{"2":{"6":1,"145":1,"171":1}}],["necessary",{"2":{"6":1,"151":1,"180":1}}],["newfeature",{"2":{"156":2}}],["newnodes",{"2":{"146":2}}],["new",{"2":{"6":1,"60":1,"64":58,"66":9,"70":3,"71":1,"76":16,"116":2,"146":4,"152":1,"153":21,"154":1,"165":2,"166":1,"167":1,"169":19,"177":10,"181":1,"182":2,"183":1,"193":1,"194":1,"199":1}}],["negative",{"2":{"4":3,"6":3,"55":2,"56":1,"57":2,"84":2,"85":3}}],["needs",{"2":{"63":1}}],["needing",{"2":{"4":1,"6":1,"17":1,"170":1}}],["need",{"2":{"1":1,"3":1,"4":2,"5":1,"6":5,"32":1,"59":2,"62":1,"64":2,"71":1,"81":1,"88":4,"103":1,"104":1,"116":1,"146":2,"148":1,"153":3,"154":1,"170":1,"184":1,"185":1,"192":1,"193":2,"200":2}}],["needed",{"2":{"1":2,"6":4,"53":1,"59":1,"64":4,"66":1,"70":1,"72":1,"75":1,"85":2,"116":5,"146":1,"153":1,"154":1,"165":1,"172":3,"193":1}}],["bx",{"2":{"145":2}}],["b2y",{"2":{"73":4}}],["b2x",{"2":{"73":4}}],["b2",{"2":{"73":47,"85":3,"122":6}}],["b``",{"2":{"71":1}}],["b`",{"2":{"71":3,"73":4,"76":4}}],["bigger",{"2":{"64":1}}],["bit",{"2":{"25":1,"27":1,"184":8,"191":2}}],["b1y",{"2":{"73":7}}],["b1x",{"2":{"73":7}}],["b1",{"2":{"64":8,"73":63,"122":6}}],["breaks",{"2":{"169":1}}],["break",{"2":{"64":3,"66":1,"71":2,"88":4,"116":11,"122":1,"146":6,"169":2}}],["brevity",{"2":{"59":1}}],["broadcasting",{"2":{"6":1,"59":1}}],["broken",{"2":{"3":1,"6":1,"105":1}}],["building",{"2":{"191":1}}],["build",{"2":{"64":13,"69":1,"70":1,"72":1,"75":1,"175":2,"183":1,"184":1}}],["built",{"2":{"17":1,"20":1}}],["buffers",{"2":{"146":1}}],["buffered",{"2":{"60":2}}],["buffering",{"2":{"59":1,"60":1}}],["buffer",{"0":{"60":1},"2":{"31":2,"60":5,"63":2,"64":1,"147":1}}],["but",{"2":{"1":2,"3":5,"4":3,"6":12,"18":1,"22":1,"25":1,"27":1,"32":1,"53":1,"55":1,"56":1,"66":1,"73":2,"76":2,"81":2,"82":2,"88":4,"93":2,"116":1,"121":1,"122":5,"124":1,"125":1,"128":2,"129":1,"134":1,"145":1,"146":1,"147":1,"150":2,"151":1,"153":10,"154":3,"156":5,"158":5,"159":1,"171":1,"172":1,"177":2,"180":1,"188":2,"192":2,"193":2,"195":1,"197":1,"198":1,"199":2}}],["black",{"2":{"68":1,"192":1}}],["blue",{"2":{"14":1,"68":1,"87":2,"90":2,"107":2,"121":2,"134":2,"198":2}}],["bloat",{"2":{"193":1}}],["block",{"2":{"6":2,"191":1}}],["blob",{"2":{"6":2,"180":1}}],["balancing",{"2":{"153":1,"154":1}}],["barrier",{"2":{"153":1}}],["barycentric",{"0":{"5":1,"57":1,"59":1},"1":{"58":1,"59":1},"2":{"0":6,"5":10,"6":17,"9":1,"31":1,"57":9,"58":4,"59":52}}],["basic",{"2":{"146":1}}],["base",{"2":{"31":4,"32":1,"59":15,"60":1,"64":2,"146":6,"153":3,"154":3,"158":2,"159":1,"173":1,"176":2,"188":3}}],["based",{"2":{"4":2,"6":2,"19":1,"53":2,"56":2,"58":2,"63":1,"66":1,"85":2,"88":1,"94":1,"108":1,"116":2,"122":1,"125":1,"135":1,"159":1,"195":1,"197":1,"198":1}}],["badge",{"2":{"6":2}}],["backs",{"2":{"69":4}}],["backwards",{"2":{"64":1,"71":1,"73":1,"76":1}}],["backing",{"2":{"64":1}}],["backend",{"2":{"60":2,"188":1}}],["back",{"2":{"6":1,"18":1,"22":1,"23":1,"69":4,"188":1}}],["b",{"2":{"3":2,"4":7,"6":13,"35":2,"36":2,"37":2,"38":2,"40":2,"41":2,"42":2,"43":2,"44":2,"45":2,"46":2,"47":2,"48":2,"49":2,"64":206,"66":9,"70":26,"71":18,"72":26,"73":77,"74":3,"75":27,"76":39,"88":29,"116":2,"122":22,"194":1}}],["box",{"2":{"65":2,"66":3,"198":1}}],["bounce",{"2":{"64":8,"70":1,"71":1,"72":1,"73":1,"75":1,"76":1}}],["bouncings",{"2":{"64":1}}],["bouncing",{"2":{"64":13,"71":3,"73":4,"76":4}}],["bound",{"2":{"74":1}}],["bounding",{"2":{"64":1,"65":2,"66":3}}],["boundscheck",{"2":{"59":14}}],["bounds",{"2":{"6":1,"146":4}}],["boundaries",{"2":{"3":2,"6":2,"103":2,"107":1,"108":1,"116":2,"118":1,"119":1,"146":1}}],["boundary",{"2":{"3":7,"6":7,"84":1,"90":1,"91":1,"93":1,"94":3,"97":4,"104":2,"105":9,"108":2,"110":1,"111":6,"112":3,"116":18,"124":2,"125":4,"127":3,"128":5,"129":3,"130":3,"134":1,"135":3}}],["bold",{"2":{"60":1,"173":1,"176":1}}],["both",{"2":{"3":5,"6":6,"64":2,"73":4,"75":1,"76":1,"81":2,"84":1,"88":3,"91":1,"105":4,"108":1,"116":2,"122":1,"129":1,"135":1,"175":1,"177":1}}],["booltype",{"2":{"31":1,"153":2,"154":1,"158":1,"160":5,"177":1}}],["booleans",{"2":{"64":1,"116":2}}],["boolean",{"0":{"39":1},"1":{"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1},"2":{"24":2,"64":1,"71":1,"73":1,"76":1,"160":2,"197":1}}],["boolsastypes",{"0":{"24":1,"160":1},"2":{"31":1,"32":1,"158":1,"160":10,"177":3}}],["bools",{"2":{"10":1}}],["bool",{"2":{"3":17,"4":14,"6":40,"32":1,"64":3,"88":17,"91":1,"94":1,"104":2,"105":13,"108":1,"116":2,"119":1,"122":10,"125":2,"135":1,"145":7,"146":6,"160":2,"177":3,"189":5}}],["bypred",{"2":{"200":1}}],["by",{"0":{"98":1,"99":1,"139":1},"2":{"1":3,"3":2,"4":8,"6":29,"7":1,"17":1,"18":2,"19":1,"22":1,"24":1,"25":1,"26":1,"27":1,"52":1,"53":6,"55":1,"56":1,"59":4,"60":1,"62":5,"63":4,"64":14,"65":1,"66":6,"68":1,"69":6,"70":1,"72":1,"73":5,"75":4,"76":3,"82":2,"85":5,"88":8,"91":1,"93":1,"94":1,"98":2,"99":2,"100":1,"101":2,"103":1,"115":2,"116":10,"145":2,"146":4,"153":2,"156":7,"158":7,"166":2,"167":1,"169":3,"171":1,"172":2,"173":1,"174":1,"176":3,"177":1,"178":1,"180":1,"181":1,"182":3,"183":1,"185":1,"191":1,"192":1,"193":1,"195":1,"197":5,"198":1,"199":2,"200":1}}],["berlin",{"2":{"199":1}}],["bearing",{"2":{"145":4}}],["beauty",{"2":{"9":1}}],["better",{"2":{"105":1,"153":1,"154":1,"180":1}}],["between",{"2":{"4":4,"6":18,"23":1,"53":2,"59":13,"64":1,"66":18,"70":1,"71":4,"72":1,"73":11,"75":2,"76":4,"85":8,"88":1,"116":4,"122":4,"146":1,"158":2,"176":3,"177":1,"181":2,"182":2,"183":1,"192":1,"197":2,"198":1}}],["been",{"2":{"71":1,"146":1,"148":2,"154":1,"160":1}}],["because",{"2":{"64":1,"82":1,"148":1,"154":1,"187":1}}],["becomes",{"2":{"158":1}}],["become",{"2":{"22":1}}],["being",{"2":{"53":1,"73":1,"116":1,"122":1,"167":1}}],["behind",{"2":{"25":1,"26":1,"27":1,"58":1,"148":1,"154":1}}],["behaviours",{"2":{"32":1}}],["behaviour",{"2":{"6":1,"18":1,"23":1,"180":1}}],["best",{"2":{"19":1,"153":2,"180":1}}],["benchmarking",{"2":{"176":1,"180":1}}],["benchmarkgroup",{"2":{"176":2,"180":3}}],["benchmark",{"0":{"176":1,"180":1},"2":{"176":1,"180":1}}],["benchmarktools",{"2":{"13":1,"176":1,"180":1}}],["benchmarks",{"2":{"9":2}}],["beginning",{"2":{"66":1,"191":1}}],["begin+1",{"2":{"59":5}}],["begin",{"2":{"9":1,"59":7,"153":1,"154":1,"181":1,"195":1}}],["beware",{"2":{"6":1,"18":1,"177":1}}],["before",{"2":{"6":4,"33":1,"59":1,"70":1,"72":1,"73":1,"75":1,"180":1,"192":1}}],["below",{"2":{"6":2,"17":1,"60":1,"165":1,"182":1,"183":1,"184":1,"195":1}}],["be",{"2":{"1":7,"3":3,"4":11,"5":4,"6":59,"7":1,"9":1,"13":2,"20":3,"23":2,"24":1,"25":3,"26":1,"27":3,"32":1,"53":8,"56":7,"57":2,"58":1,"59":10,"60":2,"62":1,"63":3,"64":14,"65":1,"66":2,"69":1,"70":7,"71":4,"72":7,"73":12,"75":6,"76":5,"82":6,"84":2,"85":4,"88":15,"94":6,"103":2,"104":1,"108":6,"116":21,"122":2,"125":6,"135":6,"137":1,"138":1,"139":1,"140":1,"145":2,"146":1,"150":4,"151":2,"152":2,"153":9,"154":1,"155":1,"156":6,"158":4,"160":1,"162":1,"163":1,"164":1,"165":3,"166":4,"167":2,"169":2,"170":1,"172":3,"173":1,"174":1,"176":8,"177":3,"180":10,"182":1,"184":3,"185":1,"188":2,"191":2,"193":1,"197":4}}],["human",{"2":{"195":1}}],["hull`",{"2":{"82":2}}],["hulls",{"2":{"6":1,"77":1,"82":1}}],["hull",{"0":{"50":1,"77":1,"79":1,"80":1},"1":{"78":1,"79":1,"80":1,"81":1,"82":1},"2":{"0":1,"6":8,"31":2,"50":1,"77":2,"79":4,"80":1,"81":10,"82":15}}],["hypot",{"2":{"177":1}}],["h2",{"2":{"116":6}}],["h1",{"2":{"116":11}}],["hm",{"2":{"58":2}}],["h",{"2":{"53":2,"64":2,"76":8}}],["href=",{"2":{"6":2}}],["https",{"2":{"6":2,"70":1,"72":1,"73":1,"75":1,"82":1,"116":2,"158":1,"182":1}}],["high",{"2":{"195":1}}],["highest",{"2":{"193":1}}],["higher",{"2":{"6":1,"82":1}}],["hit",{"2":{"64":1,"153":1,"154":1,"156":3}}],["hits",{"2":{"18":1}}],["hidedecorations",{"2":{"58":2}}],["hinter",{"2":{"31":3,"60":1,"173":1,"176":1}}],["hint",{"2":{"31":3,"60":1,"176":1}}],["hinge=2",{"2":{"72":1}}],["hinge`",{"2":{"72":1}}],["hinge",{"2":{"6":1,"64":1,"73":13,"116":15}}],["hist",{"2":{"13":1}}],["histogram",{"2":{"13":1}}],["hcat",{"2":{"6":1}}],["heavily",{"2":{"153":1}}],["heatmap",{"2":{"13":5,"14":6,"58":2,"84":2,"146":1}}],["help",{"2":{"158":1,"160":1}}],["helpers",{"0":{"64":1},"2":{"105":1,"122":1}}],["helper",{"0":{"71":1,"73":1,"76":1},"2":{"63":1,"64":1,"69":1}}],["helps",{"2":{"30":1}}],["held",{"2":{"1":1,"150":1,"153":1}}],["here",{"2":{"6":2,"9":1,"13":1,"14":1,"20":1,"59":1,"73":1,"82":2,"105":1,"146":2,"153":2,"156":3,"158":1,"162":1,"176":1,"192":2,"197":5,"198":3}}],["hours",{"2":{"199":1}}],["hood",{"2":{"195":1}}],["hook",{"2":{"6":1,"180":1}}],["home",{"2":{"192":1}}],["horizontal",{"2":{"66":1,"73":1,"146":1,"180":1}}],["hormann",{"0":{"71":1,"73":1,"76":1},"2":{"6":2,"59":2,"64":3,"69":2,"70":1,"72":1,"75":1}}],["how",{"0":{"26":1},"2":{"6":1,"26":2,"55":1,"59":1,"64":1,"73":1,"88":1,"146":2,"156":2,"171":1,"180":1,"192":1,"195":1,"197":2,"198":2,"199":1,"200":1}}],["however",{"2":{"3":1,"6":2,"53":1,"59":1,"63":1,"64":1,"73":1,"81":1,"84":1,"88":1,"90":1,"104":1,"167":1}}],["hole",{"2":{"53":1,"56":3,"58":2,"59":9,"63":4,"64":60,"66":3,"70":6,"72":2,"76":15,"85":3,"97":1,"98":1,"99":1,"116":33,"146":5,"163":2,"191":1}}],["holes=",{"2":{"64":1}}],["holes",{"2":{"4":3,"5":1,"6":4,"9":2,"53":2,"55":1,"59":2,"63":1,"64":19,"69":4,"70":2,"72":2,"75":6,"76":29,"85":3,"88":3,"113":1,"116":11,"137":1,"146":17,"163":2,"191":4}}],["holds",{"2":{"64":1,"159":2,"178":1}}],["holding",{"2":{"6":1,"146":1,"153":2}}],["hold",{"2":{"6":1,"146":1,"160":1,"180":1,"195":1}}],["halign",{"2":{"180":1}}],["half",{"2":{"65":2}}],["hail",{"2":{"163":1}}],["handling",{"0":{"173":1},"2":{"148":1}}],["handler",{"2":{"60":1,"173":1}}],["handle",{"2":{"31":1,"145":1,"151":2,"153":1,"192":1}}],["handled",{"2":{"18":1}}],["hao",{"2":{"116":1}}],["had",{"2":{"70":1,"72":1,"88":1,"160":1,"175":1}}],["happens",{"2":{"64":1}}],["happen",{"2":{"24":1,"153":1}}],["havem",{"2":{"156":4}}],["havez",{"2":{"156":4}}],["have",{"2":{"3":3,"4":9,"6":15,"19":1,"23":1,"33":1,"53":2,"56":3,"59":6,"60":1,"64":4,"73":1,"82":2,"84":1,"85":2,"88":10,"116":5,"121":1,"122":3,"124":1,"125":1,"146":1,"147":1,"148":2,"152":1,"153":1,"154":2,"156":5,"158":2,"160":1,"180":1,"182":1,"188":1,"191":1,"192":1,"197":1,"198":1,"199":3}}],["hasm",{"2":{"156":2}}],["hasz",{"2":{"156":2}}],["haskey",{"2":{"153":1,"188":1}}],["hash",{"2":{"146":1}}],["hasn",{"2":{"146":1}}],["hassle",{"2":{"1":1,"6":1,"185":1}}],["has",{"2":{"1":4,"52":1,"55":2,"59":2,"64":2,"71":2,"73":1,"76":1,"84":1,"85":1,"88":11,"127":1,"145":1,"150":4,"153":6,"161":1,"175":2,"184":1,"192":1}}],["xticklabelsvisible",{"2":{"192":1}}],["xticklabelrotation",{"2":{"13":2}}],["xoffset",{"2":{"191":4,"193":1}}],["x=x",{"2":{"189":1}}],["x`",{"2":{"153":1}}],["xvec",{"2":{"146":4}}],["xbounds",{"2":{"146":4}}],["xhalf",{"2":{"146":2}}],["xlast",{"2":{"85":3}}],["xfirst",{"2":{"85":5}}],["x0",{"2":{"85":5}}],["xn",{"2":{"66":4}}],["xind+1",{"2":{"146":1}}],["xind",{"2":{"146":2}}],["xinterior",{"2":{"63":2}}],["xi−xi−1",{"2":{"6":1}}],["xcentroid",{"2":{"63":13}}],["xrange",{"2":{"58":3,"84":2}}],["xautolimits",{"2":{"58":2}}],["xp2",{"2":{"53":5}}],["x26",{"2":{"53":2,"56":6,"59":1,"60":4,"64":58,"66":36,"70":4,"71":4,"73":24,"76":2,"85":3,"88":14,"100":2,"101":2,"105":48,"114":2,"115":2,"116":170,"122":22,"127":2,"131":2,"132":2,"141":2,"142":2,"145":4,"146":12,"153":2,"165":2,"169":6,"173":2,"176":2,"182":10,"183":2,"189":4,"197":4}}],["x2",{"2":{"6":3,"59":4,"63":2,"66":18,"85":8,"105":10,"116":5,"122":4,"146":5,"177":6,"189":2}}],["x1",{"2":{"6":4,"59":3,"63":2,"66":22,"85":8,"105":11,"116":6,"122":5,"146":5,"177":7,"189":2}}],["xs",{"2":{"6":3,"66":4,"146":30,"189":4}}],["xmax",{"2":{"6":1,"65":2,"66":48}}],["xmin",{"2":{"6":1,"65":2,"66":49}}],["x3c",{"2":{"5":1,"6":28,"31":1,"53":4,"56":2,"59":66,"64":17,"66":11,"69":3,"70":1,"72":1,"73":6,"75":1,"84":1,"85":13,"88":2,"105":33,"116":13,"122":10,"145":1,"146":4,"153":3,"154":2,"156":19,"158":3,"159":4,"160":4,"163":2,"166":3,"169":5,"176":2,"181":2,"182":6,"183":3,"184":9,"200":1}}],["xy`",{"2":{"172":1}}],["xy",{"2":{"1":4,"59":1,"172":3}}],["x",{"2":{"1":4,"4":1,"6":3,"7":1,"9":5,"11":6,"13":11,"14":10,"15":4,"50":2,"53":9,"56":2,"58":8,"62":1,"63":10,"64":21,"65":1,"66":8,"69":6,"71":9,"73":18,"76":9,"84":2,"85":7,"88":3,"105":21,"116":16,"122":7,"145":11,"146":2,"148":2,"150":3,"153":5,"154":4,"156":10,"160":5,"165":2,"170":2,"171":4,"172":1,"177":2,"180":2,"182":2,"184":1,"185":2,"186":2,"189":33,"191":6,"192":2,"193":2,"197":1,"199":2}}],["=>",{"2":{"153":2}}],["=float64",{"2":{"63":3,"72":1,"75":1}}],["=false",{"2":{"53":1}}],["===",{"2":{"105":8,"145":4}}],["==",{"2":{"9":1,"19":1,"32":1,"53":4,"56":2,"59":9,"60":2,"63":1,"64":34,"66":30,"71":1,"73":20,"75":2,"76":1,"80":1,"84":1,"88":16,"116":44,"122":2,"145":3,"146":18,"153":2,"156":4,"163":1,"165":1,"169":1,"173":1,"176":2,"180":1,"184":3}}],["=",{"2":{"1":5,"3":17,"4":7,"5":2,"6":59,"11":1,"13":19,"14":33,"15":18,"31":4,"32":7,"35":2,"36":2,"37":2,"38":2,"50":3,"52":4,"53":56,"55":6,"56":25,"58":35,"59":110,"60":3,"62":6,"63":36,"64":324,"65":6,"66":96,"68":7,"69":29,"70":21,"71":30,"72":18,"73":143,"75":21,"76":78,"79":6,"80":4,"81":14,"82":4,"84":15,"85":52,"87":7,"88":40,"90":7,"91":3,"93":4,"94":23,"95":3,"96":7,"97":14,"98":14,"99":4,"100":2,"101":2,"103":5,"104":3,"105":57,"107":7,"108":18,"109":3,"110":11,"111":17,"112":9,"113":3,"114":2,"115":2,"116":189,"118":3,"119":3,"121":7,"122":40,"124":3,"125":22,"126":3,"127":9,"128":14,"129":10,"130":6,"131":2,"132":2,"134":7,"135":22,"136":3,"137":11,"138":14,"139":14,"140":4,"141":2,"142":2,"145":32,"146":110,"148":1,"150":3,"153":40,"154":20,"155":4,"156":45,"158":3,"159":6,"160":2,"162":2,"163":4,"165":9,"168":3,"169":30,"170":1,"173":2,"175":16,"176":21,"177":25,"178":2,"179":5,"180":60,"181":11,"182":49,"183":7,"184":43,"185":2,"186":1,"188":3,"189":42,"191":45,"192":19,"193":13,"194":3,"195":4,"196":7,"198":12,"199":6,"200":2}}],["utm",{"2":{"192":1}}],["utility",{"0":{"189":1},"2":{"59":1,"153":1,"154":1}}],["utils",{"0":{"184":1},"2":{"31":1}}],["u2",{"2":{"116":4}}],["u1",{"2":{"116":4}}],["update",{"2":{"64":6,"146":10}}],["updated",{"2":{"64":6,"156":3}}],["updates",{"2":{"59":1}}],["up",{"2":{"64":2,"73":1,"116":1,"129":1,"151":1,"168":1,"182":2,"191":2}}],["upper",{"2":{"6":1,"146":1,"198":1}}],["uv",{"2":{"59":1}}],["usage",{"2":{"199":1}}],["usable",{"2":{"157":1}}],["usa",{"0":{"80":1},"2":{"80":4,"180":15,"199":3}}],["us",{"2":{"56":1,"82":1,"192":1,"199":1}}],["usually",{"2":{"26":2,"77":1,"153":1,"156":2,"158":1,"195":1}}],["usual",{"2":{"6":1,"163":1,"166":1}}],["usecases",{"2":{"25":1,"27":1}}],["uses",{"2":{"6":3,"77":1,"82":1,"116":1,"157":1,"158":1,"172":1,"176":1,"177":1,"180":1,"195":1}}],["users",{"2":{"31":1,"148":1,"167":1}}],["user",{"2":{"6":12,"23":1,"63":1,"70":3,"72":3,"75":3,"153":1,"181":1,"182":1,"183":1,"197":1}}],["useful",{"2":{"6":10,"59":1,"146":1,"174":1,"177":1,"180":2,"188":1}}],["used",{"2":{"1":1,"5":1,"6":4,"53":1,"56":1,"57":1,"59":1,"63":2,"64":7,"66":1,"69":1,"73":1,"84":1,"85":1,"88":1,"122":1,"146":2,"150":1,"153":1,"154":1,"156":2,"158":1,"159":1,"161":1,"180":1,"182":2,"187":2,"192":1,"195":1,"197":2,"198":1}}],["use",{"2":{"1":2,"4":1,"5":1,"6":9,"11":1,"20":1,"23":1,"26":1,"59":1,"64":1,"76":1,"82":2,"105":2,"122":1,"146":1,"147":1,"150":1,"153":4,"154":3,"155":1,"158":2,"163":1,"171":1,"175":1,"177":2,"180":1,"182":2,"188":3,"191":1,"195":1,"197":2,"200":2}}],["using",{"0":{"192":1},"2":{"1":4,"4":1,"5":3,"6":11,"11":4,"13":4,"14":1,"15":1,"31":6,"32":1,"50":1,"52":1,"53":1,"55":2,"56":2,"58":4,"59":7,"60":3,"62":2,"63":1,"64":5,"65":2,"66":1,"68":2,"69":1,"71":3,"73":4,"74":1,"76":3,"79":1,"80":2,"81":1,"82":2,"84":2,"85":2,"87":2,"88":1,"90":2,"91":1,"93":2,"94":1,"101":1,"103":2,"104":1,"105":1,"107":2,"108":1,"115":1,"116":1,"118":2,"119":1,"121":2,"122":1,"124":2,"125":1,"132":1,"134":2,"135":1,"142":1,"145":1,"146":5,"147":1,"148":2,"150":1,"151":1,"153":4,"154":2,"155":1,"156":1,"160":1,"163":1,"166":1,"169":1,"170":2,"171":1,"172":1,"173":3,"175":1,"176":5,"177":1,"180":3,"182":1,"184":1,"185":4,"186":2,"188":2,"189":1,"190":4,"191":1,"193":1,"194":2,"196":1,"197":1,"198":4,"199":2}}],["until",{"2":{"146":3,"151":1,"182":1,"188":1}}],["unprocessed",{"2":{"64":1}}],["unknown",{"2":{"64":4,"66":15}}],["unknown=3",{"2":{"64":1}}],["unmatched",{"2":{"64":9,"66":26}}],["understand",{"2":{"187":1}}],["under",{"2":{"56":2,"195":1}}],["undergrad",{"2":{"9":1}}],["undef",{"2":{"53":2,"64":1,"181":1,"182":1,"184":2,"189":2}}],["unwrap",{"0":{"156":1},"2":{"31":2,"156":19}}],["unless",{"2":{"22":1,"64":1,"71":2,"73":2,"76":2,"153":1}}],["unlike",{"2":{"18":1,"187":1}}],["unstable",{"2":{"13":1,"153":1,"160":1}}],["unneeded",{"2":{"6":3,"64":1,"70":2,"72":2,"75":2}}],["unnecessary",{"2":{"6":3,"146":1,"181":1,"182":1,"183":1}}],["universal",{"2":{"192":1}}],["united",{"2":{"180":1}}],["unit",{"2":{"158":1}}],["units",{"2":{"6":2,"177":2}}],["unify",{"2":{"25":1,"27":1}}],["unique",{"2":{"6":2,"73":3,"166":2,"169":2}}],["unioning",{"2":{"76":1}}],["unionintersectingpolygons",{"2":{"0":1,"6":8,"70":1,"71":2,"72":1,"73":2,"75":1,"76":2,"166":2,"167":2,"168":1,"169":4}}],["unions",{"0":{"76":1},"2":{"18":1,"159":1}}],["union",{"0":{"36":1,"75":1},"2":{"0":1,"1":2,"3":2,"4":4,"6":18,"11":3,"23":2,"31":1,"32":1,"36":2,"53":2,"56":1,"59":1,"63":4,"64":7,"66":1,"72":2,"75":18,"76":30,"85":1,"88":8,"96":2,"97":4,"98":1,"100":2,"101":1,"110":2,"111":6,"114":2,"115":1,"122":4,"127":2,"128":4,"129":1,"131":2,"132":1,"137":2,"138":4,"139":1,"141":2,"142":1,"145":1,"146":5,"148":1,"150":2,"151":3,"153":3,"154":3,"159":4,"166":1,"167":1,"169":9,"177":5,"180":2,"181":3,"182":3,"183":3,"189":1}}],["unchanged",{"2":{"1":1,"6":1,"150":1,"153":1,"180":1}}],["gdal",{"2":{"195":1}}],["gml",{"2":{"195":1}}],["gpkg",{"2":{"195":3}}],["gadm",{"2":{"199":4}}],["ga",{"2":{"192":3,"196":2}}],["gaps",{"2":{"146":1}}],["global",{"2":{"192":1}}],["globally",{"2":{"154":1,"158":1}}],["gft",{"2":{"190":1,"192":2}}],["gc",{"2":{"165":6}}],["g",{"2":{"53":3,"56":3,"60":1,"63":3,"66":3,"85":6,"151":1,"153":2,"156":4,"158":1,"180":2,"189":2,"195":1}}],["gb",{"2":{"31":1}}],["guarantee",{"2":{"19":1,"30":1}}],["guaranteed",{"2":{"1":1,"53":1,"150":1,"154":1}}],["grows",{"2":{"158":1}}],["grouped",{"2":{"191":1}}],["groups",{"2":{"6":1,"146":1}}],["grouping",{"2":{"1":1,"150":1,"154":3}}],["grand",{"2":{"199":1}}],["grained",{"2":{"175":1}}],["grahamscanmethod",{"2":{"82":1}}],["graphics",{"2":{"6":1,"59":1}}],["great",{"2":{"191":1,"193":1,"195":1}}],["greater",{"2":{"145":1}}],["greiner",{"0":{"71":1,"73":1,"76":1},"2":{"64":3,"69":2,"70":1,"72":1,"75":1}}],["green",{"2":{"14":1,"192":1}}],["grid",{"2":{"6":1,"58":1,"66":4}}],["g2",{"2":{"3":5,"6":5,"91":4,"94":12,"95":6,"96":9,"97":6,"98":6,"99":3,"100":4,"101":2,"104":3,"105":21,"108":10,"109":6,"110":10,"111":8,"112":4,"113":2,"114":4,"115":2,"125":10,"126":6,"127":10,"128":6,"129":5,"130":4,"131":4,"132":2,"135":10,"136":6,"137":9,"138":6,"139":6,"140":3,"141":4,"142":2}}],["g1",{"2":{"3":5,"4":1,"6":6,"91":4,"94":12,"95":6,"96":9,"97":6,"98":6,"99":3,"100":2,"101":4,"104":3,"105":21,"108":9,"109":6,"110":10,"111":8,"112":4,"113":2,"114":2,"115":4,"125":10,"126":6,"127":9,"128":6,"129":5,"130":4,"131":2,"132":4,"135":10,"136":6,"137":9,"138":6,"139":6,"140":3,"141":2,"142":4}}],["generic",{"2":{"22":1,"177":1}}],["generation",{"2":{"180":2}}],["generated",{"2":{"31":1,"32":1,"50":1,"53":1,"56":1,"59":1,"60":1,"63":1,"64":1,"66":1,"69":1,"71":1,"73":1,"74":1,"76":1,"82":1,"85":1,"88":1,"91":1,"101":1,"104":1,"105":1,"115":1,"116":1,"119":1,"122":1,"132":1,"142":1,"145":1,"146":1,"147":1,"153":1,"154":1,"155":1,"156":1,"160":1,"163":1,"166":1,"169":1,"170":1,"171":1,"173":1,"177":1,"180":1,"184":1,"185":1,"186":1,"188":1,"189":1,"198":1}}],["generate",{"2":{"7":1,"13":2,"180":1,"198":2}}],["generalization",{"2":{"57":1}}],["generalized",{"2":{"6":1,"57":3,"59":1}}],["generalise",{"2":{"6":4,"180":1}}],["generally",{"2":{"6":2,"158":2,"188":3}}],["general",{"0":{"2":1,"4":1},"1":{"3":1,"4":1},"2":{"18":1,"20":1,"25":1,"27":1,"148":1,"154":1,"173":1}}],["getfeature",{"2":{"153":1,"154":1,"156":3,"189":5}}],["getcolumn",{"2":{"153":2,"154":2,"156":1}}],["getgeom",{"2":{"100":1,"101":1,"114":1,"115":1,"122":2,"131":1,"132":1,"141":1,"142":1,"153":3,"154":2,"156":3,"180":3,"189":6}}],["getring",{"2":{"64":1}}],["getindex",{"2":{"59":2}}],["gethole",{"2":{"53":1,"56":1,"63":1,"64":4,"66":1,"69":1,"70":2,"72":2,"76":6,"85":1,"88":2,"116":5,"163":1,"191":1}}],["getexterior",{"2":{"53":1,"56":1,"59":1,"63":1,"64":3,"66":1,"69":1,"70":2,"72":2,"75":3,"76":6,"85":1,"88":2,"116":5,"145":1,"146":1,"163":1,"191":1}}],["getpolygon",{"2":{"71":3,"73":2,"76":2,"88":3}}],["getpoint",{"2":{"52":1,"53":5,"55":2,"56":1,"59":1,"62":1,"63":6,"64":3,"65":2,"66":3,"68":3,"84":1,"85":6,"87":4,"88":13,"90":4,"93":1,"103":1,"105":7,"107":4,"116":28,"118":2,"121":4,"122":2,"124":2,"127":2,"134":4,"145":5,"163":3,"175":4,"177":2,"184":1,"189":3,"191":2}}],["getproperty",{"2":{"13":2,"14":1}}],["get",{"2":{"6":1,"13":1,"32":1,"55":1,"60":1,"64":9,"70":1,"71":1,"72":1,"73":2,"75":2,"82":2,"146":4,"153":3,"154":1,"173":1,"176":3,"180":1,"181":1,"183":1,"184":2,"188":5,"189":1,"191":2,"199":2}}],["geoparquet",{"2":{"195":4}}],["geopoly1",{"2":{"193":1,"194":1}}],["geopoly2",{"2":{"193":1,"194":1}}],["geoaxis",{"2":{"192":4,"196":1}}],["geographic",{"2":{"158":1,"192":1,"195":1}}],["geographiclib",{"2":{"6":1,"176":1}}],["geointeface",{"2":{"151":1}}],["geointerace",{"2":{"22":1}}],["geointerfacemakie",{"2":{"179":1,"198":1,"199":1}}],["geointerface",{"0":{"30":1},"2":{"1":20,"3":9,"4":2,"6":35,"11":1,"13":1,"14":1,"15":1,"22":3,"25":1,"27":1,"30":1,"31":7,"52":1,"53":1,"55":1,"56":1,"59":23,"62":1,"63":1,"64":1,"65":1,"66":1,"68":1,"69":1,"70":1,"72":1,"73":1,"75":1,"79":1,"80":1,"81":1,"84":1,"85":11,"87":1,"88":2,"90":1,"91":2,"93":1,"94":2,"103":1,"104":2,"105":1,"107":1,"108":3,"118":1,"119":2,"121":1,"122":2,"124":1,"125":2,"134":1,"135":2,"145":5,"146":1,"150":3,"151":3,"153":11,"156":5,"162":9,"165":1,"166":1,"168":23,"170":1,"172":2,"175":1,"176":1,"179":1,"180":2,"185":13,"186":1,"189":1,"190":1,"191":122,"192":5,"193":9,"196":1,"198":1,"199":1}}],["geo",{"2":{"146":1,"176":4,"192":2}}],["geotable",{"2":{"29":1}}],["geojson",{"2":{"11":1,"180":2,"190":1,"192":4,"195":3}}],["geodataframes",{"2":{"195":3}}],["geodesy",{"2":{"158":1}}],["geodesic`",{"2":{"176":2}}],["geodesic",{"0":{"196":1},"2":{"6":7,"31":3,"158":6,"175":6,"176":8,"177":3,"196":1}}],["geodesicsegments",{"2":{"0":1,"6":1,"174":1,"175":3,"176":6,"177":1,"196":1}}],["geod",{"2":{"6":2,"176":3}}],["geoformattypes",{"2":{"1":2,"172":2,"190":1,"192":2,"193":8}}],["geomakie",{"0":{"192":1},"2":{"190":2,"192":5,"196":2}}],["geomtype",{"2":{"153":2,"156":1}}],["geoms",{"2":{"50":3,"82":1,"116":1,"153":12,"156":14}}],["geomfromgeos",{"2":{"32":1,"176":1}}],["geom2",{"2":{"3":8,"4":1,"6":9,"85":6,"88":1,"105":6,"108":1,"119":3,"122":6,"125":1,"135":2}}],["geom1",{"2":{"3":8,"4":1,"6":9,"85":6,"88":1,"105":4,"108":1,"119":3,"122":6,"125":1,"135":2}}],["geometrical",{"2":{"197":1}}],["geometric",{"2":{"25":2,"27":2,"62":1,"158":1}}],["geometries",{"0":{"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"191":1,"192":1,"193":1},"2":{"1":6,"3":8,"4":14,"6":55,"18":3,"20":1,"22":3,"25":2,"27":2,"29":4,"52":1,"53":3,"56":4,"63":1,"66":2,"69":1,"70":5,"72":5,"73":4,"75":5,"82":6,"84":1,"85":4,"87":1,"88":7,"91":1,"93":1,"94":1,"105":2,"108":2,"116":1,"118":1,"119":1,"121":2,"122":3,"124":2,"125":2,"135":2,"137":1,"148":1,"150":3,"152":2,"153":6,"154":3,"155":1,"156":11,"170":1,"172":2,"174":3,"175":1,"176":4,"177":1,"178":1,"181":1,"182":1,"183":1,"186":1,"189":1,"190":5,"192":1,"193":2,"194":2,"195":1,"197":5,"198":1,"200":1}}],["geometry=",{"2":{"194":1}}],["geometrybasics",{"2":{"31":3,"58":2,"59":10,"82":1,"84":1,"94":1,"125":1,"135":1}}],["geometrycolumns",{"2":{"153":5,"154":2,"156":1}}],["geometrycollections",{"2":{"197":1}}],["geometrycollectiontrait",{"2":{"23":1,"32":1,"100":1,"101":1,"114":1,"115":1,"131":1,"132":1,"141":1,"142":1}}],["geometrycollection",{"2":{"6":1,"23":1,"199":1}}],["geometrycorrections",{"2":{"165":1}}],["geometrycorrection",{"2":{"0":1,"6":11,"163":2,"164":2,"165":13,"166":11,"169":4}}],["geometry",{"0":{"2":1,"72":1,"100":2,"101":2,"114":2,"115":2,"131":2,"132":2,"141":2,"142":2,"164":1,"172":1,"178":1,"190":1,"194":1},"1":{"3":1,"4":1,"165":1,"166":1,"173":1,"179":1,"180":1,"191":1,"192":1,"193":1,"194":1,"195":1},"2":{"1":10,"3":24,"4":12,"6":67,"9":1,"11":2,"18":4,"20":1,"23":3,"29":1,"31":1,"53":7,"56":4,"60":4,"63":3,"65":1,"66":4,"69":4,"80":1,"84":4,"85":6,"88":8,"90":5,"91":2,"93":4,"94":5,"95":4,"96":1,"100":3,"101":4,"103":4,"104":4,"105":3,"107":2,"108":5,"109":4,"110":2,"111":2,"114":3,"115":4,"116":2,"118":2,"122":3,"124":3,"125":4,"126":4,"127":2,"131":3,"132":4,"134":4,"135":5,"136":4,"141":3,"142":4,"144":1,"148":4,"150":3,"151":2,"153":28,"154":12,"156":10,"158":5,"162":1,"163":1,"164":2,"165":23,"166":6,"170":1,"171":1,"172":6,"174":3,"175":1,"176":5,"177":10,"180":6,"189":6,"191":1,"192":1,"193":4,"194":2,"195":2,"197":1,"198":7,"199":4,"200":2}}],["geometryopsprojext",{"2":{"172":1,"173":1,"176":1,"177":1}}],["geometryopslibgeosext",{"2":{"60":1}}],["geometryopscore",{"2":{"0":2,"1":2,"31":2,"150":2,"156":4}}],["geometryops",{"0":{"0":1,"25":1,"31":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1},"2":{"0":105,"1":4,"3":18,"4":9,"5":3,"6":106,"7":2,"11":1,"13":1,"14":1,"15":1,"17":2,"25":1,"26":4,"27":1,"31":1,"32":2,"52":1,"55":1,"58":5,"60":1,"62":1,"65":1,"68":1,"69":1,"70":1,"72":1,"73":1,"75":1,"77":1,"79":1,"80":1,"81":3,"84":1,"87":1,"88":1,"90":1,"91":2,"93":1,"94":2,"103":1,"104":2,"105":2,"107":1,"108":2,"118":1,"119":1,"121":1,"122":1,"124":1,"125":2,"134":1,"135":2,"145":3,"146":2,"150":1,"153":1,"157":2,"158":1,"162":1,"165":1,"166":4,"168":1,"173":1,"175":1,"176":2,"179":1,"180":2,"185":1,"187":1,"188":2,"189":1,"190":1,"191":3,"196":1,"197":1,"198":2,"199":2}}],["geom",{"2":{"1":7,"4":21,"6":41,"18":3,"31":12,"32":10,"35":5,"36":5,"37":5,"38":5,"40":4,"41":4,"42":4,"43":4,"44":4,"45":4,"46":4,"47":4,"48":4,"49":4,"53":25,"56":17,"63":28,"64":16,"66":6,"69":15,"70":8,"71":2,"72":12,"73":10,"75":9,"76":9,"85":28,"88":45,"94":4,"105":1,"108":4,"116":3,"122":1,"125":4,"135":4,"145":3,"146":1,"148":2,"150":4,"153":34,"154":13,"156":51,"169":11,"171":4,"177":24,"180":36,"184":3,"185":7,"186":4,"189":13,"199":6}}],["geospatial",{"0":{"193":1,"195":1},"2":{"190":5,"192":1,"193":3,"195":5}}],["geoscontext",{"2":{"176":1}}],["geosdensify",{"2":{"32":2,"176":3}}],["geos",{"0":{"188":1},"2":{"0":1,"6":6,"32":8,"33":1,"35":1,"36":1,"37":1,"38":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"60":4,"77":1,"81":4,"82":1,"158":1,"178":5,"180":2,"187":1,"188":12}}],["got",{"2":{"184":3}}],["goes",{"2":{"6":2,"145":2}}],["good",{"2":{"6":1,"59":1,"188":2,"193":1}}],["going",{"2":{"4":4,"6":5,"66":2,"81":1,"88":5,"145":1,"146":1,"190":1}}],["go",{"2":{"1":5,"3":17,"4":2,"6":40,"11":9,"13":1,"14":1,"15":6,"18":1,"31":2,"32":5,"35":1,"36":1,"37":1,"38":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":2,"52":1,"55":1,"59":1,"62":2,"65":1,"68":2,"69":2,"70":2,"72":2,"73":2,"75":2,"79":3,"80":2,"81":8,"82":2,"84":6,"87":1,"88":2,"90":2,"91":2,"93":1,"94":2,"103":2,"104":2,"105":1,"107":1,"108":2,"118":1,"119":2,"121":1,"122":2,"124":1,"125":2,"134":2,"135":2,"145":6,"146":2,"148":1,"150":2,"153":2,"156":2,"162":3,"168":3,"175":7,"176":8,"179":2,"180":49,"185":3,"188":1,"189":2,"190":1,"191":3,"193":1,"195":1,"196":3,"197":9,"198":2,"199":5,"200":1}}],["gtrait",{"2":{"85":2}}],["gt",{"2":{"1":1,"6":1,"9":2,"10":1,"11":5,"64":3,"145":3,"150":1}}],["gif",{"2":{"182":1}}],["gives",{"2":{"199":1}}],["give",{"2":{"116":1,"195":1}}],["given",{"2":{"4":7,"6":21,"18":2,"29":1,"52":1,"53":1,"56":2,"63":3,"64":8,"66":3,"69":5,"70":1,"71":2,"72":1,"73":2,"75":1,"76":2,"85":8,"88":4,"90":1,"91":1,"94":1,"103":1,"104":1,"108":1,"116":7,"118":1,"119":1,"125":1,"127":1,"135":1,"148":1,"154":1,"165":4,"166":1,"168":1,"174":2,"176":2,"177":2,"183":1}}],["github",{"2":{"6":2,"82":1,"158":1}}],["gis",{"2":{"5":1,"6":1,"25":1,"27":1,"59":1}}],["gi",{"2":{"1":13,"3":42,"4":31,"6":108,"11":8,"13":15,"14":15,"15":8,"18":2,"31":1,"32":12,"35":3,"36":3,"37":3,"38":3,"40":2,"41":2,"42":2,"43":2,"44":2,"45":2,"46":2,"47":2,"48":2,"49":2,"50":3,"52":3,"53":30,"55":5,"56":21,"58":1,"62":5,"63":38,"64":34,"65":5,"66":17,"68":6,"69":13,"70":19,"71":16,"72":25,"73":24,"75":17,"76":36,"79":1,"80":1,"81":3,"82":4,"84":8,"85":42,"87":7,"88":99,"90":7,"91":3,"93":3,"94":4,"95":6,"96":12,"97":10,"98":7,"99":4,"100":8,"101":6,"103":3,"104":3,"105":21,"107":7,"108":2,"109":3,"110":12,"111":14,"112":4,"113":2,"114":8,"115":6,"116":59,"118":5,"119":3,"121":7,"122":51,"124":5,"125":3,"126":6,"127":15,"128":10,"129":7,"130":4,"131":8,"132":6,"134":7,"135":2,"136":6,"137":12,"138":10,"139":7,"140":4,"141":8,"142":6,"145":32,"146":15,"148":4,"150":9,"153":42,"154":25,"156":57,"159":9,"162":2,"163":10,"165":9,"168":3,"169":8,"170":1,"171":5,"175":6,"176":6,"177":13,"179":2,"180":34,"184":4,"185":9,"186":5,"189":55,"190":1,"191":21,"192":2,"193":2,"196":2,"198":5,"199":2}}],["t8vkb",{"2":{"192":1}}],["ty",{"2":{"146":3}}],["typing",{"2":{"60":1,"173":1,"176":1}}],["typically",{"2":{"57":1,"194":1}}],["typemax",{"2":{"85":1,"146":9}}],["typeof",{"2":{"19":1,"59":3,"153":2,"156":1,"159":1,"177":1,"200":1}}],["type=",{"2":{"6":2}}],["type2",{"2":{"6":2,"88":4}}],["type1",{"2":{"6":2,"88":5}}],["types",{"0":{"157":1,"187":1},"1":{"158":1,"159":1,"160":1,"188":1},"2":{"6":4,"23":1,"24":1,"31":1,"59":3,"66":1,"69":1,"116":3,"157":1,"160":1,"180":1,"187":3,"197":1}}],["type",{"2":{"4":11,"5":1,"6":40,"11":1,"22":2,"23":1,"24":2,"30":2,"53":9,"56":11,"58":1,"59":8,"63":8,"64":21,"66":8,"69":6,"70":7,"71":6,"72":8,"73":19,"75":7,"76":5,"85":28,"88":2,"153":5,"156":41,"158":2,"159":3,"160":6,"164":1,"165":5,"166":2,"171":1,"176":1,"177":1,"180":3,"186":1,"188":1,"189":3,"196":1}}],["tx",{"2":{"146":3}}],["tᵢ",{"2":{"59":1}}],["tutorial",{"2":{"190":1,"197":1}}],["tutorials",{"2":{"26":2}}],["tups",{"2":{"163":4}}],["tuplepoint",{"2":{"31":3,"189":1}}],["tuple",{"0":{"186":1},"2":{"4":1,"6":19,"31":2,"59":2,"63":3,"64":5,"66":3,"69":1,"73":31,"116":17,"145":2,"146":5,"153":2,"162":6,"168":13,"175":1,"180":2,"182":1,"184":2,"189":6,"191":99,"198":2}}],["tuples",{"2":{"0":1,"6":2,"31":1,"60":1,"63":1,"64":1,"69":1,"70":3,"71":1,"72":2,"73":1,"75":4,"76":5,"82":2,"163":2,"169":2,"180":2,"186":2,"199":2}}],["turf",{"2":{"145":1}}],["turned",{"2":{"146":1,"153":1}}],["turning",{"2":{"146":8}}],["turn",{"2":{"6":1,"146":1}}],["temporary",{"2":{"64":1}}],["term",{"2":{"56":1}}],["terms",{"2":{"6":1,"59":1}}],["teach",{"2":{"26":1}}],["technically",{"2":{"23":1,"161":1}}],["technique",{"2":{"11":1}}],["tell",{"2":{"18":1,"116":1,"160":1,"200":1}}],["test",{"2":{"64":1,"180":2,"188":1}}],["testing",{"0":{"15":1}}],["tests",{"2":{"9":2}}],["text=",{"2":{"6":2}}],["t2",{"2":{"6":5,"59":47,"95":1,"105":2,"126":1,"136":1}}],["t1",{"2":{"6":6,"59":51,"105":2}}],["t=float64",{"2":{"4":1,"6":3,"63":3}}],["two",{"2":{"3":5,"4":10,"6":23,"23":2,"53":2,"55":1,"59":1,"63":1,"64":6,"66":3,"70":2,"72":1,"73":14,"75":4,"76":3,"85":5,"87":3,"88":12,"90":2,"91":1,"93":1,"103":1,"104":1,"105":1,"107":1,"116":2,"118":2,"119":2,"121":4,"122":5,"124":3,"125":1,"134":2,"146":3,"165":2,"166":1,"168":2,"169":2,"175":1,"188":1,"191":1,"197":3,"198":3}}],["task",{"2":{"153":3,"154":3}}],["tasks",{"2":{"153":5,"154":5}}],["taskrange",{"2":{"153":5,"154":5}}],["tags",{"2":{"64":4}}],["taget",{"2":{"6":2}}],["taylor",{"2":{"6":1,"59":1}}],["table2",{"2":{"197":4}}],["table1",{"2":{"197":12}}],["tables",{"2":{"22":4,"31":1,"153":6,"154":5,"156":2}}],["table",{"0":{"194":1},"2":{"6":2,"18":1,"29":2,"153":13,"154":4,"177":1,"180":1,"194":1,"195":1,"197":2}}],["taking",{"2":{"6":3,"63":1,"70":1,"71":1,"72":1,"73":1,"75":1,"76":1,"167":1}}],["takes",{"2":{"64":3,"197":1}}],["taken",{"2":{"20":1,"58":1}}],["take",{"2":{"1":1,"6":2,"29":1,"64":3,"70":1,"71":1,"72":1,"73":1,"76":1,"145":2,"146":2,"148":1,"154":1,"172":1}}],["target=gi",{"2":{"64":1}}],["target=nothing",{"2":{"35":1,"36":1,"37":1,"38":1,"70":1,"72":1,"75":1}}],["targets",{"2":{"23":1,"53":2,"56":3,"66":3,"85":3}}],["target",{"0":{"23":1},"2":{"1":14,"6":11,"15":3,"22":2,"23":2,"32":1,"59":1,"63":2,"64":1,"70":5,"71":11,"72":6,"73":10,"75":4,"76":13,"146":1,"148":1,"150":8,"151":5,"152":1,"153":34,"154":33,"156":87,"159":3,"169":2,"172":3,"180":2}}],["tilted",{"2":{"66":1}}],["tie",{"2":{"53":1}}],["timings",{"2":{"13":5}}],["timing",{"2":{"13":2}}],["times",{"2":{"4":1,"6":1,"170":1}}],["time",{"2":{"1":5,"13":3,"24":1,"58":1,"146":1,"158":1,"172":4,"188":1,"191":1,"192":1,"193":2,"198":1,"199":1}}],["title",{"2":{"13":2,"58":2,"81":2,"146":1,"176":1,"180":2}}],["tip",{"2":{"1":1,"5":1,"6":1,"59":1,"172":1,"197":1}}],["tree",{"2":{"197":1}}],["treating",{"2":{"180":1}}],["treated",{"2":{"116":5,"191":1}}],["treats",{"2":{"56":1,"85":1}}],["trials",{"2":{"176":2,"180":2}}],["triangles",{"2":{"57":1}}],["triangle",{"2":{"6":1,"57":4,"183":4,"198":1}}],["triangulation",{"2":{"6":1,"31":1,"82":1}}],["trivially",{"2":{"148":1}}],["try",{"2":{"74":3,"146":1,"151":1,"153":3,"154":3,"156":3,"199":1}}],["tr",{"2":{"56":3}}],["trues",{"2":{"169":3}}],["true",{"0":{"24":1},"2":{"1":5,"3":25,"4":3,"6":40,"31":1,"53":7,"56":1,"58":2,"60":1,"64":30,"66":6,"69":1,"70":1,"71":2,"72":1,"73":1,"75":2,"76":3,"85":4,"88":21,"90":1,"91":1,"93":2,"94":6,"96":1,"97":1,"98":4,"100":1,"101":1,"103":2,"104":1,"105":9,"107":2,"108":2,"110":1,"111":1,"112":3,"114":1,"115":1,"116":78,"118":3,"119":1,"121":2,"122":18,"124":2,"125":6,"128":1,"129":1,"131":1,"132":1,"134":2,"135":7,"137":1,"138":1,"139":4,"141":1,"142":1,"145":4,"146":5,"150":2,"153":6,"154":2,"156":2,"158":1,"160":3,"169":1,"173":1,"176":1,"180":1,"197":1,"200":1}}],["traditional",{"2":{"146":1,"158":1}}],["traverse",{"2":{"64":1}}],["traced",{"2":{"64":1}}],["traces",{"2":{"64":1}}],["trace",{"2":{"64":2,"70":1,"72":1,"75":1}}],["track",{"2":{"64":3,"169":2}}],["tracing",{"2":{"6":1,"64":4,"66":1,"71":5,"73":2,"76":2}}],["transverse",{"2":{"192":1}}],["translate",{"2":{"58":2}}],["translation",{"2":{"1":2,"6":2,"180":2,"185":2,"191":3,"193":1}}],["transformations",{"2":{"31":10}}],["transformation",{"0":{"185":1},"2":{"6":1,"146":1,"153":1,"164":1,"172":1,"190":1}}],["transform",{"2":{"0":2,"1":6,"6":3,"15":2,"31":1,"148":1,"172":2,"180":1,"185":4,"191":4,"193":1}}],["trait`",{"2":{"156":1}}],["trait2",{"2":{"85":10,"88":2,"110":2,"111":2,"122":2,"127":2,"129":2,"130":2}}],["trait1",{"2":{"85":12,"88":2,"110":2,"111":2,"122":2,"127":2,"129":2,"130":2}}],["traits",{"2":{"6":1,"18":1,"122":1,"151":2,"159":3,"165":2,"180":2}}],["trait",{"2":{"1":5,"3":2,"4":2,"6":6,"18":7,"20":1,"22":1,"31":1,"32":1,"53":2,"56":5,"59":6,"63":7,"66":2,"69":3,"70":2,"71":2,"72":6,"73":4,"75":2,"76":2,"85":7,"88":11,"94":3,"105":2,"108":3,"116":4,"122":10,"125":3,"135":3,"145":1,"148":1,"150":5,"151":3,"153":19,"154":9,"156":27,"159":8,"165":9,"166":1,"177":2,"180":2,"189":7,"191":1}}],["traittarget",{"0":{"159":1},"2":{"1":2,"31":2,"32":1,"53":1,"56":1,"63":1,"66":1,"70":2,"71":4,"72":3,"73":4,"75":2,"76":4,"85":1,"148":1,"150":2,"153":6,"154":6,"158":1,"159":20,"177":1,"180":1}}],["thus",{"2":{"53":1,"56":1,"64":3,"71":1,"73":1,"76":1}}],["though",{"2":{"20":1,"162":1}}],["those",{"2":{"6":1,"33":1,"53":1,"64":1,"73":1,"96":1,"137":1,"158":1,"177":1}}],["thing",{"0":{"30":1}}],["things",{"2":{"9":1}}],["this",{"0":{"30":1},"2":{"0":1,"1":1,"3":1,"4":6,"5":1,"6":30,"7":1,"18":1,"23":3,"24":2,"25":2,"27":2,"29":1,"31":1,"32":3,"33":1,"50":1,"52":2,"53":6,"55":2,"56":9,"58":3,"59":11,"60":2,"62":1,"63":4,"64":26,"65":1,"66":4,"68":1,"69":5,"71":1,"73":5,"74":1,"75":1,"76":2,"82":5,"84":4,"85":6,"88":4,"90":1,"91":2,"93":3,"94":3,"101":1,"103":1,"104":2,"105":1,"108":3,"115":1,"116":3,"119":2,"121":1,"122":4,"125":3,"132":1,"134":1,"135":3,"142":1,"144":1,"145":3,"146":8,"147":2,"148":2,"151":2,"153":15,"154":7,"155":2,"156":2,"157":1,"158":4,"159":2,"160":4,"161":3,"163":3,"164":1,"165":6,"166":7,"167":4,"169":3,"170":2,"171":2,"172":4,"173":3,"174":3,"175":5,"176":5,"177":5,"178":2,"180":3,"184":9,"185":1,"186":1,"187":3,"188":2,"189":1,"190":1,"191":2,"192":4,"193":3,"194":3,"195":1,"197":3,"198":3,"199":3,"200":1}}],["three",{"2":{"26":1,"57":1,"73":1,"158":1,"177":1}}],["thread",{"2":{"153":3,"154":3}}],["threading",{"0":{"153":1},"2":{"153":5,"154":2,"160":1}}],["threads",{"2":{"1":1,"150":1,"153":5,"154":7}}],["threaded=",{"2":{"153":4,"154":5}}],["threaded=true",{"2":{"153":1}}],["threaded=false",{"2":{"56":1,"63":4,"66":2,"85":8,"153":1,"154":1,"170":1,"180":1}}],["threaded==true",{"2":{"1":1,"150":1,"153":1}}],["threaded",{"2":{"1":3,"4":1,"6":5,"24":1,"31":1,"32":2,"53":2,"56":1,"63":3,"66":3,"85":5,"150":2,"153":25,"154":27,"155":1,"160":2,"170":1,"177":13,"180":1}}],["through",{"2":{"6":4,"53":1,"59":1,"64":3,"66":1,"68":1,"69":2,"82":1,"94":1,"116":5,"135":1,"146":1,"151":1,"153":1,"166":2,"169":2,"182":1,"188":1,"191":1}}],["thrown",{"2":{"151":1}}],["throws",{"2":{"6":1,"188":1}}],["throw",{"2":{"4":1,"6":1,"76":1,"88":1,"146":1,"153":1,"154":1,"156":4}}],["than",{"2":{"1":1,"3":1,"6":10,"11":1,"64":2,"96":1,"105":1,"122":1,"137":1,"145":1,"146":2,"150":1,"152":1,"153":1,"157":1,"166":2,"167":1,"168":1,"169":2,"174":1,"176":2,"177":1,"181":1,"188":2}}],["that",{"2":{"1":1,"3":3,"4":8,"6":40,"9":1,"17":1,"18":4,"19":3,"20":1,"22":3,"25":1,"26":1,"27":1,"53":4,"55":2,"56":4,"59":4,"60":2,"62":2,"63":3,"64":17,"65":3,"66":5,"70":4,"71":5,"72":4,"73":14,"75":3,"76":5,"77":1,"81":3,"82":4,"85":2,"87":1,"88":11,"90":4,"91":1,"93":2,"94":1,"104":1,"107":1,"108":1,"116":3,"118":1,"119":1,"121":2,"122":10,"124":2,"125":2,"127":2,"134":3,"135":1,"137":3,"145":1,"146":4,"148":1,"150":1,"153":5,"154":1,"155":1,"156":4,"157":2,"158":6,"159":1,"160":3,"161":3,"162":2,"163":1,"164":3,"165":2,"166":4,"167":2,"168":3,"169":4,"172":1,"174":2,"175":2,"176":3,"177":2,"180":2,"182":1,"184":1,"188":1,"192":4,"193":1,"194":2,"195":3,"197":1,"198":2}}],["theta",{"2":{"158":1}}],["theorem",{"2":{"85":1}}],["themselves",{"2":{"59":1}}],["them",{"2":{"25":1,"27":1,"64":1,"146":2,"147":2,"153":3,"156":2,"162":2,"167":1,"168":1,"180":1,"191":1,"193":1,"195":3}}],["thereof",{"2":{"148":1,"154":1}}],["therefore",{"2":{"84":1,"161":1}}],["there",{"2":{"6":2,"22":1,"53":1,"59":2,"60":1,"64":3,"66":1,"69":2,"71":1,"73":6,"74":1,"76":1,"116":1,"122":2,"146":3,"147":1,"148":1,"153":4,"158":1,"159":1,"162":1,"175":1,"184":1,"188":1,"192":2,"195":3}}],["then",{"2":{"6":5,"18":1,"22":1,"29":1,"53":3,"59":2,"64":6,"66":1,"70":1,"72":2,"73":6,"74":2,"75":2,"76":2,"82":1,"116":1,"146":2,"148":1,"151":1,"153":2,"154":3,"167":1,"176":2,"180":1,"192":1,"197":1,"198":1}}],["their",{"2":{"3":1,"4":1,"6":2,"59":1,"62":2,"76":1,"85":2,"113":1,"122":1,"124":1,"128":1,"129":1,"138":3,"139":3,"148":1,"154":1,"162":1,"168":1,"170":1}}],["they",{"2":{"3":3,"4":11,"6":24,"20":2,"22":1,"23":1,"24":1,"57":1,"63":2,"64":8,"66":2,"70":2,"72":1,"73":6,"75":2,"76":3,"81":1,"87":3,"88":16,"94":1,"107":1,"111":2,"112":1,"113":1,"116":2,"118":1,"121":2,"122":4,"127":1,"129":1,"130":1,"138":1,"139":1,"146":6,"153":2,"156":2,"161":1,"166":2,"169":2,"175":1,"184":1,"187":1,"198":1}}],["these",{"2":{"1":2,"6":4,"24":1,"53":1,"59":5,"64":3,"76":1,"87":1,"88":1,"90":1,"94":1,"103":1,"105":2,"107":1,"108":1,"118":1,"121":1,"122":1,"124":2,"125":1,"134":1,"135":1,"145":1,"146":3,"150":1,"151":1,"153":2,"172":1,"176":1,"180":2,"188":1,"195":1,"197":1}}],["the",{"0":{"26":1,"29":1,"62":1,"80":1,"81":1},"2":{"1":28,"3":64,"4":112,"5":12,"6":386,"7":5,"9":3,"10":1,"11":3,"17":5,"18":10,"19":2,"20":4,"22":4,"23":5,"24":3,"25":3,"26":4,"27":3,"29":3,"32":3,"52":1,"53":63,"55":12,"56":43,"57":15,"58":12,"59":71,"60":6,"62":6,"63":25,"64":116,"65":7,"66":47,"68":2,"69":7,"70":27,"71":23,"72":27,"73":82,"74":1,"75":29,"76":70,"77":6,"81":11,"82":16,"84":11,"85":81,"87":5,"88":47,"90":9,"91":11,"93":8,"94":25,"97":8,"98":9,"99":3,"100":3,"101":2,"103":4,"104":11,"105":5,"107":2,"108":21,"110":8,"111":6,"112":4,"114":3,"115":2,"116":123,"118":5,"119":6,"121":5,"122":26,"124":5,"125":21,"127":6,"128":10,"129":7,"130":3,"131":3,"132":2,"134":7,"135":24,"137":2,"138":9,"139":9,"140":6,"141":2,"142":2,"144":1,"145":8,"146":47,"147":1,"148":9,"150":14,"151":11,"153":69,"154":23,"155":2,"156":18,"157":1,"158":24,"160":5,"161":5,"162":5,"163":4,"164":2,"165":13,"166":10,"167":4,"168":8,"169":6,"170":1,"171":5,"172":14,"173":2,"174":3,"175":5,"176":26,"177":21,"178":3,"180":18,"181":3,"182":6,"183":3,"184":2,"185":3,"186":1,"187":2,"188":21,"191":10,"192":11,"193":10,"194":2,"195":4,"197":10,"198":17,"199":3}}],["t",{"2":{"0":1,"4":28,"6":54,"9":1,"23":1,"31":8,"32":1,"53":32,"56":41,"59":26,"63":38,"64":74,"66":44,"69":18,"70":12,"71":12,"72":12,"73":156,"75":10,"76":20,"85":87,"88":17,"93":1,"111":1,"116":24,"122":1,"124":1,"128":2,"129":1,"146":14,"153":5,"154":4,"156":2,"158":5,"159":14,"160":2,"166":2,"169":2,"176":3,"177":4,"180":1,"186":7,"188":3,"189":10,"191":8,"199":1}}],["tokyo",{"2":{"199":1}}],["toy",{"2":{"197":1}}],["together",{"2":{"73":1,"76":1,"191":1,"198":1}}],["touching",{"0":{"128":1},"2":{"73":1,"76":1}}],["touch",{"0":{"129":1,"130":1,"131":1},"2":{"64":1,"124":1,"127":2,"129":1,"131":1}}],["touches",{"0":{"42":1,"123":1,"124":1,"127":1},"1":{"124":1,"125":1},"2":{"0":2,"3":3,"6":3,"31":1,"42":2,"123":1,"124":3,"125":11,"126":6,"127":11,"128":15,"129":9,"130":8,"131":3,"132":4,"197":1}}],["totally",{"2":{"75":1}}],["total",{"2":{"56":1,"59":2,"64":2,"66":1}}],["towards",{"2":{"25":1,"27":1}}],["topright",{"2":{"180":1}}],["topologypreserve",{"2":{"178":1}}],["topology",{"2":{"178":1}}],["topological",{"2":{"158":2}}],["top",{"2":{"20":1,"26":1,"64":1,"146":1}}],["took",{"2":{"199":1}}],["tools",{"2":{"17":1}}],["too",{"2":{"6":1,"73":1,"174":1,"177":1}}],["tol^2",{"2":{"181":1,"182":1}}],["tolerances",{"2":{"183":1,"184":29}}],["tolerance",{"2":{"181":1,"182":1,"183":1,"184":17}}],["tol",{"2":{"6":12,"176":2,"180":18,"181":7,"182":15,"183":8,"184":18}}],["todo",{"2":{"3":2,"6":2,"32":1,"64":1,"73":1,"82":2,"105":4,"122":1,"146":1,"153":1,"160":1,"163":1,"180":1}}],["to",{"0":{"9":1,"23":1,"26":1,"74":1,"95":1,"109":1,"126":1,"136":1},"2":{"0":2,"1":22,"3":1,"4":33,"5":4,"6":125,"7":2,"9":3,"10":2,"11":2,"13":1,"17":2,"18":9,"19":1,"20":2,"22":3,"23":4,"24":2,"25":3,"26":2,"27":3,"29":4,"30":1,"52":1,"53":8,"55":1,"56":4,"57":4,"58":1,"59":26,"60":2,"62":2,"63":5,"64":32,"65":1,"66":12,"68":1,"69":3,"70":8,"71":4,"72":8,"73":27,"75":7,"76":11,"77":1,"79":1,"80":1,"81":4,"82":6,"84":6,"85":32,"87":2,"88":17,"90":1,"91":1,"93":2,"94":7,"103":3,"104":1,"105":2,"107":1,"108":7,"116":21,"118":2,"119":1,"121":3,"122":7,"124":1,"125":7,"127":1,"134":1,"135":7,"145":4,"146":16,"148":4,"150":9,"151":6,"152":1,"153":33,"154":11,"155":7,"156":23,"158":7,"159":2,"160":6,"161":2,"162":3,"164":4,"165":8,"166":5,"167":3,"168":1,"169":4,"170":3,"171":1,"172":4,"173":1,"174":3,"175":3,"176":9,"177":7,"178":1,"180":4,"181":1,"182":15,"183":1,"184":2,"185":4,"186":1,"187":2,"188":9,"189":28,"190":4,"191":6,"192":10,"193":6,"194":7,"195":5,"196":1,"197":7,"198":5,"199":2,"200":8}}],["o",{"2":{"154":24}}],["odd",{"2":{"116":1}}],["own",{"2":{"76":1,"148":2}}],["occur",{"2":{"73":1}}],["occurs",{"2":{"73":1}}],["occupied",{"2":{"55":1}}],["old",{"2":{"64":8,"153":3}}],["ourselves",{"2":{"176":1}}],["our",{"2":{"24":1,"176":1,"191":4,"192":3,"198":1}}],["out=3",{"2":{"116":1}}],["out=4",{"2":{"72":1}}],["out`",{"2":{"72":1,"116":1}}],["out",{"2":{"6":3,"64":12,"66":23,"73":6,"76":4,"82":1,"84":5,"94":4,"105":1,"108":3,"116":102,"122":2,"125":4,"135":4,"145":1,"153":1,"177":1,"188":2}}],["outside",{"2":{"3":2,"4":1,"6":3,"64":3,"66":1,"71":2,"73":4,"76":3,"84":2,"85":1,"93":1,"104":1,"107":1,"116":12,"122":3,"140":1}}],["outputs",{"2":{"64":1}}],["output",{"2":{"3":8,"4":1,"6":18,"18":1,"23":1,"69":2,"70":1,"72":1,"73":1,"75":1,"76":2,"88":1,"91":1,"94":1,"104":1,"108":1,"119":1,"122":1,"125":1,"135":1,"145":2,"180":1,"184":1,"189":1}}],["outerjoin",{"2":{"197":1}}],["outermost",{"2":{"153":1}}],["outer",{"2":{"1":1,"150":1,"151":1,"153":2,"198":1}}],["omit",{"2":{"6":1,"176":1}}],["obtain",{"2":{"153":1}}],["obtained",{"2":{"23":1}}],["observable",{"2":{"14":2}}],["obs",{"2":{"14":10}}],["obviously",{"2":{"4":1,"6":1,"170":1}}],["objects",{"2":{"1":4,"4":1,"6":10,"150":4,"151":5,"153":4,"154":1,"156":6,"170":1,"174":1,"180":2,"186":1}}],["object",{"2":{"1":4,"4":1,"5":1,"6":5,"20":1,"59":1,"84":1,"116":4,"150":1,"151":5,"153":1,"156":4,"170":1,"172":3,"176":1,"180":1,"186":1}}],["obj",{"2":{"1":4,"4":1,"6":10,"150":2,"153":1,"154":1,"156":13,"170":1,"171":2,"176":3,"180":3,"185":1,"186":1}}],["others",{"2":{"60":1,"169":1}}],["otherwise",{"2":{"4":2,"6":3,"60":1,"64":1,"71":1,"73":1,"85":2,"146":1,"171":1,"173":1,"176":1,"189":1}}],["other",{"0":{"4":1,"6":1,"156":1},"2":{"3":4,"6":10,"53":1,"64":5,"70":1,"72":1,"73":1,"75":2,"76":3,"77":2,"85":2,"88":2,"90":1,"96":1,"116":8,"118":1,"121":1,"122":4,"124":2,"125":2,"128":1,"137":1,"146":1,"151":1,"153":1,"156":2,"159":1,"166":2,"167":1,"169":2,"180":2,"182":2,"187":1,"188":1,"192":1,"197":4,"200":1}}],["ogc",{"0":{"3":1}}],["over=3",{"2":{"72":1}}],["over`",{"2":{"72":1}}],["overflow",{"2":{"69":1}}],["overhead",{"2":{"22":1,"153":1,"154":1}}],["overrides",{"0":{"33":1},"1":{"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1},"2":{"33":1}}],["override",{"2":{"6":1,"59":1}}],["overlapping",{"2":{"64":11,"73":4,"76":6}}],["overlap",{"2":{"3":4,"6":4,"9":1,"64":2,"73":8,"76":2,"94":1,"103":1,"116":2,"121":5,"122":6,"135":1,"167":1}}],["overlaps",{"0":{"46":1,"120":1,"121":1},"1":{"121":1,"122":1},"2":{"0":10,"3":5,"6":13,"31":1,"46":2,"73":1,"120":1,"121":3,"122":30,"146":1,"197":1}}],["over",{"2":{"1":1,"6":2,"55":2,"56":1,"63":3,"64":5,"66":1,"72":1,"73":11,"76":1,"81":1,"94":1,"105":1,"108":1,"116":15,"122":2,"125":1,"135":1,"150":1,"153":9,"154":11,"156":3,"191":3}}],["opposed",{"2":{"196":1}}],["opposite",{"2":{"3":5,"6":5,"64":2,"71":1,"73":2,"76":1,"91":2,"94":1,"104":2,"119":2,"135":1}}],["ops",{"2":{"154":1}}],["operable",{"2":{"158":1}}],["operates",{"2":{"153":1,"154":1,"161":1,"167":1}}],["operate",{"2":{"18":1,"29":1,"154":1}}],["operations",{"0":{"23":1,"34":1},"1":{"35":1,"36":1,"37":1,"38":1},"2":{"23":1,"26":1,"73":1,"76":1,"148":1}}],["operation",{"2":{"6":3,"64":1,"148":1,"154":1,"158":1,"166":2,"169":2,"188":2,"197":1}}],["open",{"2":{"64":1,"162":1,"192":1}}],["open>",{"2":{"6":2}}],["optimisation",{"2":{"116":1}}],["optimise",{"2":{"105":1}}],["optimal",{"2":{"6":1,"82":1}}],["options",{"2":{"14":1,"64":1}}],["optional",{"2":{"4":5,"6":6,"53":1,"56":2,"66":1,"85":2}}],["op",{"2":{"1":3,"19":2,"63":1,"150":3,"154":35}}],["on=2",{"2":{"116":1}}],["on`",{"2":{"116":1}}],["once",{"2":{"105":1,"122":1,"146":1}}],["onto",{"2":{"85":1}}],["ones",{"2":{"168":1}}],["oneunit",{"2":{"59":1}}],["one",{"2":{"1":1,"3":9,"6":14,"23":1,"53":4,"56":2,"58":1,"59":1,"63":1,"64":5,"66":3,"70":1,"71":1,"72":1,"73":32,"75":2,"76":2,"77":1,"84":2,"93":1,"100":1,"105":1,"107":1,"116":18,"121":1,"122":18,"124":2,"125":2,"128":3,"129":2,"130":2,"131":1,"132":1,"134":1,"135":1,"141":1,"145":1,"146":5,"153":1,"158":2,"168":1,"172":1,"176":1,"184":1,"185":1,"192":1,"197":1}}],["on",{"0":{"192":1},"2":{"1":2,"4":3,"6":9,"9":1,"18":1,"20":1,"23":2,"25":3,"27":3,"29":2,"32":1,"53":5,"56":3,"58":1,"59":2,"63":3,"64":28,"66":8,"69":1,"70":1,"71":5,"72":1,"73":4,"75":1,"76":2,"82":1,"84":1,"85":3,"88":2,"93":1,"94":7,"96":2,"97":3,"98":3,"99":1,"105":4,"108":6,"110":4,"111":1,"112":1,"116":125,"122":9,"125":7,"127":2,"135":7,"137":2,"138":1,"139":1,"146":3,"148":1,"150":2,"153":12,"154":4,"156":2,"158":4,"160":2,"161":1,"163":1,"166":1,"167":1,"174":1,"176":1,"177":1,"182":1,"190":1,"192":3,"193":1,"195":1,"196":1,"197":4,"198":1,"199":2,"200":2}}],["only",{"2":{"0":1,"5":1,"6":10,"23":1,"33":2,"56":2,"58":2,"59":1,"60":1,"63":2,"64":4,"66":3,"69":1,"70":1,"72":1,"73":1,"75":1,"82":3,"85":2,"88":3,"121":3,"122":1,"124":1,"146":2,"153":1,"154":2,"158":2,"168":1,"174":1,"175":1,"177":1,"187":1,"188":2,"193":1,"199":1,"200":1}}],["often",{"2":{"192":1}}],["offers",{"2":{"191":1}}],["offer",{"2":{"176":1}}],["offset",{"2":{"53":8,"88":1}}],["off",{"2":{"4":1,"6":1,"64":4,"88":1,"116":6,"154":1}}],["of",{"0":{"80":1},"2":{"1":7,"3":29,"4":66,"5":5,"6":190,"7":2,"9":4,"17":3,"18":5,"19":1,"20":2,"22":1,"23":2,"24":2,"25":1,"26":1,"27":1,"29":3,"32":2,"52":1,"53":38,"55":5,"56":28,"57":9,"58":1,"59":13,"60":1,"62":3,"63":12,"64":84,"65":5,"66":31,"69":5,"70":12,"71":13,"72":10,"73":48,"75":9,"76":20,"77":5,"81":3,"82":3,"84":6,"85":18,"87":2,"88":19,"90":4,"91":5,"93":6,"94":18,"96":1,"97":5,"98":5,"99":1,"100":2,"101":1,"104":5,"105":1,"107":3,"108":14,"110":1,"111":1,"112":1,"114":2,"115":1,"116":85,"118":1,"119":3,"121":1,"122":13,"124":2,"125":15,"127":3,"128":7,"129":5,"130":1,"131":2,"132":1,"134":4,"135":18,"137":3,"138":6,"139":6,"140":4,"141":1,"142":1,"144":2,"145":3,"146":19,"147":2,"148":3,"150":6,"151":5,"152":2,"153":21,"154":7,"156":2,"158":5,"159":2,"161":1,"162":1,"166":2,"167":4,"169":4,"171":3,"172":1,"174":2,"175":2,"176":5,"177":6,"180":8,"182":4,"183":2,"184":1,"186":1,"188":4,"189":2,"191":6,"192":4,"193":2,"194":1,"195":4,"197":4,"198":4,"199":2}}],["org",{"2":{"70":1,"72":1,"75":1,"116":2,"182":1}}],["organise",{"2":{"10":1}}],["orange",{"2":{"68":1,"84":1,"87":2,"90":2,"107":2,"121":2,"134":2}}],["oro",{"2":{"11":2}}],["originate",{"2":{"76":1}}],["originals",{"2":{"22":1}}],["original",{"2":{"6":4,"18":1,"22":1,"64":10,"69":5,"70":1,"72":1,"76":4,"151":1,"153":7,"165":1,"171":2,"177":1,"179":4,"180":1}}],["orient",{"0":{"13":1},"1":{"14":1,"15":1},"2":{"13":7,"14":12,"64":15,"73":53}}],["orientation",{"0":{"143":1},"1":{"144":1,"145":1},"2":{"6":2,"10":1,"31":1,"56":1,"64":10,"66":2,"70":1,"72":2,"73":2,"75":1,"116":16,"144":1,"180":1}}],["ordered",{"2":{"55":1}}],["order",{"0":{"81":1},"2":{"1":4,"3":1,"4":2,"6":5,"53":1,"55":1,"56":2,"59":1,"64":4,"73":1,"76":1,"81":4,"82":1,"85":2,"88":3,"91":1,"94":1,"104":1,"119":1,"150":2,"153":1,"154":1,"172":2,"180":1,"197":1}}],["or",{"0":{"24":1},"2":{"1":11,"3":3,"4":10,"6":46,"18":1,"20":1,"22":1,"23":1,"25":1,"27":1,"29":2,"31":1,"32":1,"53":4,"56":1,"59":1,"60":1,"62":2,"63":4,"64":24,"65":1,"69":1,"70":1,"71":3,"72":2,"73":9,"75":1,"76":2,"77":1,"82":1,"84":2,"85":4,"88":3,"90":1,"94":1,"96":2,"97":1,"98":1,"99":1,"100":1,"101":1,"107":2,"110":2,"111":3,"112":2,"113":1,"114":1,"115":1,"116":26,"118":2,"119":1,"121":1,"122":2,"124":1,"125":1,"131":1,"132":1,"135":1,"137":2,"141":1,"142":1,"144":2,"145":3,"146":7,"148":4,"150":7,"152":1,"153":8,"154":3,"155":2,"156":3,"158":2,"159":3,"160":1,"161":1,"163":1,"165":5,"166":2,"172":2,"173":1,"174":2,"176":2,"177":4,"178":1,"180":3,"182":2,"184":2,"186":1,"189":2,"197":1,"199":2}}],["ecosystem",{"2":{"157":1}}],["effects",{"2":{"153":2,"154":1}}],["efficiently",{"2":{"20":1}}],["efficient",{"2":{"6":1,"59":1,"70":2,"72":2,"75":2,"82":1,"163":1}}],["e2",{"2":{"116":4}}],["e1",{"2":{"116":8}}],["euclid",{"2":{"66":2,"85":11,"116":1,"181":1}}],["euclidean",{"2":{"4":1,"6":1,"59":13,"85":6,"158":6,"177":1}}],["everything",{"2":{"180":1}}],["everywhere",{"2":{"158":1}}],["every",{"2":{"64":1,"88":2,"151":1,"188":1}}],["evenly",{"2":{"198":1}}],["eventually",{"2":{"64":1}}],["even",{"2":{"56":2,"66":1,"73":1,"85":1,"88":1,"148":1,"162":1,"167":1}}],["evaluated",{"2":{"197":1}}],["eval",{"2":{"31":2,"153":1,"154":1}}],["epsg",{"2":{"192":5,"193":8}}],["eps",{"2":{"53":2,"73":14}}],["eponymous",{"2":{"6":1,"176":1}}],["est",{"2":{"199":1}}],["essentially",{"2":{"33":1,"159":1}}],["especially",{"2":{"6":1,"18":1,"23":1,"146":1}}],["eg",{"2":{"32":1}}],["etc",{"0":{"156":1},"2":{"20":2,"55":1,"82":1,"159":1,"195":1}}],["e",{"2":{"9":1,"22":1,"60":1,"146":1,"151":1,"153":2,"158":1,"191":2,"192":1,"195":1}}],["ellipsoid",{"2":{"158":2,"196":1}}],["ellipsoidal",{"2":{"6":1,"177":1}}],["eltype",{"2":{"146":4}}],["elements",{"2":{"100":1,"101":1,"114":1,"115":1,"122":1,"131":1,"132":1,"141":1,"142":1}}],["element",{"2":{"6":6,"52":1,"64":4,"69":2,"70":1,"72":1,"73":1,"75":3,"175":1,"192":1}}],["elsewhere",{"2":{"69":1}}],["elseif",{"2":{"64":5,"66":7,"70":1,"72":1,"73":14,"75":2,"76":1,"105":3,"116":10,"145":1,"146":2,"169":1,"182":2,"184":2}}],["else",{"2":{"3":6,"6":6,"53":1,"59":2,"64":19,"66":9,"69":1,"71":2,"73":9,"75":1,"76":9,"105":2,"116":17,"122":8,"146":20,"153":6,"154":2,"156":1,"163":1,"171":1,"173":1,"180":2,"182":4,"184":2,"185":1,"186":1,"188":1}}],["empty",{"2":{"4":2,"6":6,"53":2,"64":2,"70":1,"72":1,"73":2,"75":1,"146":2}}],["embedding",{"0":{"152":1,"170":1}}],["embedded",{"0":{"193":1},"2":{"146":1,"152":3,"190":1,"193":1}}],["embed",{"2":{"0":2,"4":1,"6":1,"152":1,"170":2}}],["errors",{"2":{"31":1,"73":1,"177":1}}],["error",{"0":{"173":1},"2":{"4":1,"6":4,"7":1,"18":1,"31":6,"32":2,"59":1,"60":4,"64":2,"73":2,"74":1,"88":2,"146":1,"151":1,"165":2,"173":3,"176":5,"184":4,"188":3,"189":1}}],["edgekeys",{"2":{"146":3}}],["edge",{"2":{"3":1,"4":3,"6":4,"20":1,"31":1,"56":1,"62":1,"64":25,"66":13,"70":1,"72":1,"73":6,"75":1,"85":4,"88":1,"96":2,"111":2,"112":1,"116":7,"122":21,"137":2,"138":1,"139":1,"146":7,"189":2}}],["edges`",{"2":{"73":1}}],["edges",{"2":{"0":1,"4":2,"6":9,"64":12,"66":8,"71":3,"73":10,"76":3,"85":3,"87":2,"88":1,"90":1,"96":1,"97":3,"98":7,"99":3,"107":1,"110":3,"113":1,"116":3,"122":20,"134":1,"137":1,"146":22,"189":29}}],["earlier",{"2":{"191":3}}],["earth",{"2":{"6":3,"25":1,"27":1,"158":3,"176":2,"177":1,"180":1,"192":2,"197":1}}],["easiest",{"2":{"194":1}}],["easier",{"2":{"160":1,"187":1}}],["easily",{"2":{"148":1}}],["east",{"2":{"66":9}}],["easy",{"2":{"1":1,"6":1,"167":1,"185":1}}],["eachindex",{"2":{"53":1,"145":1,"146":3,"153":1,"154":1,"181":1,"184":1}}],["each",{"2":{"3":2,"4":3,"6":6,"9":1,"18":2,"20":1,"53":4,"56":2,"57":4,"59":1,"64":5,"66":1,"73":3,"85":1,"88":2,"94":1,"108":1,"116":6,"121":1,"122":3,"125":1,"135":1,"145":1,"146":1,"153":1,"167":2,"180":1,"194":1,"195":1,"198":2,"199":2,"200":1}}],["equator",{"2":{"158":1}}],["equatorial",{"2":{"6":6,"176":4}}],["equality",{"2":{"64":1,"73":1,"197":1}}],["equal",{"2":{"3":2,"4":16,"6":19,"53":6,"73":1,"84":1,"85":4,"87":3,"88":22,"96":1,"110":1,"116":15,"121":1,"122":2,"127":2,"137":1,"162":1}}],["equals",{"0":{"40":1,"86":1,"87":1},"1":{"87":1,"88":1},"2":{"0":17,"4":3,"6":19,"31":1,"40":2,"53":2,"64":4,"69":2,"73":8,"85":1,"86":1,"87":2,"88":50,"96":1,"110":1,"116":10,"122":2,"127":3,"137":1,"197":1}}],["equivalent",{"2":{"3":1,"4":4,"6":6,"56":1,"64":1,"73":1,"76":1,"88":5,"94":1,"116":1}}],["enable",{"2":{"200":1}}],["enabled",{"2":{"197":1}}],["enabling",{"0":{"200":1}}],["enclosed",{"2":{"116":1}}],["encode",{"2":{"24":1}}],["encompasses",{"2":{"18":1,"116":1}}],["encounters",{"2":{"18":1}}],["en",{"2":{"116":1,"182":1}}],["envelope",{"2":{"73":2}}],["envelopes",{"2":{"73":2}}],["enough",{"2":{"64":1}}],["entirely",{"2":{"116":1}}],["entire",{"2":{"66":1,"116":4}}],["entry",{"2":{"64":11,"71":3,"73":4,"76":3,"146":1}}],["ent",{"2":{"64":19,"69":2}}],["enter",{"2":{"64":4}}],["ensuring",{"2":{"6":1,"174":1,"177":1}}],["ensure",{"2":{"6":3,"59":1,"70":1,"72":1,"75":1,"153":2,"161":2,"164":1}}],["ensures",{"2":{"6":3,"163":1,"166":3,"169":2}}],["enumerate",{"2":{"13":2,"53":1,"64":10,"66":1,"69":1,"71":1,"76":2,"116":1,"146":2,"169":2,"184":1}}],["enum",{"2":{"6":2,"64":3,"72":3,"116":3}}],["endpt",{"2":{"182":3}}],["endpoints",{"2":{"64":3,"66":1,"71":1,"73":6,"76":1,"85":2,"116":11,"122":2,"124":1}}],["endpoint=3",{"2":{"64":1}}],["endpointtype",{"2":{"64":2}}],["endpoint",{"2":{"3":1,"6":2,"64":27,"72":1,"73":16,"85":2,"93":1,"116":3,"122":2,"180":4,"182":4,"191":1}}],["ending",{"2":{"64":1,"66":1}}],["end",{"2":{"1":1,"9":1,"13":4,"14":3,"31":4,"32":4,"35":1,"36":1,"37":1,"38":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"53":18,"56":8,"59":35,"60":3,"63":10,"64":130,"66":43,"69":9,"70":8,"71":12,"72":5,"73":31,"74":1,"75":6,"76":24,"82":3,"85":19,"88":20,"100":2,"101":2,"105":20,"114":2,"115":2,"116":104,"122":21,"127":1,"131":2,"132":2,"137":1,"141":2,"142":2,"145":9,"146":44,"147":4,"148":1,"150":1,"153":27,"154":17,"156":15,"158":4,"159":1,"160":4,"161":1,"163":5,"165":3,"169":18,"171":4,"172":1,"173":2,"176":8,"177":9,"180":7,"181":6,"182":30,"183":3,"184":27,"185":4,"186":4,"188":4,"189":19}}],["enforce",{"2":{"0":1,"6":2,"32":3,"188":3}}],["exits",{"2":{"64":1}}],["exit",{"2":{"64":32,"69":2,"71":3,"73":3,"76":2}}],["existingnodes",{"2":{"146":3}}],["existing",{"2":{"64":3,"75":1,"146":1,"192":2,"194":1}}],["exists",{"2":{"64":1,"66":1,"73":1}}],["exist",{"2":{"6":1,"64":1,"73":3,"188":1}}],["excluding",{"2":{"113":1,"116":1,"137":2}}],["exclude",{"2":{"105":9}}],["exclusively",{"2":{"129":1}}],["exclusive",{"2":{"66":1,"73":2}}],["exc",{"2":{"60":2,"173":2,"176":2}}],["excellent",{"2":{"23":1}}],["except",{"2":{"18":1,"19":1}}],["excess",{"2":{"5":1,"6":1,"59":1}}],["exp10",{"2":{"176":1,"180":2}}],["expressed",{"2":{"57":2}}],["express",{"2":{"57":1}}],["experimental",{"2":{"31":3}}],["expect",{"2":{"1":1,"118":1,"172":1}}],["explain",{"2":{"26":1}}],["explanations",{"2":{"26":3}}],["explicitly",{"2":{"18":1,"24":1,"53":2,"56":1,"59":1,"60":1,"85":2,"88":1,"173":1,"176":1}}],["expose",{"2":{"77":1}}],["exposes",{"2":{"17":1}}],["export",{"2":{"31":1,"57":1,"158":2,"174":1,"193":1,"195":1}}],["exponential",{"2":{"9":1}}],["ext2",{"2":{"116":3}}],["ext1",{"2":{"116":3}}],["ext",{"2":{"58":15,"64":10,"66":2,"69":3,"70":8,"72":8,"73":18,"75":8,"76":14,"105":7,"116":7}}],["extrema",{"2":{"146":1,"189":1}}],["extreem",{"2":{"53":10}}],["extracts",{"2":{"82":1}}],["extract",{"2":{"82":1,"146":1,"153":1,"154":2,"180":1}}],["extra",{"2":{"6":3,"64":1,"75":1,"174":1,"176":2,"177":1}}],["external",{"2":{"56":1,"116":2}}],["exteriors",{"2":{"9":1,"72":2,"75":2,"146":1}}],["exterior",{"2":{"3":4,"4":2,"6":10,"53":1,"55":1,"56":1,"58":1,"59":36,"63":2,"64":4,"70":2,"75":3,"76":14,"85":1,"88":2,"90":1,"91":1,"94":3,"104":1,"108":2,"116":9,"125":2,"134":1,"135":3,"138":3,"139":3,"145":6,"146":6,"163":3,"164":1,"166":1,"170":1,"191":2}}],["extending",{"2":{"122":1}}],["extended",{"2":{"85":1,"158":2}}],["extensions",{"2":{"77":1,"195":1}}],["extension",{"2":{"1":1,"6":1,"59":1,"60":1,"82":1,"93":1,"147":1,"172":3,"173":2,"176":1,"177":1,"178":1,"195":1}}],["extent`",{"2":{"155":1,"170":1}}],["extent=true",{"2":{"170":1}}],["extent=nothing",{"2":{"156":1}}],["extent=",{"2":{"153":4}}],["extent=false",{"2":{"153":1,"180":1}}],["extent=gi",{"2":{"146":3}}],["extents",{"2":{"4":3,"6":3,"31":5,"66":1,"73":3,"116":5,"122":1,"146":3,"153":2,"170":2,"189":2}}],["extent",{"0":{"170":1},"2":{"0":2,"1":4,"4":3,"6":9,"24":1,"31":3,"32":1,"35":2,"36":2,"37":2,"38":2,"50":1,"58":1,"65":1,"66":1,"73":10,"116":4,"122":2,"146":12,"150":2,"152":4,"153":29,"155":3,"156":1,"160":1,"170":2,"180":1,"189":7}}],["exactly",{"2":{"184":1}}],["exactpredicates",{"2":{"7":1,"13":2,"14":2,"31":1}}],["exact",{"2":{"3":5,"6":5,"7":2,"12":1,"13":1,"64":36,"66":6,"69":7,"70":5,"72":5,"73":7,"74":1,"75":5,"76":7,"91":2,"94":3,"96":1,"97":3,"98":3,"99":1,"104":2,"105":1,"108":2,"110":1,"111":3,"112":2,"113":1,"116":24,"119":2,"122":3,"125":2,"127":1,"128":3,"129":1,"130":1,"135":3,"137":1,"138":3,"139":3,"140":1,"146":1,"168":1}}],["examples",{"0":{"175":1,"179":1},"2":{"3":8,"4":1,"6":11,"26":2,"88":1,"91":1,"94":1,"104":1,"105":1,"108":1,"122":1,"125":1,"135":1,"145":2,"189":1}}],["example",{"0":{"58":1,"78":1,"162":1,"168":1,"198":1,"199":1},"1":{"79":1},"2":{"1":3,"3":2,"6":11,"11":1,"20":1,"23":2,"52":1,"55":1,"58":1,"62":1,"63":1,"65":1,"68":1,"69":1,"70":1,"72":1,"73":1,"75":1,"84":1,"87":1,"88":1,"90":1,"93":1,"103":1,"105":1,"107":1,"116":1,"118":1,"119":1,"121":1,"124":1,"134":1,"145":1,"146":8,"148":1,"150":2,"153":2,"162":1,"164":1,"167":1,"168":1,"171":1,"179":1,"180":2,"185":1,"188":1,"198":1,"200":1}}],["either",{"2":{"1":2,"3":1,"6":2,"22":1,"25":1,"27":1,"64":9,"70":1,"72":1,"73":2,"75":1,"76":1,"84":1,"94":1,"116":5,"118":1,"124":1,"125":1,"135":1,"146":1,"150":2,"153":3,"165":1,"197":1}}],["lj",{"2":{"146":2}}],["lrs",{"2":{"180":2}}],["lr",{"2":{"146":3,"153":3}}],["lp",{"2":{"116":2}}],["lstart",{"2":{"116":2}}],["ls",{"2":{"116":12}}],["ll",{"2":{"17":1,"58":1,"175":2,"180":1,"192":1,"194":1}}],["l",{"2":{"14":4,"59":6,"105":2,"116":32}}],["lgeos",{"2":{"180":1}}],["lg",{"2":{"13":1,"14":1,"15":2,"32":5,"33":1,"35":3,"36":3,"37":3,"38":3,"40":3,"41":3,"42":3,"43":3,"44":3,"45":3,"46":3,"47":3,"48":3,"49":3,"50":3,"81":4,"176":9,"180":17}}],["l305",{"2":{"6":1}}],["log10",{"2":{"176":2,"180":4}}],["log",{"2":{"175":2}}],["loudly",{"2":{"153":1}}],["location",{"2":{"64":1,"116":6}}],["locally",{"2":{"158":2}}],["local",{"2":{"53":3,"56":1,"64":4,"71":1,"76":1,"146":1}}],["loose",{"2":{"161":1}}],["lookup",{"2":{"146":1,"153":1}}],["looks",{"2":{"62":1}}],["look",{"2":{"55":2,"146":2,"162":1,"175":1}}],["looping",{"2":{"146":1}}],["loop",{"2":{"53":1,"59":2,"63":3,"64":8,"66":1,"73":1,"76":1,"116":5,"146":3,"182":1}}],["lower",{"2":{"6":1,"7":1,"146":1,"198":1}}],["lon",{"2":{"6":2,"175":1,"176":2}}],["longitude",{"2":{"158":3,"192":2}}],["long",{"2":{"6":1,"73":1,"176":1,"199":1}}],["longer",{"2":{"6":3,"174":1,"176":2,"177":1}}],["lots",{"2":{"192":1}}],["lot",{"2":{"6":1,"23":1,"53":1,"56":1,"63":1,"66":1,"85":1,"88":1,"122":1,"148":1,"175":1,"188":2}}],["load",{"2":{"153":1,"154":1,"180":1,"190":2}}],["loading",{"2":{"60":1,"173":1,"176":1}}],["loads",{"2":{"5":1,"6":1,"59":1}}],["loaded",{"2":{"1":1,"60":3,"172":1,"173":2,"176":2}}],["laptop",{"2":{"199":1}}],["land",{"2":{"192":8}}],["lazily",{"2":{"156":2}}],["layers",{"2":{"151":1}}],["label",{"2":{"14":4,"15":2,"79":2,"81":1,"84":1,"146":3,"175":2,"179":2,"180":2}}],["labels",{"2":{"13":2,"146":1}}],["latitude",{"2":{"158":3,"192":2}}],["later",{"2":{"56":1,"81":1,"146":1}}],["lat",{"2":{"6":3,"175":1,"176":3}}],["larger",{"2":{"64":1,"75":1,"184":1}}],["large",{"2":{"6":8,"59":1,"180":2,"195":1,"199":1}}],["lastindex",{"2":{"184":1}}],["last",{"2":{"4":3,"6":3,"9":1,"53":11,"56":2,"58":2,"64":9,"66":4,"85":7,"88":5,"116":20,"127":1,"146":6,"162":1,"169":2,"182":1}}],["lt",{"2":{"6":6,"73":4,"175":1}}],["len",{"2":{"182":7}}],["length",{"2":{"0":1,"5":1,"6":5,"9":1,"18":1,"59":32,"61":1,"62":1,"63":22,"64":11,"66":1,"69":2,"70":2,"72":1,"73":1,"75":1,"76":1,"116":1,"146":16,"153":2,"154":1,"156":2,"169":2,"175":1,"181":1,"182":1,"183":1,"184":7}}],["legend",{"2":{"180":4}}],["le",{"2":{"116":10}}],["leaving",{"2":{"162":1}}],["leaf",{"2":{"153":1,"156":3}}],["leading",{"2":{"191":1}}],["lead",{"2":{"73":1,"162":1}}],["least",{"2":{"3":4,"6":4,"64":1,"73":1,"76":2,"116":14,"122":6,"125":1,"128":3,"129":2,"130":2,"131":1,"132":1,"135":1,"141":1,"145":1}}],["leftjoin",{"2":{"197":1}}],["leftover",{"2":{"64":1}}],["left=1",{"2":{"64":1}}],["left",{"2":{"59":1,"64":5,"145":1,"146":2,"182":17,"184":5}}],["lets",{"2":{"56":1}}],["let",{"2":{"55":1,"62":1,"116":1,"146":3,"175":1,"191":6,"192":4,"193":3,"194":2,"195":2,"200":1}}],["levels",{"2":{"146":1,"151":1,"159":1}}],["level",{"2":{"6":1,"7":1,"9":1,"18":2,"20":1,"29":1,"151":1,"153":2,"161":1,"163":1,"165":4,"166":1,"167":1,"169":2,"193":2}}],["less",{"2":{"3":1,"6":7,"53":1,"56":1,"59":1,"63":1,"66":1,"85":1,"88":1,"105":1,"122":1,"146":1,"180":1,"181":1}}],["l289",{"2":{"6":1}}],["l2",{"2":{"3":4,"4":4,"6":8,"87":4,"88":12,"90":8,"104":2,"107":5,"121":4,"124":3,"125":2,"134":8}}],["l195",{"2":{"6":1}}],["l177",{"2":{"6":1}}],["l1",{"2":{"3":6,"4":4,"6":10,"87":4,"88":12,"90":8,"93":4,"94":2,"103":4,"104":2,"107":5,"121":4,"124":3,"125":2,"134":8}}],["li",{"2":{"146":2}}],["lie",{"2":{"73":1}}],["lies",{"2":{"64":3,"158":1,"198":1}}],["limitations",{"2":{"73":1}}],["limits",{"2":{"58":1}}],["limited",{"2":{"6":1,"174":1,"177":1}}],["library",{"2":{"69":1,"195":1}}],["libraries",{"2":{"56":1,"167":1,"195":1}}],["libgeos",{"2":{"6":2,"13":1,"14":1,"15":1,"23":1,"32":2,"56":1,"60":5,"81":1,"147":1,"176":7,"180":4,"188":2}}],["little",{"2":{"26":1}}],["literate",{"2":{"26":1,"31":1,"32":1,"50":1,"53":1,"56":1,"59":1,"60":1,"63":1,"64":1,"66":1,"69":1,"71":1,"73":1,"74":1,"76":1,"82":1,"85":1,"88":1,"91":1,"101":1,"104":1,"105":1,"115":1,"116":1,"119":1,"122":1,"132":1,"142":1,"145":1,"146":1,"147":1,"153":1,"154":1,"155":1,"156":1,"160":1,"163":1,"166":1,"169":1,"170":1,"171":1,"173":1,"177":1,"184":1,"185":1,"186":1,"188":1,"189":1}}],["lift",{"2":{"14":2}}],["lin",{"2":{"176":5}}],["linked",{"2":{"77":1}}],["linrange",{"2":{"13":2,"14":5,"58":2,"84":1,"146":2,"176":1,"180":2}}],["linering",{"2":{"192":1}}],["linewidth",{"2":{"55":1,"191":1}}],["linesegment",{"2":{"145":2,"177":1}}],["lines",{"0":{"97":1,"111":1,"128":1,"138":1},"2":{"3":1,"4":4,"6":5,"64":3,"68":1,"73":9,"79":1,"80":2,"81":2,"84":1,"87":4,"88":4,"90":3,"93":1,"94":1,"103":2,"105":1,"107":3,"116":2,"118":3,"121":4,"122":2,"124":4,"134":3,"135":1,"146":3,"178":1,"191":4,"196":2}}],["linestrings",{"2":{"4":2,"6":2,"9":1,"88":2,"144":1,"161":1,"191":1}}],["linestringtrait",{"2":{"3":2,"4":4,"6":7,"11":3,"32":1,"53":1,"63":4,"72":2,"85":2,"88":8,"96":1,"97":4,"98":1,"105":6,"110":1,"111":5,"122":4,"127":1,"128":4,"129":1,"137":1,"138":4,"139":1,"151":1,"159":2,"165":2,"166":1,"177":2}}],["linestring",{"2":{"3":5,"4":6,"6":15,"18":1,"20":1,"53":2,"63":2,"85":4,"87":2,"88":2,"90":2,"91":1,"96":1,"97":3,"104":2,"107":2,"108":1,"110":1,"111":4,"116":2,"121":2,"127":1,"128":3,"129":1,"134":2,"135":1,"137":1,"138":4,"139":1,"145":7,"153":2,"154":2,"189":3,"191":5,"196":1}}],["linetrait",{"2":{"3":2,"4":4,"6":6,"53":1,"64":2,"69":2,"72":2,"85":2,"88":8,"96":1,"97":4,"98":1,"110":1,"111":5,"122":4,"127":1,"128":4,"129":1,"137":1,"138":4,"139":1}}],["line2",{"2":{"3":3,"6":7,"72":2,"73":2,"105":5,"118":3,"119":2,"122":3,"145":5}}],["line1",{"2":{"3":4,"6":8,"72":2,"73":2,"105":5,"118":3,"119":2,"122":5,"145":5}}],["linea",{"2":{"1":1,"6":1,"185":1}}],["linearmap",{"2":{"180":1}}],["linearalgebra",{"2":{"31":1}}],["linear",{"2":{"4":7,"6":10,"9":1,"56":2,"59":1,"62":1,"63":3,"66":1,"73":1,"85":5,"88":8,"98":1,"116":2,"128":1,"129":2,"138":1,"144":1,"153":1,"154":1,"158":1,"163":3,"175":5,"176":3,"177":4}}],["linearr",{"2":{"1":1,"6":1,"185":1}}],["linearrings",{"2":{"9":1,"112":1,"146":6,"161":1,"191":1}}],["linearringtrait",{"2":{"4":4,"6":4,"11":3,"32":1,"53":3,"56":2,"63":4,"64":4,"72":2,"85":2,"88":8,"96":1,"97":1,"98":4,"110":1,"111":2,"112":3,"127":1,"128":1,"129":4,"137":1,"138":1,"139":4,"159":2,"165":1,"177":2,"180":1}}],["linearring",{"2":{"1":10,"3":2,"4":1,"6":13,"31":1,"53":2,"63":2,"64":2,"75":2,"76":1,"82":1,"85":1,"96":1,"98":3,"110":1,"111":1,"112":2,"116":2,"122":4,"127":1,"128":1,"129":3,"137":1,"139":4,"145":1,"146":3,"150":2,"153":5,"154":2,"161":1,"162":6,"163":1,"168":13,"180":1,"185":8,"191":24,"192":6,"193":8,"198":2}}],["linearsegments",{"2":{"0":1,"6":1,"174":1,"175":1,"176":3,"177":2}}],["line",{"0":{"116":1},"2":{"0":1,"3":13,"4":9,"6":52,"23":1,"52":2,"53":7,"62":3,"63":10,"64":12,"66":8,"68":6,"69":18,"72":8,"73":67,"76":6,"85":11,"88":5,"91":2,"93":2,"94":1,"96":2,"97":11,"98":8,"103":1,"105":11,"108":2,"110":1,"111":9,"112":4,"116":141,"118":2,"119":2,"121":3,"122":12,"124":2,"125":2,"127":1,"128":10,"129":3,"135":2,"137":2,"138":10,"139":7,"145":6,"146":2,"177":1,"180":1,"181":1,"182":4,"183":1,"189":3,"191":3}}],["lineorientation",{"2":{"0":1,"6":2,"72":2}}],["lists",{"2":{"20":1,"64":3,"122":1}}],["listed",{"2":{"6":1,"53":1,"180":1}}],["list",{"2":{"6":16,"9":1,"53":20,"64":233,"69":20,"70":14,"71":8,"72":13,"73":5,"75":13,"76":1,"199":2}}],["likely",{"2":{"151":1}}],["like",{"0":{"74":1},"2":{"1":2,"6":5,"17":1,"18":2,"19":1,"20":1,"23":1,"24":1,"29":1,"56":1,"58":1,"59":1,"62":1,"66":1,"70":1,"72":1,"75":1,"82":1,"84":1,"85":1,"88":1,"148":2,"150":2,"153":1,"154":2,"159":2,"165":2,"166":1,"174":1,"175":1,"192":2}}],["iah",{"2":{"196":2}}],["image",{"2":{"146":1}}],["impossible",{"2":{"69":1,"121":1}}],["important",{"2":{"175":1}}],["import",{"2":{"1":3,"6":4,"13":2,"14":2,"15":1,"31":9,"52":1,"55":1,"60":1,"62":1,"65":1,"69":1,"70":1,"72":1,"73":1,"75":1,"84":1,"87":1,"88":1,"90":1,"91":1,"93":1,"94":1,"103":1,"104":1,"105":1,"107":1,"108":1,"118":1,"119":1,"121":1,"122":1,"124":1,"125":1,"134":1,"135":1,"145":3,"150":1,"153":2,"154":1,"173":1,"176":2,"179":2,"180":3,"185":2,"189":1,"190":5}}],["implements",{"2":{"32":1,"188":1}}],["implementing",{"2":{"6":1,"180":1}}],["implement",{"2":{"6":1,"17":1,"23":1,"53":1,"56":1,"59":1,"63":1,"66":1,"82":1,"85":1,"88":1,"94":1,"108":1,"122":1,"125":1,"135":1,"148":1,"164":1,"165":3,"166":1}}],["implementation",{"0":{"53":1,"56":1,"63":1,"66":1,"69":1,"82":1,"85":1,"88":1,"91":1,"94":1,"104":1,"108":1,"119":1,"122":1,"125":1,"135":1,"163":1,"169":1,"177":1},"2":{"6":1,"53":3,"56":3,"59":1,"63":3,"66":3,"75":1,"85":3,"88":3,"91":1,"94":2,"104":1,"108":2,"119":1,"122":3,"125":2,"135":2,"146":2,"147":1,"153":1,"154":1,"172":1,"177":1,"180":1,"188":1}}],["implementations",{"2":{"6":1,"94":1,"108":1,"125":1,"135":1,"147":1,"178":1,"188":3}}],["implemented",{"0":{"147":1},"2":{"1":1,"6":2,"31":1,"56":1,"59":3,"69":2,"71":2,"73":2,"76":2,"82":1,"85":2,"147":1,"148":2,"154":1,"165":2,"172":1,"178":1}}],["improvements",{"2":{"9":2,"10":1}}],["improve",{"2":{"4":1,"6":1,"170":1}}],["i=2",{"2":{"145":1}}],["ipoints",{"2":{"116":4}}],["ip",{"2":{"88":2}}],["ipt",{"2":{"64":8}}],["ihole",{"2":{"88":2}}],["ih",{"2":{"76":22}}],["i2",{"2":{"66":2}}],["i1",{"2":{"66":2}}],["ii",{"2":{"64":8}}],["io",{"2":{"60":5,"173":5,"176":5}}],["i+1",{"2":{"59":8,"146":1,"182":2,"184":1}}],["i",{"2":{"9":1,"13":4,"22":1,"53":14,"56":1,"59":16,"64":28,"66":4,"71":2,"75":2,"76":4,"85":2,"88":8,"105":7,"116":28,"145":14,"146":17,"153":8,"154":8,"177":2,"181":3,"182":12,"184":28,"189":2,"191":2,"192":1,"199":3}}],["id",{"2":{"194":1}}],["identical",{"2":{"153":1,"168":1}}],["identity",{"2":{"146":4,"156":2,"170":1}}],["ideal",{"2":{"146":1}}],["idea",{"2":{"6":1,"20":1,"25":1,"27":1,"59":1,"148":1,"154":1}}],["idx`",{"2":{"64":1}}],["idx",{"2":{"53":6,"64":167,"66":9,"69":23,"70":5,"72":5,"75":2,"169":34,"182":51}}],["id=",{"2":{"6":2}}],["ignored",{"2":{"6":1,"146":1}}],["ignore",{"2":{"6":1,"146":2}}],["innerjoin",{"2":{"197":1,"198":1,"199":1}}],["inner",{"2":{"116":6,"153":5}}],["in=1",{"2":{"116":1}}],["in`",{"2":{"116":1}}],["inject",{"0":{"74":1},"2":{"173":1}}],["inaccuracies",{"2":{"73":1}}],["ind",{"2":{"199":2}}],["individual",{"2":{"193":1}}],["indices",{"2":{"64":4,"153":2,"154":2,"184":16}}],["indicates",{"2":{"20":1}}],["indeed",{"2":{"162":1}}],["index",{"2":{"59":8,"64":11,"116":1,"153":1,"182":1}}],["inds",{"2":{"146":3}}],["inplace",{"2":{"59":1}}],["inputs",{"2":{"6":1,"64":1,"88":1,"91":1,"104":1,"119":1,"184":1}}],["input",{"2":{"6":11,"53":1,"69":1,"70":1,"72":1,"73":1,"75":1,"146":1,"148":1,"154":1,"176":3,"177":1,"181":1,"182":1,"183":1,"192":1}}],["inbounds",{"2":{"59":16,"85":5,"116":1}}],["inspiration",{"2":{"69":1}}],["inspired",{"2":{"68":1,"69":2}}],["inside",{"2":{"53":3,"62":1,"64":3,"66":1,"70":1,"71":1,"72":1,"73":1,"75":1,"76":2,"84":3,"85":1,"96":1,"116":1,"134":1,"137":1,"146":2}}],["insertion",{"2":{"64":1}}],["insert",{"2":{"53":1,"182":1}}],["instability",{"2":{"24":2}}],["instantiating",{"2":{"20":1}}],["instead",{"2":{"18":1,"24":1,"154":1,"177":1}}],["instructs",{"2":{"6":1,"188":2}}],["inline",{"2":{"32":1,"116":4,"145":1,"153":12,"154":10,"160":2}}],["init=nothing",{"2":{"154":1}}],["init=typemax",{"2":{"85":2}}],["init=zero",{"2":{"56":1,"66":1}}],["initial",{"2":{"73":2,"176":1}}],["initially",{"2":{"64":1}}],["initialize",{"2":{"59":3,"63":2,"64":1,"73":1}}],["init",{"2":{"19":1,"31":1,"53":1,"63":2,"154":30,"176":4}}],["incorrect",{"2":{"161":1,"162":1}}],["increase",{"2":{"64":1,"116":1}}],["increasing",{"2":{"6":1,"180":1}}],["increment",{"2":{"59":5}}],["including",{"2":{"53":1,"64":2,"73":1,"85":1,"96":1,"97":1,"98":1,"99":1,"116":2}}],["include",{"2":{"31":41,"53":1,"64":1,"77":1,"85":2,"160":1,"180":2,"193":2,"194":1}}],["included",{"2":{"6":2,"76":2,"166":2,"169":2,"193":1}}],["includes",{"2":{"4":2,"6":2,"76":1,"85":2,"88":1,"116":1}}],["incircle",{"0":{"16":1}}],["inv",{"2":{"158":3}}],["investigate",{"2":{"146":1}}],["investigating",{"0":{"81":1}}],["inverted",{"2":{"6":1,"82":1}}],["invalid",{"2":{"20":1,"71":2,"162":1,"167":1,"168":1}}],["invoke",{"2":{"20":1}}],["involved",{"2":{"148":1}}],["involve",{"2":{"20":1}}],["involving",{"2":{"6":3,"70":1,"72":1,"75":1}}],["invocation",{"2":{"18":1}}],["ing",{"2":{"1":1,"6":2,"59":1,"185":1}}],["intr",{"2":{"64":28,"66":9,"69":16,"73":8}}],["intr2",{"2":{"64":2,"73":14}}],["intr1",{"2":{"64":3,"73":21,"116":2}}],["intrs",{"2":{"64":10,"73":5}}],["introduction",{"0":{"27":1},"1":{"28":1,"29":1,"30":1}}],["introducing",{"2":{"24":1}}],["introduces",{"2":{"24":1}}],["int",{"2":{"64":6,"76":7,"105":7,"177":1,"180":1,"182":5,"183":1,"184":1}}],["integrate",{"2":{"56":1}}],["integrating",{"2":{"56":1}}],["integrals",{"2":{"55":1}}],["integral",{"2":{"55":1}}],["intended",{"2":{"6":1,"165":2,"166":1}}],["intermediate",{"2":{"66":1}}],["inter2",{"2":{"66":15}}],["inter1",{"2":{"66":23}}],["interpreted",{"2":{"59":1}}],["interpolation",{"2":{"5":1,"6":1,"58":1,"59":2,"174":1}}],["interpolated",{"2":{"5":3,"6":3,"59":17,"174":1}}],["interpolate",{"2":{"0":2,"5":2,"6":4,"57":1,"58":2,"59":25}}],["interest",{"2":{"59":1,"85":1}}],["internal",{"2":{"58":1}}],["internals",{"2":{"24":1}}],["inter",{"2":{"6":3,"64":21,"69":1,"70":1,"72":5,"73":4}}],["interface",{"0":{"165":1},"2":{"6":3,"20":1,"77":1,"82":1,"153":1,"164":1,"165":4,"166":1,"180":1,"192":1}}],["interacted",{"2":{"116":1}}],["interaction",{"0":{"116":1},"2":{"116":2}}],["interactions",{"2":{"64":1,"76":3,"116":15}}],["interactive",{"2":{"13":1,"14":1}}],["interacting",{"2":{"6":1,"72":1,"116":2}}],["interacts",{"2":{"3":1,"6":1,"116":3,"124":1,"125":1,"128":3,"129":1,"130":1}}],["interact",{"2":{"3":2,"6":2,"75":1,"76":1,"107":1,"116":5,"119":1,"124":1,"125":1,"127":1,"128":2,"129":2,"130":1}}],["interior",{"2":{"3":6,"6":7,"53":9,"55":1,"59":7,"63":5,"64":1,"76":18,"90":1,"91":1,"93":1,"94":3,"97":5,"98":1,"99":2,"103":2,"104":1,"105":1,"108":2,"110":2,"111":6,"112":3,"116":15,"124":1,"125":3,"128":1,"129":2,"130":2,"134":1,"135":3,"140":2,"145":2,"163":1,"166":1}}],["interiors",{"2":{"3":6,"6":7,"59":20,"90":1,"91":1,"93":1,"103":1,"104":1,"107":1,"108":1,"113":1,"116":5,"118":1,"119":1,"124":1,"125":1,"127":1,"128":2,"129":1,"134":1,"135":1,"138":3,"139":3}}],["intersectingpolygons",{"2":{"6":3}}],["intersecting",{"0":{"167":1},"1":{"168":1,"169":1},"2":{"6":4,"31":1,"64":2,"76":2,"166":4,"167":1,"169":4}}],["intersections",{"0":{"73":1},"2":{"64":2,"66":2,"71":1,"72":2,"73":1,"76":1,"116":2}}],["intersection",{"0":{"37":1,"72":1,"117":1},"1":{"118":1,"119":1},"2":{"0":2,"3":3,"6":19,"9":1,"15":4,"23":1,"31":1,"37":2,"64":38,"66":6,"69":3,"70":4,"71":4,"72":15,"73":73,"75":2,"76":2,"105":2,"116":6,"118":1,"122":5}}],["intersect",{"2":{"3":8,"6":11,"64":4,"66":3,"70":2,"72":1,"73":1,"75":1,"76":5,"90":1,"91":2,"93":1,"94":1,"104":1,"108":1,"111":1,"113":1,"116":4,"118":2,"122":1,"134":1,"135":2,"138":3,"139":3,"168":1,"169":4}}],["intersects",{"0":{"49":1,"118":1},"2":{"0":2,"3":3,"6":6,"31":1,"49":2,"64":1,"73":2,"76":2,"105":2,"117":1,"118":4,"119":4,"122":5,"140":1,"169":2,"197":1}}],["into",{"2":{"5":1,"6":5,"17":1,"26":1,"53":1,"56":1,"59":1,"63":4,"64":2,"69":1,"70":1,"72":1,"116":1,"146":4,"153":3,"154":2,"155":1,"156":2,"159":1,"169":1,"180":1,"189":2,"191":2,"197":1}}],["int64",{"2":{"1":6,"6":6,"162":6,"181":1,"182":1,"184":1,"185":6,"191":14}}],["influence",{"2":{"158":1}}],["infinity",{"2":{"116":1,"122":1}}],["info",{"2":{"6":2,"174":1}}],["information",{"0":{"193":1},"2":{"6":1,"29":1,"59":1,"64":2,"65":1,"73":1,"82":1,"116":1,"190":1,"193":3,"195":2}}],["inf",{"2":{"1":1,"9":1,"69":2,"181":1,"184":3}}],["in",{"0":{"23":1},"2":{"1":6,"3":3,"4":1,"5":4,"6":45,"7":1,"9":2,"13":6,"14":2,"17":2,"18":4,"20":1,"23":3,"24":2,"25":1,"26":3,"27":1,"29":1,"30":1,"31":2,"32":1,"33":1,"53":7,"55":1,"56":3,"57":2,"59":22,"60":1,"62":2,"63":5,"64":72,"66":31,"69":6,"70":9,"71":3,"72":5,"73":29,"75":11,"76":28,"81":1,"82":3,"84":6,"85":6,"87":1,"88":17,"90":2,"91":1,"94":10,"97":1,"98":1,"99":1,"100":1,"101":1,"104":1,"105":7,"108":9,"110":1,"111":1,"112":1,"114":1,"115":1,"116":135,"118":2,"119":1,"121":1,"122":11,"124":1,"125":11,"129":1,"131":1,"132":1,"134":1,"135":10,"138":3,"139":3,"141":1,"142":1,"145":4,"146":10,"147":3,"148":1,"150":2,"151":2,"152":1,"153":8,"154":4,"156":10,"157":1,"158":5,"159":1,"160":1,"164":1,"165":1,"166":2,"167":1,"169":7,"170":1,"171":2,"172":3,"173":1,"174":2,"175":2,"176":14,"177":8,"178":1,"180":5,"181":2,"182":4,"183":1,"184":5,"185":2,"186":1,"187":4,"188":4,"189":8,"190":1,"191":2,"192":6,"195":2,"197":4,"198":3,"199":1,"200":1}}],["itererable",{"2":{"189":1}}],["iter",{"2":{"156":31}}],["iterator",{"2":{"64":4,"72":2,"156":4}}],["iterators",{"2":{"13":1,"59":1,"64":5,"66":3,"72":1,"76":2,"146":1,"153":2,"154":3,"156":8,"169":6,"177":1}}],["iterate",{"2":{"59":2,"151":1,"153":1,"156":4}}],["iteration",{"2":{"56":1}}],["iterabletype",{"2":{"153":5,"154":6}}],["iterable",{"2":{"4":1,"6":2,"18":1,"56":1,"66":1,"82":1,"153":17,"154":15,"156":11,"191":1}}],["iterables",{"2":{"1":2,"22":1,"150":2,"153":1,"154":2,"156":3}}],["ith",{"2":{"64":3,"76":7}}],["itself",{"2":{"66":1,"145":1,"151":1}}],["its",{"2":{"5":1,"6":9,"18":1,"55":1,"59":1,"64":2,"66":4,"76":1,"97":1,"156":2,"164":1,"180":1,"181":1,"182":1,"183":3,"197":1}}],["it",{"2":{"1":4,"4":1,"6":14,"9":1,"18":11,"19":2,"20":1,"22":1,"29":3,"30":1,"52":1,"53":1,"55":2,"56":3,"58":1,"60":1,"63":2,"64":2,"65":1,"66":2,"70":1,"71":1,"72":1,"73":4,"75":1,"76":3,"81":2,"82":2,"85":3,"88":1,"93":2,"96":3,"110":3,"116":14,"121":1,"122":1,"127":2,"137":3,"144":1,"145":2,"146":4,"148":3,"150":1,"151":3,"152":1,"153":8,"154":5,"156":8,"158":1,"159":2,"160":2,"162":1,"163":1,"164":1,"166":1,"167":1,"172":5,"175":2,"176":1,"177":1,"180":1,"182":1,"187":1,"188":7,"192":3,"193":3,"195":3,"199":2,"200":2}}],["iff",{"2":{"153":1}}],["if",{"0":{"74":1},"2":{"1":5,"3":17,"4":19,"5":1,"6":68,"18":1,"22":2,"32":1,"52":1,"53":15,"55":1,"56":6,"59":5,"60":3,"63":1,"64":95,"66":36,"69":8,"70":13,"71":12,"72":9,"73":44,"75":10,"76":22,"82":3,"84":2,"85":8,"87":2,"88":35,"90":1,"91":1,"93":1,"94":2,"96":4,"97":3,"98":3,"99":2,"100":1,"101":1,"103":1,"104":1,"105":9,"107":1,"108":3,"110":5,"111":4,"112":2,"113":2,"114":1,"115":1,"116":132,"118":1,"119":1,"121":4,"122":16,"124":1,"125":2,"127":4,"128":3,"129":2,"130":2,"131":1,"132":1,"134":1,"135":2,"137":5,"138":3,"139":3,"140":1,"141":1,"142":1,"145":5,"146":35,"150":3,"151":1,"153":19,"154":6,"156":9,"160":1,"163":1,"165":1,"166":2,"167":1,"169":12,"170":1,"171":1,"172":3,"173":2,"176":6,"177":1,"180":1,"182":12,"184":12,"185":1,"186":1,"188":2,"192":1,"195":1,"198":2,"199":1}}],["isolate",{"2":{"180":1}}],["isodd",{"2":{"69":1}}],["ismeasured",{"2":{"156":2}}],["istable",{"2":{"153":1,"154":1,"156":1}}],["isequal",{"2":{"146":1}}],["iseven",{"2":{"116":1}}],["isempty",{"2":{"56":1,"59":4,"66":1,"70":1,"71":2,"72":1,"146":1,"165":1,"182":1}}],["isparallel",{"2":{"116":1,"145":8}}],["is3d",{"2":{"88":1,"156":2,"171":1,"185":1,"186":1,"189":10}}],["issue",{"2":{"64":1}}],["issues",{"2":{"25":1,"27":1}}],["isa",{"2":{"18":1,"59":9,"153":3,"154":1,"177":2,"189":1}}],["isnothing",{"2":{"60":1,"64":9,"69":1,"71":2,"73":2,"76":2,"88":1,"146":1,"173":1,"176":1,"180":1,"181":1,"182":5,"183":1,"184":6}}],["isn",{"2":{"6":1,"56":1,"64":4,"66":1,"69":1,"71":1,"73":3,"76":2,"85":3,"88":1,"93":1,"116":9,"122":1,"180":1,"188":1}}],["isconcave",{"0":{"145":1},"2":{"0":1,"6":2,"81":1,"143":1,"145":3}}],["isclockwise",{"0":{"144":1},"2":{"0":1,"6":2,"66":1,"143":1,"145":5,"146":2}}],["is",{"0":{"25":1,"52":1,"55":2,"62":1,"65":1,"68":1,"84":2,"87":1,"90":1,"93":1,"103":1,"107":1,"118":1,"121":1,"124":1,"134":1,"151":1},"2":{"0":1,"1":10,"3":8,"4":43,"5":1,"6":103,"9":3,"11":1,"13":1,"14":1,"18":3,"19":1,"20":1,"22":3,"23":2,"25":2,"27":2,"52":1,"53":19,"55":7,"56":19,"57":2,"58":2,"59":15,"60":3,"62":2,"63":5,"64":82,"65":3,"66":22,"68":1,"69":2,"70":4,"71":13,"72":4,"73":40,"75":7,"76":20,"77":1,"81":5,"82":4,"84":8,"85":23,"88":13,"90":2,"91":3,"93":4,"94":4,"96":7,"97":3,"98":3,"99":1,"100":1,"101":1,"104":3,"105":3,"107":1,"108":5,"110":9,"111":4,"112":2,"113":1,"114":1,"115":1,"116":91,"119":2,"121":3,"122":12,"125":4,"127":2,"134":4,"135":5,"137":8,"138":3,"139":3,"140":1,"141":2,"142":1,"144":2,"145":7,"146":11,"147":1,"148":3,"150":3,"151":3,"152":1,"153":18,"154":4,"156":7,"158":11,"159":1,"160":1,"161":7,"162":2,"163":1,"164":3,"165":2,"166":1,"167":4,"168":1,"169":2,"171":1,"172":7,"173":2,"174":3,"175":3,"176":9,"177":8,"179":1,"180":4,"181":1,"182":2,"183":1,"185":2,"187":1,"188":3,"191":4,"192":5,"193":3,"194":1,"195":3,"197":2,"198":5,"199":2}}],["cpu",{"2":{"199":1}}],["cp",{"2":{"196":1}}],["circumstances",{"2":{"158":2}}],["cy",{"2":{"145":2}}],["cyan",{"2":{"60":1,"173":1,"176":1}}],["cx",{"2":{"145":2}}],["cdot",{"2":{"145":1}}],["cs",{"2":{"116":9}}],["cshape",{"2":{"62":3}}],["cw",{"2":{"66":2}}],["cb",{"2":{"58":1,"81":1,"146":1}}],["cgrad",{"2":{"58":1}}],["cgal",{"2":{"58":1}}],["c",{"2":{"32":1,"56":1,"62":1,"66":4,"69":5,"74":3,"116":24,"176":1}}],["cleaner",{"2":{"82":1}}],["cleanest",{"2":{"82":1}}],["clear",{"2":{"65":1}}],["clearly",{"2":{"52":1,"55":1,"84":1}}],["clamped",{"2":{"73":18}}],["clamp",{"2":{"53":1,"73":1}}],["classified",{"2":{"64":1}}],["classify",{"2":{"64":4}}],["class",{"2":{"6":1,"146":1}}],["class=",{"2":{"6":6}}],["clipping",{"0":{"64":1,"70":1,"71":1,"73":1,"75":1,"76":1},"2":{"6":1,"9":1,"31":8,"64":9,"69":3,"70":1,"72":1,"75":1,"167":1}}],["closure",{"2":{"153":2}}],["closing",{"2":{"53":1}}],["closer",{"2":{"158":1}}],["close",{"2":{"53":5,"64":2,"66":1,"69":1,"73":1,"85":9,"146":1,"162":1,"163":4}}],["closest",{"2":{"4":3,"6":3,"73":2,"84":1,"85":6,"158":1}}],["closed2",{"2":{"88":2}}],["closed1",{"2":{"88":2}}],["closed",{"0":{"161":1},"1":{"162":1,"163":1},"2":{"4":4,"6":11,"9":1,"31":1,"53":6,"56":3,"63":3,"64":1,"66":1,"73":1,"76":3,"88":21,"96":2,"97":5,"98":5,"110":2,"111":5,"112":3,"116":52,"128":5,"129":1,"137":3,"138":5,"139":5,"145":1,"146":1,"161":1,"162":1,"163":2,"164":1,"166":1,"191":1}}],["closedring",{"2":{"0":1,"6":1,"161":1,"162":1,"163":4,"164":1,"165":1,"166":1}}],["clockwise",{"2":{"4":1,"6":4,"9":1,"55":1,"56":1,"66":7,"81":1,"144":2,"145":3,"146":1}}],["ceil",{"2":{"177":1}}],["ce",{"2":{"116":11}}],["certainly",{"2":{"73":1}}],["certain",{"2":{"17":1,"18":1,"26":1,"29":1}}],["central",{"2":{"64":1}}],["centroids",{"2":{"62":1,"63":1}}],["centroid",{"0":{"61":1,"62":1},"1":{"62":1,"63":1},"2":{"0":4,"4":2,"6":6,"31":1,"61":3,"62":4,"63":38,"148":1,"154":1,"180":4}}],["cent",{"2":{"62":2}}],["centered",{"2":{"64":1}}],["center",{"2":{"6":1,"62":1,"146":1}}],["cells",{"2":{"146":1}}],["cell",{"2":{"6":4,"65":3,"66":28,"146":2}}],["children",{"2":{"180":1}}],["child",{"2":{"156":19}}],["chunks",{"2":{"153":4,"154":5}}],["chunk",{"2":{"153":6,"154":7}}],["chull",{"2":{"50":2}}],["chose",{"2":{"24":1,"146":1}}],["choose",{"2":{"6":1,"82":1,"146":2}}],["changes",{"2":{"64":1}}],["changed",{"2":{"64":1}}],["change",{"2":{"24":1,"64":1,"81":1}}],["chain=2",{"2":{"64":1}}],["chain=1",{"2":{"64":1}}],["chain",{"2":{"64":66,"71":3,"73":4,"76":4,"81":2}}],["chains",{"2":{"20":1,"64":1}}],["chairmarks",{"2":{"13":1,"176":1,"180":1}}],["checkargs",{"2":{"181":1,"182":1,"183":1,"184":1}}],["checking",{"2":{"88":1,"182":1}}],["checks",{"0":{"105":1,"117":1},"1":{"118":1,"119":1},"2":{"60":1,"64":1,"73":1,"87":1,"90":1,"93":1,"103":1,"107":1,"116":5,"118":1,"121":1,"122":1,"124":1,"134":1,"198":1}}],["check",{"2":{"4":1,"6":1,"7":1,"63":1,"64":8,"66":3,"69":1,"70":1,"73":4,"74":1,"75":1,"88":8,"116":11,"146":5,"153":1,"168":1,"170":1,"175":2,"182":1,"184":1}}],["checked",{"2":{"4":1,"6":1,"64":1,"73":1,"81":1,"116":1,"170":1}}],["c2",{"2":{"6":3,"15":2,"85":3,"88":14,"146":21}}],["c1",{"2":{"6":3,"15":2,"85":4,"88":13,"146":26}}],["ctor",{"2":{"1":1,"6":1,"185":1}}],["categorize",{"2":{"69":1}}],["categorical",{"2":{"58":1}}],["came",{"2":{"69":1}}],["case",{"2":{"53":1,"57":2,"63":1,"64":1,"70":1,"73":2,"76":1,"116":16,"154":1,"177":1,"200":1}}],["cases",{"2":{"6":1,"59":1,"69":2,"116":3,"151":1,"153":1,"154":1,"156":3}}],["cause",{"2":{"18":1,"23":1,"182":1}}],["careful",{"2":{"59":1,"151":1}}],["care",{"2":{"17":1,"153":1,"158":1}}],["carried",{"2":{"6":1,"188":1}}],["cairomakie",{"2":{"13":1,"52":1,"55":1,"58":2,"62":1,"65":1,"68":1,"79":1,"80":1,"81":1,"84":1,"87":1,"90":1,"93":1,"103":1,"107":1,"118":1,"121":1,"124":1,"134":1,"175":1,"176":1,"180":1,"190":1,"196":1,"198":1,"199":1}}],["california",{"2":{"199":1}}],["callable",{"2":{"146":4,"165":1}}],["calls",{"2":{"64":1,"73":1,"76":1,"85":1,"94":1,"108":1,"125":1,"135":1,"151":1,"153":1,"177":1}}],["calling",{"2":{"33":1,"64":2,"153":1}}],["call",{"2":{"18":1,"24":1,"56":1,"63":1,"153":4,"178":1}}],["called",{"2":{"6":2,"63":3,"64":1,"153":1,"163":1,"165":1,"166":1,"188":1,"192":1}}],["calculation",{"2":{"73":1}}],["calculations",{"2":{"6":1,"25":2,"27":2,"73":1,"158":2,"176":1}}],["calculating",{"2":{"4":1,"6":1,"18":1,"64":1,"170":1}}],["calculated",{"2":{"6":1,"62":2,"66":1,"73":2,"85":1,"153":4}}],["calculates",{"2":{"4":2,"6":6,"56":1,"59":2,"66":1,"73":2,"75":1,"85":2,"176":1,"183":1}}],["calculate",{"2":{"1":2,"5":1,"6":5,"11":1,"53":3,"59":3,"63":1,"66":1,"73":1,"116":1,"146":1,"150":1,"153":3,"155":1}}],["calc",{"2":{"1":2,"6":3,"24":1,"31":1,"32":1,"35":2,"36":2,"37":2,"38":2,"50":1,"53":4,"150":1,"152":1,"153":19,"155":1,"160":1,"170":1,"180":2}}],["cache",{"2":{"6":1,"59":1}}],["cant",{"2":{"88":1,"146":1,"189":1}}],["cannot",{"2":{"3":3,"4":2,"6":5,"56":1,"88":1,"96":1,"99":1,"122":2,"125":1,"127":2,"129":1,"140":1}}],["can",{"2":{"1":1,"4":2,"6":14,"7":2,"9":1,"13":1,"14":1,"24":1,"26":1,"31":1,"53":1,"56":1,"57":2,"58":1,"59":3,"60":1,"63":1,"64":3,"66":1,"70":3,"72":3,"73":1,"75":3,"76":1,"81":1,"82":2,"87":1,"88":3,"90":1,"93":1,"105":1,"107":1,"116":23,"118":2,"121":2,"122":3,"124":1,"128":1,"129":1,"134":1,"137":1,"138":1,"139":1,"146":1,"147":1,"148":1,"150":1,"152":1,"153":8,"155":1,"156":2,"158":1,"162":2,"163":1,"166":1,"167":2,"168":1,"170":1,"173":1,"175":1,"176":2,"180":2,"188":1,"191":6,"192":1,"193":3,"195":3,"197":3,"198":3}}],["creation",{"2":{"191":1,"193":1}}],["creating",{"0":{"190":1,"191":1,"194":1},"1":{"191":1,"192":1,"193":1,"194":1,"195":1},"2":{"116":1}}],["creates",{"2":{"7":1,"64":3}}],["create",{"0":{"193":1},"2":{"6":2,"13":2,"14":1,"64":1,"69":1,"73":2,"82":1,"146":2,"153":1,"166":2,"167":3,"169":2,"190":2,"191":4,"192":5,"193":3,"194":1,"195":1,"198":1}}],["created",{"2":{"4":2,"6":2,"64":1,"85":3}}],["criteria",{"2":{"94":2,"108":2,"125":2,"135":2,"182":3}}],["cropping",{"2":{"58":2}}],["cross=1",{"2":{"72":1}}],["cross`",{"2":{"72":1}}],["crossings",{"2":{"64":3,"116":1}}],["crossing",{"0":{"105":1},"2":{"6":2,"64":81,"70":1,"71":7,"72":3,"73":7,"75":1,"76":6,"94":1,"105":1,"116":1,"135":1}}],["cross",{"0":{"132":1},"2":{"6":1,"9":1,"53":3,"64":13,"69":14,"70":2,"71":1,"72":2,"73":10,"74":4,"75":2,"76":1,"94":1,"105":2,"108":1,"116":17,"122":2,"125":1,"135":1,"145":3}}],["crosses",{"0":{"43":1},"2":{"0":2,"3":2,"6":3,"31":1,"43":2,"64":1,"69":1,"105":26,"116":2,"197":1}}],["crc",{"2":{"6":1,"59":1}}],["crs2",{"2":{"192":2}}],["crs1",{"2":{"192":2,"193":1}}],["crs=nothing",{"2":{"153":1,"170":1,"180":1}}],["crs=gi",{"2":{"153":5,"156":3}}],["crs`",{"2":{"153":1,"172":6}}],["crs",{"0":{"192":1},"2":{"1":16,"4":2,"6":8,"31":1,"32":2,"35":2,"36":2,"37":2,"38":2,"50":2,"82":1,"146":10,"150":2,"152":3,"153":36,"155":2,"156":4,"170":1,"172":7,"180":1,"190":1,"192":13,"193":7,"195":1}}],["customize",{"2":{"153":1,"154":1}}],["custom",{"0":{"200":1},"2":{"6":3,"59":1,"200":2}}],["curr^2",{"2":{"53":2}}],["curr",{"2":{"53":8,"64":116,"69":9,"76":3,"169":26}}],["currentnode",{"2":{"146":8}}],["current",{"2":{"53":1,"59":8,"64":3,"69":2,"71":1,"73":1,"76":6,"146":2,"169":3}}],["currently",{"2":{"5":1,"6":3,"23":1,"59":1,"64":1,"69":1,"71":2,"146":1,"153":1,"158":2}}],["curve",{"0":{"116":1},"2":{"3":1,"4":7,"6":18,"53":6,"56":7,"64":5,"66":3,"72":7,"84":1,"85":22,"88":6,"94":2,"96":4,"97":9,"98":9,"108":1,"110":4,"111":6,"112":3,"116":152,"122":1,"125":1,"128":6,"130":3,"135":1,"137":4,"138":6,"139":6}}],["curves",{"2":{"0":1,"3":1,"6":5,"56":3,"66":3,"73":1,"84":1,"85":1,"88":13,"99":1,"116":1,"122":1,"140":1,"180":2}}],["cutpolygon",{"2":{"68":1}}],["cuts",{"2":{"68":1}}],["cutting",{"0":{"67":1},"1":{"68":1,"69":1},"2":{"64":1,"69":2}}],["cut",{"0":{"68":1},"2":{"0":1,"6":6,"31":1,"59":1,"67":1,"68":5,"69":22,"116":1}}],["coastlines",{"2":{"196":1}}],["coarse",{"2":{"6":1,"174":1,"177":1}}],["cos",{"2":{"191":3,"192":1,"193":2}}],["copy",{"2":{"153":1,"165":1,"184":1}}],["coors1",{"2":{"145":2}}],["coors2",{"2":{"145":3}}],["coord",{"2":{"177":6}}],["coords",{"2":{"69":9,"177":8}}],["coordinatetransformations",{"2":{"1":2,"6":2,"180":1,"185":2,"190":1,"191":5,"193":2}}],["coordinate",{"0":{"59":1,"171":1,"192":1,"193":1},"2":{"1":4,"5":5,"6":7,"25":1,"27":1,"58":2,"59":10,"172":4,"177":1,"190":3,"192":1}}],["coordinates",{"0":{"5":1,"57":1},"1":{"58":1,"59":1},"2":{"0":4,"1":1,"4":2,"5":7,"6":20,"56":2,"57":8,"59":25,"64":2,"65":1,"69":2,"70":1,"72":1,"75":1,"85":1,"88":2,"148":1,"158":2,"171":2,"172":1,"175":1,"176":3,"192":2}}],["co",{"2":{"116":2}}],["core",{"2":{"157":1}}],["corner",{"2":{"66":4,"146":1}}],["corners",{"2":{"66":1}}],["correspondent",{"2":{"145":1}}],["correspond",{"2":{"64":1}}],["corresponding",{"2":{"53":3,"71":2}}],["corrected",{"2":{"165":1}}],["correctness",{"2":{"161":1,"188":1}}],["correctly",{"2":{"153":1,"175":1}}],["correcting",{"2":{"20":1,"165":1}}],["corrections",{"0":{"164":1,"166":1},"1":{"165":1,"166":1},"2":{"162":1,"165":6,"168":1}}],["correction",{"2":{"6":10,"31":4,"70":1,"71":2,"72":1,"73":2,"75":1,"76":2,"161":1,"163":2,"164":2,"165":8,"166":7,"167":1,"169":2}}],["correct",{"2":{"6":3,"24":1,"53":1,"56":1,"63":1,"64":1,"66":1,"70":1,"72":1,"75":1,"85":1,"88":1,"94":1,"108":1,"122":1,"125":1,"135":1,"161":1,"162":2,"164":1}}],["cov",{"2":{"66":16}}],["cover",{"2":{"96":1,"100":1}}],["covering",{"2":{"6":2,"103":1,"166":2,"169":2}}],["covered",{"0":{"98":1,"99":1,"139":1},"2":{"3":1,"6":1,"71":1,"76":1,"93":1,"94":1,"98":2,"99":2,"100":1,"101":2,"103":1,"115":2,"116":3,"169":1}}],["coveredby",{"0":{"48":1,"92":1,"93":1,"96":1,"97":1,"100":1,"101":1,"115":1},"1":{"93":1,"94":1},"2":{"0":2,"3":4,"6":4,"31":1,"48":2,"64":1,"92":1,"93":3,"94":10,"95":6,"96":13,"97":15,"98":13,"99":5,"100":2,"101":2,"104":3,"197":1}}],["covers",{"0":{"47":1,"102":1,"103":1},"1":{"103":1,"104":1},"2":{"0":2,"3":5,"6":5,"31":1,"47":2,"102":1,"103":4,"104":5,"146":1,"197":1}}],["coverages",{"2":{"6":1,"66":1}}],["coverage",{"0":{"65":1},"2":{"0":1,"6":2,"31":1,"65":3,"66":16}}],["code",{"2":{"7":1,"10":1,"26":5,"59":1,"94":1,"108":1,"116":1,"125":1,"135":1,"145":1,"160":1,"187":1,"199":1}}],["colatitude",{"2":{"158":1}}],["colname",{"2":{"153":3}}],["col",{"2":{"153":2,"154":1}}],["columns",{"2":{"153":2}}],["column",{"2":{"22":1,"153":9,"154":8,"156":2,"194":2,"197":8}}],["colored",{"2":{"198":1}}],["color=",{"2":{"192":2}}],["colors",{"2":{"79":1,"80":1,"196":1,"198":2}}],["colorrange",{"2":{"58":2,"84":1}}],["colorbar",{"2":{"58":1,"81":1,"84":1,"146":1}}],["colormap",{"2":{"14":1,"58":3,"84":1}}],["color",{"2":{"6":1,"55":1,"58":2,"59":1,"60":1,"62":1,"68":3,"79":1,"80":1,"81":2,"84":2,"87":4,"90":4,"93":1,"103":1,"107":4,"121":4,"134":4,"173":1,"176":1,"191":1,"192":1,"196":1,"198":5}}],["collect",{"2":{"11":3,"13":1,"50":1,"52":1,"55":2,"59":1,"62":1,"65":2,"68":2,"82":2,"84":1,"146":3,"153":2,"154":1,"175":4,"189":2}}],["collections",{"0":{"100":1,"101":1,"114":1,"115":1,"131":1,"132":1,"141":1,"142":1},"2":{"1":2,"6":8,"22":1,"150":2,"152":1,"153":2,"154":2,"156":3,"180":2,"195":1}}],["collection",{"2":{"1":1,"4":7,"6":12,"18":2,"29":2,"53":2,"56":3,"66":2,"85":2,"100":2,"101":2,"114":2,"115":2,"131":2,"132":2,"141":2,"142":2,"148":1,"150":1,"153":3,"154":1,"180":1,"186":1,"189":1}}],["collinear",{"2":{"3":1,"6":2,"64":5,"70":2,"72":3,"73":12,"75":2,"121":1,"122":2}}],["come",{"2":{"158":1}}],["commonly",{"2":{"195":1}}],["common",{"2":{"87":1,"155":1,"177":1,"190":1,"192":1,"193":1}}],["commented",{"2":{"145":1}}],["comments",{"2":{"116":1}}],["comment",{"2":{"30":1}}],["combos",{"2":{"71":1,"73":1,"76":1}}],["combination",{"2":{"64":1,"156":2}}],["combines",{"2":{"63":1}}],["combine",{"2":{"63":2,"64":5,"169":1}}],["combined",{"2":{"6":1,"64":4,"76":1,"166":1,"169":2,"191":1}}],["coming",{"2":{"66":1}}],["com",{"2":{"6":2,"73":1,"82":1,"158":1}}],["compilation",{"2":{"160":1}}],["compiled",{"2":{"24":1}}],["compiler",{"2":{"24":1,"153":2,"160":2}}],["complex",{"2":{"148":1,"180":1,"197":1}}],["complexity",{"2":{"148":1}}],["complete",{"2":{"56":1}}],["completely",{"2":{"1":1,"3":4,"6":4,"64":2,"71":1,"76":1,"90":2,"91":1,"94":1,"103":1,"104":1,"116":1,"135":1,"150":1,"153":1,"158":1}}],["components",{"2":{"62":1,"63":2,"154":1,"156":25}}],["component",{"2":{"56":3,"63":11,"66":8,"73":1,"153":2,"156":2}}],["composed",{"2":{"4":4,"6":5,"88":5,"191":2}}],["comprised",{"2":{"6":3,"70":1,"72":1,"75":1}}],["computing",{"2":{"60":1,"77":1}}],["computational",{"2":{"6":1,"59":1}}],["computation",{"2":{"6":6,"59":1,"63":1,"70":1,"72":1,"75":1,"181":2,"182":2,"183":2}}],["computer",{"2":{"6":1,"59":1}}],["computes",{"2":{"6":1,"82":1}}],["compute",{"2":{"4":1,"6":3,"56":1,"59":1,"82":3,"177":1}}],["computed",{"2":{"4":4,"6":5,"53":1,"56":3,"59":3,"66":1,"196":1}}],["compact",{"2":{"199":3}}],["comparisons",{"2":{"197":1}}],["comparing",{"2":{"76":1,"88":1}}],["compares",{"2":{"146":1}}],["compared",{"2":{"88":1}}],["compare",{"2":{"3":1,"4":1,"6":2,"53":1,"76":1,"88":2,"122":1}}],["compatibility",{"2":{"56":1}}],["compatible",{"2":{"1":3,"22":1,"25":1,"27":1,"53":1,"56":1,"59":2,"63":1,"66":1,"85":1,"88":1,"91":1,"94":1,"104":1,"108":1,"119":1,"122":1,"125":1,"135":1,"150":1,"151":1,"153":1,"172":2}}],["couple",{"2":{"194":1}}],["course",{"2":{"152":1}}],["country",{"2":{"199":8}}],["countries",{"2":{"11":1,"80":1,"180":1}}],["counted",{"2":{"73":2}}],["counters",{"2":{"59":8}}],["counterparts",{"2":{"33":1}}],["counter",{"2":{"6":1,"64":7,"116":1,"144":1,"145":1}}],["counterclockwise",{"2":{"4":1,"6":2,"9":1,"55":2,"56":1,"81":1,"82":1}}],["count",{"2":{"64":16,"146":1,"184":1}}],["couldn",{"2":{"9":1,"160":1}}],["could",{"2":{"4":1,"6":1,"56":3,"73":4,"76":1,"77":1,"85":1,"116":2,"158":1,"172":1}}],["conditions",{"2":{"197":4}}],["connected",{"2":{"116":5}}],["connect",{"2":{"66":11}}],["connecting",{"2":{"53":1,"182":1,"191":2}}],["connections",{"2":{"6":2,"166":2,"169":2}}],["contents",{"2":{"153":1,"161":1}}],["context",{"2":{"32":4,"176":4,"192":2}}],["contours",{"2":{"146":1}}],["contour",{"2":{"146":4}}],["continue",{"2":{"56":1,"64":7,"66":1,"71":2,"73":1,"116":1,"153":1,"165":1,"169":3,"184":1,"199":1}}],["contributions",{"2":{"25":1,"27":1}}],["controlled",{"2":{"24":1}}],["control",{"2":{"23":1}}],["containing",{"2":{"65":1,"198":1}}],["contain",{"2":{"3":1,"6":1,"26":1,"76":1,"90":1,"122":1,"191":1}}],["contained",{"2":{"3":1,"6":1,"9":1,"76":4,"91":1,"103":1,"121":1,"122":1,"153":1,"198":1}}],["contains",{"0":{"45":1,"89":1,"90":1},"1":{"90":1,"91":1},"2":{"0":2,"3":4,"6":4,"26":1,"31":1,"33":1,"45":2,"64":1,"76":1,"77":1,"89":1,"90":5,"91":4,"151":1,"168":1,"197":1,"198":1}}],["consistentm",{"2":{"156":3}}],["consistentz",{"2":{"156":3}}],["consistent",{"2":{"64":1,"148":1,"156":1}}],["consistency",{"2":{"22":1}}],["considered",{"2":{"53":1,"59":1}}],["consider",{"2":{"52":1,"55":1,"62":1,"65":1,"66":3,"68":1,"84":2,"87":1,"90":1,"93":1,"103":1,"107":1,"116":3,"118":1,"121":1,"124":1,"134":1}}],["constprop",{"2":{"105":1}}],["constants",{"2":{"64":1}}],["const",{"2":{"31":4,"64":1,"94":4,"108":3,"125":4,"135":4,"155":3,"180":4}}],["constructing",{"2":{"193":1}}],["constructors",{"2":{"159":2}}],["construct",{"2":{"159":1}}],["constructed",{"2":{"1":1,"20":1,"172":1}}],["constrained",{"2":{"6":3,"70":1,"72":1,"75":1}}],["concepts",{"0":{"28":1},"1":{"29":1,"30":1},"2":{"26":1}}],["concieve",{"2":{"9":1}}],["concavehull",{"2":{"147":1}}],["concave",{"2":{"6":1,"53":2,"62":2,"145":2}}],["convention",{"2":{"62":1}}],["convenience",{"2":{"59":1,"188":1}}],["conversely",{"2":{"64":1}}],["conversion",{"0":{"186":1},"2":{"22":1,"33":1}}],["converted",{"2":{"22":1,"59":3}}],["converts",{"2":{"6":1,"189":1}}],["convert",{"0":{"95":1,"109":1,"126":1,"136":1},"2":{"6":3,"32":1,"35":2,"36":2,"37":2,"38":2,"40":2,"41":2,"42":2,"43":2,"44":2,"45":2,"46":2,"47":2,"48":2,"49":2,"50":1,"59":6,"82":1,"84":1,"146":2,"176":1,"180":3,"186":1,"188":1,"189":1}}],["convexity",{"2":{"81":2}}],["convexhull",{"2":{"50":1,"147":1}}],["convex",{"0":{"50":1,"77":1,"80":1},"1":{"78":1,"79":1,"80":1,"81":1,"82":1},"2":{"0":1,"6":7,"31":2,"50":1,"53":3,"77":4,"79":2,"80":1,"81":4,"82":11,"145":1}}],["vw",{"2":{"180":3}}],["von",{"2":{"146":1}}],["v2",{"2":{"116":9}}],["v1",{"2":{"116":9}}],["v`",{"2":{"59":2}}],["vcat",{"2":{"53":1,"59":1,"153":1}}],["vararg",{"2":{"59":1}}],["varying",{"2":{"158":1}}],["vary",{"2":{"53":1}}],["variables",{"2":{"24":1,"59":8,"91":1,"104":1,"119":1}}],["variable",{"2":{"24":1,"71":2}}],["vals",{"2":{"182":9}}],["valign",{"2":{"180":1}}],["validated",{"2":{"71":2,"73":2,"76":2}}],["validate",{"2":{"9":1}}],["valid",{"2":{"1":1,"6":8,"63":1,"70":2,"72":2,"73":3,"75":2,"146":1,"161":3,"162":1,"167":1,"168":1,"184":1,"185":1}}],["val",{"2":{"53":2,"64":2,"73":8,"116":30,"122":4}}],["values=",{"2":{"146":2}}],["values=sort",{"2":{"146":1}}],["values",{"2":{"1":1,"5":3,"6":15,"53":2,"58":3,"59":40,"63":2,"64":5,"66":5,"73":1,"85":2,"116":4,"146":19,"150":1,"153":2,"160":1,"182":2,"184":1}}],["value",{"2":{"0":1,"4":7,"5":2,"6":15,"14":1,"24":1,"32":2,"53":1,"55":2,"56":4,"59":45,"64":5,"66":2,"73":7,"84":1,"85":3,"146":6,"153":2,"182":11,"188":2,"197":1}}],["vs",{"0":{"15":1},"2":{"12":1,"73":2}}],["vᵢ",{"2":{"6":1}}],["v",{"2":{"5":2,"6":6,"14":4,"59":23,"85":8}}],["visvalingam",{"2":{"178":1}}],["visvalingamwhyatt",{"0":{"183":1},"2":{"0":1,"6":3,"180":4,"183":5}}],["visualized",{"2":{"162":1}}],["visualize",{"2":{"118":1,"192":1}}],["visa",{"2":{"64":1}}],["visited",{"2":{"64":4}}],["view",{"2":{"64":2,"82":1,"146":1,"169":1,"182":3,"199":1}}],["viewport",{"2":{"14":1}}],["views",{"2":{"1":1,"64":1,"75":1,"172":1}}],["vincenty",{"2":{"6":1,"177":1}}],["via",{"2":{"6":1,"60":1,"77":1,"147":1,"173":1,"176":1,"188":2}}],["vec",{"2":{"82":2}}],["vect",{"2":{"156":2}}],["vectypes",{"2":{"59":5}}],["vector",{"2":{"1":12,"4":6,"5":1,"6":46,"18":1,"23":1,"29":1,"52":1,"53":10,"59":14,"64":7,"69":6,"70":4,"71":1,"72":2,"73":3,"75":4,"116":1,"122":2,"145":3,"146":4,"148":1,"150":1,"153":4,"154":3,"162":8,"163":1,"168":22,"174":1,"175":1,"177":2,"181":1,"182":4,"183":1,"184":2,"185":10,"189":15,"191":18,"192":6,"193":9}}],["vectors",{"2":{"1":1,"4":2,"6":3,"22":1,"53":4,"59":3,"64":1,"82":1,"85":1,"144":1,"146":1,"150":1,"153":1,"156":2,"180":1}}],["ve",{"2":{"17":1,"177":1}}],["vein",{"2":{"7":1}}],["version",{"2":{"188":1}}],["versa",{"2":{"64":1}}],["vert",{"2":{"184":21}}],["verts",{"2":{"180":2}}],["vertical",{"2":{"58":1,"66":1,"73":1,"146":1}}],["vertices",{"2":{"6":7,"9":1,"57":4,"59":5,"64":1,"69":2,"82":1,"96":1,"98":5,"107":1,"110":3,"113":1,"116":1,"137":1,"162":1,"174":2,"175":1,"176":3,"177":3,"180":1,"183":1}}],["vertex",{"2":{"5":1,"6":2,"53":1,"57":2,"59":2,"64":19,"73":12,"81":1,"96":2,"111":2,"112":1,"116":1,"137":3}}],["very",{"2":{"0":1,"175":1,"199":2}}],["rd",{"2":{"180":3}}],["rdbu",{"2":{"84":1}}],["rhumb",{"2":{"145":2}}],["runner",{"2":{"192":1}}],["running",{"2":{"153":1,"156":2}}],["run",{"2":{"153":5,"154":3,"199":1}}],["runs",{"2":{"73":2,"144":1}}],["rule",{"2":{"64":1}}],["rules",{"2":{"64":1}}],["rightjoin",{"2":{"197":1}}],["right=2",{"2":{"64":1}}],["right",{"2":{"59":1,"64":4,"69":1,"85":1,"145":1,"182":19,"184":5,"191":1}}],["ring4",{"2":{"193":2}}],["ring3",{"2":{"192":1}}],["ring2",{"2":{"191":2}}],["ring1",{"2":{"191":2}}],["rings",{"0":{"98":1,"112":1,"129":1,"139":1,"161":1},"1":{"162":1,"163":1},"2":{"4":4,"6":6,"9":2,"56":1,"63":1,"64":3,"73":1,"88":7,"144":1,"146":5,"163":1,"166":1,"180":1}}],["ring",{"2":{"4":7,"6":13,"9":1,"31":1,"53":3,"56":2,"59":1,"62":1,"63":4,"64":12,"66":13,"76":3,"85":5,"88":4,"96":1,"97":2,"98":5,"110":1,"112":1,"116":2,"127":1,"128":1,"129":3,"137":1,"138":2,"139":4,"145":3,"146":11,"161":2,"162":1,"163":14,"164":1,"191":1}}],["rtrees",{"2":{"20":1}}],["r+y",{"2":{"13":2,"14":1}}],["r+x",{"2":{"13":2,"14":1}}],["ry",{"2":{"13":3,"14":3}}],["rx",{"2":{"13":3,"14":3}}],["round",{"2":{"180":1,"182":1,"184":1}}],["routines",{"2":{"11":1}}],["row",{"2":{"154":3}}],["rows",{"2":{"154":2}}],["robust",{"0":{"15":1},"2":{"81":1}}],["rotate",{"2":{"66":1}}],["rotation",{"2":{"1":1,"6":1,"185":1}}],["rotations",{"2":{"1":3,"6":3,"185":3}}],["rotmatrix2d",{"2":{"180":1}}],["rotmatrix",{"2":{"1":1,"6":1,"185":1}}],["r",{"2":{"6":1,"9":1,"13":11,"14":12,"32":1,"176":1,"184":2,"191":6,"192":2,"193":4}}],["rᵢ₋₁",{"2":{"59":20}}],["rᵢ∗rᵢ₊₁+sᵢ⋅sᵢ₊₁",{"2":{"6":1}}],["rᵢ₊₁",{"2":{"6":1,"59":29}}],["rᵢ",{"2":{"6":2,"59":49}}],["ramer",{"2":{"182":1}}],["raster",{"0":{"146":1},"2":{"146":4}}],["ray",{"2":{"116":4}}],["raw",{"2":{"18":1}}],["range",{"2":{"13":8,"14":4,"146":3,"153":2,"154":2}}],["ranges",{"2":{"6":1,"146":2}}],["randomly",{"2":{"198":2}}],["random",{"2":{"180":2}}],["randn",{"2":{"79":1}}],["rand",{"2":{"6":1,"81":1,"146":1,"198":2}}],["rather",{"2":{"6":1,"146":1,"168":1}}],["ratio",{"2":{"6":7,"73":1,"176":1,"180":1,"181":4,"182":6,"183":4,"184":11}}],["radii",{"2":{"6":1,"176":1}}],["radius`",{"2":{"176":1}}],["radius",{"2":{"6":6,"59":13,"158":5,"176":4,"177":1}}],["radialdistance",{"0":{"181":1},"2":{"0":1,"6":2,"178":1,"180":4,"181":4}}],["rrayscore",{"2":{"1":1,"6":1,"185":1}}],["rring",{"2":{"1":1,"6":1,"185":1}}],["rewrap",{"2":{"153":2,"156":1}}],["req",{"2":{"116":44}}],["requirement",{"2":{"161":1,"167":1}}],["requirements",{"2":{"116":5}}],["required",{"2":{"82":1,"94":3,"108":3,"125":3,"135":3,"175":1,"190":1}}],["requires",{"2":{"60":1,"88":1,"90":1,"94":2,"97":3,"98":3,"99":1,"108":1,"111":3,"112":2,"113":1,"125":1,"128":3,"129":1,"130":1,"134":1,"135":1,"138":3,"139":3,"140":1,"173":1,"176":1,"188":1}}],["require",{"2":{"33":1,"82":1,"93":2,"94":6,"108":3,"116":32,"125":3,"135":3}}],["requests",{"2":{"25":1,"27":1}}],["reflected",{"2":{"180":3}}],["ref",{"2":{"84":1}}],["refers",{"2":{"158":1}}],["referring",{"2":{"116":1}}],["refer",{"2":{"6":1,"146":1}}],["references",{"2":{"6":1,"59":1}}],["reference",{"0":{"192":1,"193":1},"2":{"0":1,"1":2,"172":2,"190":2,"192":1}}],["reveal",{"2":{"76":1}}],["reveals",{"2":{"76":1}}],["reverse",{"2":{"55":1,"58":1,"59":1,"64":2,"191":2}}],["rev",{"2":{"75":1}}],["render",{"2":{"58":1}}],["rendering",{"2":{"58":3,"59":1}}],["rename",{"2":{"10":1}}],["regardless",{"2":{"73":1,"116":1}}],["regions",{"2":{"71":3,"73":5,"75":1,"76":3,"116":2,"199":1}}],["region",{"2":{"60":2,"73":3,"76":2,"199":1}}],["register",{"2":{"31":3,"59":3}}],["regular",{"0":{"15":1}}],["rebuilding",{"2":{"153":1,"154":1}}],["rebuild",{"2":{"31":2,"151":1,"153":3,"156":11,"177":1,"180":2}}],["rebuilt",{"2":{"1":1,"148":1,"150":1,"153":1,"156":2}}],["readable",{"2":{"195":1}}],["readability",{"2":{"64":1}}],["read",{"2":{"153":1,"192":2}}],["reading",{"2":{"153":1}}],["reads",{"2":{"153":1}}],["reached",{"2":{"153":1,"156":3}}],["reaches",{"2":{"151":1}}],["reach",{"2":{"151":1}}],["reasons",{"2":{"188":1}}],["reason",{"2":{"24":1,"160":1,"161":1,"167":1}}],["real`",{"2":{"176":1,"177":1}}],["reality",{"2":{"81":1}}],["really",{"2":{"56":1,"116":1,"146":1,"160":1}}],["real=1",{"2":{"6":2,"176":2}}],["real=6378137`",{"2":{"176":1}}],["real=6378137",{"2":{"6":2,"176":1}}],["real",{"0":{"199":1},"2":{"5":1,"6":13,"53":1,"59":45,"63":2,"73":1,"176":3,"177":3,"184":5,"197":1}}],["relation",{"2":{"64":2}}],["relations",{"2":{"31":10,"105":1,"122":1}}],["relationship",{"2":{"23":1,"197":2}}],["relative",{"2":{"59":3}}],["relevant",{"2":{"6":1,"10":1,"82":1,"158":2}}],["reducing",{"2":{"154":2}}],["reduced",{"2":{"181":1,"182":1,"183":1}}],["reduces",{"2":{"19":1,"76":1,"154":1}}],["reduce",{"2":{"1":1,"146":1,"150":1,"154":2,"165":1}}],["redundant",{"2":{"64":1}}],["red",{"2":{"14":1,"62":2,"84":1,"93":1,"103":1,"118":1,"191":1,"192":1,"198":2}}],["removal",{"2":{"64":1}}],["removes",{"2":{"64":1,"148":1}}],["removed",{"2":{"64":3,"71":5,"146":1}}],["remove",{"2":{"56":1,"64":33,"66":1,"69":2,"70":5,"72":5,"75":2,"169":2,"181":1,"182":3,"184":4}}],["removing",{"2":{"6":3,"64":1,"71":1,"181":1,"182":1,"183":1}}],["remainingnode",{"2":{"146":3}}],["remaining",{"2":{"64":1,"88":1,"116":2,"182":1}}],["remain",{"2":{"1":1,"6":8,"150":1,"153":1,"180":2}}],["resolution",{"2":{"192":1}}],["resolved",{"2":{"146":1}}],["resembles",{"2":{"158":2}}],["reset",{"2":{"64":1,"153":1}}],["resize",{"2":{"13":1,"14":1,"64":2}}],["resampled",{"2":{"6":1,"177":1}}],["respectively",{"2":{"64":1,"122":1,"191":1}}],["respect",{"2":{"6":2,"72":1,"73":1,"82":1,"116":6}}],["rest",{"2":{"6":1,"59":2,"75":1}}],["resulting",{"2":{"69":1,"76":1,"146":1,"198":1}}],["results",{"2":{"3":2,"6":2,"73":1,"105":1,"122":1,"153":1,"154":1,"162":1,"182":25,"191":3}}],["result",{"2":{"1":2,"3":5,"4":5,"6":11,"19":1,"32":3,"53":1,"56":2,"66":1,"73":15,"82":1,"85":2,"91":1,"94":1,"104":1,"119":1,"135":1,"150":2,"153":9,"154":2,"176":3,"184":6}}],["receives",{"2":{"153":1,"154":1}}],["recent",{"2":{"64":1,"71":1,"73":1,"76":1}}],["recalculate",{"2":{"152":1}}],["recursive",{"2":{"151":1}}],["recursively",{"2":{"4":1,"6":1,"151":1,"170":1}}],["rect",{"2":{"52":3,"55":5,"65":3,"84":7}}],["rectangle",{"2":{"52":2,"55":2,"58":2,"65":2,"66":1,"84":2,"175":5,"176":8,"198":2}}],["rectangletrait",{"2":{"32":1}}],["recommended",{"2":{"22":1}}],["reconstructing",{"2":{"180":1}}],["reconstructed",{"2":{"18":1}}],["reconstruct",{"2":{"1":1,"18":1,"31":2,"150":1,"153":2,"154":1,"156":28}}],["replace",{"2":{"64":1,"146":2,"182":1}}],["replaced",{"2":{"22":1}}],["repl",{"2":{"60":1,"173":1,"176":1}}],["repeat",{"2":{"63":1,"64":3,"88":6}}],["repeating",{"2":{"56":1,"76":1}}],["repeated",{"2":{"4":3,"6":3,"9":1,"53":2,"59":1,"64":2,"76":2,"85":2,"88":4,"116":1}}],["represented",{"2":{"158":1,"198":1}}],["represent",{"2":{"17":1,"59":1,"64":4,"88":1,"158":1}}],["representing",{"2":{"6":2,"71":1,"73":1,"76":1,"82":1,"84":1,"88":1,"158":1,"199":1}}],["represents",{"2":{"6":1,"165":2,"166":1}}],["reprojects",{"2":{"172":1}}],["reprojection",{"0":{"172":1},"1":{"173":1}}],["reproject",{"2":{"0":1,"1":4,"31":2,"148":1,"172":6,"173":2}}],["re",{"2":{"1":1,"6":1,"17":1,"82":1,"185":1,"190":1,"192":1}}],["retrievable",{"2":{"1":1,"172":1}}],["returnval",{"2":{"116":9}}],["returntype",{"2":{"19":1}}],["returning",{"2":{"18":1,"60":1,"71":2}}],["return",{"0":{"22":1},"2":{"1":1,"3":18,"4":2,"6":37,"13":3,"14":3,"23":2,"30":1,"32":3,"35":1,"36":1,"37":1,"38":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"53":5,"56":5,"59":20,"60":1,"63":4,"64":36,"66":12,"69":12,"70":5,"71":4,"72":4,"73":18,"75":6,"76":9,"82":2,"85":8,"88":30,"91":1,"94":1,"100":2,"101":2,"104":1,"105":18,"108":2,"114":2,"115":2,"116":71,"118":1,"119":1,"122":28,"125":1,"127":2,"131":2,"132":2,"135":1,"141":2,"142":2,"145":10,"146":12,"153":17,"154":3,"156":6,"161":1,"163":4,"165":6,"166":2,"169":2,"171":2,"172":1,"177":4,"180":3,"181":1,"182":5,"183":3,"184":7,"185":2,"186":2,"188":3,"189":8}}],["returned",{"2":{"1":1,"6":10,"22":2,"23":1,"64":3,"69":1,"70":2,"72":2,"73":2,"75":2,"81":1,"82":1,"146":1,"153":1,"156":2,"160":1,"172":1,"180":1}}],["returns",{"2":{"1":1,"3":5,"4":4,"5":3,"6":23,"18":1,"22":2,"53":1,"56":2,"59":6,"63":3,"64":4,"66":6,"69":1,"70":1,"73":1,"75":1,"82":1,"85":8,"87":1,"90":2,"91":1,"94":1,"103":2,"104":1,"107":1,"116":4,"119":1,"122":2,"135":1,"146":2,"150":1,"153":2,"160":1,"177":1,"186":1,"197":1}}],["phi``",{"2":{"158":1}}],["physics",{"2":{"158":1}}],["psa",{"2":{"153":1,"154":1}}],["pb",{"2":{"105":2}}],["p0",{"2":{"85":9}}],["p3",{"2":{"64":8,"183":4}}],["ptm",{"2":{"145":3}}],["ptj",{"2":{"145":5}}],["pti",{"2":{"145":3}}],["ptrait",{"2":{"85":2}}],["pts",{"2":{"64":22,"69":7}}],["pt",{"2":{"64":114,"69":2,"73":26,"116":8,"182":4}}],["pt2",{"2":{"64":14,"73":2}}],["pt1",{"2":{"64":18,"73":2}}],["pn",{"2":{"127":3}}],["pn2",{"2":{"64":4}}],["pn1",{"2":{"64":4}}],["pfirst",{"2":{"56":3}}],["pu",{"2":{"198":2}}],["purpose",{"2":{"153":1}}],["pure",{"2":{"6":1,"82":1,"146":1}}],["purely",{"2":{"6":1,"18":1,"158":1,"176":1}}],["push",{"2":{"64":15,"69":5,"70":2,"72":2,"73":2,"75":4,"76":5,"146":3,"163":1,"177":3,"182":3}}],["pulling",{"2":{"82":1}}],["pull",{"2":{"25":1,"27":1}}],["public",{"2":{"24":1}}],["pick",{"2":{"192":2}}],["piece",{"2":{"64":6,"169":6}}],["pieces",{"2":{"64":12,"69":1,"71":2,"75":4,"116":1,"169":9}}],["pi",{"2":{"13":2}}],["pixels",{"2":{"146":1}}],["pixel",{"2":{"6":2,"146":7}}],["pythagorean",{"2":{"85":1}}],["py",{"2":{"13":2,"14":2}}],["px",{"2":{"13":2,"14":2}}],["peucker",{"2":{"178":2,"180":3,"182":2}}],["peaks",{"2":{"146":2}}],["peculiarities",{"0":{"21":1},"1":{"22":1,"23":1,"24":1}}],["people",{"2":{"9":1}}],["persist",{"2":{"153":1}}],["performed",{"2":{"158":1,"198":1}}],["performs",{"2":{"59":1,"154":1,"177":1}}],["perform",{"2":{"26":1,"58":1,"59":2,"64":1,"148":1,"154":1,"197":3,"198":2,"200":1}}],["performing",{"2":{"6":3,"23":1,"59":1,"70":1,"72":1,"75":1,"198":1}}],["performance",{"2":{"4":1,"6":2,"22":1,"146":1,"167":1,"170":1,"180":1,"195":1}}],["per",{"2":{"5":2,"6":2,"58":1,"59":2,"64":5,"146":1,"153":2,"154":2,"177":1}}],["pl",{"2":{"198":2}}],["plt",{"2":{"191":1}}],["please",{"2":{"64":1}}],["place",{"2":{"73":1,"197":1}}],["placement",{"2":{"64":1}}],["plan",{"2":{"174":1}}],["plane",{"2":{"6":1,"59":1,"158":3,"177":1,"196":1}}],["planar",{"2":{"6":4,"31":2,"158":5,"177":9}}],["plottable",{"2":{"146":1}}],["plotted",{"2":{"62":1}}],["plotting",{"0":{"191":1},"2":{"6":1,"146":1,"174":1,"177":1,"190":1,"191":4,"192":1}}],["plots",{"2":{"58":2}}],["plot",{"0":{"192":1},"2":{"13":1,"58":3,"79":2,"80":1,"81":1,"87":1,"121":1,"146":1,"176":2,"180":4,"190":2,"191":9,"192":5,"193":1,"195":1,"198":1}}],["plus",{"2":{"5":1,"6":1,"59":1}}],["p2y",{"2":{"189":3}}],["p2x",{"2":{"189":3}}],["p2box",{"2":{"58":1}}],["p2",{"2":{"3":2,"4":2,"6":6,"15":12,"53":12,"56":9,"64":18,"66":19,"75":2,"81":1,"85":15,"88":11,"94":2,"103":2,"116":12,"122":2,"145":3,"175":1,"183":4,"189":3,"191":2}}],["p1y",{"2":{"189":3}}],["p1x",{"2":{"189":3}}],["p1",{"2":{"3":3,"4":2,"6":7,"15":12,"53":21,"56":8,"58":4,"64":9,"66":25,"68":1,"75":2,"81":2,"85":15,"88":14,"93":5,"94":3,"103":5,"116":4,"122":2,"127":3,"145":3,"183":4,"189":3,"191":1}}],["practice",{"2":{"193":1}}],["pred",{"2":{"197":5,"198":1,"199":2,"200":1}}],["predicate",{"2":{"7":1,"105":1,"197":6,"198":1,"200":5}}],["predicates",{"0":{"12":1,"15":1,"200":1},"1":{"13":1,"14":1,"15":1,"16":1},"2":{"7":4,"12":1,"31":1,"64":5,"73":4,"74":3,"116":1,"197":1,"199":1}}],["pretty",{"2":{"172":1}}],["prettytime",{"2":{"13":2}}],["prevent",{"2":{"71":2,"73":2,"76":2}}],["prev^2",{"2":{"53":2}}],["prev",{"2":{"53":14,"64":69,"145":4}}],["previously",{"2":{"175":1}}],["previous",{"2":{"19":1,"53":1,"153":1,"181":3}}],["preparations",{"2":{"20":1}}],["prepared",{"2":{"20":1,"146":2}}],["prepare",{"0":{"20":1},"2":{"17":1,"20":1}}],["precision",{"2":{"11":1}}],["preserve",{"2":{"180":4,"182":3}}],["preserved",{"2":{"153":2}}],["preserving",{"2":{"178":1}}],["presentation",{"2":{"6":1,"59":1}}],["present",{"2":{"6":1,"153":1,"188":1}}],["presence",{"2":{"6":1,"32":1,"188":1}}],["prescribes",{"2":{"20":1}}],["press",{"2":{"6":1,"59":1}}],["pre",{"2":{"6":1,"75":1,"180":1,"182":2}}],["prefilter",{"2":{"6":1,"180":7}}],["protters",{"2":{"153":1,"154":1}}],["progressively",{"2":{"151":1}}],["program",{"2":{"17":1}}],["programming",{"2":{"17":1,"26":1}}],["promote",{"2":{"59":5}}],["property",{"2":{"154":2}}],["properties=gi",{"2":{"156":1}}],["properties=namedtuple",{"2":{"154":1}}],["properties=",{"2":{"146":1}}],["properties",{"2":{"6":1,"153":8,"156":1,"180":1,"184":1}}],["propagated",{"2":{"153":1}}],["propagate",{"2":{"59":16,"85":4}}],["probably",{"2":{"56":1,"153":1}}],["prod",{"2":{"53":4}}],["product",{"2":{"53":1}}],["process",{"2":{"96":3,"97":3,"98":3,"99":1,"105":1,"110":3,"111":3,"112":2,"113":1,"116":11,"127":1,"128":3,"129":1,"130":1,"137":3,"138":3,"139":3,"140":1,"153":1,"154":1,"182":1}}],["processed",{"2":{"64":6}}],["processors",{"2":{"31":1,"94":2,"108":2,"125":2,"135":2}}],["processor",{"2":{"31":1}}],["processing",{"2":{"23":1}}],["profile",{"2":{"9":1}}],["providers",{"2":{"162":1,"168":1}}],["provide",{"0":{"23":1},"2":{"6":6,"52":1,"55":1,"57":1,"62":1,"65":1,"68":1,"70":2,"72":2,"75":2,"84":1,"87":1,"90":1,"93":1,"103":1,"107":1,"116":2,"118":1,"121":1,"124":1,"134":1,"146":1,"184":1}}],["provides",{"2":{"6":1,"77":1,"82":1,"192":1}}],["provided",{"2":{"4":1,"6":3,"11":1,"64":1,"85":1,"88":1,"168":1,"176":2,"188":1}}],["projecting",{"2":{"192":1}}],["projections",{"2":{"158":1}}],["projection",{"2":{"85":2,"190":1,"192":1}}],["project",{"2":{"9":1}}],["projects",{"2":{"9":1}}],["proj",{"2":{"1":2,"6":3,"172":2,"173":4,"175":1,"176":6,"190":1}}],["prints",{"2":{"173":1}}],["printstyled",{"2":{"60":1,"173":1,"176":1}}],["println",{"2":{"60":1,"173":1,"176":1,"180":2}}],["print",{"2":{"60":2,"173":2,"176":2}}],["primitives",{"0":{"156":1},"2":{"31":1,"156":1}}],["primitive",{"2":{"29":1}}],["primarily",{"2":{"25":2,"27":2,"159":1}}],["primary",{"2":{"3":2,"6":3,"94":1,"135":1,"180":1}}],["priority",{"2":{"1":1,"172":1}}],["pay",{"2":{"154":1}}],["paper",{"2":{"116":2}}],["pa",{"2":{"105":2}}],["pathof",{"2":{"180":2}}],["paths",{"0":{"196":1},"2":{"160":1,"196":2}}],["path",{"2":{"55":3,"192":2}}],["parquet",{"2":{"195":3}}],["parent",{"2":{"160":1}}],["parse",{"2":{"116":1,"122":1}}],["part",{"2":{"66":2,"76":2,"116":3,"152":1}}],["partition",{"2":{"153":2,"154":2}}],["partialsort",{"2":{"184":1}}],["partial",{"2":{"66":4}}],["partially",{"2":{"64":2,"76":2}}],["particularly",{"2":{"59":1}}],["particular",{"2":{"30":1,"53":1,"146":1,"192":2}}],["parameters",{"2":{"159":2}}],["parameter",{"2":{"159":3}}],["parameterized",{"2":{"158":1}}],["parametrized",{"2":{"158":1}}],["params",{"2":{"6":2,"188":10}}],["parallel",{"2":{"116":1,"145":1}}],["paradigm",{"0":{"29":1}}],["paradigms",{"0":{"17":1},"1":{"18":1,"19":1,"20":1},"2":{"17":2,"20":1}}],["parlance",{"2":{"5":1,"6":1,"59":1,"158":1}}],["passes",{"2":{"66":2,"116":1}}],["passed",{"2":{"1":2,"6":5,"82":1,"146":1,"156":4,"172":1,"176":2,"185":1,"188":2,"200":1}}],["passable",{"2":{"59":18}}],["passing",{"2":{"18":1,"153":1,"178":1}}],["pass",{"2":{"5":1,"6":3,"18":1,"59":1,"91":1,"104":1,"116":2,"119":1,"153":1,"160":1,"176":1,"180":1}}],["pairs",{"2":{"73":1,"191":1}}],["pair",{"2":{"3":2,"6":2,"66":1,"122":2,"153":2,"154":1}}],["packages",{"2":{"25":1,"27":1,"77":1,"156":2,"161":1,"187":1,"190":3,"192":1,"195":1}}],["package",{"2":{"1":2,"6":1,"22":1,"25":2,"27":2,"60":1,"77":2,"82":1,"146":1,"172":3,"173":1,"176":1,"192":1,"195":2}}],["page",{"2":{"0":1,"9":1,"26":1,"29":1,"31":1,"32":1,"50":1,"53":1,"56":1,"58":1,"59":1,"60":1,"63":1,"64":1,"66":1,"69":1,"71":1,"73":1,"74":1,"76":1,"82":1,"85":1,"88":1,"91":1,"101":1,"104":1,"105":1,"115":1,"116":1,"119":1,"122":1,"132":1,"142":1,"145":1,"146":1,"147":1,"153":1,"154":1,"155":1,"156":1,"160":1,"163":1,"166":1,"169":1,"170":1,"171":1,"173":1,"177":1,"184":1,"185":1,"186":1,"188":1,"189":1}}],["p",{"2":{"1":5,"6":2,"13":13,"14":12,"15":2,"52":1,"55":1,"62":1,"64":5,"65":1,"66":5,"71":2,"75":2,"79":1,"80":1,"84":3,"87":1,"90":1,"93":1,"103":1,"105":4,"107":1,"116":20,"118":1,"121":1,"124":1,"134":1,"145":4,"146":3,"148":3,"150":3,"153":5,"171":7,"175":1,"179":1,"180":1,"184":3,"185":9,"186":7,"189":11,"197":1,"198":1}}],["poylgon",{"2":{"116":1}}],["potential",{"2":{"66":1}}],["potentially",{"2":{"6":2,"64":1,"166":2,"169":2}}],["post",{"2":{"182":2}}],["possibly",{"2":{"153":1}}],["possiblenodes",{"2":{"146":2}}],["possible",{"2":{"6":3,"70":1,"72":1,"75":1,"146":1,"153":1,"154":1}}],["possibility",{"2":{"151":1}}],["possibilities",{"2":{"73":1}}],["position=",{"2":{"180":1}}],["position",{"2":{"6":1,"145":1,"175":1}}],["positive",{"2":{"4":4,"6":4,"55":3,"56":1,"84":3,"85":3,"177":2,"184":1}}],["poles",{"2":{"158":1}}],["pole",{"2":{"158":2}}],["polgons",{"2":{"146":1}}],["polgontrait",{"2":{"1":1,"150":1}}],["polar",{"2":{"6":1,"176":1}}],["polynodes",{"2":{"64":7,"70":1,"72":1,"75":1}}],["polynode",{"2":{"64":36}}],["polypoints",{"2":{"59":46}}],["polys",{"2":{"6":2,"64":39,"68":3,"69":10,"70":14,"71":14,"72":9,"73":6,"75":14,"76":28,"169":26}}],["polys1",{"2":{"3":2,"6":2,"122":6}}],["polys2",{"2":{"3":2,"6":2,"122":6}}],["poly",{"2":{"3":2,"6":16,"15":2,"52":1,"55":1,"56":6,"58":2,"59":3,"62":1,"64":107,"65":2,"66":4,"68":4,"69":20,"70":22,"71":12,"72":15,"73":10,"75":19,"76":79,"79":2,"84":1,"85":3,"88":4,"105":10,"116":21,"122":8,"145":5,"146":5,"169":18,"175":2,"179":2,"180":8,"189":8,"191":2,"198":5}}],["poly2",{"2":{"3":3,"4":2,"6":7,"70":2,"88":2,"116":19,"122":7}}],["poly1",{"2":{"3":3,"4":2,"6":7,"70":2,"88":2,"116":14,"122":7}}],["polygon3",{"2":{"191":2,"192":1}}],["polygon2",{"2":{"191":6}}],["polygon1",{"2":{"191":4}}],["polygonization",{"2":{"146":1}}],["polygonizing",{"0":{"146":1}}],["polygonized",{"2":{"146":1}}],["polygonize",{"2":{"0":1,"6":6,"9":1,"31":1,"146":31}}],["polygon`",{"2":{"59":3,"82":1}}],["polygons",{"0":{"99":1,"130":1,"140":1,"167":1},"1":{"168":1,"169":1},"2":{"3":4,"4":3,"5":1,"6":18,"9":1,"23":5,"31":1,"56":5,"57":1,"59":2,"62":1,"63":1,"64":14,"66":1,"69":2,"70":9,"71":5,"72":3,"73":8,"75":6,"76":19,"84":1,"85":1,"88":5,"99":1,"122":5,"140":1,"145":1,"146":19,"151":1,"162":2,"166":3,"167":2,"168":2,"169":10,"178":1,"180":1,"191":3,"192":1,"198":5,"199":3}}],["polygontrait",{"2":{"1":1,"3":4,"4":6,"6":13,"15":3,"23":1,"32":1,"53":2,"56":3,"59":3,"63":2,"64":2,"66":2,"69":1,"70":5,"71":5,"72":3,"73":5,"75":4,"76":8,"85":2,"88":10,"96":2,"97":1,"98":1,"99":3,"100":1,"105":4,"110":2,"111":2,"112":1,"113":2,"114":1,"122":8,"127":2,"128":1,"129":1,"130":3,"131":1,"137":2,"138":1,"139":1,"140":3,"141":1,"148":1,"150":1,"151":2,"153":2,"154":1,"163":2,"165":2,"166":1,"169":2,"180":2,"189":1}}],["polygon",{"0":{"34":1,"64":1,"67":1,"70":1,"71":1,"73":1,"75":1,"76":1,"113":1},"1":{"35":1,"36":1,"37":1,"38":1,"68":1,"69":1},"2":{"0":1,"1":4,"3":4,"4":21,"5":9,"6":65,"9":2,"11":3,"15":4,"20":1,"23":1,"52":1,"53":5,"55":2,"56":5,"57":5,"58":16,"59":57,"62":2,"63":4,"64":39,"65":3,"66":4,"68":3,"69":10,"70":5,"71":7,"72":5,"73":6,"75":6,"76":34,"77":1,"81":1,"82":3,"84":3,"85":14,"88":12,"94":1,"96":3,"97":3,"98":4,"99":8,"105":1,"110":3,"111":4,"112":4,"113":4,"116":66,"122":4,"125":1,"127":3,"128":4,"129":5,"130":7,"135":1,"137":3,"138":4,"139":4,"140":8,"145":5,"146":4,"150":1,"153":1,"161":4,"162":8,"163":5,"164":1,"166":4,"167":3,"168":12,"169":7,"175":1,"176":4,"179":1,"180":9,"185":3,"189":6,"191":12,"192":5,"193":7,"194":2,"198":6}}],["pointwise",{"0":{"185":1},"2":{"172":1}}],["point1",{"2":{"85":4}}],["point`",{"2":{"73":1}}],["pointedgeside",{"2":{"64":1}}],["point₂",{"2":{"63":13}}],["point₁",{"2":{"63":13}}],["point3s",{"2":{"59":10}}],["point3f",{"2":{"58":1}}],["pointrait",{"2":{"6":1}}],["point2f",{"2":{"58":4,"59":2,"79":1,"84":1}}],["point2d",{"2":{"58":1}}],["point2",{"2":{"6":2,"59":5,"81":1,"85":4}}],["pointtrait",{"2":{"1":1,"4":4,"6":6,"18":1,"32":1,"50":1,"53":2,"56":1,"59":3,"66":1,"72":2,"82":1,"85":17,"88":8,"96":6,"100":1,"110":6,"114":1,"127":6,"131":1,"137":6,"141":1,"148":2,"150":1,"151":1,"153":7,"154":4,"156":12,"159":2,"165":2,"166":1,"170":1,"171":2,"180":2,"185":2,"186":2,"189":1}}],["point",{"0":{"110":1,"127":1},"2":{"1":4,"3":10,"4":37,"5":7,"6":82,"9":2,"20":1,"50":1,"53":12,"56":3,"57":3,"58":1,"59":126,"63":6,"64":97,"66":50,"69":13,"71":9,"72":1,"73":71,"76":9,"82":3,"84":17,"85":73,"88":27,"91":3,"93":1,"94":2,"96":8,"105":21,"108":2,"110":10,"116":138,"118":1,"121":2,"122":21,"124":1,"125":3,"127":10,"128":1,"130":1,"135":4,"137":11,"145":1,"146":3,"150":1,"153":1,"161":1,"162":2,"166":2,"167":1,"169":2,"172":1,"174":1,"180":2,"181":3,"182":9,"183":1,"185":2,"189":4,"191":111,"192":7,"193":8,"198":2}}],["points2",{"2":{"3":1,"6":1,"122":3}}],["points1",{"2":{"3":1,"6":1,"122":3}}],["points",{"0":{"96":1,"137":1},"2":{"0":1,"1":3,"3":1,"4":11,"5":1,"6":53,"9":3,"13":1,"53":2,"55":3,"56":3,"58":8,"59":32,"63":1,"64":55,"66":5,"69":3,"70":5,"71":1,"72":8,"73":28,"75":4,"76":1,"77":3,"79":4,"81":4,"82":6,"84":2,"85":8,"87":2,"88":13,"90":1,"94":6,"96":3,"97":4,"108":6,"110":1,"111":7,"112":3,"116":10,"122":5,"125":5,"127":1,"128":2,"129":4,"130":3,"134":1,"135":5,"137":3,"138":3,"139":3,"140":1,"144":1,"146":3,"153":2,"154":1,"170":2,"172":1,"175":2,"176":2,"180":11,"181":11,"182":26,"183":10,"184":33,"185":2,"186":2,"189":25,"191":8,"192":1,"197":1,"198":11}}],["pointorientation",{"2":{"0":1,"6":2,"116":2}}],["my",{"2":{"199":1,"200":2}}],["m`",{"2":{"158":1}}],["mdk",{"2":{"153":2}}],["moore",{"2":{"146":1}}],["moved",{"2":{"64":1,"172":1}}],["move",{"2":{"63":1,"116":1}}],["mode",{"2":{"200":3}}],["model",{"2":{"158":1,"197":1}}],["modify",{"2":{"191":1}}],["modified",{"2":{"153":1,"154":1}}],["module",{"2":{"172":1,"177":1}}],["modules",{"2":{"6":1,"59":1}}],["mod1",{"2":{"59":5}}],["mod",{"2":{"59":1,"64":1}}],["most",{"2":{"25":1,"27":1,"64":1,"71":1,"73":1,"76":1,"81":1,"116":1,"180":1,"195":2}}],["monotone",{"2":{"20":1,"81":2}}],["monotonechainmethod",{"2":{"0":1,"6":1,"77":1,"81":2,"82":4}}],["moment",{"2":{"6":1,"175":1,"177":1}}],["more",{"2":{"6":3,"7":1,"9":1,"10":1,"11":1,"23":1,"26":1,"29":1,"64":1,"70":1,"72":1,"75":1,"82":1,"116":1,"122":1,"153":2,"154":2,"157":1,"158":2,"163":1,"173":1,"175":1,"177":1,"191":2,"197":1}}],["missing",{"2":{"175":4}}],["missed",{"2":{"146":1}}],["mistakenly",{"2":{"167":1}}],["mid",{"2":{"66":2,"116":3}}],["midpoint",{"2":{"64":2}}],["middle",{"2":{"64":2}}],["mining",{"2":{"199":1}}],["minimal",{"2":{"199":1}}],["minimize",{"2":{"73":1}}],["minimum",{"2":{"4":7,"6":12,"65":1,"66":2,"85":12,"180":1,"181":1,"183":1}}],["mind",{"2":{"175":1,"198":1}}],["minmax",{"2":{"73":4}}],["min",{"2":{"66":1,"73":16,"85":15,"180":1,"182":3,"183":1,"184":28}}],["minus",{"2":{"55":1}}],["minpoints=0",{"2":{"146":1}}],["minpoints",{"2":{"6":2}}],["might",{"2":{"6":3,"25":1,"27":1,"56":1,"70":1,"72":1,"73":1,"75":1,"164":1,"182":1}}],["mixed",{"2":{"6":4,"180":1}}],["m",{"2":{"5":1,"6":1,"15":10,"59":2,"66":6,"145":2,"192":1}}],["mp",{"2":{"105":2}}],["mp1",{"2":{"4":2,"6":2,"88":7}}],["mp2",{"2":{"4":2,"6":2,"88":8}}],["mason",{"2":{"153":1,"154":1}}],["markersize",{"2":{"191":2}}],["marker",{"2":{"191":2}}],["marked",{"2":{"64":6,"71":1,"73":1,"76":1}}],["marking",{"2":{"71":2,"73":2,"76":2}}],["mark",{"2":{"64":2}}],["marks",{"2":{"64":1}}],["mag",{"2":{"53":4}}],["making",{"2":{"64":1,"146":1,"151":1,"168":1,"191":1,"193":2}}],["makie",{"2":{"13":1,"14":1,"52":1,"55":1,"58":3,"62":1,"65":1,"68":4,"79":1,"80":1,"84":1,"87":1,"90":1,"93":1,"103":1,"107":1,"118":1,"121":1,"124":1,"134":1,"146":3,"179":1,"180":1,"196":1}}],["makevalid",{"2":{"180":2}}],["makes",{"2":{"56":1,"64":1,"85":1,"153":1,"162":1,"167":1,"168":1}}],["make",{"2":{"9":1,"25":1,"27":1,"53":1,"64":3,"73":1,"85":1,"122":1,"146":2,"151":1,"163":1,"175":1,"184":1,"187":1,"191":2,"193":1}}],["mainly",{"2":{"59":1,"84":1,"148":1,"154":1}}],["maintain",{"2":{"56":1}}],["main",{"0":{"28":1},"1":{"29":1,"30":1},"2":{"7":1,"26":1,"64":1,"146":1,"153":1,"176":1}}],["manner",{"2":{"197":1}}],["manipulate",{"2":{"195":1}}],["manifolds",{"2":{"158":2}}],["manifold",{"0":{"158":1},"2":{"6":1,"31":2,"158":12,"177":3}}],["manually",{"2":{"161":1}}],["many",{"2":{"4":1,"5":1,"6":2,"23":1,"26":1,"59":1,"64":1,"69":1,"71":1,"73":2,"76":1,"88":1,"162":1,"170":1}}],["mapped",{"2":{"195":1}}],["maptasks`",{"2":{"153":1}}],["maptasks",{"2":{"153":7}}],["mapreducetasks`",{"2":{"154":1}}],["mapreducetasks",{"2":{"154":5}}],["mapreduce",{"2":{"71":1,"146":2,"153":3,"154":7}}],["map",{"0":{"192":1},"2":{"6":1,"13":1,"18":3,"19":1,"29":1,"59":1,"64":1,"73":1,"122":2,"146":17,"153":11,"154":5,"156":10,"158":1,"159":1,"163":1,"180":1,"190":1,"192":1,"193":1,"195":1}}],["matches",{"2":{"88":1,"146":1}}],["match",{"2":{"88":12,"122":3,"146":1,"153":1,"156":2}}],["matching",{"2":{"3":1,"6":1,"22":1,"88":3,"122":1,"151":2}}],["matlab",{"2":{"68":1}}],["materializer`",{"2":{"153":1}}],["materializer",{"2":{"22":1,"153":1}}],["mathematical",{"2":{"158":1}}],["mathematically",{"2":{"6":1,"145":1,"158":2}}],["mathematics",{"2":{"158":1}}],["mathrm",{"2":{"59":1}}],["math",{"2":{"7":1}}],["matrix",{"2":{"6":1,"14":2,"59":1}}],["maxlog=3",{"2":{"177":1}}],["maximal",{"2":{"73":1}}],["maximum",{"2":{"3":1,"6":4,"14":1,"65":1,"66":4,"105":1,"146":1,"176":1,"177":1,"182":4}}],["max",{"2":{"6":9,"32":9,"53":2,"66":1,"146":1,"153":1,"154":1,"175":5,"176":8,"177":21,"182":36,"184":1,"196":1}}],["made",{"2":{"6":2,"63":1,"64":1,"73":1,"129":1,"151":1,"166":1,"169":1,"183":1}}],["maybe",{"2":{"32":1,"116":4,"153":2,"154":3,"156":2}}],["may",{"2":{"1":1,"6":3,"23":2,"24":1,"59":2,"64":1,"73":1,"81":1,"145":1,"147":1,"150":1,"151":1,"153":4,"158":1,"159":1,"167":1,"168":1,"176":1}}],["mercator",{"2":{"192":1}}],["merge",{"2":{"153":1}}],["measures",{"2":{"158":1}}],["measure",{"2":{"156":1,"174":1}}],["meant",{"2":{"26":1}}],["meaning",{"2":{"3":3,"4":1,"6":4,"24":1,"56":1,"60":1,"122":4,"145":1,"158":1}}],["means",{"2":{"3":1,"6":2,"55":1,"56":1,"60":1,"93":1,"116":3,"121":1,"122":1,"145":1,"151":1,"158":2,"160":2}}],["mean",{"2":{"0":1,"6":5,"17":1,"58":2,"59":5,"154":1,"158":1}}],["meanvalue",{"2":{"0":1,"5":2,"6":3,"57":1,"58":2,"59":15}}],["meets",{"2":{"116":9,"122":1,"182":1}}],["meet",{"2":{"73":3,"93":1,"94":1,"108":1,"116":7,"125":1,"135":1}}],["memory",{"2":{"59":1,"193":1}}],["mesh",{"2":{"58":1}}],["message",{"2":{"6":1,"188":1}}],["me",{"0":{"23":1}}],["mentioned",{"2":{"19":1}}],["mentions",{"2":{"6":1,"188":1}}],["menu",{"2":{"14":3}}],["median",{"2":{"13":4,"154":1}}],["mechanics",{"2":{"6":1,"59":1}}],["metadatakeys",{"2":{"153":1}}],["metadatasupport",{"2":{"153":2}}],["metadata",{"2":{"153":11}}],["met",{"2":{"116":44}}],["meters",{"2":{"6":4,"175":1,"176":4,"192":1}}],["methoderror",{"2":{"31":3}}],["methods",{"0":{"2":1,"3":1,"4":1,"6":1,"39":1},"1":{"3":1,"4":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1},"2":{"1":1,"6":7,"9":1,"25":1,"27":1,"31":27,"59":3,"77":1,"94":1,"108":1,"125":1,"135":1,"146":1,"151":1,"153":1,"156":2,"159":1,"175":1,"180":2,"185":1,"191":1}}],["method",{"0":{"173":1},"2":{"1":1,"4":1,"5":10,"6":30,"24":1,"32":1,"53":1,"56":1,"59":37,"60":2,"63":1,"66":1,"73":1,"76":1,"81":3,"82":2,"85":4,"88":1,"94":2,"108":2,"122":1,"125":2,"135":2,"146":1,"153":1,"154":1,"156":3,"160":1,"172":1,"173":2,"175":2,"176":9,"177":22,"178":2,"188":3,"197":1,"200":1}}],["mutation",{"2":{"194":1}}],["mutlipolygon",{"2":{"4":1,"6":1,"63":1}}],["muladd",{"2":{"59":2}}],["multifloats",{"2":{"13":1,"14":1,"15":1}}],["multifloat",{"2":{"7":1}}],["multilinestringtrait",{"2":{"32":1,"165":1}}],["multilinestring",{"2":{"6":1,"189":2}}],["multi",{"0":{"100":1,"101":1,"114":1,"115":1,"131":1,"132":1,"141":1,"142":1},"2":{"4":2,"6":3,"53":1,"56":1,"66":1,"88":2,"100":1,"101":1,"114":1,"115":1,"131":1,"132":1,"141":1,"142":1}}],["multicurves",{"2":{"56":1,"66":1}}],["multicurve",{"2":{"4":1,"6":1,"56":1}}],["multigeometry",{"2":{"4":2,"6":2,"85":2}}],["multiplication",{"2":{"177":1}}],["multiplied",{"2":{"59":3,"158":1}}],["multiple",{"2":{"4":1,"6":1,"59":1,"116":1,"170":1,"184":1,"191":1,"195":1}}],["multiply",{"2":{"1":1,"6":1,"185":1}}],["multipolys",{"2":{"76":3}}],["multipoly`",{"2":{"70":2,"72":2,"75":2}}],["multipoly",{"2":{"6":9,"15":3,"70":1,"71":27,"72":1,"73":26,"75":1,"76":24,"169":21,"180":9}}],["multipolygon`",{"2":{"146":1}}],["multipolygons",{"2":{"3":1,"4":1,"6":11,"63":1,"70":3,"72":3,"73":3,"75":3,"84":1,"88":1,"122":2,"168":1,"191":1,"192":1}}],["multipolygon",{"2":{"3":2,"4":5,"6":17,"56":2,"62":1,"70":1,"71":7,"72":1,"73":5,"75":1,"76":6,"88":4,"122":2,"146":7,"166":2,"167":7,"168":8,"169":2,"180":3,"191":8,"192":1}}],["multipolygontrait",{"2":{"1":1,"3":4,"4":2,"6":6,"23":1,"32":1,"71":4,"73":4,"76":4,"88":6,"100":1,"101":1,"114":1,"115":1,"122":8,"131":1,"132":1,"141":1,"142":1,"150":1,"153":1,"165":1,"169":4}}],["multipoint",{"2":{"4":5,"6":5,"50":1,"56":1,"88":5,"105":6,"153":1,"154":2,"180":1,"191":5}}],["multipoints",{"2":{"3":2,"4":1,"6":3,"56":1,"66":1,"88":2,"122":2,"180":1,"191":1}}],["multipointtrait",{"2":{"1":1,"3":2,"4":4,"6":7,"32":1,"53":2,"56":1,"66":1,"88":8,"100":1,"101":1,"105":4,"114":1,"115":1,"122":4,"131":1,"132":1,"141":1,"142":1,"150":1,"151":1,"165":1,"180":2,"189":1}}],["multithreading",{"2":{"1":2,"4":1,"6":4,"150":1,"155":1}}],["must",{"2":{"1":1,"3":8,"4":2,"5":1,"6":22,"9":1,"53":1,"59":5,"60":1,"64":2,"66":3,"69":1,"73":2,"88":5,"91":2,"94":1,"103":1,"104":1,"108":1,"116":13,"122":1,"124":1,"125":1,"135":2,"146":1,"153":1,"156":2,"164":1,"165":3,"166":1,"172":1,"176":1,"177":1,"180":1,"184":4,"188":1}}],["much",{"2":{"0":1,"6":3,"70":1,"72":1,"75":1}}],["df",{"2":{"194":3,"195":4,"198":10,"199":12}}],["dp",{"2":{"180":3}}],["dy",{"2":{"145":2,"177":3}}],["dy2",{"2":{"145":2}}],["dy1",{"2":{"105":10,"145":2}}],["dyc",{"2":{"105":2}}],["dx",{"2":{"145":2,"177":3}}],["dx2",{"2":{"145":2}}],["dx1",{"2":{"105":10,"145":2}}],["dxc",{"2":{"105":2}}],["drop",{"2":{"76":1,"169":1,"177":1}}],["driven",{"2":{"25":1,"27":1}}],["driving",{"2":{"25":1,"27":1}}],["duplicated",{"2":{"73":2}}],["during",{"2":{"64":1}}],["due",{"2":{"63":1,"64":1,"73":3}}],["date",{"2":{"81":1}}],["datas",{"2":{"200":1}}],["datasets",{"2":{"192":1,"197":1,"198":1}}],["dataset",{"2":{"192":1,"197":1}}],["datainterpolations",{"2":{"174":1}}],["dataapi",{"2":{"31":1,"153":7}}],["dataaspect",{"2":{"13":1,"14":1,"52":1,"55":1,"58":2,"62":1,"65":1,"84":2,"146":2,"175":1,"180":1}}],["dataframes",{"2":{"194":3,"198":2,"199":1}}],["dataframe",{"2":{"29":1,"194":1,"197":1,"198":5,"199":2}}],["data",{"0":{"146":1,"195":1},"2":{"23":1,"25":1,"27":1,"80":1,"146":2,"153":1,"180":10,"190":1,"192":2,"193":2,"194":2,"195":6,"198":1}}],["dashboard",{"0":{"14":1},"2":{"13":1,"14":1}}],["d",{"2":{"1":2,"5":1,"6":1,"59":1,"158":1,"172":1,"182":3}}],["deu",{"2":{"199":2}}],["demonstrates",{"2":{"198":1}}],["densify",{"2":{"176":3}}],["densifying",{"2":{"176":1}}],["densifies",{"2":{"174":1}}],["denoted",{"2":{"116":1}}],["denotes",{"2":{"64":1}}],["debug",{"2":{"165":1}}],["debugging",{"2":{"59":1,"64":1}}],["derivation",{"2":{"73":1}}],["dealing",{"2":{"66":1}}],["delete",{"2":{"105":1,"122":1,"146":1,"182":1}}],["deleteat",{"2":{"64":6,"182":1,"184":2}}],["deltri",{"2":{"82":1}}],["delayed",{"2":{"64":10,"71":2,"73":2,"76":2}}],["delay",{"2":{"64":14,"70":2,"71":2,"72":2,"73":2,"75":2,"76":2}}],["delaunay",{"2":{"6":1,"82":1}}],["delaunaytriangulation",{"2":{"6":1,"31":1,"77":1,"82":6}}],["deprecated",{"2":{"177":1}}],["depend",{"2":{"64":2}}],["depends",{"2":{"64":1,"69":1}}],["depending",{"2":{"1":1,"23":1,"73":1,"150":1,"153":1}}],["depth",{"2":{"59":2}}],["desktop",{"2":{"195":1}}],["dest",{"2":{"192":2}}],["destination",{"2":{"192":5}}],["desired",{"2":{"75":1,"195":1}}],["despite",{"2":{"53":1}}],["describe",{"2":{"17":1}}],["described",{"2":{"6":1,"59":1,"63":1,"64":1}}],["de",{"0":{"39":1},"1":{"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1},"2":{"116":2,"197":1}}],["deconstruct",{"2":{"148":1,"154":1}}],["decomposition",{"2":{"18":1,"148":1}}],["decomposing",{"2":{"18":1}}],["decompose",{"2":{"18":2,"29":1,"59":4,"154":1,"161":1}}],["decrementing",{"2":{"146":1}}],["decrease",{"2":{"63":1}}],["decreasing",{"2":{"6":1,"180":1}}],["decide",{"2":{"81":1,"146":1}}],["decision",{"2":{"24":1}}],["degeneracies",{"2":{"9":1}}],["degenerate",{"2":{"6":1,"59":1,"69":2}}],["degrees",{"2":{"6":1,"52":1,"145":1,"158":1,"176":1}}],["defines",{"2":{"64":1,"148":1,"154":1,"155":1,"156":1,"157":1,"164":1,"187":1}}],["define",{"2":{"58":1,"73":2,"87":1,"146":2,"148":1,"151":1,"153":1,"158":1,"187":1,"200":2}}],["defined",{"2":{"4":1,"5":1,"6":3,"7":1,"22":1,"53":2,"59":1,"65":1,"66":4,"73":4,"85":2,"144":1,"153":1,"158":3,"177":1,"187":1}}],["definitions",{"2":{"188":1}}],["definition",{"2":{"4":4,"6":6,"88":8,"93":1,"158":3,"177":1}}],["default",{"2":{"1":2,"4":5,"6":13,"32":1,"53":1,"56":2,"66":1,"70":1,"71":2,"72":1,"73":5,"75":1,"76":2,"82":1,"85":2,"146":5,"153":5,"156":2,"158":1,"172":2,"180":2}}],["defaults",{"2":{"1":6,"4":2,"6":11,"150":3,"153":1,"155":3}}],["deeper",{"2":{"1":1,"150":1,"152":1,"153":2}}],["detrimental",{"2":{"167":1}}],["detector",{"2":{"81":1}}],["detection",{"2":{"81":1,"146":1}}],["determined",{"2":{"64":1,"66":1}}],["determine",{"2":{"64":10,"66":3,"70":2,"72":2,"73":9,"75":2,"94":1,"108":1,"116":9,"122":1,"125":1,"135":1,"182":3,"197":1}}],["determines",{"2":{"56":1,"64":3,"73":1,"116":10}}],["determinant",{"2":{"6":1,"59":1}}],["detail",{"2":{"26":1}}],["details",{"2":{"6":2,"175":2}}],["details>",{"2":{"6":2}}],["det",{"2":{"0":1,"6":2,"59":4}}],["dirname",{"2":{"180":4}}],["dirty",{"2":{"179":1}}],["directive",{"2":{"153":1}}],["direction",{"2":{"6":1,"64":1,"88":5,"146":3}}],["direct",{"2":{"33":1}}],["directly",{"2":{"6":1,"82":3,"146":1,"176":1}}],["dig",{"2":{"153":1}}],["dict",{"2":{"146":5}}],["didn",{"2":{"76":1,"116":1,"160":1}}],["division",{"2":{"58":1}}],["divided",{"2":{"26":1}}],["ditance",{"2":{"4":1,"6":1,"85":1}}],["dimensional",{"2":{"5":1,"6":3,"55":1,"59":1,"82":2,"158":1}}],["dimensions",{"2":{"3":1,"6":1,"122":2}}],["dimension",{"2":{"1":1,"3":4,"6":4,"105":2,"121":1,"122":4,"172":1}}],["discouraged",{"2":{"193":1}}],["discussion",{"2":{"25":1,"27":1,"69":1}}],["distributed",{"2":{"198":2}}],["distinct",{"2":{"73":1,"146":1}}],["dist",{"2":{"73":40,"85":19,"116":2,"176":8,"182":40}}],["distance`",{"2":{"176":3,"177":2,"188":1}}],["distances",{"2":{"73":1,"84":1,"176":1,"181":5}}],["distance",{"0":{"83":2,"84":2},"1":{"84":2,"85":2},"2":{"0":4,"4":26,"6":47,"31":1,"32":9,"59":13,"60":3,"66":3,"73":32,"83":2,"84":17,"85":92,"116":1,"148":1,"154":1,"174":1,"175":5,"176":13,"177":28,"180":1,"181":3,"182":6,"183":1,"196":1,"200":2}}],["disagree",{"2":{"56":1}}],["displacement",{"2":{"158":1}}],["displaying",{"2":{"192":1}}],["display",{"2":{"13":1,"58":1,"192":1}}],["disparate",{"2":{"25":1,"27":1}}],["dispatches",{"2":{"6":1,"53":1,"56":1,"59":1,"63":1,"66":1,"85":1,"88":1,"94":1,"108":1,"122":1,"125":1,"135":1}}],["dispatch",{"2":{"4":1,"6":3,"24":1,"59":1,"88":1,"156":3,"159":1,"188":1}}],["disjoint",{"0":{"41":1,"106":1,"107":1,"110":1,"111":1,"112":1,"113":1,"114":1},"1":{"107":1,"108":1},"2":{"0":2,"3":5,"6":7,"23":1,"31":1,"41":2,"76":2,"106":1,"107":3,"108":11,"109":6,"110":15,"111":18,"112":10,"113":5,"114":4,"115":2,"116":16,"119":3,"166":2,"167":2,"169":7,"197":1}}],["diffs",{"2":{"53":4}}],["diff",{"2":{"6":2,"53":17,"70":5,"71":3,"122":3,"169":8}}],["differs",{"2":{"192":1}}],["differ",{"2":{"4":1,"6":1,"85":1}}],["differently",{"2":{"4":3,"6":4,"53":1,"56":2,"66":1}}],["different",{"2":{"3":1,"4":4,"6":6,"20":1,"23":1,"53":1,"56":4,"64":3,"66":1,"73":2,"81":1,"122":3,"146":1,"151":1,"153":1,"167":2,"192":2,"195":1}}],["differences",{"0":{"71":1},"2":{"73":1,"182":1}}],["difference",{"0":{"35":1,"38":1,"70":1},"2":{"0":1,"6":7,"11":1,"23":1,"31":1,"35":2,"38":1,"64":3,"70":12,"71":14,"73":1,"75":1,"76":3,"166":1,"169":1,"176":1}}],["diffintersectingpolygons",{"2":{"0":1,"6":1,"166":1,"169":4}}],["doi",{"2":{"70":2,"72":2,"75":2,"116":1}}],["doing",{"2":{"17":1,"22":1,"153":1,"193":1}}],["dot",{"2":{"53":2,"59":1}}],["download",{"2":{"192":1}}],["down",{"2":{"18":1,"29":1,"59":1,"156":2}}],["doable",{"2":{"9":1}}],["documenter",{"2":{"175":2}}],["documentation",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1},"2":{"0":1,"26":1,"58":1,"155":1}}],["docstring",{"2":{"175":4}}],["docstrings",{"0":{"149":1},"1":{"150":1},"2":{"7":1,"155":1}}],["docs",{"0":{"26":1,"155":1},"2":{"26":1,"146":1}}],["doc",{"2":{"9":1,"10":1}}],["does",{"0":{"22":1},"2":{"7":1,"19":1,"62":1,"73":2,"90":1,"93":3,"116":1}}],["doesn",{"2":{"4":1,"6":2,"32":1,"56":1,"69":1,"88":1,"176":1,"188":1,"199":1}}],["doublets",{"2":{"199":2}}],["double",{"2":{"183":4}}],["doubled",{"2":{"6":1,"183":1}}],["douglas",{"2":{"178":2,"180":2,"182":1}}],["douglaspeucker",{"0":{"182":1},"2":{"0":1,"6":5,"178":1,"180":5,"182":6}}],["done",{"0":{"10":1},"2":{"13":1,"14":1,"116":2,"146":1,"148":1,"158":1,"167":1,"191":1,"197":1}}],["don",{"2":{"4":2,"6":2,"64":4,"70":1,"76":1,"88":6,"111":1,"116":1,"124":1,"128":1,"146":2,"153":3,"154":2,"188":1}}],["do",{"0":{"9":1,"23":1,"74":1},"2":{"1":1,"6":1,"14":1,"23":1,"31":1,"53":1,"56":2,"59":2,"60":1,"63":1,"66":1,"69":1,"76":3,"85":2,"87":1,"88":1,"103":1,"111":2,"112":1,"113":2,"116":1,"146":4,"148":1,"150":1,"153":5,"154":2,"156":5,"162":1,"163":1,"168":1,"171":2,"173":1,"176":1,"180":1,"185":2,"186":2,"192":2,"193":2,"194":3,"198":1,"199":1}}],["aim",{"2":{"158":1}}],["ay",{"2":{"145":2}}],["azimuth",{"2":{"145":2}}],["automatically",{"2":{"122":1,"153":1,"192":1}}],["a3",{"2":{"80":1}}],["against",{"2":{"88":1,"116":2,"176":1,"180":1}}],["again",{"2":{"73":1,"153":1}}],["a``",{"2":{"71":2}}],["a`",{"2":{"71":7,"73":3,"76":2}}],["away",{"2":{"60":1,"105":1,"200":1}}],["a2y",{"2":{"73":4}}],["a2x",{"2":{"73":4}}],["a2",{"2":{"58":4,"73":54,"81":1,"122":6}}],["a1y",{"2":{"73":7}}],["a1x",{"2":{"73":7}}],["a1",{"2":{"58":2,"64":9,"73":66,"81":1,"122":6}}],["ams",{"2":{"196":2}}],["america",{"2":{"180":1}}],["am",{"2":{"116":1}}],["ambiguity",{"2":{"85":2,"153":1,"154":1,"156":3}}],["amounts",{"2":{"195":1}}],["amount",{"2":{"55":1,"65":1}}],["amp",{"2":{"6":1,"9":1}}],["axes",{"2":{"146":6}}],["ax",{"2":{"13":3,"14":3,"145":2,"191":5}}],["axis`",{"2":{"158":1}}],["axislegend",{"2":{"79":1,"175":1,"179":1}}],["axis",{"2":{"13":2,"14":1,"52":1,"55":1,"58":4,"62":1,"65":1,"81":2,"84":1,"146":2,"158":4,"175":1,"180":1,"196":1}}],["axs",{"2":{"13":2}}],["advised",{"2":{"159":1}}],["advance",{"2":{"63":2}}],["adjust",{"2":{"73":1}}],["adjacent",{"2":{"64":1,"71":1,"73":1,"76":1}}],["adaptivity",{"0":{"74":1}}],["adaptive",{"2":{"7":1,"13":3,"14":2,"74":1}}],["adapted",{"2":{"70":1,"72":1,"75":1,"145":1}}],["administrative",{"2":{"199":1}}],["admin",{"2":{"11":1,"80":1,"180":2}}],["adm0",{"2":{"11":7,"80":4}}],["additional",{"2":{"195":1}}],["additionally",{"2":{"64":3,"88":1}}],["addition",{"2":{"58":1,"76":1}}],["adding",{"2":{"4":1,"6":4,"7":1,"76":2,"146":1,"170":1,"174":1,"176":2,"177":1}}],["added",{"2":{"53":1,"64":6,"66":1,"76":2,"156":2,"169":2,"182":1}}],["add",{"2":{"3":1,"6":1,"7":2,"59":1,"60":1,"64":16,"66":1,"69":4,"70":3,"72":1,"73":2,"75":2,"76":9,"82":1,"105":1,"146":4,"156":1,"160":1,"174":1,"176":1,"182":10,"192":1,"194":2,"197":4}}],["average",{"2":{"57":3,"63":4,"73":1}}],["available",{"0":{"166":1},"2":{"6":2,"31":1,"63":1,"159":1,"165":3,"174":1,"175":1,"177":1,"180":1,"184":1}}],["avoid",{"2":{"5":1,"6":7,"59":1,"70":1,"72":1,"73":1,"75":1,"76":1,"146":2,"153":1,"154":1,"156":3,"177":1,"181":1,"182":1,"183":1,"191":3}}],["a>",{"2":{"6":2}}],["achieve",{"2":{"167":1}}],["across",{"2":{"151":1}}],["acos",{"2":{"53":1}}],["activate",{"2":{"175":1}}],["action",{"2":{"20":2}}],["actions",{"2":{"20":2}}],["actual",{"2":{"10":1,"59":1,"145":1,"163":1,"172":1,"176":1}}],["actually",{"2":{"1":1,"6":1,"9":1,"59":4,"73":1,"76":3,"116":1,"146":1,"185":1,"195":1}}],["access",{"2":{"192":1}}],["accessed",{"2":{"188":1}}],["accepted",{"2":{"158":1}}],["acceptable",{"2":{"116":1}}],["accepts",{"2":{"82":1}}],["accept",{"2":{"6":1,"188":1}}],["according",{"2":{"162":1,"167":1,"168":1,"198":1}}],["accordingly",{"2":{"64":1}}],["account",{"2":{"70":1,"72":1}}],["accurary",{"2":{"73":1}}],["accuratearithmetic",{"2":{"11":2}}],["accurate",{"0":{"11":1},"2":{"11":3,"175":1}}],["accumulators",{"2":{"59":1}}],["accumulator",{"2":{"59":1}}],["accumulate",{"2":{"56":1,"63":3}}],["accumulation",{"0":{"11":1},"2":{"59":1}}],["after",{"2":{"6":8,"53":1,"64":3,"153":1,"154":1,"180":2}}],["ab",{"2":{"64":3,"70":1,"72":1,"73":5,"75":1}}],["able",{"2":{"20":1,"73":1}}],["ability",{"2":{"17":1}}],["about",{"2":{"6":1,"24":2,"30":1,"59":2,"116":1,"153":1,"158":1,"161":1}}],["above",{"2":{"4":1,"6":1,"53":1,"63":1,"64":1,"73":1,"76":1,"165":1}}],["abs",{"2":{"53":1,"56":4,"63":1,"66":2,"105":8,"122":2,"146":1,"183":1,"200":1}}],["absolutely",{"2":{"154":1}}],["absolute",{"2":{"4":1,"6":1,"55":1,"56":2}}],["abstractarray",{"2":{"153":4,"154":2,"156":1,"189":2}}],["abstractarrays",{"2":{"151":1}}],["abstractrange",{"2":{"146":6}}],["abstractmulticurvetrait",{"2":{"100":1,"101":1,"114":1,"115":1,"131":1,"132":1,"141":1,"142":1}}],["abstractmatrix",{"2":{"6":5,"146":13}}],["abstractpolygontrait",{"2":{"85":1}}],["abstractcurvetrait",{"2":{"53":1,"56":1,"66":1,"96":1,"99":1,"100":1,"105":1,"110":1,"114":1,"127":1,"130":1,"131":1,"137":1,"140":1,"141":1,"145":1,"180":2,"189":3}}],["abstractwkbgeomtrait",{"2":{"32":1}}],["abstractfloat",{"2":{"31":1,"53":1,"56":2,"64":1,"66":2,"69":1,"70":1,"72":1,"73":1,"75":1,"85":8}}],["abstract",{"2":{"6":3,"32":1,"59":3,"158":2,"160":3,"164":1,"165":4,"166":1,"180":3}}],["abstractvector",{"2":{"5":1,"6":1,"59":26,"146":8}}],["abstractgeometrytrait`",{"2":{"165":1}}],["abstractgeometrytrait",{"2":{"6":2,"32":1,"56":2,"66":1,"85":1,"101":1,"115":1,"132":1,"142":1,"151":1,"156":1,"165":4,"166":2,"189":5}}],["abstractgeometry",{"2":{"3":4,"6":4,"32":1,"91":2,"104":2}}],["abstracttrait",{"2":{"1":2,"3":2,"6":2,"69":1,"71":2,"73":4,"76":2,"122":4,"148":1,"150":2,"153":1,"154":2,"156":11,"159":3}}],["abstractbarycentriccoordinatemethod",{"2":{"0":1,"5":1,"6":7,"59":18}}],["attribute",{"2":{"195":1}}],["attributed",{"2":{"194":1}}],["attributes",{"0":{"194":1},"2":{"156":1,"190":1,"194":3}}],["attempt",{"2":{"158":1}}],["attempts",{"2":{"116":1}}],["attach",{"2":{"1":2,"4":1,"6":4,"150":1,"155":1}}],["atomic",{"2":{"7":1}}],["at",{"2":{"3":4,"5":1,"6":6,"9":1,"18":1,"20":1,"24":1,"26":1,"53":2,"55":1,"56":1,"58":1,"59":2,"64":4,"66":2,"73":8,"76":2,"81":1,"116":17,"122":6,"124":1,"125":1,"128":3,"129":2,"130":2,"131":1,"132":1,"135":1,"141":1,"145":1,"151":1,"153":1,"175":1,"177":1,"182":1,"184":1,"192":1,"193":2}}],["arbitrarily",{"2":{"151":1}}],["arbitrary",{"2":{"57":1,"148":1,"154":1,"191":1}}],["around",{"2":{"58":1,"59":2,"69":1,"84":1,"88":1,"146":1,"180":1,"198":1}}],["argmin",{"2":{"184":1}}],["arg",{"2":{"177":1}}],["argtypes",{"2":{"60":2,"173":1,"176":1}}],["args",{"2":{"13":2}}],["argumenterror",{"2":{"76":1,"146":1,"153":1,"154":1,"156":4}}],["argument",{"2":{"4":5,"6":10,"53":1,"56":2,"63":1,"66":1,"70":1,"72":1,"75":1,"85":2,"153":1,"156":1,"188":2,"192":1,"193":1}}],["arguments",{"2":{"1":1,"3":1,"6":5,"64":1,"94":2,"108":1,"125":1,"135":1,"172":1,"176":2,"177":1,"188":1}}],["arithmetic",{"2":{"11":1}}],["archgdal",{"2":{"23":1}}],["arc",{"2":{"6":1,"176":1}}],["array",{"2":{"4":1,"6":2,"56":1,"66":1,"146":5,"153":5,"154":2,"181":1,"184":1}}],["arrays",{"2":{"1":1,"6":1,"22":1,"146":1,"150":1,"154":2}}],["aren",{"2":{"4":3,"6":5,"69":1,"71":1,"73":2,"76":4,"88":3,"166":2,"169":2}}],["are",{"2":{"1":1,"3":4,"4":18,"5":2,"6":46,"9":2,"20":2,"22":3,"24":1,"25":1,"26":2,"27":1,"52":1,"53":8,"55":1,"56":2,"57":6,"59":11,"62":1,"63":3,"64":31,"66":6,"69":3,"70":3,"71":15,"72":2,"73":16,"75":5,"76":9,"81":3,"84":1,"85":1,"87":3,"88":26,"90":1,"94":7,"96":1,"97":3,"98":3,"99":1,"101":1,"107":1,"108":5,"110":1,"111":1,"112":1,"114":1,"115":1,"116":12,"122":7,"125":5,"127":1,"129":2,"134":1,"135":5,"137":1,"138":3,"139":3,"140":1,"142":1,"145":1,"146":14,"147":1,"150":1,"151":1,"153":6,"156":4,"157":1,"158":4,"159":1,"161":1,"162":1,"163":1,"165":1,"166":3,"167":1,"168":1,"169":2,"170":1,"175":1,"176":1,"177":1,"180":4,"182":1,"184":2,"186":1,"187":2,"188":1,"191":1,"194":2,"195":2,"196":1,"197":3,"198":6,"199":1,"200":1}}],["area2",{"2":{"63":4}}],["area1",{"2":{"63":4}}],["areas",{"2":{"4":2,"6":2,"56":3,"158":1,"183":2}}],["area",{"0":{"54":2,"55":2},"1":{"55":2,"56":2},"2":{"0":5,"4":15,"6":25,"11":6,"31":1,"54":2,"55":9,"56":61,"61":1,"62":3,"63":49,"65":2,"66":44,"75":2,"76":1,"122":1,"148":1,"154":1,"158":2,"166":2,"169":2,"180":2,"183":4,"192":1}}],["asked",{"2":{"153":1}}],["ask",{"2":{"23":1}}],["aspect",{"2":{"13":1,"14":1,"52":1,"55":1,"58":2,"62":1,"65":1,"84":2,"146":2,"175":1,"180":1}}],["assign",{"2":{"190":1}}],["assigned",{"2":{"64":1,"146":7,"198":1}}],["assets",{"2":{"192":1}}],["assetpath",{"2":{"192":1}}],["assemble",{"2":{"163":1}}],["assert",{"2":{"59":23,"63":1,"64":1,"69":1,"71":1,"73":1,"177":2,"189":1}}],["assume",{"2":{"122":2,"153":3,"154":1,"162":1,"169":1}}],["assumed",{"2":{"56":1,"88":1,"116":1}}],["assumes",{"2":{"6":3,"64":1,"85":1,"176":1,"177":2,"184":1}}],["associativity",{"2":{"19":1}}],["associated",{"0":{"1":1},"2":{"57":2}}],["as",{"2":{"1":8,"3":18,"4":6,"5":1,"6":74,"7":1,"11":2,"13":3,"14":3,"15":3,"17":2,"18":2,"20":1,"22":1,"23":2,"24":1,"25":1,"27":1,"52":2,"53":4,"55":2,"56":3,"57":4,"58":1,"59":4,"60":3,"62":2,"63":1,"64":15,"65":2,"66":5,"68":3,"69":5,"70":8,"71":2,"72":7,"73":8,"75":7,"76":5,"77":1,"79":2,"80":2,"81":3,"82":3,"84":3,"85":1,"87":2,"88":2,"90":2,"91":2,"93":3,"94":3,"103":2,"104":2,"105":2,"107":2,"108":3,"116":7,"118":2,"119":2,"121":2,"122":2,"124":2,"125":3,"127":1,"134":2,"135":3,"145":8,"146":3,"148":3,"150":2,"151":2,"152":2,"153":10,"154":4,"156":4,"158":4,"159":2,"160":2,"162":2,"163":2,"165":1,"166":1,"168":2,"170":1,"172":3,"174":2,"175":2,"176":3,"177":1,"178":2,"179":2,"180":7,"182":2,"185":3,"188":2,"189":2,"190":3,"191":2,"192":1,"193":1,"195":3,"196":3,"197":2,"198":3,"199":2}}],["alone",{"2":{"153":1}}],["along",{"2":{"4":4,"6":5,"64":3,"66":2,"73":4,"88":4,"116":1}}],["although",{"2":{"138":1,"139":1}}],["alternate",{"2":{"64":1}}],["alternative",{"2":{"64":1}}],["already",{"2":{"88":1,"116":2,"153":1,"182":1}}],["almost",{"2":{"73":1}}],["alg=nothing",{"2":{"180":1}}],["alg`",{"2":{"180":1}}],["alg",{"2":{"6":4,"32":2,"180":21,"181":3,"182":8,"183":3,"184":7,"188":9}}],["algorithms",{"2":{"6":3,"77":1,"81":1,"162":1,"177":1,"178":1,"180":4,"182":1,"184":1}}],["algorithm",{"0":{"181":1,"182":1,"183":1},"2":{"6":12,"58":1,"64":2,"66":1,"69":3,"70":1,"72":1,"75":1,"77":1,"82":4,"116":1,"178":1,"180":8,"181":1,"182":3,"183":1,"188":4}}],["allocating",{"2":{"82":1}}],["allocations",{"2":{"5":1,"6":1,"59":1}}],["allocate",{"2":{"82":1}}],["allow=",{"2":{"116":1}}],["allows",{"2":{"11":1,"18":1,"23":1,"24":1,"29":1,"94":2,"96":3,"97":3,"98":3,"99":1,"108":2,"110":3,"111":3,"112":2,"113":1,"125":1,"128":1,"129":1,"130":1,"135":3,"137":3,"138":3,"139":3,"140":1,"148":1,"178":1,"192":1,"194":1,"197":1}}],["allowed",{"2":{"6":1,"94":3,"108":3,"116":6,"125":5,"127":1,"128":2,"135":3,"180":1}}],["allow",{"2":{"1":1,"6":1,"23":1,"73":1,"94":7,"105":3,"108":7,"116":73,"125":10,"135":10,"177":1,"185":1}}],["all",{"2":{"1":3,"3":2,"4":3,"6":12,"9":1,"11":7,"22":1,"25":1,"27":1,"31":2,"53":5,"56":3,"59":1,"64":13,"66":3,"70":1,"71":3,"73":3,"76":5,"77":1,"80":3,"82":1,"84":1,"88":2,"90":1,"97":3,"98":3,"101":1,"114":1,"115":1,"116":7,"122":4,"134":1,"142":1,"145":1,"146":3,"147":1,"150":1,"151":2,"152":1,"153":7,"154":1,"156":4,"158":1,"163":1,"165":1,"167":1,"170":1,"171":1,"180":1,"185":2,"186":1,"187":1,"191":1,"193":1,"195":1,"197":1}}],["always",{"2":{"1":7,"4":6,"6":8,"25":1,"27":1,"55":1,"56":4,"66":2,"81":1,"84":1,"85":1,"88":1,"150":2,"153":3,"154":1,"172":4,"197":1}}],["also",{"2":{"1":2,"6":9,"23":1,"53":1,"56":2,"63":2,"64":3,"66":1,"70":1,"72":1,"73":2,"75":1,"77":1,"81":1,"82":1,"84":1,"85":2,"88":3,"122":1,"146":1,"150":1,"151":1,"153":1,"159":1,"163":1,"166":3,"169":2,"173":1,"174":1,"175":1,"176":1,"178":1,"185":1,"191":2,"194":1}}],["a",{"0":{"23":1,"192":1,"194":1},"2":{"1":13,"3":5,"4":79,"5":1,"6":187,"7":3,"9":1,"11":1,"15":2,"17":1,"18":6,"20":3,"22":3,"23":4,"24":2,"25":2,"27":2,"29":2,"30":2,"32":4,"35":3,"36":3,"37":3,"38":3,"40":2,"41":2,"42":2,"43":2,"44":2,"45":2,"46":2,"47":2,"48":2,"49":2,"52":3,"53":22,"55":11,"56":20,"57":13,"58":4,"59":11,"60":2,"62":5,"63":8,"64":281,"65":2,"66":17,"68":3,"69":4,"70":39,"71":30,"72":38,"73":91,"74":3,"75":36,"76":45,"77":3,"79":3,"80":2,"81":1,"82":4,"84":15,"85":27,"87":2,"88":54,"90":2,"93":1,"94":3,"96":5,"97":3,"98":2,"100":2,"101":2,"103":2,"105":1,"107":1,"108":3,"110":4,"111":3,"112":1,"114":2,"115":2,"116":52,"118":2,"121":5,"122":27,"124":2,"125":4,"127":4,"128":2,"129":2,"130":1,"131":2,"132":2,"134":1,"135":3,"137":5,"138":2,"139":2,"141":2,"142":2,"144":1,"145":4,"146":79,"148":4,"150":4,"151":4,"153":27,"154":6,"156":7,"158":11,"159":6,"160":6,"161":6,"162":2,"163":2,"164":5,"165":5,"166":9,"167":8,"169":6,"170":2,"171":3,"172":8,"173":3,"174":5,"175":4,"176":8,"177":10,"179":3,"180":5,"183":3,"184":1,"185":2,"186":1,"188":12,"189":2,"190":1,"191":17,"192":12,"193":5,"194":5,"195":11,"196":1,"197":5,"198":8,"199":3,"200":3}}],["apart",{"2":{"169":1}}],["april",{"0":{"7":1}}],["appears",{"2":{"162":1}}],["append",{"2":{"53":1,"64":5,"70":1,"71":2,"73":2,"75":1,"76":5,"169":2}}],["approximately",{"2":{"64":1,"175":1}}],["approach",{"2":{"19":1}}],["appropriately",{"2":{"198":1}}],["appropriate",{"2":{"6":1,"188":2}}],["applies",{"2":{"151":2}}],["applied",{"2":{"6":1,"20":1,"156":4,"164":2,"165":2,"166":1}}],["application",{"2":{"1":1,"6":2,"150":1,"154":1,"163":1,"165":3,"166":1,"169":2,"174":1,"177":1}}],["apply`",{"2":{"153":1}}],["applys",{"2":{"56":1,"66":1}}],["applyreduce",{"0":{"19":1,"154":1},"2":{"0":1,"1":1,"17":1,"19":2,"29":1,"31":2,"53":1,"56":1,"63":2,"66":1,"85":2,"148":1,"150":1,"154":42,"160":1}}],["apply",{"0":{"1":1,"18":1,"22":1,"29":1,"148":1,"151":1},"1":{"19":1,"149":1,"150":1,"151":1,"152":1,"153":1},"2":{"0":1,"1":4,"6":3,"17":1,"18":5,"20":1,"22":1,"24":1,"29":3,"31":3,"32":2,"148":5,"150":3,"151":4,"152":1,"153":55,"154":5,"155":1,"156":3,"158":1,"160":1,"165":4,"166":1,"170":1,"171":3,"172":1,"176":1,"177":1,"180":2,"185":3,"186":2}}],["apis",{"2":{"17":1}}],["api",{"0":{"0":1,"59":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1},"2":{"0":1,"6":3,"24":1,"59":1,"176":1,"180":1,"188":1}}],["annotation",{"2":{"160":1}}],["annotated",{"2":{"26":1}}],["angular",{"2":{"158":1}}],["angels",{"2":{"53":1}}],["angle",{"2":{"53":35,"145":1}}],["angles",{"0":{"51":1,"52":1},"1":{"52":1,"53":1},"2":{"0":2,"4":10,"6":10,"31":1,"51":1,"52":4,"53":42}}],["answers",{"2":{"167":1}}],["answer",{"2":{"6":3,"70":1,"72":1,"73":1,"75":1}}],["another",{"2":{"3":1,"6":1,"64":2,"73":1,"82":1,"84":1,"90":1,"93":1,"96":1,"98":1,"99":1,"103":1,"107":1,"110":1,"111":1,"112":1,"113":1,"116":1,"118":1,"121":1,"122":1,"124":1,"127":1,"128":1,"129":1,"130":1,"134":1,"137":1,"138":1,"139":1,"140":1,"146":1,"172":1}}],["anonymous",{"2":{"1":1,"6":1,"185":1}}],["an",{"2":{"1":3,"4":11,"5":1,"6":27,"9":1,"13":1,"14":1,"18":1,"20":1,"23":2,"32":1,"52":1,"53":4,"55":1,"56":2,"58":1,"59":3,"60":2,"62":1,"64":15,"65":2,"66":2,"68":1,"69":1,"70":2,"71":5,"72":2,"73":9,"75":2,"76":2,"82":3,"84":2,"85":5,"87":1,"88":1,"90":1,"93":2,"96":2,"103":1,"107":1,"116":13,"118":1,"121":1,"122":1,"124":1,"134":1,"137":2,"138":1,"139":1,"146":3,"147":1,"150":1,"151":1,"152":1,"153":5,"154":2,"156":2,"158":1,"163":1,"170":1,"172":1,"176":1,"185":2,"188":3,"189":1,"191":2,"192":2,"194":1,"196":1,"198":1}}],["anything",{"2":{"58":1,"116":1}}],["any",{"2":{"1":3,"3":1,"4":2,"6":17,"18":1,"24":1,"25":1,"27":1,"29":1,"57":2,"63":1,"64":7,"66":1,"69":1,"71":1,"73":4,"76":1,"85":2,"95":2,"96":1,"99":1,"107":1,"109":2,"110":1,"111":2,"112":1,"113":2,"116":8,"122":2,"126":2,"136":2,"140":1,"146":2,"148":2,"150":1,"153":2,"154":2,"156":2,"163":1,"164":1,"165":3,"166":4,"169":4,"172":2,"174":1,"176":1,"177":1,"182":1,"189":1,"197":3,"198":2}}],["and",{"0":{"1":1,"20":1,"22":1,"24":1,"54":1,"71":1,"73":1,"76":1,"83":1,"191":1,"192":1,"194":1},"1":{"55":1,"56":1,"84":1,"85":1},"2":{"0":2,"1":8,"3":11,"4":18,"6":79,"7":1,"9":2,"17":4,"18":4,"20":2,"22":1,"23":2,"24":3,"25":2,"26":5,"27":2,"29":2,"30":1,"31":2,"32":2,"33":1,"53":13,"55":1,"56":7,"57":2,"58":2,"59":20,"60":1,"61":2,"62":1,"63":29,"64":71,"65":2,"66":18,"68":1,"69":4,"70":4,"71":16,"72":4,"73":38,"75":6,"76":15,"81":1,"82":2,"84":2,"85":13,"87":2,"88":13,"90":3,"91":2,"93":2,"94":3,"97":3,"98":4,"99":1,"103":2,"104":2,"105":1,"108":3,"111":3,"112":1,"113":1,"116":36,"118":1,"121":2,"122":3,"125":2,"129":2,"130":2,"134":3,"135":4,"137":2,"138":3,"139":3,"140":1,"145":2,"146":16,"148":6,"150":5,"151":2,"152":3,"153":16,"154":10,"156":2,"157":1,"158":14,"159":1,"160":3,"161":1,"162":2,"163":1,"164":1,"165":4,"166":2,"167":1,"170":2,"171":2,"172":2,"175":1,"176":5,"177":7,"178":2,"179":1,"180":8,"182":8,"183":1,"184":1,"185":1,"188":4,"190":3,"191":9,"192":7,"193":2,"195":5,"197":2,"198":4,"199":2}}],["snapped",{"2":{"146":1}}],["s3",{"2":{"64":3}}],["scratch",{"2":{"195":1}}],["sciences",{"2":{"192":1}}],["scalefactor",{"2":{"176":3}}],["scattered",{"2":{"198":1}}],["scatter",{"2":{"62":1,"84":2,"87":2,"90":2,"93":1,"103":1,"107":2,"121":2,"134":2,"198":1}}],["schema",{"2":{"153":5,"154":1}}],["scheme",{"2":{"63":1}}],["scenario",{"2":{"116":2}}],["scene",{"2":{"14":1}}],["skipmissing",{"2":{"146":1}}],["skipped",{"2":{"146":1}}],["skip",{"2":{"56":1,"116":14,"146":1,"153":1,"184":4}}],["skygering",{"2":{"7":1}}],["square",{"2":{"85":1,"181":1,"182":1}}],["squared",{"2":{"6":2,"66":2,"85":12,"181":2,"182":7}}],["sqrt",{"2":{"53":2,"63":1,"85":3}}],["sgn",{"2":{"53":5}}],["smallest",{"2":{"53":2,"73":1,"77":1}}],["sᵢ₋₁",{"2":{"59":25}}],["sᵢ₊₁",{"2":{"6":2,"59":41}}],["sᵢ",{"2":{"6":4,"59":46}}],["src",{"2":{"6":2}}],["syntax",{"2":{"194":1}}],["sym10100477",{"2":{"116":1}}],["symdifference",{"2":{"38":1,"147":1}}],["symmetric",{"0":{"38":1},"2":{"38":1}}],["symbol=",{"2":{"105":1}}],["symbol",{"2":{"6":1,"188":2}}],["system",{"0":{"192":1,"193":1},"2":{"1":2,"172":2,"190":2,"192":1}}],["switches",{"2":{"73":1,"76":1}}],["switch",{"2":{"64":1,"76":1,"160":1}}],["switching",{"2":{"6":1,"66":1}}],["swap",{"2":{"6":1,"76":1,"85":2,"171":1}}],["swapped",{"2":{"3":1,"6":1,"91":1,"94":1,"104":1,"105":1,"119":1,"122":1}}],["swapping",{"2":{"1":1,"150":1,"153":1}}],["s2",{"2":{"6":4,"59":6,"64":3}}],["s1",{"2":{"6":3,"59":6,"64":3}}],["saving",{"0":{"195":1}}],["saved",{"2":{"88":1}}],["save",{"2":{"53":1,"190":1,"195":3}}],["samples",{"2":{"13":1}}],["sample",{"2":{"13":1}}],["same",{"2":{"3":2,"4":12,"6":22,"18":1,"53":3,"56":1,"64":15,"66":1,"69":1,"70":3,"72":1,"73":1,"75":1,"76":1,"81":1,"84":1,"87":2,"88":30,"116":2,"121":1,"122":8,"151":1,"153":5,"156":2,"161":1,"166":2,"168":1,"169":2,"175":1,"191":1,"192":1,"195":1}}],["says",{"2":{"81":1}}],["say",{"2":{"6":1,"59":1,"176":1}}],["spliced",{"2":{"155":1}}],["split",{"2":{"69":1}}],["sp",{"2":{"116":2}}],["specify",{"2":{"156":2,"192":1,"193":1,"197":1}}],["specification",{"2":{"162":1,"165":1,"167":1,"168":1}}],["specifically",{"2":{"6":2,"59":3,"178":1,"197":1}}],["specific",{"2":{"64":1,"94":1,"108":1,"125":1,"135":1,"153":1,"154":1,"156":3,"158":1}}],["specified",{"2":{"3":1,"6":2,"64":1,"71":2,"73":2,"76":2,"122":1,"151":1,"180":1}}],["specialized",{"2":{"25":1,"27":1,"82":1,"153":1}}],["sphere",{"2":{"6":1,"158":3,"177":1}}],["sphericalgeodesics",{"2":{"158":1}}],["spherical",{"2":{"6":1,"31":2,"158":7,"177":1}}],["spatial",{"0":{"197":1},"1":{"198":1,"199":1,"200":1},"2":{"197":6,"198":3,"200":1}}],["spawn",{"2":{"153":3,"154":3}}],["span>",{"2":{"6":2}}],["span",{"2":{"6":2,"198":1}}],["space",{"2":{"6":1,"25":1,"27":1,"53":1,"55":1,"116":1,"158":5,"176":1}}],["slow",{"2":{"199":1}}],["slower",{"2":{"6":1,"188":2}}],["slope2",{"2":{"145":2}}],["slope1",{"2":{"145":2}}],["slidergrid",{"2":{"14":1}}],["sliders",{"2":{"14":3}}],["slightly",{"2":{"4":2,"6":2,"56":2}}],["suite",{"2":{"176":5,"180":13}}],["suggestion",{"2":{"173":1}}],["success",{"2":{"158":1}}],["such",{"2":{"4":1,"6":1,"55":1,"68":1,"77":1,"151":1,"170":1}}],["sun",{"2":{"116":1}}],["surrounds",{"2":{"116":1}}],["sure",{"2":{"9":1,"53":1,"64":2,"85":1,"122":1,"184":1}}],["suppose",{"2":{"199":1,"200":1}}],["supports",{"2":{"58":1,"59":1,"77":1,"153":3,"195":1,"200":2}}],["support",{"2":{"32":1,"60":1,"174":1,"200":1}}],["supported",{"2":{"23":1,"195":1}}],["supertype",{"2":{"6":1,"59":1}}],["sukumar",{"2":{"6":1,"59":1}}],["sum=1",{"2":{"59":1}}],["summary>",{"2":{"6":4}}],["sum",{"2":{"4":2,"6":3,"11":6,"55":1,"56":2,"57":2,"59":8,"66":1,"85":2,"145":5,"184":1,"189":4}}],["sublevel",{"2":{"199":1}}],["subsequent",{"2":{"191":1}}],["substituted",{"2":{"1":1,"150":1,"153":1}}],["subgeom1",{"2":{"156":2}}],["subgeom",{"2":{"156":3}}],["subject",{"2":{"64":1}}],["subtype",{"2":{"153":1}}],["subtypes",{"2":{"6":2,"59":2}}],["subtracted",{"2":{"145":1}}],["subtitle",{"2":{"13":1,"58":2,"176":1,"180":2}}],["sub",{"2":{"4":6,"6":7,"53":1,"56":3,"66":1,"71":6,"73":3,"76":4,"85":2,"100":2,"101":2,"114":2,"115":2,"131":2,"132":2,"141":2,"142":2,"153":3,"167":4,"168":2,"169":4}}],["series",{"2":{"191":1}}],["serve",{"2":{"6":1,"59":1}}],["searchsortedfirst",{"2":{"182":1}}],["semimajor",{"2":{"158":3}}],["seg2",{"2":{"145":2}}],["seg1",{"2":{"145":3}}],["seg",{"2":{"116":23,"122":9}}],["segmentation",{"2":{"175":1}}],["segments",{"2":{"23":1,"31":1,"52":2,"53":1,"62":1,"63":2,"64":3,"66":1,"73":6,"116":18,"176":1,"177":3}}],["segmentization",{"2":{"32":1,"158":1,"174":1}}],["segmentizing",{"2":{"6":3,"175":1,"176":2,"177":1}}],["segmentizemethod",{"2":{"176":3,"177":1}}],["segmentized",{"2":{"175":1}}],["segmentizes",{"2":{"174":1}}],["segmentize",{"0":{"32":1,"174":1},"1":{"175":1,"176":1,"177":1},"2":{"0":1,"6":4,"31":1,"32":9,"60":1,"148":1,"158":1,"174":1,"175":5,"176":11,"177":18,"196":1}}],["segment",{"2":{"4":4,"6":7,"53":1,"63":5,"64":6,"66":3,"68":1,"73":17,"85":2,"105":3,"116":43,"122":3,"145":2,"174":1,"176":2,"177":1}}],["seperate",{"2":{"73":1}}],["separates",{"2":{"116":1}}],["separate",{"2":{"64":1,"146":1,"153":1,"160":1,"195":1,"198":1}}],["separately",{"2":{"59":1,"146":1}}],["sense",{"2":{"56":1,"85":1}}],["several",{"2":{"20":2,"56":1,"161":1,"169":1}}],["select",{"2":{"159":1}}],["selected",{"2":{"146":1}}],["selectednode",{"2":{"146":3}}],["selection",{"2":{"14":1}}],["self",{"2":{"9":2}}],["section",{"2":{"26":1,"116":3,"121":1}}],["sections",{"2":{"10":1,"26":1}}],["seconds=1",{"2":{"176":3,"180":8}}],["secondisleft",{"2":{"146":4}}],["secondisstraight",{"2":{"146":7}}],["secondary",{"2":{"3":3,"6":3,"91":1,"94":1,"135":1}}],["second",{"2":{"3":8,"6":9,"64":1,"73":4,"88":1,"90":2,"91":1,"93":1,"94":1,"97":1,"98":1,"99":1,"104":2,"108":2,"116":2,"125":1,"134":1,"135":1,"138":1,"139":1,"140":2,"182":1,"193":1,"197":1}}],["seem",{"2":{"25":1,"27":1}}],["see",{"2":{"6":4,"7":1,"29":1,"62":1,"82":1,"85":1,"87":1,"90":1,"93":1,"107":1,"116":5,"118":1,"121":1,"124":1,"134":1,"146":2,"162":1,"163":1,"165":1,"166":3,"168":1,"169":2,"175":2,"182":1,"198":2}}],["setup=",{"2":{"94":1,"108":1,"125":1,"135":1}}],["sets",{"2":{"64":1,"81":1}}],["setting",{"2":{"23":1}}],["set",{"0":{"23":1,"34":1},"1":{"35":1,"36":1,"37":1,"38":1},"2":{"3":2,"4":7,"6":19,"23":1,"53":1,"57":2,"59":8,"64":3,"70":2,"72":2,"73":7,"75":2,"77":2,"87":2,"88":10,"94":1,"105":1,"108":1,"116":2,"122":1,"125":1,"135":1,"145":1,"146":1,"153":5,"166":2,"169":2,"182":2,"191":1,"195":1,"198":3}}],["sve",{"2":{"1":1,"6":1,"185":1}}],["svector",{"2":{"1":14,"6":14,"64":5,"70":1,"73":2,"76":6,"116":1,"146":1,"185":13,"191":6,"193":4}}],["solution",{"2":{"116":1}}],["south",{"2":{"66":7,"158":1}}],["source",{"2":{"1":10,"3":19,"4":22,"5":3,"6":84,"26":4,"105":2,"150":2,"156":4,"165":1,"166":4,"172":3,"192":13,"193":1}}],["sort",{"2":{"64":4,"69":2,"73":2,"75":2,"116":1,"122":2,"146":1,"182":1}}],["sorted",{"2":{"20":1,"64":1,"182":7,"197":1}}],["someone",{"2":{"82":1,"188":1}}],["something",{"0":{"74":1},"2":{"10":1}}],["some",{"2":{"3":1,"6":4,"9":1,"17":1,"59":4,"88":1,"116":3,"122":1,"146":1,"147":1,"148":1,"151":2,"153":2,"154":1,"164":1,"165":2,"166":1,"177":1,"184":1,"187":2,"190":2,"197":1,"200":1}}],["so",{"2":{"1":1,"4":4,"6":9,"9":1,"17":1,"19":1,"25":1,"27":1,"31":1,"58":1,"59":1,"64":1,"65":1,"73":1,"75":2,"76":2,"84":1,"85":1,"87":1,"88":4,"90":1,"107":1,"116":2,"118":1,"134":1,"146":3,"153":8,"156":2,"174":1,"175":1,"176":3,"177":1,"184":1,"185":1,"188":2,"192":1,"193":1}}],["styles",{"2":{"153":1}}],["style",{"2":{"153":7}}],["step",{"2":{"64":7,"70":1,"71":3,"72":1,"73":3,"75":1,"76":3,"146":6,"189":1}}],["storing",{"2":{"195":1}}],["stored",{"2":{"64":2,"198":1}}],["stores",{"2":{"64":1}}],["store",{"2":{"59":1,"195":1}}],["stopping",{"2":{"182":2}}],["stops",{"2":{"151":1}}],["stop",{"2":{"18":2,"105":3,"116":4,"122":3}}],["stay",{"2":{"76":1}}],["stackoverflow",{"2":{"73":1}}],["stack",{"2":{"69":1}}],["states",{"2":{"180":1}}],["state",{"2":{"75":1,"199":9}}],["status",{"2":{"64":31,"71":4,"73":5,"76":4,"146":1}}],["static",{"2":{"160":1}}],["staticarray",{"2":{"59":1}}],["staticarrays",{"2":{"31":1,"64":5,"70":1,"73":2,"76":6,"116":1,"146":1,"185":2}}],["staticarraysco",{"2":{"1":1,"6":1,"185":1}}],["staticarrayscore",{"2":{"1":10,"6":10,"59":1,"185":10,"191":6,"193":4}}],["statica",{"2":{"1":1,"6":1,"185":1}}],["statistics",{"2":{"13":2,"31":1}}],["stability",{"2":{"23":1,"30":1}}],["stable",{"2":{"13":1,"24":1,"177":1}}],["stage",{"2":{"7":1}}],["standardized",{"2":{"116":1}}],["standards",{"2":{"116":1}}],["standard",{"2":{"6":1,"82":1,"158":1}}],["started",{"2":{"64":1}}],["starting",{"2":{"63":2,"64":1,"66":1,"73":1,"169":4}}],["startvalue",{"2":{"14":4}}],["start",{"2":{"6":1,"18":1,"53":7,"59":1,"64":76,"66":17,"71":4,"73":4,"76":5,"88":1,"105":4,"116":44,"122":3,"137":1,"146":2,"161":1,"182":16,"191":1}}],["straightline",{"2":{"146":3}}],["straight",{"2":{"146":6,"154":1}}],["strait",{"2":{"146":1}}],["structs",{"2":{"20":1,"165":1}}],["structures",{"2":{"148":1}}],["structure",{"2":{"6":1,"148":1,"156":2,"171":1}}],["struct",{"2":{"6":2,"59":2,"64":2,"82":1,"158":3,"159":3,"160":6,"163":1,"169":2,"176":2,"181":1,"182":1,"183":1,"188":4}}],["strings",{"2":{"6":1,"63":1,"73":1}}],["string",{"2":{"1":2,"14":1,"62":1,"63":1,"172":2}}],["still",{"2":{"0":1,"56":1,"63":1,"64":3,"93":1,"182":1}}],["shp",{"2":{"195":1}}],["ships",{"2":{"192":1}}],["shifting",{"2":{"193":1}}],["shift",{"2":{"191":3}}],["shewchuck",{"2":{"7":1}}],["short",{"2":{"153":1}}],["shorthand",{"2":{"82":1}}],["show",{"2":{"9":1,"11":1,"13":1,"14":1,"58":1,"156":3,"192":1,"195":1,"197":2}}],["shoelace",{"2":{"4":1,"6":1,"56":2,"66":1}}],["shouldn",{"2":{"73":1}}],["should",{"2":{"1":1,"4":1,"6":12,"17":1,"18":1,"20":2,"25":1,"27":1,"32":1,"53":3,"56":1,"63":1,"64":3,"65":1,"88":1,"116":4,"146":2,"150":1,"153":2,"156":2,"158":1,"160":1,"162":1,"165":4,"166":2,"177":2,"180":2}}],["sharing",{"2":{"107":1}}],["shares",{"2":{"73":1}}],["share",{"2":{"4":7,"6":8,"87":2,"88":8,"111":2,"112":1,"113":1,"122":1,"130":1}}],["shared",{"0":{"184":1},"2":{"3":1,"6":1,"64":2,"73":2,"122":3}}],["shapes",{"2":{"85":1,"195":7}}],["shape",{"2":{"62":1,"71":1,"73":1,"87":1,"158":1,"168":1,"191":1}}],["shaped",{"2":{"58":1}}],["shapefiles",{"2":{"195":1}}],["shapefile",{"2":{"29":1,"195":4}}],["shallower",{"2":{"1":1,"150":1,"153":1}}],["sites",{"2":{"199":1}}],["sides",{"2":{"64":3,"162":1}}],["side",{"2":{"53":4,"64":26}}],["signals",{"2":{"152":1}}],["sign",{"2":{"13":2,"14":2,"53":7,"56":2,"145":3}}],["signed",{"0":{"54":1,"55":1,"83":1,"84":1},"1":{"55":1,"56":1,"84":1,"85":1},"2":{"0":4,"4":15,"6":18,"11":3,"54":1,"55":5,"56":23,"66":3,"83":1,"84":7,"85":19}}],["six",{"2":{"6":1,"180":1}}],["size=",{"2":{"192":1}}],["sizehint",{"2":{"64":2,"71":1,"177":1}}],["size",{"2":{"6":4,"13":2,"14":5,"58":1,"76":1,"146":2,"153":2,"154":2,"180":1}}],["sin",{"2":{"191":3,"192":1,"193":2}}],["singed",{"2":{"85":1}}],["singular",{"2":{"73":1}}],["singlepoly",{"2":{"180":6}}],["single",{"2":{"4":6,"6":10,"23":1,"53":2,"56":1,"66":1,"88":5,"121":2,"146":2,"154":1,"166":2,"167":1,"169":2,"191":3,"195":1}}],["since",{"2":{"1":1,"6":2,"26":1,"53":1,"56":1,"63":1,"66":2,"75":1,"85":1,"88":1,"116":1,"122":2,"129":1,"153":1,"160":1,"172":1,"188":2,"199":1}}],["simulation",{"2":{"23":1}}],["simultaneously",{"2":{"20":1}}],["simply",{"2":{"7":1,"55":1,"60":1,"64":1,"73":1,"76":1,"91":1,"104":1,"119":1,"146":1,"164":1,"172":1,"173":1,"176":1,"191":1,"194":1}}],["simpler",{"2":{"6":1,"146":1}}],["simple",{"0":{"33":1,"79":1,"198":1},"1":{"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1},"2":{"6":3,"33":1,"59":1,"82":1,"148":3,"158":1,"160":1,"171":1,"172":1,"179":2,"180":2}}],["simplifier",{"2":{"180":4}}],["simplified",{"2":{"23":1,"179":1}}],["simplifies",{"2":{"6":3,"181":1,"182":1,"183":1}}],["simplification",{"0":{"178":1},"1":{"179":1,"180":1},"2":{"6":2,"178":2,"180":3}}],["simplifying",{"2":{"178":1}}],["simplify",{"0":{"181":1,"182":1,"183":1},"2":{"0":1,"6":15,"9":1,"31":1,"64":1,"148":1,"179":1,"180":41,"181":1,"182":2,"183":1}}],["simplifyalgs",{"2":{"184":1}}],["simplifyalg",{"2":{"0":1,"6":8,"180":5,"181":2,"182":2,"183":2}}],["similarly",{"2":{"148":1}}],["similar",{"2":{"1":1,"6":3,"18":1,"25":1,"27":1,"29":1,"60":1,"77":1,"82":1,"146":2,"150":1,"153":1,"176":2,"177":1,"186":1}}],["s",{"0":{"30":1},"2":{"0":1,"3":1,"6":11,"7":1,"9":1,"18":1,"19":1,"29":1,"53":1,"55":1,"56":4,"57":1,"58":2,"59":5,"62":3,"63":3,"64":3,"66":1,"68":1,"71":1,"73":2,"76":3,"81":1,"85":1,"88":1,"103":2,"110":3,"111":4,"112":2,"116":9,"122":1,"124":1,"125":1,"130":1,"146":5,"148":2,"153":2,"154":1,"159":2,"160":2,"163":1,"166":4,"167":1,"169":3,"175":4,"176":1,"177":2,"178":1,"180":2,"184":4,"188":6,"191":6,"192":4,"193":4,"194":2,"195":5,"200":2}}],["fn",{"2":{"195":8}}],["f``",{"2":{"158":1}}],["fc",{"2":{"153":4,"154":5,"156":13,"180":3,"189":14}}],["fj",{"2":{"146":2}}],["f2",{"2":{"64":2}}],["f1",{"2":{"64":2}}],["f64",{"2":{"13":2,"14":2}}],["few",{"2":{"162":1}}],["fetched",{"2":{"146":1}}],["fetch",{"2":{"32":2,"153":1,"154":1}}],["feb",{"0":{"8":1},"1":{"9":1,"10":1}}],["featurecollection",{"2":{"6":2,"11":1,"18":1,"146":4,"153":6,"156":1,"192":2}}],["featurecollectiontrait",{"2":{"1":1,"150":1,"151":1,"153":3,"154":2,"156":10,"189":5}}],["features",{"0":{"95":1,"109":1,"126":1,"136":1},"2":{"1":1,"6":2,"11":1,"22":1,"82":1,"146":3,"150":1,"152":1,"153":11,"154":6,"156":2,"192":1}}],["featuretrait",{"2":{"1":2,"95":4,"105":2,"109":4,"126":4,"136":4,"150":2,"151":3,"153":3,"154":3,"156":10,"189":5}}],["feature",{"2":{"1":6,"4":1,"6":4,"18":2,"22":1,"56":1,"66":1,"146":2,"148":1,"150":6,"152":1,"153":22,"154":6,"156":22,"180":2,"189":2,"195":1}}],["fra",{"2":{"199":2}}],["frame",{"2":{"194":1}}],["framework",{"2":{"148":4,"154":2}}],["fracs",{"2":{"64":20,"69":1}}],["frac",{"2":{"59":1,"64":2,"73":17,"180":2}}],["fractional",{"2":{"64":1,"73":3}}],["fractions",{"2":{"64":1,"73":4}}],["fraction",{"2":{"6":4,"73":2,"85":1,"180":1}}],["front",{"2":{"53":1}}],["from",{"2":{"1":3,"3":4,"4":16,"6":26,"7":1,"11":1,"20":1,"22":1,"26":1,"31":1,"56":2,"58":1,"59":4,"60":1,"63":1,"64":6,"66":11,"69":1,"70":1,"71":3,"72":1,"73":11,"75":1,"76":6,"82":1,"85":25,"108":2,"110":5,"111":4,"112":2,"113":1,"114":2,"116":6,"122":2,"145":2,"146":7,"153":1,"156":6,"158":1,"160":1,"169":1,"172":4,"174":1,"180":1,"181":1,"182":3,"183":1,"189":1,"190":1,"192":5,"195":1,"197":1,"198":1,"200":1}}],["footprint",{"2":{"193":1}}],["foldable",{"2":{"153":2,"154":1}}],["follows",{"2":{"64":2,"94":1,"108":1,"125":1,"135":1,"146":1}}],["followed",{"2":{"26":1}}],["following",{"2":{"6":1,"59":1,"68":1,"156":1,"162":1,"168":1,"180":1,"197":1}}],["focusing",{"2":{"25":1,"27":1}}],["foundational",{"2":{"17":1}}],["found",{"2":{"6":7,"26":1,"66":1,"69":1,"70":2,"72":2,"73":1,"75":2,"88":1,"146":5,"151":3,"153":2,"154":1,"156":5,"177":2}}],["forward",{"2":{"73":1}}],["forwards",{"2":{"64":1,"71":1,"76":1}}],["formats",{"2":{"190":1,"193":1,"195":3}}],["format",{"2":{"69":1,"195":3}}],["form",{"2":{"18":1,"64":3,"73":8,"76":3,"153":1}}],["formed",{"2":{"4":2,"6":3,"52":1,"53":4,"59":1,"64":8,"75":1,"76":1,"182":1}}],["formulae",{"2":{"6":1,"177":1}}],["formula",{"2":{"4":1,"6":1,"56":2,"66":1}}],["force",{"2":{"1":1,"153":3,"172":1,"180":1}}],["for",{"0":{"71":1,"73":1,"76":1},"2":{"0":2,"1":3,"3":1,"4":4,"5":3,"6":46,"7":4,"9":2,"13":5,"14":1,"18":1,"20":1,"22":1,"23":5,"25":3,"26":1,"27":3,"29":1,"31":2,"32":1,"33":1,"53":5,"56":8,"57":1,"58":1,"59":19,"60":3,"63":7,"64":35,"66":11,"69":5,"70":2,"71":3,"72":1,"73":7,"75":1,"76":9,"77":2,"80":1,"82":3,"84":2,"85":7,"88":13,"94":3,"100":1,"101":1,"103":1,"105":6,"108":2,"114":1,"115":1,"116":22,"121":1,"122":11,"125":2,"131":1,"132":1,"135":3,"141":1,"142":1,"144":1,"145":5,"146":13,"147":1,"148":3,"150":1,"153":7,"154":1,"156":3,"158":1,"159":1,"160":2,"161":3,"162":2,"164":1,"165":5,"167":3,"168":1,"169":5,"170":1,"172":3,"174":4,"175":7,"176":6,"177":10,"178":4,"180":12,"181":2,"182":2,"183":1,"184":6,"188":5,"189":7,"190":1,"192":4,"193":1,"195":3,"197":2,"199":2,"200":1}}],["fi",{"2":{"146":2}}],["fine",{"2":{"175":1}}],["final",{"2":{"76":1,"165":4,"176":1}}],["finally",{"2":{"58":2,"73":1,"146":1,"153":3,"154":1,"195":1}}],["findmin",{"2":{"184":1}}],["findmax",{"2":{"180":1,"182":1}}],["findall",{"2":{"165":1}}],["finding",{"2":{"73":1}}],["findfirst",{"2":{"64":6,"69":2,"80":1,"180":1}}],["findnext",{"2":{"64":3}}],["findlast",{"2":{"64":2}}],["findprev",{"2":{"64":2}}],["finds",{"2":{"64":1,"66":1}}],["find",{"2":{"53":6,"56":1,"64":12,"66":3,"69":2,"70":4,"72":2,"73":8,"75":1,"85":3,"88":1,"116":7,"146":2,"182":5,"199":1}}],["finish",{"2":{"9":1}}],["fill",{"2":{"64":1,"146":1,"177":3}}],["filled",{"2":{"64":5,"66":3,"84":1,"85":2,"116":16}}],["files",{"2":{"187":1,"195":2}}],["file",{"2":{"26":1,"32":1,"33":1,"64":1,"94":3,"108":3,"125":3,"135":3,"146":1,"147":1,"148":1,"154":1,"155":1,"156":1,"164":1,"172":1,"177":1,"178":1,"187":2,"190":1,"195":2}}],["filters",{"2":{"64":1}}],["filtering",{"2":{"6":1,"180":1}}],["filter",{"2":{"4":1,"6":2,"64":2,"153":2,"154":1,"169":2,"170":1,"180":1}}],["fit",{"2":{"17":1}}],["field",{"2":{"13":2,"64":2}}],["figure",{"2":{"13":1,"14":1,"55":1,"58":2,"81":1,"192":3}}],["fig",{"2":{"13":6,"14":6,"81":5,"191":7,"192":4,"196":2}}],["fix1",{"2":{"153":1,"154":1}}],["fixme",{"2":{"145":1}}],["fix2",{"2":{"32":1,"64":2}}],["fixed",{"2":{"6":3,"70":1,"72":1,"75":1}}],["fix",{"0":{"20":1},"2":{"6":9,"9":3,"15":3,"17":1,"20":1,"70":1,"71":11,"72":1,"73":11,"75":1,"76":10,"81":2,"162":1,"164":1,"165":1,"168":1}}],["firstisright",{"2":{"146":2}}],["firstisleft",{"2":{"146":4}}],["firstisstraight",{"2":{"146":4}}],["firstnode",{"2":{"146":9}}],["first",{"2":{"3":9,"6":10,"53":14,"56":7,"58":1,"59":9,"60":1,"63":1,"64":17,"66":2,"69":1,"70":2,"72":1,"73":5,"75":3,"85":8,"88":4,"90":2,"91":2,"93":1,"94":2,"97":1,"98":1,"99":1,"104":2,"108":3,"116":22,"122":1,"125":2,"127":1,"134":1,"135":2,"138":1,"139":1,"140":2,"145":1,"146":16,"153":3,"154":2,"156":6,"162":1,"177":3,"181":1,"182":2,"189":2,"190":1,"191":1,"192":1,"193":1,"197":1,"198":1}}],["flexijoins",{"2":{"197":2,"198":3,"199":1,"200":5}}],["flexible",{"2":{"153":1,"154":1}}],["flags",{"2":{"64":5}}],["flag",{"2":{"64":12,"69":1}}],["flattened",{"2":{"18":1}}],["flatten",{"0":{"156":1},"2":{"11":3,"13":1,"18":1,"31":2,"50":1,"59":1,"64":2,"66":3,"72":1,"76":1,"82":2,"105":1,"156":33,"169":1}}],["flattening`",{"2":{"158":1}}],["flattening",{"2":{"6":4,"154":1,"158":3,"176":2}}],["flat",{"2":{"6":2,"177":1,"184":2,"189":1}}],["floating",{"2":{"6":1,"64":1,"73":5,"146":2}}],["float",{"2":{"6":3,"70":1,"72":1,"75":1}}],["float64x2",{"2":{"13":6,"14":6,"15":2}}],["float64",{"2":{"1":6,"4":10,"6":30,"13":1,"52":1,"53":3,"56":6,"63":1,"66":4,"69":2,"70":2,"72":1,"73":3,"75":1,"81":1,"85":12,"116":4,"122":2,"145":4,"162":6,"168":26,"175":2,"176":2,"177":1,"181":4,"182":9,"183":2,"184":6,"185":6,"186":1,"189":8,"191":190,"192":7,"193":10}}],["flipping",{"0":{"171":1},"2":{"171":1}}],["flipped",{"2":{"1":2,"150":2,"153":2}}],["flipaxis",{"2":{"58":1}}],["flip",{"2":{"0":1,"6":1,"31":1,"148":2,"153":1,"171":2}}],["fancy",{"2":{"191":1}}],["fancis",{"2":{"6":1,"59":1}}],["fair",{"2":{"175":1}}],["fail",{"2":{"1":1,"6":1,"150":1,"153":2,"154":1,"156":3,"176":1}}],["fallback",{"2":{"153":1}}],["falses",{"2":{"64":2,"69":1,"70":1,"72":1}}],["false",{"0":{"24":1},"2":{"1":29,"3":7,"4":3,"6":51,"31":1,"32":2,"35":1,"36":1,"37":1,"38":1,"50":1,"53":2,"56":1,"58":5,"64":26,"66":5,"69":1,"70":1,"71":3,"73":1,"75":4,"85":2,"87":2,"88":27,"90":2,"94":8,"96":2,"97":4,"98":1,"99":1,"100":1,"101":1,"103":2,"105":11,"108":9,"110":1,"111":4,"114":1,"115":1,"116":39,"122":22,"125":8,"127":3,"128":4,"129":1,"131":1,"132":1,"134":1,"135":7,"137":2,"138":4,"139":1,"140":1,"141":1,"142":1,"145":10,"146":5,"150":4,"153":11,"154":7,"158":1,"160":3,"162":16,"168":44,"169":4,"177":5,"180":1,"184":2,"185":20,"189":2,"191":242,"192":12,"193":18,"197":1}}],["fashion",{"2":{"55":1}}],["faster",{"2":{"59":1,"153":1}}],["fast",{"2":{"12":1}}],["f",{"2":{"1":12,"6":14,"15":1,"18":3,"19":1,"22":2,"52":1,"55":2,"58":4,"60":1,"62":2,"64":19,"65":2,"68":2,"70":2,"71":2,"72":2,"73":2,"75":2,"76":2,"79":2,"80":2,"84":5,"87":2,"90":2,"93":2,"103":2,"107":2,"116":7,"118":2,"121":2,"124":2,"134":2,"146":30,"150":7,"151":2,"153":61,"154":64,"156":52,"173":1,"175":2,"176":1,"179":2,"180":1,"184":6,"185":6,"188":5,"189":16,"191":6,"193":2,"198":3}}],["fulfilled",{"2":{"182":1}}],["fully",{"2":{"6":1,"64":4,"69":1,"122":4}}],["full",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1},"2":{"0":1,"66":5,"165":1,"199":4}}],["furthest",{"2":{"146":1}}],["further",{"2":{"62":1,"153":1}}],["furthermore",{"2":{"3":2,"6":5,"64":1,"70":1,"72":1,"75":1,"94":1,"135":1}}],["fun",{"2":{"191":1}}],["fundamental",{"2":{"26":1,"187":1}}],["func",{"2":{"13":5}}],["funcs",{"2":{"13":2,"14":3}}],["functionality",{"2":{"73":1,"171":1,"172":1,"177":1,"188":1}}],["functionalities",{"2":{"64":1}}],["functionally",{"2":{"1":1,"18":1,"29":1,"150":1,"153":1}}],["function",{"2":{"1":4,"4":1,"6":10,"7":2,"9":1,"13":3,"14":2,"18":2,"29":1,"31":1,"32":2,"53":5,"56":3,"59":13,"63":6,"64":18,"66":7,"68":2,"69":4,"70":3,"71":3,"72":2,"73":7,"74":1,"75":2,"76":4,"82":2,"85":6,"87":1,"88":8,"90":1,"93":1,"94":1,"100":1,"101":1,"103":1,"105":5,"107":1,"108":1,"114":1,"115":1,"116":9,"118":1,"121":1,"122":7,"124":1,"125":1,"131":1,"132":1,"134":1,"135":1,"141":1,"142":1,"145":4,"146":16,"147":3,"148":1,"150":2,"151":2,"153":15,"154":11,"156":5,"160":1,"163":2,"165":7,"166":2,"169":2,"171":2,"172":1,"174":2,"176":2,"177":7,"180":3,"181":2,"182":3,"183":2,"184":7,"185":3,"186":1,"188":6,"189":12,"191":1,"197":4,"200":4}}],["functions",{"0":{"1":1,"71":1,"73":1,"76":1,"150":1,"189":1},"2":{"6":1,"9":3,"17":1,"26":1,"29":1,"33":1,"56":1,"59":1,"63":1,"64":2,"66":1,"68":1,"116":1,"147":1,"148":1,"151":1,"165":2,"166":1}}],["future",{"2":{"23":1,"77":1,"85":1,"174":2}}],["wgs84",{"2":{"192":1}}],["wglmakie",{"2":{"14":1}}],["wₜₒₜ",{"2":{"59":8}}],["wᵢ",{"2":{"59":18}}],["wt",{"2":{"59":3}}],["w",{"2":{"13":13,"14":7,"85":4,"146":1}}],["wrong",{"2":{"167":1,"184":1}}],["writing",{"2":{"195":1}}],["written",{"2":{"88":1}}],["writes",{"2":{"153":1}}],["write",{"2":{"7":1,"30":1,"146":1,"153":1,"195":7}}],["wrap",{"2":{"4":1,"6":1,"32":3,"35":1,"36":1,"37":1,"38":1,"50":1,"170":1,"176":1}}],["wrapped",{"2":{"22":1,"146":2,"151":1,"153":1}}],["wrapper",{"0":{"30":1},"2":{"30":1,"53":1,"56":1,"63":1,"66":1,"85":1,"88":1,"94":1,"108":1,"122":1,"125":1,"135":1}}],["wrappers`",{"2":{"156":1}}],["wrappers",{"2":{"1":10,"6":11,"22":1,"145":2,"146":1,"156":1,"162":8,"163":1,"168":22,"175":1,"176":1,"180":1,"185":10,"189":1,"191":121,"192":5,"193":9}}],["wrappergeometry`",{"2":{"172":1}}],["wrappergeometry",{"2":{"1":1}}],["wrapping",{"2":{"1":1,"6":1,"88":1,"172":1,"186":1}}],["web",{"2":{"195":1}}],["west",{"2":{"66":8}}],["were",{"2":{"64":1,"146":1,"198":1}}],["welcome",{"2":{"25":1,"27":1}}],["well",{"2":{"17":1,"64":1,"66":1,"82":1,"160":1,"174":1,"177":1,"178":1}}],["we",{"0":{"74":2},"2":{"7":1,"11":1,"13":1,"17":3,"19":1,"23":3,"24":1,"25":2,"26":1,"27":2,"32":1,"53":1,"55":2,"56":2,"58":4,"59":8,"60":2,"63":1,"64":7,"66":4,"71":8,"72":2,"73":3,"76":1,"77":1,"81":3,"82":2,"85":1,"87":1,"88":5,"90":1,"91":1,"93":1,"94":1,"104":1,"107":1,"108":1,"116":2,"118":3,"119":1,"121":1,"122":2,"124":1,"125":1,"134":1,"135":1,"146":21,"147":1,"151":1,"153":19,"154":6,"156":3,"158":6,"160":4,"161":1,"173":1,"174":2,"175":2,"176":3,"177":1,"180":5,"184":2,"187":1,"188":1,"190":2,"191":4,"192":6,"193":4,"194":1,"195":3,"197":3,"198":7}}],["weighting",{"2":{"62":2,"63":1}}],["weights",{"2":{"57":4}}],["weight",{"2":{"6":5,"59":14,"63":1}}],["weighted",{"2":{"0":1,"6":2,"57":3,"59":4,"63":4}}],["walk",{"2":{"69":1}}],["wall2",{"2":{"66":7}}],["wall1",{"2":{"66":12}}],["walls",{"2":{"66":3}}],["wall",{"2":{"66":69}}],["wachspress",{"2":{"59":1}}],["wasincreasing",{"2":{"146":10}}],["wasn",{"2":{"64":1}}],["was",{"2":{"31":1,"32":1,"50":1,"53":1,"56":1,"58":1,"59":4,"60":1,"63":1,"64":1,"66":1,"69":1,"70":1,"71":3,"72":1,"73":2,"74":1,"75":1,"76":3,"82":1,"85":1,"88":1,"91":1,"101":1,"104":1,"105":1,"115":1,"116":1,"119":1,"122":1,"132":1,"142":1,"145":1,"146":1,"147":1,"151":1,"153":1,"154":1,"155":1,"156":1,"160":1,"163":1,"166":1,"169":1,"170":1,"171":1,"173":1,"175":1,"177":1,"184":1,"185":1,"186":1,"188":2,"189":1}}],["wanted",{"2":{"200":1}}],["wants",{"2":{"82":1,"154":1}}],["want",{"0":{"23":1,"74":1},"2":{"13":1,"18":1,"23":1,"59":1,"64":1,"145":1,"192":2,"194":1,"199":1,"200":1}}],["ways",{"2":{"167":1}}],["way",{"2":{"6":1,"17":1,"18":1,"24":1,"29":1,"57":1,"148":1,"159":1,"164":1,"177":1,"188":2,"194":1}}],["warn",{"2":{"146":2,"177":1}}],["warned",{"2":{"6":1,"188":1}}],["warning",{"2":{"0":1,"5":1,"6":3,"24":1,"59":1,"82":1,"154":1,"176":1,"187":1,"199":1}}],["wong",{"2":{"79":1,"80":1,"196":1}}],["won",{"2":{"23":1,"64":1,"154":1}}],["wouldn",{"2":{"73":1}}],["would",{"0":{"74":1},"2":{"6":3,"23":1,"70":1,"72":1,"73":1,"75":1,"82":4,"146":1,"153":1,"160":2,"192":1,"199":1,"200":1}}],["wound",{"2":{"6":1,"82":1}}],["world",{"0":{"199":1},"2":{"197":1}}],["worrying",{"2":{"24":1}}],["words",{"2":{"3":1,"6":1,"90":1,"118":1,"124":1,"125":1}}],["workflow",{"2":{"105":1,"122":1}}],["workflows",{"2":{"23":1,"25":1,"27":1}}],["works",{"2":{"26":1,"172":1,"174":1}}],["working",{"2":{"3":1,"6":1,"105":1,"192":1}}],["work",{"2":{"1":3,"6":2,"9":1,"53":1,"56":2,"63":1,"66":2,"69":2,"77":1,"85":1,"88":1,"116":1,"122":1,"145":1,"150":1,"153":1,"154":1,"172":1,"185":1,"199":1}}],["whole",{"2":{"116":1}}],["whose",{"2":{"3":1,"6":1,"105":1}}],["white",{"2":{"58":1}}],["while",{"2":{"53":1,"62":1,"63":1,"64":5,"73":2,"81":2,"84":1,"88":1,"105":1,"116":1,"146":3,"169":1,"182":1,"184":2,"198":1}}],["whichever",{"2":{"6":1,"180":1}}],["which",{"2":{"1":1,"4":2,"5":1,"6":7,"7":1,"11":1,"13":1,"14":1,"17":1,"18":4,"20":1,"23":2,"33":1,"55":1,"56":1,"57":1,"58":2,"59":5,"60":1,"64":11,"66":2,"73":2,"77":1,"82":1,"88":2,"116":3,"146":3,"147":1,"148":1,"153":1,"158":2,"159":1,"161":2,"162":1,"165":1,"167":1,"168":1,"173":1,"174":1,"175":1,"176":3,"177":2,"180":1,"182":2,"185":1,"188":4,"195":3,"197":3,"198":6,"200":1}}],["what",{"0":{"22":1,"25":1,"30":1,"52":1,"55":2,"62":1,"65":1,"68":1,"84":2,"87":1,"90":1,"93":1,"103":1,"107":1,"118":1,"121":1,"124":1,"134":1,"151":1},"2":{"13":1,"14":1,"24":1,"62":1,"145":1,"146":1,"160":1,"175":1,"192":1,"199":1}}],["whatever",{"2":{"1":1,"22":1,"150":1,"153":1}}],["whyatt",{"2":{"178":1}}],["why",{"0":{"22":1,"23":1},"2":{"9":1,"17":1,"30":1,"56":1}}],["wheel",{"2":{"17":1}}],["whether",{"2":{"1":4,"4":1,"6":8,"144":1,"145":1,"150":2,"155":2,"160":1,"161":1}}],["when",{"2":{"1":1,"4":2,"5":1,"6":4,"18":1,"20":1,"23":2,"24":1,"56":1,"59":3,"63":1,"64":2,"71":5,"73":6,"76":7,"116":1,"146":1,"150":1,"151":3,"153":1,"162":1,"165":1,"170":2,"180":1,"192":1,"193":2,"195":1,"200":1}}],["whereas",{"2":{"158":1}}],["wherever",{"2":{"6":1,"186":1}}],["where",{"2":{"1":2,"4":5,"6":10,"20":1,"31":2,"53":8,"56":12,"57":2,"59":24,"63":8,"64":14,"66":8,"69":5,"70":2,"71":5,"72":3,"73":18,"75":2,"76":9,"85":25,"88":1,"116":9,"146":3,"150":1,"153":18,"154":18,"156":17,"158":2,"159":5,"167":1,"172":1,"175":1,"186":1,"187":1,"189":3,"191":4}}],["widely",{"2":{"195":1}}],["widths",{"2":{"14":1}}],["wiki",{"2":{"116":1,"182":1}}],["wikipedia",{"2":{"116":1,"182":2}}],["wind",{"2":{"4":1,"6":2,"56":1,"88":1}}],["winding",{"0":{"81":1},"2":{"4":2,"6":3,"56":3,"64":7,"81":4,"82":1,"88":1,"146":1}}],["without",{"2":{"1":2,"6":1,"17":1,"24":1,"64":1,"107":1,"122":1,"153":1,"154":1,"156":2,"172":1,"185":1}}],["with",{"0":{"71":1,"73":1,"76":1,"181":1,"182":1,"183":1,"193":1,"194":1},"2":{"1":5,"3":5,"4":7,"6":22,"11":1,"20":1,"22":2,"23":1,"52":1,"53":2,"56":7,"57":4,"58":1,"59":2,"63":1,"64":14,"66":6,"71":8,"72":5,"73":15,"75":1,"76":12,"84":1,"85":2,"94":1,"107":1,"111":1,"116":28,"118":1,"121":2,"122":5,"124":1,"125":1,"128":3,"129":2,"130":2,"140":1,"146":7,"148":1,"150":3,"151":1,"153":12,"154":3,"156":4,"158":1,"160":1,"162":1,"167":1,"170":1,"172":1,"174":1,"177":2,"180":2,"182":2,"183":1,"185":1,"188":1,"190":1,"191":4,"192":6,"193":2,"194":2,"195":2,"197":1,"198":1,"199":1}}],["within",{"0":{"44":1,"133":1,"134":1,"137":1,"138":1,"140":1,"141":1,"142":1},"1":{"134":1,"135":1},"2":{"0":2,"3":9,"4":3,"5":1,"6":13,"7":1,"9":1,"31":1,"44":2,"53":2,"56":1,"57":3,"59":1,"63":1,"64":9,"65":2,"66":5,"71":1,"73":2,"75":1,"76":6,"84":1,"85":5,"90":2,"91":3,"93":2,"110":1,"116":9,"121":1,"122":9,"133":1,"134":6,"135":11,"136":6,"137":14,"138":15,"139":15,"140":7,"141":4,"142":4,"148":1,"197":1,"198":4,"199":2}}],["will",{"2":{"1":8,"4":7,"5":1,"6":38,"11":1,"18":3,"23":2,"24":1,"53":4,"56":3,"59":2,"63":1,"64":5,"66":1,"69":1,"70":4,"71":4,"72":4,"73":4,"75":4,"76":4,"82":1,"84":2,"85":4,"88":1,"105":1,"145":1,"146":2,"150":3,"151":1,"152":2,"153":4,"154":3,"156":6,"158":2,"162":1,"166":2,"167":1,"169":2,"172":3,"174":2,"176":3,"180":2,"182":1,"184":1,"185":2,"188":1,"192":1,"195":1,"197":2,"199":1,"200":1}}],["wip",{"2":{"0":1}}]],"serializationVersion":2}';export{e as default}; diff --git a/previews/PR239/assets/chunks/VPLocalSearchBox.B2uKxNr_.js b/previews/PR239/assets/chunks/VPLocalSearchBox.B2uKxNr_.js new file mode 100644 index 000000000..1e698e021 --- /dev/null +++ b/previews/PR239/assets/chunks/VPLocalSearchBox.B2uKxNr_.js @@ -0,0 +1,8 @@ +var Ft=Object.defineProperty;var Ot=(a,e,t)=>e in a?Ft(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var Ae=(a,e,t)=>Ot(a,typeof e!="symbol"?e+"":e,t);import{V as Ct,p as ie,h as me,aj as tt,ak as Rt,al as At,q as $e,am as Mt,d as Lt,D as xe,an as st,ao as Dt,ap as zt,s as Pt,aq as jt,v as Me,P as he,O as _e,ar as Vt,as as $t,W as Bt,R as Wt,$ as Kt,o as H,b as Jt,j as _,a0 as Ut,k as L,at as qt,au as Gt,av as Ht,c as Z,n as nt,e as Se,C as it,F as rt,a as fe,t as pe,aw as Qt,ax as at,ay as Yt,a9 as Zt,af as Xt,az as es,_ as ts}from"./framework.onQNwZ2I.js";import{u as ss,c as ns}from"./theme.CkNAWswv.js";const is={root:()=>Ct(()=>import("./@localSearchIndexroot.rs1EPJPu.js"),[])};/*! +* tabbable 6.2.0 +* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE +*/var mt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Ne=mt.join(","),gt=typeof Element>"u",ae=gt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Fe=!gt&&Element.prototype.getRootNode?function(a){var e;return a==null||(e=a.getRootNode)===null||e===void 0?void 0:e.call(a)}:function(a){return a==null?void 0:a.ownerDocument},Oe=function a(e,t){var s;t===void 0&&(t=!0);var n=e==null||(s=e.getAttribute)===null||s===void 0?void 0:s.call(e,"inert"),r=n===""||n==="true",i=r||t&&e&&a(e.parentNode);return i},rs=function(e){var t,s=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return s===""||s==="true"},bt=function(e,t,s){if(Oe(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Ne));return t&&ae.call(e,Ne)&&n.unshift(e),n=n.filter(s),n},yt=function a(e,t,s){for(var n=[],r=Array.from(e);r.length;){var i=r.shift();if(!Oe(i,!1))if(i.tagName==="SLOT"){var o=i.assignedElements(),l=o.length?o:i.children,c=a(l,!0,s);s.flatten?n.push.apply(n,c):n.push({scopeParent:i,candidates:c})}else{var h=ae.call(i,Ne);h&&s.filter(i)&&(t||!e.includes(i))&&n.push(i);var m=i.shadowRoot||typeof s.getShadowRoot=="function"&&s.getShadowRoot(i),f=!Oe(m,!1)&&(!s.shadowRootFilter||s.shadowRootFilter(i));if(m&&f){var b=a(m===!0?i.children:m.children,!0,s);s.flatten?n.push.apply(n,b):n.push({scopeParent:i,candidates:b})}else r.unshift.apply(r,i.children)}}return n},wt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},re=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||rs(e))&&!wt(e)?0:e.tabIndex},as=function(e,t){var s=re(e);return s<0&&t&&!wt(e)?0:s},os=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},xt=function(e){return e.tagName==="INPUT"},ls=function(e){return xt(e)&&e.type==="hidden"},cs=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(s){return s.tagName==="SUMMARY"});return t},us=function(e,t){for(var s=0;ssummary:first-of-type"),i=r?e.parentElement:e;if(ae.call(i,"details:not([open]) *"))return!0;if(!s||s==="full"||s==="legacy-full"){if(typeof n=="function"){for(var o=e;e;){var l=e.parentElement,c=Fe(e);if(l&&!l.shadowRoot&&n(l)===!0)return ot(e);e.assignedSlot?e=e.assignedSlot:!l&&c!==e.ownerDocument?e=c.host:e=l}e=o}if(ps(e))return!e.getClientRects().length;if(s!=="legacy-full")return!0}else if(s==="non-zero-area")return ot(e);return!1},ms=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var s=0;s=0)},bs=function a(e){var t=[],s=[];return e.forEach(function(n,r){var i=!!n.scopeParent,o=i?n.scopeParent:n,l=as(o,i),c=i?a(n.candidates):o;l===0?i?t.push.apply(t,c):t.push(o):s.push({documentOrder:r,tabIndex:l,item:n,isScope:i,content:c})}),s.sort(os).reduce(function(n,r){return r.isScope?n.push.apply(n,r.content):n.push(r.content),n},[]).concat(t)},ys=function(e,t){t=t||{};var s;return t.getShadowRoot?s=yt([e],t.includeContainer,{filter:Be.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:gs}):s=bt(e,t.includeContainer,Be.bind(null,t)),bs(s)},ws=function(e,t){t=t||{};var s;return t.getShadowRoot?s=yt([e],t.includeContainer,{filter:Ce.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):s=bt(e,t.includeContainer,Ce.bind(null,t)),s},oe=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ae.call(e,Ne)===!1?!1:Be(t,e)},xs=mt.concat("iframe").join(","),Le=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ae.call(e,xs)===!1?!1:Ce(t,e)};/*! +* focus-trap 7.6.2 +* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE +*/function We(a,e){(e==null||e>a.length)&&(e=a.length);for(var t=0,s=Array(e);t0){var s=e[e.length-1];s!==t&&s.pause()}var n=e.indexOf(t);n===-1||e.splice(n,1),e.push(t)},deactivateTrap:function(e,t){var s=e.indexOf(t);s!==-1&&e.splice(s,1),e.length>0&&e[e.length-1].unpause()}},Os=function(e){return e.tagName&&e.tagName.toLowerCase()==="input"&&typeof e.select=="function"},Cs=function(e){return(e==null?void 0:e.key)==="Escape"||(e==null?void 0:e.key)==="Esc"||(e==null?void 0:e.keyCode)===27},ge=function(e){return(e==null?void 0:e.key)==="Tab"||(e==null?void 0:e.keyCode)===9},Rs=function(e){return ge(e)&&!e.shiftKey},As=function(e){return ge(e)&&e.shiftKey},dt=function(e){return setTimeout(e,0)},ve=function(e){for(var t=arguments.length,s=new Array(t>1?t-1:0),n=1;n1&&arguments[1]!==void 0?arguments[1]:{},g=d.hasFallback,T=g===void 0?!1:g,k=d.params,O=k===void 0?[]:k,S=r[u];if(typeof S=="function"&&(S=S.apply(void 0,Is(O))),S===!0&&(S=void 0),!S){if(S===void 0||S===!1)return S;throw new Error("`".concat(u,"` was specified but was not a node, or did not return a node"))}var C=S;if(typeof S=="string"){try{C=s.querySelector(S)}catch(v){throw new Error("`".concat(u,'` appears to be an invalid selector; error="').concat(v.message,'"'))}if(!C&&!T)throw new Error("`".concat(u,"` as selector refers to no known node"))}return C},m=function(){var u=h("initialFocus",{hasFallback:!0});if(u===!1)return!1;if(u===void 0||u&&!Le(u,r.tabbableOptions))if(c(s.activeElement)>=0)u=s.activeElement;else{var d=i.tabbableGroups[0],g=d&&d.firstTabbableNode;u=g||h("fallbackFocus")}else u===null&&(u=h("fallbackFocus"));if(!u)throw new Error("Your focus-trap needs to have at least one focusable element");return u},f=function(){if(i.containerGroups=i.containers.map(function(u){var d=ys(u,r.tabbableOptions),g=ws(u,r.tabbableOptions),T=d.length>0?d[0]:void 0,k=d.length>0?d[d.length-1]:void 0,O=g.find(function(v){return oe(v)}),S=g.slice().reverse().find(function(v){return oe(v)}),C=!!d.find(function(v){return re(v)>0});return{container:u,tabbableNodes:d,focusableNodes:g,posTabIndexesFound:C,firstTabbableNode:T,lastTabbableNode:k,firstDomTabbableNode:O,lastDomTabbableNode:S,nextTabbableNode:function(p){var E=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,F=d.indexOf(p);return F<0?E?g.slice(g.indexOf(p)+1).find(function(z){return oe(z)}):g.slice(0,g.indexOf(p)).reverse().find(function(z){return oe(z)}):d[F+(E?1:-1)]}}}),i.tabbableGroups=i.containerGroups.filter(function(u){return u.tabbableNodes.length>0}),i.tabbableGroups.length<=0&&!h("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(i.containerGroups.find(function(u){return u.posTabIndexesFound})&&i.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},b=function(u){var d=u.activeElement;if(d)return d.shadowRoot&&d.shadowRoot.activeElement!==null?b(d.shadowRoot):d},y=function(u){if(u!==!1&&u!==b(document)){if(!u||!u.focus){y(m());return}u.focus({preventScroll:!!r.preventScroll}),i.mostRecentlyFocusedNode=u,Os(u)&&u.select()}},x=function(u){var d=h("setReturnFocus",{params:[u]});return d||(d===!1?!1:u)},w=function(u){var d=u.target,g=u.event,T=u.isBackward,k=T===void 0?!1:T;d=d||Ee(g),f();var O=null;if(i.tabbableGroups.length>0){var S=c(d,g),C=S>=0?i.containerGroups[S]:void 0;if(S<0)k?O=i.tabbableGroups[i.tabbableGroups.length-1].lastTabbableNode:O=i.tabbableGroups[0].firstTabbableNode;else if(k){var v=i.tabbableGroups.findIndex(function(j){var I=j.firstTabbableNode;return d===I});if(v<0&&(C.container===d||Le(d,r.tabbableOptions)&&!oe(d,r.tabbableOptions)&&!C.nextTabbableNode(d,!1))&&(v=S),v>=0){var p=v===0?i.tabbableGroups.length-1:v-1,E=i.tabbableGroups[p];O=re(d)>=0?E.lastTabbableNode:E.lastDomTabbableNode}else ge(g)||(O=C.nextTabbableNode(d,!1))}else{var F=i.tabbableGroups.findIndex(function(j){var I=j.lastTabbableNode;return d===I});if(F<0&&(C.container===d||Le(d,r.tabbableOptions)&&!oe(d,r.tabbableOptions)&&!C.nextTabbableNode(d))&&(F=S),F>=0){var z=F===i.tabbableGroups.length-1?0:F+1,P=i.tabbableGroups[z];O=re(d)>=0?P.firstTabbableNode:P.firstDomTabbableNode}else ge(g)||(O=C.nextTabbableNode(d))}}else O=h("fallbackFocus");return O},R=function(u){var d=Ee(u);if(!(c(d,u)>=0)){if(ve(r.clickOutsideDeactivates,u)){o.deactivate({returnFocus:r.returnFocusOnDeactivate});return}ve(r.allowOutsideClick,u)||u.preventDefault()}},A=function(u){var d=Ee(u),g=c(d,u)>=0;if(g||d instanceof Document)g&&(i.mostRecentlyFocusedNode=d);else{u.stopImmediatePropagation();var T,k=!0;if(i.mostRecentlyFocusedNode)if(re(i.mostRecentlyFocusedNode)>0){var O=c(i.mostRecentlyFocusedNode),S=i.containerGroups[O].tabbableNodes;if(S.length>0){var C=S.findIndex(function(v){return v===i.mostRecentlyFocusedNode});C>=0&&(r.isKeyForward(i.recentNavEvent)?C+1=0&&(T=S[C-1],k=!1))}}else i.containerGroups.some(function(v){return v.tabbableNodes.some(function(p){return re(p)>0})})||(k=!1);else k=!1;k&&(T=w({target:i.mostRecentlyFocusedNode,isBackward:r.isKeyBackward(i.recentNavEvent)})),y(T||i.mostRecentlyFocusedNode||m())}i.recentNavEvent=void 0},J=function(u){var d=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;i.recentNavEvent=u;var g=w({event:u,isBackward:d});g&&(ge(u)&&u.preventDefault(),y(g))},Q=function(u){(r.isKeyForward(u)||r.isKeyBackward(u))&&J(u,r.isKeyBackward(u))},W=function(u){Cs(u)&&ve(r.escapeDeactivates,u)!==!1&&(u.preventDefault(),o.deactivate())},V=function(u){var d=Ee(u);c(d,u)>=0||ve(r.clickOutsideDeactivates,u)||ve(r.allowOutsideClick,u)||(u.preventDefault(),u.stopImmediatePropagation())},$=function(){if(i.active)return ut.activateTrap(n,o),i.delayInitialFocusTimer=r.delayInitialFocus?dt(function(){y(m())}):y(m()),s.addEventListener("focusin",A,!0),s.addEventListener("mousedown",R,{capture:!0,passive:!1}),s.addEventListener("touchstart",R,{capture:!0,passive:!1}),s.addEventListener("click",V,{capture:!0,passive:!1}),s.addEventListener("keydown",Q,{capture:!0,passive:!1}),s.addEventListener("keydown",W),o},be=function(){if(i.active)return s.removeEventListener("focusin",A,!0),s.removeEventListener("mousedown",R,!0),s.removeEventListener("touchstart",R,!0),s.removeEventListener("click",V,!0),s.removeEventListener("keydown",Q,!0),s.removeEventListener("keydown",W),o},M=function(u){var d=u.some(function(g){var T=Array.from(g.removedNodes);return T.some(function(k){return k===i.mostRecentlyFocusedNode})});d&&y(m())},U=typeof window<"u"&&"MutationObserver"in window?new MutationObserver(M):void 0,q=function(){U&&(U.disconnect(),i.active&&!i.paused&&i.containers.map(function(u){U.observe(u,{subtree:!0,childList:!0})}))};return o={get active(){return i.active},get paused(){return i.paused},activate:function(u){if(i.active)return this;var d=l(u,"onActivate"),g=l(u,"onPostActivate"),T=l(u,"checkCanFocusTrap");T||f(),i.active=!0,i.paused=!1,i.nodeFocusedBeforeActivation=s.activeElement,d==null||d();var k=function(){T&&f(),$(),q(),g==null||g()};return T?(T(i.containers.concat()).then(k,k),this):(k(),this)},deactivate:function(u){if(!i.active)return this;var d=ct({onDeactivate:r.onDeactivate,onPostDeactivate:r.onPostDeactivate,checkCanReturnFocus:r.checkCanReturnFocus},u);clearTimeout(i.delayInitialFocusTimer),i.delayInitialFocusTimer=void 0,be(),i.active=!1,i.paused=!1,q(),ut.deactivateTrap(n,o);var g=l(d,"onDeactivate"),T=l(d,"onPostDeactivate"),k=l(d,"checkCanReturnFocus"),O=l(d,"returnFocus","returnFocusOnDeactivate");g==null||g();var S=function(){dt(function(){O&&y(x(i.nodeFocusedBeforeActivation)),T==null||T()})};return O&&k?(k(x(i.nodeFocusedBeforeActivation)).then(S,S),this):(S(),this)},pause:function(u){if(i.paused||!i.active)return this;var d=l(u,"onPause"),g=l(u,"onPostPause");return i.paused=!0,d==null||d(),be(),q(),g==null||g(),this},unpause:function(u){if(!i.paused||!i.active)return this;var d=l(u,"onUnpause"),g=l(u,"onPostUnpause");return i.paused=!1,d==null||d(),f(),$(),q(),g==null||g(),this},updateContainerElements:function(u){var d=[].concat(u).filter(Boolean);return i.containers=d.map(function(g){return typeof g=="string"?s.querySelector(g):g}),i.active&&f(),q(),this}},o.updateContainerElements(e),o};function Ds(a,e={}){let t;const{immediate:s,...n}=e,r=ie(!1),i=ie(!1),o=f=>t&&t.activate(f),l=f=>t&&t.deactivate(f),c=()=>{t&&(t.pause(),i.value=!0)},h=()=>{t&&(t.unpause(),i.value=!1)},m=me(()=>{const f=tt(a);return(Array.isArray(f)?f:[f]).map(b=>{const y=tt(b);return typeof y=="string"?y:Rt(y)}).filter(At)});return $e(m,f=>{f.length&&(t=Ls(f,{...n,onActivate(){r.value=!0,e.onActivate&&e.onActivate()},onDeactivate(){r.value=!1,e.onDeactivate&&e.onDeactivate()}}),s&&o())},{flush:"post"}),Mt(()=>l()),{hasFocus:r,isPaused:i,activate:o,deactivate:l,pause:c,unpause:h}}class ce{constructor(e,t=!0,s=[],n=5e3){this.ctx=e,this.iframes=t,this.exclude=s,this.iframesTimeout=n}static matches(e,t){const s=typeof t=="string"?[t]:t,n=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(n){let r=!1;return s.every(i=>n.call(e,i)?(r=!0,!1):!0),r}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(s=>{const n=t.filter(r=>r.contains(s)).length>0;t.indexOf(s)===-1&&!n&&t.push(s)}),t}getIframeContents(e,t,s=()=>{}){let n;try{const r=e.contentWindow;if(n=r.document,!r||!n)throw new Error("iframe inaccessible")}catch{s()}n&&t(n)}isIframeBlank(e){const t="about:blank",s=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&s!==t&&s}observeIframeLoad(e,t,s){let n=!1,r=null;const i=()=>{if(!n){n=!0,clearTimeout(r);try{this.isIframeBlank(e)||(e.removeEventListener("load",i),this.getIframeContents(e,t,s))}catch{s()}}};e.addEventListener("load",i),r=setTimeout(i,this.iframesTimeout)}onIframeReady(e,t,s){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,s):this.getIframeContents(e,t,s):this.observeIframeLoad(e,t,s)}catch{s()}}waitForIframes(e,t){let s=0;this.forEachIframe(e,()=>!0,n=>{s++,this.waitForIframes(n.querySelector("html"),()=>{--s||t()})},n=>{n||t()})}forEachIframe(e,t,s,n=()=>{}){let r=e.querySelectorAll("iframe"),i=r.length,o=0;r=Array.prototype.slice.call(r);const l=()=>{--i<=0&&n(o)};i||l(),r.forEach(c=>{ce.matches(c,this.exclude)?l():this.onIframeReady(c,h=>{t(c)&&(o++,s(h)),l()},l)})}createIterator(e,t,s){return document.createNodeIterator(e,t,s,!1)}createInstanceOnIframe(e){return new ce(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,s){const n=e.compareDocumentPosition(s),r=Node.DOCUMENT_POSITION_PRECEDING;if(n&r)if(t!==null){const i=t.compareDocumentPosition(s),o=Node.DOCUMENT_POSITION_FOLLOWING;if(i&o)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let s;return t===null?s=e.nextNode():s=e.nextNode()&&e.nextNode(),{prevNode:t,node:s}}checkIframeFilter(e,t,s,n){let r=!1,i=!1;return n.forEach((o,l)=>{o.val===s&&(r=l,i=o.handled)}),this.compareNodeIframe(e,t,s)?(r===!1&&!i?n.push({val:s,handled:!0}):r!==!1&&!i&&(n[r].handled=!0),!0):(r===!1&&n.push({val:s,handled:!1}),!1)}handleOpenIframes(e,t,s,n){e.forEach(r=>{r.handled||this.getIframeContents(r.val,i=>{this.createInstanceOnIframe(i).forEachNode(t,s,n)})})}iterateThroughNodes(e,t,s,n,r){const i=this.createIterator(t,e,n);let o=[],l=[],c,h,m=()=>({prevNode:h,node:c}=this.getIteratorNode(i),c);for(;m();)this.iframes&&this.forEachIframe(t,f=>this.checkIframeFilter(c,h,f,o),f=>{this.createInstanceOnIframe(f).forEachNode(e,b=>l.push(b),n)}),l.push(c);l.forEach(f=>{s(f)}),this.iframes&&this.handleOpenIframes(o,e,s,n),r()}forEachNode(e,t,s,n=()=>{}){const r=this.getContexts();let i=r.length;i||n(),r.forEach(o=>{const l=()=>{this.iterateThroughNodes(e,o,t,s,()=>{--i<=0&&n()})};this.iframes?this.waitForIframes(o,l):l()})}}let zs=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new ce(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const s=this.opt.log;this.opt.debug&&typeof s=="object"&&typeof s[t]=="function"&&s[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,s=this.opt.caseSensitive?"":"i",n=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let r in t)if(t.hasOwnProperty(r)){const i=t[r],o=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(r):this.escapeStr(r),l=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(i):this.escapeStr(i);o!==""&&l!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(o)}|${this.escapeStr(l)})`,`gm${s}`),n+`(${this.processSynomyms(o)}|${this.processSynomyms(l)})`+n))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,s,n)=>{let r=n.charAt(s+1);return/[(|)\\]/.test(r)||r===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const s=this.opt.ignorePunctuation;return Array.isArray(s)&&s.length&&t.push(this.escapeStr(s.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",s=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let n=[];return e.split("").forEach(r=>{s.every(i=>{if(i.indexOf(r)!==-1){if(n.indexOf(i)>-1)return!1;e=e.replace(new RegExp(`[${i}]`,`gm${t}`),`[${i}]`),n.push(i)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let s=this.opt.accuracy,n=typeof s=="string"?s:s.value,r=typeof s=="string"?[]:s.limiters,i="";switch(r.forEach(o=>{i+=`|${this.escapeStr(o)}`}),n){case"partially":default:return`()(${e})`;case"complementary":return i="\\s"+(i||this.escapeStr(t)),`()([^${i}]*${e}[^${i}]*)`;case"exactly":return`(^|\\s${i})(${e})(?=$|\\s${i})`}}getSeparatedKeywords(e){let t=[];return e.forEach(s=>{this.opt.separateWordSearch?s.split(" ").forEach(n=>{n.trim()&&t.indexOf(n)===-1&&t.push(n)}):s.trim()&&t.indexOf(s)===-1&&t.push(s)}),{keywords:t.sort((s,n)=>n.length-s.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let s=0;return e.sort((n,r)=>n.start-r.start).forEach(n=>{let{start:r,end:i,valid:o}=this.callNoMatchOnInvalidRanges(n,s);o&&(n.start=r,n.length=i-r,t.push(n),s=i)}),t}callNoMatchOnInvalidRanges(e,t){let s,n,r=!1;return e&&typeof e.start<"u"?(s=parseInt(e.start,10),n=s+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&n-t>0&&n-s>0?r=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:s,end:n,valid:r}}checkWhitespaceRanges(e,t,s){let n,r=!0,i=s.length,o=t-i,l=parseInt(e.start,10)-o;return l=l>i?i:l,n=l+parseInt(e.length,10),n>i&&(n=i,this.log(`End range automatically set to the max value of ${i}`)),l<0||n-l<0||l>i||n>i?(r=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):s.substring(l,n).replace(/\s+/g,"")===""&&(r=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:l,end:n,valid:r}}getTextNodes(e){let t="",s=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,n=>{s.push({start:t.length,end:(t+=n.textContent).length,node:n})},n=>this.matchesExclude(n.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:s})})}matchesExclude(e){return ce.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,s){const n=this.opt.element?this.opt.element:"mark",r=e.splitText(t),i=r.splitText(s-t);let o=document.createElement(n);return o.setAttribute("data-markjs","true"),this.opt.className&&o.setAttribute("class",this.opt.className),o.textContent=r.textContent,r.parentNode.replaceChild(o,r),i}wrapRangeInMappedTextNode(e,t,s,n,r){e.nodes.every((i,o)=>{const l=e.nodes[o+1];if(typeof l>"u"||l.start>t){if(!n(i.node))return!1;const c=t-i.start,h=(s>i.end?i.end:s)-i.start,m=e.value.substr(0,i.start),f=e.value.substr(h+i.start);if(i.node=this.wrapRangeInTextNode(i.node,c,h),e.value=m+f,e.nodes.forEach((b,y)=>{y>=o&&(e.nodes[y].start>0&&y!==o&&(e.nodes[y].start-=h),e.nodes[y].end-=h)}),s-=h,r(i.node.previousSibling,i.start),s>i.end)t=i.end;else return!1}return!0})}wrapMatches(e,t,s,n,r){const i=t===0?0:t+1;this.getTextNodes(o=>{o.nodes.forEach(l=>{l=l.node;let c;for(;(c=e.exec(l.textContent))!==null&&c[i]!=="";){if(!s(c[i],l))continue;let h=c.index;if(i!==0)for(let m=1;m{let l;for(;(l=e.exec(o.value))!==null&&l[i]!=="";){let c=l.index;if(i!==0)for(let m=1;ms(l[i],m),(m,f)=>{e.lastIndex=f,n(m)})}r()})}wrapRangeFromIndex(e,t,s,n){this.getTextNodes(r=>{const i=r.value.length;e.forEach((o,l)=>{let{start:c,end:h,valid:m}=this.checkWhitespaceRanges(o,i,r.value);m&&this.wrapRangeInMappedTextNode(r,c,h,f=>t(f,o,r.value.substring(c,h),l),f=>{s(f,o)})}),n()})}unwrapMatches(e){const t=e.parentNode;let s=document.createDocumentFragment();for(;e.firstChild;)s.appendChild(e.removeChild(e.firstChild));t.replaceChild(s,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let s=0,n="wrapMatches";const r=i=>{s++,this.opt.each(i)};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),this[n](e,this.opt.ignoreGroups,(i,o)=>this.opt.filter(o,i,s),r,()=>{s===0&&this.opt.noMatch(e),this.opt.done(s)})}mark(e,t){this.opt=t;let s=0,n="wrapMatches";const{keywords:r,length:i}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),o=this.opt.caseSensitive?"":"i",l=c=>{let h=new RegExp(this.createRegExp(c),`gm${o}`),m=0;this.log(`Searching with expression "${h}"`),this[n](h,1,(f,b)=>this.opt.filter(b,c,s,m),f=>{m++,s++,this.opt.each(f)},()=>{m===0&&this.opt.noMatch(c),r[i-1]===c?this.opt.done(s):l(r[r.indexOf(c)+1])})};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),i===0?this.opt.done(s):l(r[0])}markRanges(e,t){this.opt=t;let s=0,n=this.checkRanges(e);n&&n.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(n)),this.wrapRangeFromIndex(n,(r,i,o,l)=>this.opt.filter(r,i,o,l),(r,i)=>{s++,this.opt.each(r,i)},()=>{this.opt.done(s)})):this.opt.done(s)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,s=>{this.unwrapMatches(s)},s=>{const n=ce.matches(s,t),r=this.matchesExclude(s);return!n||r?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function Ps(a){const e=new zs(a);return this.mark=(t,s)=>(e.mark(t,s),this),this.markRegExp=(t,s)=>(e.markRegExp(t,s),this),this.markRanges=(t,s)=>(e.markRanges(t,s),this),this.unmark=t=>(e.unmark(t),this),this}function ke(a,e,t,s){function n(r){return r instanceof t?r:new t(function(i){i(r)})}return new(t||(t=Promise))(function(r,i){function o(h){try{c(s.next(h))}catch(m){i(m)}}function l(h){try{c(s.throw(h))}catch(m){i(m)}}function c(h){h.done?r(h.value):n(h.value).then(o,l)}c((s=s.apply(a,[])).next())})}const js="ENTRIES",_t="KEYS",St="VALUES",D="";class De{constructor(e,t){const s=e._tree,n=Array.from(s.keys());this.set=e,this._type=t,this._path=n.length>0?[{node:s,keys:n}]:[]}next(){const e=this.dive();return this.backtrack(),e}dive(){if(this._path.length===0)return{done:!0,value:void 0};const{node:e,keys:t}=le(this._path);if(le(t)===D)return{done:!1,value:this.result()};const s=e.get(le(t));return this._path.push({node:s,keys:Array.from(s.keys())}),this.dive()}backtrack(){if(this._path.length===0)return;const e=le(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}key(){return this.set._prefix+this._path.map(({keys:e})=>le(e)).filter(e=>e!==D).join("")}value(){return le(this._path).node.get(D)}result(){switch(this._type){case St:return this.value();case _t:return this.key();default:return[this.key(),this.value()]}}[Symbol.iterator](){return this}}const le=a=>a[a.length-1],Vs=(a,e,t)=>{const s=new Map;if(e===void 0)return s;const n=e.length+1,r=n+t,i=new Uint8Array(r*n).fill(t+1);for(let o=0;o{const l=r*i;e:for(const c of a.keys())if(c===D){const h=n[l-1];h<=t&&s.set(o,[a.get(c),h])}else{let h=r;for(let m=0;mt)continue e}Et(a.get(c),e,t,s,n,h,i,o+c)}};class X{constructor(e=new Map,t=""){this._size=void 0,this._tree=e,this._prefix=t}atPrefix(e){if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");const[t,s]=Re(this._tree,e.slice(this._prefix.length));if(t===void 0){const[n,r]=qe(s);for(const i of n.keys())if(i!==D&&i.startsWith(r)){const o=new Map;return o.set(i.slice(r.length),n.get(i)),new X(o,e)}}return new X(t,e)}clear(){this._size=void 0,this._tree.clear()}delete(e){return this._size=void 0,$s(this._tree,e)}entries(){return new De(this,js)}forEach(e){for(const[t,s]of this)e(t,s,this)}fuzzyGet(e,t){return Vs(this._tree,e,t)}get(e){const t=Ke(this._tree,e);return t!==void 0?t.get(D):void 0}has(e){const t=Ke(this._tree,e);return t!==void 0&&t.has(D)}keys(){return new De(this,_t)}set(e,t){if(typeof e!="string")throw new Error("key must be a string");return this._size=void 0,ze(this._tree,e).set(D,t),this}get size(){if(this._size)return this._size;this._size=0;const e=this.entries();for(;!e.next().done;)this._size+=1;return this._size}update(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const s=ze(this._tree,e);return s.set(D,t(s.get(D))),this}fetch(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const s=ze(this._tree,e);let n=s.get(D);return n===void 0&&s.set(D,n=t()),n}values(){return new De(this,St)}[Symbol.iterator](){return this.entries()}static from(e){const t=new X;for(const[s,n]of e)t.set(s,n);return t}static fromObject(e){return X.from(Object.entries(e))}}const Re=(a,e,t=[])=>{if(e.length===0||a==null)return[a,t];for(const s of a.keys())if(s!==D&&e.startsWith(s))return t.push([a,s]),Re(a.get(s),e.slice(s.length),t);return t.push([a,e]),Re(void 0,"",t)},Ke=(a,e)=>{if(e.length===0||a==null)return a;for(const t of a.keys())if(t!==D&&e.startsWith(t))return Ke(a.get(t),e.slice(t.length))},ze=(a,e)=>{const t=e.length;e:for(let s=0;a&&s{const[t,s]=Re(a,e);if(t!==void 0){if(t.delete(D),t.size===0)Tt(s);else if(t.size===1){const[n,r]=t.entries().next().value;It(s,n,r)}}},Tt=a=>{if(a.length===0)return;const[e,t]=qe(a);if(e.delete(t),e.size===0)Tt(a.slice(0,-1));else if(e.size===1){const[s,n]=e.entries().next().value;s!==D&&It(a.slice(0,-1),s,n)}},It=(a,e,t)=>{if(a.length===0)return;const[s,n]=qe(a);s.set(n+e,t),s.delete(n)},qe=a=>a[a.length-1],Ge="or",kt="and",Bs="and_not";class ue{constructor(e){if((e==null?void 0:e.fields)==null)throw new Error('MiniSearch: option "fields" must be provided');const t=e.autoVacuum==null||e.autoVacuum===!0?Ve:e.autoVacuum;this._options=Object.assign(Object.assign(Object.assign({},je),e),{autoVacuum:t,searchOptions:Object.assign(Object.assign({},ht),e.searchOptions||{}),autoSuggestOptions:Object.assign(Object.assign({},qs),e.autoSuggestOptions||{})}),this._index=new X,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldIds={},this._fieldLength=new Map,this._avgFieldLength=[],this._nextId=0,this._storedFields=new Map,this._dirtCount=0,this._currentVacuum=null,this._enqueuedVacuum=null,this._enqueuedVacuumConditions=Ue,this.addFields(this._options.fields)}add(e){const{extractField:t,tokenize:s,processTerm:n,fields:r,idField:i}=this._options,o=t(e,i);if(o==null)throw new Error(`MiniSearch: document does not have ID field "${i}"`);if(this._idToShortId.has(o))throw new Error(`MiniSearch: duplicate ID ${o}`);const l=this.addDocumentId(o);this.saveStoredFields(l,e);for(const c of r){const h=t(e,c);if(h==null)continue;const m=s(h.toString(),c),f=this._fieldIds[c],b=new Set(m).size;this.addFieldLength(l,f,this._documentCount-1,b);for(const y of m){const x=n(y,c);if(Array.isArray(x))for(const w of x)this.addTerm(f,l,w);else x&&this.addTerm(f,l,x)}}}addAll(e){for(const t of e)this.add(t)}addAllAsync(e,t={}){const{chunkSize:s=10}=t,n={chunk:[],promise:Promise.resolve()},{chunk:r,promise:i}=e.reduce(({chunk:o,promise:l},c,h)=>(o.push(c),(h+1)%s===0?{chunk:[],promise:l.then(()=>new Promise(m=>setTimeout(m,0))).then(()=>this.addAll(o))}:{chunk:o,promise:l}),n);return i.then(()=>this.addAll(r))}remove(e){const{tokenize:t,processTerm:s,extractField:n,fields:r,idField:i}=this._options,o=n(e,i);if(o==null)throw new Error(`MiniSearch: document does not have ID field "${i}"`);const l=this._idToShortId.get(o);if(l==null)throw new Error(`MiniSearch: cannot remove document with ID ${o}: it is not in the index`);for(const c of r){const h=n(e,c);if(h==null)continue;const m=t(h.toString(),c),f=this._fieldIds[c],b=new Set(m).size;this.removeFieldLength(l,f,this._documentCount,b);for(const y of m){const x=s(y,c);if(Array.isArray(x))for(const w of x)this.removeTerm(f,l,w);else x&&this.removeTerm(f,l,x)}}this._storedFields.delete(l),this._documentIds.delete(l),this._idToShortId.delete(o),this._fieldLength.delete(l),this._documentCount-=1}removeAll(e){if(e)for(const t of e)this.remove(t);else{if(arguments.length>0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new X,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}}discard(e){const t=this._idToShortId.get(e);if(t==null)throw new Error(`MiniSearch: cannot discard document with ID ${e}: it is not in the index`);this._idToShortId.delete(e),this._documentIds.delete(t),this._storedFields.delete(t),(this._fieldLength.get(t)||[]).forEach((s,n)=>{this.removeFieldLength(t,n,this._documentCount,s)}),this._fieldLength.delete(t),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()}maybeAutoVacuum(){if(this._options.autoVacuum===!1)return;const{minDirtFactor:e,minDirtCount:t,batchSize:s,batchWait:n}=this._options.autoVacuum;this.conditionalVacuum({batchSize:s,batchWait:n},{minDirtCount:t,minDirtFactor:e})}discardAll(e){const t=this._options.autoVacuum;try{this._options.autoVacuum=!1;for(const s of e)this.discard(s)}finally{this._options.autoVacuum=t}this.maybeAutoVacuum()}replace(e){const{idField:t,extractField:s}=this._options,n=s(e,t);this.discard(n),this.add(e)}vacuum(e={}){return this.conditionalVacuum(e)}conditionalVacuum(e,t){return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(()=>{const s=this._enqueuedVacuumConditions;return this._enqueuedVacuumConditions=Ue,this.performVacuuming(e,s)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)}performVacuuming(e,t){return ke(this,void 0,void 0,function*(){const s=this._dirtCount;if(this.vacuumConditionsMet(t)){const n=e.batchSize||Je.batchSize,r=e.batchWait||Je.batchWait;let i=1;for(const[o,l]of this._index){for(const[c,h]of l)for(const[m]of h)this._documentIds.has(m)||(h.size<=1?l.delete(c):h.delete(m));this._index.get(o).size===0&&this._index.delete(o),i%n===0&&(yield new Promise(c=>setTimeout(c,r))),i+=1}this._dirtCount-=s}yield null,this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null})}vacuumConditionsMet(e){if(e==null)return!0;let{minDirtCount:t,minDirtFactor:s}=e;return t=t||Ve.minDirtCount,s=s||Ve.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=s}get isVacuuming(){return this._currentVacuum!=null}get dirtCount(){return this._dirtCount}get dirtFactor(){return this._dirtCount/(1+this._documentCount+this._dirtCount)}has(e){return this._idToShortId.has(e)}getStoredFields(e){const t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)}search(e,t={}){const{searchOptions:s}=this._options,n=Object.assign(Object.assign({},s),t),r=this.executeQuery(e,t),i=[];for(const[o,{score:l,terms:c,match:h}]of r){const m=c.length||1,f={id:this._documentIds.get(o),score:l*m,terms:Object.keys(h),queryTerms:c,match:h};Object.assign(f,this._storedFields.get(o)),(n.filter==null||n.filter(f))&&i.push(f)}return e===ue.wildcard&&n.boostDocument==null||i.sort(pt),i}autoSuggest(e,t={}){t=Object.assign(Object.assign({},this._options.autoSuggestOptions),t);const s=new Map;for(const{score:r,terms:i}of this.search(e,t)){const o=i.join(" "),l=s.get(o);l!=null?(l.score+=r,l.count+=1):s.set(o,{score:r,terms:i,count:1})}const n=[];for(const[r,{score:i,terms:o,count:l}]of s)n.push({suggestion:r,terms:o,score:i/l});return n.sort(pt),n}get documentCount(){return this._documentCount}get termCount(){return this._index.size}static loadJSON(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)}static loadJSONAsync(e,t){return ke(this,void 0,void 0,function*(){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJSAsync(JSON.parse(e),t)})}static getDefault(e){if(je.hasOwnProperty(e))return Pe(je,e);throw new Error(`MiniSearch: unknown option "${e}"`)}static loadJS(e,t){const{index:s,documentIds:n,fieldLength:r,storedFields:i,serializationVersion:o}=e,l=this.instantiateMiniSearch(e,t);l._documentIds=Te(n),l._fieldLength=Te(r),l._storedFields=Te(i);for(const[c,h]of l._documentIds)l._idToShortId.set(h,c);for(const[c,h]of s){const m=new Map;for(const f of Object.keys(h)){let b=h[f];o===1&&(b=b.ds),m.set(parseInt(f,10),Te(b))}l._index.set(c,m)}return l}static loadJSAsync(e,t){return ke(this,void 0,void 0,function*(){const{index:s,documentIds:n,fieldLength:r,storedFields:i,serializationVersion:o}=e,l=this.instantiateMiniSearch(e,t);l._documentIds=yield Ie(n),l._fieldLength=yield Ie(r),l._storedFields=yield Ie(i);for(const[h,m]of l._documentIds)l._idToShortId.set(m,h);let c=0;for(const[h,m]of s){const f=new Map;for(const b of Object.keys(m)){let y=m[b];o===1&&(y=y.ds),f.set(parseInt(b,10),yield Ie(y))}++c%1e3===0&&(yield Nt(0)),l._index.set(h,f)}return l})}static instantiateMiniSearch(e,t){const{documentCount:s,nextId:n,fieldIds:r,averageFieldLength:i,dirtCount:o,serializationVersion:l}=e;if(l!==1&&l!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");const c=new ue(t);return c._documentCount=s,c._nextId=n,c._idToShortId=new Map,c._fieldIds=r,c._avgFieldLength=i,c._dirtCount=o||0,c._index=new X,c}executeQuery(e,t={}){if(e===ue.wildcard)return this.executeWildcardQuery(t);if(typeof e!="string"){const f=Object.assign(Object.assign(Object.assign({},t),e),{queries:void 0}),b=e.queries.map(y=>this.executeQuery(y,f));return this.combineResults(b,f.combineWith)}const{tokenize:s,processTerm:n,searchOptions:r}=this._options,i=Object.assign(Object.assign({tokenize:s,processTerm:n},r),t),{tokenize:o,processTerm:l}=i,m=o(e).flatMap(f=>l(f)).filter(f=>!!f).map(Us(i)).map(f=>this.executeQuerySpec(f,i));return this.combineResults(m,i.combineWith)}executeQuerySpec(e,t){const s=Object.assign(Object.assign({},this._options.searchOptions),t),n=(s.fields||this._options.fields).reduce((x,w)=>Object.assign(Object.assign({},x),{[w]:Pe(s.boost,w)||1}),{}),{boostDocument:r,weights:i,maxFuzzy:o,bm25:l}=s,{fuzzy:c,prefix:h}=Object.assign(Object.assign({},ht.weights),i),m=this._index.get(e.term),f=this.termResults(e.term,e.term,1,e.termBoost,m,n,r,l);let b,y;if(e.prefix&&(b=this._index.atPrefix(e.term)),e.fuzzy){const x=e.fuzzy===!0?.2:e.fuzzy,w=x<1?Math.min(o,Math.round(e.term.length*x)):x;w&&(y=this._index.fuzzyGet(e.term,w))}if(b)for(const[x,w]of b){const R=x.length-e.term.length;if(!R)continue;y==null||y.delete(x);const A=h*x.length/(x.length+.3*R);this.termResults(e.term,x,A,e.termBoost,w,n,r,l,f)}if(y)for(const x of y.keys()){const[w,R]=y.get(x);if(!R)continue;const A=c*x.length/(x.length+R);this.termResults(e.term,x,A,e.termBoost,w,n,r,l,f)}return f}executeWildcardQuery(e){const t=new Map,s=Object.assign(Object.assign({},this._options.searchOptions),e);for(const[n,r]of this._documentIds){const i=s.boostDocument?s.boostDocument(r,"",this._storedFields.get(n)):1;t.set(n,{score:i,terms:[],match:{}})}return t}combineResults(e,t=Ge){if(e.length===0)return new Map;const s=t.toLowerCase(),n=Ws[s];if(!n)throw new Error(`Invalid combination operator: ${t}`);return e.reduce(n)||new Map}toJSON(){const e=[];for(const[t,s]of this._index){const n={};for(const[r,i]of s)n[r]=Object.fromEntries(i);e.push([t,n])}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:e,serializationVersion:2}}termResults(e,t,s,n,r,i,o,l,c=new Map){if(r==null)return c;for(const h of Object.keys(i)){const m=i[h],f=this._fieldIds[h],b=r.get(f);if(b==null)continue;let y=b.size;const x=this._avgFieldLength[f];for(const w of b.keys()){if(!this._documentIds.has(w)){this.removeTerm(f,w,t),y-=1;continue}const R=o?o(this._documentIds.get(w),t,this._storedFields.get(w)):1;if(!R)continue;const A=b.get(w),J=this._fieldLength.get(w)[f],Q=Js(A,y,this._documentCount,J,x,l),W=s*n*m*R*Q,V=c.get(w);if(V){V.score+=W,Gs(V.terms,e);const $=Pe(V.match,t);$?$.push(h):V.match[t]=[h]}else c.set(w,{score:W,terms:[e],match:{[t]:[h]}})}}return c}addTerm(e,t,s){const n=this._index.fetch(s,vt);let r=n.get(e);if(r==null)r=new Map,r.set(t,1),n.set(e,r);else{const i=r.get(t);r.set(t,(i||0)+1)}}removeTerm(e,t,s){if(!this._index.has(s)){this.warnDocumentChanged(t,e,s);return}const n=this._index.fetch(s,vt),r=n.get(e);r==null||r.get(t)==null?this.warnDocumentChanged(t,e,s):r.get(t)<=1?r.size<=1?n.delete(e):r.delete(t):r.set(t,r.get(t)-1),this._index.get(s).size===0&&this._index.delete(s)}warnDocumentChanged(e,t,s){for(const n of Object.keys(this._fieldIds))if(this._fieldIds[n]===t){this._options.logger("warn",`MiniSearch: document with ID ${this._documentIds.get(e)} has changed before removal: term "${s}" was not present in field "${n}". Removing a document after it has changed can corrupt the index!`,"version_conflict");return}}addDocumentId(e){const t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t}addFields(e){for(let t=0;tObject.prototype.hasOwnProperty.call(a,e)?a[e]:void 0,Ws={[Ge]:(a,e)=>{for(const t of e.keys()){const s=a.get(t);if(s==null)a.set(t,e.get(t));else{const{score:n,terms:r,match:i}=e.get(t);s.score=s.score+n,s.match=Object.assign(s.match,i),ft(s.terms,r)}}return a},[kt]:(a,e)=>{const t=new Map;for(const s of e.keys()){const n=a.get(s);if(n==null)continue;const{score:r,terms:i,match:o}=e.get(s);ft(n.terms,i),t.set(s,{score:n.score+r,terms:n.terms,match:Object.assign(n.match,o)})}return t},[Bs]:(a,e)=>{for(const t of e.keys())a.delete(t);return a}},Ks={k:1.2,b:.7,d:.5},Js=(a,e,t,s,n,r)=>{const{k:i,b:o,d:l}=r;return Math.log(1+(t-e+.5)/(e+.5))*(l+a*(i+1)/(a+i*(1-o+o*s/n)))},Us=a=>(e,t,s)=>{const n=typeof a.fuzzy=="function"?a.fuzzy(e,t,s):a.fuzzy||!1,r=typeof a.prefix=="function"?a.prefix(e,t,s):a.prefix===!0,i=typeof a.boostTerm=="function"?a.boostTerm(e,t,s):1;return{term:e,fuzzy:n,prefix:r,termBoost:i}},je={idField:"id",extractField:(a,e)=>a[e],tokenize:a=>a.split(Hs),processTerm:a=>a.toLowerCase(),fields:void 0,searchOptions:void 0,storeFields:[],logger:(a,e)=>{typeof(console==null?void 0:console[a])=="function"&&console[a](e)},autoVacuum:!0},ht={combineWith:Ge,prefix:!1,fuzzy:!1,maxFuzzy:6,boost:{},weights:{fuzzy:.45,prefix:.375},bm25:Ks},qs={combineWith:kt,prefix:(a,e,t)=>e===t.length-1},Je={batchSize:1e3,batchWait:10},Ue={minDirtFactor:.1,minDirtCount:20},Ve=Object.assign(Object.assign({},Je),Ue),Gs=(a,e)=>{a.includes(e)||a.push(e)},ft=(a,e)=>{for(const t of e)a.includes(t)||a.push(t)},pt=({score:a},{score:e})=>e-a,vt=()=>new Map,Te=a=>{const e=new Map;for(const t of Object.keys(a))e.set(parseInt(t,10),a[t]);return e},Ie=a=>ke(void 0,void 0,void 0,function*(){const e=new Map;let t=0;for(const s of Object.keys(a))e.set(parseInt(s,10),a[s]),++t%1e3===0&&(yield Nt(0));return e}),Nt=a=>new Promise(e=>setTimeout(e,a)),Hs=/[\n\r\p{Z}\p{P}]+/u;class Qs{constructor(e=10){Ae(this,"max");Ae(this,"cache");this.max=e,this.cache=new Map}get(e){let t=this.cache.get(e);return t!==void 0&&(this.cache.delete(e),this.cache.set(e,t)),t}set(e,t){this.cache.has(e)?this.cache.delete(e):this.cache.size===this.max&&this.cache.delete(this.first()),this.cache.set(e,t)}first(){return this.cache.keys().next().value}clear(){this.cache.clear()}}const Ys=["aria-owns"],Zs={class:"shell"},Xs=["title"],en={class:"search-actions before"},tn=["title"],sn=["aria-activedescendant","aria-controls","placeholder"],nn={class:"search-actions"},rn=["title"],an=["disabled","title"],on=["id","role","aria-labelledby"],ln=["id","aria-selected"],cn=["href","aria-label","onMouseenter","onFocusin","data-index"],un={class:"titles"},dn=["innerHTML"],hn={class:"title main"},fn=["innerHTML"],pn={key:0,class:"excerpt-wrapper"},vn={key:0,class:"excerpt",inert:""},mn=["innerHTML"],gn={key:0,class:"no-results"},bn={class:"search-keyboard-shortcuts"},yn=["aria-label"],wn=["aria-label"],xn=["aria-label"],_n=["aria-label"],Sn=Lt({__name:"VPLocalSearchBox",emits:["close"],setup(a,{emit:e}){var S,C;const t=e,s=xe(),n=xe(),r=xe(is),i=ss(),{activate:o}=Ds(s,{immediate:!0,allowOutsideClick:!0,clickOutsideDeactivates:!0,escapeDeactivates:!0}),{localeIndex:l,theme:c}=i,h=st(async()=>{var v,p,E,F,z,P,j,I,K;return at(ue.loadJSON((E=await((p=(v=r.value)[l.value])==null?void 0:p.call(v)))==null?void 0:E.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1},...((F=c.value.search)==null?void 0:F.provider)==="local"&&((P=(z=c.value.search.options)==null?void 0:z.miniSearch)==null?void 0:P.searchOptions)},...((j=c.value.search)==null?void 0:j.provider)==="local"&&((K=(I=c.value.search.options)==null?void 0:I.miniSearch)==null?void 0:K.options)}))}),f=me(()=>{var v,p;return((v=c.value.search)==null?void 0:v.provider)==="local"&&((p=c.value.search.options)==null?void 0:p.disableQueryPersistence)===!0}).value?ie(""):Dt("vitepress:local-search-filter",""),b=zt("vitepress:local-search-detailed-list",((S=c.value.search)==null?void 0:S.provider)==="local"&&((C=c.value.search.options)==null?void 0:C.detailedView)===!0),y=me(()=>{var v,p,E;return((v=c.value.search)==null?void 0:v.provider)==="local"&&(((p=c.value.search.options)==null?void 0:p.disableDetailedView)===!0||((E=c.value.search.options)==null?void 0:E.detailedView)===!1)}),x=me(()=>{var p,E,F,z,P,j,I;const v=((p=c.value.search)==null?void 0:p.options)??c.value.algolia;return((P=(z=(F=(E=v==null?void 0:v.locales)==null?void 0:E[l.value])==null?void 0:F.translations)==null?void 0:z.button)==null?void 0:P.buttonText)||((I=(j=v==null?void 0:v.translations)==null?void 0:j.button)==null?void 0:I.buttonText)||"Search"});Pt(()=>{y.value&&(b.value=!1)});const w=xe([]),R=ie(!1);$e(f,()=>{R.value=!1});const A=st(async()=>{if(n.value)return at(new Ps(n.value))},null),J=new Qs(16);jt(()=>[h.value,f.value,b.value],async([v,p,E],F,z)=>{var ee,ye,He,Qe;(F==null?void 0:F[0])!==v&&J.clear();let P=!1;if(z(()=>{P=!0}),!v)return;w.value=v.search(p).slice(0,16),R.value=!0;const j=E?await Promise.all(w.value.map(B=>Q(B.id))):[];if(P)return;for(const{id:B,mod:te}of j){const se=B.slice(0,B.indexOf("#"));let Y=J.get(se);if(Y)continue;Y=new Map,J.set(se,Y);const G=te.default??te;if(G!=null&&G.render||G!=null&&G.setup){const ne=Yt(G);ne.config.warnHandler=()=>{},ne.provide(Zt,i),Object.defineProperties(ne.config.globalProperties,{$frontmatter:{get(){return i.frontmatter.value}},$params:{get(){return i.page.value.params}}});const Ye=document.createElement("div");ne.mount(Ye),Ye.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(de=>{var et;const we=(et=de.querySelector("a"))==null?void 0:et.getAttribute("href"),Ze=(we==null?void 0:we.startsWith("#"))&&we.slice(1);if(!Ze)return;let Xe="";for(;(de=de.nextElementSibling)&&!/^h[1-6]$/i.test(de.tagName);)Xe+=de.outerHTML;Y.set(Ze,Xe)}),ne.unmount()}if(P)return}const I=new Set;if(w.value=w.value.map(B=>{const[te,se]=B.id.split("#"),Y=J.get(te),G=(Y==null?void 0:Y.get(se))??"";for(const ne in B.match)I.add(ne);return{...B,text:G}}),await he(),P)return;await new Promise(B=>{var te;(te=A.value)==null||te.unmark({done:()=>{var se;(se=A.value)==null||se.markRegExp(k(I),{done:B})}})});const K=((ee=s.value)==null?void 0:ee.querySelectorAll(".result .excerpt"))??[];for(const B of K)(ye=B.querySelector('mark[data-markjs="true"]'))==null||ye.scrollIntoView({block:"center"});(Qe=(He=n.value)==null?void 0:He.firstElementChild)==null||Qe.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function Q(v){const p=Xt(v.slice(0,v.indexOf("#")));try{if(!p)throw new Error(`Cannot find file for id: ${v}`);return{id:v,mod:await import(p)}}catch(E){return console.error(E),{id:v,mod:{}}}}const W=ie(),V=me(()=>{var v;return((v=f.value)==null?void 0:v.length)<=0});function $(v=!0){var p,E;(p=W.value)==null||p.focus(),v&&((E=W.value)==null||E.select())}Me(()=>{$()});function be(v){v.pointerType==="mouse"&&$()}const M=ie(-1),U=ie(!0);$e(w,v=>{M.value=v.length?0:-1,q()});function q(){he(()=>{const v=document.querySelector(".result.selected");v==null||v.scrollIntoView({block:"nearest"})})}_e("ArrowUp",v=>{v.preventDefault(),M.value--,M.value<0&&(M.value=w.value.length-1),U.value=!0,q()}),_e("ArrowDown",v=>{v.preventDefault(),M.value++,M.value>=w.value.length&&(M.value=0),U.value=!0,q()});const N=Vt();_e("Enter",v=>{if(v.isComposing||v.target instanceof HTMLButtonElement&&v.target.type!=="submit")return;const p=w.value[M.value];if(v.target instanceof HTMLInputElement&&!p){v.preventDefault();return}p&&(N.go(p.id),t("close"))}),_e("Escape",()=>{t("close")});const d=ns({modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}});Me(()=>{window.history.pushState(null,"",null)}),$t("popstate",v=>{v.preventDefault(),t("close")});const g=Bt(Wt?document.body:null);Me(()=>{he(()=>{g.value=!0,he().then(()=>o())})}),Kt(()=>{g.value=!1});function T(){f.value="",he().then(()=>$(!1))}function k(v){return new RegExp([...v].sort((p,E)=>E.length-p.length).map(p=>`(${es(p)})`).join("|"),"gi")}function O(v){var F;if(!U.value)return;const p=(F=v.target)==null?void 0:F.closest(".result"),E=Number.parseInt(p==null?void 0:p.dataset.index);E>=0&&E!==M.value&&(M.value=E),U.value=!1}return(v,p)=>{var E,F,z,P,j;return H(),Jt(Qt,{to:"body"},[_("div",{ref_key:"el",ref:s,role:"button","aria-owns":(E=w.value)!=null&&E.length?"localsearch-list":void 0,"aria-expanded":"true","aria-haspopup":"listbox","aria-labelledby":"localsearch-label",class:"VPLocalSearchBox"},[_("div",{class:"backdrop",onClick:p[0]||(p[0]=I=>v.$emit("close"))}),_("div",Zs,[_("form",{class:"search-bar",onPointerup:p[4]||(p[4]=I=>be(I)),onSubmit:p[5]||(p[5]=Ut(()=>{},["prevent"]))},[_("label",{title:x.value,id:"localsearch-label",for:"localsearch-input"},p[7]||(p[7]=[_("span",{"aria-hidden":"true",class:"vpi-search search-icon local-search-icon"},null,-1)]),8,Xs),_("div",en,[_("button",{class:"back-button",title:L(d)("modal.backButtonTitle"),onClick:p[1]||(p[1]=I=>v.$emit("close"))},p[8]||(p[8]=[_("span",{class:"vpi-arrow-left local-search-icon"},null,-1)]),8,tn)]),qt(_("input",{ref_key:"searchInput",ref:W,"onUpdate:modelValue":p[2]||(p[2]=I=>Ht(f)?f.value=I:null),"aria-activedescendant":M.value>-1?"localsearch-item-"+M.value:void 0,"aria-autocomplete":"both","aria-controls":(F=w.value)!=null&&F.length?"localsearch-list":void 0,"aria-labelledby":"localsearch-label",autocapitalize:"off",autocomplete:"off",autocorrect:"off",class:"search-input",id:"localsearch-input",enterkeyhint:"go",maxlength:"64",placeholder:x.value,spellcheck:"false",type:"search"},null,8,sn),[[Gt,L(f)]]),_("div",nn,[y.value?Se("",!0):(H(),Z("button",{key:0,class:nt(["toggle-layout-button",{"detailed-list":L(b)}]),type:"button",title:L(d)("modal.displayDetails"),onClick:p[3]||(p[3]=I=>M.value>-1&&(b.value=!L(b)))},p[9]||(p[9]=[_("span",{class:"vpi-layout-list local-search-icon"},null,-1)]),10,rn)),_("button",{class:"clear-button",type:"reset",disabled:V.value,title:L(d)("modal.resetButtonTitle"),onClick:T},p[10]||(p[10]=[_("span",{class:"vpi-delete local-search-icon"},null,-1)]),8,an)])],32),_("ul",{ref_key:"resultsEl",ref:n,id:(z=w.value)!=null&&z.length?"localsearch-list":void 0,role:(P=w.value)!=null&&P.length?"listbox":void 0,"aria-labelledby":(j=w.value)!=null&&j.length?"localsearch-label":void 0,class:"results",onMousemove:O},[(H(!0),Z(rt,null,it(w.value,(I,K)=>(H(),Z("li",{key:I.id,id:"localsearch-item-"+K,"aria-selected":M.value===K?"true":"false",role:"option"},[_("a",{href:I.id,class:nt(["result",{selected:M.value===K}]),"aria-label":[...I.titles,I.title].join(" > "),onMouseenter:ee=>!U.value&&(M.value=K),onFocusin:ee=>M.value=K,onClick:p[6]||(p[6]=ee=>v.$emit("close")),"data-index":K},[_("div",null,[_("div",un,[p[12]||(p[12]=_("span",{class:"title-icon"},"#",-1)),(H(!0),Z(rt,null,it(I.titles,(ee,ye)=>(H(),Z("span",{key:ye,class:"title"},[_("span",{class:"text",innerHTML:ee},null,8,dn),p[11]||(p[11]=_("span",{class:"vpi-chevron-right local-search-icon"},null,-1))]))),128)),_("span",hn,[_("span",{class:"text",innerHTML:I.title},null,8,fn)])]),L(b)?(H(),Z("div",pn,[I.text?(H(),Z("div",vn,[_("div",{class:"vp-doc",innerHTML:I.text},null,8,mn)])):Se("",!0),p[13]||(p[13]=_("div",{class:"excerpt-gradient-bottom"},null,-1)),p[14]||(p[14]=_("div",{class:"excerpt-gradient-top"},null,-1))])):Se("",!0)])],42,cn)],8,ln))),128)),L(f)&&!w.value.length&&R.value?(H(),Z("li",gn,[fe(pe(L(d)("modal.noResultsText"))+' "',1),_("strong",null,pe(L(f)),1),p[15]||(p[15]=fe('" '))])):Se("",!0)],40,on),_("div",bn,[_("span",null,[_("kbd",{"aria-label":L(d)("modal.footer.navigateUpKeyAriaLabel")},p[16]||(p[16]=[_("span",{class:"vpi-arrow-up navigate-icon"},null,-1)]),8,yn),_("kbd",{"aria-label":L(d)("modal.footer.navigateDownKeyAriaLabel")},p[17]||(p[17]=[_("span",{class:"vpi-arrow-down navigate-icon"},null,-1)]),8,wn),fe(" "+pe(L(d)("modal.footer.navigateText")),1)]),_("span",null,[_("kbd",{"aria-label":L(d)("modal.footer.selectKeyAriaLabel")},p[18]||(p[18]=[_("span",{class:"vpi-corner-down-left navigate-icon"},null,-1)]),8,xn),fe(" "+pe(L(d)("modal.footer.selectText")),1)]),_("span",null,[_("kbd",{"aria-label":L(d)("modal.footer.closeKeyAriaLabel")},"esc",8,_n),fe(" "+pe(L(d)("modal.footer.closeText")),1)])])])],8,Ys)])}}}),Fn=ts(Sn,[["__scopeId","data-v-42e65fb9"]]);export{Fn as default}; diff --git a/previews/PR239/assets/chunks/framework.onQNwZ2I.js b/previews/PR239/assets/chunks/framework.onQNwZ2I.js new file mode 100644 index 000000000..d11bd04b5 --- /dev/null +++ b/previews/PR239/assets/chunks/framework.onQNwZ2I.js @@ -0,0 +1,18 @@ +/** +* @vue/shared v3.5.13 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**//*! #__NO_SIDE_EFFECTS__ */function Ns(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const Z={},Et=[],ke=()=>{},Ko=()=>!1,en=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Fs=e=>e.startsWith("onUpdate:"),ae=Object.assign,Hs=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},qo=Object.prototype.hasOwnProperty,z=(e,t)=>qo.call(e,t),W=Array.isArray,Tt=e=>In(e)==="[object Map]",ii=e=>In(e)==="[object Set]",q=e=>typeof e=="function",re=e=>typeof e=="string",Xe=e=>typeof e=="symbol",ne=e=>e!==null&&typeof e=="object",oi=e=>(ne(e)||q(e))&&q(e.then)&&q(e.catch),li=Object.prototype.toString,In=e=>li.call(e),Go=e=>In(e).slice(8,-1),ci=e=>In(e)==="[object Object]",$s=e=>re(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Ct=Ns(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Nn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Yo=/-(\w)/g,Le=Nn(e=>e.replace(Yo,(t,n)=>n?n.toUpperCase():"")),Xo=/\B([A-Z])/g,st=Nn(e=>e.replace(Xo,"-$1").toLowerCase()),Fn=Nn(e=>e.charAt(0).toUpperCase()+e.slice(1)),_n=Nn(e=>e?`on${Fn(e)}`:""),tt=(e,t)=>!Object.is(e,t),bn=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},vs=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Jo=e=>{const t=re(e)?Number(e):NaN;return isNaN(t)?e:t};let ar;const Hn=()=>ar||(ar=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Ds(e){if(W(e)){const t={};for(let n=0;n{if(n){const s=n.split(Qo);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function js(e){let t="";if(re(e))t=e;else if(W(e))for(let n=0;n!!(e&&e.__v_isRef===!0),sl=e=>re(e)?e:e==null?"":W(e)||ne(e)&&(e.toString===li||!q(e.toString))?ui(e)?sl(e.value):JSON.stringify(e,di,2):String(e),di=(e,t)=>ui(t)?di(e,t.value):Tt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[zn(s,i)+" =>"]=r,n),{})}:ii(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>zn(n))}:Xe(t)?zn(t):ne(t)&&!W(t)&&!ci(t)?String(t):t,zn=(e,t="")=>{var n;return Xe(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.5.13 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let we;class rl{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=we,!t&&we&&(this.index=(we.scopes||(we.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0)return;if(jt){let t=jt;for(jt=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Dt;){let t=Dt;for(Dt=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function yi(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function vi(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),ks(s),ol(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function _s(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(_i(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function _i(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Kt))return;e.globalVersion=Kt;const t=e.dep;if(e.flags|=2,t.version>0&&!e.isSSR&&e.deps&&!_s(e)){e.flags&=-3;return}const n=te,s=Ne;te=e,Ne=!0;try{yi(e);const r=e.fn(e._value);(t.version===0||tt(r,e._value))&&(e._value=r,t.version++)}catch(r){throw t.version++,r}finally{te=n,Ne=s,vi(e),e.flags&=-3}}function ks(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)ks(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function ol(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let Ne=!0;const bi=[];function rt(){bi.push(Ne),Ne=!1}function it(){const e=bi.pop();Ne=e===void 0?!0:e}function fr(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=te;te=void 0;try{t()}finally{te=n}}}let Kt=0;class ll{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class $n{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0}track(t){if(!te||!Ne||te===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==te)n=this.activeLink=new ll(te,this),te.deps?(n.prevDep=te.depsTail,te.depsTail.nextDep=n,te.depsTail=n):te.deps=te.depsTail=n,wi(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=te.depsTail,n.nextDep=void 0,te.depsTail.nextDep=n,te.depsTail=n,te.deps===n&&(te.deps=s)}return n}trigger(t){this.version++,Kt++,this.notify(t)}notify(t){Vs();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Us()}}}function wi(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)wi(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const Cn=new WeakMap,dt=Symbol(""),bs=Symbol(""),qt=Symbol("");function me(e,t,n){if(Ne&&te){let s=Cn.get(e);s||Cn.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new $n),r.map=s,r.key=n),r.track()}}function Ge(e,t,n,s,r,i){const o=Cn.get(e);if(!o){Kt++;return}const l=c=>{c&&c.trigger()};if(Vs(),t==="clear")o.forEach(l);else{const c=W(e),f=c&&$s(n);if(c&&n==="length"){const a=Number(s);o.forEach((h,y)=>{(y==="length"||y===qt||!Xe(y)&&y>=a)&&l(h)})}else switch((n!==void 0||o.has(void 0))&&l(o.get(n)),f&&l(o.get(qt)),t){case"add":c?f&&l(o.get("length")):(l(o.get(dt)),Tt(e)&&l(o.get(bs)));break;case"delete":c||(l(o.get(dt)),Tt(e)&&l(o.get(bs)));break;case"set":Tt(e)&&l(o.get(dt));break}}Us()}function cl(e,t){const n=Cn.get(e);return n&&n.get(t)}function _t(e){const t=J(e);return t===e?t:(me(t,"iterate",qt),Pe(e)?t:t.map(ye))}function Dn(e){return me(e=J(e),"iterate",qt),e}const al={__proto__:null,[Symbol.iterator](){return Zn(this,Symbol.iterator,ye)},concat(...e){return _t(this).concat(...e.map(t=>W(t)?_t(t):t))},entries(){return Zn(this,"entries",e=>(e[1]=ye(e[1]),e))},every(e,t){return We(this,"every",e,t,void 0,arguments)},filter(e,t){return We(this,"filter",e,t,n=>n.map(ye),arguments)},find(e,t){return We(this,"find",e,t,ye,arguments)},findIndex(e,t){return We(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return We(this,"findLast",e,t,ye,arguments)},findLastIndex(e,t){return We(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return We(this,"forEach",e,t,void 0,arguments)},includes(...e){return es(this,"includes",e)},indexOf(...e){return es(this,"indexOf",e)},join(e){return _t(this).join(e)},lastIndexOf(...e){return es(this,"lastIndexOf",e)},map(e,t){return We(this,"map",e,t,void 0,arguments)},pop(){return Ft(this,"pop")},push(...e){return Ft(this,"push",e)},reduce(e,...t){return ur(this,"reduce",e,t)},reduceRight(e,...t){return ur(this,"reduceRight",e,t)},shift(){return Ft(this,"shift")},some(e,t){return We(this,"some",e,t,void 0,arguments)},splice(...e){return Ft(this,"splice",e)},toReversed(){return _t(this).toReversed()},toSorted(e){return _t(this).toSorted(e)},toSpliced(...e){return _t(this).toSpliced(...e)},unshift(...e){return Ft(this,"unshift",e)},values(){return Zn(this,"values",ye)}};function Zn(e,t,n){const s=Dn(e),r=s[t]();return s!==e&&!Pe(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.value&&(i.value=n(i.value)),i}),r}const fl=Array.prototype;function We(e,t,n,s,r,i){const o=Dn(e),l=o!==e&&!Pe(e),c=o[t];if(c!==fl[t]){const h=c.apply(e,i);return l?ye(h):h}let f=n;o!==e&&(l?f=function(h,y){return n.call(this,ye(h),y,e)}:n.length>2&&(f=function(h,y){return n.call(this,h,y,e)}));const a=c.call(o,f,s);return l&&r?r(a):a}function ur(e,t,n,s){const r=Dn(e);let i=n;return r!==e&&(Pe(e)?n.length>3&&(i=function(o,l,c){return n.call(this,o,l,c,e)}):i=function(o,l,c){return n.call(this,o,ye(l),c,e)}),r[t](i,...s)}function es(e,t,n){const s=J(e);me(s,"iterate",qt);const r=s[t](...n);return(r===-1||r===!1)&&Ks(n[0])?(n[0]=J(n[0]),s[t](...n)):r}function Ft(e,t,n=[]){rt(),Vs();const s=J(e)[t].apply(e,n);return Us(),it(),s}const ul=Ns("__proto__,__v_isRef,__isVue"),Si=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Xe));function dl(e){Xe(e)||(e=String(e));const t=J(this);return me(t,"has",e),t.hasOwnProperty(e)}class xi{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?Sl:Ai:i?Ci:Ti).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=W(t);if(!r){let c;if(o&&(c=al[n]))return c;if(n==="hasOwnProperty")return dl}const l=Reflect.get(t,n,fe(t)?t:s);return(Xe(n)?Si.has(n):ul(n))||(r||me(t,"get",n),i)?l:fe(l)?o&&$s(n)?l:l.value:ne(l)?r?Vn(l):jn(l):l}}class Ei extends xi{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];if(!this._isShallow){const c=yt(i);if(!Pe(s)&&!yt(s)&&(i=J(i),s=J(s)),!W(t)&&fe(i)&&!fe(s))return c?!1:(i.value=s,!0)}const o=W(t)&&$s(n)?Number(n)e,cn=e=>Reflect.getPrototypeOf(e);function yl(e,t,n){return function(...s){const r=this.__v_raw,i=J(r),o=Tt(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,f=r[e](...s),a=n?ws:t?Ss:ye;return!t&&me(i,"iterate",c?bs:dt),{next(){const{value:h,done:y}=f.next();return y?{value:h,done:y}:{value:l?[a(h[0]),a(h[1])]:a(h),done:y}},[Symbol.iterator](){return this}}}}function an(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function vl(e,t){const n={get(r){const i=this.__v_raw,o=J(i),l=J(r);e||(tt(r,l)&&me(o,"get",r),me(o,"get",l));const{has:c}=cn(o),f=t?ws:e?Ss:ye;if(c.call(o,r))return f(i.get(r));if(c.call(o,l))return f(i.get(l));i!==o&&i.get(r)},get size(){const r=this.__v_raw;return!e&&me(J(r),"iterate",dt),Reflect.get(r,"size",r)},has(r){const i=this.__v_raw,o=J(i),l=J(r);return e||(tt(r,l)&&me(o,"has",r),me(o,"has",l)),r===l?i.has(r):i.has(r)||i.has(l)},forEach(r,i){const o=this,l=o.__v_raw,c=J(l),f=t?ws:e?Ss:ye;return!e&&me(c,"iterate",dt),l.forEach((a,h)=>r.call(i,f(a),f(h),o))}};return ae(n,e?{add:an("add"),set:an("set"),delete:an("delete"),clear:an("clear")}:{add(r){!t&&!Pe(r)&&!yt(r)&&(r=J(r));const i=J(this);return cn(i).has.call(i,r)||(i.add(r),Ge(i,"add",r,r)),this},set(r,i){!t&&!Pe(i)&&!yt(i)&&(i=J(i));const o=J(this),{has:l,get:c}=cn(o);let f=l.call(o,r);f||(r=J(r),f=l.call(o,r));const a=c.call(o,r);return o.set(r,i),f?tt(i,a)&&Ge(o,"set",r,i):Ge(o,"add",r,i),this},delete(r){const i=J(this),{has:o,get:l}=cn(i);let c=o.call(i,r);c||(r=J(r),c=o.call(i,r)),l&&l.call(i,r);const f=i.delete(r);return c&&Ge(i,"delete",r,void 0),f},clear(){const r=J(this),i=r.size!==0,o=r.clear();return i&&Ge(r,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=yl(r,e,t)}),n}function Bs(e,t){const n=vl(e,t);return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(z(n,r)&&r in s?n:s,r,i)}const _l={get:Bs(!1,!1)},bl={get:Bs(!1,!0)},wl={get:Bs(!0,!1)};const Ti=new WeakMap,Ci=new WeakMap,Ai=new WeakMap,Sl=new WeakMap;function xl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function El(e){return e.__v_skip||!Object.isExtensible(e)?0:xl(Go(e))}function jn(e){return yt(e)?e:Ws(e,!1,pl,_l,Ti)}function Tl(e){return Ws(e,!1,ml,bl,Ci)}function Vn(e){return Ws(e,!0,gl,wl,Ai)}function Ws(e,t,n,s,r){if(!ne(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=r.get(e);if(i)return i;const o=El(e);if(o===0)return e;const l=new Proxy(e,o===2?s:n);return r.set(e,l),l}function ht(e){return yt(e)?ht(e.__v_raw):!!(e&&e.__v_isReactive)}function yt(e){return!!(e&&e.__v_isReadonly)}function Pe(e){return!!(e&&e.__v_isShallow)}function Ks(e){return e?!!e.__v_raw:!1}function J(e){const t=e&&e.__v_raw;return t?J(t):e}function wn(e){return!z(e,"__v_skip")&&Object.isExtensible(e)&&ai(e,"__v_skip",!0),e}const ye=e=>ne(e)?jn(e):e,Ss=e=>ne(e)?Vn(e):e;function fe(e){return e?e.__v_isRef===!0:!1}function oe(e){return Ri(e,!1)}function qs(e){return Ri(e,!0)}function Ri(e,t){return fe(e)?e:new Cl(e,t)}class Cl{constructor(t,n){this.dep=new $n,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:J(t),this._value=n?t:ye(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||Pe(t)||yt(t);t=s?t:J(t),tt(t,n)&&(this._rawValue=t,this._value=s?t:ye(t),this.dep.trigger())}}function Oi(e){return fe(e)?e.value:e}const Al={get:(e,t,n)=>t==="__v_raw"?e:Oi(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return fe(r)&&!fe(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Mi(e){return ht(e)?e:new Proxy(e,Al)}class Rl{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new $n,{get:s,set:r}=t(n.track.bind(n),n.trigger.bind(n));this._get=s,this._set=r}get value(){return this._value=this._get()}set value(t){this._set(t)}}function Ol(e){return new Rl(e)}class Ml{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0,this._value=void 0}get value(){const t=this._object[this._key];return this._value=t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return cl(J(this._object),this._key)}}class Pl{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function Ll(e,t,n){return fe(e)?e:q(e)?new Pl(e):ne(e)&&arguments.length>1?Il(e,t,n):oe(e)}function Il(e,t,n){const s=e[t];return fe(s)?s:new Ml(e,t,n)}class Nl{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new $n(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Kt-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&te!==this)return mi(this,!0),!0}get value(){const t=this.dep.track();return _i(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Fl(e,t,n=!1){let s,r;return q(e)?s=e:(s=e.get,r=e.set),new Nl(s,r,n)}const fn={},An=new WeakMap;let ft;function Hl(e,t=!1,n=ft){if(n){let s=An.get(n);s||An.set(n,s=[]),s.push(e)}}function $l(e,t,n=Z){const{immediate:s,deep:r,once:i,scheduler:o,augmentJob:l,call:c}=n,f=g=>r?g:Pe(g)||r===!1||r===0?Ye(g,1):Ye(g);let a,h,y,v,S=!1,_=!1;if(fe(e)?(h=()=>e.value,S=Pe(e)):ht(e)?(h=()=>f(e),S=!0):W(e)?(_=!0,S=e.some(g=>ht(g)||Pe(g)),h=()=>e.map(g=>{if(fe(g))return g.value;if(ht(g))return f(g);if(q(g))return c?c(g,2):g()})):q(e)?t?h=c?()=>c(e,2):e:h=()=>{if(y){rt();try{y()}finally{it()}}const g=ft;ft=a;try{return c?c(e,3,[v]):e(v)}finally{ft=g}}:h=ke,t&&r){const g=h,O=r===!0?1/0:r;h=()=>Ye(g(),O)}const K=hi(),N=()=>{a.stop(),K&&K.active&&Hs(K.effects,a)};if(i&&t){const g=t;t=(...O)=>{g(...O),N()}}let j=_?new Array(e.length).fill(fn):fn;const p=g=>{if(!(!(a.flags&1)||!a.dirty&&!g))if(t){const O=a.run();if(r||S||(_?O.some((F,$)=>tt(F,j[$])):tt(O,j))){y&&y();const F=ft;ft=a;try{const $=[O,j===fn?void 0:_&&j[0]===fn?[]:j,v];c?c(t,3,$):t(...$),j=O}finally{ft=F}}}else a.run()};return l&&l(p),a=new pi(h),a.scheduler=o?()=>o(p,!1):p,v=g=>Hl(g,!1,a),y=a.onStop=()=>{const g=An.get(a);if(g){if(c)c(g,4);else for(const O of g)O();An.delete(a)}},t?s?p(!0):j=a.run():o?o(p.bind(null,!0),!0):a.run(),N.pause=a.pause.bind(a),N.resume=a.resume.bind(a),N.stop=N,N}function Ye(e,t=1/0,n){if(t<=0||!ne(e)||e.__v_skip||(n=n||new Set,n.has(e)))return e;if(n.add(e),t--,fe(e))Ye(e.value,t,n);else if(W(e))for(let s=0;s{Ye(s,t,n)});else if(ci(e)){for(const s in e)Ye(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&Ye(e[s],t,n)}return e}/** +* @vue/runtime-core v3.5.13 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function tn(e,t,n,s){try{return s?e(...s):e()}catch(r){nn(r,t,n)}}function He(e,t,n,s){if(q(e)){const r=tn(e,t,n,s);return r&&oi(r)&&r.catch(i=>{nn(i,t,n)}),r}if(W(e)){const r=[];for(let i=0;i>>1,r=Se[s],i=Gt(r);i=Gt(n)?Se.push(e):Se.splice(jl(t),0,e),e.flags|=1,Li()}}function Li(){Rn||(Rn=Pi.then(Ii))}function Vl(e){W(e)?At.push(...e):Qe&&e.id===-1?Qe.splice(wt+1,0,e):e.flags&1||(At.push(e),e.flags|=1),Li()}function dr(e,t,n=Ve+1){for(;nGt(n)-Gt(s));if(At.length=0,Qe){Qe.push(...t);return}for(Qe=t,wt=0;wte.id==null?e.flags&2?-1:1/0:e.id;function Ii(e){try{for(Ve=0;Ve{s._d&&Ar(-1);const i=Mn(t);let o;try{o=e(...r)}finally{Mn(i),s._d&&Ar(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function _f(e,t){if(de===null)return e;const n=Gn(de),s=e.dirs||(e.dirs=[]);for(let r=0;re.__isTeleport,Vt=e=>e&&(e.disabled||e.disabled===""),hr=e=>e&&(e.defer||e.defer===""),pr=e=>typeof SVGElement<"u"&&e instanceof SVGElement,gr=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,xs=(e,t)=>{const n=e&&e.to;return re(n)?t?t(n):null:n},$i={name:"Teleport",__isTeleport:!0,process(e,t,n,s,r,i,o,l,c,f){const{mc:a,pc:h,pbc:y,o:{insert:v,querySelector:S,createText:_,createComment:K}}=f,N=Vt(t.props);let{shapeFlag:j,children:p,dynamicChildren:g}=t;if(e==null){const O=t.el=_(""),F=t.anchor=_("");v(O,n,s),v(F,n,s);const $=(R,b)=>{j&16&&(r&&r.isCE&&(r.ce._teleportTarget=R),a(p,R,b,r,i,o,l,c))},V=()=>{const R=t.target=xs(t.props,S),b=Di(R,t,_,v);R&&(o!=="svg"&&pr(R)?o="svg":o!=="mathml"&&gr(R)&&(o="mathml"),N||($(R,b),Sn(t,!1)))};N&&($(n,F),Sn(t,!0)),hr(t.props)?be(()=>{V(),t.el.__isMounted=!0},i):V()}else{if(hr(t.props)&&!e.el.__isMounted){be(()=>{$i.process(e,t,n,s,r,i,o,l,c,f),delete e.el.__isMounted},i);return}t.el=e.el,t.targetStart=e.targetStart;const O=t.anchor=e.anchor,F=t.target=e.target,$=t.targetAnchor=e.targetAnchor,V=Vt(e.props),R=V?n:F,b=V?O:$;if(o==="svg"||pr(F)?o="svg":(o==="mathml"||gr(F))&&(o="mathml"),g?(y(e.dynamicChildren,g,R,r,i,o,l),Qs(e,t,!0)):c||h(e,t,R,b,r,i,o,l,!1),N)V?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):un(t,n,O,f,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const I=t.target=xs(t.props,S);I&&un(t,I,null,f,0)}else V&&un(t,F,$,f,1);Sn(t,N)}},remove(e,t,n,{um:s,o:{remove:r}},i){const{shapeFlag:o,children:l,anchor:c,targetStart:f,targetAnchor:a,target:h,props:y}=e;if(h&&(r(f),r(a)),i&&r(c),o&16){const v=i||!Vt(y);for(let S=0;S{e.isMounted=!0}),Ki(()=>{e.isUnmounting=!0}),e}const Re=[Function,Array],ji={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Re,onEnter:Re,onAfterEnter:Re,onEnterCancelled:Re,onBeforeLeave:Re,onLeave:Re,onAfterLeave:Re,onLeaveCancelled:Re,onBeforeAppear:Re,onAppear:Re,onAfterAppear:Re,onAppearCancelled:Re},Vi=e=>{const t=e.subTree;return t.component?Vi(t.component):t},Wl={name:"BaseTransition",props:ji,setup(e,{slots:t}){const n=qn(),s=Bl();return()=>{const r=t.default&&Bi(t.default(),!0);if(!r||!r.length)return;const i=Ui(r),o=J(e),{mode:l}=o;if(s.isLeaving)return ts(i);const c=mr(i);if(!c)return ts(i);let f=Es(c,o,s,n,h=>f=h);c.type!==ve&&Yt(c,f);let a=n.subTree&&mr(n.subTree);if(a&&a.type!==ve&&!ut(c,a)&&Vi(n).type!==ve){let h=Es(a,o,s,n);if(Yt(a,h),l==="out-in"&&c.type!==ve)return s.isLeaving=!0,h.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete h.afterLeave,a=void 0},ts(i);l==="in-out"&&c.type!==ve?h.delayLeave=(y,v,S)=>{const _=ki(s,a);_[String(a.key)]=a,y[Ze]=()=>{v(),y[Ze]=void 0,delete f.delayedLeave,a=void 0},f.delayedLeave=()=>{S(),delete f.delayedLeave,a=void 0}}:a=void 0}else a&&(a=void 0);return i}}};function Ui(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==ve){t=n;break}}return t}const Kl=Wl;function ki(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Es(e,t,n,s,r){const{appear:i,mode:o,persisted:l=!1,onBeforeEnter:c,onEnter:f,onAfterEnter:a,onEnterCancelled:h,onBeforeLeave:y,onLeave:v,onAfterLeave:S,onLeaveCancelled:_,onBeforeAppear:K,onAppear:N,onAfterAppear:j,onAppearCancelled:p}=t,g=String(e.key),O=ki(n,e),F=(R,b)=>{R&&He(R,s,9,b)},$=(R,b)=>{const I=b[1];F(R,b),W(R)?R.every(x=>x.length<=1)&&I():R.length<=1&&I()},V={mode:o,persisted:l,beforeEnter(R){let b=c;if(!n.isMounted)if(i)b=K||c;else return;R[Ze]&&R[Ze](!0);const I=O[g];I&&ut(e,I)&&I.el[Ze]&&I.el[Ze](),F(b,[R])},enter(R){let b=f,I=a,x=h;if(!n.isMounted)if(i)b=N||f,I=j||a,x=p||h;else return;let B=!1;const se=R[dn]=le=>{B||(B=!0,le?F(x,[R]):F(I,[R]),V.delayedLeave&&V.delayedLeave(),R[dn]=void 0)};b?$(b,[R,se]):se()},leave(R,b){const I=String(e.key);if(R[dn]&&R[dn](!0),n.isUnmounting)return b();F(y,[R]);let x=!1;const B=R[Ze]=se=>{x||(x=!0,b(),se?F(_,[R]):F(S,[R]),R[Ze]=void 0,O[I]===e&&delete O[I])};O[I]=e,v?$(v,[R,B]):B()},clone(R){const b=Es(R,t,n,s,r);return r&&r(b),b}};return V}function ts(e){if(sn(e))return e=nt(e),e.children=null,e}function mr(e){if(!sn(e))return Hi(e.type)&&e.children?Ui(e.children):e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&q(n.default))return n.default()}}function Yt(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Yt(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Bi(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;iXt(S,t&&(W(t)?t[_]:t),n,s,r));return}if(pt(s)&&!r){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&Xt(e,t,n,s.component.subTree);return}const i=s.shapeFlag&4?Gn(s.component):s.el,o=r?null:i,{i:l,r:c}=e,f=t&&t.r,a=l.refs===Z?l.refs={}:l.refs,h=l.setupState,y=J(h),v=h===Z?()=>!1:S=>z(y,S);if(f!=null&&f!==c&&(re(f)?(a[f]=null,v(f)&&(h[f]=null)):fe(f)&&(f.value=null)),q(c))tn(c,l,12,[o,a]);else{const S=re(c),_=fe(c);if(S||_){const K=()=>{if(e.f){const N=S?v(c)?h[c]:a[c]:c.value;r?W(N)&&Hs(N,i):W(N)?N.includes(i)||N.push(i):S?(a[c]=[i],v(c)&&(h[c]=a[c])):(c.value=[i],e.k&&(a[e.k]=c.value))}else S?(a[c]=o,v(c)&&(h[c]=o)):_&&(c.value=o,e.k&&(a[e.k]=o))};o?(K.id=-1,be(K,n)):K()}}}let yr=!1;const bt=()=>{yr||(console.error("Hydration completed but contains mismatches."),yr=!0)},ql=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",Gl=e=>e.namespaceURI.includes("MathML"),hn=e=>{if(e.nodeType===1){if(ql(e))return"svg";if(Gl(e))return"mathml"}},xt=e=>e.nodeType===8;function Yl(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:f}}=e,a=(p,g)=>{if(!g.hasChildNodes()){n(null,p,g),On(),g._vnode=p;return}h(g.firstChild,p,null,null,null),On(),g._vnode=p},h=(p,g,O,F,$,V=!1)=>{V=V||!!g.dynamicChildren;const R=xt(p)&&p.data==="[",b=()=>_(p,g,O,F,$,R),{type:I,ref:x,shapeFlag:B,patchFlag:se}=g;let le=p.nodeType;g.el=p,se===-2&&(V=!1,g.dynamicChildren=null);let U=null;switch(I){case gt:le!==3?g.children===""?(c(g.el=r(""),o(p),p),U=p):U=b():(p.data!==g.children&&(bt(),p.data=g.children),U=i(p));break;case ve:j(p)?(U=i(p),N(g.el=p.content.firstChild,p,O)):le!==8||R?U=b():U=i(p);break;case kt:if(R&&(p=i(p),le=p.nodeType),le===1||le===3){U=p;const Y=!g.children.length;for(let D=0;D{V=V||!!g.dynamicChildren;const{type:R,props:b,patchFlag:I,shapeFlag:x,dirs:B,transition:se}=g,le=R==="input"||R==="option";if(le||I!==-1){B&&Ue(g,null,O,"created");let U=!1;if(j(p)){U=co(null,se)&&O&&O.vnode.props&&O.vnode.props.appear;const D=p.content.firstChild;U&&se.beforeEnter(D),N(D,p,O),g.el=p=D}if(x&16&&!(b&&(b.innerHTML||b.textContent))){let D=v(p.firstChild,g,p,O,F,$,V);for(;D;){pn(p,1)||bt();const he=D;D=D.nextSibling,l(he)}}else if(x&8){let D=g.children;D[0]===` +`&&(p.tagName==="PRE"||p.tagName==="TEXTAREA")&&(D=D.slice(1)),p.textContent!==D&&(pn(p,0)||bt(),p.textContent=g.children)}if(b){if(le||!V||I&48){const D=p.tagName.includes("-");for(const he in b)(le&&(he.endsWith("value")||he==="indeterminate")||en(he)&&!Ct(he)||he[0]==="."||D)&&s(p,he,null,b[he],void 0,O)}else if(b.onClick)s(p,"onClick",null,b.onClick,void 0,O);else if(I&4&&ht(b.style))for(const D in b.style)b.style[D]}let Y;(Y=b&&b.onVnodeBeforeMount)&&Oe(Y,O,g),B&&Ue(g,null,O,"beforeMount"),((Y=b&&b.onVnodeMounted)||B||U)&&go(()=>{Y&&Oe(Y,O,g),U&&se.enter(p),B&&Ue(g,null,O,"mounted")},F)}return p.nextSibling},v=(p,g,O,F,$,V,R)=>{R=R||!!g.dynamicChildren;const b=g.children,I=b.length;for(let x=0;x{const{slotScopeIds:R}=g;R&&($=$?$.concat(R):R);const b=o(p),I=v(i(p),g,b,O,F,$,V);return I&&xt(I)&&I.data==="]"?i(g.anchor=I):(bt(),c(g.anchor=f("]"),b,I),I)},_=(p,g,O,F,$,V)=>{if(pn(p.parentElement,1)||bt(),g.el=null,V){const I=K(p);for(;;){const x=i(p);if(x&&x!==I)l(x);else break}}const R=i(p),b=o(p);return l(p),n(null,g,b,R,O,F,hn(b),$),O&&(O.vnode.el=g.el,ho(O,g.el)),R},K=(p,g="[",O="]")=>{let F=0;for(;p;)if(p=i(p),p&&xt(p)&&(p.data===g&&F++,p.data===O)){if(F===0)return i(p);F--}return p},N=(p,g,O)=>{const F=g.parentNode;F&&F.replaceChild(p,g);let $=O;for(;$;)$.vnode.el===g&&($.vnode.el=$.subTree.el=p),$=$.parent},j=p=>p.nodeType===1&&p.tagName==="TEMPLATE";return[a,h]}const vr="data-allow-mismatch",Xl={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function pn(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(vr);)e=e.parentElement;const n=e&&e.getAttribute(vr);if(n==null)return!1;if(n==="")return!0;{const s=n.split(",");return t===0&&s.includes("children")?!0:n.split(",").includes(Xl[t])}}Hn().requestIdleCallback;Hn().cancelIdleCallback;function Jl(e,t){if(xt(e)&&e.data==="["){let n=1,s=e.nextSibling;for(;s;){if(s.nodeType===1){if(t(s)===!1)break}else if(xt(s))if(s.data==="]"){if(--n===0)break}else s.data==="["&&n++;s=s.nextSibling}}else t(e)}const pt=e=>!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function wf(e){q(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:s,delay:r=200,hydrate:i,timeout:o,suspensible:l=!0,onError:c}=e;let f=null,a,h=0;const y=()=>(h++,f=null,v()),v=()=>{let S;return f||(S=f=t().catch(_=>{if(_=_ instanceof Error?_:new Error(String(_)),c)return new Promise((K,N)=>{c(_,()=>K(y()),()=>N(_),h+1)});throw _}).then(_=>S!==f&&f?f:(_&&(_.__esModule||_[Symbol.toStringTag]==="Module")&&(_=_.default),a=_,_)))};return Ys({name:"AsyncComponentWrapper",__asyncLoader:v,__asyncHydrate(S,_,K){const N=i?()=>{const j=i(K,p=>Jl(S,p));j&&(_.bum||(_.bum=[])).push(j)}:K;a?N():v().then(()=>!_.isUnmounted&&N())},get __asyncResolved(){return a},setup(){const S=ue;if(Xs(S),a)return()=>ns(a,S);const _=p=>{f=null,nn(p,S,13,!s)};if(l&&S.suspense||Mt)return v().then(p=>()=>ns(p,S)).catch(p=>(_(p),()=>s?ce(s,{error:p}):null));const K=oe(!1),N=oe(),j=oe(!!r);return r&&setTimeout(()=>{j.value=!1},r),o!=null&&setTimeout(()=>{if(!K.value&&!N.value){const p=new Error(`Async component timed out after ${o}ms.`);_(p),N.value=p}},o),v().then(()=>{K.value=!0,S.parent&&sn(S.parent.vnode)&&S.parent.update()}).catch(p=>{_(p),N.value=p}),()=>{if(K.value&&a)return ns(a,S);if(N.value&&s)return ce(s,{error:N.value});if(n&&!j.value)return ce(n)}}})}function ns(e,t){const{ref:n,props:s,children:r,ce:i}=t.vnode,o=ce(e,s,r);return o.ref=n,o.ce=i,delete t.vnode.ce,o}const sn=e=>e.type.__isKeepAlive;function zl(e,t){Wi(e,"a",t)}function Ql(e,t){Wi(e,"da",t)}function Wi(e,t,n=ue){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(kn(t,s,n),n){let r=n.parent;for(;r&&r.parent;)sn(r.parent.vnode)&&Zl(s,t,n,r),r=r.parent}}function Zl(e,t,n,s){const r=kn(t,e,s,!0);Bn(()=>{Hs(s[t],r)},n)}function kn(e,t,n=ue,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{rt();const l=rn(n),c=He(t,n,e,o);return l(),it(),c});return s?r.unshift(i):r.push(i),i}}const Je=e=>(t,n=ue)=>{(!Mt||e==="sp")&&kn(e,(...s)=>t(...s),n)},ec=Je("bm"),Lt=Je("m"),tc=Je("bu"),nc=Je("u"),Ki=Je("bum"),Bn=Je("um"),sc=Je("sp"),rc=Je("rtg"),ic=Je("rtc");function oc(e,t=ue){kn("ec",e,t)}const qi="components";function Sf(e,t){return Yi(qi,e,!0,t)||e}const Gi=Symbol.for("v-ndc");function xf(e){return re(e)?Yi(qi,e,!1)||e:e||Gi}function Yi(e,t,n=!0,s=!1){const r=de||ue;if(r){const i=r.type;{const l=Wc(i,!1);if(l&&(l===t||l===Le(t)||l===Fn(Le(t))))return i}const o=_r(r[e]||i[e],t)||_r(r.appContext[e],t);return!o&&s?i:o}}function _r(e,t){return e&&(e[t]||e[Le(t)]||e[Fn(Le(t))])}function Ef(e,t,n,s){let r;const i=n,o=W(e);if(o||re(e)){const l=o&&ht(e);let c=!1;l&&(c=!Pe(e),e=Dn(e)),r=new Array(e.length);for(let f=0,a=e.length;ft(l,c,void 0,i));else{const l=Object.keys(e);r=new Array(l.length);for(let c=0,f=l.length;czt(t)?!(t.type===ve||t.type===xe&&!Xi(t.children)):!0)?e:null}function Cf(e,t){const n={};for(const s in e)n[/[A-Z]/.test(s)?`on:${s}`:_n(s)]=e[s];return n}const Ts=e=>e?bo(e)?Gn(e):Ts(e.parent):null,Ut=ae(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Ts(e.parent),$root:e=>Ts(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Js(e),$forceUpdate:e=>e.f||(e.f=()=>{Gs(e.update)}),$nextTick:e=>e.n||(e.n=Un.bind(e.proxy)),$watch:e=>Rc.bind(e)}),ss=(e,t)=>e!==Z&&!e.__isScriptSetup&&z(e,t),lc={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;let f;if(t[0]!=="$"){const v=o[t];if(v!==void 0)switch(v){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(ss(s,t))return o[t]=1,s[t];if(r!==Z&&z(r,t))return o[t]=2,r[t];if((f=e.propsOptions[0])&&z(f,t))return o[t]=3,i[t];if(n!==Z&&z(n,t))return o[t]=4,n[t];Cs&&(o[t]=0)}}const a=Ut[t];let h,y;if(a)return t==="$attrs"&&me(e.attrs,"get",""),a(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==Z&&z(n,t))return o[t]=4,n[t];if(y=c.config.globalProperties,z(y,t))return y[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return ss(r,t)?(r[t]=n,!0):s!==Z&&z(s,t)?(s[t]=n,!0):z(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,propsOptions:i}},o){let l;return!!n[o]||e!==Z&&z(e,o)||ss(t,o)||(l=i[0])&&z(l,o)||z(s,o)||z(Ut,o)||z(r.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:z(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Af(){return cc().slots}function cc(){const e=qn();return e.setupContext||(e.setupContext=So(e))}function br(e){return W(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Cs=!0;function ac(e){const t=Js(e),n=e.proxy,s=e.ctx;Cs=!1,t.beforeCreate&&wr(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:f,created:a,beforeMount:h,mounted:y,beforeUpdate:v,updated:S,activated:_,deactivated:K,beforeDestroy:N,beforeUnmount:j,destroyed:p,unmounted:g,render:O,renderTracked:F,renderTriggered:$,errorCaptured:V,serverPrefetch:R,expose:b,inheritAttrs:I,components:x,directives:B,filters:se}=t;if(f&&fc(f,s,null),o)for(const Y in o){const D=o[Y];q(D)&&(s[Y]=D.bind(n))}if(r){const Y=r.call(n,n);ne(Y)&&(e.data=jn(Y))}if(Cs=!0,i)for(const Y in i){const D=i[Y],he=q(D)?D.bind(n,n):q(D.get)?D.get.bind(n,n):ke,on=!q(D)&&q(D.set)?D.set.bind(n):ke,ot=ie({get:he,set:on});Object.defineProperty(s,Y,{enumerable:!0,configurable:!0,get:()=>ot.value,set:De=>ot.value=De})}if(l)for(const Y in l)Ji(l[Y],s,n,Y);if(c){const Y=q(c)?c.call(n):c;Reflect.ownKeys(Y).forEach(D=>{mc(D,Y[D])})}a&&wr(a,e,"c");function U(Y,D){W(D)?D.forEach(he=>Y(he.bind(n))):D&&Y(D.bind(n))}if(U(ec,h),U(Lt,y),U(tc,v),U(nc,S),U(zl,_),U(Ql,K),U(oc,V),U(ic,F),U(rc,$),U(Ki,j),U(Bn,g),U(sc,R),W(b))if(b.length){const Y=e.exposed||(e.exposed={});b.forEach(D=>{Object.defineProperty(Y,D,{get:()=>n[D],set:he=>n[D]=he})})}else e.exposed||(e.exposed={});O&&e.render===ke&&(e.render=O),I!=null&&(e.inheritAttrs=I),x&&(e.components=x),B&&(e.directives=B),R&&Xs(e)}function fc(e,t,n=ke){W(e)&&(e=As(e));for(const s in e){const r=e[s];let i;ne(r)?"default"in r?i=Ot(r.from||s,r.default,!0):i=Ot(r.from||s):i=Ot(r),fe(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function wr(e,t,n){He(W(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function Ji(e,t,n,s){let r=s.includes(".")?fo(n,s):()=>n[s];if(re(e)){const i=t[e];q(i)&&Fe(r,i)}else if(q(e))Fe(r,e.bind(n));else if(ne(e))if(W(e))e.forEach(i=>Ji(i,t,n,s));else{const i=q(e.handler)?e.handler.bind(n):t[e.handler];q(i)&&Fe(r,i,e)}}function Js(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(f=>Pn(c,f,o,!0)),Pn(c,t,o)),ne(t)&&i.set(t,c),c}function Pn(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&Pn(e,i,n,!0),r&&r.forEach(o=>Pn(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=uc[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const uc={data:Sr,props:xr,emits:xr,methods:$t,computed:$t,beforeCreate:_e,created:_e,beforeMount:_e,mounted:_e,beforeUpdate:_e,updated:_e,beforeDestroy:_e,beforeUnmount:_e,destroyed:_e,unmounted:_e,activated:_e,deactivated:_e,errorCaptured:_e,serverPrefetch:_e,components:$t,directives:$t,watch:hc,provide:Sr,inject:dc};function Sr(e,t){return t?e?function(){return ae(q(e)?e.call(this,this):e,q(t)?t.call(this,this):t)}:t:e}function dc(e,t){return $t(As(e),As(t))}function As(e){if(W(e)){const t={};for(let n=0;n1)return n&&q(t)?t.call(s&&s.proxy):t}}const Qi={},Zi=()=>Object.create(Qi),eo=e=>Object.getPrototypeOf(e)===Qi;function yc(e,t,n,s=!1){const r={},i=Zi();e.propsDefaults=Object.create(null),to(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:Tl(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function vc(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=J(r),[c]=e.propsOptions;let f=!1;if((s||o>0)&&!(o&16)){if(o&8){const a=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[y,v]=no(h,t,!0);ae(o,y),v&&l.push(...v)};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!i&&!c)return ne(e)&&s.set(e,Et),Et;if(W(i))for(let a=0;ae[0]==="_"||e==="$stable",zs=e=>W(e)?e.map(Me):[Me(e)],bc=(e,t,n)=>{if(t._n)return t;const s=Ul((...r)=>zs(t(...r)),n);return s._c=!1,s},ro=(e,t,n)=>{const s=e._ctx;for(const r in e){if(so(r))continue;const i=e[r];if(q(i))t[r]=bc(r,i,s);else if(i!=null){const o=zs(i);t[r]=()=>o}}},io=(e,t)=>{const n=zs(t);e.slots.default=()=>n},oo=(e,t,n)=>{for(const s in t)(n||s!=="_")&&(e[s]=t[s])},wc=(e,t,n)=>{const s=e.slots=Zi();if(e.vnode.shapeFlag&32){const r=t._;r?(oo(s,t,n),n&&ai(s,"_",r,!0)):ro(t,s)}else t&&io(e,t)},Sc=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=Z;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:oo(r,t,n):(i=!t.$stable,ro(t,r)),o=t}else t&&(io(e,t),o={default:1});if(i)for(const l in r)!so(l)&&o[l]==null&&delete r[l]},be=go;function xc(e){return lo(e)}function Ec(e){return lo(e,Yl)}function lo(e,t){const n=Hn();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:f,setElementText:a,parentNode:h,nextSibling:y,setScopeId:v=ke,insertStaticContent:S}=e,_=(u,d,m,T=null,w=null,E=null,P=void 0,M=null,A=!!d.dynamicChildren)=>{if(u===d)return;u&&!ut(u,d)&&(T=ln(u),De(u,w,E,!0),u=null),d.patchFlag===-2&&(A=!1,d.dynamicChildren=null);const{type:C,ref:k,shapeFlag:L}=d;switch(C){case gt:K(u,d,m,T);break;case ve:N(u,d,m,T);break;case kt:u==null&&j(d,m,T,P);break;case xe:x(u,d,m,T,w,E,P,M,A);break;default:L&1?O(u,d,m,T,w,E,P,M,A):L&6?B(u,d,m,T,w,E,P,M,A):(L&64||L&128)&&C.process(u,d,m,T,w,E,P,M,A,vt)}k!=null&&w&&Xt(k,u&&u.ref,E,d||u,!d)},K=(u,d,m,T)=>{if(u==null)s(d.el=l(d.children),m,T);else{const w=d.el=u.el;d.children!==u.children&&f(w,d.children)}},N=(u,d,m,T)=>{u==null?s(d.el=c(d.children||""),m,T):d.el=u.el},j=(u,d,m,T)=>{[u.el,u.anchor]=S(u.children,d,m,T,u.el,u.anchor)},p=({el:u,anchor:d},m,T)=>{let w;for(;u&&u!==d;)w=y(u),s(u,m,T),u=w;s(d,m,T)},g=({el:u,anchor:d})=>{let m;for(;u&&u!==d;)m=y(u),r(u),u=m;r(d)},O=(u,d,m,T,w,E,P,M,A)=>{d.type==="svg"?P="svg":d.type==="math"&&(P="mathml"),u==null?F(d,m,T,w,E,P,M,A):R(u,d,w,E,P,M,A)},F=(u,d,m,T,w,E,P,M)=>{let A,C;const{props:k,shapeFlag:L,transition:H,dirs:G}=u;if(A=u.el=o(u.type,E,k&&k.is,k),L&8?a(A,u.children):L&16&&V(u.children,A,null,T,w,rs(u,E),P,M),G&&Ue(u,null,T,"created"),$(A,u,u.scopeId,P,T),k){for(const ee in k)ee!=="value"&&!Ct(ee)&&i(A,ee,null,k[ee],E,T);"value"in k&&i(A,"value",null,k.value,E),(C=k.onVnodeBeforeMount)&&Oe(C,T,u)}G&&Ue(u,null,T,"beforeMount");const X=co(w,H);X&&H.beforeEnter(A),s(A,d,m),((C=k&&k.onVnodeMounted)||X||G)&&be(()=>{C&&Oe(C,T,u),X&&H.enter(A),G&&Ue(u,null,T,"mounted")},w)},$=(u,d,m,T,w)=>{if(m&&v(u,m),T)for(let E=0;E{for(let C=A;C{const M=d.el=u.el;let{patchFlag:A,dynamicChildren:C,dirs:k}=d;A|=u.patchFlag&16;const L=u.props||Z,H=d.props||Z;let G;if(m&<(m,!1),(G=H.onVnodeBeforeUpdate)&&Oe(G,m,d,u),k&&Ue(d,u,m,"beforeUpdate"),m&<(m,!0),(L.innerHTML&&H.innerHTML==null||L.textContent&&H.textContent==null)&&a(M,""),C?b(u.dynamicChildren,C,M,m,T,rs(d,w),E):P||D(u,d,M,null,m,T,rs(d,w),E,!1),A>0){if(A&16)I(M,L,H,m,w);else if(A&2&&L.class!==H.class&&i(M,"class",null,H.class,w),A&4&&i(M,"style",L.style,H.style,w),A&8){const X=d.dynamicProps;for(let ee=0;ee{G&&Oe(G,m,d,u),k&&Ue(d,u,m,"updated")},T)},b=(u,d,m,T,w,E,P)=>{for(let M=0;M{if(d!==m){if(d!==Z)for(const E in d)!Ct(E)&&!(E in m)&&i(u,E,d[E],null,w,T);for(const E in m){if(Ct(E))continue;const P=m[E],M=d[E];P!==M&&E!=="value"&&i(u,E,M,P,w,T)}"value"in m&&i(u,"value",d.value,m.value,w)}},x=(u,d,m,T,w,E,P,M,A)=>{const C=d.el=u?u.el:l(""),k=d.anchor=u?u.anchor:l("");let{patchFlag:L,dynamicChildren:H,slotScopeIds:G}=d;G&&(M=M?M.concat(G):G),u==null?(s(C,m,T),s(k,m,T),V(d.children||[],m,k,w,E,P,M,A)):L>0&&L&64&&H&&u.dynamicChildren?(b(u.dynamicChildren,H,m,w,E,P,M),(d.key!=null||w&&d===w.subTree)&&Qs(u,d,!0)):D(u,d,m,k,w,E,P,M,A)},B=(u,d,m,T,w,E,P,M,A)=>{d.slotScopeIds=M,u==null?d.shapeFlag&512?w.ctx.activate(d,m,T,P,A):se(d,m,T,w,E,P,A):le(u,d,A)},se=(u,d,m,T,w,E,P)=>{const M=u.component=Vc(u,T,w);if(sn(u)&&(M.ctx.renderer=vt),Uc(M,!1,P),M.asyncDep){if(w&&w.registerDep(M,U,P),!u.el){const A=M.subTree=ce(ve);N(null,A,d,m)}}else U(M,u,d,m,w,E,P)},le=(u,d,m)=>{const T=d.component=u.component;if(Ic(u,d,m))if(T.asyncDep&&!T.asyncResolved){Y(T,d,m);return}else T.next=d,T.update();else d.el=u.el,T.vnode=d},U=(u,d,m,T,w,E,P)=>{const M=()=>{if(u.isMounted){let{next:L,bu:H,u:G,parent:X,vnode:ee}=u;{const Te=ao(u);if(Te){L&&(L.el=ee.el,Y(u,L,P)),Te.asyncDep.then(()=>{u.isUnmounted||M()});return}}let Q=L,Ee;lt(u,!1),L?(L.el=ee.el,Y(u,L,P)):L=ee,H&&bn(H),(Ee=L.props&&L.props.onVnodeBeforeUpdate)&&Oe(Ee,X,L,ee),lt(u,!0);const pe=is(u),Ie=u.subTree;u.subTree=pe,_(Ie,pe,h(Ie.el),ln(Ie),u,w,E),L.el=pe.el,Q===null&&ho(u,pe.el),G&&be(G,w),(Ee=L.props&&L.props.onVnodeUpdated)&&be(()=>Oe(Ee,X,L,ee),w)}else{let L;const{el:H,props:G}=d,{bm:X,m:ee,parent:Q,root:Ee,type:pe}=u,Ie=pt(d);if(lt(u,!1),X&&bn(X),!Ie&&(L=G&&G.onVnodeBeforeMount)&&Oe(L,Q,d),lt(u,!0),H&&Jn){const Te=()=>{u.subTree=is(u),Jn(H,u.subTree,u,w,null)};Ie&&pe.__asyncHydrate?pe.__asyncHydrate(H,u,Te):Te()}else{Ee.ce&&Ee.ce._injectChildStyle(pe);const Te=u.subTree=is(u);_(null,Te,m,T,u,w,E),d.el=Te.el}if(ee&&be(ee,w),!Ie&&(L=G&&G.onVnodeMounted)){const Te=d;be(()=>Oe(L,Q,Te),w)}(d.shapeFlag&256||Q&&pt(Q.vnode)&&Q.vnode.shapeFlag&256)&&u.a&&be(u.a,w),u.isMounted=!0,d=m=T=null}};u.scope.on();const A=u.effect=new pi(M);u.scope.off();const C=u.update=A.run.bind(A),k=u.job=A.runIfDirty.bind(A);k.i=u,k.id=u.uid,A.scheduler=()=>Gs(k),lt(u,!0),C()},Y=(u,d,m)=>{d.component=u;const T=u.vnode.props;u.vnode=d,u.next=null,vc(u,d.props,T,m),Sc(u,d.children,m),rt(),dr(u),it()},D=(u,d,m,T,w,E,P,M,A=!1)=>{const C=u&&u.children,k=u?u.shapeFlag:0,L=d.children,{patchFlag:H,shapeFlag:G}=d;if(H>0){if(H&128){on(C,L,m,T,w,E,P,M,A);return}else if(H&256){he(C,L,m,T,w,E,P,M,A);return}}G&8?(k&16&&It(C,w,E),L!==C&&a(m,L)):k&16?G&16?on(C,L,m,T,w,E,P,M,A):It(C,w,E,!0):(k&8&&a(m,""),G&16&&V(L,m,T,w,E,P,M,A))},he=(u,d,m,T,w,E,P,M,A)=>{u=u||Et,d=d||Et;const C=u.length,k=d.length,L=Math.min(C,k);let H;for(H=0;Hk?It(u,w,E,!0,!1,L):V(d,m,T,w,E,P,M,A,L)},on=(u,d,m,T,w,E,P,M,A)=>{let C=0;const k=d.length;let L=u.length-1,H=k-1;for(;C<=L&&C<=H;){const G=u[C],X=d[C]=A?et(d[C]):Me(d[C]);if(ut(G,X))_(G,X,m,null,w,E,P,M,A);else break;C++}for(;C<=L&&C<=H;){const G=u[L],X=d[H]=A?et(d[H]):Me(d[H]);if(ut(G,X))_(G,X,m,null,w,E,P,M,A);else break;L--,H--}if(C>L){if(C<=H){const G=H+1,X=GH)for(;C<=L;)De(u[C],w,E,!0),C++;else{const G=C,X=C,ee=new Map;for(C=X;C<=H;C++){const Ce=d[C]=A?et(d[C]):Me(d[C]);Ce.key!=null&&ee.set(Ce.key,C)}let Q,Ee=0;const pe=H-X+1;let Ie=!1,Te=0;const Nt=new Array(pe);for(C=0;C=pe){De(Ce,w,E,!0);continue}let je;if(Ce.key!=null)je=ee.get(Ce.key);else for(Q=X;Q<=H;Q++)if(Nt[Q-X]===0&&ut(Ce,d[Q])){je=Q;break}je===void 0?De(Ce,w,E,!0):(Nt[je-X]=C+1,je>=Te?Te=je:Ie=!0,_(Ce,d[je],m,null,w,E,P,M,A),Ee++)}const lr=Ie?Tc(Nt):Et;for(Q=lr.length-1,C=pe-1;C>=0;C--){const Ce=X+C,je=d[Ce],cr=Ce+1{const{el:E,type:P,transition:M,children:A,shapeFlag:C}=u;if(C&6){ot(u.component.subTree,d,m,T);return}if(C&128){u.suspense.move(d,m,T);return}if(C&64){P.move(u,d,m,vt);return}if(P===xe){s(E,d,m);for(let L=0;LM.enter(E),w);else{const{leave:L,delayLeave:H,afterLeave:G}=M,X=()=>s(E,d,m),ee=()=>{L(E,()=>{X(),G&&G()})};H?H(E,X,ee):ee()}else s(E,d,m)},De=(u,d,m,T=!1,w=!1)=>{const{type:E,props:P,ref:M,children:A,dynamicChildren:C,shapeFlag:k,patchFlag:L,dirs:H,cacheIndex:G}=u;if(L===-2&&(w=!1),M!=null&&Xt(M,null,m,u,!0),G!=null&&(d.renderCache[G]=void 0),k&256){d.ctx.deactivate(u);return}const X=k&1&&H,ee=!pt(u);let Q;if(ee&&(Q=P&&P.onVnodeBeforeUnmount)&&Oe(Q,d,u),k&6)Wo(u.component,m,T);else{if(k&128){u.suspense.unmount(m,T);return}X&&Ue(u,null,d,"beforeUnmount"),k&64?u.type.remove(u,d,m,vt,T):C&&!C.hasOnce&&(E!==xe||L>0&&L&64)?It(C,d,m,!1,!0):(E===xe&&L&384||!w&&k&16)&&It(A,d,m),T&&ir(u)}(ee&&(Q=P&&P.onVnodeUnmounted)||X)&&be(()=>{Q&&Oe(Q,d,u),X&&Ue(u,null,d,"unmounted")},m)},ir=u=>{const{type:d,el:m,anchor:T,transition:w}=u;if(d===xe){Bo(m,T);return}if(d===kt){g(u);return}const E=()=>{r(m),w&&!w.persisted&&w.afterLeave&&w.afterLeave()};if(u.shapeFlag&1&&w&&!w.persisted){const{leave:P,delayLeave:M}=w,A=()=>P(m,E);M?M(u.el,E,A):A()}else E()},Bo=(u,d)=>{let m;for(;u!==d;)m=y(u),r(u),u=m;r(d)},Wo=(u,d,m)=>{const{bum:T,scope:w,job:E,subTree:P,um:M,m:A,a:C}=u;Tr(A),Tr(C),T&&bn(T),w.stop(),E&&(E.flags|=8,De(P,u,d,m)),M&&be(M,d),be(()=>{u.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},It=(u,d,m,T=!1,w=!1,E=0)=>{for(let P=E;P{if(u.shapeFlag&6)return ln(u.component.subTree);if(u.shapeFlag&128)return u.suspense.next();const d=y(u.anchor||u.el),m=d&&d[Fi];return m?y(m):d};let Yn=!1;const or=(u,d,m)=>{u==null?d._vnode&&De(d._vnode,null,null,!0):_(d._vnode||null,u,d,null,null,null,m),d._vnode=u,Yn||(Yn=!0,dr(),On(),Yn=!1)},vt={p:_,um:De,m:ot,r:ir,mt:se,mc:V,pc:D,pbc:b,n:ln,o:e};let Xn,Jn;return t&&([Xn,Jn]=t(vt)),{render:or,hydrate:Xn,createApp:gc(or,Xn)}}function rs({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function lt({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function co(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Qs(e,t,n=!1){const s=e.children,r=t.children;if(W(s)&&W(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function ao(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:ao(t)}function Tr(e){if(e)for(let t=0;tOt(Cc);function Zs(e,t){return Wn(e,null,t)}function Rf(e,t){return Wn(e,null,{flush:"post"})}function Fe(e,t,n){return Wn(e,t,n)}function Wn(e,t,n=Z){const{immediate:s,deep:r,flush:i,once:o}=n,l=ae({},n),c=t&&s||!t&&i!=="post";let f;if(Mt){if(i==="sync"){const v=Ac();f=v.__watcherHandles||(v.__watcherHandles=[])}else if(!c){const v=()=>{};return v.stop=ke,v.resume=ke,v.pause=ke,v}}const a=ue;l.call=(v,S,_)=>He(v,a,S,_);let h=!1;i==="post"?l.scheduler=v=>{be(v,a&&a.suspense)}:i!=="sync"&&(h=!0,l.scheduler=(v,S)=>{S?v():Gs(v)}),l.augmentJob=v=>{t&&(v.flags|=4),h&&(v.flags|=2,a&&(v.id=a.uid,v.i=a))};const y=$l(e,t,l);return Mt&&(f?f.push(y):c&&y()),y}function Rc(e,t,n){const s=this.proxy,r=re(e)?e.includes(".")?fo(s,e):()=>s[e]:e.bind(s,s);let i;q(t)?i=t:(i=t.handler,n=t);const o=rn(this),l=Wn(r,i.bind(s),n);return o(),l}function fo(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;rt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Le(t)}Modifiers`]||e[`${st(t)}Modifiers`];function Mc(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||Z;let r=n;const i=t.startsWith("update:"),o=i&&Oc(s,t.slice(7));o&&(o.trim&&(r=n.map(a=>re(a)?a.trim():a)),o.number&&(r=n.map(vs)));let l,c=s[l=_n(t)]||s[l=_n(Le(t))];!c&&i&&(c=s[l=_n(st(t))]),c&&He(c,e,6,r);const f=s[l+"Once"];if(f){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,He(f,e,6,r)}}function uo(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!q(e)){const c=f=>{const a=uo(f,t,!0);a&&(l=!0,ae(o,a))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(ne(e)&&s.set(e,null),null):(W(i)?i.forEach(c=>o[c]=null):ae(o,i),ne(e)&&s.set(e,o),o)}function Kn(e,t){return!e||!en(t)?!1:(t=t.slice(2).replace(/Once$/,""),z(e,t[0].toLowerCase()+t.slice(1))||z(e,st(t))||z(e,t))}function is(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:o,attrs:l,emit:c,render:f,renderCache:a,props:h,data:y,setupState:v,ctx:S,inheritAttrs:_}=e,K=Mn(e);let N,j;try{if(n.shapeFlag&4){const g=r||s,O=g;N=Me(f.call(O,g,a,h,v,y,S)),j=l}else{const g=t;N=Me(g.length>1?g(h,{attrs:l,slots:o,emit:c}):g(h,null)),j=t.props?l:Pc(l)}}catch(g){Bt.length=0,nn(g,e,1),N=ce(ve)}let p=N;if(j&&_!==!1){const g=Object.keys(j),{shapeFlag:O}=p;g.length&&O&7&&(i&&g.some(Fs)&&(j=Lc(j,i)),p=nt(p,j,!1,!0))}return n.dirs&&(p=nt(p,null,!1,!0),p.dirs=p.dirs?p.dirs.concat(n.dirs):n.dirs),n.transition&&Yt(p,n.transition),N=p,Mn(K),N}const Pc=e=>{let t;for(const n in e)(n==="class"||n==="style"||en(n))&&((t||(t={}))[n]=e[n]);return t},Lc=(e,t)=>{const n={};for(const s in e)(!Fs(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Ic(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,f=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?Cr(s,o,f):!!o;if(c&8){const a=t.dynamicProps;for(let h=0;he.__isSuspense;function go(e,t){t&&t.pendingBranch?W(e)?t.effects.push(...e):t.effects.push(e):Vl(e)}const xe=Symbol.for("v-fgt"),gt=Symbol.for("v-txt"),ve=Symbol.for("v-cmt"),kt=Symbol.for("v-stc"),Bt=[];let Ae=null;function Os(e=!1){Bt.push(Ae=e?null:[])}function Nc(){Bt.pop(),Ae=Bt[Bt.length-1]||null}let Jt=1;function Ar(e,t=!1){Jt+=e,e<0&&Ae&&t&&(Ae.hasOnce=!0)}function mo(e){return e.dynamicChildren=Jt>0?Ae||Et:null,Nc(),Jt>0&&Ae&&Ae.push(e),e}function Of(e,t,n,s,r,i){return mo(vo(e,t,n,s,r,i,!0))}function Ms(e,t,n,s,r){return mo(ce(e,t,n,s,r,!0))}function zt(e){return e?e.__v_isVNode===!0:!1}function ut(e,t){return e.type===t.type&&e.key===t.key}const yo=({key:e})=>e??null,xn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?re(e)||fe(e)||q(e)?{i:de,r:e,k:t,f:!!n}:e:null);function vo(e,t=null,n=null,s=0,r=null,i=e===xe?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&yo(t),ref:t&&xn(t),scopeId:Ni,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:de};return l?(er(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=re(n)?8:16),Jt>0&&!o&&Ae&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Ae.push(c),c}const ce=Fc;function Fc(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===Gi)&&(e=ve),zt(e)){const l=nt(e,t,!0);return n&&er(l,n),Jt>0&&!i&&Ae&&(l.shapeFlag&6?Ae[Ae.indexOf(e)]=l:Ae.push(l)),l.patchFlag=-2,l}if(Kc(e)&&(e=e.__vccOpts),t){t=Hc(t);let{class:l,style:c}=t;l&&!re(l)&&(t.class=js(l)),ne(c)&&(Ks(c)&&!W(c)&&(c=ae({},c)),t.style=Ds(c))}const o=re(e)?1:po(e)?128:Hi(e)?64:ne(e)?4:q(e)?2:0;return vo(e,t,n,s,r,o,i,!0)}function Hc(e){return e?Ks(e)||eo(e)?ae({},e):e:null}function nt(e,t,n=!1,s=!1){const{props:r,ref:i,patchFlag:o,children:l,transition:c}=e,f=t?$c(r||{},t):r,a={__v_isVNode:!0,__v_skip:!0,type:e.type,props:f,key:f&&yo(f),ref:t&&t.ref?n&&i?W(i)?i.concat(xn(t)):[i,xn(t)]:xn(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==xe?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&nt(e.ssContent),ssFallback:e.ssFallback&&nt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&s&&Yt(a,c.clone(a)),a}function _o(e=" ",t=0){return ce(gt,null,e,t)}function Mf(e,t){const n=ce(kt,null,e);return n.staticCount=t,n}function Pf(e="",t=!1){return t?(Os(),Ms(ve,null,e)):ce(ve,null,e)}function Me(e){return e==null||typeof e=="boolean"?ce(ve):W(e)?ce(xe,null,e.slice()):zt(e)?et(e):ce(gt,null,String(e))}function et(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:nt(e)}function er(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(W(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),er(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!eo(t)?t._ctx=de:r===3&&de&&(de.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else q(t)?(t={default:t,_ctx:de},n=32):(t=String(t),s&64?(n=16,t=[_o(t)]):n=8);e.children=t,e.shapeFlag|=n}function $c(...e){const t={};for(let n=0;nue||de;let Ln,Ps;{const e=Hn(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};Ln=t("__VUE_INSTANCE_SETTERS__",n=>ue=n),Ps=t("__VUE_SSR_SETTERS__",n=>Mt=n)}const rn=e=>{const t=ue;return Ln(e),e.scope.on(),()=>{e.scope.off(),Ln(t)}},Rr=()=>{ue&&ue.scope.off(),Ln(null)};function bo(e){return e.vnode.shapeFlag&4}let Mt=!1;function Uc(e,t=!1,n=!1){t&&Ps(t);const{props:s,children:r}=e.vnode,i=bo(e);yc(e,s,i,t),wc(e,r,n);const o=i?kc(e,t):void 0;return t&&Ps(!1),o}function kc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,lc);const{setup:s}=n;if(s){rt();const r=e.setupContext=s.length>1?So(e):null,i=rn(e),o=tn(s,e,0,[e.props,r]),l=oi(o);if(it(),i(),(l||e.sp)&&!pt(e)&&Xs(e),l){if(o.then(Rr,Rr),t)return o.then(c=>{Or(e,c,t)}).catch(c=>{nn(c,e,0)});e.asyncDep=o}else Or(e,o,t)}else wo(e,t)}function Or(e,t,n){q(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ne(t)&&(e.setupState=Mi(t)),wo(e,n)}let Mr;function wo(e,t,n){const s=e.type;if(!e.render){if(!t&&Mr&&!s.render){const r=s.template||Js(e).template;if(r){const{isCustomElement:i,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,f=ae(ae({isCustomElement:i,delimiters:l},o),c);s.render=Mr(r,f)}}e.render=s.render||ke}{const r=rn(e);rt();try{ac(e)}finally{it(),r()}}}const Bc={get(e,t){return me(e,"get",""),e[t]}};function So(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Bc),slots:e.slots,emit:e.emit,expose:t}}function Gn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Mi(wn(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Ut)return Ut[n](e)},has(t,n){return n in t||n in Ut}})):e.proxy}function Wc(e,t=!0){return q(e)?e.displayName||e.name:e.name||t&&e.__name}function Kc(e){return q(e)&&"__vccOpts"in e}const ie=(e,t)=>Fl(e,t,Mt);function Ls(e,t,n){const s=arguments.length;return s===2?ne(t)&&!W(t)?zt(t)?ce(e,null,[t]):ce(e,t):ce(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&zt(n)&&(n=[n]),ce(e,t,n))}const qc="3.5.13";/** +* @vue/runtime-dom v3.5.13 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Is;const Pr=typeof window<"u"&&window.trustedTypes;if(Pr)try{Is=Pr.createPolicy("vue",{createHTML:e=>e})}catch{}const xo=Is?e=>Is.createHTML(e):e=>e,Gc="http://www.w3.org/2000/svg",Yc="http://www.w3.org/1998/Math/MathML",qe=typeof document<"u"?document:null,Lr=qe&&qe.createElement("template"),Xc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?qe.createElementNS(Gc,e):t==="mathml"?qe.createElementNS(Yc,e):n?qe.createElement(e,{is:n}):qe.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>qe.createTextNode(e),createComment:e=>qe.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>qe.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{Lr.innerHTML=xo(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=Lr.content;if(s==="svg"||s==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},ze="transition",Ht="animation",Qt=Symbol("_vtc"),Eo={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Jc=ae({},ji,Eo),zc=e=>(e.displayName="Transition",e.props=Jc,e),Lf=zc((e,{slots:t})=>Ls(Kl,Qc(e),t)),ct=(e,t=[])=>{W(e)?e.forEach(n=>n(...t)):e&&e(...t)},Ir=e=>e?W(e)?e.some(t=>t.length>1):e.length>1:!1;function Qc(e){const t={};for(const x in e)x in Eo||(t[x]=e[x]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:f=o,appearToClass:a=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:y=`${n}-leave-active`,leaveToClass:v=`${n}-leave-to`}=e,S=Zc(r),_=S&&S[0],K=S&&S[1],{onBeforeEnter:N,onEnter:j,onEnterCancelled:p,onLeave:g,onLeaveCancelled:O,onBeforeAppear:F=N,onAppear:$=j,onAppearCancelled:V=p}=t,R=(x,B,se,le)=>{x._enterCancelled=le,at(x,B?a:l),at(x,B?f:o),se&&se()},b=(x,B)=>{x._isLeaving=!1,at(x,h),at(x,v),at(x,y),B&&B()},I=x=>(B,se)=>{const le=x?$:j,U=()=>R(B,x,se);ct(le,[B,U]),Nr(()=>{at(B,x?c:i),Ke(B,x?a:l),Ir(le)||Fr(B,s,_,U)})};return ae(t,{onBeforeEnter(x){ct(N,[x]),Ke(x,i),Ke(x,o)},onBeforeAppear(x){ct(F,[x]),Ke(x,c),Ke(x,f)},onEnter:I(!1),onAppear:I(!0),onLeave(x,B){x._isLeaving=!0;const se=()=>b(x,B);Ke(x,h),x._enterCancelled?(Ke(x,y),Dr()):(Dr(),Ke(x,y)),Nr(()=>{x._isLeaving&&(at(x,h),Ke(x,v),Ir(g)||Fr(x,s,K,se))}),ct(g,[x,se])},onEnterCancelled(x){R(x,!1,void 0,!0),ct(p,[x])},onAppearCancelled(x){R(x,!0,void 0,!0),ct(V,[x])},onLeaveCancelled(x){b(x),ct(O,[x])}})}function Zc(e){if(e==null)return null;if(ne(e))return[os(e.enter),os(e.leave)];{const t=os(e);return[t,t]}}function os(e){return Jo(e)}function Ke(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Qt]||(e[Qt]=new Set)).add(t)}function at(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[Qt];n&&(n.delete(t),n.size||(e[Qt]=void 0))}function Nr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let ea=0;function Fr(e,t,n,s){const r=e._endId=++ea,i=()=>{r===e._endId&&s()};if(n!=null)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=ta(e,t);if(!o)return s();const f=o+"end";let a=0;const h=()=>{e.removeEventListener(f,y),i()},y=v=>{v.target===e&&++a>=c&&h()};setTimeout(()=>{a(n[S]||"").split(", "),r=s(`${ze}Delay`),i=s(`${ze}Duration`),o=Hr(r,i),l=s(`${Ht}Delay`),c=s(`${Ht}Duration`),f=Hr(l,c);let a=null,h=0,y=0;t===ze?o>0&&(a=ze,h=o,y=i.length):t===Ht?f>0&&(a=Ht,h=f,y=c.length):(h=Math.max(o,f),a=h>0?o>f?ze:Ht:null,y=a?a===ze?i.length:c.length:0);const v=a===ze&&/\b(transform|all)(,|$)/.test(s(`${ze}Property`).toString());return{type:a,timeout:h,propCount:y,hasTransform:v}}function Hr(e,t){for(;e.length$r(n)+$r(e[s])))}function $r(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Dr(){return document.body.offsetHeight}function na(e,t,n){const s=e[Qt];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const jr=Symbol("_vod"),sa=Symbol("_vsh"),ra=Symbol(""),ia=/(^|;)\s*display\s*:/;function oa(e,t,n){const s=e.style,r=re(n);let i=!1;if(n&&!r){if(t)if(re(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&En(s,l,"")}else for(const o in t)n[o]==null&&En(s,o,"");for(const o in n)o==="display"&&(i=!0),En(s,o,n[o])}else if(r){if(t!==n){const o=s[ra];o&&(n+=";"+o),s.cssText=n,i=ia.test(n)}}else t&&e.removeAttribute("style");jr in e&&(e[jr]=i?s.display:"",e[sa]&&(s.display="none"))}const Vr=/\s*!important$/;function En(e,t,n){if(W(n))n.forEach(s=>En(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=la(e,t);Vr.test(n)?e.setProperty(st(s),n.replace(Vr,""),"important"):e[s]=n}}const Ur=["Webkit","Moz","ms"],ls={};function la(e,t){const n=ls[t];if(n)return n;let s=Le(t);if(s!=="filter"&&s in e)return ls[t]=s;s=Fn(s);for(let r=0;rcs||(ua.then(()=>cs=0),cs=Date.now());function ha(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;He(pa(s,n.value),t,5,[s])};return n.value=e,n.attached=da(),n}function pa(e,t){if(W(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const Gr=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,ga=(e,t,n,s,r,i)=>{const o=r==="svg";t==="class"?na(e,s,o):t==="style"?oa(e,n,s):en(t)?Fs(t)||aa(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):ma(e,t,s,o))?(Wr(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Br(e,t,s,o,i,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!re(s))?Wr(e,Le(t),s,i,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Br(e,t,s,o))};function ma(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&Gr(t)&&q(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return Gr(t)&&re(n)?!1:t in e}const Yr=e=>{const t=e.props["onUpdate:modelValue"]||!1;return W(t)?n=>bn(t,n):t};function ya(e){e.target.composing=!0}function Xr(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const as=Symbol("_assign"),If={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e[as]=Yr(r);const i=s||r.props&&r.props.type==="number";St(e,t?"change":"input",o=>{if(o.target.composing)return;let l=e.value;n&&(l=l.trim()),i&&(l=vs(l)),e[as](l)}),n&&St(e,"change",()=>{e.value=e.value.trim()}),t||(St(e,"compositionstart",ya),St(e,"compositionend",Xr),St(e,"change",Xr))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:r,number:i}},o){if(e[as]=Yr(o),e.composing)return;const l=(i||e.type==="number")&&!/^0\d/.test(e.value)?vs(e.value):e.value,c=t??"";l!==c&&(document.activeElement===e&&e.type!=="range"&&(s&&t===n||r&&e.value.trim()===c)||(e.value=c))}},va=["ctrl","shift","alt","meta"],_a={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>va.some(n=>e[`${n}Key`]&&!t.includes(n))},Nf=(e,t)=>{const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(r,...i)=>{for(let o=0;o{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=r=>{if(!("key"in r))return;const i=st(r.key);if(t.some(o=>o===i||ba[o]===i))return e(r)})},To=ae({patchProp:ga},Xc);let Wt,Jr=!1;function wa(){return Wt||(Wt=xc(To))}function Sa(){return Wt=Jr?Wt:Ec(To),Jr=!0,Wt}const Hf=(...e)=>{const t=wa().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Ao(s);if(!r)return;const i=t._component;!q(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const o=n(r,!1,Co(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t},$f=(...e)=>{const t=Sa().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Ao(s);if(r)return n(r,!0,Co(r))},t};function Co(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Ao(e){return re(e)?document.querySelector(e):e}const Df=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},xa=window.__VP_SITE_DATA__;function tr(e){return hi()?(il(e),!0):!1}function Be(e){return typeof e=="function"?e():Oi(e)}const Ro=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const jf=e=>e!=null,Ea=Object.prototype.toString,Ta=e=>Ea.call(e)==="[object Object]",Zt=()=>{},zr=Ca();function Ca(){var e,t;return Ro&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function Aa(e,t){function n(...s){return new Promise((r,i)=>{Promise.resolve(e(()=>t.apply(this,s),{fn:t,thisArg:this,args:s})).then(r).catch(i)})}return n}const Oo=e=>e();function Ra(e,t={}){let n,s,r=Zt;const i=l=>{clearTimeout(l),r(),r=Zt};return l=>{const c=Be(e),f=Be(t.maxWait);return n&&i(n),c<=0||f!==void 0&&f<=0?(s&&(i(s),s=null),Promise.resolve(l())):new Promise((a,h)=>{r=t.rejectOnCancel?h:a,f&&!s&&(s=setTimeout(()=>{n&&i(n),s=null,a(l())},f)),n=setTimeout(()=>{s&&i(s),s=null,a(l())},c)})}}function Oa(e=Oo){const t=oe(!0);function n(){t.value=!1}function s(){t.value=!0}const r=(...i)=>{t.value&&e(...i)};return{isActive:Vn(t),pause:n,resume:s,eventFilter:r}}function Ma(e){return qn()}function Mo(...e){if(e.length!==1)return Ll(...e);const t=e[0];return typeof t=="function"?Vn(Ol(()=>({get:t,set:Zt}))):oe(t)}function Po(e,t,n={}){const{eventFilter:s=Oo,...r}=n;return Fe(e,Aa(s,t),r)}function Pa(e,t,n={}){const{eventFilter:s,...r}=n,{eventFilter:i,pause:o,resume:l,isActive:c}=Oa(s);return{stop:Po(e,t,{...r,eventFilter:i}),pause:o,resume:l,isActive:c}}function nr(e,t=!0,n){Ma()?Lt(e,n):t?e():Un(e)}function Vf(e,t,n={}){const{debounce:s=0,maxWait:r=void 0,...i}=n;return Po(e,t,{...i,eventFilter:Ra(s,{maxWait:r})})}function Uf(e,t,n){let s;fe(n)?s={evaluating:n}:s={};const{lazy:r=!1,evaluating:i=void 0,shallow:o=!0,onError:l=Zt}=s,c=oe(!r),f=o?qs(t):oe(t);let a=0;return Zs(async h=>{if(!c.value)return;a++;const y=a;let v=!1;i&&Promise.resolve().then(()=>{i.value=!0});try{const S=await e(_=>{h(()=>{i&&(i.value=!1),v||_()})});y===a&&(f.value=S)}catch(S){l(S)}finally{i&&y===a&&(i.value=!1),v=!0}}),r?ie(()=>(c.value=!0,f.value)):f}const $e=Ro?window:void 0;function Lo(e){var t;const n=Be(e);return(t=n==null?void 0:n.$el)!=null?t:n}function Pt(...e){let t,n,s,r;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,s,r]=e,t=$e):[t,n,s,r]=e,!t)return Zt;Array.isArray(n)||(n=[n]),Array.isArray(s)||(s=[s]);const i=[],o=()=>{i.forEach(a=>a()),i.length=0},l=(a,h,y,v)=>(a.addEventListener(h,y,v),()=>a.removeEventListener(h,y,v)),c=Fe(()=>[Lo(t),Be(r)],([a,h])=>{if(o(),!a)return;const y=Ta(h)?{...h}:h;i.push(...n.flatMap(v=>s.map(S=>l(a,v,S,y))))},{immediate:!0,flush:"post"}),f=()=>{c(),o()};return tr(f),f}function La(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function kf(...e){let t,n,s={};e.length===3?(t=e[0],n=e[1],s=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],s=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:r=$e,eventName:i="keydown",passive:o=!1,dedupe:l=!1}=s,c=La(t);return Pt(r,i,a=>{a.repeat&&Be(l)||c(a)&&n(a)},o)}function Ia(){const e=oe(!1),t=qn();return t&&Lt(()=>{e.value=!0},t),e}function Na(e){const t=Ia();return ie(()=>(t.value,!!e()))}function Io(e,t={}){const{window:n=$e}=t,s=Na(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let r;const i=oe(!1),o=f=>{i.value=f.matches},l=()=>{r&&("removeEventListener"in r?r.removeEventListener("change",o):r.removeListener(o))},c=Zs(()=>{s.value&&(l(),r=n.matchMedia(Be(e)),"addEventListener"in r?r.addEventListener("change",o):r.addListener(o),i.value=r.matches)});return tr(()=>{c(),l(),r=void 0}),i}const gn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},mn="__vueuse_ssr_handlers__",Fa=Ha();function Ha(){return mn in gn||(gn[mn]=gn[mn]||{}),gn[mn]}function No(e,t){return Fa[e]||t}function sr(e){return Io("(prefers-color-scheme: dark)",e)}function $a(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const Da={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},Qr="vueuse-storage";function rr(e,t,n,s={}){var r;const{flush:i="pre",deep:o=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:f=!1,shallow:a,window:h=$e,eventFilter:y,onError:v=b=>{console.error(b)},initOnMounted:S}=s,_=(a?qs:oe)(typeof t=="function"?t():t);if(!n)try{n=No("getDefaultStorage",()=>{var b;return(b=$e)==null?void 0:b.localStorage})()}catch(b){v(b)}if(!n)return _;const K=Be(t),N=$a(K),j=(r=s.serializer)!=null?r:Da[N],{pause:p,resume:g}=Pa(_,()=>F(_.value),{flush:i,deep:o,eventFilter:y});h&&l&&nr(()=>{n instanceof Storage?Pt(h,"storage",V):Pt(h,Qr,R),S&&V()}),S||V();function O(b,I){if(h){const x={key:e,oldValue:b,newValue:I,storageArea:n};h.dispatchEvent(n instanceof Storage?new StorageEvent("storage",x):new CustomEvent(Qr,{detail:x}))}}function F(b){try{const I=n.getItem(e);if(b==null)O(I,null),n.removeItem(e);else{const x=j.write(b);I!==x&&(n.setItem(e,x),O(I,x))}}catch(I){v(I)}}function $(b){const I=b?b.newValue:n.getItem(e);if(I==null)return c&&K!=null&&n.setItem(e,j.write(K)),K;if(!b&&f){const x=j.read(I);return typeof f=="function"?f(x,K):N==="object"&&!Array.isArray(x)?{...K,...x}:x}else return typeof I!="string"?I:j.read(I)}function V(b){if(!(b&&b.storageArea!==n)){if(b&&b.key==null){_.value=K;return}if(!(b&&b.key!==e)){p();try{(b==null?void 0:b.newValue)!==j.write(_.value)&&(_.value=$(b))}catch(I){v(I)}finally{b?Un(g):g()}}}}function R(b){V(b.detail)}return _}const ja="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";function Va(e={}){const{selector:t="html",attribute:n="class",initialValue:s="auto",window:r=$e,storage:i,storageKey:o="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:f,disableTransition:a=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},y=sr({window:r}),v=ie(()=>y.value?"dark":"light"),S=c||(o==null?Mo(s):rr(o,s,i,{window:r,listenToStorageChanges:l})),_=ie(()=>S.value==="auto"?v.value:S.value),K=No("updateHTMLAttrs",(g,O,F)=>{const $=typeof g=="string"?r==null?void 0:r.document.querySelector(g):Lo(g);if(!$)return;const V=new Set,R=new Set;let b=null;if(O==="class"){const x=F.split(/\s/g);Object.values(h).flatMap(B=>(B||"").split(/\s/g)).filter(Boolean).forEach(B=>{x.includes(B)?V.add(B):R.add(B)})}else b={key:O,value:F};if(V.size===0&&R.size===0&&b===null)return;let I;a&&(I=r.document.createElement("style"),I.appendChild(document.createTextNode(ja)),r.document.head.appendChild(I));for(const x of V)$.classList.add(x);for(const x of R)$.classList.remove(x);b&&$.setAttribute(b.key,b.value),a&&(r.getComputedStyle(I).opacity,document.head.removeChild(I))});function N(g){var O;K(t,n,(O=h[g])!=null?O:g)}function j(g){e.onChanged?e.onChanged(g,N):N(g)}Fe(_,j,{flush:"post",immediate:!0}),nr(()=>j(_.value));const p=ie({get(){return f?S.value:_.value},set(g){S.value=g}});try{return Object.assign(p,{store:S,system:v,state:_})}catch{return p}}function Ua(e={}){const{valueDark:t="dark",valueLight:n="",window:s=$e}=e,r=Va({...e,onChanged:(l,c)=>{var f;e.onChanged?(f=e.onChanged)==null||f.call(e,l==="dark",c,l):c(l)},modes:{dark:t,light:n}}),i=ie(()=>r.system?r.system.value:sr({window:s}).value?"dark":"light");return ie({get(){return r.value==="dark"},set(l){const c=l?"dark":"light";i.value===c?r.value="auto":r.value=c}})}function fs(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function Bf(e,t,n={}){const{window:s=$e}=n;return rr(e,t,s==null?void 0:s.localStorage,n)}function Fo(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const us=new WeakMap;function Wf(e,t=!1){const n=oe(t);let s=null,r="";Fe(Mo(e),l=>{const c=fs(Be(l));if(c){const f=c;if(us.get(f)||us.set(f,f.style.overflow),f.style.overflow!=="hidden"&&(r=f.style.overflow),f.style.overflow==="hidden")return n.value=!0;if(n.value)return f.style.overflow="hidden"}},{immediate:!0});const i=()=>{const l=fs(Be(e));!l||n.value||(zr&&(s=Pt(l,"touchmove",c=>{ka(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},o=()=>{const l=fs(Be(e));!l||!n.value||(zr&&(s==null||s()),l.style.overflow=r,us.delete(l),n.value=!1)};return tr(o),ie({get(){return n.value},set(l){l?i():o()}})}function Kf(e,t,n={}){const{window:s=$e}=n;return rr(e,t,s==null?void 0:s.sessionStorage,n)}function qf(e={}){const{window:t=$e,behavior:n="auto"}=e;if(!t)return{x:oe(0),y:oe(0)};const s=oe(t.scrollX),r=oe(t.scrollY),i=ie({get(){return s.value},set(l){scrollTo({left:l,behavior:n})}}),o=ie({get(){return r.value},set(l){scrollTo({top:l,behavior:n})}});return Pt(t,"scroll",()=>{s.value=t.scrollX,r.value=t.scrollY},{capture:!1,passive:!0}),{x:i,y:o}}function Gf(e={}){const{window:t=$e,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:s=Number.POSITIVE_INFINITY,listenOrientation:r=!0,includeScrollbar:i=!0,type:o="inner"}=e,l=oe(n),c=oe(s),f=()=>{t&&(o==="outer"?(l.value=t.outerWidth,c.value=t.outerHeight):i?(l.value=t.innerWidth,c.value=t.innerHeight):(l.value=t.document.documentElement.clientWidth,c.value=t.document.documentElement.clientHeight))};if(f(),nr(f),Pt("resize",f,{passive:!0}),r){const a=Io("(orientation: portrait)");Fe(a,()=>f())}return{width:l,height:c}}const ds={BASE_URL:"/GeometryOps.jl/previews/PR239/",DEV:!1,MODE:"production",PROD:!0,SSR:!1};var hs={};const Ho=/^(?:[a-z]+:|\/\/)/i,Ba="vitepress-theme-appearance",Wa=/#.*$/,Ka=/[?#].*$/,qa=/(?:(^|\/)index)?\.(?:md|html)$/,ge=typeof document<"u",$o={relativePath:"404.md",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function Ga(e,t,n=!1){if(t===void 0)return!1;if(e=Zr(`/${e}`),n)return new RegExp(t).test(e);if(Zr(t)!==e)return!1;const s=t.match(Wa);return s?(ge?location.hash:"")===s[0]:!0}function Zr(e){return decodeURI(e).replace(Ka,"").replace(qa,"$1")}function Ya(e){return Ho.test(e)}function Xa(e,t){return Object.keys((e==null?void 0:e.locales)||{}).find(n=>n!=="root"&&!Ya(n)&&Ga(t,`/${n}/`,!0))||"root"}function Ja(e,t){var s,r,i,o,l,c,f;const n=Xa(e,t);return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((r=e.locales[n])==null?void 0:r.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:jo(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(f=e.locales[n])==null?void 0:f.themeConfig}})}function Do(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const r=za(e.title,s);return n===r.slice(3)?n:`${n}${r}`}function za(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Qa(e,t){const[n,s]=t;if(n!=="meta")return!1;const r=Object.entries(s)[0];return r==null?!1:e.some(([i,o])=>i===n&&o[r[0]]===r[1])}function jo(e,t){return[...e.filter(n=>!Qa(t,n)),...t]}const Za=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,ef=/^[a-z]:/i;function ei(e){const t=ef.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Za,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const ps=new Set;function tf(e){if(ps.size===0){const n=typeof process=="object"&&(hs==null?void 0:hs.VITE_EXTRA_EXTENSIONS)||(ds==null?void 0:ds.VITE_EXTRA_EXTENSIONS)||"";("3g2,3gp,aac,ai,apng,au,avif,bin,bmp,cer,class,conf,crl,css,csv,dll,doc,eps,epub,exe,gif,gz,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,m4a,man,mid,midi,mjs,mov,mp2,mp3,mp4,mpe,mpeg,mpg,mpp,oga,ogg,ogv,ogx,opus,otf,p10,p7c,p7m,p7s,pdf,png,ps,qt,roff,rtf,rtx,ser,svg,t,tif,tiff,tr,ts,tsv,ttf,txt,vtt,wav,weba,webm,webp,woff,woff2,xhtml,xml,yaml,yml,zip"+(n&&typeof n=="string"?","+n:"")).split(",").forEach(s=>ps.add(s))}const t=e.split(".").pop();return t==null||!ps.has(t.toLowerCase())}function Yf(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}const nf=Symbol(),mt=qs(xa);function Xf(e){const t=ie(()=>Ja(mt.value,e.data.relativePath)),n=t.value.appearance,s=n==="force-dark"?oe(!0):n==="force-auto"?sr():n?Ua({storageKey:Ba,initialValue:()=>n==="dark"?"dark":"auto",...typeof n=="object"?n:{}}):oe(!1),r=oe(ge?location.hash:"");return ge&&window.addEventListener("hashchange",()=>{r.value=location.hash}),Fe(()=>e.data,()=>{r.value=ge?location.hash:""}),{site:t,theme:ie(()=>t.value.themeConfig),page:ie(()=>e.data),frontmatter:ie(()=>e.data.frontmatter),params:ie(()=>e.data.params),lang:ie(()=>t.value.lang),dir:ie(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:ie(()=>t.value.localeIndex||"root"),title:ie(()=>Do(t.value,e.data)),description:ie(()=>e.data.description||t.value.description),isDark:s,hash:ie(()=>r.value)}}function sf(){const e=Ot(nf);if(!e)throw new Error("vitepress data not properly injected in app");return e}function rf(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function ti(e){return Ho.test(e)||!e.startsWith("/")?e:rf(mt.value.base,e)}function of(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),ge){const n="/GeometryOps.jl/previews/PR239/";t=ei(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];if(s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),!s)return null;t=`${n}assets/${t}.${s}.js`}else t=`./${ei(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let Tn=[];function Jf(e){Tn.push(e),Bn(()=>{Tn=Tn.filter(t=>t!==e)})}function lf(){let e=mt.value.scrollOffset,t=0,n=24;if(typeof e=="object"&&"padding"in e&&(n=e.padding,e=e.selector),typeof e=="number")t=e;else if(typeof e=="string")t=ni(e,n);else if(Array.isArray(e))for(const s of e){const r=ni(s,n);if(r){t=r;break}}return t}function ni(e,t){const n=document.querySelector(e);if(!n)return 0;const s=n.getBoundingClientRect().bottom;return s<0?0:s+t}const cf=Symbol(),Vo="http://a.com",af=()=>({path:"/",component:null,data:$o});function zf(e,t){const n=jn(af()),s={route:n,go:r};async function r(l=ge?location.href:"/"){var c,f;l=gs(l),await((c=s.onBeforeRouteChange)==null?void 0:c.call(s,l))!==!1&&(ge&&l!==gs(location.href)&&(history.replaceState({scrollPosition:window.scrollY},""),history.pushState({},"",l)),await o(l),await((f=s.onAfterRouteChanged)==null?void 0:f.call(s,l)))}let i=null;async function o(l,c=0,f=!1){var y,v;if(await((y=s.onBeforePageLoad)==null?void 0:y.call(s,l))===!1)return;const a=new URL(l,Vo),h=i=a.pathname;try{let S=await e(h);if(!S)throw new Error(`Page not found: ${h}`);if(i===h){i=null;const{default:_,__pageData:K}=S;if(!_)throw new Error(`Invalid route component: ${_}`);await((v=s.onAfterPageLoad)==null?void 0:v.call(s,l)),n.path=ge?h:ti(h),n.component=wn(_),n.data=wn(K),ge&&Un(()=>{let N=mt.value.base+K.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!mt.value.cleanUrls&&!N.endsWith("/")&&(N+=".html"),N!==a.pathname&&(a.pathname=N,l=N+a.search+a.hash,history.replaceState({},"",l)),a.hash&&!c){let j=null;try{j=document.getElementById(decodeURIComponent(a.hash).slice(1))}catch(p){console.warn(p)}if(j){si(j,a.hash);return}}window.scrollTo(0,c)})}}catch(S){if(!/fetch|Page not found/.test(S.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(S),!f)try{const _=await fetch(mt.value.base+"hashmap.json");window.__VP_HASH_MAP__=await _.json(),await o(l,c,!0);return}catch{}if(i===h){i=null,n.path=ge?h:ti(h),n.component=t?wn(t):null;const _=ge?h.replace(/(^|\/)$/,"$1index").replace(/(\.html)?$/,".md").replace(/^\//,""):"404.md";n.data={...$o,relativePath:_}}}}return ge&&(history.state===null&&history.replaceState({},""),window.addEventListener("click",l=>{if(l.defaultPrevented||!(l.target instanceof Element)||l.target.closest("button")||l.button!==0||l.ctrlKey||l.shiftKey||l.altKey||l.metaKey)return;const c=l.target.closest("a");if(!c||c.closest(".vp-raw")||c.hasAttribute("download")||c.hasAttribute("target"))return;const f=c.getAttribute("href")??(c instanceof SVGAElement?c.getAttribute("xlink:href"):null);if(f==null)return;const{href:a,origin:h,pathname:y,hash:v,search:S}=new URL(f,c.baseURI),_=new URL(location.href);h===_.origin&&tf(y)&&(l.preventDefault(),y===_.pathname&&S===_.search?(v!==_.hash&&(history.pushState({},"",a),window.dispatchEvent(new HashChangeEvent("hashchange",{oldURL:_.href,newURL:a}))),v?si(c,v,c.classList.contains("header-anchor")):window.scrollTo(0,0)):r(a))},{capture:!0}),window.addEventListener("popstate",async l=>{var c;l.state!==null&&(await o(gs(location.href),l.state&&l.state.scrollPosition||0),(c=s.onAfterRouteChanged)==null||c.call(s,location.href))}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function ff(){const e=Ot(cf);if(!e)throw new Error("useRouter() is called without provider.");return e}function Uo(){return ff().route}function si(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(r){console.warn(r)}if(s){let r=function(){!n||Math.abs(o-window.scrollY)>window.innerHeight?window.scrollTo(0,o):window.scrollTo({left:0,top:o,behavior:"smooth"})};const i=parseInt(window.getComputedStyle(s).paddingTop,10),o=window.scrollY+s.getBoundingClientRect().top-lf()+i;requestAnimationFrame(r)}}function gs(e){const t=new URL(e,Vo);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),mt.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const yn=()=>Tn.forEach(e=>e()),Qf=Ys({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=Uo(),{frontmatter:n,site:s}=sf();return Fe(n,yn,{deep:!0,flush:"post"}),()=>Ls(e.as,s.value.contentProps??{style:{position:"relative"}},[t.component?Ls(t.component,{onVnodeMounted:yn,onVnodeUpdated:yn,onVnodeUnmounted:yn}):"404 Page Not Found"])}}),uf="modulepreload",df=function(e){return"/GeometryOps.jl/previews/PR239/"+e},ri={},Zf=function(t,n,s){let r=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),l=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));r=Promise.allSettled(n.map(c=>{if(c=df(c),c in ri)return;ri[c]=!0;const f=c.endsWith(".css"),a=f?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${a}`))return;const h=document.createElement("link");if(h.rel=f?"stylesheet":uf,f||(h.as="script"),h.crossOrigin="",h.href=c,l&&h.setAttribute("nonce",l),document.head.appendChild(h),f)return new Promise((y,v)=>{h.addEventListener("load",y),h.addEventListener("error",()=>v(new Error(`Unable to preload CSS for ${c}`)))})}))}function i(o){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=o,window.dispatchEvent(l),!l.defaultPrevented)throw o}return r.then(o=>{for(const l of o||[])l.status==="rejected"&&i(l.reason);return t().catch(i)})},eu=Ys({setup(e,{slots:t}){const n=oe(!1);return Lt(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function tu(){ge&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const s=(n=t.parentElement)==null?void 0:n.parentElement;if(!s)return;const r=Array.from(s.querySelectorAll("input")).indexOf(t);if(r<0)return;const i=s.querySelector(".blocks");if(!i)return;const o=Array.from(i.children).find(f=>f.classList.contains("active"));if(!o)return;const l=i.children[r];if(!l||o===l)return;o.classList.remove("active"),l.classList.add("active");const c=s==null?void 0:s.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function nu(){if(ge){const e=new WeakMap;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const r=n.parentElement,i=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!r||!i)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(r.className),l=[".vp-copy-ignore",".diff.remove"],c=i.cloneNode(!0);c.querySelectorAll(l.join(",")).forEach(a=>a.remove());let f=c.textContent||"";o&&(f=f.replace(/^ *(\$|>) /gm,"").trim()),hf(f).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const a=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,a)})}})}}async function hf(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),r=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),r&&(s.removeAllRanges(),s.addRange(r)),n&&n.focus()}}function su(e,t){let n=!0,s=[];const r=i=>{if(n){n=!1,i.forEach(l=>{const c=ms(l);for(const f of document.head.children)if(f.isEqualNode(c)){s.push(f);return}});return}const o=i.map(ms);s.forEach((l,c)=>{const f=o.findIndex(a=>a==null?void 0:a.isEqualNode(l??null));f!==-1?delete o[f]:(l==null||l.remove(),delete s[c])}),o.forEach(l=>l&&document.head.appendChild(l)),s=[...s,...o].filter(Boolean)};Zs(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[],f=Do(o,i);f!==document.title&&(document.title=f);const a=l||o.description;let h=document.querySelector("meta[name=description]");h?h.getAttribute("content")!==a&&h.setAttribute("content",a):ms(["meta",{name:"description",content:a}]),r(jo(o.head,gf(c)))})}function ms([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),e==="script"&&t.async==null&&(s.async=!1),s}function pf(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function gf(e){return e.filter(t=>!pf(t))}const ys=new Set,ko=()=>document.createElement("link"),mf=e=>{const t=ko();t.rel="prefetch",t.href=e,document.head.appendChild(t)},yf=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let vn;const vf=ge&&(vn=ko())&&vn.relList&&vn.relList.supports&&vn.relList.supports("prefetch")?mf:yf;function ru(){if(!ge||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(o=>{if(o.isIntersecting){const l=o.target;n.unobserve(l);const{pathname:c}=l;if(!ys.has(c)){ys.add(c);const f=of(c);f&&vf(f)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{hostname:o,pathname:l}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||i.target!=="_blank"&&o===location.hostname&&(l!==location.pathname?n.observe(i):ys.add(l))})})};Lt(s);const r=Uo();Fe(()=>r.path,s),Bn(()=>{n&&n.disconnect()})}export{Ki as $,lf as A,Sf as B,Ef as C,qs as D,Jf as E,xe as F,ce as G,xf as H,Ho as I,Uo as J,$c as K,Ot as L,Gf as M,Ds as N,kf as O,Un as P,qf as Q,ge as R,Vn as S,Lf as T,wf as U,Zf as V,Wf as W,mc as X,Ff as Y,Cf as Z,Df as _,_o as a,Nf as a0,Af as a1,jn as a2,Ll as a3,Ls as a4,Mf as a5,su as a6,cf as a7,Xf as a8,nf as a9,Qf as aa,eu as ab,mt as ac,$f as ad,zf as ae,of as af,ru as ag,nu as ah,tu as ai,Be as aj,Lo as ak,jf as al,tr as am,Uf as an,Kf as ao,Bf as ap,Vf as aq,ff as ar,Pt as as,_f as at,If as au,fe as av,bf as aw,wn as ax,Hf as ay,Yf as az,Ms as b,Of as c,Ys as d,Pf as e,tf as f,ti as g,ie as h,Ya as i,vo as j,Oi as k,Ga as l,Io as m,js as n,Os as o,oe as p,Fe as q,Tf as r,Zs as s,sl as t,sf as u,Lt as v,Ul as w,Bn as x,Rf as y,nc as z}; diff --git a/previews/PR239/assets/chunks/theme.CkNAWswv.js b/previews/PR239/assets/chunks/theme.CkNAWswv.js new file mode 100644 index 000000000..f4de653df --- /dev/null +++ b/previews/PR239/assets/chunks/theme.CkNAWswv.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.B2uKxNr_.js","assets/chunks/framework.onQNwZ2I.js"])))=>i.map(i=>d[i]); +import{d as m,o as a,c as u,r as c,n as I,a as z,t as w,b as g,w as f,e as h,T as de,_ as $,u as Ge,i as je,f as ze,g as pe,h as y,j as v,k as i,l as K,m as re,p as T,q as F,s as Z,v as O,x as ve,y as fe,z as Ke,A as Re,B as R,F as M,C as H,D as Ve,E as x,G as k,H as E,I as Te,J as ee,K as j,L as q,M as We,N as Ne,O as ie,P as he,Q as we,R as te,S as qe,U as Je,V as Ye,W as Ie,X as me,Y as Xe,Z as Qe,$ as Ze,a0 as xe,a1 as Me,a2 as et,a3 as tt,a4 as nt}from"./framework.onQNwZ2I.js";const st=m({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(o){return(e,t)=>(a(),u("span",{class:I(["VPBadge",e.type])},[c(e.$slots,"default",{},()=>[z(w(e.text),1)])],2))}}),ot={key:0,class:"VPBackdrop"},at=m({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(o){return(e,t)=>(a(),g(de,{name:"fade"},{default:f(()=>[e.show?(a(),u("div",ot)):h("",!0)]),_:1}))}}),rt=$(at,[["__scopeId","data-v-b06cdb19"]]),V=Ge;function it(o,e){let t,s=!1;return()=>{t&&clearTimeout(t),s?t=setTimeout(o,e):(o(),(s=!0)&&setTimeout(()=>s=!1,e))}}function le(o){return/^\//.test(o)?o:`/${o}`}function _e(o){const{pathname:e,search:t,hash:s,protocol:n}=new URL(o,"http://a.com");if(je(o)||o.startsWith("#")||!n.startsWith("http")||!ze(e))return o;const{site:r}=V(),l=e.endsWith("/")||e.endsWith(".html")?o:o.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,r.value.cleanUrls?"":".html")}${t}${s}`);return pe(l)}function Y({correspondingLink:o=!1}={}){const{site:e,localeIndex:t,page:s,theme:n,hash:r}=V(),l=y(()=>{var p,b;return{label:(p=e.value.locales[t.value])==null?void 0:p.label,link:((b=e.value.locales[t.value])==null?void 0:b.link)||(t.value==="root"?"/":`/${t.value}/`)}});return{localeLinks:y(()=>Object.entries(e.value.locales).flatMap(([p,b])=>l.value.label===b.label?[]:{text:b.label,link:lt(b.link||(p==="root"?"/":`/${p}/`),n.value.i18nRouting!==!1&&o,s.value.relativePath.slice(l.value.link.length-1),!e.value.cleanUrls)+r.value})),currentLang:l}}function lt(o,e,t,s){return e?o.replace(/\/$/,"")+le(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,s?".html":"")):o}const ct={class:"NotFound"},ut={class:"code"},dt={class:"title"},pt={class:"quote"},vt={class:"action"},ft=["href","aria-label"],ht=m({__name:"NotFound",setup(o){const{theme:e}=V(),{currentLang:t}=Y();return(s,n)=>{var r,l,d,p,b;return a(),u("div",ct,[v("p",ut,w(((r=i(e).notFound)==null?void 0:r.code)??"404"),1),v("h1",dt,w(((l=i(e).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),n[0]||(n[0]=v("div",{class:"divider"},null,-1)),v("blockquote",pt,w(((d=i(e).notFound)==null?void 0:d.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),v("div",vt,[v("a",{class:"link",href:i(pe)(i(t).link),"aria-label":((p=i(e).notFound)==null?void 0:p.linkLabel)??"go to home"},w(((b=i(e).notFound)==null?void 0:b.linkText)??"Take me home"),9,ft)])])}}}),mt=$(ht,[["__scopeId","data-v-951cab6c"]]);function Ae(o,e){if(Array.isArray(o))return X(o);if(o==null)return[];e=le(e);const t=Object.keys(o).sort((n,r)=>r.split("/").length-n.split("/").length).find(n=>e.startsWith(le(n))),s=t?o[t]:[];return Array.isArray(s)?X(s):X(s.items,s.base)}function _t(o){const e=[];let t=0;for(const s in o){const n=o[s];if(n.items){t=e.push(n);continue}e[t]||e.push({items:[]}),e[t].items.push(n)}return e}function bt(o){const e=[];function t(s){for(const n of s)n.text&&n.link&&e.push({text:n.text,link:n.link,docFooterText:n.docFooterText}),n.items&&t(n.items)}return t(o),e}function ce(o,e){return Array.isArray(e)?e.some(t=>ce(o,t)):K(o,e.link)?!0:e.items?ce(o,e.items):!1}function X(o,e){return[...o].map(t=>{const s={...t},n=s.base||e;return n&&s.link&&(s.link=n+s.link),s.items&&(s.items=X(s.items,n)),s})}function U(){const{frontmatter:o,page:e,theme:t}=V(),s=re("(min-width: 960px)"),n=T(!1),r=y(()=>{const C=t.value.sidebar,N=e.value.relativePath;return C?Ae(C,N):[]}),l=T(r.value);F(r,(C,N)=>{JSON.stringify(C)!==JSON.stringify(N)&&(l.value=r.value)});const d=y(()=>o.value.sidebar!==!1&&l.value.length>0&&o.value.layout!=="home"),p=y(()=>b?o.value.aside==null?t.value.aside==="left":o.value.aside==="left":!1),b=y(()=>o.value.layout==="home"?!1:o.value.aside!=null?!!o.value.aside:t.value.aside!==!1),L=y(()=>d.value&&s.value),_=y(()=>d.value?_t(l.value):[]);function P(){n.value=!0}function S(){n.value=!1}function A(){n.value?S():P()}return{isOpen:n,sidebar:l,sidebarGroups:_,hasSidebar:d,hasAside:b,leftAside:p,isSidebarEnabled:L,open:P,close:S,toggle:A}}function kt(o,e){let t;Z(()=>{t=o.value?document.activeElement:void 0}),O(()=>{window.addEventListener("keyup",s)}),ve(()=>{window.removeEventListener("keyup",s)});function s(n){n.key==="Escape"&&o.value&&(e(),t==null||t.focus())}}function gt(o){const{page:e,hash:t}=V(),s=T(!1),n=y(()=>o.value.collapsed!=null),r=y(()=>!!o.value.link),l=T(!1),d=()=>{l.value=K(e.value.relativePath,o.value.link)};F([e,o,t],d),O(d);const p=y(()=>l.value?!0:o.value.items?ce(e.value.relativePath,o.value.items):!1),b=y(()=>!!(o.value.items&&o.value.items.length));Z(()=>{s.value=!!(n.value&&o.value.collapsed)}),fe(()=>{(l.value||p.value)&&(s.value=!1)});function L(){n.value&&(s.value=!s.value)}return{collapsed:s,collapsible:n,isLink:r,isActiveLink:l,hasActiveLink:p,hasChildren:b,toggle:L}}function $t(){const{hasSidebar:o}=U(),e=re("(min-width: 960px)"),t=re("(min-width: 1280px)");return{isAsideEnabled:y(()=>!t.value&&!e.value?!1:o.value?t.value:e.value)}}const ue=[];function Ce(o){return typeof o.outline=="object"&&!Array.isArray(o.outline)&&o.outline.label||o.outlineTitle||"On this page"}function be(o){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const s=Number(t.tagName[1]);return{element:t,title:yt(t),link:"#"+t.id,level:s}});return Pt(e,o)}function yt(o){let e="";for(const t of o.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor")||t.classList.contains("ignore-header"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function Pt(o,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[s,n]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;return Vt(o,s,n)}function St(o,e){const{isAsideEnabled:t}=$t(),s=it(r,100);let n=null;O(()=>{requestAnimationFrame(r),window.addEventListener("scroll",s)}),Ke(()=>{l(location.hash)}),ve(()=>{window.removeEventListener("scroll",s)});function r(){if(!t.value)return;const d=window.scrollY,p=window.innerHeight,b=document.body.offsetHeight,L=Math.abs(d+p-b)<1,_=ue.map(({element:S,link:A})=>({link:A,top:Lt(S)})).filter(({top:S})=>!Number.isNaN(S)).sort((S,A)=>S.top-A.top);if(!_.length){l(null);return}if(d<1){l(null);return}if(L){l(_[_.length-1].link);return}let P=null;for(const{link:S,top:A}of _){if(A>d+Re()+4)break;P=S}l(P)}function l(d){n&&n.classList.remove("active"),d==null?n=null:n=o.value.querySelector(`a[href="${decodeURIComponent(d)}"]`);const p=n;p?(p.classList.add("active"),e.value.style.top=p.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function Lt(o){let e=0;for(;o!==document.body;){if(o===null)return NaN;e+=o.offsetTop,o=o.offsetParent}return e}function Vt(o,e,t){ue.length=0;const s=[],n=[];return o.forEach(r=>{const l={...r,children:[]};let d=n[n.length-1];for(;d&&d.level>=l.level;)n.pop(),d=n[n.length-1];if(l.element.classList.contains("ignore-header")||d&&"shouldIgnore"in d){n.push({level:l.level,shouldIgnore:!0});return}l.level>t||l.level{const n=R("VPDocOutlineItem",!0);return a(),u("ul",{class:I(["VPDocOutlineItem",t.root?"root":"nested"])},[(a(!0),u(M,null,H(t.headers,({children:r,link:l,title:d})=>(a(),u("li",null,[v("a",{class:"outline-link",href:l,onClick:e,title:d},w(d),9,Tt),r!=null&&r.length?(a(),g(n,{key:0,headers:r},null,8,["headers"])):h("",!0)]))),256))],2)}}}),He=$(Nt,[["__scopeId","data-v-3f927ebe"]]),wt={class:"content"},It={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},Mt=m({__name:"VPDocAsideOutline",setup(o){const{frontmatter:e,theme:t}=V(),s=Ve([]);x(()=>{s.value=be(e.value.outline??t.value.outline)});const n=T(),r=T();return St(n,r),(l,d)=>(a(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:I(["VPDocAsideOutline",{"has-outline":s.value.length>0}]),ref_key:"container",ref:n},[v("div",wt,[v("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),v("div",It,w(i(Ce)(i(t))),1),k(He,{headers:s.value,root:!0},null,8,["headers"])])],2))}}),At=$(Mt,[["__scopeId","data-v-b38bf2ff"]]),Ct={class:"VPDocAsideCarbonAds"},Ht=m({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(o){const e=()=>null;return(t,s)=>(a(),u("div",Ct,[k(i(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),Bt={class:"VPDocAside"},Et=m({__name:"VPDocAside",setup(o){const{theme:e}=V();return(t,s)=>(a(),u("div",Bt,[c(t.$slots,"aside-top",{},void 0,!0),c(t.$slots,"aside-outline-before",{},void 0,!0),k(At),c(t.$slots,"aside-outline-after",{},void 0,!0),s[0]||(s[0]=v("div",{class:"spacer"},null,-1)),c(t.$slots,"aside-ads-before",{},void 0,!0),i(e).carbonAds?(a(),g(Ht,{key:0,"carbon-ads":i(e).carbonAds},null,8,["carbon-ads"])):h("",!0),c(t.$slots,"aside-ads-after",{},void 0,!0),c(t.$slots,"aside-bottom",{},void 0,!0)]))}}),Dt=$(Et,[["__scopeId","data-v-6d7b3c46"]]);function Ft(){const{theme:o,page:e}=V();return y(()=>{const{text:t="Edit this page",pattern:s=""}=o.value.editLink||{};let n;return typeof s=="function"?n=s(e.value):n=s.replace(/:path/g,e.value.filePath),{url:n,text:t}})}function Ot(){const{page:o,theme:e,frontmatter:t}=V();return y(()=>{var b,L,_,P,S,A,C,N;const s=Ae(e.value.sidebar,o.value.relativePath),n=bt(s),r=Ut(n,B=>B.link.replace(/[?#].*$/,"")),l=r.findIndex(B=>K(o.value.relativePath,B.link)),d=((b=e.value.docFooter)==null?void 0:b.prev)===!1&&!t.value.prev||t.value.prev===!1,p=((L=e.value.docFooter)==null?void 0:L.next)===!1&&!t.value.next||t.value.next===!1;return{prev:d?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((_=r[l-1])==null?void 0:_.docFooterText)??((P=r[l-1])==null?void 0:P.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((S=r[l-1])==null?void 0:S.link)},next:p?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((A=r[l+1])==null?void 0:A.docFooterText)??((C=r[l+1])==null?void 0:C.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((N=r[l+1])==null?void 0:N.link)}}})}function Ut(o,e){const t=new Set;return o.filter(s=>{const n=e(s);return t.has(n)?!1:t.add(n)})}const D=m({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(o){const e=o,t=y(()=>e.tag??(e.href?"a":"span")),s=y(()=>e.href&&Te.test(e.href)||e.target==="_blank");return(n,r)=>(a(),g(E(t.value),{class:I(["VPLink",{link:n.href,"vp-external-link-icon":s.value,"no-icon":n.noIcon}]),href:n.href?i(_e)(n.href):void 0,target:n.target??(s.value?"_blank":void 0),rel:n.rel??(s.value?"noreferrer":void 0)},{default:f(()=>[c(n.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Gt={class:"VPLastUpdated"},jt=["datetime"],zt=m({__name:"VPDocFooterLastUpdated",setup(o){const{theme:e,page:t,lang:s}=V(),n=y(()=>new Date(t.value.lastUpdated)),r=y(()=>n.value.toISOString()),l=T("");return O(()=>{Z(()=>{var d,p,b;l.value=new Intl.DateTimeFormat((p=(d=e.value.lastUpdated)==null?void 0:d.formatOptions)!=null&&p.forceLocale?s.value:void 0,((b=e.value.lastUpdated)==null?void 0:b.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(n.value)})}),(d,p)=>{var b;return a(),u("p",Gt,[z(w(((b=i(e).lastUpdated)==null?void 0:b.text)||i(e).lastUpdatedText||"Last updated")+": ",1),v("time",{datetime:r.value},w(l.value),9,jt)])}}}),Kt=$(zt,[["__scopeId","data-v-475f71b8"]]),Rt={key:0,class:"VPDocFooter"},Wt={key:0,class:"edit-info"},qt={key:0,class:"edit-link"},Jt={key:1,class:"last-updated"},Yt={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Xt={class:"pager"},Qt=["innerHTML"],Zt=["innerHTML"],xt={class:"pager"},en=["innerHTML"],tn=["innerHTML"],nn=m({__name:"VPDocFooter",setup(o){const{theme:e,page:t,frontmatter:s}=V(),n=Ft(),r=Ot(),l=y(()=>e.value.editLink&&s.value.editLink!==!1),d=y(()=>t.value.lastUpdated),p=y(()=>l.value||d.value||r.value.prev||r.value.next);return(b,L)=>{var _,P,S,A;return p.value?(a(),u("footer",Rt,[c(b.$slots,"doc-footer-before",{},void 0,!0),l.value||d.value?(a(),u("div",Wt,[l.value?(a(),u("div",qt,[k(D,{class:"edit-link-button",href:i(n).url,"no-icon":!0},{default:f(()=>[L[0]||(L[0]=v("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),z(" "+w(i(n).text),1)]),_:1},8,["href"])])):h("",!0),d.value?(a(),u("div",Jt,[k(Kt)])):h("",!0)])):h("",!0),(_=i(r).prev)!=null&&_.link||(P=i(r).next)!=null&&P.link?(a(),u("nav",Yt,[L[1]||(L[1]=v("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),v("div",Xt,[(S=i(r).prev)!=null&&S.link?(a(),g(D,{key:0,class:"pager-link prev",href:i(r).prev.link},{default:f(()=>{var C;return[v("span",{class:"desc",innerHTML:((C=i(e).docFooter)==null?void 0:C.prev)||"Previous page"},null,8,Qt),v("span",{class:"title",innerHTML:i(r).prev.text},null,8,Zt)]}),_:1},8,["href"])):h("",!0)]),v("div",xt,[(A=i(r).next)!=null&&A.link?(a(),g(D,{key:0,class:"pager-link next",href:i(r).next.link},{default:f(()=>{var C;return[v("span",{class:"desc",innerHTML:((C=i(e).docFooter)==null?void 0:C.next)||"Next page"},null,8,en),v("span",{class:"title",innerHTML:i(r).next.text},null,8,tn)]}),_:1},8,["href"])):h("",!0)])])):h("",!0)])):h("",!0)}}}),sn=$(nn,[["__scopeId","data-v-4f9813fa"]]),on={class:"container"},an={class:"aside-container"},rn={class:"aside-content"},ln={class:"content"},cn={class:"content-container"},un={class:"main"},dn=m({__name:"VPDoc",setup(o){const{theme:e}=V(),t=ee(),{hasSidebar:s,hasAside:n,leftAside:r}=U(),l=y(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(d,p)=>{const b=R("Content");return a(),u("div",{class:I(["VPDoc",{"has-sidebar":i(s),"has-aside":i(n)}])},[c(d.$slots,"doc-top",{},void 0,!0),v("div",on,[i(n)?(a(),u("div",{key:0,class:I(["aside",{"left-aside":i(r)}])},[p[0]||(p[0]=v("div",{class:"aside-curtain"},null,-1)),v("div",an,[v("div",rn,[k(Dt,null,{"aside-top":f(()=>[c(d.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":f(()=>[c(d.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":f(()=>[c(d.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[c(d.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[c(d.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[c(d.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):h("",!0),v("div",ln,[v("div",cn,[c(d.$slots,"doc-before",{},void 0,!0),v("main",un,[k(b,{class:I(["vp-doc",[l.value,i(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),k(sn,null,{"doc-footer-before":f(()=>[c(d.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),c(d.$slots,"doc-after",{},void 0,!0)])])]),c(d.$slots,"doc-bottom",{},void 0,!0)],2)}}}),pn=$(dn,[["__scopeId","data-v-83890dd9"]]),vn=m({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(o){const e=o,t=y(()=>e.href&&Te.test(e.href)),s=y(()=>e.tag||(e.href?"a":"button"));return(n,r)=>(a(),g(E(s.value),{class:I(["VPButton",[n.size,n.theme]]),href:n.href?i(_e)(n.href):void 0,target:e.target??(t.value?"_blank":void 0),rel:e.rel??(t.value?"noreferrer":void 0)},{default:f(()=>[z(w(n.text),1)]),_:1},8,["class","href","target","rel"]))}}),fn=$(vn,[["__scopeId","data-v-906d7fb4"]]),hn=["src","alt"],mn=m({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(o){return(e,t)=>{const s=R("VPImage",!0);return e.image?(a(),u(M,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),u("img",j({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:i(pe)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,hn)):(a(),u(M,{key:1},[k(s,j({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),k(s,j({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):h("",!0)}}}),Q=$(mn,[["__scopeId","data-v-35a7d0b8"]]),_n={class:"container"},bn={class:"main"},kn={key:0,class:"name"},gn=["innerHTML"],$n=["innerHTML"],yn=["innerHTML"],Pn={key:0,class:"actions"},Sn={key:0,class:"image"},Ln={class:"image-container"},Vn=m({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(o){const e=q("hero-image-slot-exists");return(t,s)=>(a(),u("div",{class:I(["VPHero",{"has-image":t.image||i(e)}])},[v("div",_n,[v("div",bn,[c(t.$slots,"home-hero-info-before",{},void 0,!0),c(t.$slots,"home-hero-info",{},()=>[t.name?(a(),u("h1",kn,[v("span",{innerHTML:t.name,class:"clip"},null,8,gn)])):h("",!0),t.text?(a(),u("p",{key:1,innerHTML:t.text,class:"text"},null,8,$n)):h("",!0),t.tagline?(a(),u("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,yn)):h("",!0)],!0),c(t.$slots,"home-hero-info-after",{},void 0,!0),t.actions?(a(),u("div",Pn,[(a(!0),u(M,null,H(t.actions,n=>(a(),u("div",{key:n.link,class:"action"},[k(fn,{tag:"a",size:"medium",theme:n.theme,text:n.text,href:n.link,target:n.target,rel:n.rel},null,8,["theme","text","href","target","rel"])]))),128))])):h("",!0),c(t.$slots,"home-hero-actions-after",{},void 0,!0)]),t.image||i(e)?(a(),u("div",Sn,[v("div",Ln,[s[0]||(s[0]=v("div",{class:"image-bg"},null,-1)),c(t.$slots,"home-hero-image",{},()=>[t.image?(a(),g(Q,{key:0,class:"image-src",image:t.image},null,8,["image"])):h("",!0)],!0)])])):h("",!0)])],2))}}),Tn=$(Vn,[["__scopeId","data-v-955009fc"]]),Nn=m({__name:"VPHomeHero",setup(o){const{frontmatter:e}=V();return(t,s)=>i(e).hero?(a(),g(Tn,{key:0,class:"VPHomeHero",name:i(e).hero.name,text:i(e).hero.text,tagline:i(e).hero.tagline,image:i(e).hero.image,actions:i(e).hero.actions},{"home-hero-info-before":f(()=>[c(t.$slots,"home-hero-info-before")]),"home-hero-info":f(()=>[c(t.$slots,"home-hero-info")]),"home-hero-info-after":f(()=>[c(t.$slots,"home-hero-info-after")]),"home-hero-actions-after":f(()=>[c(t.$slots,"home-hero-actions-after")]),"home-hero-image":f(()=>[c(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):h("",!0)}}),wn={class:"box"},In={key:0,class:"icon"},Mn=["innerHTML"],An=["innerHTML"],Cn=["innerHTML"],Hn={key:4,class:"link-text"},Bn={class:"link-text-value"},En=m({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(o){return(e,t)=>(a(),g(D,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:f(()=>[v("article",wn,[typeof e.icon=="object"&&e.icon.wrap?(a(),u("div",In,[k(Q,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(a(),g(Q,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(a(),u("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Mn)):h("",!0),v("h2",{class:"title",innerHTML:e.title},null,8,An),e.details?(a(),u("p",{key:3,class:"details",innerHTML:e.details},null,8,Cn)):h("",!0),e.linkText?(a(),u("div",Hn,[v("p",Bn,[z(w(e.linkText)+" ",1),t[0]||(t[0]=v("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):h("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Dn=$(En,[["__scopeId","data-v-f5e9645b"]]),Fn={key:0,class:"VPFeatures"},On={class:"container"},Un={class:"items"},Gn=m({__name:"VPFeatures",props:{features:{}},setup(o){const e=o,t=y(()=>{const s=e.features.length;if(s){if(s===2)return"grid-2";if(s===3)return"grid-3";if(s%3===0)return"grid-6";if(s>3)return"grid-4"}else return});return(s,n)=>s.features?(a(),u("div",Fn,[v("div",On,[v("div",Un,[(a(!0),u(M,null,H(s.features,r=>(a(),u("div",{key:r.title,class:I(["item",[t.value]])},[k(Dn,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText,rel:r.rel,target:r.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):h("",!0)}}),jn=$(Gn,[["__scopeId","data-v-d0a190d7"]]),zn=m({__name:"VPHomeFeatures",setup(o){const{frontmatter:e}=V();return(t,s)=>i(e).features?(a(),g(jn,{key:0,class:"VPHomeFeatures",features:i(e).features},null,8,["features"])):h("",!0)}}),Kn=m({__name:"VPHomeContent",setup(o){const{width:e}=We({initialWidth:0,includeScrollbar:!1});return(t,s)=>(a(),u("div",{class:"vp-doc container",style:Ne(i(e)?{"--vp-offset":`calc(50% - ${i(e)/2}px)`}:{})},[c(t.$slots,"default",{},void 0,!0)],4))}}),Rn=$(Kn,[["__scopeId","data-v-7a48a447"]]),Wn={class:"VPHome"},qn=m({__name:"VPHome",setup(o){const{frontmatter:e}=V();return(t,s)=>{const n=R("Content");return a(),u("div",Wn,[c(t.$slots,"home-hero-before",{},void 0,!0),k(Nn,null,{"home-hero-info-before":f(()=>[c(t.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[c(t.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[c(t.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[c(t.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[c(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(t.$slots,"home-hero-after",{},void 0,!0),c(t.$slots,"home-features-before",{},void 0,!0),k(zn),c(t.$slots,"home-features-after",{},void 0,!0),i(e).markdownStyles!==!1?(a(),g(Rn,{key:0},{default:f(()=>[k(n)]),_:1})):(a(),g(n,{key:1}))])}}}),Jn=$(qn,[["__scopeId","data-v-cbb6ec48"]]),Yn={},Xn={class:"VPPage"};function Qn(o,e){const t=R("Content");return a(),u("div",Xn,[c(o.$slots,"page-top"),k(t),c(o.$slots,"page-bottom")])}const Zn=$(Yn,[["render",Qn]]),xn=m({__name:"VPContent",setup(o){const{page:e,frontmatter:t}=V(),{hasSidebar:s}=U();return(n,r)=>(a(),u("div",{class:I(["VPContent",{"has-sidebar":i(s),"is-home":i(t).layout==="home"}]),id:"VPContent"},[i(e).isNotFound?c(n.$slots,"not-found",{key:0},()=>[k(mt)],!0):i(t).layout==="page"?(a(),g(Zn,{key:1},{"page-top":f(()=>[c(n.$slots,"page-top",{},void 0,!0)]),"page-bottom":f(()=>[c(n.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(t).layout==="home"?(a(),g(Jn,{key:2},{"home-hero-before":f(()=>[c(n.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":f(()=>[c(n.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[c(n.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[c(n.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[c(n.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[c(n.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":f(()=>[c(n.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":f(()=>[c(n.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":f(()=>[c(n.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(t).layout&&i(t).layout!=="doc"?(a(),g(E(i(t).layout),{key:3})):(a(),g(pn,{key:4},{"doc-top":f(()=>[c(n.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":f(()=>[c(n.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":f(()=>[c(n.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":f(()=>[c(n.$slots,"doc-before",{},void 0,!0)]),"doc-after":f(()=>[c(n.$slots,"doc-after",{},void 0,!0)]),"aside-top":f(()=>[c(n.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":f(()=>[c(n.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[c(n.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[c(n.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[c(n.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":f(()=>[c(n.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),es=$(xn,[["__scopeId","data-v-91765379"]]),ts={class:"container"},ns=["innerHTML"],ss=["innerHTML"],os=m({__name:"VPFooter",setup(o){const{theme:e,frontmatter:t}=V(),{hasSidebar:s}=U();return(n,r)=>i(e).footer&&i(t).footer!==!1?(a(),u("footer",{key:0,class:I(["VPFooter",{"has-sidebar":i(s)}])},[v("div",ts,[i(e).footer.message?(a(),u("p",{key:0,class:"message",innerHTML:i(e).footer.message},null,8,ns)):h("",!0),i(e).footer.copyright?(a(),u("p",{key:1,class:"copyright",innerHTML:i(e).footer.copyright},null,8,ss)):h("",!0)])],2)):h("",!0)}}),as=$(os,[["__scopeId","data-v-c970a860"]]);function rs(){const{theme:o,frontmatter:e}=V(),t=Ve([]),s=y(()=>t.value.length>0);return x(()=>{t.value=be(e.value.outline??o.value.outline)}),{headers:t,hasLocalNav:s}}const is={class:"menu-text"},ls={class:"header"},cs={class:"outline"},us=m({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(o){const e=o,{theme:t}=V(),s=T(!1),n=T(0),r=T(),l=T();function d(_){var P;(P=r.value)!=null&&P.contains(_.target)||(s.value=!1)}F(s,_=>{if(_){document.addEventListener("click",d);return}document.removeEventListener("click",d)}),ie("Escape",()=>{s.value=!1}),x(()=>{s.value=!1});function p(){s.value=!s.value,n.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function b(_){_.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),he(()=>{s.value=!1}))}function L(){s.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(_,P)=>(a(),u("div",{class:"VPLocalNavOutlineDropdown",style:Ne({"--vp-vh":n.value+"px"}),ref_key:"main",ref:r},[_.headers.length>0?(a(),u("button",{key:0,onClick:p,class:I({open:s.value})},[v("span",is,w(i(Ce)(i(t))),1),P[0]||(P[0]=v("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(a(),u("button",{key:1,onClick:L},w(i(t).returnToTopLabel||"Return to top"),1)),k(de,{name:"flyout"},{default:f(()=>[s.value?(a(),u("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:b},[v("div",ls,[v("a",{class:"top-link",href:"#",onClick:L},w(i(t).returnToTopLabel||"Return to top"),1)]),v("div",cs,[k(He,{headers:_.headers},null,8,["headers"])])],512)):h("",!0)]),_:1})],4))}}),ds=$(us,[["__scopeId","data-v-bc9dc845"]]),ps={class:"container"},vs=["aria-expanded"],fs={class:"menu-text"},hs=m({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(o){const{theme:e,frontmatter:t}=V(),{hasSidebar:s}=U(),{headers:n}=rs(),{y:r}=we(),l=T(0);O(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),x(()=>{n.value=be(t.value.outline??e.value.outline)});const d=y(()=>n.value.length===0),p=y(()=>d.value&&!s.value),b=y(()=>({VPLocalNav:!0,"has-sidebar":s.value,empty:d.value,fixed:p.value}));return(L,_)=>i(t).layout!=="home"&&(!p.value||i(r)>=l.value)?(a(),u("div",{key:0,class:I(b.value)},[v("div",ps,[i(s)?(a(),u("button",{key:0,class:"menu","aria-expanded":L.open,"aria-controls":"VPSidebarNav",onClick:_[0]||(_[0]=P=>L.$emit("open-menu"))},[_[1]||(_[1]=v("span",{class:"vpi-align-left menu-icon"},null,-1)),v("span",fs,w(i(e).sidebarMenuLabel||"Menu"),1)],8,vs)):h("",!0),k(ds,{headers:i(n),navHeight:l.value},null,8,["headers","navHeight"])])],2)):h("",!0)}}),ms=$(hs,[["__scopeId","data-v-070ab83d"]]);function _s(){const o=T(!1);function e(){o.value=!0,window.addEventListener("resize",n)}function t(){o.value=!1,window.removeEventListener("resize",n)}function s(){o.value?t():e()}function n(){window.outerWidth>=768&&t()}const r=ee();return F(()=>r.path,t),{isScreenOpen:o,openScreen:e,closeScreen:t,toggleScreen:s}}const bs={},ks={class:"VPSwitch",type:"button",role:"switch"},gs={class:"check"},$s={key:0,class:"icon"};function ys(o,e){return a(),u("button",ks,[v("span",gs,[o.$slots.default?(a(),u("span",$s,[c(o.$slots,"default",{},void 0,!0)])):h("",!0)])])}const Ps=$(bs,[["render",ys],["__scopeId","data-v-4a1c76db"]]),Ss=m({__name:"VPSwitchAppearance",setup(o){const{isDark:e,theme:t}=V(),s=q("toggle-appearance",()=>{e.value=!e.value}),n=T("");return fe(()=>{n.value=e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme"}),(r,l)=>(a(),g(Ps,{title:n.value,class:"VPSwitchAppearance","aria-checked":i(e),onClick:i(s)},{default:f(()=>l[0]||(l[0]=[v("span",{class:"vpi-sun sun"},null,-1),v("span",{class:"vpi-moon moon"},null,-1)])),_:1},8,["title","aria-checked","onClick"]))}}),ke=$(Ss,[["__scopeId","data-v-e40a8bb6"]]),Ls={key:0,class:"VPNavBarAppearance"},Vs=m({__name:"VPNavBarAppearance",setup(o){const{site:e}=V();return(t,s)=>i(e).appearance&&i(e).appearance!=="force-dark"&&i(e).appearance!=="force-auto"?(a(),u("div",Ls,[k(ke)])):h("",!0)}}),Ts=$(Vs,[["__scopeId","data-v-af096f4a"]]),ge=T();let Be=!1,ae=0;function Ns(o){const e=T(!1);if(te){!Be&&ws(),ae++;const t=F(ge,s=>{var n,r,l;s===o.el.value||(n=o.el.value)!=null&&n.contains(s)?(e.value=!0,(r=o.onFocus)==null||r.call(o)):(e.value=!1,(l=o.onBlur)==null||l.call(o))});ve(()=>{t(),ae--,ae||Is()})}return qe(e)}function ws(){document.addEventListener("focusin",Ee),Be=!0,ge.value=document.activeElement}function Is(){document.removeEventListener("focusin",Ee)}function Ee(){ge.value=document.activeElement}const Ms={class:"VPMenuLink"},As=["innerHTML"],Cs=m({__name:"VPMenuLink",props:{item:{}},setup(o){const{page:e}=V();return(t,s)=>(a(),u("div",Ms,[k(D,{class:I({active:i(K)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon},{default:f(()=>[v("span",{innerHTML:t.item.text},null,8,As)]),_:1},8,["class","href","target","rel","no-icon"])]))}}),ne=$(Cs,[["__scopeId","data-v-acbfed09"]]),Hs={class:"VPMenuGroup"},Bs={key:0,class:"title"},Es=m({__name:"VPMenuGroup",props:{text:{},items:{}},setup(o){return(e,t)=>(a(),u("div",Hs,[e.text?(a(),u("p",Bs,w(e.text),1)):h("",!0),(a(!0),u(M,null,H(e.items,s=>(a(),u(M,null,["link"in s?(a(),g(ne,{key:0,item:s},null,8,["item"])):h("",!0)],64))),256))]))}}),Ds=$(Es,[["__scopeId","data-v-48c802d0"]]),Fs={class:"VPMenu"},Os={key:0,class:"items"},Us=m({__name:"VPMenu",props:{items:{}},setup(o){return(e,t)=>(a(),u("div",Fs,[e.items?(a(),u("div",Os,[(a(!0),u(M,null,H(e.items,s=>(a(),u(M,{key:JSON.stringify(s)},["link"in s?(a(),g(ne,{key:0,item:s},null,8,["item"])):"component"in s?(a(),g(E(s.component),j({key:1,ref_for:!0},s.props),null,16)):(a(),g(Ds,{key:2,text:s.text,items:s.items},null,8,["text","items"]))],64))),128))])):h("",!0),c(e.$slots,"default",{},void 0,!0)]))}}),Gs=$(Us,[["__scopeId","data-v-7dd3104a"]]),js=["aria-expanded","aria-label"],zs={key:0,class:"text"},Ks=["innerHTML"],Rs={key:1,class:"vpi-more-horizontal icon"},Ws={class:"menu"},qs=m({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(o){const e=T(!1),t=T();Ns({el:t,onBlur:s});function s(){e.value=!1}return(n,r)=>(a(),u("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:r[1]||(r[1]=l=>e.value=!0),onMouseleave:r[2]||(r[2]=l=>e.value=!1)},[v("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":n.label,onClick:r[0]||(r[0]=l=>e.value=!e.value)},[n.button||n.icon?(a(),u("span",zs,[n.icon?(a(),u("span",{key:0,class:I([n.icon,"option-icon"])},null,2)):h("",!0),n.button?(a(),u("span",{key:1,innerHTML:n.button},null,8,Ks)):h("",!0),r[3]||(r[3]=v("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(a(),u("span",Rs))],8,js),v("div",Ws,[k(Gs,{items:n.items},{default:f(()=>[c(n.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),$e=$(qs,[["__scopeId","data-v-04f5c5e9"]]),Js=["href","aria-label","innerHTML"],Ys=m({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(o){const e=o,t=T();O(async()=>{var r;await he();const n=(r=t.value)==null?void 0:r.children[0];n instanceof HTMLElement&&n.className.startsWith("vpi-social-")&&(getComputedStyle(n).maskImage||getComputedStyle(n).webkitMaskImage)==="none"&&n.style.setProperty("--icon",`url('https://api.iconify.design/simple-icons/${e.icon}.svg')`)});const s=y(()=>typeof e.icon=="object"?e.icon.svg:``);return(n,r)=>(a(),u("a",{ref_key:"el",ref:t,class:"VPSocialLink no-icon",href:n.link,"aria-label":n.ariaLabel??(typeof n.icon=="string"?n.icon:""),target:"_blank",rel:"noopener",innerHTML:s.value},null,8,Js))}}),Xs=$(Ys,[["__scopeId","data-v-d26d30cb"]]),Qs={class:"VPSocialLinks"},Zs=m({__name:"VPSocialLinks",props:{links:{}},setup(o){return(e,t)=>(a(),u("div",Qs,[(a(!0),u(M,null,H(e.links,({link:s,icon:n,ariaLabel:r})=>(a(),g(Xs,{key:s,icon:n,link:s,ariaLabel:r},null,8,["icon","link","ariaLabel"]))),128))]))}}),ye=$(Zs,[["__scopeId","data-v-ee7a9424"]]),xs={key:0,class:"group translations"},eo={class:"trans-title"},to={key:1,class:"group"},no={class:"item appearance"},so={class:"label"},oo={class:"appearance-action"},ao={key:2,class:"group"},ro={class:"item social-links"},io=m({__name:"VPNavBarExtra",setup(o){const{site:e,theme:t}=V(),{localeLinks:s,currentLang:n}=Y({correspondingLink:!0}),r=y(()=>s.value.length&&n.value.label||e.value.appearance||t.value.socialLinks);return(l,d)=>r.value?(a(),g($e,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:f(()=>[i(s).length&&i(n).label?(a(),u("div",xs,[v("p",eo,w(i(n).label),1),(a(!0),u(M,null,H(i(s),p=>(a(),g(ne,{key:p.link,item:p},null,8,["item"]))),128))])):h("",!0),i(e).appearance&&i(e).appearance!=="force-dark"&&i(e).appearance!=="force-auto"?(a(),u("div",to,[v("div",no,[v("p",so,w(i(t).darkModeSwitchLabel||"Appearance"),1),v("div",oo,[k(ke)])])])):h("",!0),i(t).socialLinks?(a(),u("div",ao,[v("div",ro,[k(ye,{class:"social-links-list",links:i(t).socialLinks},null,8,["links"])])])):h("",!0)]),_:1})):h("",!0)}}),lo=$(io,[["__scopeId","data-v-925effce"]]),co=["aria-expanded"],uo=m({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(o){return(e,t)=>(a(),u("button",{type:"button",class:I(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=s=>e.$emit("click"))},t[1]||(t[1]=[v("span",{class:"container"},[v("span",{class:"top"}),v("span",{class:"middle"}),v("span",{class:"bottom"})],-1)]),10,co))}}),po=$(uo,[["__scopeId","data-v-5dea55bf"]]),vo=["innerHTML"],fo=m({__name:"VPNavBarMenuLink",props:{item:{}},setup(o){const{page:e}=V();return(t,s)=>(a(),g(D,{class:I({VPNavBarMenuLink:!0,active:i(K)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,tabindex:"0"},{default:f(()=>[v("span",{innerHTML:t.item.text},null,8,vo)]),_:1},8,["class","href","target","rel","no-icon"]))}}),ho=$(fo,[["__scopeId","data-v-956ec74c"]]),mo=m({__name:"VPNavBarMenuGroup",props:{item:{}},setup(o){const e=o,{page:t}=V(),s=r=>"component"in r?!1:"link"in r?K(t.value.relativePath,r.link,!!e.item.activeMatch):r.items.some(s),n=y(()=>s(e.item));return(r,l)=>(a(),g($e,{class:I({VPNavBarMenuGroup:!0,active:i(K)(i(t).relativePath,r.item.activeMatch,!!r.item.activeMatch)||n.value}),button:r.item.text,items:r.item.items},null,8,["class","button","items"]))}}),_o={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},bo=m({__name:"VPNavBarMenu",setup(o){const{theme:e}=V();return(t,s)=>i(e).nav?(a(),u("nav",_o,[s[0]||(s[0]=v("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(a(!0),u(M,null,H(i(e).nav,n=>(a(),u(M,{key:JSON.stringify(n)},["link"in n?(a(),g(ho,{key:0,item:n},null,8,["item"])):"component"in n?(a(),g(E(n.component),j({key:1,ref_for:!0},n.props),null,16)):(a(),g(mo,{key:2,item:n},null,8,["item"]))],64))),128))])):h("",!0)}}),ko=$(bo,[["__scopeId","data-v-e6d46098"]]);function go(o){const{localeIndex:e,theme:t}=V();function s(n){var A,C,N;const r=n.split("."),l=(A=t.value.search)==null?void 0:A.options,d=l&&typeof l=="object",p=d&&((N=(C=l.locales)==null?void 0:C[e.value])==null?void 0:N.translations)||null,b=d&&l.translations||null;let L=p,_=b,P=o;const S=r.pop();for(const B of r){let G=null;const W=P==null?void 0:P[B];W&&(G=P=W);const se=_==null?void 0:_[B];se&&(G=_=se);const oe=L==null?void 0:L[B];oe&&(G=L=oe),W||(P=G),se||(_=G),oe||(L=G)}return(L==null?void 0:L[S])??(_==null?void 0:_[S])??(P==null?void 0:P[S])??""}return s}const $o=["aria-label"],yo={class:"DocSearch-Button-Container"},Po={class:"DocSearch-Button-Placeholder"},Pe=m({__name:"VPNavBarSearchButton",setup(o){const t=go({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(s,n)=>(a(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":i(t)("button.buttonAriaLabel")},[v("span",yo,[n[0]||(n[0]=v("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1)),v("span",Po,w(i(t)("button.buttonText")),1)]),n[1]||(n[1]=v("span",{class:"DocSearch-Button-Keys"},[v("kbd",{class:"DocSearch-Button-Key"}),v("kbd",{class:"DocSearch-Button-Key"},"K")],-1))],8,$o))}}),So={class:"VPNavBarSearch"},Lo={id:"local-search"},Vo={key:1,id:"docsearch"},To=m({__name:"VPNavBarSearch",setup(o){const e=Je(()=>Ye(()=>import("./VPLocalSearchBox.B2uKxNr_.js"),__vite__mapDeps([0,1]))),t=()=>null,{theme:s}=V(),n=T(!1),r=T(!1);O(()=>{});function l(){n.value||(n.value=!0,setTimeout(d,16))}function d(){const _=new Event("keydown");_.key="k",_.metaKey=!0,window.dispatchEvent(_),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||d()},16)}function p(_){const P=_.target,S=P.tagName;return P.isContentEditable||S==="INPUT"||S==="SELECT"||S==="TEXTAREA"}const b=T(!1);ie("k",_=>{(_.ctrlKey||_.metaKey)&&(_.preventDefault(),b.value=!0)}),ie("/",_=>{p(_)||(_.preventDefault(),b.value=!0)});const L="local";return(_,P)=>{var S;return a(),u("div",So,[i(L)==="local"?(a(),u(M,{key:0},[b.value?(a(),g(i(e),{key:0,onClose:P[0]||(P[0]=A=>b.value=!1)})):h("",!0),v("div",Lo,[k(Pe,{onClick:P[1]||(P[1]=A=>b.value=!0)})])],64)):i(L)==="algolia"?(a(),u(M,{key:1},[n.value?(a(),g(i(t),{key:0,algolia:((S=i(s).search)==null?void 0:S.options)??i(s).algolia,onVnodeBeforeMount:P[2]||(P[2]=A=>r.value=!0)},null,8,["algolia"])):h("",!0),r.value?h("",!0):(a(),u("div",Vo,[k(Pe,{onClick:l})]))],64)):h("",!0)])}}}),No=m({__name:"VPNavBarSocialLinks",setup(o){const{theme:e}=V();return(t,s)=>i(e).socialLinks?(a(),g(ye,{key:0,class:"VPNavBarSocialLinks",links:i(e).socialLinks},null,8,["links"])):h("",!0)}}),wo=$(No,[["__scopeId","data-v-164c457f"]]),Io=["href","rel","target"],Mo=["innerHTML"],Ao={key:2},Co=m({__name:"VPNavBarTitle",setup(o){const{site:e,theme:t}=V(),{hasSidebar:s}=U(),{currentLang:n}=Y(),r=y(()=>{var p;return typeof t.value.logoLink=="string"?t.value.logoLink:(p=t.value.logoLink)==null?void 0:p.link}),l=y(()=>{var p;return typeof t.value.logoLink=="string"||(p=t.value.logoLink)==null?void 0:p.rel}),d=y(()=>{var p;return typeof t.value.logoLink=="string"||(p=t.value.logoLink)==null?void 0:p.target});return(p,b)=>(a(),u("div",{class:I(["VPNavBarTitle",{"has-sidebar":i(s)}])},[v("a",{class:"title",href:r.value??i(_e)(i(n).link),rel:l.value,target:d.value},[c(p.$slots,"nav-bar-title-before",{},void 0,!0),i(t).logo?(a(),g(Q,{key:0,class:"logo",image:i(t).logo},null,8,["image"])):h("",!0),i(t).siteTitle?(a(),u("span",{key:1,innerHTML:i(t).siteTitle},null,8,Mo)):i(t).siteTitle===void 0?(a(),u("span",Ao,w(i(e).title),1)):h("",!0),c(p.$slots,"nav-bar-title-after",{},void 0,!0)],8,Io)],2))}}),Ho=$(Co,[["__scopeId","data-v-0f4f798b"]]),Bo={class:"items"},Eo={class:"title"},Do=m({__name:"VPNavBarTranslations",setup(o){const{theme:e}=V(),{localeLinks:t,currentLang:s}=Y({correspondingLink:!0});return(n,r)=>i(t).length&&i(s).label?(a(),g($e,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:i(e).langMenuLabel||"Change language"},{default:f(()=>[v("div",Bo,[v("p",Eo,w(i(s).label),1),(a(!0),u(M,null,H(i(t),l=>(a(),g(ne,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):h("",!0)}}),Fo=$(Do,[["__scopeId","data-v-c80d9ad0"]]),Oo={class:"wrapper"},Uo={class:"container"},Go={class:"title"},jo={class:"content"},zo={class:"content-body"},Ko=m({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(o){const e=o,{y:t}=we(),{hasSidebar:s}=U(),{frontmatter:n}=V(),r=T({});return fe(()=>{r.value={"has-sidebar":s.value,home:n.value.layout==="home",top:t.value===0,"screen-open":e.isScreenOpen}}),(l,d)=>(a(),u("div",{class:I(["VPNavBar",r.value])},[v("div",Oo,[v("div",Uo,[v("div",Go,[k(Ho,null,{"nav-bar-title-before":f(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),v("div",jo,[v("div",zo,[c(l.$slots,"nav-bar-content-before",{},void 0,!0),k(To,{class:"search"}),k(ko,{class:"menu"}),k(Fo,{class:"translations"}),k(Ts,{class:"appearance"}),k(wo,{class:"social-links"}),k(lo,{class:"extra"}),c(l.$slots,"nav-bar-content-after",{},void 0,!0),k(po,{class:"hamburger",active:l.isScreenOpen,onClick:d[0]||(d[0]=p=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),d[1]||(d[1]=v("div",{class:"divider"},[v("div",{class:"divider-line"})],-1))],2))}}),Ro=$(Ko,[["__scopeId","data-v-822684d1"]]),Wo={key:0,class:"VPNavScreenAppearance"},qo={class:"text"},Jo=m({__name:"VPNavScreenAppearance",setup(o){const{site:e,theme:t}=V();return(s,n)=>i(e).appearance&&i(e).appearance!=="force-dark"&&i(e).appearance!=="force-auto"?(a(),u("div",Wo,[v("p",qo,w(i(t).darkModeSwitchLabel||"Appearance"),1),k(ke)])):h("",!0)}}),Yo=$(Jo,[["__scopeId","data-v-ffb44008"]]),Xo=["innerHTML"],Qo=m({__name:"VPNavScreenMenuLink",props:{item:{}},setup(o){const e=q("close-screen");return(t,s)=>(a(),g(D,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,onClick:i(e)},{default:f(()=>[v("span",{innerHTML:t.item.text},null,8,Xo)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),Zo=$(Qo,[["__scopeId","data-v-735512b8"]]),xo=["innerHTML"],ea=m({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(o){const e=q("close-screen");return(t,s)=>(a(),g(D,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,onClick:i(e)},{default:f(()=>[v("span",{innerHTML:t.item.text},null,8,xo)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),De=$(ea,[["__scopeId","data-v-372ae7c0"]]),ta={class:"VPNavScreenMenuGroupSection"},na={key:0,class:"title"},sa=m({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(o){return(e,t)=>(a(),u("div",ta,[e.text?(a(),u("p",na,w(e.text),1)):h("",!0),(a(!0),u(M,null,H(e.items,s=>(a(),g(De,{key:s.text,item:s},null,8,["item"]))),128))]))}}),oa=$(sa,[["__scopeId","data-v-4b8941ac"]]),aa=["aria-controls","aria-expanded"],ra=["innerHTML"],ia=["id"],la={key:0,class:"item"},ca={key:1,class:"item"},ua={key:2,class:"group"},da=m({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(o){const e=o,t=T(!1),s=y(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function n(){t.value=!t.value}return(r,l)=>(a(),u("div",{class:I(["VPNavScreenMenuGroup",{open:t.value}])},[v("button",{class:"button","aria-controls":s.value,"aria-expanded":t.value,onClick:n},[v("span",{class:"button-text",innerHTML:r.text},null,8,ra),l[0]||(l[0]=v("span",{class:"vpi-plus button-icon"},null,-1))],8,aa),v("div",{id:s.value,class:"items"},[(a(!0),u(M,null,H(r.items,d=>(a(),u(M,{key:JSON.stringify(d)},["link"in d?(a(),u("div",la,[k(De,{item:d},null,8,["item"])])):"component"in d?(a(),u("div",ca,[(a(),g(E(d.component),j({ref_for:!0},d.props,{"screen-menu":""}),null,16))])):(a(),u("div",ua,[k(oa,{text:d.text,items:d.items},null,8,["text","items"])]))],64))),128))],8,ia)],2))}}),pa=$(da,[["__scopeId","data-v-875057a5"]]),va={key:0,class:"VPNavScreenMenu"},fa=m({__name:"VPNavScreenMenu",setup(o){const{theme:e}=V();return(t,s)=>i(e).nav?(a(),u("nav",va,[(a(!0),u(M,null,H(i(e).nav,n=>(a(),u(M,{key:JSON.stringify(n)},["link"in n?(a(),g(Zo,{key:0,item:n},null,8,["item"])):"component"in n?(a(),g(E(n.component),j({key:1,ref_for:!0},n.props,{"screen-menu":""}),null,16)):(a(),g(pa,{key:2,text:n.text||"",items:n.items},null,8,["text","items"]))],64))),128))])):h("",!0)}}),ha=m({__name:"VPNavScreenSocialLinks",setup(o){const{theme:e}=V();return(t,s)=>i(e).socialLinks?(a(),g(ye,{key:0,class:"VPNavScreenSocialLinks",links:i(e).socialLinks},null,8,["links"])):h("",!0)}}),ma={class:"list"},_a=m({__name:"VPNavScreenTranslations",setup(o){const{localeLinks:e,currentLang:t}=Y({correspondingLink:!0}),s=T(!1);function n(){s.value=!s.value}return(r,l)=>i(e).length&&i(t).label?(a(),u("div",{key:0,class:I(["VPNavScreenTranslations",{open:s.value}])},[v("button",{class:"title",onClick:n},[l[0]||(l[0]=v("span",{class:"vpi-languages icon lang"},null,-1)),z(" "+w(i(t).label)+" ",1),l[1]||(l[1]=v("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),v("ul",ma,[(a(!0),u(M,null,H(i(e),d=>(a(),u("li",{key:d.link,class:"item"},[k(D,{class:"link",href:d.link},{default:f(()=>[z(w(d.text),1)]),_:2},1032,["href"])]))),128))])],2)):h("",!0)}}),ba=$(_a,[["__scopeId","data-v-362991c2"]]),ka={class:"container"},ga=m({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(o){const e=T(null),t=Ie(te?document.body:null);return(s,n)=>(a(),g(de,{name:"fade",onEnter:n[0]||(n[0]=r=>t.value=!0),onAfterLeave:n[1]||(n[1]=r=>t.value=!1)},{default:f(()=>[s.open?(a(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[v("div",ka,[c(s.$slots,"nav-screen-content-before",{},void 0,!0),k(fa,{class:"menu"}),k(ba,{class:"translations"}),k(Yo,{class:"appearance"}),k(ha,{class:"social-links"}),c(s.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):h("",!0)]),_:3}))}}),$a=$(ga,[["__scopeId","data-v-833aabba"]]),ya={key:0,class:"VPNav"},Pa=m({__name:"VPNav",setup(o){const{isScreenOpen:e,closeScreen:t,toggleScreen:s}=_s(),{frontmatter:n}=V(),r=y(()=>n.value.navbar!==!1);return me("close-screen",t),Z(()=>{te&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(l,d)=>r.value?(a(),u("header",ya,[k(Ro,{"is-screen-open":i(e),onToggleScreen:i(s)},{"nav-bar-title-before":f(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":f(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":f(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),k($a,{open:i(e)},{"nav-screen-content-before":f(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":f(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):h("",!0)}}),Sa=$(Pa,[["__scopeId","data-v-f1e365da"]]),La=["role","tabindex"],Va={key:1,class:"items"},Ta=m({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(o){const e=o,{collapsed:t,collapsible:s,isLink:n,isActiveLink:r,hasActiveLink:l,hasChildren:d,toggle:p}=gt(y(()=>e.item)),b=y(()=>d.value?"section":"div"),L=y(()=>n.value?"a":"div"),_=y(()=>d.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),P=y(()=>n.value?void 0:"button"),S=y(()=>[[`level-${e.depth}`],{collapsible:s.value},{collapsed:t.value},{"is-link":n.value},{"is-active":r.value},{"has-active":l.value}]);function A(N){"key"in N&&N.key!=="Enter"||!e.item.link&&p()}function C(){e.item.link&&p()}return(N,B)=>{const G=R("VPSidebarItem",!0);return a(),g(E(b.value),{class:I(["VPSidebarItem",S.value])},{default:f(()=>[N.item.text?(a(),u("div",j({key:0,class:"item",role:P.value},Qe(N.item.items?{click:A,keydown:A}:{},!0),{tabindex:N.item.items&&0}),[B[1]||(B[1]=v("div",{class:"indicator"},null,-1)),N.item.link?(a(),g(D,{key:0,tag:L.value,class:"link",href:N.item.link,rel:N.item.rel,target:N.item.target},{default:f(()=>[(a(),g(E(_.value),{class:"text",innerHTML:N.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),g(E(_.value),{key:1,class:"text",innerHTML:N.item.text},null,8,["innerHTML"])),N.item.collapsed!=null&&N.item.items&&N.item.items.length?(a(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:C,onKeydown:Xe(C,["enter"]),tabindex:"0"},B[0]||(B[0]=[v("span",{class:"vpi-chevron-right caret-icon"},null,-1)]),32)):h("",!0)],16,La)):h("",!0),N.item.items&&N.item.items.length?(a(),u("div",Va,[N.depth<5?(a(!0),u(M,{key:0},H(N.item.items,W=>(a(),g(G,{key:W.text,item:W,depth:N.depth+1},null,8,["item","depth"]))),128)):h("",!0)])):h("",!0)]),_:1},8,["class"])}}}),Na=$(Ta,[["__scopeId","data-v-196b2e5f"]]),wa=m({__name:"VPSidebarGroup",props:{items:{}},setup(o){const e=T(!0);let t=null;return O(()=>{t=setTimeout(()=>{t=null,e.value=!1},300)}),Ze(()=>{t!=null&&(clearTimeout(t),t=null)}),(s,n)=>(a(!0),u(M,null,H(s.items,r=>(a(),u("div",{key:r.text,class:I(["group",{"no-transition":e.value}])},[k(Na,{item:r,depth:0},null,8,["item"])],2))),128))}}),Ia=$(wa,[["__scopeId","data-v-9e426adc"]]),Ma={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Aa=m({__name:"VPSidebar",props:{open:{type:Boolean}},setup(o){const{sidebarGroups:e,hasSidebar:t}=U(),s=o,n=T(null),r=Ie(te?document.body:null);F([s,n],()=>{var d;s.open?(r.value=!0,(d=n.value)==null||d.focus()):r.value=!1},{immediate:!0,flush:"post"});const l=T(0);return F(e,()=>{l.value+=1},{deep:!0}),(d,p)=>i(t)?(a(),u("aside",{key:0,class:I(["VPSidebar",{open:d.open}]),ref_key:"navEl",ref:n,onClick:p[0]||(p[0]=xe(()=>{},["stop"]))},[p[2]||(p[2]=v("div",{class:"curtain"},null,-1)),v("nav",Ma,[p[1]||(p[1]=v("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),c(d.$slots,"sidebar-nav-before",{},void 0,!0),(a(),g(Ia,{items:i(e),key:l.value},null,8,["items"])),c(d.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):h("",!0)}}),Ca=$(Aa,[["__scopeId","data-v-18756405"]]),Ha=m({__name:"VPSkipLink",setup(o){const e=ee(),t=T();F(()=>e.path,()=>t.value.focus());function s({target:n}){const r=document.getElementById(decodeURIComponent(n.hash).slice(1));if(r){const l=()=>{r.removeAttribute("tabindex"),r.removeEventListener("blur",l)};r.setAttribute("tabindex","-1"),r.addEventListener("blur",l),r.focus(),window.scrollTo(0,0)}}return(n,r)=>(a(),u(M,null,[v("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),v("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:s}," Skip to content ")],64))}}),Ba=$(Ha,[["__scopeId","data-v-c3508ec8"]]),Ea=m({__name:"Layout",setup(o){const{isOpen:e,open:t,close:s}=U(),n=ee();F(()=>n.path,s),kt(e,s);const{frontmatter:r}=V(),l=Me(),d=y(()=>!!l["home-hero-image"]);return me("hero-image-slot-exists",d),(p,b)=>{const L=R("Content");return i(r).layout!==!1?(a(),u("div",{key:0,class:I(["Layout",i(r).pageClass])},[c(p.$slots,"layout-top",{},void 0,!0),k(Ba),k(rt,{class:"backdrop",show:i(e),onClick:i(s)},null,8,["show","onClick"]),k(Sa,null,{"nav-bar-title-before":f(()=>[c(p.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[c(p.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":f(()=>[c(p.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":f(()=>[c(p.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":f(()=>[c(p.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":f(()=>[c(p.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),k(ms,{open:i(e),onOpenMenu:i(t)},null,8,["open","onOpenMenu"]),k(Ca,{open:i(e)},{"sidebar-nav-before":f(()=>[c(p.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":f(()=>[c(p.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),k(es,null,{"page-top":f(()=>[c(p.$slots,"page-top",{},void 0,!0)]),"page-bottom":f(()=>[c(p.$slots,"page-bottom",{},void 0,!0)]),"not-found":f(()=>[c(p.$slots,"not-found",{},void 0,!0)]),"home-hero-before":f(()=>[c(p.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":f(()=>[c(p.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[c(p.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[c(p.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[c(p.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[c(p.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":f(()=>[c(p.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":f(()=>[c(p.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":f(()=>[c(p.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":f(()=>[c(p.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":f(()=>[c(p.$slots,"doc-before",{},void 0,!0)]),"doc-after":f(()=>[c(p.$slots,"doc-after",{},void 0,!0)]),"doc-top":f(()=>[c(p.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":f(()=>[c(p.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":f(()=>[c(p.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":f(()=>[c(p.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":f(()=>[c(p.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[c(p.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[c(p.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[c(p.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),k(as),c(p.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),g(L,{key:1}))}}}),Da=$(Ea,[["__scopeId","data-v-a9a9e638"]]),Se={Layout:Da,enhanceApp:({app:o})=>{o.component("Badge",st)}},Fa=o=>{if(typeof document>"u")return{stabilizeScrollPosition:n=>async(...r)=>n(...r)};const e=document.documentElement;return{stabilizeScrollPosition:s=>async(...n)=>{const r=s(...n),l=o.value;if(!l)return r;const d=l.offsetTop-e.scrollTop;return await he(),e.scrollTop=l.offsetTop-d,r}}},Fe="vitepress:tabSharedState",J=typeof localStorage<"u"?localStorage:null,Oe="vitepress:tabsSharedState",Oa=()=>{const o=J==null?void 0:J.getItem(Oe);if(o)try{return JSON.parse(o)}catch{}return{}},Ua=o=>{J&&J.setItem(Oe,JSON.stringify(o))},Ga=o=>{const e=et({});F(()=>e.content,(t,s)=>{t&&s&&Ua(t)},{deep:!0}),o.provide(Fe,e)},ja=(o,e)=>{const t=q(Fe);if(!t)throw new Error("[vitepress-plugin-tabs] TabsSharedState should be injected");O(()=>{t.content||(t.content=Oa())});const s=T(),n=y({get(){var p;const l=e.value,d=o.value;if(l){const b=(p=t.content)==null?void 0:p[l];if(b&&d.includes(b))return b}else{const b=s.value;if(b)return b}return d[0]},set(l){const d=e.value;d?t.content&&(t.content[d]=l):s.value=l}});return{selected:n,select:l=>{n.value=l}}};let Le=0;const za=()=>(Le++,""+Le);function Ka(){const o=Me();return y(()=>{var s;const t=(s=o.default)==null?void 0:s.call(o);return t?t.filter(n=>typeof n.type=="object"&&"__name"in n.type&&n.type.__name==="PluginTabsTab"&&n.props).map(n=>{var r;return(r=n.props)==null?void 0:r.label}):[]})}const Ue="vitepress:tabSingleState",Ra=o=>{me(Ue,o)},Wa=()=>{const o=q(Ue);if(!o)throw new Error("[vitepress-plugin-tabs] TabsSingleState should be injected");return o},qa={class:"plugin-tabs"},Ja=["id","aria-selected","aria-controls","tabindex","onClick"],Ya=m({__name:"PluginTabs",props:{sharedStateKey:{}},setup(o){const e=o,t=Ka(),{selected:s,select:n}=ja(t,tt(e,"sharedStateKey")),r=T(),{stabilizeScrollPosition:l}=Fa(r),d=l(n),p=T([]),b=_=>{var A;const P=t.value.indexOf(s.value);let S;_.key==="ArrowLeft"?S=P>=1?P-1:t.value.length-1:_.key==="ArrowRight"&&(S=P(a(),u("div",qa,[v("div",{ref_key:"tablist",ref:r,class:"plugin-tabs--tab-list",role:"tablist",onKeydown:b},[(a(!0),u(M,null,H(i(t),S=>(a(),u("button",{id:`tab-${S}-${i(L)}`,ref_for:!0,ref_key:"buttonRefs",ref:p,key:S,role:"tab",class:"plugin-tabs--tab","aria-selected":S===i(s),"aria-controls":`panel-${S}-${i(L)}`,tabindex:S===i(s)?0:-1,onClick:()=>i(d)(S)},w(S),9,Ja))),128))],544),c(_.$slots,"default")]))}}),Xa=["id","aria-labelledby"],Qa=m({__name:"PluginTabsTab",props:{label:{}},setup(o){const{uid:e,selected:t}=Wa();return(s,n)=>i(t)===s.label?(a(),u("div",{key:0,id:`panel-${s.label}-${i(e)}`,class:"plugin-tabs--content",role:"tabpanel",tabindex:"0","aria-labelledby":`tab-${s.label}-${i(e)}`},[c(s.$slots,"default",{},void 0,!0)],8,Xa)):h("",!0)}}),Za=$(Qa,[["__scopeId","data-v-9b0d03d2"]]),xa=o=>{Ga(o),o.component("PluginTabs",Ya),o.component("PluginTabsTab",Za)},tr={extends:Se,Layout(){return nt(Se.Layout,null,{})},enhanceApp({app:o,router:e,siteData:t}){xa(o)}};export{tr as R,go as c,V as u}; diff --git a/previews/PR239/assets/cphyzje.DuBHk1fh.png b/previews/PR239/assets/cphyzje.DuBHk1fh.png new file mode 100644 index 0000000000000000000000000000000000000000..c49ce334aa8fe33f7fabae6fc575c950d2256656 GIT binary patch literal 62883 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 literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/cthossd.DaovVbE6.png b/previews/PR239/assets/cthossd.DaovVbE6.png new file mode 100644 index 0000000000000000000000000000000000000000..ea37ba57f2098f39d3d6573337556969f991fdb1 GIT binary patch literal 18370 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≥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 Xf2`i3;TTa%J`+2dqjjm(k+c5*tGXOQ literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/cwpogcp.pAYw0Yqf.png b/previews/PR239/assets/cwpogcp.pAYw0Yqf.png new file mode 100644 index 0000000000000000000000000000000000000000..5fb95f2cc8d8510fbda128c8a1ed88fd84a3d3fe GIT binary patch literal 162783 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ⅆ2*=6x^$YR5O8ysE| zOCPM)z3o1aBIT8gX@mTlY4uIgc@sKSOaKtEBRhw|xm0X7if$*zOx|Q004~>W_`_K+ zTeCp0un@OohBZzP{wJ~gRY$pO#?k4Zdz$LM=U-wPhaF)@Up7Gu!DWRj;Kq7cXj`-< zy=D~GynS60@aQo?VmF8hJ`G3xF4A_O6T*&(;3+sn=+e!+qe1?PH+F*{qC4KkbEXz5 zJfkDzLUjFdu0|_cSVN^nuRw58KU9Z6_tx>E^gjN&p-53n{~UL7fFPgwwXZ~8{#D1& zEif^pfHbu7UZ9Pt$49+d>*^EM_CvX~7wK|HjFXX`H2EBsDEN!eWMWkCD}g|dSZ0Y% zMo8^WJLgRR@M*dBBgh7@`bf0V=@q$1DbMfcu>LyU(zc;H%~6j`mU}jHQ$?7oJgK}F z*{WXc%ep*UgzfENHdy6(zn26~>k?D<*mIF-@e}*g~qzC#C zNJc%rF=(4tc&$Ae&Ly~GRv<37z`(^!dL3r(U^DF88p`jW&mdjoHvX_|I}D{v0s$UR6rV#N^gwsEc z%k9!2fI#DuPV|?yl#W&OTFHpbiHUpGXr36Ak(pj05K6D;PYK}@(F3Wg;f0aNZ(Yk| z`Ifc<(aB5XWIi2M9qpU%xQ#r}Oa5MWlNQU;lf`zm|I3AWRR36A+tt3Z6YoPYFvz?TlV~ndH1X3-L{rfhjRph<)U<#>)#^nN>04rY~^Xyq!TAw|e!e{h% zms_m~Lo{fg$pFy37Sf95VA>NIJ=LAowd9{!53MaUseD5L@e@k191=L*$3?7R?z2ve zpX@^DpT%0&X4-`!h{6_=-bXN$7zb4`-|mHcV0LyeRr_Lz+2yFxrHI^K=Lt z=BFb1?k)4!g- z#$O5=f;50J%e%;6Vh`xR-7pr0PwAB`YT%B0`c@TdgrT+V>O-6x2%@gLr=&t zX`Y(!30LLyimJQ)iA%(naL@rXR)bhUIJ6&^8`1;M({@|>TLEAsgg_r6CFRA|3U59C z@Bl%h!AloLPZ&l0syvl02SSX-KdG|9gp;NhAWgJSchUBf)6)0T z^>gf7l*Lovi2D9qR7IMJ)~vqezK~MA8aB=u^@ij~RwH2OT%f!>>V#;8HiFFuH%%oJ;Mca@oh>{132W~)9jmtX2kNov zwmRB8`|i;8+;uCnwGIK7;m}m@@oZP?s`v_)X+>~9o3fj8`-3V!_i>i^fIY~|H>}c@ z|6TVUS0TYTug`f7(SpZZtfKsqaj}XiR%R^4zXd6<@5zYu+hV=%7t9(2-NCb_Oi>PH z$f_}A%*u#%nJmx)0}|%hQ|-L9n2%JWBPH7#r5dd~=zg>>5GFR&nI+JPl!K@=suLKT z1j{!#qBj2*H04pA7SuNbtnR7W$(!b83q2Sh4lUes2ibERaxa53EKh;j4tw-r zF1aDx@COPxU&Z%24&zb00;B{i=WrzQC~-I@A{ba|NFRYfj;i<`A3Q^zMJHYW3KgPH zM0dm&Kv%#hXa~(6=NO``uM$uFnIu8u+WB{lxLe!|RND_9i>H}kmzTLx&Hzq8R)5#U zWzr)6V4pl65b@h~YZ1N(<^B7H+~j8bte5{`*-DAu>E~<1t{dg&p;#0D$L;oH4B?$= zX3H6sy4kuhdgap@D4-g4yE#iA6F3PbIdp27p9IB{ciLDEUr2=kntW(;(3++@1^vOp z(PaFmlB5vQZ67UlZBu&|9p}lO7GDmo5uZy0!}u|eF}lA`iO<+bv^iQW#>E)CtO!=# zCO>GF{GuOOvy6$5nHh**$Gs>34Pk}N1%|T}K5yo`SXQ@DfV+y)@H1ZQLD)-q=@9td z(Efd2b2ihn1uZyB!+4SY>}T@}2p(qhZ>`zQQrXeEeA#jm%^^N3uZj)*NE@2)pgjS) z%ThhWWT)XGk`8-W6}>S*;S-QKQCGEr&0DNrHqN1=+E5zNM-WbXL>y;c?4?r8myHN# zjwD?SO%>fNC>28c>oggK)TX~aD3vnHmKaA2s&jal0kad=DTd6DN%yG2F-%m?yprjl zi<@yHQ#k3Pa`9?Zfy7eY5G3p4g!HCGStbY@4tD^G zvbA=?$-;E#$mD_aOw`3N0E-uwYLs!IYFpw@O05a~+EwxQ2-AK^XB0~7)PW1qOuC4J zA`SHV;<@VW*#wtc^cYK4xWssFrqWib{kO6x$yfRsbD2rxQL{8OHUQ)-Gq@4LYuRP7 zn%J2t0>Y|2J1=`4IvDnE|F1jymS#8SeDTInoX3p@;VprKY4@*}Gxq0hzk9#$T2q6d z{L9D#5F0{wl|sXQ!!$Xk*Xg*@Ap{GHR#xe2fD8{!uiB8@oS=sFJ3IyO+G{1~|0tO) z#)3)ssQXX$A`w-E(6~+-6r{tgRc3&tpL}N9k@%)r=oxwMPkUgTgymGhnH%-FG`vzt};zv zhK~Sf%Mr(AsA0&}of#h4{L)tHoKxb&(YxW+wJ+H_LfPy zt7x}YDEqhP_=@a|UdxIy){o)}ozc280ewLTx^;g)t@M zx9Cn6u5}KB#AEh%}JLZ1gQ5hV;vYzm;btp~*)GEk|}OWb;rrSzelk@0COH zH4wdn|NSn7KeiAMh+sz1;R{nnrX?)XBJEft>A=j;W)E8ciSHH0PB11z{Rwwx`n^Px z$+L|kO@0bR|8;TqlQbq~VVR?jjDJ=)cO#pDID`r*{NvIR>ZW+!G>bnYyK#ko*{&Xl zcygPy->t-R$kH3_jKx&UHbz1$N_Z%XdT}OBW-Gs z{U-5S9Ho!G>soRpnwRUBtl9nZa8FguOmR|=4Y^6R0s`mEz<2ibzdJj0y4NqNOeAoB zuvzI>J_nHauCDR$mY-sRZJatYK09u7wX)Yt6l;dUMkRJ;5l3j8$&HqV>ABLWgA6>w5Ks!a{Y!QQtZBsGuPkJg$tcAnd}GcLhq z%{$dc*m_zJ-gX!hl&;SmZUefpife6u(DEws+eOB1iIjs$2wx5a3R^*UJM!k}2jI#b zgaSnL*;5~c4Gx-&yliw^h^0_jMuBb@o#Ca6e~Y;W!yJUMU(L`QXmtKmeYA<#WsKs z^*$TKs+2RV$NQ*52&oBGtb&3k#z0^#qhE*Yw%-3_9G8;&zi}%ML8S^<1`PUsqhN=w z;EgS$zY94*o{)t7ucZb3#wm0;Uon`HAQ3KL96t3@D+9>_cF|!*MbXy~CBY4nhUs~^ zfkaT*E4LY~A^C&?!9-y=)Xj3n!0DXoF7KHl4|b@Tj-_bDaZya+zd8;2A zL6GorLu|G}8wC{Xl3l_>3>oldGn6b&P)%@J>!n?dqw8ol#ybl-gpc#;T z2EFI18J7(wW(`lh>{&>WDg+SXjdL5ZxIQNM%)4e_Ztv)nqXL0<=ZCpxuBizh zcS3h8fW7r}EN%yFi*OtSAP0aQY0bCEGogYmtK897hesGMUO;f_=Kl_&1?g8@+5Gx@ zz_fm0p$Lt=Dpkq-u(#l=tHvPz-`m^0)IGGtadY34bwI6r4y41A12QU04WXHKKtRYl z*W5G-pxH@t0BQOtrFMW;AqV@M?pWtfv2Ol({m;R(=2O?z%o@Y>=1v?+f>W~&bqRxV z{m%wIS~X0Wfj(oZRV~%H*#yRZtL;$WiTBsCNqmzQzYhlo!1{p2QJqRq>OA{2Qgo23 zHQ060#|T#19+ScK{l>f0M$ROET&bC!O4)qa#l=uV!Ysyex@x>&_cwk$_9l zSs9l|(7ZAaZ??;U9k1FfK5wkdV-F#X`rJfKZ31y|fVQ6GEWK2{VO7x0RAls%_0#3s ze|Y8mbiMJDpw4B}sS@AXb!ZL?&{zDx!&1A2p`GVNf4t~BedQ(0*919Fb4@SfHlW^} zO#1l{%#OoDZJz))k?>f=LW8`qP#elJ}n3v_bc-^$ML$fxhWn+a|TY^ z8w04EfQ%9tPB-)8$JiFqlN7`qnQiG15IkkPU5~Ht&YxF=gWovAnI9~;vOuRDe_@i= zIppgWHI68``fZJEZK=3=q!#)fY|;MYK@TSyE$Vco)eSF#zb2&mfh}cX$|jet)m(}P zSaACQZiG+Mqzx?Q0KQ$?00tnV9;Kmtu?O3vyveD#fBQN>Y$`u47Jee2vW8++77c6I zLujR3?l8yemBm^K2;8SwY-K{KD>-&uPz>HbmG=hp*>u?{3;Kg48@CQQk;zq@YeRtD z{yf$iljVx7PIeD*-!!=N({^5* z`num?`~5DlT4tvNx)GtfjOS&E=1u6;Ld4PpIx65~IPE1c_o&S4;;9du4eswKTUa=? z{;F7ZPG4NV>gt)A6Rvc}3wJ_4lQWx}wN}H>)!H1Pc1$(w`hxx&} z0^tms@zdldEb|Op$PsiMVrFEr8Q(~x>wpt%#8@pJIerxq(uDUPy$HSHAftNyCZ-S6 zltbzcQFdpOS~-`!^{+0+s`)RSV#<~_H3QNsdij0`5*aA%yS6)-ODUo}2KF1*VB z3mY79XRrN>V2vq9 z1UO@FruJL~n*skyUNclZDk8V@m4sSSe`7l@x^b{|$6YLGH&01~6LD+l65NIm<(uc(dzvJR<@1QE< z=77?7d^4{-8II1IYP;Qz+PA#gzHAiL@P!JO_t?+k+ z5N8uxG2_%Jty2@k+hKaLQVDxy1l#FpBX6RuCKruR%}`sbofEq?m(t;cdA*RHyh5Q& zRlvQj@h!n2mx|u^&2U^XzWs>YA6Dsb8vr&~bk2=SqDwSz$yc|>eT?c&J_EBmQ7W*H zF*}jCV)75g_JXVE$Ben-KLSAhC9S;;h9?=)%Yn{GxJKy-U?Fy??02rTet)(jO7?+` z%|g+6Q5;JXW`=4$qJreFYYtje27;$iXB>J77XR@bDT?BdQ2AR2;4gxdWvO?JldC_} zm$(1k?i5e!!MnxXKx*(KTEp7)S=GsbrrQ-Sidq6-k!!U$H});6ni$;cUf0TToXg%5 zj>@#uy~^u;kCCGrNmHKb4(Q9>DFmP>UT40{|5~iZ>uUDfj&R{2`4XxlQ~nt&Mnw+- zecWbrYnC#;RYysCxW?3|0keZYMZoFhPawn!>oD0{N_wa62Bp-9Lshh_Eia`E9Qm2p zM&9qa6QLsEJ@WHlQrrhbTxvr)JR*^QD?ep52c!{XAKX*2)^gO1&7_IW0`y;oj&v(2 zLm(z}3@`-KMd`BFia=Y|B#&Ex{^QYj!J+G^8RR)ii-)$Qp_wh4{2g%DHa%^#>y`_Z z%TW{e69Xz6^AL(q5}ZhH0_5s_@MkYR6?{zrqWS^T%y7CDj@zoiOweOr*Vhs-zBz2zYC`KtR|;jrdP{Yh`Mty)$WYvyE#ckyiz6-yD|)&4$|glu zQL2a?u3&_IWe`p=jd421o2{te$*KALVf((-kzMvbkv2mTOr^?!Fq*Q9|4vp>E8yrc zT6O1^pw?WGetjE8Tng+_F*U4~o_=hKDO8%de+-HCOnXR*uxg~vzjc>AEcWfxE3%`g zHTf8r?@A$nF=*GwDEO>i6L*#V?QL^EZ2XjUFN!;NN|4+HnLjiInOv`=VqiG2#} z&H<=yrQf>Ja3;`Ti6t&Ze}-<3Cx{j-#F|r_lqpL(Mm|&%exIq&tvZnr>4ff<`R3*T zL_%dY5-DbXq&gj0j50Y04275ycr2w?XQJj8a?odTQ3FsM(~#Ol5plb@mpYJGk>=GOP+1y(QGnkXrio^O!P29QDDT8wE?m85ClY& zEwLLdK-c8Nc7NW%a5O$bhdmRzE4cz`=zTJ>6jY7w2$8~gP=k575U&x9ZN@5SKw)O6+yK76Vn02EsuR__sY zx6L>_dK6lI0)RpiiQ-!#af)+cZVsjrsNokBp+|BQ<6*?vCIHCyQ@{>AFW8bvafyUg zRPdGfJwJ!eknjxV(u>usX6l7qJJAdyeL8w&ndDnVXmvfQP0eu&|&=rl)g zObofzOY#^(&cnQyU+`X?&E$o-C4b8F`*zuQr^c20++JWlPp~tAXG(ogv`LD0%Csm@ zrAtbiC9%dU7~LXN2Q3YXi3DYVOa?nUNSWK%T+WkrFE+wO%tK>!ky>3sr{QHG`Ss;O z-Ke7xjqVMi9&5LF^pxqL>8Ir78^$rNSd83nGjYq#Vf_k_2Hh^=WE3XLPTm&{7n#Baq~Y(uGNhr#{eb5?{M+em z`<&gP^J3~D^i3+{B9xeN1S7uRIN8uMg~l%7e!Vf5-7TV{gOCMHrX!W43JRwo&~H|} z3mwHYYFh^>BMVJfxGn8V{4-3UPuZ(}l*T%k0rqEx*Ug`EiMAc_m78Jaf5#bT zXAeI|&dWwC&z;3459$5z0QL`Jp3dDHkN|?BZ2;vbw#}m5X1DY2oE&_vr?)*>fIlbS zc!!_Or5cbyoJpYG7PVr6hdBqXJMYVLv*15#w{P_rwikCoMSCB;Aw*>U@k0>s z_}_+vGUN~92i!>i9^8vL#XH0aTmJDcyP?f00S#PRHl!O@8&cGrybVT@z2h<_HO%M351FSmQ&d#cpUTEo z&~hx$%EfFo9eY<#1rl`VsKqRZeiBD$C2D=V<)i+fwaNAthm(Y#quZ`V83wEF)@ zpk#nv`mTl+LJ`K4O6x0z2y#IZ5n56!*i&ijgzKV}n%M-hE&6+Xa-Rhr5S7dsK4W1; z*=jr%>%s1#GMzSVD&i6DcG53e^E1b}Y7822P~~EM(<@&D{o9_uy+vP6F&y z5-bC!O_1vfAng`~nCf&HLo7T&1C3eiB7TqedkND;QlBQF@D4P-L-3Dm8FpGx%2B zBP?xB6QjqdIxXj!AS~d5Y4!qpXK!^D;`jr_|E>?F*NHU)(hsh$mcqN{+C0CaVzC+w z%E{n@FU3hORp9LAWzlC~j%a}1W&D1Sy}7bgh#s#Gz$h41_e!1e7ULhnA-TqEIueC~ z89eUcSF*|!Gp<%<3-h{dXZpb?x=~HhQU9W5g=z=gamu5Il>@3tx0t0smcNI$?xa|h zXc%0q;VkL)>pzfNp|5>A=k{Vf#BzrFW|fHUF#1#>D;9iU$ah3^JA!h!Xa3I%K-kU7 zqJ~(OFD5$V@I;(0@94d6FE+6$bs-BVenF}FAetRpU9p9m!4UbwDtM^#hY$_JBZQybCyP7(UKEmQlCpL@FH1 zqVryEym^A4>pxF`UT8|TVY3>4Pb;px)Sl}|+-huM9v0Hn#L>IYB`PQ>)ZZqE3EGIs z)1X+BUCt{JxiJ4R3KKF8d!keN%cjtreSB|-)y&a9bRj?}MiYZkgb%{fr{7I%O#jC* zT>BJsp0UDbqTDZe%!s3Mw}LF^%G;3n;=~buR#q^i zjs#d5H2P!WjL?RQm#m`d`0Tf7!_n zjMpTEgb{WkEXICku2{#Y0&}Z=AqQuE$4wUWh$gFa2d!L}j!OIBvM7JHnJSUUtc)W& zf@2$CO1XwWP~rW!4eFHLFHhSZG~JHCmw*1B-*N!g*hHD@feS#s_tEE*hN_23Z8rC} z-ObK(J+>32=gLxgRbKD31qwjl^s*Z#%tqj!i`9h?CoaD|zhNl*yC@6o9oB0HfaV41 zmu{Zxa|+$5Ri{Efe05;8;`Xi7e0UfN`fnsw<`{u zF9H)m5RzxF>aPrgzfR{PKdRrQXDYSiakZj>RRjXrXkli{Ch3=v`>cZ&Lw5}aw3WLW zV7Y%`JLZiy>RTs^24t1E#XK_K^XOa^Pv%7 z2!b4wJ{d{q^O!Y@z817gb5}@_W^&C6V5x1GIY}Mf<}eJMz!DdQZ_Pi{=M3mrnv^gr z**yaVc89;t?}xfjP$!zk$#$9Ssti>DehSq8D)=ep*4dqPMI9}^Rv@BZO|IY}+UR=$ z9=QgK?jjU4xReN>&QF&_Az(V#QxOP?P~y3nXDaMD_4pCFzxmaHCz)m0i1bt)y@zC> z1VeD|x@f===lWP&Rcgg$3a_>EaWx>OcyH}Tv~%eneX1EYX{2R)xi3?q6EW|?@t$2^ zS^4ZwZ(q!I3=>Xxw_}DaArsdDBe-nLqcK7VGW=+CH;ip*?+FA?Igd?Y5(D>AU2XW9 zc)A(twdLuA-fC#1o?6V zhx&Enfo6+v#M66t69^>K2Xne~B_FOKkyjS7=cx!Zu09HY)qF4)=A{f7U!tImWH^#< zzHbo+>`M=ce6zYfLm7+-H`1H@86em+Z%!tey_z`WVbPwIR0#AU(6+=v!xG@Q-Uc@9 zKMaaVI%U*7=#t<%QxvBYzYFuUu9cxHI15y+P#jF)P<7bp}zBxOl9 zKM2|?-8#1|2H%GbrRwe?EkQPN{X59d@r$d9(}OS&7`@nk(AubU@|=eew7hNbo z617NN^w#g*u?;-17Yl?&#d(jwo*oB%g_=s{c-nfsOS_*rZRo(*p-!n(4ogOiA8gt4I*2s7G`WIItn7DB80~Qm=xw5ct)5!9z4sDp$^|(#!{|*{);2J#jWLE@H^U)^wqg@3B4jLbL8A5XDmW=KW zEJ1-+wa9V))|47MoviV&wCw~Xw-!s}@JFUJ);`=gcUqO_O4~Jjn=sdUS&0ecm2AjB zGD+VQ75hfahr#Cn?|u8<-Rmh(2_xp=Jgr#( z#ajHv`%>hC6=1MktC#hrEeTw1crXG3H#WFV`2MOb22Bw8##$OJlP5>#h{7u5J!cq_ z2m`gz*NETf8xW!NIn_xjWDIh5hc41)0q_4U>!$V4HWPIafQe$cNDd`W(D_+2s>xGb zytu?0FxIh;xt^{)(E=YP(^~xM_>DW0XE38PpgcJ%Mw5&pgc=hCSIEUwB(d~& z)3n5hNG`&*te5wqNt+!}%RP3Inqkm#H2(?W5afygEP* z8LN*S?7F@rv$)I;gude=gkDdW*$quDtyPE?UmX1}JN7Btm9SQh;x~q{iS9D2`8v}EJ0Q$;%{I5N}*5B$Xqak9= z*$#D5n1_CvM`3|wr{jc(c88>?n=kE$Rg`blR*c%?B5T37rx?oz%Ct)m7?bU&LpQFO zK3t=ls5@cg^phZ0HGZ=F!*r4WYL^Rzz!oc1o;b8|oAcJM{;I2pYDyUkf>ki% zbx}!;m}KG}*ewc<5?=YvZK5zkjvE~F%@^35R`Ve!{rXr@L7R^%==0|kIEOg9TdcVI zgVB@W z?MmE!G5&7Mi?NA8-BPGz&Z5n~Njw?0UkFj2B5x!z8Vivma8@aU^3?zdXB|NTbCOU) z4nKlS6ZbKWb+r|0zX0{MN-oMyrCFiv*rFAd>lGuP7`R4WQt0XFj!k>RYdaFQ41F=p z#YV$NXsarm-Wo{GMa9=JD;nS$XwuJV!dxwdj63Y@zpKl_g-gv)WXAuMa4c3*nE`0U z@tE9=M`;m~^yrQtMIszJqD(u^{3&2Qwi@9{l-s2G`f^79TZ4WTYR4WyQ!nf?kn}IJ zb`6iYR*q1A3s^u~DW>;%8|G%%+~nibp;?ySK-~e1zAd&Rc6q`m61MV|>*_#Xdp-XV zkG?W^KH&`_4d&>OieOB=5zqCR1z$2z5u8Z{n9) z$wK7J5U&B~LZX%f##}*=$dL9VgNo8V&S*tn*b*F@`{utt;1U>cSsgFXPKBB%2B*dH zr=K}HBg~Z*vVa@w1Wtd9vVX%ceTc%9x|cQ0@iMbCmW~!C{G<4qGpv=)UptiI2z|i~d zQ`cL=B^&^0A|c4yRU8hK=+T^xv!E`4dbcwjEU)-hUZ~skir8Vl#jeE3wBffw=@*Q1 zbTU@llcD`zTfyw^eiZKM>I2vuwY911Hev^Y{s8WbWDrI;5{JeT>uQBT`9T8Q-P-oF ziZq0o_`*P+PVZwB@4uOL*g!1S8mUziKF6;ZfE_q4FMXoQnXaBgWj@D?-W;`RNsb@R z3NW6B*nr4lt9(92y-7bYIw|`krW>ff@qum$P4EtQjs0`$%(Kyb+BDrLxIByWMsW|* zfn_|@^9ye#$7#Z$4BkWvw(a;3)HzW&F{U9P=|{e^r0trWXueLKhE=hzCi~PIFm?LK z!-xAoMO2e~_EeE*73rz+74F*K)Eo{IaRmDylj|0iTZ-5V(w2 z`ro-lfj(h<|Md=`e&VqQ`GK`Ho=nf12p2CUj-MQm))#kuAR>4C3a{uS+xiUfNXQ%4U8+}kE0ABE?6LZsxK84yQHcP2(g zN)woxmQ^p~mP-W#wv{96;sauJeR*671Cn~RL zYq2FrdkHgj@42%BsWDfWDH*8KwNBy7t;%m4f|}{f-+B-{n52H}cBKSsovxV{S#B=p z57FI_3}7f#R(vZ2H9iCZW@arfG{F^&8-V{~nqTY(&NFB1v1$ppKZ0pj6!9C)X$_c1 zpV#w--6`y;IPU~y>gku_gl;|5YrIiyHJ{(y^0U7pK64!mMiF<3QouP5d11p=4iWTSKDMn==zr$jT1KK%H1eSyA3Mnsgd-3cEy-Acq7uj`N*ZYG?$4#Bl8663u+EpWJ9tvO{$uw49(Yk8`Im*ue zG14Jx% zW50cw_x$987VxjBf6e~kIJcwp1UN^P(6XMB zzo1cDG61O2#23+LhDSEo*s|3o1<_)+|6aS*|C5|L8a)XOq?n{EOT^J04_n|9x{^R) z0i)=#J=4TY3refTx4yd`j13M_EnSzT>BK2LPI6B8fbc1MOmbj7?7Gu)bbpCEf1Tpm$u^7EnY zRBOlehv`>Ka(a&~pN_j69*FcY#*sOvv%CVVugzvyp;Q@1eV{@k?gZ0}os^<{<%*{8Eyz~4Gc}`2|007Y ze5II!jIjSLwmug%Sf;S?56aIU+4)T`X#;g^@xzv7b;&2Rb}2X+KaQ{avpRf7J^7|o zby8UUD2~Z|zK*#K64`&{>d-g^#?QoHp@xH^ee2h}g<`c}>d+kp(KQJZ&1mwOH)R#3 zzU3g7AGCKd!s3%hu4Vx%(-AYq;PC0@g>(59qqeNlq zPyLt0+1K@ZE38m9J&ZSr!1Zi0{(qRhA5=F(-QY}3;09Cg)%ShBH?}%5wPL2>2i&&q zDryeRG936ncdo-?38rk!K}qeGnykN5mlqcFAWTNOswmzTwrK3dqu(U2TtuWtwu`fXOd|?snlXI!MFc%6P~yWmjl8mDRK17$cG*u_gwh zxZsx!zcYy!#rA2}!_#qM0?@O$+^W*ZZxZj&;ooj-Qonq0NW~E7`o1e|DIh!jQS?$X zJ*5TVV7lccNK;O%DEzc_3^u}s(| za6R|7`|DcB1No?X1p?#x7s{ zQM){yZ1jG2{N2x4!9aI~13a_(D=XqVcN`nnI{K_4K9BklZoe(IIW=XV=-u_Q>k_DU zJ5~Q|`FtmLZv!(W)e2&$QT3>iZIuJHGH5PXDW#cwiKYBxv9w1^xSo42)1^~M1xP=! z5%Wi~jmfx)mN7F*Vr2yrIlV$NSfZbJMV1yLav0EtjrHm%q3V>zD#kPrZ42oXl}{UA zIG`GahD^9S0^9J-3|9Rn8-*sj>5iP1Hss;Q>YvuGM%(ch`5d77<~HcE^6SF%D&fL} z=sgbw9}6^0OiDO)5S$~8)Au-Fp(ZNEMT(N3kg^b$y{DEd#ec09ocCz}2$&SR z3N@}me$y3SJ>&Ww*6w=wesj|psyi@-&KZEDxu~c>>V7`x;4kATIl~w*KDWEA5@#C> z<`0+l^IVxzzMB6;P}9WXDzSFr|G9NaJv+aS?dmk>6mD~c_6izPzG{UF$!kK($dxVa#(Au`y*4S-WeXe@pV(4^XIz3n{yz}l-@AcSEKEsP)Pu|;go zQ3$bikTgl;3^tW@#hH}u%;&d1OisqBi~)C~KX6SXHR;S~&l+rYJ+zV1W)v#PLcXnH z$h<`=;q7WbfA&<_0GAye4x-%e{1!tx?=<&zX#v+^&#L=2zUZ^9cc0yl`g{7Dqc1Oi zQtxN}O4?oU*Xd-A&aDHycb2#Qbk(^G*5Y+_3lL{P)e_atdu8cybBDTMIA|(DlsRYu zC+Bnhp#QTX{Z+5qfLT$A;2OQwRI@$e&NIXP?%?Av~ z9Kb-CJ@}3nCoJ#v?64xqcjn2pPsTJj`qiPgXtCr6;%ArJo4&#m00Pp>2lDQ$v{p}L zjalKP28&HNJhq0{)45=c$GhLla1m2C&5SC@zeILNqfU%SF z&FswsSSq?dX#B5L)^5X_psz|-a>5!UaW--4HDG|)XI!|tay(+QgW>N{vyKY%JZyFh zh1qfWhd*stsHoCYr5HI}{h_ zGK$)Zxh&mI`QB4yZ(f`UNf&N%jE_WJxI#byE15;v^zNrVdP_k;ay0=aN=i1#)vsi$ zL1zbln3A%gr9B^9${?Q&5COVe0KO_XTx%qSiDwbc2l94N6pkT*h>xX?Wfv)@%X8dm zuT6tHrB%LRnGAat?;m9+XE{ma25Vyj-b- z^a&2;W)}kEwt60ZgC|>otevV#0RF4sPtS6ZBd(_8{H`BHTQ{fip)qd%-+L}?cjSL} zTEiD^`;D#AL=(liqimwoiYKe$g`*stl$4xh`YN!@6(k6<{p$OI#uEQ=z#T2);u-tc z^w*M0vwtci`DvYvk;sb6%uGg4{D~yCfKE;w-E0tEjhc~9j@Q&=F}BLhVl;89czv!L zH7j;1m$`#aGG$FxZ#1SXd5=~zzEp034)*7yzS{}5{pex$t>2Go46;0kZw4Y{oa&*j zT-LY~?MjuU+;L@W68w7OJ}r;3-5?$D(4Ru_TqDlp>V;K&psJB24Rg4e2f63^qjpVh zqP(sQN$XvwS$13j(EGafvfOd1PnWi?pk^~Y|H~d2uq${h`QNyF|5Dvt?4LjGC!aF; z67=4RauBO8<0<_odjSP?kCw#c>;^vgt2@gf=K{z6y%5vn`}dTpo_CRP3cEE4@{DsG zOuM$4n7(~y81prSj$i)qTQT-EL1wl&WaH;bXH)zX>U~AG3N>C;q2Z)dgUlh+l_fqz zdYT8uQ_@jIchPoLNmDAc$;-<;gwE|D?wci@jP|&-kVI(R_N-e;AE`Yw0ffQls!~ei zQ>(=r2`Lh$zX*bki6$~RKesf;;~R^6#8=~+Vp`CsR@FM4+PP)yJ1Tk%f#h zzmAHZ0RqpP7N4Tsk#nZ3-=3a(PFKp{s@!g_)2w=fxS@hUSia3}b;vsp_=*5LC4uUg zUX=gy0zhm&DAU%Ws_6vj7{o@odm8)LZrs{Vb*?<5%hXOdBAo~C)#d!u!T~;YfNv*T z1z3_jI$>(MmoXtD0p)TG6+dO0&`3 zC`h-kjgs!}4k?kA7#&gqV{~`d=`6A2)MSvMt9c z47nmkOC(Rw8e_#D4o>7RWlER16JdtIi_gw@U5e(rxp411&wVUJL+jmp6>06-`fT?E zb%?x(cbWU7GhHwIck9YjBaHK5F7txAmf`)-HhVP%bR`A+jNajb3>oT0v5e^D|dSP~Us(UD6 zLO2}$7$V#94u1p~6%A@Q$q~shI&rY?9Mc62EADNFF%ouFvEX+#t?UP8=QfG77@hii zK-7}|PAQWyy$?E)0KQf0k&SCr_>xad2TT2whsp>J&JwH!tvm6l^qS)ulFcu51Y^e3vd z$i8$m>HwAfYCo1R1GESwww`ZZBdI&DO4wc>jIn=l&7wxxk|db78hhq-f$MbT|B_vV z=LJ7e<~v*`#2a(})%#GLWI}|+AKKGUmeGCH72PS$g+Gb5aUeA5pBW6pIG2*cnl!&- z0(L5?yqR>e?8_l@MPLRc92vnX74XTnNHH|1!Sp=k$9`mj&32*^wZ`JJHZ&Gm$8*>W zE`qW^bnR904K!%zez=f~v9(6-iaJNmJmCdxEa_i`!$0NJR2BT)zD{d2zaxs@K!|?$ zj@r=RxMnz70p=kpuN8L!yIr*lJNL0d&XRdQMf?5Zg%B7yRv3BGX(hByO}~=e8KyqX zt^J$GM>G450Vsw1#q5@RQT7H}twm;OstGDqZ4LkXH}Bgut54T8f?M&~{Uz7#bQ(W( zo3HuO*8zG&39-x4es_TveC2X?e;IVC~-a!evi=VW8sfM2+?cskR(oT zdWwewkVe#4Ftjn|&xM?=P=^Tv60)S{DF`0@)ake^(L`je_$xaD@TAc@ojmt;+{2rM zqmP&SI;yS|r^8BKe^tvUaI>%pTnc<~TL7*dpI%jbwdJ&#k-GhxD z^w1iD1@cyQ$;XlZX)nFkhExUyju?YQ#YtLQOc^EooIz|XdN7i+3*-B0uf*W`EU^<& z{d7?XI2t5q_wVv{$$@!}jh%IMhX2X({?I>)(K-_45Vq(C`CkX2oRq&YksbtdFF5%A z=}misS1%k;2Kxud*?<**flMi%$dZdN`w>M<;NFz_xJ4QpM}1-XB~E%3n~^@f)<`Dng)mr_pF78&shuV>UCkrkSKmVJS!ODCB- zNgX_(IUdyfP{;l}=1HzyNxPJ-&H}7~lda*~#T022ZI#~uiZ|vv5o9;vJ1s&C{jgH* z4z()$^9Cx8(@W03*WuE7>NoSZ7&g5ZcJjHZ=06&i2*=s^TlYwCukYV9QGA0Wnb|g3 z_R|18fA%Qv`?#hBj%wGIwIfNkG!=$Ov9qy8NaZ=S6t_rtgi^<}P zt|Di~JEAJ97beg$V)+xlWk`fBk%qG+UyQeV6%v)}~z=y8EshI(x?qt9`t8(;BIWA}FEPrT5k-6wAm4Tm?t zdLJiOFX&jeE~Hd|HFTPQ!B5@?D_@sBZ&t1i1c#VkK+ZDS?SFUB9`mZ~Osv}6~uQkT1c65vVJ)PgS%;~-Q zV8x~0j9fQrdl!X-yQAg~WJYaT>%X@A8C1>HyDfaa9Qb={3jV z>rx66G#pv&{xO8v^{#4-FRl37{RX~|Xj1LEO-aSfDvf(4JlgQ8U#i!3*)WZ&jS zz4!Y3$C}g_dQ)#rgF^l04Wu9nZ}gXc%S68rekFL?2x+AX6DU;m!1bEW=;x#;SP~I( zy)V_GkQcyZY}l&mvJ;cdA3p<42<~aCIS^>g+P%{SGb55lwcmu|pijw`e!|r{dTXS2 z53jU~AJJG+n5AR*Dc@isq<%J&f^y=E!3B)^Q_lvGf0$QUhf-S$Bgs7s%12kb`J)|& zA4+xU_NE`#Lx8i&;U?9Yn%_>@RjS-X>lz!ys3|HMn|a*a)+zih#M|+oo~1VGnabU+ zly!_gJ$u|AEsZm502RMB7S)<11Cjn0!)!#=PlXpo@q_s45HWlf4fykKeyC}Tj#Cjz z^&6;nh;iK|XziYspq6F->EOC!%}#$u#q}9A4|JMj(5lw?OAk#CXrQ&4+sWmo-snT7 zMbaj~1lh#<*UELnoo`pIqdZOpXC`EQAfMq{6-hcy@?;=Z)qvO5+wasB6@$^J;C+^4 z^4;jmMh#z2(eSb1Ps-z1!6ujYG&Me+P9!1Q^yN@6_cf$&X*kBjfe_$O1OjuDh4HGV zO0lhzHRAt3h0|cL&HbSNnb3H1RKfen%3|Y~^F`J5m(g)+k5_v-MKW!k>4Ycp_A4k# zDraIPenz)j19h({q)^96u>JP)h|K}(+20Ya62Gq5HFG~gYCo?OzT#&-tBj}Tn)F>x zv)N4~BhO<>P`0xQ{{8^v1(zc7-%l4LXLTUIqQO(3_=67=h7(@V@krLM;z2SBp}jmO z_ODFnOsmnkQZ%lDO6eF-Ro0tzCL>{m1SD@#L=*de!?9ZMHlu9Vu71Vmn&lL82tj86 z73`wbe>m$>P8KKG=n7a@W7)q=6#FKfhTkj#TC^LlkMKTydT}-RENV2E2%9mO0Z$~Z zAd!2L<2ABEmsWR*(rLwbv~}Ki0Pom0g(--wkzKwx?Dj|9CbM$*jC?LoNw$rI;!H=2 zxKJczf5?ff&TI}|R0dPl)WP3~y&a2zakC_y?(_S>CW=9OcVb~#PXVd;#a5yyAvt-D z3i=}ZPk%Zr(w$^6&2vWcv90AdU2&l0ZYe2c{(aS&jlH7A-yD!^l4!d4__HLPM-GE9 zTV>nO4*Zf0i2)k^`ax5#punsRInl26D$VIPqGauW^qZw_`3!EN7ypj>%gO=aDe%&e zvmxdqlC{mu0b{DYm?(U8;dft5r}}*-#&`Tz?~nvn1KBi@sEWpV*!L`&Fs!8ZpWFR9 z2_kB?h9DsHs>zTq`%r3#_K)I?Dt*llHE=XLGp87bAe~sGw8C=c0yL8$^R_gGy?MW(#qc2{J2ysG$y9#a`dnHPL;od%kkN?`L?w;Zo>!O z_Z~HQLrTEeCNb&5%Ud4@XIIML}0A-u8v&WKFK!(NFGri}fCFSv^2*G=yXIYjOtU}N9Fv_=h zgV;8w{ZG-8r>2=1b58E)9-se(h)3m4vx>E>pVw!VVJ#O6p?VmvzVC-#yt`m_I~>rH zN@izFHyy-U4wt}~pl(oReInH*5twT(`1sH5^InWEVNb1N#NivS_Zr*5gO$2D-cGtU zT5Q9S)kE{QV%HT8o{jP=WRo;IcwxS-Rz{R+YL`LPTTk{UD_!(O*xn~k;H%8}F5E7u zPi7bm!b1+EY&3x$IDw3@gTO*#4l+fa9Seb-;d2Tlo>MfBXsURTvVr(ena!6`z1LI( zUB#JnfZi{;Ie{ zuRNsHfW5zYNG~uSMNReLYt zzxe1q<)iv>hf-N=R5n`aPv*;*sF6(JG26-B7$NQ9ybCf%E*V)`#9e@5T^s9hVsF?aL_NJtvRUB+>etdv@8T3VJ>%T#WG zH_fT{Q@gIr+PqIW$n7uGTbr3Kn2m46aUL{!$@NS!gywgd_(^0}){kS-S8WW0Z_C9G z5(-9D$qecf@6@Rdt*$k92*(NR_Rx;>M5acADl@L4`2$w8i{eSq%&KT%OQeDG_41EX zvO6;jJMza~F*I!s-Y!Dh_(md`ReEWqg9##ZC0Mh|>i5jSR|kc0@ivnaXL`7tm$2D` zmAl=FAS&Ku#(YeAC6}}1PdODXG2O;x(pNW*(43DDar;AOjGp#lIqxIp3DaDPP$FNJ zZ81~o;PAcE%AlIK3XgN@=V0UL*^EsO5E92U^Um{zvRb-xg3C#DE+4A$v z2Nw5BpDEKb@2V0gCdk!nG)32qATmCDfq#A`(7dkUCTL}T(ERmnEO;-MyWuiuHR7xf z+P_1(qN5iw0R%Uva@<9f3et>}FNrYW$zmgv8r#~`h{!!}l)cK@kY>~js?3WTLYIRW zH0iokreT_z!!miQ*7To~lW-H4SgjCuPGp6GCX1_ zjgD5&RYigYj9!E3V%I@ridJw8F@~mOq2iw(KTE0nw+-Y}Ya`2yZ6)i>#Xjb9(M z_?H(ImnTEl6M?Pt<-*28e<^;u*&*X`U%o`Ja@~yc*SMMHI1Oox!gy##^!63``O9<6 z_ZVn!GhNdoQ18X<$vXr(ONdkP&`PF|G?ytSSdAk71r1US!eIjl(>Oa-QhUMoMV06f zRF1Ev!K15ama*t#-}OlDkd0i&rHg>U}Ib2Nt#4Vckwq)?}(>Y#@{KX3**63DFy$h?r zTG_bc_$dc-5|3#BEp=!Oy`Ci-S`FTI*@-`_wv%E>1# z`8FY5#Ln5hZHB+??`DHV@1UL1c96?!+8Z1vqD&f51-o{&Xf;Rs^MF|YaE}La_kjTSk>vZq>hQnv&) zwaw-h`Mzxrd$%}MhBi8N-M%cM-6=#hleTcI~!1QO|lShDT z`4ST)`_`lCTtHoXLFUq#=F3I-6Eh>yr#A!wBG7J`J=%do+)Po?x*BCqvvl>^&~?7e zrU&J2f6lv@oWhW6Lcc~LQBU$T@awE8lT;@ewFVh_XxHq=1+tkF#Z;x31pKB9}1w2xn1> zm=>#%xSq!SHjclr{Fy9(T-#~Gcx0E?*EmAoEz8`ti)8khs@Dq=pTAEhTM)00H=gK; z@+V7&U<1+MdF8o!d;PgvwOkwkY+r!WUhlD~J&@RJ)n?=oDQ7O8yH(AvYJ zB?}F)?78m<34T^=7*W008{``v&+Oi{g&hK@h&ICi(JH8;Il%h=CLDa<`mqC5Gh>(DQ$Z!T!;4gUd=nN z#Ch$39y6+&P8BcoQ}Q6^fh`5b(Fggf`+h~veJXHl#4-ucA$9*1Gb%2w>;)Q&ZfhG^ zcQwh>3p!29yWV^jRPpV4N{&h+{S$M_=r@L_BUou1K^}61NXqi~N^0*fFpV0T=u`Be z7p?cCT)}1V1aZ8#8f7+JQYf&Cks-M2`S`71wrHm6o7|P1nA_N8S57v?m25bs`w-6f zMSCBeTukjD?c1#A9b7)4(AWUT`N)AXR64;>%9t*x#~I6$T7)-Qy#CkUh{ZgV7Lh$1 z76|Dnqt-hc$h|x;L|R=ghRw`5iRBFG6v?~VEj#puLBjVT7$ADdM#Lfy$Td6=c9uM} zWf$?^E8M40o8x=2^Gm>{xM@Vh20%rug{Cpp{O}uPRqwD&`q9PSNAllXjA=H~++T+3`~ zwHGo6YE#JVk)r%tWijN&&k5cR(=6SOJ~WNXoSCA-`>sU$g)Qockvf1>DiUAKb+;q+ zmDs*a!7mf>I{5HIry7(QcV60#XmK?9=W(xPV@oh>*vzl}_cteQb84G3)KIEKl>P`P zcb4T>&cW&L5b&|xYUQhK)HYhfTTr!{wkDOqO{jomMciTzYViz(x>%XRm{zE3XR45O zBIJcok9plZePQ?pET`)IFvZ0J`=0XyeJSD~*@xw0kw6OoQI*rABjv>_KA%NeHFLT1 zj^Sg%5-yFFU^7faUeD_^rf+QzWahM@x(=Dh-KPV(&kE_Jbj6Diy)<-e7@pxwX==C$ zn-3nm%Xd_B0g$G(aksUu+XC*i>#u)nNx~4NO27n%-VzqO>D<2d;t+ zALGdHOA;+^4$$BIoAZslrqZIseRer5x)`p`N=AC&fX*5v$McCLyqL;|v=*a^<0XvAmRZvr&``3X)BF`AH?hU=`Eg3*>ht{L zVz1)e@n)sv!>7R;V<;7p`nZ}PSuj~R;`H{nZW3LOy^!}v+SS^X>PzytTKPq~iDJ*8 z71AB)jNQRPV-rPjsKelLXWmjbay(r2TW&P}>%Io-^PSOuG7r=1lXo4qP-v5QQ;jmI zNb|_)jnL_d%mtH892*hk@$iUq>35}ghO5TG8-0ueDyHJRRA>d?!(8VheBFS5Nq=`~ z6G68;BiL|vG~B1zo(FII^5Y5EqsgiT7k{*Gd{jqi{K|py^p3wece75<5(i3P*2}_w zNL9U389S=mGXX{Aa6L+UR2o_;sS6PT@n8uh#*=lR$Hjay^rTLO&&Uxfkr^D{Gw(qi z<^2TQ>&kyWl%Uo6^E;oZGhEHSU|{(4c#Q}vU$qns+tD>G;StC{cCgRWABs2`&HA=T z>4TinLhKp_?g`j6sruL+s7cw+e_AmZ2j*xwC=(kiwq-xc(ri9$A#OghGS}^K|E|cU zcDpLjYiP0yaIa4qfnsMZ95}R!l)Opx*yYJ8&KgXPQ%`PRKIG|A{GFKMy32=T0PA^4 z{RkOI71a#A59jl*GW&P0(Shk=(z>8LEZ-;-Qml2fH!OR5liN3SWFEV?nXPzqm5}Gr zKTR-kDR-H_U?(@>d)oJbFEjvxGlT-48n4Y&9?{p<5qTaI#Kz9VJlpteA}=&)D>N2! z4TX8pSlor%)LQBalrQveK!)lL_G%g$;>v(5)L;er(m-ySpv4Zc_o71lYv=pPV|ww{ zZM)bnf&lFIm2!8SX}+t6%-AJMQIwI5+Omg7z3B-<^e%4o>f>n0nI|l#!T5SQyASWX zy9FVQM|4Ku}6v$Z#b$LmDy`M~m z??s2~(qmc^ks>=go$qB?#-le~AP#5-cH0I6bRCc1bc`$4^<1GNE`$E0JHT?tI;q>h zN?wRxgFHF=T$*6f#H6YANZs1ZPz?)m0a6=yRlg(@$J%Oi9MFr{j#ip1+{itHNY?sK z_;^A6U%&t=t>nUTWyDl>)Y5U0YJJ_4=*wmGBC5${S-`sE6zp1%rX8FhQ8V|G0RiQ^ ztM&|Ma~uYAZPQez1CKVgfswQJVgtz8;N}zAw4m;MSA3_?Y{^qzyiytbw3z5nes)0K zF8BRk0~h*Uy=-1^OR82dNsT)Apm%g1@ucWg!|`xyd7H-1mGq{|0EH)AS%kw8W^dUh z`N&mFCST1sj`GjN$4-SwlA;<4drq4EWJNUn|5^Yp6X zQm}`V9QnAx@K$+yhmHKG-a6KNe{pD3dwmZ_hA#hOBwlH`UV6sdqb4gkzsY^0<0m2t z2$FEFUfb(=;ATnlpSS|$1Kp{6wGMUR0@+N@hmVjBTXK9og+J8N^mhIx6ZZ0#=h*p& zmB(+{TL4r6FBLUgw1W8$E`*|pq6Wfo8}#nj>E)g{hq5=TxcRqWr_ho<1C$?ZZuB3#T?Cy zX+O&?O=#6&#VtV?!$tETIGGO>Lq$&8?|N@SlTJL4DV;tK0(hJ=`X08wj~qVN^1K%p zbd3zm(%7Y1D^TNGC0O+TqQ;jvd>9@Fw~4oFU@in7{LLX`iEf0e8%0p%>S#W`IopGt zP6D^_bBH9WUY!WJ)Ofq6T{@m%1i^kx7NaP(H-@kUMUHtmFp!Wv8ZvyQCn&iUN4Jy0xy1lYK&;KfUSSi&_r__|`?g}B}Hb@aevq!y#%*}nU9jAp288Q0sd zWRrxZqR8Q1d?q~xF`s%l>pRy-lalwr4T7m*{xRWPHM`o01!^Hk>6srYl&kUl;Q$X# z$*8-oGWe7$3~9_lbU~4v04kedeFC|uIP5$KEwtSEW@MD96MhqIIMRxv^1fYrE_D9= zBH}qLMzZ>i3Rm@h3JO>ah4V1!c-u6E(aZj*pOYr$nQ!PfGW8neY@k&>q9SI`rN5g$ z#QsES({!!g6Kl_#x1gJk(;=eFch5r@!qk2svIDDjmWUBCtX3VvUW&C!^v`uE0LUu_ zR+A0D)!|F-yDbWkz-FaDl)O$U_a4_`k?d`$5TSCB2d!7qqmyCkT$-u!XjH2jUrOA$ zalV1)u?#2kiGBBtat58k{3D%rvs{Rz{rh7s`p~o??X!U60kbDQC2{-l{s+90bA!oE zr|0qMC*Su_mEi^5I44zJ6>nmzLPV@%?o@zK*ykH3`x z_k{8+CP|rp3Th8*_0wI%$Gjqhy?9Zang$K7wl}~sep%CaULfRH_!AbO0lZ~tew+Zx z?ft@0n_krstcEdt0iNiXjwpC`AutU?Pr?9}u_wJ0^3y95F3X+0H(sK0nqTw!WczAoouI)9y; zMERu3W$W-=Fvwjlj&HU^Oj|`kMK(NCmo@JcT)N9CHg}IMVp`LBqekiTscYDX>SmOE z>aJ{(R)@^W&f4w8OgXh-cx}Um2g-^nzR=7)6Sp~8HamTH^poMD2oQxJdhPf#Jh1#w z6)t2rse4Hr@Uc3UwT}6dTr1zJS^|(RX$5h zQh}~2O+}UFxX$|vs>+c6OQ72e6DVHbYsie8#E?4`8E(O=Q}TK#N0}QjyT@K;U)p2A z31{lnM%-DwDX)vPEVH9B+rzhE7=&CEkRf-J~!dY@1F))dyI?n__iqemc+r5Rblo@1jCdiDeOB#P$RS=--fS#qgcKo7G01?~lG}$e z(j{KNP;Ryz;bG@npz4%i~Ym8FmaD`)H4 z$iBon@g%`8%M6=~?K)l5Vm!nT-4ub>3MyMXYt2vUT{2>71pj>6r-) zP5d?#Z=ESw@CnThnmECgRa^mQx9JzvW^WQjA%EZJinJiIL>ExJW5x8s&vCO#hMIS` zR2>Q)l!1iAF!1Cv*&Fu00|Oc2Vh2 zw%I=gjLZ1d6L-XL=C7OnEYUy&|({dvEF9C9ToXX_!-L!UVR|(0JVQ z3o7}iccQ5dVnkWGUTHiY#_|4>s)3oII@Pm*AU?Znk!mOYaKy3)FoXGvS4jCiek!?n z9+9Gt@q<%*LsrSj5AYxA^$Una3_&S^ZqRq5Y6Q!gN-uAXkZ2m9qUNRaTqb(M{MUCjLVaj!1-$fSQdL;GN+L6T8+Az#XFeY*f3 zdNEZy;Z9fA9rRrqaLd#qv)KVANY9!BkmrZeM_HwA4HW-l&x4@4*&9tV#4aDC$)hqq zCCV$%%SDjeQfxZyKlgeckNKVl4L-hKWSr0YAH025Dp1Rogjtix?YmUZ694!-F5OdK zupwmm3V95B>qHbHuUAbNSs3^kq&8R!U?`59yMLuvWWWHmskgT}C)yf%OVc8uDfFt? zUz|K0BXp~NK;xF20-$0HEQkv`x!g#mOUG;wM@h@hyiJ|iH7Mol%c{)vT7|hs+RLW3 z#GN)AgvjwD7phy&to@HG@xa&S*#jMZyBP&|!gBcp%>=M|_G^m;wWxoSof9Lj*q@;I zqdS+OO|L|6*`D-{MLId95@h<7i^xZ|#*EIe0Q#H`_VJ&MO0**QdqjaVSwgALthJgy zf9J&?Ch^^OVZdi|@bQ*8$aOoX8fKZk%oIAFT{&FNY!q$lW*?$_ch3bq`l9d6Qw7P$ z(O`O%KmWjA9DZ_Z8GD!SQN&#EXV&RMzLQg_U)fn7U@}m`H-56RA|P>64>_`%IqMNB ztUn`ae~eb>LF=9|(f(V~DE|{yxzw()4u)rJLN_Kin$-`>gFK| z+LX*Cl^hti0RrG4yFF)snwc{9h)I|@M8VUb6S6<_;EWY<38u2v5NIp&kT7>>cTMu|Ny<_eQ2C@gv&p1`PHE5FFu)NVV(Slu(o=@Eh%QDfj(hsBMVq<#I9H{=QN@u3C`FwZ=HOKq>xF29FykFjol>Nz^xz|g_|Pe#DVgt|;+#^WyPWxaw0RtIuOd$d(+no zQgUoP7!AqTca|ya!#?1D=g1EfmHr&bZKq3Gseyasbvt|UWFh(FUYNT z&`)aC)@72R(=|mlGEmKL-lb-pHKd3K!6M*sOn5w=)zo`zqqj?s9q7Q?6L3 zbiz~@JuoA8^bS&&^tkB2_wBUV?F@Ld5L8 zd96)P@!#2%h0uhuVo*cy4At-^W<1d_Tu9>KE(o{q$f89-tYVws`O3&-Bn zYj+BjZo3g3x*ArRbP^rbe?|^_v+RZQjnnx}6zpCufuJvWY}B}~TR$IpjL?!ZEEk6^ z+G%CnzBEjzp$`>^jTydgG=0+l;9uVagA_9IP0?O`m9aMcH(7k0*AZ&(+|>LVKw_+A z>G%XqUxy^iuuT-96nw$@NbPo}Pqs{zHC5^rho=LK1I=3TF{b6l=R8nPoU_`>%(3{- zYe(zUXs_%yfH$Z)$Y8%qeFyuDb!})B8OY0KV8!7DvCmY+*0TT24{u2J@9>l$i)g$k zd~Cb=ILWxD{_^?d@tC%(+Al#rD)V~6VzLl6p?!u>2Yh#bBw9f~Z~Ba~|3k!q zseg7$1~R4QO1dz#oX$RLDVQ4 zYi(Q9%axO2BEpUw|^L_cCvq;}~)K-XcF;srPLbR}zS@yC32&0ZzIYC8^KMw;b!1G+5<1qc=$2I^PxVW@T}QiHvrVSWxsR|It6x({EmTc8`KscH=FdlmkY28 zN@^;^+^Hz)hlj9uWaTVznOJd`sjk__&G2vYO#svJ7y#nupx~+6GxV8V2dRGeHbb^VRQ{@9JHRlBlg&v zX4xYm4qTnC(yO)9`cvpLvgV-Bpi*G5d~3lnJ>o&O_S#%>!p-vJMI$j`J_LxL=_1a7 zUm_05y6$+j5QX94MO&^p)}mw2({bAk>+w(Pc0t ziF(y!qU+vzs|q!TQV}k`gf*ygSDj5c+c`?}uT9oV%S85vq}J4- z(q17A0_KEOuLyKDcL9wVVY9swIL+p)sQY^Rd`8oE)o;^t`)R+3TjL863&qB-fW^H5 z+5L-EsYdF*Ni#saxMo%6=DKR6UotW=xb{J4o;&dnFS>F63dYkL?%@a;whYRHkmTpc z_L!zy(Ti_)kPI%Lg=+Pv03P(q^75$HuhHwzD8aSH#{%%rK^$prGE$$DuW-Kkc*L2Q zMl+4BHD3To%;-bpSfFBZCT%Yx@=K>ouZf6%UL8){%$i3KuW%H%IQ~iqmT#(ZzY0D+ zPBH&DH8w*b=M^FtX7)DP*W zwv&3nPou_weBDg88*zb6ON-!r&Dm4$1c@9d@ z`#Opfj+6o4lAg^FWXP zdtBoshLTF6=QA&s4BN`vJe$tNtiL}4ddQZJ37s&6Vs#=^mJiCpiIRkJacw>f0kob0 zMfvngFYtTLQo=%5`&bhw4>VZfg28Gvc9&(#i2p1cNm7nR&!UdAB=5UY**?KMcI?pf z^{;x(rj?-@=90Z-w8oq9*AD~bdu>o=&_FGQAYI!>M$`~jHK#OOWaL%BNlxwsZ169T zMX^jbo7+E|ym@z@Q*I&yFQdyhkjB^wa{|ayxHw)svlmaBDn$}z1TQ^jFleBARIo%- zo{Jd>QjdCO&GmYWoqD!vO7%NYTM-JOQGk*IkCx_$soFy1;xD4d6ePE`2U7qtiQ)e>(GGMWb%oSmFLP6l2&oGy# zL-^@%RwU+OLGeu1ej=MXZ}$WwBm_Nkp=7njQ8vNHvVHL|sf`Ev&-xED$f4}kRnfw} z+P3mU#`aX&WwA)S6xM5XjCzRVhgfgMHevU=Et%HcS(W*ywG(-|`zq?PU?L`-8iwxq zz@r>4az={|;M&$XUsP>S+jxzpV1)DhZZFP|qEiW1Qyk82J|w)Zq*|ag^P8CG8=RRN z#@!*>|Mihc3Q4W@Q~Z zWEGF7sxTThvu(R0m=71ekfmHm(u;k9+9-spIk^r zp0%IA#^hl_4z#wp&8>f=cjFrAg^$va%nH7X)%o*uPBqQ3%h1}nX7Bd3BER9Y5Af!4 z|K-Xfjr9E77I22H0P-cM<4iHcr-4Aq^~`m@`XsXPY~=&S2}Y-%;x$}DaD-6gNSKtUrH@}WPIsj3I2<5^+e>+c z+Kz)_8l*z$D>fg`z76T!WsIi6MFF24_l%m>p)j8~XoAkp zwW5KE#>JB?y`_d*lfEjWAA&NIZA|aZrQy;k3?{c z$AJ&Xl?y)mo=Ccq^w?|JJ1}iaCrP9wv7w31nt#cES<|PTsp`$70~9w3rbB~=p%Re0 zX%`v#wyxsR(Wb27=xql<`z-3cw7~}@lzf_}PIS;0&P~XZnzpfRtS(on-28-u_zgZrDgY;OehO6UzWL zRhkm~zGgAL;0>~L0A6L{eYTErD3V{VUiWUC_!L|n*f4(aGmKma``q z6nbC|#f-D8=_CW&_SM71U3H%)=9R=%o*2e0`rhPKGoS)Jm$pWSa42L!g)5 zw;B9<=SGd+xYe-#s3AiWj#=%O#1;6d!l5jmLCw<8ga?*#lQME+W8b#xlD}y7 zx)0G$qD3nO)FKl9NUaV&un&nd%O@=&Uv=B$Eq_(clchKR{yU%Uk$L7g zzW?0aHoy0*{%X_ukCo$PXA5gNnYhiPX9R1l-kY5y>Ug!ReD5PL zQ0m|B`gar)uV)DN+p+&wRDstikD_!#r-QEN4Y+Nvv0BJcEKR#r5t$*lQ>CWz6x3kq0>sR0W2h5UVcyS#c#D39|no zd&Dm35D*iLaF+_?1pC2^z2KlH^hXISh=uocwx;yg`98wNFzDUeU`t;1mT-i56}3Qe z9%S-iAgJ`^UxZjp^^KMIL$zJK;cG*%krwLI_x24|NTRw?|Gy;WfCF_nv###@v#6Dk z1Sho2?+v8tA{fWBUIwU8!Hb5=7NTg|Q!z2Hs@`=)O{X51bj3-ilNhIX48ZnNf^Ket z1}f&=r;khCe=F*(Jm~nwn_IkV9&>?BFy`Wzk97w&{XE5|B7d1E|$ zOz#ah)Nb+7TB^0VJf1#Bui<0?PahQK$Y;f%g#Hrbx`0(nVFFcVWl=1$vVD(NfNi^I z;Q7uN)dGhEw;@!h(p|+IehmcW|Jj1J&~M*O+u4{Tatf8x%H6rsS*}K#DP%%FpxD?; z2EGW63Z~ppuG(kM$jarueAZ~9o2m3L-s|?_IdO?XpivktIe z8j|PX01w^}j8aEU@A-eqc3Mwx*C8yiJ-lCynE=1 zO$TZbFbZcrCR=}pCg5i9Ao1=Pv2=S&focV30D1HF|!UnzA{u$Sm{ynf5KN3^ic zsy|j>pX|a&_(WRH!k^0_UrDU=NByX8tK&246y)dw8vLc52}%={i@+j;gN0t75-U## zH!%Q}1*xa%4-%-dk7)oJDp0F7@S9WJFSmKb!Q9b4X!LY|+uw9cBUL)ZpeCm)1J9k< z&}-3^i$!XaH@yQKQAvQ6B0|y$yc1CBn$FZruK9!x-=QkC_f;JAyv)0Mj_OMHE6@|1 z*9wl^olSaX{f094q*;+&$YSCl8S-ZxB#g=)NJ&$h(PJpo2vwd&b}Ek#b=cU^oA-mp z={gKnG`KEdex|5Ig|=}}xdtsHwf_e>uIGb$)<0X17T7+=ATxWq28jsxD{|}eCfu8s zfGoHNb>q#IF_YEbj%287_?HaYu3EyPhXDM>6IfwR8zm_M_lPCXA1C*%w{vR1|1MoE zH0oC5(>K(m_Yip*E#}?D$}-?1P~oJes`x!M>lW*%$K-(^^i&wc77fnK+sgq|tJU`5 zAyjZQ0&(mkB1#qa=8FHXyDJZ8Gkw=lQ@V_*QKeK(2lZYvW_5zjBIi7x=>=00yz#hpobgGYR%ln<&Gw2Y*W>}g80t*LU|3ZIc%HA+75TbV6tliE9r^MGTeMyT`ya2Bl}e- zzpuZ{;>tOz4juPV6LL*JftXA1+X=WSe~GeY^oA#IaaC}s>N^1nUdmo;c;0ata0NK=9e^^s(X`=@j?4 zs*91GxXAK|d2&sx0l&EM3#DJHN3kXgCRH;g_uj8z?g6Ipnh7;WtZ$o!l27bSxqM>T z1)o3l74gt6yxM2+v_H%-W1?CUq3HT8k$l;FAF{)c@v^kVH z*QWqmIYC{`_RjQxw<^g7@DtBuu^w5=-Cy21x6-@c4lm`Jfm{g>4@J_Ba+WTAZX$0$JIp?d;dM=sv ztG(e;R@wKo_x_=*gpa$0+)kOnKfF-uiml}^)!O2s>Lx<=!RNALb2CFhQ`k&T+2E+J z8J)rDc`UmwN$uvhr;W8^@SfkwTB3Wm3tx~5X$8m8DGrgf@#PEA+?uuH5#?qRuQ3XI zJ{;#+K*>4lqEe(*q$QelPW!{ndHOzdZANRD=|9~oE-6U5(p-1Q-7?#o+8<69&=&3m zW~1bFPZW9E%CzgqySwN>e~eD9-f@i0!%X6B%#Ej0LbKkCKwjxcqKcdsFfZ#2CE`4t zfKqet*u?i5<6L>|*qS#x#Vl@nnUv)_J~%aIB9U{caBRr}rBpMul(LK!!aKpbqfX-% z-#1?N*S^brfa;ZOlo%1?@4TvkDoWtByDhZS=I;c$lM5$p;zth5Ld5V{v*X;Rot}Lv zzX_H&^v8F$Cy#EtFi%lg&_SjCrfEZ;d_jyE0W~gBA|HN{(r;A1)j^v{B-3*+3cd3! zk$iT*$qtsas{>*fgQ%DHKfXlq-1E)F+|5$BSo=B|KK~Y+1Yr_ zzwU|@%g8gXrcX@&r;Xe8HcapMg<)CR_qP!G6tQ+!BHCQ*GC`zRyj~DEo!8$z}c)^WWa*K=Ob+J)(tZe+~5TZR8a=h$O$%UWMw$(?= zAdu>OZBy0ed+KkE!t6iYHJgn>8x&v1fezHhB7jYn|9~5iOYs-+I;z?I^dDP7X9C>t z?|YSx~&c5a;j2=$m>QQ0l|a3h11%T9DH@z zi-xby3o7Sg?Py4-xes*8gdhWzJFayeBqt1h7)xg>VBGB^C zaB&q`)PyxrP`zFu)@Aik8)Y8j zQW3i}c`I82F>4QMCM!U{X89LQ0L)t$5GLv-MRcQ4U(~`umuUhFNm!zPz(Nx9E|u z_>gOc*D+r?QWO$S@LKW9VmdE9$$nw)BVR`dxw0>dkZ_)>rH`1m&@c!(zxS8V#jbK9-!3)bNK-;Xc2zf6S}HLz{s;eQL5knKKz8Sw}uplpyA-q_i_^iOje4&o^DV=8n8_ltpI& zN$Cd>Ra8jcaoLsau;AP$~utE^y*qC9s4@j0#jx0vvuFH$+Fa{m`^ua zMft*?@Fw4vz9^6kwf2N+^a5{@f9AZY-H|`jJ)D52Q*5<_^C}bjX}r}8jp8wXgYot@ zeO62@-NdYP7inG&UHM}VByVA;5oTLnGp_8--}FH7mrj%^X*!7%k|kW|F_v`=`ggHGpb@37mtN+*Gvr(EgDchR2R=|L8g4 z2#}P$(eL{2G1sG4&o1f^m*K+?9GeqoBmlRITaNr0WM=uGK|S}r*ATVyn*Zuh{@p6T=*S#bZxK!RD-LTdI-<{!)J$)Gf65FddpM_niC+dO;qqu}7 zsJ;Frmeq?~h=5i#93ZzqwkCs7x3hxPnlyqy!sqDtoLxLPG3t8R@UBxhkNHytgevW8 zUaiNd-+;D6D062L-WU>S97ZrP!!hZrX`B4Wb^azwaFf|^?<$kAirj7$N!?s9MAB-J zJGFT&(dUA`c3k6>;gWN@1U?_&88!xb+_m**sX zur~I3mDvC?fe|A^72l8g3O3$7P$b14IYcCjaVZ_b?0I&33`QCc->IRXXPA)AgQO3OUs?Rsl2&I3|WoWE_ zuaO5}ecH0#XCbLvom<7{(P_axyXOhc2IQ7TfYS*|@j!~=ZWmd zG|sKMJ(VD=EGFzf=0(N14Hji&WZaEEtg~8Al-7o(As63a@*9&lco3_NVm!U;!TMj&TmBr;d710;WgK4X63DwFpd z6YwaquDjZ=Q@|VlpWrV^T8mY@?ivGV6O7pMaOM05Es^43S%3hK%i?OzWvd$Zi3W=S z<%#tKN)warKkhrUGL8kM71YY5uuIKhQjbbxozyq}1_Cj^a)6Unt!KP^1U@4_bZfYy z*mS}mP}Fw>tSbW5uNaJ&D7f|_IS3I-v?|4IjVQ0Y`HX?n7iZJp6AM1_9wR;rFVj@l zn%R4N!3!hpT7X4I*TKx4FXh41AE;3mi{RBB@T+=bh3~PYMO0OVLq`0o4{-alONao zOf?*bxKTG|KePkoh~UfJ$hQnso{j(Hvacwhf(ooRU7~_1E4a@I%5wwY(Vc3+a{F0G z09EU34-|!p8?8kos;Ws80-VZtw7FF_f6oWfg-SG zB{s8j$EiBa*Nl30tKmz(feWifA_(p-o?zukm4*w%qm&2(g>p%`5Zgd)X zzYI%}bfPD{!cjUR46M z*xUx)p!5;p%ph$zwbRVAiSCCO0^&oS=0=(iNZPJHz8!lS`iD1|?kLFXneUtHfff%H zTS+Vw1D=ihPYUy`j8qdn5W%CNlyRrHz}4VM;vkZOoy7h0?lGUFDWD46t80?dNYSPN zqXF;u%$CNn3YQwDql6~NCH~q<%w3WpjK2AI$aPBpYA}H7M|A(kV?#Kg%fZuC?~vAaw&x+XTxk zcHz}iM<*xPMp9z8mw3QlRh%(oTvH1dcNwqu9fBk2q-T^HZp-=#@bzEr@Y@DV`wrRg zzqApOcYm`E9=V5@kXl%(>}#A&wF)EFhPnBG_sBxhpKy>wKI>}~EdXj`L1R#hm<(&< z(Q5c2E|Za+Eu5QFkP}A3PSRIexnT`}I@w{gg$}^^lly9`C5mK@11Chg$5p^zpPnF@1-sL3 zBc;s=PcMu=jLBR&Leb*c>eC z8GKiCZz|m}Q>tCn;(yDYrvGrX;7zWvmR_-?i8B@Z*KOaVh@3?mou1@Xls{n|pLh27 zFeqjo=`c0uXp5hBI-nQXyB8Wt>zVhkEb15Q9=uD>jUcibl>ZkzGoNdvIEqYk&kh?nC2-V<44a#+ zoA5e#W1O8keaNB%vy?0~uc=Hsv~xLJaj~#%L1*t+Ps5D=K|iVm3G63Ap0~<`rC4f* zg#YQmmYngHn^gv{FMp9)>Xi99GGVmveOue|(sV9 zPkQCu2A|25Z`RGpbuJC~*s2z_9n_S<^k?Rp)Xm5ZjfE0g?0n9=Kj$b4nXYud3mPtq8deM_R0l z<|cnwT6Q_L%^Rw#tB0D(%zg1^6zd8o9Zh!`vgBN7r`1xT6_C^ zPZ=4t)vC)xXo^p_-1Lq#czesDzaU6mTF?9}1>)vN=OIe)Vql*dZVlHI@9<#uii|jd zA$+*Utfjoy13{|wby#tuhOV>SHST&DW(-ozU%ni?*;76|JX{fe#J{DoGD6~nOKN_8 zKAYpw11>Hus`gtDu2(fgcD=))99v=nspZ&+zDEdrQub9&1g*(C7Paw{_^U^~IbCNG z(=)Gk7GIxAdz&xWwm7$xl;G&(WON??oI9No(Wq}49+s@)Re7v2IT#bfYgclgMV>2e zbc%?T&ElWYZD9Q^Y87)guEpcj3ed6E7(uA&>Yr{nnv4e#C9B;>KG>x_Nt3 z4G*<6rs2vMlPw}-wui_nb!yYQ&rb~{J09bw4;}E}`S#M}6P@`flf6CVPqa>L^R}-_ zmSV7=MWQ=Uqkj;hN{?3C8WJ?1!&D2FK`6h>|ub_W88aX>hW^NS)thGTF%BjrD~x$MdZvBI|tX5v1Kfi7SpT z;pvUiPJfxD&+4vY@TDb)6FqVJZx_55yN#B*Z5j+3n(}>(40kh6Nd%~eomq4+S^u!x z(yJoYChm(}(++iY#W%(i-8RM5C0yD~Detl!c-SnI)QhiJ^YFOf>+6GhoJ(nScqZ}6 zA(mr%Pc-*x?d%Ej!kdUHj!p|$D)2D$pDbdtsM~N{YeedE?YXbdV;RDy9Z9%)?X2-FN^VaHxURa?WS!15 zq>=6A&xE1W9(%q?POl<%PL&qy^FB@vveTwu*;UVCXsl7^c+y^$M=KGFV8*+BLnQ&H z;ZUQg<Rvu@6YAZY{^w^?PC32|CT>LIX}O`t zYo0Bni;^!*elF+spbw&>aC>%%f4YpuO38B*fEK>nYn~sJ%096mz+Gd1zYUGt{kW8R z7dLKlY5t2;poK57APBwr8@{2FTpqvd11WeczseBYu_Qw{?0L<-c8TPL?%xX`_OVQ} zRKJyWyBwE?@DEoCWRnkSPERe4IH@P(>(O(csgpFTGuA>7MkPw_+zMGn1bKE4UC5ud zbzG4Gp;IJp9KHMHJ1sAEH3gto{#Z8fZStG#XBI_(OKyerLH%9F?wc^KLJeL%a-I%g zmk-a#cA@7EZhX8GaWh_R2eLI*KffyFL(lsZzoiYQF&%1ddftsSksDdpq1eoGlcq9% z_u+V2glh--URZRbjEwwgYPm#>UDOEI)|({juD;&dzh4be2RGVK!b(v4@fn5!go5K) zxdUwHR}5JCOjzT>6Y#u?r@8<0UTMH-K9P$o2%pCABbugwwVfgf1c4 z{)vW?1nJm+wf0TAnDXKYa37vca-Irwi0uCV?!%@buoS-YUk4avwJE`*un|7BJuEeT z=w>c6VvolU{o+8Yqw2V6bfGXf)XyU!zsDV`VfF!xUXVx%8ytFEo@IcE6T#f5bD&4h zXBe-nB%!&=0;_Q{*eF2LA}rgtpTdo@+tnf(vWo^cDLPRHMvkqAc>eiJ^2c9pKn^N- z@HQ~hh1l0Tw>Onu1+SGA`jah8PqXrUP6fx86-CSP&r7ok0}1gg8wiV{JiZwW%K|IE z^NWjE2k4(B>!Lu)04nHR|Y%?g3MO$X6P<<&ttufv8bc1DccW zAHGxqR+ZJ*>!D$0o`v7A$@j--}T;;%n)SAHioB;J(;uEqLWLjVhX zH`QUoaXep>OVQ=5j%3s+AOmC+Cf1+i_midDQVdCW(*yDX(XY!gcPVc9;XU^^D@vki;a4=t)QKupq z#)HG^mqJ3m0c3mO*f|QfLR}57Uk@0<<3b-Vg1jV$$J*KgzKF($nIP%#O-adVJL+f1 z9dhy^MSWNSi`>sVK|+$$IU#+Q<;mU)<d%f?w%OQ+NrHOAjf#oDUr< zmt=18U;VAMZmGlSDa>9=MJjGv{(@Tb@{cFJQgg{+C8^}}OXihVOY~2=K4_0(9E~YLLPrI&eo9I!td0;^L_sG3G&^+ zeDr0c*hIJLxq=wbOyu_cq{r*skac~wuLG|mMM{xTpoN4Ex$LefimQ|VN-C3vG)Hnc zNW5}TjPF0h1=o+B=evvE>|-+TX1NRH|25;TTqlcJ!wgO)S~kas?Pq-arhJg$jxwO9 zN*Ac*yfPgp2WUB+t!v{|feskGFfMqw`xIbQ$*BZPTfWP9PeoBg z#9^zZc@O~|kRY?z?=+l~uv{Q^v!}(OH{!uo0X7q!BW=#(NAgE~ zJ1Qe>n=J6aYX=5)!>My7`v`wSdH2=ESDI{351JHrKQeMH$-gspoTU z_za~OyvurTxRpD-QwHQ3i)P0O|IO5q~xU$re*8CMtMfDxR^YYN~>~Ra+9pWyzP$ETv>9JAWdn8%Tn2r~H>9c%lS z6PyB4y1DkF(OO_(8Dj4EoRP>KU}PaX%fpYP$8b<12wQQ$X&U>b*& zwjDVC^5Vz0Hb2HB(|z`&CW+p*F7{#N;NZYcp2cR~=q?5O&CUQ>0^*Pk>H-`COC1(L zj0dUZXzcrOk2IBw)@9XYpJ%I$i1%1?T(uXutTD3i?X0E&3Eh%imIG(sjgZ;kusAYPCfrt_!s zT;``ZZk8X+Fsm5AE_4N{FL`5Uy#1ZKc;49&mmXnf9|^jSKHw33*vm6CW0=GV>V#ca zq|cX1ciV)`M%VtH?K?tES0X_rq~MFcS{^Ai|AN1s*7{fk82V^mw7aGC z-P%NX-`4%QLM_jCp9-o77fnGEwDBpQ@tijMJ_0}bDW}M~HcfqCa1SjGUcGSdQYU)Xq^B&wS z2n2t&{Q#}xOnK4=)n%QghoxWvz`DgC+`zC;u}ia6GRq78*o97zl;E6Y7DkHPy?iR8 zWUv)shxl=zGCfLqfcwNb^PX1uLG4qpO+u8bBL+jvsFI%Vi}mkuaP5onmWJ5*#EEs5 zTHJ3X@g)({9?@)voseHn$m*R^jTkG|=Cn{c;%4Vv(<7A?fy_x2Yh}E|1?#0h6oH0CnL*Pz$8MI;ft) ztS&hUp*tNF_~z2*ht1dCSyet2^PJcTZY**;V6V7@1a>MTN(wf`BsEbTuNoe&9_2dM zpI~(T;}-9oj(yb+h;KUmYVtin5VK$IOo*^;!Y)r^({*2d|I8b89`Cy7v7T8C)P!{# zwmOfvb6%}UIB2+}Ndr`YlDpni&$eLQw)55n>tYQZidoHltfvY$2%Slnv-ZD{rv_rFz!b%@)Z5&>OV_P^+2QhKs46NeCF$K$nRv2+KZ3BIRR zfZ%_N(fDySIxjPad3DE`Dcp{#?1~dui>%jTOY$qARgiGN*#5?MkF$U%>Q!LA5Sl5F zqe3Lc^KZzjaRI=Q#^c}U4y)PltHg~fwBje8CJ`K)JHO&zw6OlX!EsZN#n#^lKmWxG zDEG)t285+pIF^JQx{je#%bP?P$#`(}^8={SvK{+{m7Ug7NU$7V#zCoH3Fya+ay~0m z8!-VOefQ(9$`9#GR7GMK$R;E+){GL8m?HcDML0fxqDLzv$rMzN`{r%yn;y#2?am=V zZzxren4-_n#i+o_f65eOa-*l^HTCzV!saWk{!=}S$a@NK9P)<&n6Dpb?4-ZHqH?UZ zme_v~5qyk)Q2Y2iij7EoZ#5JmU5xL%89levZy+`*5TpS>`IEl1S|+QioInp_?|u<_ z5E4)c0-+{bN91BK>|h0kn~;g=T1>k36%?g5uct&lz7&!AxjG<}i8%nY=)e#s0U84N z6S-KYp>>}G@5y9u_5N0aMUqmGgbB-@?LgybHP=`nOQ;Loe?-QPUjIO2RDp@+n`EJj zIl4N$!2L}XNe8|b`jQkF=B}+fqgVW7b$9`Z{Y7Rfy{f{5uqf_~lln)wSWN;}1JJd9 zH+uinE68gjk=~y)XA?@^ScS(`F3XVB3^VD^gJ*-*F%J)k6 z&O9b5aep#DXe_1s89;o3q61!ZV8u9VIRAZfG>NS~7jjO7kp4T}ghx(dJ0)T*`xhNI z?r$basK!zZxH99ZQ_JBr@02|~%lDxbr7>zGcPoRmMYrU52yYRs+QxPB-uK4vo znG}7S@4U{Z!yZ$DaYxC=z7mTy!&&-(4J^=E08+MEIRdhzB9&Y!dtp^^+EZd>sDc(^ zvSPZD#z0>~iL>nfpGS-euY=;pep6~zC?+VnW)0B#zq6TSyiiu0z;Eg(IST&KOn0HS z>39`vzI0b*ennHgp=|n>@BQy`t28wW6WHW$9VtwK}-|l|0F9k=4S{ z69Zo0@0X?`qJN{+tv2V=L#CJ2DY?(+n!$>7SKk8y_D8EOvhv&BE+ z6>1n2Zc^&}MFQa3dV3Q=XPl3*2<5!8Bx&+j^?Nl&NQOKvJ36SMeh!TY&}WVu1AXQn zOQYy&bL?y0)$WIG!fnqB4~`)vfC|JfkQ^?qu5BPZ=~eJ3G8|g>pEeWf$SkBnx#miR ztOx%)K%x7cs!eho)qrp_IrdeF7A;|!Z<&6oHmKD!j;@ny3W9c37U&?LvIJa6g-&|` zEoaMXi`t3)+HL!FUjS-G*v_qC(CnhG!fwuM6;81?FIZvQ2#v4D`8nuY8 z={(jisLpT7;X<40Fh45PA;dXzq#(Dn^Xhx=S)p|8q0#qD85EDYLf7E z7?0#})EG}Hj&-oJ#uubGV%o&cl-U&qNQkIlysfN9B3RS1-F+q^s)-_OMR^t8hGHX? zKDRLY1kd2uizc%4j}%uoOZpBG{HD}1ThvsE`isPJp*A(5^HDECPZ1&1mDBHQGhBNj zQb-x&y%;m1#$z&fHq_sl>Qha#Xks9@0sFX2{RP5Yu_NY`VDMQfZJbDvUH_16@nW%X zTy~M2Nt{!&`m9#k)X7QW(1(*wC+4T=1h_V7eoO{EryrWgz!m$k*1$yU2oAl^jz1_S zROU?+=AWy(T>0e35yFGcAfQ^yG;j^A1T`yNy9W&ixv|8}n2?=J;|G?_*k+2jd}n!; zC!;Y>-^aNAdRT>CLN0x zEtN+Jx?a+0UrV;*XK7t?e&lCAAH8jzf@vz6%%Zq$ZOxOpe3x~K*I?GOcq~F=sM4pG z5U)s6*g-7UB@Rg}Z&Dl_Qrfr&XS#oHkufHJw&#^;nX&~cw4mw=f5Ov;noV!6cOKtn z@ER1CgIVL%@=OLm!X#`5`}+EH-&l9-eso^gWo{z4MrN^A#^pP66kpmhg1p}j%-y!x zDqCu-gohtznVx40>>HifK->CJ%L~0hyy^t9b|n?6I5pHf4Q5Wt&YsRAx{x^P2WItK zHa4K#Sbdm;>-P^7S}N&p2a-+(?ZE{XYqq?bCO83~kF@^|3gH~549pXts#9A5h zurhnt_6X4H(4G4YbM332_tz#wfj2Ftvlalq57m6zerJPMMW)@ekupb1F;buH2UxK9L zmmHP*+ufPc9J6jXgKnpN>h2;tYfi*jLkCpG)i>-!g|LyOaV-XPTax%Fpdj^~$41 z-f#L;DQQOd!n<)BFafa5j$75o_;E)F_OSzv%Bq+*FQZ|znGu2PC;2&Szg^%l3eX(r z<8$75HL{mHisJ{pKM!l?s)O%Al+#iM87s*#>vh8djQE^*EURmA>5VPuL8)M^-MCwI zr%%*3o`Yl93AX}OQ!r%DfwSjEaj#E*08!~|Q;h3TaP(eOtpd6Qm~o zoZAJ|*(*Gogx`zxJ`K_wfVruK(NDAyrQ^A`UfilEsg#}{JVS_d4Ja+BIRwl&8LVyH z^TgcN);2zP7!;6W2|6jdr<*!EUX>kS&x|-Fm?w&xfXI;qxyW4&o#48u+)o7}5U8-N z0n(`C1!j$ojqQZND<%F`m+4j}$r0J^88|8Mh`HbzkWUsmn6Ph_wXWrk7I&ASlGQ?H zgJJTHg%7;ar^C$cVFYHl^(Z*HEg)L9CkXjanY{$F{V#N;!;mp}I|Vz?a$a-gLc;J-F8n<2{--FS}5w?32vW zXmAbKEgKYNRuQulP~<+|-{KHyUBV^pHs>$=B?dY?0_u=RQ*^qs#mAQpZkeTU?qT z^vI`|D-J4VZezP)UhIN7W1Xy#^MY-_fYPMd^MXe2Og3$;}@fA+)=D`|a9@*z!J!3~K{ zdlS~VH~Ks#3q71O-D&fL_~2fXx7o4NS*7!Yc15VGx%p6S1DmiPHqHm7Ey$V7swLW* z7vBWmH~SzVG9Xhw;9GYC(>CiZbP;nRH{0mw*v*PY+h-Q|W7nf!3{ktQ!g$WoJP}nH zdHf}7>d}X`xa)__Ctx~GW_uZ^aQ-fXCaCJ$2@{T>!Y@KLwCbKgjoysG=T(Y=j8muX z889#=iJj^2=5*|ffeAd-C~36Afd77fA0r5IF=tWX5VuGJTH;`gQw65+RX1qh`k*gI zN;&mZMmT}|9(lc(m7)KF$UcwORzcOU7fxSO^g12CN8{6vyi(6h8a3PE;2%ClBbp!H z=0&_`^$jQLXPDU&jvqZ@B`FYkxc~WJfyfd~*d-0A4As{^eD^B(PUA!DEFL#V3*oIR zmXJXXzmZ|z{*44(E#zsi# zRl)pH{uF5xE4~H)HOEdn3jdY%MLJqmpZ(m<4=9(6$-VAHm!ao1RV&L2F_be zNxt=3{osG+71gUYw9z4N-@S{1o)}=#oSVI9|4T2lzPcpM;GOH@4r_TW1lo{$JNT-s5^`&0Wu>4? z|0w`CX2)7-^l?i^d|~!7)=zxkZpUI5uMB_Mvh0Rd*ZCp*{5!l;o6B_lNDBr#-wavX z5HJpaqOF34&XDFIcsQHi+E^AzoYdXxp@8-VP(ah14KszRPmhiU$TK#=-eEM<74&E< zG&rzR=Gem|gp&;;i+~@VO?3FMiey0*uxv=fICruqpH0sPa3LYSP_T}$n{6!qB@ADq zW1`jt`7ZNpwFc1L9g*&vL|k8`+BCw5%_;Kw0>mZ5jV{Q2hzk&ZBm z8$xeEhkx+bt_yc%c>dB%RT6NNkiqW!Y-YK_M|S`Z0Xs2O=Wjz zN(>eIvKzs`B($;&Z5vJbar49Ph|O(FwlPtZ)hY}QwYu+Yt@;bL<&Ss@YHKy?3P(o( z#25;STIhldZ&Y-X6J~ie+0Z$`C@=~-T?>f;8f1>j7K?L}ApEPk&nxSSQERaVPc~o| z8y5ZXAi9H~e_6Tz{=T&BnSpS_d**9_%5_%!?sPl6`GiiRBh;b&~ zj<+lcSB&g!o2|6dL>q?tf0T|T<*bvh87VURlKXe1?WqdH?r1{c) z=@T+bq!vrCY2!eBGJBIHjKKf>^xg2=eYjg)fhU&wqn0d|JE0@8u;uLe(dFiMQ2~kh zNBlag;^Iv-HTjkN0z=k6$30ZobyVR}sN#dWyY@A+9Ou%#8}mhu`O25QBKz-bUCiJr zP%gO~bByY?{^?z&%iH_YpSX*$RXT6$Z4mMipDgw&@l4u(TK`6GcoNC7hlH3#m#K&?&+afx9*;jmR8W|n=~U#tTmzvT~Pmb z73OQm(&{8nK6`{uj28F5d$sBHXLG*8hi$t{Lkg9tXgV}l`#yG9e;cyhd{R}FL+nbX ze*N(iCq6;vcA?Gz!dLe=SU>#X!W@axyF`}!`&@-ns?>1SPiGMymf>FK$QS(jP!Sj1e-*?FPlbaH*u*RRFOR9;-0 ztEZU z@Tj-jlbw?0p^rOl^r^$z2T$krxhgS!6rfN{4EN?72(O|JB{eky%mFJZD(dQfYi~E! z(`$rG&~hz1<|eI>=kuOU{5ahMhV8dy>GBeTj1@l2*9l_GGV~PY=I0k#u8T(;cx3tX zIHI!NOO#=BuJT@ac{$7uO9EU1XFVLA3Zuy|t-h~{aRmjIEn7ImZgjz5zwJ8%PkAIvtKt*3ck@AhoNL!*Z64X zr@+{2+4C?1uuB-bv>@|b{+?kWJ4Cr?NnQPlhULZskIsy*e;nOE1BqZuT>NYD=^eLu_ zdU<*2pF4NLFR7=9?3EHgnpgrMTVWUH>dpJ$cMH4z+O{p>D;6*C-TLS-A@7ICnX_jT z4uJn{d?MtAEenYM(%R|*Q03vnzibp=`p?ZdZoYT#-sqslx@fWF`Xs-ukt3`Q)cs zy$^X@4nGq)Q+xT^wW$`-@CpdC&4FQIY(#+{*RtQm#VIH}d-e><8QaL`i{dw^=ENK) z66dDzFct3QMH613qo?;gzw;0`cMKliHs9e+%ar7uem>{B3;yNH>!362dIdihIQ8g2 zW_EUzl#>olA)~Q{K-l@sj#B7$ahvG*0}VYD;q@-b^^TBApsx;wbGl|`X7=`cnj4c4ueHkWp2-8Eh@0t!7ztmNWl5YL_)fOVArRDsjwUw2XY>!{RzbqXG z0~6CW78aic=S!pCKLSvYX7b-c*LrOlJX}sr&iTHAf&x%h+5v5Z`VO~hYd44QS67$3HzQ2_bMM(>)-?`Wt^in4SqakvQ~7uRJPQlXkID`mJ-U6z zj$9y391^zYbM3EB4%FXv+=ARTR;s0AU=Y~9zr3Vm`_7$=OiWDl^vbHL6;)N~iHS#@ zXI{*ia3i%L1M9awFs=KNn8-IND<^kn+U3E=R{%6#ym)c@Hbu~97IyaVpdc*+gFKij za4Toi7s|o9Tn6X~2$0?z+ON>BjHg4JAkd0Lg=px*+(#vD=n0|H_WuuWKVL>NRSPUH Tu!?n~`#yPGO(9Lr_|E?VuSV`< literal 0 HcmV?d00001 diff --git a/previews/PR239/assets/eozeurm.DGf_4PiA.png b/previews/PR239/assets/eozeurm.DGf_4PiA.png new file mode 100644 index 0000000000000000000000000000000000000000..7c21ba073c7826a58807820c384acdd4a64395fb GIT binary patch literal 65478 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