You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sedona.apache.org by ji...@apache.org on 2026/02/09 21:14:17 UTC

(sedona-db) branch branch-0.2.0 updated (b74738de -> aa5341d0)

This is an automated email from the ASF dual-hosted git repository.

jiayu pushed a change to branch branch-0.2.0
in repository https://gitbox.apache.org/repos/asf/sedona-db.git


    from b74738de docs: Update SQL docs for changes in v0.2 (#368)
     new aace6a10 docs: Link doc to raw GitHub assets (#420)
     new 7541d638 docs(r): update installation command (#421)
     new 94b3ba53 chore(docs/reference/sql): Use Quarto to render SQL docs pages (#434)
     new 42c86151 chore(docs): Add missing dependency to docs build and ensure build fails if quarto render fails (#445)
     new d7fb5d50 docs: add separate pages for ST_Area() and ST_AsBinary() (#457)
     new aa5341d0 fix(docs): Sync the main Sedona website design with sedona-db (#584)

The 6 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .github/workflows/packaging.yml                    |   4 +-
 .gitignore                                         |   2 +
 .pre-commit-config.yaml                            |  31 +-
 README.md                                          |   6 +-
 ci/scripts/build-docs.sh                           |  16 +
 docs/README.md                                     |  17 ++
 docs/contributors-guide.md                         |  70 +++++
 docs/image/footer/logo-footer.svg                  |  10 +
 docs/image/header/logo-mobile.svg                  |  10 +
 docs/image/logo.svg                                |  10 +
 docs/index.md                                      |   2 +-
 docs/overrides/main.html                           |  83 +++++
 .../overrides/partials/copyright.html              |  15 +-
 .../overrides/partials/footer.html                 |  40 +--
 docs/overrides/partials/header.html                | 126 ++++++++
 docs/overrides/partials/nav.html                   |  56 ++++
 .../reference/functions}/.gitignore                |   6 +-
 .../_extensions/function-listing/_extension.yml    |   9 +-
 .../function-listing/function-listing.lua          |  43 +++
 .../_extensions/render-meta-and-examples.lua       | 137 +++++++++
 .../reference/functions/_matplotlib_defaults.py    |  16 +-
 docs/reference/functions/_quarto.yml               |  46 +++
 docs/reference/functions/_render_examples.py       | 120 ++++++++
 docs/reference/functions/_render_listing.py        |  83 +++++
 docs/reference/functions/_render_meta.py           | 213 +++++++++++++
 .../reference/functions/index.qmd                  |   6 +-
 docs/reference/functions/st_analyze_agg.qmd        |  49 +++
 .../reference/functions/st_area.qmd                |  21 +-
 .../reference/functions/st_asbinary.qmd            |  21 +-
 docs/reference/functions/st_buffer.qmd             |  81 +++++
 docs/reference/functions/st_intersection.qmd       |  54 ++++
 docs/requirements.txt                              |   2 +
 docs/stylesheets/extra.css                         | 339 +++++++++++++++++----
 mkdocs.yml                                         |  16 +-
 r/sedonadb/README.Rmd                              |   7 +
 r/sedonadb/README.md                               |  44 +--
 36 files changed, 1660 insertions(+), 151 deletions(-)
 create mode 100644 docs/image/footer/logo-footer.svg
 create mode 100644 docs/image/header/logo-mobile.svg
 create mode 100644 docs/image/logo.svg
 create mode 100644 docs/overrides/main.html
 copy ci/scripts/rat/license_md.txt => docs/overrides/partials/copyright.html (71%)
 copy python/sedonadb/README.md => docs/overrides/partials/footer.html (60%)
 create mode 100644 docs/overrides/partials/header.html
 create mode 100644 docs/overrides/partials/nav.html
 copy {ci/scripts/windows => docs/reference/functions}/.gitignore (94%)
 copy ci/scripts/.gitignore => docs/reference/functions/_extensions/function-listing/_extension.yml (85%)
 create mode 100644 docs/reference/functions/_extensions/function-listing/function-listing.lua
 create mode 100644 docs/reference/functions/_extensions/render-meta-and-examples.lua
 copy r/sedonadb/src/.gitignore => docs/reference/functions/_matplotlib_defaults.py (84%)
 create mode 100644 docs/reference/functions/_quarto.yml
 create mode 100644 docs/reference/functions/_render_examples.py
 create mode 100644 docs/reference/functions/_render_listing.py
 create mode 100644 docs/reference/functions/_render_meta.py
 copy ci/scripts/windows/.gitignore => docs/reference/functions/index.qmd (91%)
 create mode 100644 docs/reference/functions/st_analyze_agg.qmd
 copy c/.clang-format => docs/reference/functions/st_area.qmd (72%)
 copy c/.clang-format => docs/reference/functions/st_asbinary.qmd (68%)
 create mode 100644 docs/reference/functions/st_buffer.qmd
 create mode 100644 docs/reference/functions/st_intersection.qmd


(sedona-db) 03/06: chore(docs/reference/sql): Use Quarto to render SQL docs pages (#434)

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jiayu pushed a commit to branch branch-0.2.0
in repository https://gitbox.apache.org/repos/asf/sedona-db.git

commit 94b3ba53265e28118035c5f74bacb478a35e4671
Author: Dewey Dunnington <de...@dunnington.ca>
AuthorDate: Fri Dec 12 10:07:28 2025 -0600

    chore(docs/reference/sql): Use Quarto to render SQL docs pages (#434)
    
    Co-authored-by: Copilot <17...@users.noreply.github.com>
---
 .github/workflows/packaging.yml                    |   4 +-
 .gitignore                                         |   2 +
 ci/scripts/build-docs.sh                           |  11 ++
 docs/README.md                                     |  17 ++
 docs/contributors-guide.md                         |  70 +++++++
 .../functions/.gitignore}                          |  15 +-
 .../_extensions/function-listing/_extension.yml}   |  19 +-
 .../function-listing/function-listing.lua          |  43 +++++
 .../_extensions/render-meta-and-examples.lua       | 137 +++++++++++++
 .../functions/_matplotlib_defaults.py}             |  17 +-
 docs/reference/functions/_quarto.yml               |  46 +++++
 docs/reference/functions/_render_examples.py       | 120 ++++++++++++
 docs/reference/functions/_render_listing.py        |  83 ++++++++
 docs/reference/functions/_render_meta.py           | 213 +++++++++++++++++++++
 .../functions/index.qmd}                           |  17 +-
 docs/reference/functions/st_analyze_agg.qmd        |  49 +++++
 docs/reference/functions/st_buffer.qmd             |  81 ++++++++
 docs/reference/functions/st_intersection.qmd       |  54 ++++++
 docs/requirements.txt                              |   1 +
 19 files changed, 950 insertions(+), 49 deletions(-)

diff --git a/.github/workflows/packaging.yml b/.github/workflows/packaging.yml
index 978e2e0f..e9837fe8 100644
--- a/.github/workflows/packaging.yml
+++ b/.github/workflows/packaging.yml
@@ -98,6 +98,8 @@ jobs:
         with:
           python-version: "3.x"
 
+      - uses: quarto-dev/quarto-actions/setup@v2
+
       - name: Use stable Rust
         id: rust
         run: |
@@ -119,7 +121,7 @@ jobs:
 
       - name: Install dev SedonaDB Python
         run: |
-            pip install python/sedonadb/ -vv
+            pip install "python/sedonadb/[geopandas]" -v
 
       - name: Build documentation
         run: |
diff --git a/.gitignore b/.gitignore
index 6a4f4a03..232ccf0f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -49,3 +49,5 @@ __pycache__
 
 # .env file for release management
 dev/release/.env
+
+/.luarc.json
diff --git a/ci/scripts/build-docs.sh b/ci/scripts/build-docs.sh
index cb127077..f6d333d2 100755
--- a/ci/scripts/build-docs.sh
+++ b/ci/scripts/build-docs.sh
@@ -33,6 +33,17 @@ for notebook in $(find "${SEDONADB_DIR}/docs" -name "*.ipynb"); do
   jupyter nbconvert --to markdown "${notebook}"
 done
 
+# Clean + build SQL function documentation
+pushd "${SEDONADB_DIR}/docs/reference/functions"
+
+# Remove built markdown files (they confuse quarto)
+find . -name "*.md" -delete
+
+# Render the Quarto project
+quarto render
+
+popd
+
 pushd "${SEDONADB_DIR}"
 if mkdocs build --strict ; then
   echo "Success!"
diff --git a/docs/README.md b/docs/README.md
index 7a7cb81b..476af347 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -30,6 +30,23 @@ pip install -e "python/sedonadb/[test]" -vv
 pip install -r docs/requirements.txt
 ```
 
+The SQL function documentation is a [Quarto](https://quarto.org) project that must be rendered
+at least once to generate the Markdown files required by mkdocs. This may be done with:
+
+```shell
+cd docs/reference/functions
+quarto render
+```
+
+When iterating on documentation, it is usually best to use the `mkdocs` commands directly:
+
 * `mkdocs serve` - Start the live-reloading docs server.
 * `mkdocs build` - Build the documentation site.
 * `mkdocs -h` - Print help message and exit.
+
+The official documentation is built using a script which may be useful when building the documentation
+locally for the first time:
+
+```shell
+ci/scripts/build-docs.sh
+```
diff --git a/docs/contributors-guide.md b/docs/contributors-guide.md
index a3eb79a5..e81f4b95 100644
--- a/docs/contributors-guide.md
+++ b/docs/contributors-guide.md
@@ -336,3 +336,73 @@ To contribute to the SedonaDB documentation:
     * `mkdocs build` - Build the documentation site.
     * `mkdocs -h` - Print help message and exit.
 1. Push your changes and open a pull request.
+
+SQL function reference is special: because we provide so many functions, we have
+a specialized syntax for documenting them. The minimum required documentation for
+a function is a file `docs/reference/functions/function_name.qmd`:
+
+    ---
+    title: ST_FunctionName
+    description: A brief one sentence description of what the function does.
+    kernels:
+      - returns: geometry
+        args: [geometry]
+    ---
+
+    ## Examples
+
+    ```sql
+    SELECT ST_FunctionName(ST_Point(0, 1)) AS val;
+    ```
+
+After writing this file, the `.md` file may be rendered using [Quarto](https://quarto.org):
+
+```shell
+cd docs/reference/functions
+quarto render
+```
+
+This command (1) expands `description` and `kernels` to a templated representation,
+(2) checks and renders the result of the SQL examples, and (3) executes any
+[Python code chunks](https://quarto.org/docs/computations/python.html). These may
+be used to render figures that demonstrate visually what a function does or how its
+parameters affect the result.
+
+The `kernels` section of the frontmatter allows multiple implementations of a function
+to be documented. For example, many functions include implementations for geometry
+*and* geography or allow extra arguments to be supplied to customize behaviour. As
+an example, the frontmatter for `ST_Buffer()` is:
+
+    ---
+    title: ST_Buffer
+    description: >
+        Computes a geometry that represents all points whose distance from the input
+        geometry is less than or equal to a specified distance.
+    kernels:
+      - returns: geometry
+        args:
+        - geometry
+        - name: distance
+          type: float64
+          description: Radius of the buffer
+      - returns: geometry
+        args:
+        - geometry
+        - name: distance
+          type: float64
+        - name: params
+          type: utf8
+          description: Space-separated `key=value` parameters.
+    ---
+
+This illustrates a few ways in which arguments can be defined:
+
+- By the string `geometry`, `geography`, or `raster`. These are expanded to a full
+  definition by quarto but are so common that we allow abbreviating them to avoid
+  typing `description: Input geometry` for every single function.
+- With a YAML object of `name` / `type` / `description`. The type names are lowercase
+  Arrow type names which should be identical to those printed when executing a query
+  in SedonaDB.
+
+The build system for function documentation is a work in progress, so be sure to ask
+if you run into problems or have any questions about the syntax!
diff --git a/docs/requirements.txt b/docs/reference/functions/.gitignore
similarity index 82%
copy from docs/requirements.txt
copy to docs/reference/functions/.gitignore
index 6bd80c39..d835f3f1 100644
--- a/docs/requirements.txt
+++ b/docs/reference/functions/.gitignore
@@ -15,15 +15,6 @@
 # specific language governing permissions and limitations
 # under the License.
 
-griffe
-mike
-mkdocs
-mkdocs-git-revision-date-localized-plugin
-mkdocs-glightbox
-mkdocs-macros-plugin
-mkdocs-material
-mkdocstrings[python]
-nbconvert
-pyproj
-ruff
-lonboard
+/.quarto/
+*.md
+*_files/
diff --git a/docs/requirements.txt b/docs/reference/functions/_extensions/function-listing/_extension.yml
similarity index 82%
copy from docs/requirements.txt
copy to docs/reference/functions/_extensions/function-listing/_extension.yml
index 6bd80c39..a218f5f7 100644
--- a/docs/requirements.txt
+++ b/docs/reference/functions/_extensions/function-listing/_extension.yml
@@ -15,15 +15,10 @@
 # specific language governing permissions and limitations
 # under the License.
 
-griffe
-mike
-mkdocs
-mkdocs-git-revision-date-localized-plugin
-mkdocs-glightbox
-mkdocs-macros-plugin
-mkdocs-material
-mkdocstrings[python]
-nbconvert
-pyproj
-ruff
-lonboard
+title: Function Listing
+author: SedonaDB
+version: 1.0.0
+quarto-required: ">=1.4.0"
+contributes:
+  shortcodes:
+    - function-listing.lua
diff --git a/docs/reference/functions/_extensions/function-listing/function-listing.lua b/docs/reference/functions/_extensions/function-listing/function-listing.lua
new file mode 100644
index 00000000..460d1570
--- /dev/null
+++ b/docs/reference/functions/_extensions/function-listing/function-listing.lua
@@ -0,0 +1,43 @@
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements.  See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership.  The ASF licenses this file
+-- to you under the Apache License, Version 2.0 (the
+-- "License"); you may not use this file except in compliance
+-- with the License.  You may obtain a copy of the License at
+--
+--   http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing,
+-- software distributed under the License is distributed on an
+-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+-- KIND, either express or implied.  See the License for the
+-- specific language governing permissions and limitations
+-- under the License.
+
+return {
+  ["function-listing"] = function(args, kwargs, meta)
+    -- Get the file pattern from arguments (default to "st_*.qmd")
+    local file_pattern = args[1] or "st_*.qmd"
+
+  -- Execute _render_listing.py with the file pattern
+  local cmd = string.format("python3 _render_listing.py '%s'", file_pattern)
+  local handle = io.popen(cmd, "r")
+
+  if not handle then
+    return pandoc.Para{pandoc.Str("Error: Could not execute _render_listing.py")}
+  end
+
+  local result = handle:read("*all")
+  handle:close()
+
+  -- Parse the markdown result and return as pandoc blocks
+  if result and result ~= "" then
+    local doc_result = pandoc.read(result, "markdown")
+    return doc_result.blocks
+  end
+
+  -- Fallback if no result
+  return pandoc.Para{pandoc.Str("No functions found matching pattern: " .. file_pattern)}
+  end
+}
diff --git a/docs/reference/functions/_extensions/render-meta-and-examples.lua b/docs/reference/functions/_extensions/render-meta-and-examples.lua
new file mode 100644
index 00000000..51e1781f
--- /dev/null
+++ b/docs/reference/functions/_extensions/render-meta-and-examples.lua
@@ -0,0 +1,137 @@
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements.  See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership.  The ASF licenses this file
+-- to you under the Apache License, Version 2.0 (the
+-- "License"); you may not use this file except in compliance
+-- with the License.  You may obtain a copy of the License at
+--
+--   http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing,
+-- software distributed under the License is distributed on an
+-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+-- KIND, either express or implied.  See the License for the
+-- specific language governing permissions and limitations
+-- under the License.
+
+-- auto-description.lua
+-- Automatically adds a Description section based on frontmatter using _render_meta.py
+-- Also processes SQL code blocks using _render_examples.py
+
+local function render_sql_example(sql_code)
+  -- Create a temporary file for the SQL
+  local temp_file = os.tmpname()
+
+  -- Write SQL content to temporary file
+  local temp_handle = io.open(temp_file, "w")
+  if not temp_handle then
+    return {pandoc.CodeBlock(sql_code, pandoc.Attr("", {"sql"}, {}))}
+  end
+
+  temp_handle:write(sql_code)
+  temp_handle:close()
+
+  -- Execute _render_examples.py using stdin (with - argument)
+  local cmd = string.format("python3 _render_examples.py - < '%s'", temp_file)
+  local handle = io.popen(cmd, "r")
+  if not handle then
+    os.remove(temp_file)
+    return {pandoc.CodeBlock(sql_code, pandoc.Attr("", {"sql"}, {}))}
+  end
+
+  local result = handle:read("*all")
+  handle:close()
+  os.remove(temp_file)
+
+  -- Parse the markdown result and return as pandoc blocks
+  if result and result ~= "" then
+    local doc_result = pandoc.read(result, "markdown")
+    return doc_result.blocks
+  end
+
+  -- Fallback to original code block if rendering fails
+  return {pandoc.CodeBlock(sql_code, pandoc.Attr("", {"sql"}, {}))}
+end
+
+local function render_meta_content(doc)
+  -- Use Pandoc's JSON encoding (may not work perfectly)
+  local json_content = pandoc.json.encode(doc.meta)
+
+  -- Create a temporary file for the JSON
+  local temp_file = os.tmpname()
+
+  -- Write JSON content to temporary file
+  local temp_handle = io.open(temp_file, "w")
+  if not temp_handle then
+    return pandoc.Para{pandoc.Str("Error: Could not create temporary file")}
+  end
+
+  temp_handle:write(json_content)
+  temp_handle:close()
+
+  -- Pass JSON directly to _render_meta.py (JSON is valid YAML)
+  local cmd = string.format("python3 _render_meta.py - < '%s'", temp_file)
+
+  local handle = io.popen(cmd, "r")
+  if not handle then
+    os.remove(temp_file)
+    return pandoc.Para{pandoc.Str("Error: Could not execute _render_meta.py")}
+  end
+
+  local result = handle:read("*all")
+  if not result then
+    result = "Error: Could not read output from _render_meta.py"
+  end
+
+  handle:close()
+  os.remove(temp_file)  -- Parse the markdown result and return as pandoc blocks
+  if result and result ~= "" then
+    local doc_result = pandoc.read(result, "markdown")
+    return doc_result.blocks
+  end
+
+  return {}
+end
+
+function Pandoc(doc)
+  local description = doc.meta.description
+
+  if description and description ~= "" then
+    -- First pass: Process all existing SQL code blocks before generating new content
+    local new_blocks = {}
+    for i, block in ipairs(doc.blocks) do
+      if block.t == "CodeBlock" and block.classes and #block.classes > 0 and block.classes[1] == "sql" then
+        local rendered_blocks = render_sql_example(block.text)
+        -- Add all rendered blocks to new_blocks
+        for _, rendered_block in ipairs(rendered_blocks) do
+          table.insert(new_blocks, rendered_block)
+        end
+      else
+        table.insert(new_blocks, block)
+      end
+    end
+    doc.blocks = new_blocks
+
+    -- Second pass: Generate content using _render_meta.py
+    local meta_blocks = render_meta_content(doc)
+
+    if #meta_blocks > 0 then
+      -- Insert after title (first header) if it exists, otherwise at the beginning
+      local insert_pos = 1
+      for i, block in ipairs(doc.blocks) do
+        if block.t == "Header" and block.level == 1 then
+          insert_pos = i + 1
+          break
+        end
+      end
+
+      -- Insert the generated blocks
+      for j, block in ipairs(meta_blocks) do
+        table.insert(doc.blocks, insert_pos + j - 1, block)
+      end
+    end
+  end
+
+  return doc
+end
diff --git a/docs/requirements.txt b/docs/reference/functions/_matplotlib_defaults.py
similarity index 82%
copy from docs/requirements.txt
copy to docs/reference/functions/_matplotlib_defaults.py
index 6bd80c39..4baaa176 100644
--- a/docs/requirements.txt
+++ b/docs/reference/functions/_matplotlib_defaults.py
@@ -15,15 +15,8 @@
 # specific language governing permissions and limitations
 # under the License.
 
-griffe
-mike
-mkdocs
-mkdocs-git-revision-date-localized-plugin
-mkdocs-glightbox
-mkdocs-macros-plugin
-mkdocs-material
-mkdocstrings[python]
-nbconvert
-pyproj
-ruff
-lonboard
+import matplotlib.pyplot as plt
+
+plt.rcParams["axes.labelsize"] = 8
+plt.rcParams["xtick.labelsize"] = 8
+plt.rcParams["ytick.labelsize"] = 8
diff --git a/docs/reference/functions/_quarto.yml b/docs/reference/functions/_quarto.yml
new file mode 100644
index 00000000..331ca253
--- /dev/null
+++ b/docs/reference/functions/_quarto.yml
@@ -0,0 +1,46 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# This quarto project allows `quarto render` from this directory to be
+# used such that it takes care of executing code blocks to create figures
+# and render standardized frontmatter defining function arguments into
+# usage/argument documentation.
+project:
+  title: "Function Reference"
+format:
+  gfm:
+    # Increase the quality of the figures (the default of 72 is not very
+    # appealing)
+    fig-dpi: 300
+
+# Use jupyter to render python code blocks. We could also use knitr, which
+# is more flexible but requires an R install available.
+engine: jupyter
+
+# By default, don't echo the Python code for Python code blocks. We use these
+# blocks primarily to create figures, not to demo Python code and its output.
+# individual code blocks can add `#| echo: true` to override this default.
+execute:
+  echo: false
+
+# These filters take care of rendering ```sql code blocks, rendering the
+# standardized description/usage/arguments based on document frontmatter,
+# and providing the function-listing shortcode used to list all the functions
+# in index.qmd.
+filters:
+  - _extensions/render-meta-and-examples.lua
+  - _extensions/function-listing
diff --git a/docs/reference/functions/_render_examples.py b/docs/reference/functions/_render_examples.py
new file mode 100644
index 00000000..1bf1f963
--- /dev/null
+++ b/docs/reference/functions/_render_examples.py
@@ -0,0 +1,120 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+import sedonadb
+
+sd = sedonadb.connect()
+
+
+def render_examples(examples, width=80, ascii=False):
+    """Renders examples to stdout using SedonaDB for Python
+
+    This takes an iterable of example SQL strings and renders the SQL
+    and the result to stdout. All examples are run in the same
+    context.
+
+    Output:
+
+    ````
+
+    ```sql
+    --- examples that don't return a result are accumulated
+    SET some.config = true;
+    --- when a query does return a result, we end the sql code block
+    --- and print the result
+    SELECT one as 1;
+    ```
+
+    ```
+    <output>
+    ```
+
+    ````
+    """
+    try:
+        examples_iter = iter(examples)
+        while True:
+            render_examples_iter_until_result(examples_iter, width=width, ascii=ascii)
+    except StopIteration:
+        pass
+
+
+def render_examples_iter_until_result(examples_iter, width=80, ascii=False):
+    example = next(examples_iter)
+
+    # Open the block where the SQL is printed
+    print("\n```sql")
+    while example is not None:
+        # Execute the example to get a row count. If this is a resultless
+        # statement (no rows, no cols), don't execute it again to print. This
+        # allows SET and CREATE TABLE statements to "set up" examples. We
+        # could also look for a trailing semicolon (e.g., only print results
+        # of statements without a trailing semicolon) if this approach is
+        # problematic.
+
+        # Echo the example
+        print(example.strip())
+
+        # Parse it
+        df = sd.sql(example)
+
+        # Execute and check emptiness
+        if df.execute() == 0 and not df.schema.names:
+            example = next(examples_iter, None)
+            continue
+
+        # Close the ```sql block
+        print("```\n")
+
+        # Print the result block (executes the query again)
+        print("```")
+        df.show(limit=None, width=width, ascii=ascii)
+        print("```")
+        return
+
+    # If we're here, none of the statements had any output, so we need to close
+    # the sql block
+    print("```\n")
+
+
+if __name__ == "__main__":
+    import argparse
+    import sys
+
+    parser = argparse.ArgumentParser(description="Render SedonaDB SQL examples")
+    parser.add_argument(
+        "examples",
+        nargs="+",
+        help=(
+            "SQL strings to be rendered or `-` to read from stdin. "
+            "When reading from stdin, multiple examples may be separated by "
+            "with `----` on its own line."
+        ),
+    )
+    parser.add_argument("--width", type=int, default=80)
+    parser.add_argument("--ascii", default=False, action="store_true")
+
+    args = parser.parse_args(sys.argv[1:])
+    if args.examples == ["-"]:
+        args.examples = sys.stdin.read().split("\n----\n")
+
+    try:
+        render_examples(args.examples, width=args.width, ascii=args.ascii)
+    except Exception as e:
+        raise ValueError(
+            f"Failed to render examples:\n{'\n----\n'.join(args.examples)}"
+        ) from e
diff --git a/docs/reference/functions/_render_listing.py b/docs/reference/functions/_render_listing.py
new file mode 100644
index 00000000..464e0d01
--- /dev/null
+++ b/docs/reference/functions/_render_listing.py
@@ -0,0 +1,83 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+import io
+from pathlib import Path
+import yaml
+
+from _render_meta import render_meta
+
+
+def render_listing(paths):
+    """Lists meta information for zero or more filenames to function .qmd files
+
+    Output:
+
+    ```
+    ## [ST_Name](st_name.md)
+
+    <description>
+
+    ## Usage
+
+    return_type ST_Name(arg_name: arg_type)
+    ```
+    """
+    for file in paths:
+        raw_meta = read_frontmatter(file)
+        link_href = file.name.replace(".qmd", ".md")
+        print(f"\n## [{raw_meta['title']}]({link_href})\n\n")
+
+        render_meta(raw_meta, level=2, arguments=False)
+
+
+def read_frontmatter(path):
+    frontmatter = io.StringIO()
+    with open(path) as f:
+        for line in f:
+            if line.strip() == "---":
+                break
+        for line in f:
+            if line.strip() == "---":
+                break
+            frontmatter.write(line)
+    frontmatter.seek(0)
+    return yaml.safe_load(frontmatter)
+
+
+def collect_files(file_glob):
+    return list(sorted(Path(__file__).parent.rglob(file_glob)))
+
+
+if __name__ == "__main__":
+    import argparse
+    import sys
+    import yaml
+
+    parser = argparse.ArgumentParser(description="Render SedonaDB SQL function listing")
+    parser.add_argument(
+        "files",
+        nargs="+",
+        help="Files or globs of files whose frontmatter should be included in the listing",
+    )
+    args = parser.parse_args(sys.argv[1:])
+
+    in_files: list[Path] = []
+    for file_or_glob in args.files:
+        in_files.extend(collect_files(file_or_glob))
+
+    render_listing(in_files)
diff --git a/docs/reference/functions/_render_meta.py b/docs/reference/functions/_render_meta.py
new file mode 100644
index 00000000..e3465a70
--- /dev/null
+++ b/docs/reference/functions/_render_meta.py
@@ -0,0 +1,213 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+import io
+
+
+def render_meta(raw_meta, level=1, usage=True, arguments=True):
+    """Render parsed YAML frontmatter into a standardized template
+
+    Output:
+
+    ```
+    <description>
+
+    ## Usage
+
+    return_type ST_Name(arg_name: arg_type)
+
+    ## Arguments
+
+    - **arg_name** (arg_type): Arg description
+    ```
+
+    """
+    if "description" in raw_meta:
+        render_description(raw_meta["description"])
+
+    if "kernels" in raw_meta:
+        for kernel in raw_meta["kernels"]:
+            kernel["args"] = expand_args(kernel["args"])
+
+        if usage:
+            render_usage(raw_meta["title"], raw_meta["kernels"], level)
+
+        if arguments:
+            render_args(raw_meta["kernels"], level=level)
+
+
+def render_description(description):
+    print(to_str(description).strip())
+
+
+def render_usage(name, kernels, level):
+    print(f"\n{heading(level + 1)} Usage\n")
+    print("\n```sql")
+    for kernel in kernels:
+        args = ", ".join(render_usage_arg(arg) for arg in kernel["args"])
+        print(f"{to_str(kernel['returns'])} {to_str(name)}({args})")
+    print("```")
+
+
+def render_usage_arg(arg):
+    if arg["default"] is not None:
+        return f"{arg['name']}: {arg['type']} = {arg['default']}"
+    else:
+        return f"{arg['name']}: {arg['type']}"
+
+
+def render_args(kernels, level):
+    try:
+        expanded_args = {}
+        for kernel in reversed(kernels):
+            args_dict = {arg["name"]: arg for arg in kernel["args"]}
+            expanded_args.update({k: v for k, v in args_dict.items() if v is not None})
+    except Exception as e:
+        raise ValueError(
+            f"Failed to consolidate argument documentation from kernels:\n{kernels}"
+        ) from e
+
+    print(f"\n{heading(level + 1)} Arguments\n")
+    for arg in expanded_args.values():
+        print(
+            f"- **{to_str(arg['name'])}** ({to_str(arg['type'])}): {to_str(arg['description'])}"
+        )
+
+
+def expand_args(args):
+    """Normalizes frontmatter-specified arguments
+
+    This enables shorthand argument definitions like "geometry" to coexist
+    with more verbosely defined argument definitions.
+    """
+    args = [expand_arg(arg) for arg in args]
+    return deduplicate_common_arg_combinations(args)
+
+
+def deduplicate_common_arg_combinations(expanded_args):
+    """Transform argument names for binary functions with multiple geometry inputs
+
+    Functions like ST_Intersects() that accept two geometries or two geographies
+    will both have auto-generated function names [geom, geom]. This function
+    renames them to [geomA, geomB].
+    """
+    all_names = [arg["name"] for arg in expanded_args]
+    if all_names[:2] == ["geom", "geom"]:
+        all_names[:2] = ["geomA", "geomB"]
+    elif all_names[:2] == ["geog", "geog"]:
+        all_names[:2] = ["geogA", "geogB"]
+
+    return [
+        {
+            "name": new_name,
+            "type": arg["type"],
+            "description": arg["description"],
+            "default": arg["default"],
+        }
+        for arg, new_name in zip(expanded_args, all_names)
+    ]
+
+
+def expand_arg(arg):
+    """Ensure each arg definition is a dict with keys type, name, description,
+    and default
+    """
+    if isinstance(arg, dict):
+        arg = {k: to_str(v) for k, v in arg.items()}
+    else:
+        arg = to_str(arg)
+        arg = {
+            "type": arg,
+            "name": DEFAULT_ARG_NAMES[arg],
+            "description": DEFAULT_ARG_DESCRIPTIONS.get(arg, None),
+        }
+
+    if "default" not in arg:
+        arg["default"] = None
+    if "description" not in arg:
+        arg["description"] = None
+
+    return arg
+
+
+# Define some default argument names/descriptions so that we can abbreviate
+# the ubiquitous "geometry" input type argument without repeating the string
+# "geom: Input geometry" for every single function.
+DEFAULT_ARG_NAMES = {
+    "geometry": "geom",
+    "geography": "geog",
+    "raster": "rast",
+}
+
+DEFAULT_ARG_DESCRIPTIONS = {
+    "geometry": "Input geometry",
+    "geography": "Input geography",
+    "raster": "Input raster",
+}
+
+
+def heading(level):
+    return "#" * level + " "
+
+
+def to_str(v):
+    """Convert a value to a string
+
+    Because we call this from within a Quarto filter and use pandoc's built-in
+    JSON output, we might get a pandoc JSONified AST here. Parsing the AST here
+    is slightly easier than getting the Quarto filter to recreate the initial
+    YAML frontmatter.
+    """
+    if isinstance(v, str):
+        return v
+
+    if isinstance(v, dict):
+        if v["t"] == "Str":
+            return v["c"]
+        if v["t"] == "Code":
+            return f"`{v['c'][1]}`"
+        elif v["t"] == "Space":
+            return " "
+        elif v["t"] == "Para":
+            return "".join(to_str(item) for item in v["c"])
+        else:
+            raise ValueError(f"Unhandled type in Pandoc ast convert: {v}")
+    else:
+        return "".join(to_str(item) for item in v)
+
+
+if __name__ == "__main__":
+    import argparse
+    import sys
+    import yaml
+
+    parser = argparse.ArgumentParser(description="Render SedonaDB SQL function header")
+    parser.add_argument(
+        "meta",
+        help=(
+            "Function yaml metadata (e.g., frontmatter for a function doc page). "
+            "Use `-` to read stdin."
+        ),
+    )
+
+    args = parser.parse_args(sys.argv[1:])
+    if args.meta == "-":
+        args.meta = sys.stdin.read()
+
+    with io.StringIO(args.meta) as f:
+        raw_meta = yaml.safe_load(f)
+        render_meta(raw_meta)
diff --git a/docs/requirements.txt b/docs/reference/functions/index.qmd
similarity index 82%
copy from docs/requirements.txt
copy to docs/reference/functions/index.qmd
index 6bd80c39..7c2ea8c6 100644
--- a/docs/requirements.txt
+++ b/docs/reference/functions/index.qmd
@@ -1,3 +1,4 @@
+---
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
@@ -15,15 +16,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
-griffe
-mike
-mkdocs
-mkdocs-git-revision-date-localized-plugin
-mkdocs-glightbox
-mkdocs-macros-plugin
-mkdocs-material
-mkdocstrings[python]
-nbconvert
-pyproj
-ruff
-lonboard
+title: "SQL Function Reference"
+---
+
+{{< function-listing st_*.qmd >}}
diff --git a/docs/reference/functions/st_analyze_agg.qmd b/docs/reference/functions/st_analyze_agg.qmd
new file mode 100644
index 00000000..e9b1de6a
--- /dev/null
+++ b/docs/reference/functions/st_analyze_agg.qmd
@@ -0,0 +1,49 @@
+---
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+title: ST_Analyze_Agg
+description: Compute the statistics of geometries for the input geometry.
+kernels:
+  - returns: struct
+    args: [geometry]
+---
+
+## Description
+
+`ST_Analyze_Agg()` provides a high-level summary of its input geometries. The fields of
+its struct return type are:
+
+- `count`: Number of input geometries
+- `minx`, `miny`, `maxx`, `maxy`: Minimum bounding rectangle (envelope)
+- `mean_size_in_bytes`
+- `mean_points_per_geometry`
+- `puntal_count`: Number of point or multipoint geometries
+- `lineal_count`: Number of line or multilinestring geometries
+- `polygonal_count`: Number of polygon or multipolygon geometries
+- `geometrycollection_count`: Number of geometrycollection geometries
+- `mean_envelope_width`
+- `mean_envelope_height`
+- `mean_envelope_area`
+
+## Examples
+
+```sql
+SELECT ST_Analyze_Agg(
+    ST_GeomFromText('MULTIPOINT(1.1 101.1,2.1 102.1,3.1 103.1,4.1 104.1,5.1 105.1,6.1 106.1,7.1 107.1,8.1 108.1,9.1 109.1,10.1 110.1)')
+  ) AS analyze
+```
diff --git a/docs/reference/functions/st_buffer.qmd b/docs/reference/functions/st_buffer.qmd
new file mode 100644
index 00000000..64f807c8
--- /dev/null
+++ b/docs/reference/functions/st_buffer.qmd
@@ -0,0 +1,81 @@
+---
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+title: ST_Buffer
+description: >
+    Computes a geometry that represents all points whose distance from the input
+    geometry is less than or equal to a specified distance.
+kernels:
+  - returns: geometry
+    args:
+    - geometry
+    - name: distance
+      type: float64
+      description: Radius of the buffer
+  - returns: geometry
+    args:
+    - geometry
+    - name: distance
+      type: float64
+    - name: params
+      type: utf8
+      description: >
+        Space-separated `key=value` parameters. Supported parameters include `quad_segs`,
+        `endcap`, `join`, `mitre_limit`, and `side`. These parameters are identical to
+        the PostGIS buffer parameter strings.
+---
+
+## Examples
+
+```sql
+SELECT ST_Buffer(
+  ST_GeomFromText('POLYGON ((10 10, 11 10, 10 11, 10 10))'),
+  1.0
+) AS geom;
+```
+
+```{python}
+import _matplotlib_defaults
+import sedonadb
+
+sd = sedonadb.connect()
+
+sd.sql("""
+SELECT ST_GeomFromText('POLYGON ((10 10, 11 10, 10 11, 10 10))') as geom
+""").to_view("input")
+
+df = sd.sql("SELECT *, ST_Buffer(geom, 1.0) AS result FROM input").to_pandas()
+
+ax = df.geom.plot(alpha=0.5)
+df.result.plot(ax=ax, facecolor='none', edgecolor='red')
+```
+
+```sql
+SELECT ST_Buffer(
+  ST_GeomFromText('POLYGON ((10 10, 11 10, 10 11, 10 10))'),
+  1.0,
+  'quad_segs=2'
+) AS geom;
+```
+
+```{python}
+df = sd.sql("SELECT *, ST_Buffer(geom, 1.0, 'quad_segs=2') AS result FROM input").to_pandas()
+
+ax = df.geom.plot(alpha=0.5)
+df.result.plot(ax=ax, facecolor='none', edgecolor='red')
+```
diff --git a/docs/reference/functions/st_intersection.qmd b/docs/reference/functions/st_intersection.qmd
new file mode 100644
index 00000000..2bdc47be
--- /dev/null
+++ b/docs/reference/functions/st_intersection.qmd
@@ -0,0 +1,54 @@
+---
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+title: ST_Intersection
+description: Compute the intersection of two geometries or geographies.
+kernels:
+  - returns: geometry
+    args: [geometry, geometry]
+  - returns: geography
+    args: [geography, geography]
+---
+
+## Examples
+
+```sql
+SELECT ST_Intersection(
+    ST_GeomFromText('POLYGON ((1 1, 11 1, 11 11, 1 11, 1 1))'),
+    ST_GeomFromText('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))')
+) AS val;
+```
+
+```{python}
+import _matplotlib_defaults
+import sedonadb
+
+sd = sedonadb.connect()
+
+sd.sql("""
+SELECT
+    ST_GeomFromText('POLYGON ((1 1, 11 1, 11 11, 1 11, 1 1))') as geom_a,
+    ST_GeomFromText('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))') as geom_b
+""").to_view("input")
+
+df = sd.sql("SELECT *, ST_Intersection(geom_a, geom_b) as result FROM input").to_pandas()
+
+ax = df.geom_a.plot(alpha=0.5)
+df.geom_b.plot(ax=ax, alpha=0.5)
+df.result.plot(ax=ax, facecolor='none', edgecolor='red')
+```
diff --git a/docs/requirements.txt b/docs/requirements.txt
index 6bd80c39..53f6716c 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -16,6 +16,7 @@
 # under the License.
 
 griffe
+ipykernel
 mike
 mkdocs
 mkdocs-git-revision-date-localized-plugin


(sedona-db) 05/06: docs: add separate pages for ST_Area() and ST_AsBinary() (#457)

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jiayu pushed a commit to branch branch-0.2.0
in repository https://gitbox.apache.org/repos/asf/sedona-db.git

commit d7fb5d508099cf7782e7065cb876a3002fe6dbe2
Author: Matthew Powers <ma...@gmail.com>
AuthorDate: Tue Dec 16 12:01:18 2025 -0500

    docs: add separate pages for ST_Area() and ST_AsBinary() (#457)
---
 docs/reference/functions/.gitignore                  |  2 ++
 docs/reference/functions/{.gitignore => st_area.qmd} | 20 +++++++++++++++++---
 .../functions/{.gitignore => st_asbinary.qmd}        | 20 +++++++++++++++++---
 3 files changed, 36 insertions(+), 6 deletions(-)

diff --git a/docs/reference/functions/.gitignore b/docs/reference/functions/.gitignore
index d835f3f1..ca5d30fb 100644
--- a/docs/reference/functions/.gitignore
+++ b/docs/reference/functions/.gitignore
@@ -18,3 +18,5 @@
 /.quarto/
 *.md
 *_files/
+
+**/*.quarto_ipynb
diff --git a/docs/reference/functions/.gitignore b/docs/reference/functions/st_area.qmd
similarity index 71%
copy from docs/reference/functions/.gitignore
copy to docs/reference/functions/st_area.qmd
index d835f3f1..496f14d1 100644
--- a/docs/reference/functions/.gitignore
+++ b/docs/reference/functions/st_area.qmd
@@ -1,3 +1,4 @@
+---
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
@@ -15,6 +16,19 @@
 # specific language governing permissions and limitations
 # under the License.
 
-/.quarto/
-*.md
-*_files/
+title: ST_Area
+description: Returns the area of a geometry.
+kernels:
+  - returns: geometry
+    args: [geometry]
+---
+
+## Description
+
+`ST_Area()` Returns the area of a polygon or multi-polygon geometry.
+
+## Examples
+
+```sql
+SELECT ST_Area(ST_GeomFromWKT('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))'));
+```
diff --git a/docs/reference/functions/.gitignore b/docs/reference/functions/st_asbinary.qmd
similarity index 68%
copy from docs/reference/functions/.gitignore
copy to docs/reference/functions/st_asbinary.qmd
index d835f3f1..8876544d 100644
--- a/docs/reference/functions/.gitignore
+++ b/docs/reference/functions/st_asbinary.qmd
@@ -1,3 +1,4 @@
+---
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
@@ -15,6 +16,19 @@
 # specific language governing permissions and limitations
 # under the License.
 
-/.quarto/
-*.md
-*_files/
+title: ST_AsBinary
+description: Converts a geometry to Well-Known Binary (WKB) format.
+kernels:
+  - returns: geometry
+    args: [geometry]
+---
+
+## Description
+
+`ST_AsBinary()` Returns the Well-Known Binary representation of a geometry or geography. This function also has the alias ST_AsWKB.
+
+## Examples
+
+```sql
+SELECT ST_AsBinary(ST_Point(1.0, 2.0));
+```


(sedona-db) 04/06: chore(docs): Add missing dependency to docs build and ensure build fails if quarto render fails (#445)

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jiayu pushed a commit to branch branch-0.2.0
in repository https://gitbox.apache.org/repos/asf/sedona-db.git

commit 42c861519ec8d2783eaf279a4b600778b6ce6d50
Author: Dewey Dunnington <de...@dunnington.ca>
AuthorDate: Fri Dec 12 13:48:11 2025 -0600

    chore(docs): Add missing dependency to docs build and ensure build fails if quarto render fails (#445)
---
 ci/scripts/build-docs.sh | 7 ++++++-
 docs/requirements.txt    | 1 +
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/ci/scripts/build-docs.sh b/ci/scripts/build-docs.sh
index f6d333d2..f3d7f256 100755
--- a/ci/scripts/build-docs.sh
+++ b/ci/scripts/build-docs.sh
@@ -40,7 +40,12 @@ pushd "${SEDONADB_DIR}/docs/reference/functions"
 find . -name "*.md" -delete
 
 # Render the Quarto project
-quarto render
+if quarto render ; then
+  echo "Function reference Quarto project rendered successfully"
+else
+  echo "Function reference Quarto project build failed"
+  exit 1
+fi
 
 popd
 
diff --git a/docs/requirements.txt b/docs/requirements.txt
index 53f6716c..72078fba 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -17,6 +17,7 @@
 
 griffe
 ipykernel
+matplotlib
 mike
 mkdocs
 mkdocs-git-revision-date-localized-plugin


(sedona-db) 06/06: fix(docs): Sync the main Sedona website design with sedona-db (#584)

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jiayu pushed a commit to branch branch-0.2.0
in repository https://gitbox.apache.org/repos/asf/sedona-db.git

commit aa5341d0fc25b4321447a45d1c396f70e35e3f7e
Author: Jia Yu <ji...@wherobots.com>
AuthorDate: Mon Feb 9 09:23:23 2026 -0700

    fix(docs): Sync the main Sedona website design with sedona-db (#584)
---
 .pre-commit-config.yaml                |  31 ++-
 docs/image/footer/logo-footer.svg      |  10 +
 docs/image/header/logo-mobile.svg      |  10 +
 docs/image/logo.svg                    |  10 +
 docs/overrides/main.html               |  83 ++++++++
 docs/overrides/partials/copyright.html |  29 +++
 docs/overrides/partials/footer.html    |  42 ++++
 docs/overrides/partials/header.html    | 126 ++++++++++++
 docs/overrides/partials/nav.html       |  56 ++++++
 docs/stylesheets/extra.css             | 339 +++++++++++++++++++++++++++------
 mkdocs.yml                             |  16 +-
 11 files changed, 669 insertions(+), 83 deletions(-)

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 84f26f58..a373e6c1 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -18,42 +18,41 @@ repos:
   - repo: https://github.com/pre-commit/pre-commit-hooks
     rev: v5.0.0
     hooks:
-    - id: check-yaml
-    - id: end-of-file-fixer
-    - id: trailing-whitespace
+      - id: check-yaml
+      - id: end-of-file-fixer
+      - id: trailing-whitespace
 
   - repo: https://github.com/codespell-project/codespell
     rev: v2.4.1
     hooks:
-    -   id: codespell
-        # types_or: [markdown, c, c++, rust, python]
+      - id: codespell
         additional_dependencies: [tomli]
-        exclude: "^c/(sedona-geoarrow-c/src/geoarrow|sedona-geoarrow-c/src/nanoarrow|sedona-tg/src/tg)/.*|^docs/image/sedonadb-architecture\\.svg$"
+        exclude: "^c/(sedona-geoarrow-c/src/geoarrow|sedona-geoarrow-c/src/nanoarrow|sedona-libgpuspatial/libgpuspatial|sedona-tg/src/tg)/.*|^docs/image/.*\\.svg$|^r/sedonadb/tools/savvy-update.sh$"
+        args: ["--ignore-words-list=thirdparty"]
 
   - repo: https://github.com/astral-sh/ruff-pre-commit
     rev: v0.11.8
     hooks:
       - id: ruff
-        args: [ --fix ]
+        args: [--fix]
       - id: ruff-format
 
   - repo: https://github.com/doublify/pre-commit-rust
     rev: v1.0
     hooks:
-    - id: fmt
-      name: rustfmt
-      args: ["--all", "--"]
+      - id: fmt
+        name: rustfmt
+        args: ["--all", "--"]
 
   - repo: https://github.com/cheshirekow/cmake-format-precommit
     rev: v0.6.13
     hooks:
-    - id: cmake-format
-      args: [--in-place]
+      - id: cmake-format
+        args: [--in-place]
 
   - repo: https://github.com/pre-commit/mirrors-clang-format
     rev: v19.1.4
     hooks:
-    - id: clang-format
-      types_or: [c, c++]
-      # Don't run on vendored files
-      exclude: "^c/(sedona-geoarrow-c/src/geoarrow|sedona-geoarrow-c/src/nanoarrow|sedona-tg/src/tg)/.*"
+      - id: clang-format
+        types_or: [c, c++]
+        exclude: "^c/(sedona-geoarrow-c/src/geoarrow|sedona-geoarrow-c/src/nanoarrow|sedona-tg/src/tg)/.*"
diff --git a/docs/image/footer/logo-footer.svg b/docs/image/footer/logo-footer.svg
new file mode 100644
index 00000000..5aa7d426
--- /dev/null
+++ b/docs/image/footer/logo-footer.svg
@@ -0,0 +1,10 @@
+<svg width="172" height="30" viewBox="0 0 172 30" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<rect x="0.000488281" width="27.233" height="28.9052" fill="url(#pattern0_191_468)"/>
+<path d="M35.427 24.627L39.1693 11.5288H42.7245L46.4482 24.627H44.3712L43.5104 21.5395H38.3835L37.5227 24.627H35.427ZM38.8887 19.6684H43.0052L41.0966 12.7825H40.7973L38.8887 19.6684ZM47.9046 28.3693V15.4021H49.7945V16.7307H50.0938C50.3309 16.319 50.6864 15.951 51.1604 15.6267C51.6469 15.3023 52.3392 15.1402 53.2374 15.1402C54.0108 15.1402 54.7156 15.3273 55.3518 15.7015C56.0005 16.0758 56.5182 16.6184 56.9049 17.3294C57.3041 18.028 57.5036 18.8763 57.5036 19.8742V20.1549C57.5036 21.1528  [...]
+<defs>
+<pattern id="pattern0_191_468" patternContentUnits="objectBoundingBox" width="1" height="1">
+<use xlink:href="#image0_191_468" transform="matrix(0.00166829 0 0 0.00157178 0 -0.00218415)"/>
+</pattern>
+<image id="image0_191_468" width="4096" height="639" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAEAAAAAJ/CAYAAAD4lhbkAAAAAXNSR0IArs4c6QAAIABJREFUeF7s3Xmc3XV5L/Dne87MJGwhmcmCyUwImTNBU0QttlZbK9faW2spta1arVatvbhUrFgRC9oq4IKCKHVtEbXV9lbqUreiVlrUq7cbvdfaRpKZLGQmY0ImExDIMjPnfG9zXboIMjOZOef3O+fNX7xe+X6f5/O8vz/gr/OQwl8ECCyawMTaTQ9O1cbzbx4decXTIuqL1khhAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRKL5BKP4EBCBRUYO+as0 [...]
+</defs>
+</svg>
diff --git a/docs/image/header/logo-mobile.svg b/docs/image/header/logo-mobile.svg
new file mode 100644
index 00000000..7c6d95b3
--- /dev/null
+++ b/docs/image/header/logo-mobile.svg
@@ -0,0 +1,10 @@
+<svg width="132" height="83" viewBox="0 0 132 83" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<rect x="0.000976562" y="7.62939e-06" width="41.5303" height="44.0804" fill="url(#pattern0_122_2790)"/>
+<path d="M0.809488 77.089L4.40949 64.489H7.82949L11.4115 77.089H9.41349L8.58549 74.119H3.65349L2.82549 77.089H0.809488ZM4.13949 72.319H8.09949L6.26349 65.695H5.97549L4.13949 72.319ZM12.8125 80.689V68.215H14.6305V69.493H14.9185C15.1465 69.097 15.4885 68.743 15.9445 68.431C16.4125 68.119 17.0785 67.963 17.9425 67.963C18.6865 67.963 19.3645 68.143 19.9765 68.503C20.6005 68.863 21.0985 69.385 21.4705 70.069C21.8545 70.741 22.0465 71.557 22.0465 72.517V72.787C22.0465 73.747 21.8605 74.569 21. [...]
+<defs>
+<pattern id="pattern0_122_2790" patternContentUnits="objectBoundingBox" width="1" height="1">
+<use xlink:href="#image0_122_2790" transform="matrix(0.00166829 0 0 0.00157178 0 -0.00218415)"/>
+</pattern>
+<image id="image0_122_2790" width="4096" height="639" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAEAAAAAJ/CAYAAAD4lhbkAAAAAXNSR0IArs4c6QAAIABJREFUeF7s3Xm45GdVJ/DvubezdN+q290JiRgUBnEQUNwV0UGeURwRMaKCgiCgDiqCEiQEA6gkYQkQlggoGnBFR5BFNlkUBR0c93kYVBQUcMuThZDuqrrdWfrWOzYwIyqQu9St+lXVp//iIe97zvd83oL89Ttd8YcAgT0TaIPBnZJ8X/r9x1fV5p41UpgAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbkXqLmfwAAEOirQrrpqLQcOXJSq+6bqvOr13 [...]
+</defs>
+</svg>
diff --git a/docs/image/logo.svg b/docs/image/logo.svg
new file mode 100644
index 00000000..958f47cc
--- /dev/null
+++ b/docs/image/logo.svg
@@ -0,0 +1,10 @@
+<svg width="212" height="39" viewBox="0 0 212 39" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<rect x="0.000488281" y="0.848839" width="33.5662" height="35.6273" fill="url(#pattern0_141_148)"/>
+<path d="M43.7356 31.017L48.3483 14.8728H52.7302L57.3198 31.017H54.7598L53.6989 27.2116H47.3796L46.3187 31.017H43.7356ZM48.0023 24.9053H53.0762L50.7238 16.4181H50.3547L48.0023 24.9053ZM59.115 35.6297V19.6469H61.4443V21.2844H61.8133C62.1055 20.777 62.5437 20.3234 63.1279 19.9237C63.7276 19.5239 64.5809 19.324 65.6879 19.324C66.6412 19.324 67.5099 19.5547 68.2941 20.0159C69.0936 20.4772 69.7317 21.146 70.2083 22.0224C70.7003 22.8834 70.9463 23.929 70.9463 25.159V25.5049C70.9463 26.735 70.7 [...]
+<defs>
+<pattern id="pattern0_141_148" patternContentUnits="objectBoundingBox" width="1" height="1">
+<use xlink:href="#image0_141_148" transform="matrix(0.00166829 0 0 0.00157178 0 -0.00218415)"/>
+</pattern>
+<image id="image0_141_148" width="4096" height="639" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAEAAAAAJ/CAYAAAD4lhbkAAAAAXNSR0IArs4c6QAAIABJREFUeF7s3Xmc3XV5L/Dne87MJGwhmcmCyUwImTNBU0QttlZbK9faW2spta1arVatvbhUrFgRC9oq4IKCKHVtEbXV9lbqUreiVlrUq7cbvdfaRpKZLGQmY0ImExDIMjPnfG9zXboIMjOZOef3O+fNX7xe+X6f5/O8vz/gr/OQwl8ECCyawMTaTQ9O1cbzbx4decXTIuqL1khhAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRKL5BKP4EBCBRUYO+as0 [...]
+</defs>
+</svg>
diff --git a/docs/overrides/main.html b/docs/overrides/main.html
new file mode 100644
index 00000000..8533d72b
--- /dev/null
+++ b/docs/overrides/main.html
@@ -0,0 +1,83 @@
+{#-
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-#}
+{% extends "base.html" %}
+
+{% block header %}
+  <div id="announcement-bar"></div>
+  {{ super() }}
+  <script>
+    (function () {
+      // Fetch the main Sedona site and extract its announcement bar
+      fetch("https://sedona.apache.org/latest/")
+        .then(function (res) {
+          if (!res.ok) throw new Error("Failed to fetch");
+          return res.text();
+        })
+        .then(function (html) {
+          var parser = new DOMParser();
+          var doc = parser.parseFromString(html, "text/html");
+          // The announcement bar is the first div inside <body> before the header,
+          // styled with inline background: #CA463A
+          var candidates = doc.querySelectorAll("body > div, header > div, .md-header ~ div, body > .md-banner");
+          var announcement = null;
+
+          // Strategy 1: Look for a div with the Sedona red background color
+          for (var i = 0; i < candidates.length; i++) {
+            var style = candidates[i].getAttribute("style") || "";
+            if (style.indexOf("CA463A") !== -1 || style.indexOf("ca463a") !== -1) {
+              announcement = candidates[i];
+              break;
+            }
+          }
+
+          // Strategy 2: Check for Material's built-in announcement banner
+          if (!announcement) {
+            announcement = doc.querySelector(".md-banner");
+          }
+
+          // Strategy 3: Check first child of body if it's a div with a link
+          if (!announcement) {
+            var first = doc.body.firstElementChild;
+            if (first && first.tagName === "DIV" && first.querySelector("a")) {
+              var bg = first.style.backgroundColor || first.getAttribute("style") || "";
+              if (bg && first.textContent.trim().length > 0) {
+                announcement = first;
+              }
+            }
+          }
+
+          if (announcement) {
+            var bar = document.getElementById("announcement-bar");
+            // Fix relative links to point to the main site
+            var links = announcement.querySelectorAll("a");
+            for (var j = 0; j < links.length; j++) {
+              var href = links[j].getAttribute("href");
+              if (href && !href.startsWith("http") && !href.startsWith("//")) {
+                links[j].setAttribute("href", "/latest/" + href.replace(/^\//, ""));
+              }
+            }
+            bar.innerHTML = announcement.outerHTML;
+          }
+        })
+        .catch(function () {
+          // Silently fail — no announcement bar shown
+        });
+    })();
+  </script>
+{% endblock %}
diff --git a/docs/overrides/partials/copyright.html b/docs/overrides/partials/copyright.html
new file mode 100644
index 00000000..caec7fab
--- /dev/null
+++ b/docs/overrides/partials/copyright.html
@@ -0,0 +1,29 @@
+{#-
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-#}
+<div class="md-copyright">
+  {% if config.copyright %}
+      {{ config.copyright }}
+  {% endif %}
+  {% if not config.extra.generator == false %}
+    Made with
+    <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
+      Material for MkDocs
+    </a>
+  {% endif %}
+</div>
diff --git a/docs/overrides/partials/footer.html b/docs/overrides/partials/footer.html
new file mode 100644
index 00000000..ba539fec
--- /dev/null
+++ b/docs/overrides/partials/footer.html
@@ -0,0 +1,42 @@
+{#-
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-#}
+<footer class="footer md-footer">
+  <div class="container">
+
+    <div class="footer__top">
+
+      <div class="col-left">
+        <img src="{{ 'image/footer/logo-footer.svg' | url }}" alt="" class="footer-logo">
+      </div>
+
+      <div class="col-right">
+        {% if config.extra.social %}
+        {% include "partials/social.html" %}
+        {% endif %}
+      </div>
+    </div>
+
+    <hr class="footer-hr"></hr>
+
+    <div class="footer__bot">
+      {% include "partials/copyright.html" %}
+    </div>
+
+  </div>
+</footer>
diff --git a/docs/overrides/partials/header.html b/docs/overrides/partials/header.html
new file mode 100644
index 00000000..948b752f
--- /dev/null
+++ b/docs/overrides/partials/header.html
@@ -0,0 +1,126 @@
+<!--
+  Copyright (c) 2016-2025 Martin Donath <ma...@squidfunk.com>
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to
+  deal in the Software without restriction, including without limitation the
+  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+  sell copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in
+  all copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+  IN THE SOFTWARE.
+-->
+
+<!-- Determine classes -->
+{% set class = "md-header" %}
+{% if "navigation.tabs.sticky" in features %}
+{% set class = class ~ " md-header--shadow md-header--lifted" %}
+{% elif "navigation.tabs" not in features %}
+{% set class = class ~ " md-header--shadow" %}
+{% endif %}
+
+<!-- Header -->
+<header class="{{ class }}" data-md-component="header">
+    <nav
+      class="md-header__inner md-grid container"
+      aria-label="{{ lang.t('header') }}"
+    >
+      <div class="left-part">
+
+        <!-- Button to open drawer -->
+        <label class="md-header__button md-icon" for="__drawer">
+          {% set icon = config.theme.icon.menu or "material/menu" %}
+          {% include ".icons/" ~ icon ~ ".svg" %}
+        </label>
+
+        <!-- Link to home -->
+        <a
+          href="{{ config.extra.homepage | d(nav.homepage.url, true) | url }}"
+          title="{{ config.site_name | e }}"
+          class="header-logo"
+          aria-label="{{ config.site_name }}"
+          data-md-component="logo"
+        >
+          {% include "partials/logo.html" %}
+        </a>
+
+        <!-- Header title -->
+        <div class="md-header__title" data-md-component="header-title">
+          <div class="md-header__ellipsis">
+            <div class="md-header__topic">
+          <span class="md-ellipsis">
+            {{ config.site_name }}
+          </span>
+            </div>
+            <div class="md-header__topic" data-md-component="header-topic">
+          <span class="md-ellipsis">
+            {% if page.meta and page.meta.title %}
+              {{ page.meta.title }}
+            {% else %}
+              {{ page.title }}
+            {% endif %}
+          </span>
+            </div>
+          </div>
+        </div>
+
+        <!-- Color palette toggle -->
+        {% if config.theme.palette %}
+        {% if not config.theme.palette is mapping %}
+        {% include "partials/palette.html" %}
+        {% endif %}
+        {% endif %}
+
+        <!-- User preference: color palette -->
+        {% if not config.theme.palette is mapping %}
+        {% include "partials/javascripts/palette.html" %}
+        {% endif %}
+
+        <!-- Site language selector -->
+        {% if config.extra.alternate %}
+        {% include "partials/alternate.html" %}
+        {% endif %}
+      </div>
+      <div class="right-part">
+
+        <!-- Button to open search modal -->
+        {% if "material/search" in config.plugins %}
+        {% set search = config.plugins["material/search"] | attr("config") %}
+
+        <!-- Check if search is actually enabled - see https://t.ly/DT_0V -->
+        {% if search.enabled %}
+        <label class="md-header__button md-icon btn-search" for="__search">
+          {% set icon = config.theme.icon.search or "material/magnify" %}
+          {% include ".icons/" ~ icon ~ ".svg" %}
+        </label>
+
+        <!-- Search interface -->
+        {% include "partials/search.html" %}
+        {% endif %}
+        {% endif %}
+
+        <!-- Repository information -->
+        {% if config.repo_url %}
+        <div class="md-header__source">
+          {% include "partials/source.html" %}
+        </div>
+        {% endif %}
+      </div>
+    </nav>
+
+    <!-- Navigation tabs (sticky) -->
+    {% if "navigation.tabs.sticky" in features %}
+    {% if "navigation.tabs" in features %}
+    {% include "partials/tabs.html" %}
+    {% endif %}
+    {% endif %}
+</header>
diff --git a/docs/overrides/partials/nav.html b/docs/overrides/partials/nav.html
new file mode 100644
index 00000000..6190a179
--- /dev/null
+++ b/docs/overrides/partials/nav.html
@@ -0,0 +1,56 @@
+{#-
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-#}
+{% import "partials/nav-item.html" as item with context %}
+{% set class = "md-nav md-nav--primary" %}
+{% if "navigation.tabs" in features %}
+{% set class = class ~ " md-nav--lifted" %}
+{% endif %}
+{% if "toc.integrate" in features %}
+{% set class = class ~ " md-nav--integrated" %}
+{% endif %}
+
+
+<nav class="{{ class }}" aria-label="{{ lang.t('nav') }}" data-md-level="0">
+
+  <label class="md-nav__title" for="__drawer">
+    <a href="{{ config.extra.homepage | d(nav.homepage.url, true) | url }}" title="{{ config.site_name | e }}" class="logo-link" aria-label="{{ config.site_name }}" data-md-component="logo">
+      <img src="{{ 'image/header/logo-mobile.svg' | url }}" alt="" class="logo">
+    </a>
+  </label>
+
+  {% if config.repo_url %}
+  <div class="md-nav__source">
+    {% include "partials/source.html" %}
+  </div>
+  {% endif %}
+
+  <ul class="md-nav__list" data-md-scrollfix>
+    {% for nav_item in nav %}
+    {% set path = "__nav_" ~ loop.index %}
+    {{ item.render(nav_item, path, 1) }}
+    {% endfor %}
+
+    <li class="btn-group">
+      <a href="#" class="btn btn-red">
+        Get started
+      </a>
+    </li>
+
+  </ul>
+</nav>
diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css
index 5cd0bcf0..a9344dbe 100644
--- a/docs/stylesheets/extra.css
+++ b/docs/stylesheets/extra.css
@@ -18,111 +18,332 @@
 */
 
 /* ==========================================================================
-   Global Color and Font Variables
+   Variables (from _vars.scss)
    ========================================================================== */
 :root {
   --color-red: #CA463A;
+  --color-red-hover: #EA5547;
   --color-white: #fff;
   --color-dark: #1C1C1C;
-  --font-inter: "Inter",
-  sans-serif;
+  --color-light-blue: #E2ECF3;
+  --color-violet: #7142FF;
+  --font-inter: 'Inter', sans-serif;
 }
 
 /* ==========================================================================
-   Header Styles
+   Container (from _header.scss)
    ========================================================================== */
+.container {
+  max-width: 1170px;
+  width: 100%;
+  padding-left: 24px;
+  padding-right: 24px;
+  margin-left: auto;
+  margin-right: auto;
+}
 
-/* Main header container (the top black bar) */
+/* ==========================================================================
+   Header (from _header.scss)
+   ========================================================================== */
 .md-header {
   box-shadow: none;
   background-color: var(--color-dark);
 }
 
-/* Inner content of the header */
 .md-header .md-header__inner {
   background-color: var(--color-dark);
   min-height: 80px;
+  padding: 0;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.md-header__inner .left-part {
+  display: flex;
+  justify-content: flex-start;
+  align-items: center;
+}
+
+.md-header__inner .right-part {
+  display: flex;
+  justify-content: flex-end;
+  align-items: center;
+  gap: 32px;
 }
 
-/* Styles for the logo image */
-.md-header .md-header__inner .header-logo img,
-.md-header .md-header__inner .header-logo svg {
+@media (min-width: 1220px) {
+  .md-header__inner .right-part .md-search__inner {
+    max-width: 510px;
+  }
+}
+
+.md-header__inner .header-logo {
+  padding: 0;
+  margin: 0;
+}
+
+.md-header__inner .header-logo img,
+.md-header__inner .header-logo svg {
   height: 42px;
   width: auto;
+  display: block;
+  object-fit: contain;
 }
 
-/* --- Definitive Navigation CSS (Final Version) --- */
+.md-header__title {
+  font-size: 0;
+}
 
-/* 1. Set the height of the main navigation bar */
-.md-tabs {
-  background-color: var(--color-red);
-  height: 2.5rem; /* Set an explicit, predictable height for the bar */
+/* Also target the default .md-logo */
+.md-header .md-logo img,
+.md-header .md-logo svg {
+  height: 42px;
+  width: auto;
 }
 
-/* 2. Control the alignment of the links within the bar */
-.md-tabs .md-tabs__list {
-  height: 100%; /* Make the link container fill the bar's height */
-  justify-content: center; /* Center links horizontally */
-  align-items: center;   /* NEW: Center links vertically */
-  flex-wrap: wrap;       /* Allow wrapping on small screens */
+/* Header mobile */
+@media (max-width: 1219px) {
+  .md-header .container {
+    padding-left: 18px;
+    padding-right: 18px;
+  }
+  .md-header .md-header__inner {
+    min-height: 60px;
+  }
+  .md-header__inner .header-logo img,
+  .md-header__inner .header-logo svg {
+    height: 23px;
+  }
+  .md-header__inner .right-part {
+    gap: 0;
+  }
+  .md-header__inner .right-part .btn-group {
+    display: none;
+  }
+  .md-header__inner .right-part .btn-search {
+    margin: 0;
+  }
+  .md-header .md-header__button {
+    width: 32px;
+    height: 32px;
+    padding: 0;
+    margin: 0;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    margin-right: 14px;
+  }
+  .md-header .md-header__button.btn-search {
+    display: none;
+  }
 }
 
-/* 3. Style the individual navigation links */
-.md-tabs__link {
-  font-weight: 400;
-  color: rgba(255, 255, 255, 0.85);
-  /* We no longer need vertical padding for spacing */
-  padding: 0 0.9rem;
-  font-size: 0.65rem; /* NEW: Adjust font size */
+@media (max-width: 959px) {
+  .md-header .md-header__button.btn-search {
+    display: flex;
+  }
 }
 
 /* ==========================================================================
-   Logo Size Adjustment
+   Navigation Tabs (from _header.scss)
    ========================================================================== */
+.md-tabs {
+  background-color: var(--color-red);
+}
 
-/*
-  Targets the logo in the header, whether it's an SVG or a standard image file.
-  Adjust the height value as needed to get the perfect size.
-*/
-.md-header .md-logo img,
-.md-header .md-logo svg {
-  height: 42px; /* This should match the Apache Sedona logo size */
-  width: auto;  /* Ensures the width scales proportionally */
+.md-tabs .md-grid {
+  max-width: 100%;
 }
 
+.md-tabs .md-tabs__list {
+  display: flex;
+  justify-content: center;
+}
+
+.md-tabs .md-tabs__list .md-tabs__item a {
+  font-family: var(--font-inter);
+  font-style: normal;
+  font-weight: 500;
+  font-size: 14px;
+  line-height: 1.22;
+  color: var(--color-white);
+}
 
 /* ==========================================================================
-   Mobile Navigation Styles
+   Mobile Sidebar / Nav (from _header.scss)
    ========================================================================== */
+@media (max-width: 1219px) {
+  [dir=ltr] .md-sidebar--primary {
+    left: -280px;
+  }
+  [data-md-toggle=drawer]:checked ~ .md-container .md-sidebar--primary {
+    transform: translateX(280px);
+  }
+  .md-sidebar--primary {
+    width: 280px;
+  }
+  .md-sidebar--primary .md-nav--primary .md-nav__title[for=__drawer] {
+    background-color: var(--color-dark);
+    padding: 24px;
+    height: auto;
+  }
+  .md-sidebar--primary .md-nav--primary .md-nav__title[for=__drawer] img {
+    height: 82px;
+    width: auto;
+    display: block;
+    object-fit: contain;
+  }
+  .md-sidebar--primary .md-nav__source {
+    background-color: #000;
+    padding: 16px 24px;
+  }
+  .md-sidebar--primary .md-nav__source .md-source__icon svg {
+    margin-left: 0;
+  }
+  .md-sidebar--primary .md-nav__list,
+  .md-sidebar--primary .md-nav__title ~ .md-nav__list {
+    padding-bottom: 75px;
+    background-color: var(--color-dark);
+  }
+  .md-sidebar--primary .md-nav__list .md-nav__item,
+  .md-sidebar--primary .md-nav__title ~ .md-nav__list .md-nav__item {
+    border-bottom: 1px solid #323232;
+  }
+  .md-sidebar--primary .md-nav__list .md-nav__item .md-nav__link,
+  .md-sidebar--primary .md-nav__title ~ .md-nav__list .md-nav__item .md-nav__link {
+    font-family: var(--font-inter);
+    font-style: normal;
+    font-weight: 400;
+    font-size: 16px;
+    line-height: 1.67;
+    align-items: center;
+    letter-spacing: 0.18px;
+    color: #FFFFFF;
+    padding-left: 24px;
+    padding-right: 24px;
+    padding-top: 12px;
+    padding-bottom: 12px;
+    min-height: 50px;
+  }
+  .md-sidebar--primary .md-nav__list .btn-group,
+  .md-sidebar--primary .md-nav__title ~ .md-nav__list .btn-group {
+    padding-left: 24px;
+    padding-right: 24px;
+    padding-top: 32px;
+  }
+  .md-sidebar--primary .md-nav__list .btn-group .btn,
+  .md-sidebar--primary .md-nav__title ~ .md-nav__list .btn-group .btn {
+    width: 100%;
+  }
+  .md-sidebar--primary .md-nav--primary .md-nav__title {
+    background-color: #000;
+    color: var(--color-white);
+    padding-left: 24px;
+  }
+}
 
-/*
-  Force the entire mobile navigation header to be black, overriding theme defaults.
-*/
-.md-nav--primary .md-nav__title,
-.md-nav--primary .md-nav__source {
-  background-color: var(--color-dark) !important;
+/* Desktop sidebar */
+@media (min-width: 1220px) {
+  .md-sidebar--primary .btn-group {
+    display: none;
+  }
 }
 
 /* ==========================================================================
-   Swap Logo ONLY in Mobile Navigation
+   Footer (from _footer.scss)
    ========================================================================== */
+.footer {
+  background-color: var(--color-dark);
+}
 
-/*
-  Target the logo link (<a> tag) directly and apply the new logo
-  as a background image, overriding the theme's default icon.
-*/
-.md-sidebar--primary .md-nav__title a.md-nav__button.md-logo {
-  background-image: url('/docs/image/sedona_logo_symbol.svg');
-  background-size: contain;
-  background-repeat: no-repeat;
-  background-position: center;
+.footer .footer__top {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding-bottom: 32px;
+  padding-top: 64px;
+  gap: 48px;
+  flex-wrap: wrap;
+}
+
+.footer .footer__top .footer-logo {
+  height: 30px;
+  width: auto;
+  display: block;
+  object-fit: contain;
+}
+
+.footer .footer__top .md-social {
+  padding: 0;
+  margin: 0;
+  gap: 18px;
+}
+
+.footer .footer__top .md-social .md-social__link {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  width: 32px;
+  height: 32px;
+}
+
+.footer .footer__top .md-social .md-social__link svg,
+.footer .footer__top .md-social .md-social__link img {
+  width: 28px;
+  height: 28px;
+  max-height: 28px;
+  display: block;
+  object-fit: contain;
+  color: rgba(255, 255, 255, 0.5);
+}
+
+.footer .footer__top .md-social .md-social__link:hover svg,
+.footer .footer__top .md-social .md-social__link:hover img {
+  color: var(--color-white);
+}
+
+.footer .footer-hr {
+  background-color: #323232;
+  height: 1px;
+  width: 100%;
+  display: block;
+  margin: 0;
+  border: 0;
+}
+
+.footer .footer__bot {
+  padding-top: 32px;
+  padding-bottom: 64px;
+}
+
+.footer .footer__bot .md-copyright {
+  font-family: var(--font-inter);
+  font-style: normal;
+  font-weight: 400;
+  font-size: 12px;
+  line-height: 1.25;
+  text-align: center;
+  color: rgba(255, 255, 255, 0.5);
+}
+
+.footer .footer__bot .md-copyright a {
+  text-decoration: underline;
+  text-underline-offset: 2px;
+  transition: 0.3s all ease;
+}
 
-  /* Hide the theme's default icon which is applied via a mask */
-  -webkit-mask: none;
-  mask: none;
+.footer .footer__bot .md-copyright a:hover {
+  color: var(--color-white);
 }
 
-/* Change the mobile nav header label text to white */
-label.md-nav__title {
-  color: #FFFFFF !important;
+@media (max-width: 480px) {
+  .footer .footer__top {
+    flex-direction: column;
+    justify-content: center;
+    align-items: center;
+  }
+  .footer .footer__bot .md-copyright {
+    text-align: left;
+  }
 }
diff --git a/mkdocs.yml b/mkdocs.yml
index 4af02863..7095a23a 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -28,15 +28,11 @@ extra:
     - icon: fontawesome/brands/discord
       link: 'https://discord.gg/9A3k5dEBsY'
 
-site_name: SedonaDB
+site_name: Apache Sedona
 site_description: "Documentation for SedonaDB"
 site_url: https://sedona.apache.org/sedonadb/
 nav:
   - Home: https://sedona.apache.org/latest/
-  - Setup: https://sedona.apache.org/latest/setup/overview/
-  - Download: https://sedona.apache.org/latest/download/
-  - Programming Guides: https://sedona.apache.org/latest/tutorial/sql/
-  - API Docs: https://sedona.apache.org/latest/api/sql/Overview/
   - SedonaDB:
       - Home: index.md
       - Quickstart: quickstart-python.md
@@ -53,9 +49,12 @@ nav:
         - Working with Parquet Files: working-with-parquet-files.md
         - Working with SQL in SedonaDB: working-with-sql-sedonadb.md
       - Contributors Guide: contributors-guide.md
+  - SedonaSpark: https://sedona.apache.org/latest/sedonaspark/
+  - SedonaFlink: https://sedona.apache.org/latest/sedonaflink/
+  - SedonaSnow: https://sedona.apache.org/latest/sedonasnow/
   - SpatialBench: https://sedona.apache.org/spatialbench/
   - Blog: https://sedona.apache.org/latest/blog/
-  - Community: https://sedona.apache.org/latest/setup/compile/
+  - Community: https://sedona.apache.org/latest/community/contact/
   - Apache Software Foundation: https://sedona.apache.org/latest/asf/asf/
 
 repo_url: https://github.com/apache/sedona-db
@@ -63,6 +62,7 @@ edit_uri: https://github.com/apache/sedona-db/blob/main/docs/
 repo_name: apache/sedona-db
 theme:
   name: material
+  custom_dir: docs/overrides
   font:
     font: false
     name: 'material'
@@ -70,7 +70,7 @@ theme:
     primary: custom
     accent: 'green'
   favicon: image/sedona_logo_symbol.png
-  logo: image/sedona_logo_symbol.png
+  logo: image/logo.svg
   icon:
     logo: fontawesome/solid/earth-americas
     repo: fontawesome/brands/github
@@ -91,7 +91,7 @@ theme:
 extra_css:
   - stylesheets/extra.css
 
-copyright: Copyright © 2025 The Apache Software Foundation. Apache Sedona, Sedona, Apache, the Apache feather logo, and the Apache Sedona project logo are either registered trademarks or trademarks of The Apache Software Foundation in the United States and other countries. All other marks mentioned may be trademarks or registered trademarks of their respective owners. Please visit <a href="https://www.apache.org/">Apache Software Foundation</a> for more details.<img referrerpolicy="no-re [...]
+copyright: Copyright © 2026 The Apache Software Foundation. Apache Sedona, Sedona, Apache, the Apache feather logo, and the Apache Sedona project logo are either registered trademarks or trademarks of The Apache Software Foundation in the United States and other countries. All other marks mentioned may be trademarks or registered trademarks of their respective owners. Please visit <a href="https://www.apache.org/">Apache Software Foundation</a> for more details.<img referrerpolicy="no-re [...]
 
 exclude_docs: |
      snippets/*


(sedona-db) 02/06: docs(r): update installation command (#421)

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jiayu pushed a commit to branch branch-0.2.0
in repository https://gitbox.apache.org/repos/asf/sedona-db.git

commit 7541d638e6a97374c76c5ecf72dc580723467a2d
Author: eitsupi <50...@users.noreply.github.com>
AuthorDate: Mon Dec 8 12:26:43 2025 +0900

    docs(r): update installation command (#421)
---
 docs/index.md         |  2 +-
 r/sedonadb/README.Rmd |  7 +++++++
 r/sedonadb/README.md  | 44 +++++++++++++++++++++++++++-----------------
 3 files changed, 35 insertions(+), 18 deletions(-)

diff --git a/docs/index.md b/docs/index.md
index 3d01912d..8dbac2c5 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -79,7 +79,7 @@ Here's how to install SedonaDB with various build tools:
 
 === "R"
 
-	```bash
+	```r
 	install.packages("sedonadb", repos = "https://community.r-multiverse.org")
 	```
 
diff --git a/r/sedonadb/README.Rmd b/r/sedonadb/README.Rmd
index bf18f8b5..013ef4bb 100644
--- a/r/sedonadb/README.Rmd
+++ b/r/sedonadb/README.Rmd
@@ -34,12 +34,19 @@ knitr::opts_chunk$set(
 # sedonadb
 
 <!-- badges: start -->
+[![R-multiverse status](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fcommunity.r-multiverse.org%2Fapi%2Fpackages%2Fsedonadb&query=%24.Version&label=r-multiverse)](https://community.r-multiverse.org/sedonadb)
 <!-- badges: end -->
 
 The goal of sedonadb is to provide an R interface to [Apache SedonaDB](https://sedona.apache.org/sedonadb). SedonaDB provides a [DataFusion](https://datafusion.apache.org)-powered single-node engine with a wide range of spatial capabilities built in, including spatial SQL with high function coverage and GeoParquet IO.
 
 ## Installation
 
+sedonadb can be installed from [R-multiverse](https://community.r-multiverse.org/):
+
+``` r
+install.packages("sedonadb", repos = "https://community.r-multiverse.org")
+```
+
 You can install the development version of sedonadb from [GitHub](https://github.com/) with:
 
 ``` r
diff --git a/r/sedonadb/README.md b/r/sedonadb/README.md
index 6f8dd822..74afc156 100644
--- a/r/sedonadb/README.md
+++ b/r/sedonadb/README.md
@@ -20,6 +20,8 @@
 
 <!-- badges: start -->
 
+[![R-multiverse
+status](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fcommunity.r-multiverse.org%2Fapi%2Fpackages%2Fsedonadb&query=%24.Version&label=r-multiverse)](https://community.r-multiverse.org/sedonadb)
 <!-- badges: end -->
 
 The goal of sedonadb is to provide an R interface to [Apache
@@ -30,6 +32,13 @@ SQL with high function coverage and GeoParquet IO.
 
 ## Installation
 
+sedonadb can be installed from
+[R-multiverse](https://community.r-multiverse.org/):
+
+``` r
+install.packages("sedonadb", repos = "https://community.r-multiverse.org")
+```
+
 You can install the development version of sedonadb from
 [GitHub](https://github.com/) with:
 
@@ -51,6 +60,7 @@ and/or Parquet metadata:
 
 ``` r
 library(sedonadb)
+#> Warning: package 'sedonadb' was built under R version 4.5.2
 
 url <- "https://github.com/geoarrow/geoarrow-data/releases/download/v0.2.0/microsoft-buildings_point_geo.parquet"
 sd_read_parquet(url) |> sd_to_view("buildings", overwrite = TRUE)
@@ -84,28 +94,28 @@ Conversion to and from sf are supported:
 
 ``` r
 library(sf)
-#> Linking to GEOS 3.13.0, GDAL 3.8.5, PROJ 9.5.1; sf_use_s2() is TRUE
+#> Linking to GEOS 3.12.1, GDAL 3.8.4, PROJ 9.4.0; sf_use_s2() is TRUE
 
 nc <- sf::read_sf(system.file("shape/nc.shp", package = "sf"))
 nc |> sd_to_view("nc", overwrite = TRUE)
 
 sd_sql("SELECT * FROM nc")
-#> ┌─────────┬───┬─────────┬──────────────────────────────────────────────────────┐
-#> │   AREA  ┆ … ┆ NWBIR79 ┆                       geometry                       │
-#> │ float64 ┆   ┆ float64 ┆                       geometry                       │
-#> ╞═════════╪═══╪═════════╪══════════════════════════════════════════════════════╡
-#> │   0.114 ┆ … ┆    19.0 ┆ MULTIPOLYGON(((-81.4727554321289 36.23435592651367,… │
-#> ├╌╌╌╌╌╌╌╌╌┼╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
-#> │   0.061 ┆ … ┆    12.0 ┆ MULTIPOLYGON(((-81.2398910522461 36.36536407470703,… │
-#> ├╌╌╌╌╌╌╌╌╌┼╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
-#> │   0.143 ┆ … ┆   260.0 ┆ MULTIPOLYGON(((-80.45634460449219 36.24255752563476… │
-#> ├╌╌╌╌╌╌╌╌╌┼╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
-#> │    0.07 ┆ … ┆   145.0 ┆ MULTIPOLYGON(((-76.00897216796875 36.31959533691406… │
-#> ├╌╌╌╌╌╌╌╌╌┼╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
-#> │   0.153 ┆ … ┆  1197.0 ┆ MULTIPOLYGON(((-77.21766662597656 36.24098205566406… │
-#> ├╌╌╌╌╌╌╌╌╌┼╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
-#> │   0.097 ┆ … ┆  1237.0 ┆ MULTIPOLYGON(((-76.74506378173828 36.23391723632812… │
-#> └─────────┴───┴─────────┴──────────────────────────────────────────────────────┘
+#> ┌─────────┬───────────┬─────────┬───┬─────────┬─────────┬────────────────────────────────────────┐
+#> │   AREA  ┆ PERIMETER ┆  CNTY_  ┆ … ┆  SID79  ┆ NWBIR79 ┆                geometry                │
+#> │ float64 ┆  float64  ┆ float64 ┆   ┆ float64 ┆ float64 ┆                geometry                │
+#> ╞═════════╪═══════════╪═════════╪═══╪═════════╪═════════╪════════════════════════════════════════╡
+#> │   0.114 ┆     1.442 ┆  1825.0 ┆ … ┆     0.0 ┆    19.0 ┆ MULTIPOLYGON(((-81.4727554321289 36.2… │
+#> ├╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
+#> │   0.061 ┆     1.231 ┆  1827.0 ┆ … ┆     3.0 ┆    12.0 ┆ MULTIPOLYGON(((-81.2398910522461 36.3… │
+#> ├╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
+#> │   0.143 ┆      1.63 ┆  1828.0 ┆ … ┆     6.0 ┆   260.0 ┆ MULTIPOLYGON(((-80.45634460449219 36.… │
+#> ├╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
+#> │    0.07 ┆     2.968 ┆  1831.0 ┆ … ┆     2.0 ┆   145.0 ┆ MULTIPOLYGON(((-76.00897216796875 36.… │
+#> ├╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
+#> │   0.153 ┆     2.206 ┆  1832.0 ┆ … ┆     3.0 ┆  1197.0 ┆ MULTIPOLYGON(((-77.21766662597656 36.… │
+#> ├╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
+#> │   0.097 ┆      1.67 ┆  1833.0 ┆ … ┆     5.0 ┆  1237.0 ┆ MULTIPOLYGON(((-76.74506378173828 36.… │
+#> └─────────┴───────────┴─────────┴───┴─────────┴─────────┴────────────────────────────────────────┘
 #> Preview of up to 6 row(s)
 ```
 


(sedona-db) 01/06: docs: Link doc to raw GitHub assets (#420)

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jiayu pushed a commit to branch branch-0.2.0
in repository https://gitbox.apache.org/repos/asf/sedona-db.git

commit aace6a10334ad73e52a7ec1b55850c22c597cc2b
Author: Balthasar Teuscher <ba...@gmail.com>
AuthorDate: Sat Dec 6 23:43:44 2025 +0100

    docs: Link doc to raw GitHub assets (#420)
---
 README.md | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/README.md b/README.md
index a96ee2e2..a87add7b 100644
--- a/README.md
+++ b/README.md
@@ -25,7 +25,7 @@ SedonaDB is perfect for processing smaller to medium datasets on local machines
 
 ## Architecture
 
-![SedonaDB Architecture](docs/image/sedonadb-architecture.svg)
+![SedonaDB Architecture](https://raw.githubusercontent.com/apache/sedona-db/refs/heads/main/docs/image/sedonadb-architecture.svg)
 
 * **Columnar in-memory datasets**
     * Spatial indexing
@@ -61,8 +61,8 @@ SedonaDB has several advantages:
 This is a performance benchmark comparing SedonaDB 0.1.0, DuckDB 1.4.0, and GeoPandas 1.1.1 using SpatialBench Queries 1-12 at Scale Factors 1 and 10. Details can be found at [Apache Sedona SpatialBench](https://sedona.apache.org/spatialbench/single-node-benchmarks/).
 
 <div align="center">
-  <img src="docs/image/sf1-09242025.png" alt="SF1 Benchmark Results" width="45%" />
-  <img src="docs/image/sf10-09242025.png" alt="SF10 Benchmark Results" width="45%" />
+  <img src="https://raw.githubusercontent.com/apache/sedona-db/refs/heads/main/docs/image/sf1-09242025.png" alt="SF1 Benchmark Results" width="45%" />
+  <img src="https://raw.githubusercontent.com/apache/sedona-db/refs/heads/main/docs/image/sf10-09242025.png" alt="SF10 Benchmark Results" width="45%" />
 </div>
 
 ## Install