Files
supabase/apps/docs/content/guides/database/extensions/pgrouting.mdx
Charis 47705a8968 chore: replace all supabase urls with relative urls (#38537)
* fix: rewrite relative URLs when syncing to GitHub discussion

Relative URLs back to supabse.com won't work in GitHub discussions, so
rewrite them back to absolute URLs starting with https://supabase.com

* fix: replace all supabase urls with relative urls

* chore: add linting for relative urls

* chore: bump linter version

* Prettier

---------

Co-authored-by: Chris Chinchilla <chris.ward@supabase.io>
2025-09-09 12:54:33 +00:00

155 lines
4.7 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
id: 'pgrouting'
title: 'pgrouting: Geospatial Routing'
description: 'Extends PostGIS with Geospatial Routing'
---
[`pgRouting`](http://pgrouting.org) is Postgres and [PostGIS](http://postgis.net) extension adding geospatial routing functionality.
The core functionality of `pgRouting` is a set of path finding algorithms including:
- All Pairs Shortest Path, Johnsons Algorithm
- All Pairs Shortest Path, Floyd-Warshall Algorithm
- Shortest Path A\*
- Bi-directional Dijkstra Shortest Path
- Bi-directional A\* Shortest Path
- Shortest Path Dijkstra
- Driving Distance
- K-Shortest Path, Multiple Alternative Paths
- K-Dijkstra, One to Many Shortest Path
- Traveling Sales Person
- Turn Restriction Shortest Path (TRSP)
## Enable the extension
<Tabs
scrollable
size="small"
type="underlined"
defaultActiveId="dashboard"
queryGroup="database-method"
>
<TabPanel id="dashboard" label="Dashboard">
1. Go to the [Database](/dashboard/project/_/database/tables) page in the Dashboard.
2. Click on **Extensions** in the sidebar.
3. Search for `pgrouting` and enable the extension.
</TabPanel>
<TabPanel id="sql" label="SQL">
{/* prettier-ignore */}
```sql
-- Enable the "pgRouting" extension
create extension pgrouting cascade;
-- Disable the "pgRouting" extension
drop extension if exists pgRouting;
```
Even though the SQL code is `create extension`, this is the equivalent of enabling the extension.
To disable an extension you can call `drop extension`.
</TabPanel>
</Tabs>
## Example
As an example, we'll solve the [traveling salesperson problem](https://en.wikipedia.org/wiki/Travelling_salesman_problem) using the `pgRouting`'s `pgr_TSPeuclidean` function from some PostGIS coordinates.
A summary of the traveling salesperson problem is, given a set of city coordinates, solve for a path that goes through each city and minimizes the total distance traveled.
First we populate a table with some X, Y coordinates
{/* prettier-ignore */}
```sql
create table wi29 (
id bigint,
x float,
y float,
geom geometry
);
insert into wi29 (id, x, y)
values
(1,20833.3333,17100.0000),
(2,20900.0000,17066.6667),
(3,21300.0000,13016.6667),
(4,21600.0000,14150.0000),
(5,21600.0000,14966.6667),
(6,21600.0000,16500.0000),
(7,22183.3333,13133.3333),
(8,22583.3333,14300.0000),
(9,22683.3333,12716.6667),
(10,23616.6667,15866.6667),
(11,23700.0000,15933.3333),
(12,23883.3333,14533.3333),
(13,24166.6667,13250.0000),
(14,25149.1667,12365.8333),
(15,26133.3333,14500.0000),
(16,26150.0000,10550.0000),
(17,26283.3333,12766.6667),
(18,26433.3333,13433.3333),
(19,26550.0000,13850.0000),
(20,26733.3333,11683.3333),
(21,27026.1111,13051.9444),
(22,27096.1111,13415.8333),
(23,27153.6111,13203.3333),
(24,27166.6667,9833.3333),
(25,27233.3333,10450.0000),
(26,27233.3333,11783.3333),
(27,27266.6667,10383.3333),
(28,27433.3333,12400.0000),
(29,27462.5000,12992.2222);
```
Next we use the `pgr_TSPeuclidean` function to find the best path.
{/* prettier-ignore */}
```sql
select
*
from
pgr_TSPeuclidean($$select * from wi29$$)
```
{/* prettier-ignore */}
```sql
seq | node | cost | agg_cost
-----+------+------------------+------------------
1 | 1 | 0 | 0
2 | 2 | 74.535614157127 | 74.535614157127
3 | 6 | 900.617093380362 | 975.152707537489
4 | 10 | 2113.77757765045 | 3088.93028518793
5 | 11 | 106.718669615254 | 3195.64895480319
6 | 12 | 1411.95293791574 | 4607.60189271893
7 | 13 | 1314.23824873744 | 5921.84014145637
8 | 14 | 1321.76283931305 | 7243.60298076942
9 | 17 | 1202.91366735569 | 8446.5166481251
10 | 18 | 683.333268292684 | 9129.84991641779
11 | 15 | 1108.05137466134 | 10237.9012910791
12 | 19 | 772.082339448903 | 11009.983630528
13 | 22 | 697.666150054665 | 11707.6497805827
14 | 23 | 220.141999627513 | 11927.7917802102
15 | 21 | 197.926372783442 | 12125.7181529937
16 | 29 | 440.456596290771 | 12566.1747492844
17 | 28 | 592.939989005405 | 13159.1147382898
18 | 26 | 648.288376333318 | 13807.4031146231
19 | 20 | 509.901951359278 | 14317.3050659824
20 | 25 | 1330.83095428717 | 15648.1360202696
21 | 27 | 74.535658878487 | 15722.6716791481
22 | 24 | 559.016994374947 | 16281.688673523
23 | 16 | 1243.87392358622 | 17525.5625971092
24 | 9 | 4088.0585364911 | 21613.6211336004
25 | 7 | 650.85409697993 | 22264.4752305803
26 | 3 | 891.004385199336 | 23155.4796157796
27 | 4 | 1172.36699411442 | 24327.846609894
28 | 8 | 994.708187806297 | 25322.5547977003
29 | 5 | 1188.01888359478 | 26510.5736812951
30 | 1 | 2266.91173136004 | 28777.4854126552
```
## Resources
- Official [`pgRouting` documentation](https://docs.pgrouting.org/latest/en/index.html)