<apidoc:module name="MCGM" subcategory="MCGM" bucket="XQuery Library Modules" category="Geospatial Supporting Functions" 
  xmlns:apidoc="http://marklogic.com/xdmp/apidoc"
  xmlns="http://www.w3.org/1999/xhtml" lib="mcgm"
>
<apidoc:summary access="public" subcategory="MCGM" bucket="XQuery Library Modules" category="Geospatial Supporting Functions">
<p>The MCGM module provides support for geospatial queries using MetaCarta
geospatial markup. 
</p>
<p>To use the MCGM module as part of your own XQuery module, include the
following line in your XQuery prolog:
</p>
<p><code>import module namespace mcgm = "http://marklogic.com/geospatial/mcgm"
         at "/MarkLogic/geospatial/mcgm.xqy";</code></p>
<p>The library namespace prefix <code>mcgm</code> is <em>not</em> predefined
in the server.</p>
</apidoc:summary>

<apidoc:function name="point" type="mcgm" lib="mcgm" 
	subcategory="MCGM" bucket="XQuery Library Modules" category="Geospatial Supporting Functions">
  <apidoc:summary>
  Create a cts:point value from a MCGM Dot element.
  </apidoc:summary>
  <apidoc:params>
    <apidoc:param name="point" type="element(Dot)">
    A Dot element.
    </apidoc:param>
  </apidoc:params>
  <apidoc:return> cts:point </apidoc:return>
  <apidoc:example><pre xml:space="preserve"><![CDATA[
  xquery version "1.0-ml";
  import module namespace mcgm = "http://marklogic.com/geospatial/mcgm"
         at "/MarkLogic/geospatial/mcgm.xqy";

  mcgm:point(<Dot Latitude="12.5" Longitude="-127.24"/>)
  ]]></pre>
  </apidoc:example>
</apidoc:function>

<apidoc:function name="circle" type="mcgm" lib="mcgm" 
	subcategory="MCGM" bucket="XQuery Library Modules" category="Geospatial Supporting Functions">
  <apidoc:summary>
  Create a cts:circle value from a radius and MCGM Dot element.
  </apidoc:summary>
  <apidoc:params>
    <apidoc:param name="radius" type="xs:double">
    The radius of the circle, in miles.
    </apidoc:param>
    <apidoc:param name="center" type="element(Dot)">
    A Point element representing the center of the circle.
    </apidoc:param>
  </apidoc:params>
  <apidoc:return> cts:circle </apidoc:return>
  <apidoc:example><pre xml:space="preserve"><![CDATA[
  xquery version "1.0-ml";
  import module namespace mcgm = "http://marklogic.com/geospatial/mcgm"
         at "/MarkLogic/geospatial/mcgm.xqy";

  mcgm:circle(47, <Dot Latitude="12.5" Longitude="-127.24"/>)
  ]]></pre>
  </apidoc:example>
</apidoc:function>

<apidoc:function name="polygon" type="mcgm" lib="mcgm" 
	subcategory="MCGM" bucket="XQuery Library Modules" category="Geospatial Supporting Functions">
  <apidoc:summary>
  Construct  a cts:polygon value from a sequence of MCGM Dot elements.
  </apidoc:summary>
  <apidoc:params>
    <apidoc:param name="vertices" type="element(Dot)*">
    A sequence of Dot elements representing the vertices of the polygon.
    </apidoc:param>
  </apidoc:params>
  <apidoc:return> cts:polygon </apidoc:return>
  <apidoc:example><pre xml:space="preserve"><![CDATA[
  xquery version "1.0-ml";
  import module namespace mcgm = "http://marklogic.com/geospatial/mcgm"
         at "/MarkLogic/geospatial/mcgm.xqy";

  mcgm:polygon(( <Dot Latitude="12.5" Longitude="-127.24"/>,
                 <Dot Latitude="15.25" Longitude="-127.8"/>,
                 <Dot Latitude="13.45" Longitude="-126.1"/>,
                 <Dot Latitude="12.5" Longitude="-127.24"/>
              ))
  ]]></pre>
  </apidoc:example>
</apidoc:function>

<apidoc:function name="geospatial-query" type="mcgm" lib="mcgm" 
	subcategory="MCGM" bucket="XQuery Library Modules" category="Geospatial Supporting Functions">
  <apidoc:summary>
  Returns a cts:query matching points within given regions.
  </apidoc:summary>
  <apidoc:params>
    <apidoc:param name="regions" type="cts:region*">
    One or more geographic boxes, circles, polygons, or points. Where multiple
    boxes, circles, polygons, or points are specified, the query matches if
    any box, circle, polygon, or
    point matches.
    </apidoc:param>
    <apidoc:param name="options" type="xs:string*" optional="true">
    Options to this query.  The default is ().
    <p>Options include:</p>
      <blockquote>
        <dl>
        <dt>"coordinate-system=wgs84"</dt>
        <dd>Use the WGS84 coordinate system.</dd>
        <!--
        <dt>"unit=miles"</dt>
        <dd>Distance (for circles) is measured in miles.</dd>
        -->
        <dt>"boundaries-included"</dt>
        <dd>Points on boxes' and circles' boundaries are counted as matching.  This is the default.</dd>
        <dt>"boundaries-excluded"</dt>
        <dd>Points on boxes' and circles' boundaries are not counted as matching.</dd>
        <dt>"boundaries-latitude-excluded"</dt>
        <dd>Points on boxes' latitude boundaries are not counted as matching.</dd>
        <dt>"boundaries-longitude-excluded"</dt>
        <dd>Points on boxes' longitude boundaries are not counted as matching.</dd>
        <dt>"boundaries-south-excluded"</dt>
        <dd>Points on the boxes' southern boundaries are not counted as matching.</dd>
        <dt>"boundaries-west-excluded"</dt>
        <dd>Points on the boxes' western boundaries are not counted as matching.</dd>
        <dt>"boundaries-north-excluded"</dt>
        <dd>Points on the boxes' northern boundaries are not counted as matching.</dd>
        <dt>"boundaries-east-excluded"</dt>
        <dd>Points on the boxes' eastern boundaries are not counted as matching.</dd>
        <dt>"boundaries-circle-excluded"</dt>
        <dd>Points on circles' boundary are not counted as matching.</dd>
      </dl></blockquote>
    </apidoc:param>
    <apidoc:param name="weight" type="xs:double?" optional="true">
    A weight for this query.  The default is 1.0.
    </apidoc:param>
  </apidoc:params>
  <apidoc:return> cts:query </apidoc:return>
<apidoc:usage>
<p>The point value is expressed in the content of the element as a pair
of numbers, separated by whitespace and punctuation (excluding decimal points
and sign characters).
</p>
<p>Point values and boundary specifications of boxes are given in degrees
relative to the WGS84 coordinate system.  Southern latitudes and Western 
longitudes take negative values.  Longitudes will be wrapped to the range 
(-180,+180) and latitudes will be clipped to the range (-90,+90).  
</p>
<p>If the northern boundary of a box is south of the southern boundary, no 
points will  match. However, longitudes wrap around the globe, so that if 
the western boundary is east of the eastern boundary,
then the box crosses the anti-meridian.
</p>
<p>Special handling occurs at the poles, as all longitudes exist at latitudes 
+90 and -90.
</p>
</apidoc:usage>
<apidoc:example><pre xml:space="preserve"><![CDATA[
xquery version "1.0-ml";

(: create a document with test data :)
xdmp:document-insert("/points.xml",
<root xmlns:mcgm="http://marklogic.com/geospatial/mcgm">
  <item><Dot Latitude="10.5" Longitude="30.0"/></item>
  <item><Dot Latitude="15.35" Longitude="35.34"/></item>
  <item><Dot Latitude="5.11" Longitude="40.55"/></item>
</root> );

xquery version "1.0-ml";
import module namespace mcgm = "http://marklogic.com/geospatial/mcgm"
   at "/MarkLogic/geospatial/mcgm.xqy";

cts:search(doc("/points.xml")//item, 
  mcgm:geospatial-query(
    cts:box(10.0, 35.0, 20.0, 40.0)))
(:
  returns the following node: 
  <item><Dot Latitude="15.35" Longitude="35.34"/></item>
:)
,

cts:search(doc("/points.xml")//item, 
  mcgm:geospatial-query(cts:box(10.0, 40.0, 20.0, 35.0)))
(:
  returns the following nodes (wrapping around the Earth):
  <item><Dot Latitude="10.5" Longitude="30.0"/></item>
:)
,
   
cts:search(doc("/points.xml")//item, 
  mcgm:geospatial-query(
    cts:box(10.0, 35.0, 20.0, 40.0)))
(:
  returns the following node:
  <item><Dot Latitude="15.35" Longitude="35.34"/></item>
:)

]]></pre>
  </apidoc:example>
</apidoc:function>

<apidoc:function name="geospatial-query-from-elements" type="mcgm" lib="mcgm" 
	subcategory="MCGM" bucket="XQuery Library Modules" category="Geospatial Supporting Functions">
  <apidoc:summary>
  Returns a cts:query matching points within given regions.
  </apidoc:summary>
  <apidoc:params>
    <apidoc:param name="regions" type="element(Dot)*">
    One or more geographic regions, represented by MCGM elements. Where multiple
    regions are specified, the query matches if
    any region matches.
    </apidoc:param>
    <apidoc:param name="options" type="xs:string*" optional="true">
    Options to this query.  The default is ().
    <p>Options include:</p>
      <blockquote>
        <dl>
        <dt>"coordinate-system=wgs84"</dt>
        <dd>Use the WGS84 coordinate system.</dd>
        <!--
        <dt>"unit=miles"</dt>
        <dd>Distance (for circles) is measured in miles.</dd>
        -->
        <dt>"boundaries-included"</dt>
        <dd>Points on boxes' and circles' boundaries are counted as matching.  This is the default.</dd>
        <dt>"boundaries-excluded"</dt>
        <dd>Points on boxes' and circles' boundaries are not counted as matching.</dd>
        <dt>"boundaries-latitude-excluded"</dt>
        <dd>Points on boxes' latitude boundaries are not counted as matching.</dd>
        <dt>"boundaries-longitude-excluded"</dt>
        <dd>Points on boxes' longitude boundaries are not counted as matching.</dd>
        <dt>"boundaries-south-excluded"</dt>
        <dd>Points on the boxes' southern boundaries are not counted as matching.</dd>
        <dt>"boundaries-west-excluded"</dt>
        <dd>Points on the boxes' western boundaries are not counted as matching.</dd>
        <dt>"boundaries-north-excluded"</dt>
        <dd>Points on the boxes' northern boundaries are not counted as matching.</dd>
        <dt>"boundaries-east-excluded"</dt>
        <dd>Points on the boxes' eastern boundaries are not counted as matching.</dd>
        <dt>"boundaries-circle-excluded"</dt>
        <dd>Points on circles' boundary are not counted as matching.</dd>
      </dl></blockquote>
    </apidoc:param>
    <apidoc:param name="weight" type="xs:double?" optional="true">
    A weight for this query.  The default is 1.0.
    </apidoc:param>
  </apidoc:params>
  <apidoc:return> cts:query </apidoc:return>
<apidoc:usage>
<p>The point value is expressed in the content of the element as a pair
of numbers, separated by whitespace and punctuation (excluding decimal points
and sign characters).
</p>
<p>Point values and boundary specifications of boxes are given in degrees
relative to the WGS84 coordinate system.  Southern latitudes and Western 
longitudes take negative values.  Longitudes will be wrapped to the range 
(-180,+180) and latitudes will be clipped to the range (-90,+90).  
</p>
<p>If the northern boundary of a box is south of the southern boundary, no 
points will  match. However, longitudes wrap around the globe, so that if 
the western boundary is east of the eastern boundary,
then the box crosses the anti-meridian.
</p>
<p>Special handling occurs at the poles, as all longitudes exist at latitudes 
+90 and -90.
</p>
</apidoc:usage>
</apidoc:function>
</apidoc:module>
