From c5bd5e541de68ca37bd72216c290edc794b2fab8 Mon Sep 17 00:00:00 2001 From: AasheeshT Date: Tue, 14 Aug 2018 02:58:19 +0530 Subject: [PATCH 1/6] DijkstraCost DijkstraCost now works perfectly --- functions/dijkstraCost.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/dijkstraCost.py b/functions/dijkstraCost.py index 0eb6c43..70e951f 100755 --- a/functions/dijkstraCost.py +++ b/functions/dijkstraCost.py @@ -3,7 +3,7 @@ from qgis.PyQt.QtCore import QSizeF, QPointF from qgis.PyQt.QtGui import QColor, QTextDocument from qgis.core import QgsGeometry, Qgis, QgsTextAnnotation, QgsWkbTypes, QgsAnnotation -from qgis.gui import QgsRubberBand +from qgis.gui import QgsRubberBand, QgsMapCanvasAnnotationItem import psycopg2 from pgRoutingLayer import pgRoutingLayer_utils as Utils from .FunctionBase import FunctionBase From a61884a662d6384006ae615f08858d3dd13f5f9a Mon Sep 17 00:00:00 2001 From: AasheeshT Date: Sun, 7 Apr 2019 04:23:07 +0530 Subject: [PATCH 2/6] Syn with master --- CODE_OF_CONDUCT.md | 72 + CONTRIBUTING.md | 40 + LICENSE | 339 +++ __init__.py | 59 +- builddoc.sh | 4 + connectors/__init__.py | 0 connectors/postgis.py | 743 +----- dbConnection.py | 90 +- docs/CNAME | 1 + docs/functions/pgr_KSP.md | 59 + docs/functions/pgr_aStar.md | 63 + docs/functions/pgr_astarCost.md | 59 + docs/functions/pgr_bdAstar.md | 63 + docs/functions/pgr_bdAstarCost.md | 56 + docs/functions/pgr_bdDijkstra.md | 57 + docs/functions/pgr_bdDijkstraCost.md | 56 + docs/functions/pgr_dijkstra.md | 57 + docs/functions/pgr_dijkstraCost.md | 56 + docs/img/KSP1-1.png | Bin 0 -> 23140 bytes docs/img/KSP1.png | Bin 0 -> 7156 bytes docs/img/astar1.png | Bin 0 -> 11689 bytes docs/img/buttons/database.png | Bin 0 -> 3515 bytes docs/img/buttons/database_.png | Bin 0 -> 7480 bytes docs/img/buttons/execute/clearpreview.png | Bin 0 -> 1742 bytes docs/img/buttons/execute/export.png | Bin 0 -> 1271 bytes docs/img/buttons/execute/exportmergedOFF.png | Bin 0 -> 1821 bytes docs/img/buttons/execute/exportmergedON.png | Bin 0 -> 2111 bytes docs/img/buttons/execute/preview.png | Bin 0 -> 1206 bytes docs/img/buttons/pgr_functions.png | Bin 0 -> 3822 bytes docs/img/buttons/pgr_functions_.png | Bin 0 -> 19683 bytes docs/img/dijkstra1-1.png | Bin 0 -> 24367 bytes docs/img/dijkstra1.png | Bin 0 -> 6199 bytes docs/img/fields/arguments/KSP_fromVid.png | Bin 0 -> 2220 bytes docs/img/fields/arguments/KSP_heapPaths.png | Bin 0 -> 1468 bytes docs/img/fields/arguments/KSP_heapPathsON.png | Bin 0 -> 1470 bytes docs/img/fields/arguments/KSP_k.png | Bin 0 -> 697 bytes docs/img/fields/arguments/KSP_toVid.png | Bin 0 -> 1974 bytes docs/img/fields/arguments/Vid-selected.png | Bin 0 -> 753 bytes docs/img/fields/arguments/Vid-selected2.png | Bin 0 -> 619 bytes .../arguments/astar-dijkstra_fromVid.png | Bin 0 -> 2243 bytes .../arguments/astar-dijkstra_fromVids.png | Bin 0 -> 2545 bytes .../fields/arguments/astar-dijkstra_toVid.png | Bin 0 -> 2146 bytes .../arguments/astar-dijkstra_toVids.png | Bin 0 -> 2420 bytes docs/img/fields/arguments/astar_epsilon.png | Bin 0 -> 1832 bytes docs/img/fields/arguments/astar_epsilon2.png | Bin 0 -> 2139 bytes docs/img/fields/arguments/astar_factor.png | Bin 0 -> 1115 bytes docs/img/fields/arguments/astar_heuristic.png | Bin 0 -> 12082 bytes docs/img/fields/arguments/directedOFF.png | Bin 0 -> 1149 bytes docs/img/fields/arguments/directedON.png | Bin 0 -> 1159 bytes docs/img/fields/columns_astar.png | Bin 0 -> 11442 bytes docs/img/fields/edgesSQL_fields/BBOX.png | Bin 0 -> 1124 bytes docs/img/fields/edgesSQL_fields/BBOXon.png | Bin 0 -> 1121 bytes .../img/fields/edgesSQL_fields/columns/Id.png | Bin 0 -> 765 bytes .../fields/edgesSQL_fields/columns/cost.png | Bin 0 -> 1406 bytes .../edgesSQL_fields/columns/reverseCost.png | Bin 0 -> 1883 bytes .../columns/reverseCostOFF.png | Bin 0 -> 2974 bytes .../fields/edgesSQL_fields/columns/source.png | Bin 0 -> 1827 bytes .../fields/edgesSQL_fields/columns/target.png | Bin 0 -> 1864 bytes .../img/fields/edgesSQL_fields/columns/x1.png | Bin 0 -> 812 bytes .../img/fields/edgesSQL_fields/columns/xy.png | Bin 0 -> 2257 bytes .../img/fields/edgesSQL_fields/columns/y1.png | Bin 0 -> 799 bytes .../fields/edgesSQL_fields/edge_schema.png | Bin 0 -> 2239 bytes .../img/fields/edgesSQL_fields/edge_table.png | Bin 0 -> 2537 bytes docs/img/fields/edgesSQL_fields/geometry.png | Bin 0 -> 2468 bytes docs/img/fields/layers.png | Bin 0 -> 8073 bytes docs/img/functions/KSP.png | Bin 0 -> 1570 bytes docs/img/functions/astar.png | Bin 0 -> 1610 bytes docs/img/functions/astarCost.png | Bin 0 -> 2147 bytes docs/img/functions/bdAstar.png | Bin 0 -> 2018 bytes docs/img/functions/bdAstarCost.png | Bin 0 -> 2546 bytes docs/img/functions/bdDijkstra.png | Bin 0 -> 2244 bytes docs/img/functions/bdDijkstraCost.png | Bin 0 -> 2730 bytes docs/img/functions/dijkstra.png | Bin 0 -> 1943 bytes docs/img/functions/dijkstraCost.png | Bin 0 -> 2458 bytes docs/img/functions/f_pgr_KSP.png | Bin 0 -> 3631 bytes docs/img/functions/f_pgr_astar.png | Bin 0 -> 3665 bytes docs/img/functions/f_pgr_astarCost.png | Bin 0 -> 4243 bytes docs/img/functions/f_pgr_bdAstar.png | Bin 0 -> 4104 bytes docs/img/functions/f_pgr_bdAstarCost.png | Bin 0 -> 4622 bytes docs/img/functions/f_pgr_bdDijkstra.png | Bin 0 -> 4313 bytes docs/img/functions/f_pgr_bdDijkstraCost.png | Bin 0 -> 4820 bytes docs/img/functions/f_pgr_dijkstra.png | Bin 0 -> 3996 bytes docs/img/functions/f_pgr_dijkstraCost.png | Bin 0 -> 4555 bytes docs/img/functions/helpButton.png | Bin 0 -> 1063 bytes docs/img/tabs/arguments/arguments_KSP.png | Bin 0 -> 11574 bytes docs/img/tabs/arguments/arguments_astar.png | Bin 0 -> 15468 bytes .../img/tabs/arguments/arguments_dijkstra.png | Bin 0 -> 10669 bytes docs/img/tabs/arguments/plus_button.png | Bin 0 -> 900 bytes docs/img/tabs/edges_SQL/astar_edgesSQL.png | Bin 0 -> 23830 bytes .../tabs/edges_SQL/dijkstra-KSP_edgesSQL.png | Bin 0 -> 20214 bytes docs/img/tabs/execute/ExecuteCost.png | Bin 0 -> 9424 bytes docs/img/tabs/execute/execute.png | Bin 0 -> 9601 bytes docs/index.md | 51 + docs/intro/buttons.md | 41 + docs/intro/layer_naming_convention.md | 15 + functions/AstarBase.py | 58 + functions/CostBase.py | 80 + functions/DijkstraBase.py | 72 + functions/FunctionBase.py | 357 +-- functions/__init__.py | 0 functions/alphashape.py | 171 -- functions/astar.py | 118 - functions/bdAstar.py | 101 - functions/bdDijkstra.py | 106 - functions/dijkstra.py | 98 - functions/dijkstraCost.py | 159 -- functions/drivingDistance.py | 86 +- functions/ksp.py | 252 -- functions/pgr_KSP.py | 103 + functions/pgr_aStar.py | 41 + functions/pgr_aStarCost.py | 48 + functions/pgr_bdAstar.py | 41 + functions/pgr_bdAstarCost.py | 48 + functions/pgr_bdDijkstra.py | 40 + functions/pgr_bdDijkstraCost.py | 41 + functions/pgr_dijkstra.py | 40 + functions/pgr_dijkstraCost.py | 41 + functions/trsp_edge.py | 229 -- functions/trsp_vertex.py | 93 - functions/trsp_via_edges.py | 279 --- functions/trsp_via_vertices.py | 125 - functions/tsp_euclid.py | 177 -- help/Makefile | 130 ++ help/make.bat | 155 ++ help/source/conf.py | 216 ++ help/source/index.rst | 20 + icons/about.png | Bin 0 -> 2262 bytes icons/pgr_fn.svg | 84 + metadata.txt | 36 +- mkdocs.yml | 18 + pb_tool.cfg | 42 + pgRoutingLayer.py | 965 ++++---- pgRoutingLayer_utils.py | 154 +- readme.md | 39 +- requirements.txt | 2 + resources.qrc | 6 + tests/Test_FunctionBase.py | 62 +- tests/Test_utils.py | 72 +- tests/qgis_models.py | 48 +- tests/test_init.py | 29 +- ui_pgRoutingLayer.ui | 2049 ++++++++++------- utilities/pgr_queries.py | 119 + 142 files changed, 4846 insertions(+), 4385 deletions(-) create mode 100755 CODE_OF_CONDUCT.md create mode 100755 CONTRIBUTING.md create mode 100755 LICENSE create mode 100755 builddoc.sh delete mode 100755 connectors/__init__.py create mode 100755 docs/CNAME create mode 100755 docs/functions/pgr_KSP.md create mode 100755 docs/functions/pgr_aStar.md create mode 100755 docs/functions/pgr_astarCost.md create mode 100755 docs/functions/pgr_bdAstar.md create mode 100755 docs/functions/pgr_bdAstarCost.md create mode 100755 docs/functions/pgr_bdDijkstra.md create mode 100755 docs/functions/pgr_bdDijkstraCost.md create mode 100755 docs/functions/pgr_dijkstra.md create mode 100755 docs/functions/pgr_dijkstraCost.md create mode 100755 docs/img/KSP1-1.png create mode 100755 docs/img/KSP1.png create mode 100755 docs/img/astar1.png create mode 100755 docs/img/buttons/database.png create mode 100755 docs/img/buttons/database_.png create mode 100755 docs/img/buttons/execute/clearpreview.png create mode 100755 docs/img/buttons/execute/export.png create mode 100755 docs/img/buttons/execute/exportmergedOFF.png create mode 100755 docs/img/buttons/execute/exportmergedON.png create mode 100755 docs/img/buttons/execute/preview.png create mode 100755 docs/img/buttons/pgr_functions.png create mode 100755 docs/img/buttons/pgr_functions_.png create mode 100755 docs/img/dijkstra1-1.png create mode 100755 docs/img/dijkstra1.png create mode 100755 docs/img/fields/arguments/KSP_fromVid.png create mode 100755 docs/img/fields/arguments/KSP_heapPaths.png create mode 100755 docs/img/fields/arguments/KSP_heapPathsON.png create mode 100755 docs/img/fields/arguments/KSP_k.png create mode 100755 docs/img/fields/arguments/KSP_toVid.png create mode 100755 docs/img/fields/arguments/Vid-selected.png create mode 100755 docs/img/fields/arguments/Vid-selected2.png create mode 100755 docs/img/fields/arguments/astar-dijkstra_fromVid.png create mode 100755 docs/img/fields/arguments/astar-dijkstra_fromVids.png create mode 100755 docs/img/fields/arguments/astar-dijkstra_toVid.png create mode 100755 docs/img/fields/arguments/astar-dijkstra_toVids.png create mode 100755 docs/img/fields/arguments/astar_epsilon.png create mode 100755 docs/img/fields/arguments/astar_epsilon2.png create mode 100755 docs/img/fields/arguments/astar_factor.png create mode 100755 docs/img/fields/arguments/astar_heuristic.png create mode 100755 docs/img/fields/arguments/directedOFF.png create mode 100755 docs/img/fields/arguments/directedON.png create mode 100755 docs/img/fields/columns_astar.png create mode 100755 docs/img/fields/edgesSQL_fields/BBOX.png create mode 100755 docs/img/fields/edgesSQL_fields/BBOXon.png create mode 100755 docs/img/fields/edgesSQL_fields/columns/Id.png create mode 100755 docs/img/fields/edgesSQL_fields/columns/cost.png create mode 100755 docs/img/fields/edgesSQL_fields/columns/reverseCost.png create mode 100755 docs/img/fields/edgesSQL_fields/columns/reverseCostOFF.png create mode 100755 docs/img/fields/edgesSQL_fields/columns/source.png create mode 100755 docs/img/fields/edgesSQL_fields/columns/target.png create mode 100755 docs/img/fields/edgesSQL_fields/columns/x1.png create mode 100755 docs/img/fields/edgesSQL_fields/columns/xy.png create mode 100755 docs/img/fields/edgesSQL_fields/columns/y1.png create mode 100755 docs/img/fields/edgesSQL_fields/edge_schema.png create mode 100755 docs/img/fields/edgesSQL_fields/edge_table.png create mode 100755 docs/img/fields/edgesSQL_fields/geometry.png create mode 100755 docs/img/fields/layers.png create mode 100755 docs/img/functions/KSP.png create mode 100755 docs/img/functions/astar.png create mode 100755 docs/img/functions/astarCost.png create mode 100755 docs/img/functions/bdAstar.png create mode 100755 docs/img/functions/bdAstarCost.png create mode 100755 docs/img/functions/bdDijkstra.png create mode 100755 docs/img/functions/bdDijkstraCost.png create mode 100755 docs/img/functions/dijkstra.png create mode 100755 docs/img/functions/dijkstraCost.png create mode 100755 docs/img/functions/f_pgr_KSP.png create mode 100755 docs/img/functions/f_pgr_astar.png create mode 100755 docs/img/functions/f_pgr_astarCost.png create mode 100755 docs/img/functions/f_pgr_bdAstar.png create mode 100755 docs/img/functions/f_pgr_bdAstarCost.png create mode 100755 docs/img/functions/f_pgr_bdDijkstra.png create mode 100755 docs/img/functions/f_pgr_bdDijkstraCost.png create mode 100755 docs/img/functions/f_pgr_dijkstra.png create mode 100755 docs/img/functions/f_pgr_dijkstraCost.png create mode 100755 docs/img/functions/helpButton.png create mode 100755 docs/img/tabs/arguments/arguments_KSP.png create mode 100755 docs/img/tabs/arguments/arguments_astar.png create mode 100755 docs/img/tabs/arguments/arguments_dijkstra.png create mode 100755 docs/img/tabs/arguments/plus_button.png create mode 100755 docs/img/tabs/edges_SQL/astar_edgesSQL.png create mode 100755 docs/img/tabs/edges_SQL/dijkstra-KSP_edgesSQL.png create mode 100755 docs/img/tabs/execute/ExecuteCost.png create mode 100755 docs/img/tabs/execute/execute.png create mode 100755 docs/index.md create mode 100755 docs/intro/buttons.md create mode 100755 docs/intro/layer_naming_convention.md create mode 100755 functions/AstarBase.py create mode 100755 functions/CostBase.py create mode 100755 functions/DijkstraBase.py delete mode 100755 functions/__init__.py delete mode 100755 functions/alphashape.py delete mode 100755 functions/astar.py delete mode 100755 functions/bdAstar.py delete mode 100755 functions/bdDijkstra.py delete mode 100755 functions/dijkstra.py delete mode 100755 functions/dijkstraCost.py delete mode 100755 functions/ksp.py create mode 100755 functions/pgr_KSP.py create mode 100755 functions/pgr_aStar.py create mode 100755 functions/pgr_aStarCost.py create mode 100755 functions/pgr_bdAstar.py create mode 100755 functions/pgr_bdAstarCost.py create mode 100755 functions/pgr_bdDijkstra.py create mode 100755 functions/pgr_bdDijkstraCost.py create mode 100755 functions/pgr_dijkstra.py create mode 100755 functions/pgr_dijkstraCost.py delete mode 100755 functions/trsp_edge.py delete mode 100755 functions/trsp_vertex.py delete mode 100755 functions/trsp_via_edges.py delete mode 100755 functions/trsp_via_vertices.py delete mode 100755 functions/tsp_euclid.py create mode 100755 help/Makefile create mode 100755 help/make.bat create mode 100755 help/source/conf.py create mode 100755 help/source/index.rst create mode 100755 icons/about.png create mode 100755 icons/pgr_fn.svg create mode 100755 mkdocs.yml create mode 100755 pb_tool.cfg create mode 100755 requirements.txt create mode 100755 resources.qrc create mode 100755 utilities/pgr_queries.py diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100755 index 0000000..d9a81a0 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,72 @@ +Contributors to pgRouting are expected to act respectfully toward others in accordance with the http://www.osgeo.org/code_of_conduct. + +Full transcription: + + +# OSGeo Code of Conduct + +Version: 1.0 + +Date: May 2015 + +## Introduction + +This code of conduct governs how we behave in any OSGeo forum or event and whenever we will be judged by our actions. We expect it to be honored by everyone who participates in the OSGeo community formally or informally, or claims any affiliation with the OSGeo Foundation. + +It applies to in-person events (such as conferences and related social events), IRC, public and private mailing lists, the issue tracker, the wiki, blogs, Twitter, and any other forums which the community uses for communication and interactions. + +This code is not exhaustive or complete. It serves to distill our common understanding of a collaborative, shared environment and goals. We expect it to be followed in spirit as much as in the letter, so that it can enrich all of us and the technical communities in which we participate. + +## Diversity Statement + +OSGeo welcomes and encourages participation by everyone. We are committed to being a community that everyone feels good about joining, and we will always work to treat everyone well. No matter how you identify yourself or how others perceive you: we welcome you. +Specific Guidelines + +We strive to: + +- Be open. + We invite anyone to participate in our community. We preferably use public methods of communication for project-related messages, unless discussing something sensitive. This applies to messages for help or project-related support, too; not only is a public support request much more likely to result in an answer to a question, it also makes sure that any inadvertent mistakes made by people answering will be more easily detected and corrected. + +- Be empathetic, welcoming, friendly, and patient. + We work together to resolve conflict, assume good intentions, and do our best to act in an empathetic fashion. We may all experience some frustration from time to time, but we do not allow frustration to turn into a personal attack. A community where people feel uncomfortable or threatened is not a productive one. Note that we have a multi-cultural, multi-lingual community and some of us are non-native speakers. We should be respectful when dealing with other community members as well as with people outside our community. + +- Be collaborative. + Our work will be used by other people, and in turn we will depend on the work of others. When we make something for the benefit of OSGeo, we are willing to explain to others how it works, so that they can build on the work to make it even better. Any decision we make will affect users and colleagues, and we take those consequences seriously when making decisions. + +- Be inquisitive. + Nobody knows everything! Asking questions early avoids many problems later, so questions are encouraged, though they may be directed to the appropriate forum. Those who are asked should be responsive and helpful, within the context of our shared goal of improving OSGeo. + +- Be careful in the words that we choose. + Whether we are participating as professionals or volunteers, we value professionalism in all interactions, and take responsibility for our own speech. Be kind to others. Do not insult or put down other participants. + +- Be concise + Keep in mind that what you write once will be read by hundreds of persons. Writing a short email means people can understand the conversation as efficiently as possible. Short emails should always strive to be empathetic, welcoming, friendly and patient. When a long explanation is necessary, consider adding a summary. + + Try to bring new ideas to a conversation so that each mail adds something unique to the thread, keeping in mind that the rest of the thread still contains the other messages with arguments that have already been made. + + Try to stay on topic, especially in discussions that are already fairly large. + +- Step down considerately. + Members of every project come and go. When somebody leaves or disengages from the project they should tell people they are leaving and take the proper steps to ensure that others can pick up where they left off. In doing so, they should remain respectful of those who continue to participate in the project and should not misrepresent the project's goals or achievements. Likewise, community members should respect any individual's choice to leave the project. + +## Anti-Harassment + +Harassment and other exclusionary behaviour are not acceptable. This includes, but is not limited to: + +- Personal insults or discriminatory jokes and language, especially those using racist or sexist terms. +- Offensive comments, excessive or unnecessary profanity. +- Intimidation, violent threats or demands. +- Sustained disruption of sessions or events. +- Stalking, harassing photography or recording. +- Unwelcome physical contact or sexual attention. +- Repeated harassment of others. In general, if someone asks you to stop, then stop. +- Posting (or threatening to post) other people's personally identifying information ("doxing"). +- Sharing private content, such as emails sent privately or non-publicly, or unlogged forums such as IRC channel history. +- Advocating for, or encouraging, any of the above behaviour. + +## Reporting Guidelines + +If you believe someone is breaking this code of conduct, you may reply to them, and point to this code of conduct. Such messages may be in public or in private, whatever is most appropriate. Assume good faith; it is more likely that participants are unaware of their bad behaviour than that they intentionally try to degrade the quality of the discussion. Should there be difficulties in dealing with the situation, you may report your concerns to event staff, a forum leader or the OSGeo Board. Serious or persistent offenders may be expelled from the event or forum by event organizers or forum leaders. + + + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100755 index 0000000..d773695 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,40 @@ +# How to contribute + +We are really glad you are reading this, because we need volunteer developers to help this project. + +If you have not already, come find us in [![Join the chat at https://gitter.im/pgRouting/pgrouting](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/pgRouting/pgrouting?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) or contact us via [mailing list](http://lists.osgeo.org/mailman/listinfo/pgrouting-dev). We want you working on things you're excited about. Drop a message and if some one can assist you, will contact you back ASAP. + +Here are some important resources: + + * [pgRouting Documentation](http://docs.pgrouting.org/) The plugin is based on pgRouting + * [Wish list on the wiki](https://github.com/pgRouting/pgrouting/wiki/GSoC-Ideas) is the foot view of what we think the community needs and can be done by GSoC students. + * [Additional wish lst](https://github.com/pgRouting/pgRoutingLayer/issues?q=is%3Aopen+is%3Aissue+label%3A%22Functionality+Request%22). + * Participate on the [discussions](https://github.com/pgRouting/pgRoutingLayer/issues?q=is%3Aopen+is%3Aissue+label%3ADiscussion). + * Participate fixing [Documentation](https://github.com/pgRouting/pgRoutingLayer/issues?q=is%3Aopen+is%3Aissue+label%3ADocumentation). + * Find a bug? [Let us know](https://github.com/pgRouting/pgRoutingLayer/issues). + +## Contribution agreement + +Any kind of contribution will automatically fall to the following Licences: + +- Code contribution: GNU GENERAL PUBLIC LICENSE Version 2, + - Directly by making a pul explicit pull request. + - Indirectly by posting code on issues/wiki/gitter/mailng lists +- Documentation contribution: + - Creative Commons Attribution-Share Alike 3.0 + +## Submitting changes + + +Write a clear log message for your commits. One-line messages are fine for small changes, but bigger changes should have more information. +Fill the commit message template. + +## Coding conventions + +This is open source software. Consider the people who will read your code, and make it look nice for them. + + * We indent using four spaces (soft tabs) + +Thanks, +pgRouting team + diff --git a/LICENSE b/LICENSE new file mode 100755 index 0000000..d159169 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/__init__.py b/__init__.py index bf7b898..cdf2e21 100755 --- a/__init__.py +++ b/__init__.py @@ -1,37 +1,30 @@ -""" -/*************************************************************************** - pgRouting Layer - a QGIS plugin +# -*- coding: utf-8 -*- +# /*PGR-GNU***************************************************************** +# File: __init__.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - AasheeshT +# - cayetanobv +# - cvvergara +# - anitagraser +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ - based on "Fast SQL Layer" plugin Copyright 2011 Pablo Torres Carreira - ------------------- - begin : 2011-11-25 - copyright : (c) 2011 by Anita Graser - email : anita.graser.at@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - This script initializes the plugin, making it known to QGIS. -""" - - -def name(): - return "pgRouting Layer" -def description(): - return "Dockable widget that adds pgRouting layers" -def version(): - return "Version 0.1" -def icon(): - return "icon.png" -def qgisMinimumVersion(): - return "1.7" def classFactory(iface): from pgRoutingLayer.pgRoutingLayer import PgRoutingLayer return PgRoutingLayer(iface) diff --git a/builddoc.sh b/builddoc.sh new file mode 100755 index 0000000..e0aeefb --- /dev/null +++ b/builddoc.sh @@ -0,0 +1,4 @@ +#!/bin/bash +rm -fR site +mkdocs gh-deploy --clean +#rm -fR site diff --git a/connectors/__init__.py b/connectors/__init__.py deleted file mode 100755 index e69de29..0000000 diff --git a/connectors/postgis.py b/connectors/postgis.py index 47c7313..d6867ab 100755 --- a/connectors/postgis.py +++ b/connectors/postgis.py @@ -1,38 +1,45 @@ # -*- coding: utf-8 -*- -""" -RT Sql Layer -Copyright 2010 Giuseppe Sucameli +# /*PGR-GNU***************************************************************** +# File: postgis.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - cayetanobv +# - AasheeshT +# - jef-n +# - sanak +# - cvvergara +# - anitagraser +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ -based on PostGIS Manager -Copyright 2008 Martin Dobias - -Licensed under the terms of GNU GPL v2 (or any later) -http://www.gnu.org/copyleft/gpl.html - - -Good resource for metadata extraction: -http://www.alberton.info/postgresql_meta_info.html -System information functions: -http://www.postgresql.org/docs/8.0/static/functions-info.html -""" from __future__ import print_function -from builtins import str -from builtins import map from qgis.core import QgsDataSourceUri from qgis.PyQt.QtCore import QSettings from qgis.PyQt.QtGui import QIcon -from qgis.PyQt.QtWidgets import QInputDialog - - +from qgis.PyQt.QtWidgets import QInputDialog, QLineEdit +from psycopg2 import sql import psycopg2 -import psycopg2.extensions # for isolation levels +import psycopg2.extensions # for isolation levels from .. import dbConnection as DbConn from .. import pgRoutingLayer_utils as Utils -import re - # use unicode! psycopg2.extensions.register_type(psycopg2.extensions.UNICODE) @@ -78,7 +85,7 @@ def __init__(self, row): class DbError(DbConn.DbError): def __init__(self, error, query=None): msg = str(error.args[0]) - if query == None: + if query is None: if hasattr(error, "cursor") and hasattr(error.cursor, "query"): query = str(error.cursor.query) else: @@ -116,10 +123,10 @@ def icon(self): @classmethod def connect(self, selected, parent=None): settings = QSettings() - settings.beginGroup( u"/%s/connections/%s" % (self.getSettingsKey(), selected) ) + settings.beginGroup(u"/%s/connections/%s" % (self.getSettingsKey(), selected)) - if not settings.contains( "database" ): # non-existent entry? - raise DbError( 'there is no defined database connection "%s".' % selected ) + if not settings.contains("database"): # non-existent entry? + raise DbError('there is no defined database connection "%s".' % selected) get_value_str = lambda x: str(settings.value(x) if Utils.isSIPv2() else settings.value(x).toString()) service, host, port, database, username, password = list(map(get_value_str, ["service", "host", "port", "database", "username", "password"])) @@ -127,7 +134,7 @@ def connect(self, selected, parent=None): # qgis1.5 use 'savePassword' instead of 'save' setting isSave = settings.value("save") if Utils.isSIPv2() else settings.value("save").toBool() isSavePassword = settings.value("savePassword") if Utils.isSIPv2() else settings.value("savePassword").toBool() - if not ( isSave or isSavePassword ): + if not (isSave or isSavePassword): (password, ok) = QInputDialog.getText(parent, "Enter password", 'Enter password for connection "%s":' % selected, QLineEdit.Password) if not ok: return @@ -141,7 +148,6 @@ def connect(self, selected, parent=None): return Connection(uri) - def __init__(self, uri): DbConn.Connection.__init__(self, uri) @@ -153,12 +159,12 @@ def __init__(self, uri): self.passwd = uri.password() try: - self.con = psycopg2.connect(self.con_info()) + self.con = psycopg2.connect(self.connection_info(), connect_timeout=5) except psycopg2.OperationalError as e: raise DbError(e) if not self.dbname: - self.dbname = self.get_dbname() + self.dbname = self.current_database() self.has_spatial = self.check_spatial() @@ -167,30 +173,36 @@ def __init__(self, uri): # a counter to ensure that the cursor will be unique self.last_cursor_id = 0 - def con_info(self): + def connection_info(self): + """ + connection information in form of a string + """ con_str = '' - if self.service: con_str += "service='%s' " % self.service - if self.host: con_str += "host='%s' " % self.host - if self.port: con_str += "port=%s " % self.port - if self.dbname: con_str += "dbname='%s' " % self.dbname - if self.user: con_str += "user='%s' " % self.user - if self.passwd: con_str += "password='%s' " % self.passwd + if self.service: con_str += "service='%s' " % self.service + if self.host: con_str += "host='%s' " % self.host + if self.port: con_str += "port=%s " % self.port + if self.dbname: con_str += "dbname='%s' " % self.dbname + if self.user: con_str += "user='%s' " % self.user + if self.passwd: con_str += "password='%s' " % self.passwd return con_str - def get_dbname(self): - c = self.con.cursor() - self._exec_sql(c, "SELECT current_database()") + def current_database(self): + """ + current_database() + """ + c = self._exec_sql(sql.SQL("SELECT current_database()")) return c.fetchone()[0] - def get_info(self): - c = self.con.cursor() - self._exec_sql(c, "SELECT version()") + def version(self): + """ + version() + """ + c = self._exec_sql(sql.SQL("SELECT version())")) return c.fetchone()[0] def check_spatial(self): """ check whether postgis_version is present in catalog """ - c = self.con.cursor() - self._exec_sql(c, "SELECT COUNT(*) FROM pg_proc WHERE proname = 'postgis_version'") + c = self._exec_sql(sql.SQL("SELECT COUNT(*) FROM pg_proc WHERE proname = 'postgis_version'")) return (c.fetchone()[0] > 0) def get_spatial_info(self): @@ -202,14 +214,16 @@ def get_spatial_info(self): - proj version - whether uses stats """ - c = self.con.cursor() - self._exec_sql(c, "SELECT postgis_lib_version(), postgis_scripts_installed(), postgis_scripts_released(), postgis_geos_version(), postgis_proj_version(), postgis_uses_stats()") + c = self._exec_sql(sql.SQL(""" + SELECT postgis_lib_version(), postgis_scripts_installed(), postgis_scripts_released(), + postgis_geos_version(), postgis_proj_version(), postgis_uses_stats()""")) return c.fetchone() def check_geometry_columns_table(self): + c = self._exec_sql(sql.SQL(""" + SELECT relname FROM pg_class + WHERE relname = 'geometry_columns' AND pg_class.relkind IN ('v', 'r')""")) - c = self.con.cursor() - self._exec_sql(c, "SELECT relname FROM pg_class WHERE relname = 'geometry_columns' AND pg_class.relkind IN ('v', 'r')") self.has_geometry_columns = (len(c.fetchall()) != 0) if not self.has_geometry_columns: @@ -219,89 +233,27 @@ def check_geometry_columns_table(self): # find out whether has privileges to access geometry_columns table self.has_geometry_columns_access = self.get_table_privileges('geometry_columns')[0] - def list_schemas(self): """ get list of schemas in tuples: (oid, name, owner, perms) + Not including schemas starting with pg_ or the information_schema """ - c = self.con.cursor() - sql = "SELECT oid, nspname, pg_get_userbyid(nspowner), nspacl FROM pg_namespace WHERE nspname !~ '^pg_' AND nspname != 'information_schema'" - self._exec_sql(c, sql) + c = self._exec_sql(sql.SQL(""" + SELECT oid, nspname, pg_get_userbyid(nspowner), nspacl + FROM pg_namespace + WHERE nspname !~ '^pg_' AND nspname != 'information_schema'""")) - schema_cmp = lambda x,y: -1 if x[1] < y[1] else 1 + schema_cmp = lambda x, y: -1 if x[1] < y[1] else 1 return sorted(c.fetchall(), cmp=schema_cmp) - def list_geotables(self, schema=None): + def get_table_fields(self, table, schema=None): """ - get list of tables with schemas, whether user has privileges, whether table has geometry column(s) etc. - - geometry_columns: - - f_table_schema - - f_table_name - - f_geometry_column - - coord_dimension - - srid - - type + return list of columns in table """ - c = self.con.cursor() - - if schema: - schema_where = " AND nspname = '%s' " % self._quote_str(schema) - else: - schema_where = " AND (nspname != 'information_schema' AND nspname !~ 'pg_') " - - # LEFT OUTER JOIN: like LEFT JOIN but if there are more matches, for join, all are used (not only one) - - # first find out whether postgis is enabled - if not self.has_spatial: - # get all tables and views - sql = """SELECT pg_class.relname, pg_namespace.nspname, pg_class.relkind, pg_get_userbyid(relowner), reltuples, relpages, NULL, NULL, NULL, NULL - FROM pg_class - JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace - WHERE pg_class.relkind IN ('v', 'r')""" + schema_where + "ORDER BY nspname, relname" - else: - # discovery of all tables and whether they contain a geometry column - sql = """SELECT pg_class.relname, pg_namespace.nspname, pg_class.relkind, pg_get_userbyid(relowner), reltuples, relpages, pg_attribute.attname, pg_attribute.atttypid::regtype, NULL, NULL - FROM pg_class - JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace - LEFT OUTER JOIN pg_attribute ON pg_attribute.attrelid = pg_class.oid AND - ( pg_attribute.atttypid = 'geometry'::regtype - OR pg_attribute.atttypid IN (SELECT oid FROM pg_type WHERE typbasetype='geometry'::regtype ) ) - WHERE pg_class.relkind IN ('v', 'r')""" + schema_where + "ORDER BY nspname, relname, attname" - - self._exec_sql(c, sql) - items = c.fetchall() - - # get geometry info from geometry_columns if exists - if self.has_spatial and self.has_geometry_columns and self.has_geometry_columns_access: - sql = """SELECT relname, nspname, relkind, pg_get_userbyid(relowner), reltuples, relpages, - geometry_columns.f_geometry_column, geometry_columns.type, geometry_columns.coord_dimension, geometry_columns.srid - FROM pg_class - JOIN pg_namespace ON relnamespace=pg_namespace.oid - LEFT OUTER JOIN geometry_columns ON relname=f_table_name AND nspname=f_table_schema - WHERE (relkind = 'r' or relkind='v') """ + schema_where + "ORDER BY nspname, relname, f_geometry_column" - self._exec_sql(c, sql) - - # merge geometry info to "items" - for i, geo_item in enumerate(c.fetchall()): - if geo_item[7]: - items[i] = geo_item - - return items - - - def get_table_rows(self, table, schema=None): - c = self.con.cursor() - self._exec_sql(c, "SELECT COUNT(*) FROM %s" % self._table_name(schema, table)) - return c.fetchone()[0] - - - def get_table_fields(self, table, schema=None): - """ return list of columns in table """ - c = self.con.cursor() - schema_where = " AND nspname='%s' " % self._quote_str(schema) if schema is not None else "" - sql = """SELECT a.attnum AS ordinal_position, + schema_where = sql.SQL(" AND nspname={} ").format(sql.Literal) if schema is not None else "" + c = self._exec_sql(sql.SQL(""" + SELECT a.attnum AS ordinal_position, a.attname AS column_name, t.typname AS data_type, a.attlen AS char_max_len, @@ -315,553 +267,30 @@ def get_table_fields(self, table, schema=None): JOIN pg_namespace nsp ON c.relnamespace = nsp.oid LEFT JOIN pg_attrdef adef ON adef.adrelid = a.attrelid AND adef.adnum = a.attnum WHERE - c.relname = '%s' %s AND + c.relname = {0} {1} AND a.attnum > 0 - ORDER BY a.attnum""" % (self._quote_str(table), schema_where) + ORDER BY a.attnum""").format(sql.Literal(table), schema_where)) - self._exec_sql(c, sql) attrs = [] for row in c.fetchall(): attrs.append(TableAttribute(row)) return attrs - - def get_table_indexes(self, table, schema=None): - """ get info about table's indexes. ignore primary key and unique constraint index, they get listed in constaints """ - c = self.con.cursor() - - schema_where = " AND nspname='%s' " % self._quote_str(schema) if schema is not None else "" - sql = """SELECT relname, indkey FROM pg_class, pg_index - WHERE pg_class.oid = pg_index.indexrelid AND pg_class.oid IN ( - SELECT indexrelid FROM pg_index, pg_class - JOIN pg_namespace nsp ON pg_class.relnamespace = nsp.oid - WHERE pg_class.relname='%s' %s AND pg_class.oid=pg_index.indrelid - AND indisprimary != 't' )""" % (self._quote_str(table), schema_where) # AND indisunique != 't' - self._exec_sql(c, sql) - indexes = [] - for row in c.fetchall(): - indexes.append(TableIndex(row)) - return indexes - - - def get_table_unique_indexes(self, table, schema=None): - """ get all the unique indexes """ - schema_where = " AND nspname='%s' " % self._quote_str(schema) if schema is not None else "" - sql = """SELECT relname, indkey - FROM pg_index JOIN pg_class ON pg_index.indrelid=pg_class.oid - JOIN pg_namespace nsp ON pg_class.relnamespace = nsp.oid - WHERE pg_class.relname='%s' %s - AND indisprimary != 't' AND indisunique = 't'""" % (self._quote_str(table), schema_where) - c = self.con.cursor() - self._exec_sql(c, sql) - uniqueIndexes = [] - for row in c.fetchall(): - uniqueIndexes.append(TableIndex(row)) - return uniqueIndexes - - - def get_table_constraints(self, table, schema=None): - c = self.con.cursor() - - schema_where = " AND nspname='%s' " % self._quote_str(schema) if schema is not None else "" - sql = """SELECT c.conname, c.contype, c.condeferrable, c.condeferred, array_to_string(c.conkey, ' '), c.consrc, - t2.relname, c.confupdtype, c.confdeltype, c.confmatchtype, array_to_string(c.confkey, ' ') FROM pg_constraint c - LEFT JOIN pg_class t ON c.conrelid = t.oid - LEFT JOIN pg_class t2 ON c.confrelid = t2.oid - JOIN pg_namespace nsp ON t.relnamespace = nsp.oid - WHERE t.relname = '%s' %s """ % (self._quote_str(table), schema_where) - - self._exec_sql(c, sql) - - constrs = [] - for row in c.fetchall(): - constrs.append(TableConstraint(row)) - return constrs - - - def get_table_triggers(self, table, schema=None): - c = self.con.cursor() - - schema_where = " AND nspname='%s' " % self._quote_str(schema) if schema is not None else "" - sql = """ SELECT tgname, proname, tgtype, tgenabled FROM pg_trigger trig - LEFT JOIN pg_class t ON trig.tgrelid = t.oid - LEFT JOIN pg_proc p ON trig.tgfoid = p.oid - JOIN pg_namespace nsp ON t.relnamespace = nsp.oid - WHERE t.relname ='%s' %s """ % (self._quote_str(table), schema_where) - - self._exec_sql(c, sql) - - triggers = [] - for row in c.fetchall(): - triggers.append(TableTrigger(row)) - return triggers - - - def get_table_rules(self, table, schema=None): - c = self.con.cursor() - - schema_where = " AND schemaname='%s' " % self._quote_str(schema) if schema is not None else "" - sql = """ SELECT rulename, definition FROM pg_rules - WHERE tablename='%s' %s """ % (self._quote_str(table), schema_where) - - self._exec_sql(c, sql) - - rules = [] - for row in c.fetchall(): - rules.append(TableRule(row)) - - return rules - - def get_table_estimated_extent(self, geom, table, schema=None): - """ find out estimated extent (from the statistics) """ - c = self.con.cursor() - - extent = "estimated_extent('%s','%s','%s')" % (self._quote_str(schema), self._quote_str(table), self._quote_str(geom)) - sql = """ SELECT xmin(%(ext)s), ymin(%(ext)s), xmax(%(ext)s), ymax(%(ext)s) """ % { 'ext' : extent } - self._exec_sql(c, sql) - - row = c.fetchone() - return row - - def get_view_definition(self, view, schema=None): - """ returns definition of the view """ - schema_where = " AND nspname='%s' " % self._quote_str(schema) if schema is not None else "" - sql = """SELECT pg_get_viewdef(c.oid) FROM pg_class c - JOIN pg_namespace nsp ON c.relnamespace = nsp.oid - WHERE relname='%s' %s AND relkind='v'""" % (self._quote_str(view), schema_where) - c = self.con.cursor() - self._exec_sql(c, sql) - return c.fetchone()[0] - - """ - def list_tables(self): - c = self.con.cursor() - c.execute("SELECT relname FROM pg_class WHERE relname !~ '^(pg_|sql_)' AND relkind = 'r'") - return c.fetchall() - """ - - def add_geometry_column(self, table, geom_type, schema=None, geom_column='the_geom', srid=-1, dim=2): - - # use schema if explicitly specified - if schema: - schema_part = "'%s', " % self._quote_str(schema) - else: - schema_part = "" - sql = "SELECT AddGeometryColumn(%s'%s', '%s', %d, '%s', %d)" % (schema_part, self._quote_str(table), self._quote_str(geom_column), srid, self._quote_str(geom_type), dim) - self._exec_sql_and_commit(sql) - - def delete_geometry_column(self, table, geom_column, schema=None): - """ use postgis function to delete geometry column correctly """ - if schema: - schema_part = "'%s', " % self._quote_str(schema) - else: - schema_part = "" - sql = "SELECT DropGeometryColumn(%s'%s', '%s')" % (schema_part, self._quote_str(table), self._quote_str(geom_column)) - self._exec_sql_and_commit(sql) - - def delete_geometry_table(self, table, schema=None): - """ delete table with one or more geometries using postgis function """ - if schema: - schema_part = "'%s', " % self._quote_str(schema) - else: - schema_part = "" - sql = "SELECT DropGeometryTable(%s'%s')" % (schema_part, self._quote_str(table)) - self._exec_sql_and_commit(sql) - - def create_table(self, table, fields, pkey=None, schema=None): - """ create ordinary table - 'fields' is array containing instances of TableField - 'pkey' contains name of column to be used as primary key - """ - - if len(fields) == 0: - return False - - table_name = self._table_name(schema, table) - - sql = "CREATE TABLE %s (%s" % (table_name, fields[0].field_def(self)) - for field in fields[1:]: - sql += ", %s" % field.field_def(self) - if pkey: - sql += ", PRIMARY KEY (%s)" % self._quote(pkey) - sql += ")" - self._exec_sql_and_commit(sql) - return True - - def delete_table(self, table, schema=None): - """ delete table from the database """ - table_name = self._table_name(schema, table) - sql = "DROP TABLE %s" % table_name - self._exec_sql_and_commit(sql) - - def empty_table(self, table, schema=None): - """ delete all rows from table """ - table_name = self._table_name(schema, table) - sql = "TRUNCATE %s" % table_name - self._exec_sql_and_commit(sql) - - def rename_table(self, table, new_table, schema=None): - """ rename a table in database """ - table_name = self._table_name(schema, table) - sql = "ALTER TABLE %s RENAME TO %s" % (table_name, self._quote(new_table)) - self._exec_sql_and_commit(sql) - - # update geometry_columns if postgis is enabled - if self.has_spatial and self.has_geometry_columns and self.has_geometry_columns_access: - sql = "UPDATE geometry_columns SET f_table_name='%s' WHERE f_table_name='%s'" % (self._quote_str(new_table), self._quote_str(table)) - if schema is not None: - sql += " AND f_table_schema='%s'" % self._quote_str(schema) - self._exec_sql_and_commit(sql) - - def create_view(self, name, query, schema=None): - view_name = self._table_name(schema, name) - sql = "CREATE VIEW %s AS %s" % (view_name, query) - self._exec_sql_and_commit(sql) - - def delete_view(self, name, schema=None): - view_name = self._table_name(schema, name) - sql = "DROP VIEW %s" % view_name - self._exec_sql_and_commit(sql) - - def rename_view(self, name, new_name, schema=None): - """ rename view in database """ - self.rename_table(name, new_name, schema) - - def create_schema(self, schema): - """ create a new empty schema in database """ - sql = "CREATE SCHEMA %s" % self._quote(schema) - self._exec_sql_and_commit(sql) - - def delete_schema(self, schema): - """ drop (empty) schema from database """ - sql = "DROP SCHEMA %s" % self._quote(schema) - self._exec_sql_and_commit(sql) - - def rename_schema(self, schema, new_schema): - """ rename a schema in database """ - sql = "ALTER SCHEMA %s RENAME TO %s" % (self._quote(schema), self._quote(new_schema)) - self._exec_sql_and_commit(sql) - - # update geometry_columns if postgis is enabled - if self.has_spatial: - sql = "UPDATE geometry_columns SET f_table_schema='%s' WHERE f_table_schema='%s'" % (self._quote_str(new_schema), self._quote_str(schema)) - self._exec_sql_and_commit(sql) - - def table_add_column(self, table, field, schema=None): - """ add a column to table (passed as TableField instance) """ - table_name = self._table_name(schema, table) - sql = "ALTER TABLE %s ADD %s" % (table_name, field.field_def(self)) - self._exec_sql_and_commit(sql) - - def table_delete_column(self, table, field, schema=None): - """ delete column from a table """ - table_name = self._table_name(schema, table) - sql = "ALTER TABLE %s DROP %s" % (table_name, self._quote(field)) - self._exec_sql_and_commit(sql) - - def table_column_rename(self, table, name, new_name, schema=None): - """ rename column in a table """ - table_name = self._table_name(schema, table) - sql = "ALTER TABLE %s RENAME %s TO %s" % (table_name, self._quote(name), self._quote(new_name)) - self._exec_sql_and_commit(sql) - - # update geometry_columns if postgis is enabled - if self.has_spatial: - sql = "UPDATE geometry_columns SET f_geometry_column='%s' WHERE f_geometry_column='%s' AND f_table_name='%s'" % (self._quote_str(new_name), self._quote_str(name), self._quote_str(table)) - if schema is not None: - sql += " AND f_table_schema='%s'" % self._quote(schema) - self._exec_sql_and_commit(sql) - - def table_column_set_type(self, table, column, data_type, schema=None): - """ change column type """ - table_name = self._table_name(schema, table) - sql = "ALTER TABLE %s ALTER %s TYPE %s" % (table_name, self._quote(column), data_type) - self._exec_sql_and_commit(sql) - - def table_column_set_default(self, table, column, default, schema=None): - """ change column's default value. If default=None drop default value """ - table_name = self._table_name(schema, table) - if default: - sql = "ALTER TABLE %s ALTER %s SET DEFAULT %s" % (table_name, self._quote(column), default) - else: - sql = "ALTER TABLE %s ALTER %s DROP DEFAULT" % (table_name, self._quote(column)) - self._exec_sql_and_commit(sql) - - def table_column_set_null(self, table, column, is_null, schema=None): - """ change whether column can contain null values """ - table_name = self._table_name(schema, table) - sql = "ALTER TABLE %s ALTER %s " % (table_name, self._quote(column)) - if is_null: - sql += "DROP NOT NULL" - else: - sql += "SET NOT NULL" - self._exec_sql_and_commit(sql) - - def table_add_primary_key(self, table, column, schema=None): - """ add a primery key (with one column) to a table """ - table_name = self._table_name(schema, table) - sql = "ALTER TABLE %s ADD PRIMARY KEY (%s)" % (table_name, self._quote(column)) - self._exec_sql_and_commit(sql) - - def table_add_unique_constraint(self, table, column, schema=None): - """ add a unique constraint to a table """ - table_name = self._table_name(schema, table) - sql = "ALTER TABLE %s ADD UNIQUE (%s)" % (table_name, self._quote(column)) - self._exec_sql_and_commit(sql) - - def table_delete_constraint(self, table, constraint, schema=None): - """ delete constraint in a table """ - table_name = self._table_name(schema, table) - sql = "ALTER TABLE %s DROP CONSTRAINT %s" % (table_name, self._quote(constraint)) - self._exec_sql_and_commit(sql) - - def table_move_to_schema(self, table, new_schema, schema=None): - if new_schema == schema: - return - table_name = self._table_name(schema, table) - sql = "ALTER TABLE %s SET SCHEMA %s" % (table_name, self._quote(new_schema)) - self._exec_sql_and_commit(sql) - - # update geometry_columns if postgis is enabled - if self.has_spatial: - sql = "UPDATE geometry_columns SET f_table_schema='%s' WHERE f_table_name='%s'" % (self._quote_str(new_schema), self._quote_str(table)) - if schema is not None: - sql += " AND f_table_schema='%s'" % self._quote_str(schema) - self._exec_sql_and_commit(sql) - - def table_apply_function(self, schema, table, res_column, fct, param): - """ apply a function to a column and save the result in other column """ - table = self._table_name(schema, table) - sql = "UPDATE %s SET %s = %s(%s)" % (table, self._quote(res_column), fct, self._quote(param)) - self._exec_sql_and_commit(sql) - - def table_enable_triggers(self, table, schema, enable=True): - """ enable or disable all triggers on table """ - table = self._table_name(schema, table) - sql = "ALTER TABLE %s %s TRIGGER ALL" % (table, "ENABLE" if enable else "DISABLE") - self._exec_sql_and_commit(sql) - - def table_enable_trigger(self, table, schema, trigger, enable=True): - """ enable or disable one trigger on table """ - table = self._table_name(schema, table) - sql = "ALTER TABLE %s %s TRIGGER %s" % (table, "ENABLE" if enable else "DISABLE", self._quote(trigger)) - self._exec_sql_and_commit(sql) - - def table_delete_trigger(self, table, schema, trigger): - """ delete trigger on table """ - table = self._table_name(schema, table) - sql = "DROP TRIGGER %s ON %s" % (self._quote(trigger), table) - self._exec_sql_and_commit(sql) - - def table_delete_rule(self, table, schema, rule): - """ delete rule on table """ - table = self._table_name(schema, table) - sql = "DROP RULE %s ON %s" % (self._quote(rule), table) - self._exec_sql_and_commit(sql) - - def create_index(self, table, name, column, schema=None): - """ create index on one column using default options """ - table_name = self._table_name(schema, table) - idx_name = self._quote(name) - sql = "CREATE INDEX %s ON %s (%s)" % (idx_name, table_name, self._quote(column)) - self._exec_sql_and_commit(sql) - - def create_spatial_index(self, table, schema=None, geom_column='the_geom'): - table_name = self._table_name(schema, table) - idx_name = self._quote("sidx_"+table) - sql = "CREATE INDEX %s ON %s USING GIST(%s GIST_GEOMETRY_OPS)" % (idx_name, table_name, self._quote(geom_column)) - self._exec_sql_and_commit(sql) - - def delete_index(self, name, schema=None): - index_name = self._table_name(schema, name) - sql = "DROP INDEX %s" % index_name - self._exec_sql_and_commit(sql) - - def get_database_privileges(self): - """ db privileges: (can create schemas, can create temp. tables) """ - sql = "SELECT has_database_privilege('%(d)s', 'CREATE'), has_database_privilege('%(d)s', 'TEMP')" % { 'd' : self._quote_str(self.dbname) } - c = self.con.cursor() - self._exec_sql(c, sql) - return c.fetchone() - - def get_schema_privileges(self, schema): - """ schema privileges: (can create new objects, can access objects in schema) """ - sql = "SELECT has_schema_privilege('%(s)s', 'CREATE'), has_schema_privilege('%(s)s', 'USAGE')" % { 's' : self._quote_str(schema) } - c = self.con.cursor() - self._exec_sql(c, sql) - return c.fetchone() - def get_table_privileges(self, table, schema=None): """ table privileges: (select, insert, update, delete) """ - t = self._table_name(schema, table) - sql = """SELECT has_table_privilege('%(t)s', 'SELECT'), has_table_privilege('%(t)s', 'INSERT'), - has_table_privilege('%(t)s', 'UPDATE'), has_table_privilege('%(t)s', 'DELETE')""" % { 't': self._quote_str(t) } - c = self.con.cursor() - self._exec_sql(c, sql) + s, t = Utils.tableName(schema, table) + c = self._exec_sql(sql.SQL("""SELECT has_table_privilege('{0}{1}','SELECT'), + has_table_privilege('{0}{1}', 'INSERT'), + has_table_privilege('{0}{1}', 'UPDATE'), + has_table_privilege('{0}{1}', 'DELETE')""").format(s, t)) return c.fetchone() - def vacuum_analyze(self, table, schema=None): - """ run vacuum analyze on a table """ - t = self._table_name(schema, table) - # vacuum analyze must be run outside transaction block - we have to change isolation level - self.con.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT) - c = self.con.cursor() - self._exec_sql(c, "VACUUM ANALYZE %s" % t) - self.con.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_READ_COMMITTED) - - def sr_info_for_srid(self, srid): - if not self.has_spatial: - return "Unknown" - - try: - c = self.con.cursor() - self._exec_sql(c, "SELECT srtext FROM spatial_ref_sys WHERE srid = '%d'" % srid) - sr = c.fetchone() - if sr is None: - return "Unknown" - srtext = sr[0] - # try to extract just SR name (should be qouted in double quotes) - x = re.search('"([^"]+)"', srtext) - if x is not None: - srtext = x.group() - return srtext - except DbError as e: - return "Unknown" - - def insert_table_row(self, table, values, schema=None, cursor=None): - """ insert a row with specified values to a table. - if a cursor is specified, it doesn't commit (expecting that there will be more inserts) - otherwise it commits immediately """ - t = self._table_name(schema, table) - sql = "" - for value in values: - # TODO: quote values? - if sql: sql += ", " - sql += value - sql = "INSERT INTO %s VALUES (%s)" % (t, sql) - if cursor: - self._exec_sql(cursor, sql) - else: - self._exec_sql_and_commit(sql) - - - def table_add_function_trigger(self, schema, table, resColumn, fct, geomColumn): - """ add a trigger on insert and update that recalculates the value from geometry column """ - - trig_f_name = "%s_calc_%s" % (table, fct) - trig_name = "calc_%s" % fct - ctx = { 'fname' : trig_f_name, 'tname' : trig_name, - 'res' : resColumn, 'geom' : geomColumn, - 'f' : fct, 'table' : self._table_name(schema, table) } - sql = """ - CREATE OR REPLACE FUNCTION %(fname)s() RETURNS TRIGGER AS - $$ - BEGIN - IF (TG_OP = 'INSERT') THEN - NEW.%(res)s := %(f)s(NEW.%(geom)s); - ELSIF (TG_OP = 'UPDATE') THEN - IF NOT (NEW.%(geom)s ~= OLD.%(geom)s) THEN - NEW.%(res)s := %(f)s(NEW.%(geom)s); - END IF; - END IF; - RETURN NEW; - END; - $$ - LANGUAGE 'plpgsql'; - - CREATE TRIGGER %(tname)s BEFORE INSERT OR UPDATE ON %(table)s FOR EACH ROW - EXECUTE PROCEDURE %(fname)s(); - """ % ctx - - self._exec_sql_and_commit(sql) - - - def get_named_cursor(self, table=None): - """ return an unique named cursor, optionally including a table name """ - self.last_cursor_id += 1 - if table is not None: - table2 = re.sub(r'\W', '_', table.encode('ascii','replace')) # all non-alphanum characters to underscore - cur_name = "cursor_%d_table_%s" % (self.last_cursor_id, table2) - else: - cur_name = "cursor_%d" % self.last_cursor_id - #cur_name = ("\"db_table_"+self.table+"\"").replace(' ', '_') - #cur_name = cur_name.encode('ascii','replace').replace('?', '_') - return self.con.cursor(cur_name) - - def _exec_sql(self, cursor, sql): + def _exec_sql(self, query): try: - cursor.execute(sql) + cursor = self.con.cursor() + cursor.execute(query.as_string(self.con)) + return cursor except psycopg2.Error as e: # do the rollback to avoid a "current transaction aborted, commands ignored" errors self.con.rollback() raise DbError(e) - - def _exec_sql_and_commit(self, sql): - """ tries to execute and commit some action, on error it rolls back the change """ - #try: - c = self.con.cursor() - self._exec_sql(c, sql) - self.con.commit() - #except DbError, e: - # self.con.rollback() - # raise - - def _quote(self, identifier): - identifier = str(identifier) # make sure it's python unicode string - return u'"%s"' % identifier.replace('"', '""') - - def _quote_str(self, txt): - """ make the string safe - replace ' with '' """ - txt = str(txt) # make sure it's python unicode string - return txt.replace("'", "''") - - def _table_name(self, schema, table): - if not schema: - return self._quote(table) - else: - return u"%s.%s" % (self._quote(schema), self._quote(table)) - - -# for debugging / testing -if __name__ == '__main__': - - db = GeoDB(host='localhost',dbname='gis',user='gisak',passwd='g') - - # fix_print_with_import - print(db.list_schemas()) - # fix_print_with_import - print('==========') - - for row in db.list_geotables(): - # fix_print_with_import - print(row) - - # fix_print_with_import - print('==========') - - for row in db.get_table_indexes('trencin'): - # fix_print_with_import - print(row) - - # fix_print_with_import - print('==========') - - for row in db.get_table_constraints('trencin'): - # fix_print_with_import - print(row) - - # fix_print_with_import - print('==========') - - # fix_print_with_import - print(db.get_table_rows('trencin')) - - #for fld in db.get_table_metadata('trencin'): - # print fld - - #try: - # db.create_table('trrrr', [('id','serial'), ('test','text')]) - #except DbError, e: - # print e.message, e.query - -# vim: noet ts=8 : diff --git a/dbConnection.py b/dbConnection.py index 11ad58a..5d74130 100755 --- a/dbConnection.py +++ b/dbConnection.py @@ -1,16 +1,38 @@ # -*- coding: utf-8 -*- +# /*PGR-GNU***************************************************************** +# File: dbConnection.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - AasheeshT +# - cayetanobv +# - sanak +# - cvvergara +# - anitagraser +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ + from __future__ import absolute_import -from builtins import str -from builtins import range -from builtins import object from qgis.core import QgsDataSourceUri from qgis.PyQt.QtCore import QSettings from qgis.PyQt.QtWidgets import QAction -from pgRoutingLayer import pgRoutingLayer_utils as Utils - class ConnectionManager(object): SUPPORTED_CONNECTORS = ['postgis'] @@ -21,13 +43,11 @@ def initConnectionSupport(self): conntypes = ConnectionManager.SUPPORTED_CONNECTORS for c in conntypes: try: - connector = self.getConnection( c ) + self.getConnection(c) except ImportError as e: - module = e.args[0][ len("No module named "): ] - ConnectionManager.SUPPORTED_CONNECTORS.remove( c ) - ConnectionManager.MISSED_CONNECTORS.append( (c, module) ) - - return len(ConnectionManager.SUPPORTED_CONNECTORS) > 0 + module = e.args[0][len("No module named "):] + ConnectionManager.SUPPORTED_CONNECTORS.remove(c) + ConnectionManager.MISSED_CONNECTORS.append((c, module)) @classmethod def getConnection(self, conntype, uri=None): @@ -35,7 +55,7 @@ def getConnection(self, conntype, uri=None): raise NotSupportedConnTypeException(conntype) # import the connector - exec( "from pgRoutingLayer.connectors import %s as connector" % conntype, globals(),globals()) + exec("from pgRoutingLayer.connectors import %s as connector" % conntype, globals(), globals()) return connector.Connection(uri) if uri else connector.Connection @classmethod @@ -44,15 +64,15 @@ def isSupported(self, conntype): @classmethod def getAvailableConnections(self, conntypes=None): - if conntypes == None: + if conntypes is None: conntypes = ConnectionManager.SUPPORTED_CONNECTORS if not hasattr(conntypes, '__iter__'): conntypes = [conntypes] connections = [] for c in conntypes: - connection = self.getConnection( c ) - connections.extend( connection.getAvailableConnections() ) + connection = self.getConnection(c) + connections.extend(connection.getAvailableConnections()) return connections @@ -66,12 +86,12 @@ def __str__(self): class DbError(Exception): def __init__(self, errormsg, query=None): - self.msg = str( errormsg ) - self.query = str( query ) if query else None + self.msg = str(errormsg) + self.query = str(query) if query else None def __str__(self): msg = self.msg.encode('utf-8') - if self.query != None: + if self.query: msg += "\nQuery:\n" + self.query.encode('utf-8') return msg @@ -106,23 +126,21 @@ def getAvailableConnections(self): connections = [] settings = QSettings() - settings.beginGroup( "/%s/connections" % self.getSettingsKey() ) + settings.beginGroup("/%s/connections" % self.getSettingsKey()) keys = settings.childGroups() for name in keys: - connections.append( Connection.ConnectionAction(name, self.getTypeName()) ) + connections.append(Connection.ConnectionAction(name, self.getTypeName())) settings.endGroup() return connections - def getURI(self): # returns a new QgsDataSourceUri instance - return QgsDataSourceUri( self.uri.connectionInfo() ) + return QgsDataSourceUri(self.uri.connectionInfo()) def getAction(self, parent=None): return Connection.ConnectionAction(self.uri.database(), self.getTypeName(), parent) - class ConnectionAction(QAction): def __init__(self, text, conntype, parent=None): self.type = conntype @@ -131,11 +149,11 @@ def __init__(self, text, conntype, parent=None): def connect(self): selected = self.text() - conn = ConnectionManager.getConnection( self.type ).connect( selected, self.parent() ) + conn = ConnectionManager.getConnection(self.type).connect(selected, self.parent()) # set as default in QSettings settings = QSettings() - settings.setValue( "/%s/connections/selected" % conn.getSettingsKey(), selected ) + settings.setValue("/%s/connections/selected" % conn.getSettingsKey(), selected) return conn @@ -143,35 +161,35 @@ def connect(self): class TableAttribute(object): pass + class TableConstraint(object): """ class that represents a constraint of a table (relation) """ TypeCheck, TypeForeignKey, TypePrimaryKey, TypeUnique = list(range(4)) - types = { "c" : TypeCheck, "f" : TypeForeignKey, "p" : TypePrimaryKey, "u" : TypeUnique } + types = {"c": TypeCheck, "f": TypeForeignKey, "p": TypePrimaryKey, "u": TypeUnique} + on_action = {"a": "NO ACTION", "r": "RESTRICT", "c": "CASCADE", "n": "SET NULL", "d": "SET DEFAULT"} + match_types = {"u": "UNSPECIFIED", "f": "FULL", "p": "PARTIAL"} - on_action = { "a" : "NO ACTION", "r" : "RESTRICT", "c" : "CASCADE", "n" : "SET NULL", "d" : "SET DEFAULT" } - match_types = { "u" : "UNSPECIFIED", "f" : "FULL", "p" : "PARTIAL" } - - pass class TableIndex(object): pass + class TableTrigger(object): # Bits within tgtype (pg_trigger.h) - TypeRow = (1 << 0) # row or statement - TypeBefore = (1 << 1) # before or after + TypeRow = (1 << 0) # row or statement + TypeBefore = (1 << 1) # before or after # events: one or more - TypeInsert = (1 << 2) - TypeDelete = (1 << 3) - TypeUpdate = (1 << 4) + TypeInsert = (1 << 2) + TypeDelete = (1 << 3) + TypeUpdate = (1 << 4) TypeTruncate = (1 << 5) - pass class TableRule(object): pass + class TableField(object): def is_null_txt(self): if self.is_null: diff --git a/docs/CNAME b/docs/CNAME new file mode 100755 index 0000000..7dbc892 --- /dev/null +++ b/docs/CNAME @@ -0,0 +1 @@ +qgis.pgrouting.org diff --git a/docs/functions/pgr_KSP.md b/docs/functions/pgr_KSP.md new file mode 100755 index 0000000..155546d --- /dev/null +++ b/docs/functions/pgr_KSP.md @@ -0,0 +1,59 @@ + + + + + +# pgr_KSP +![pgr_KSP](../img/functions/f_pgr_KSP.png) + +|Button|Action| +| ----------- | --------- | +|![Help](../img/functions/helpButton.png)|Opens the web page of the documentation of pgr_KSP| +|![Function](../img/functions/KSP.png)| Choose pgr_KSP on the drop down box| + +## Edges SQL tab +![Edges SQL tab](../img/tabs/edges_SQL/dijkstra-KSP_edgesSQL.png) + +|Field|Action| +| ----------- | --------- | +|![Edge table](../img/fields/edgesSQL_fields/edge_table.png)| Write the table name of the edges| +|![Edge schema](../img/fields/edgesSQL_fields/edge_schema.png)|Write the schema of the edge table| +|![Geometry](../img/fields/edgesSQL_fields/geometry.png)|Write the geometry column name| +|![BBOX](../img/fields/edgesSQL_fields/BBOX.png)|Tick to use the Bounding Box of the QGIS canvas to limit the rows of edge table ![BBOX](../img/fields/edgesSQL_fields/BBOXon.png)| + +### Columns + +|Field|Action| +| ----------- | --------- | +|![Id](../img/fields/edgesSQL_fields/columns/Id.png)| Write the column that has the edge identifier| +|![Source](../img/fields/edgesSQL_fields/columns/source.png)|Write the column that has the edge source| +|![Target](../img/fields/edgesSQL_fields/columns/target.png)|Write the column that has the edge target| +|![Cost](../img/fields/edgesSQL_fields/columns/cost.png)|Write the column that has the cost of the edge source -> target| +|![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCostOFF.png)|Write the column that has the cost of the edge target -> source, the column will be used when the box is ticked ![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCost.png)| + +## Arguments tab +![Arguments tab](../img/tabs/arguments/arguments_KSP.png) + +|Field|Action| +| ----------- | --------- | +|![fromVid](../img/fields/arguments/KSP_fromVid.png)| Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the start vertex| +|![toVid](../img/fields/arguments/KSP_toVid.png)|Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the start vertex| +|![K](../img/fields/arguments/KSP_k.png)| ... | +|![Heap paths](../img/fields/arguments/KSP_heapPaths.png)| Tick.. ![Heap paths](../img/fields/arguments/KSP_heapPathsON.png) +|![Directed](../img/fields/arguments/directedOFF.png)| Tick if the graph is directed ![Directed](../img/fields/arguments/directedON.png)| + +## Execute tab +![Execute tab](../img/tabs/execute/execute.png) + +|Button|Action| +| ----------- | --------- | +|![Preview](../img/buttons/execute/preview.png)| Draws in the canvas the resulting path | +|![Clear Preview](../img/buttons/execute/clearpreview.png)| Removes from the canvas objects generated with Preview| +|![Export](../img/buttons/execute/export.png)| Creates a one row per edge line geometry layer| +|![Export Merged](../img/buttons/execute/exportmergedON.png)| Creates a one row per path multiline geometry layer. As many rows as needed| + +Depending on the pressed button the layer name will be +``` +() pgr_KSP: to BBOX() +(M ) pgr_KSP: to BBOX() +``` diff --git a/docs/functions/pgr_aStar.md b/docs/functions/pgr_aStar.md new file mode 100755 index 0000000..01bfa6a --- /dev/null +++ b/docs/functions/pgr_aStar.md @@ -0,0 +1,63 @@ + + + + + +# pgr_astar +![pgr_astar](../img/functions/f_pgr_astar.png) + +|Button|Action| +| ----------- | --------- | +|![Help](../img/functions/helpButton.png)|Opens the web page of the documentation of pgr_astar| +|![Function](../img/functions/astar.png)| Choose pgr_astar on the drop down box| + +## Edges SQL tab +![Edges SQL tab](../img/tabs/edges_SQL/astar_edgesSQL.png) + +|Field|Action| +| ----------- | --------- | +|![Edge table](../img/fields/edgesSQL_fields/edge_table.png)| Write the table name of the edges| +|![Edge schema](../img/fields/edgesSQL_fields/edge_schema.png)|Write the schema of the edge table| +|![Geometry](../img/fields/edgesSQL_fields/geometry.png)|Write the geometry column name| +|![BBOX](../img/fields/edgesSQL_fields/BBOX.png)|Tick to use the Bounding Box of the QGIS canvas to limit the rows of edge table ![BBOX](../img/fields/edgesSQL_fields/BBOXon.png)| + +### Columns + +|Field|Action| +| ----------- | --------- | +|![Id](../img/fields/edgesSQL_fields/columns/Id.png)| Write the column that has the edge identifier| +|![Source](../img/fields/edgesSQL_fields/columns/source.png)|Write the column that has the edge source| +|![Target](../img/fields/edgesSQL_fields/columns/target.png)|Write the column that has the edge target| +|![Cost](../img/fields/edgesSQL_fields/columns/cost.png)|Write the column that has the cost of the edge source -> target| +|![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCostOFF.png)|Write the column that has the cost of the edge target -> source, the column will be used when the box is ticked ![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCost.png)| +|![x](../img/fields/edgesSQL_fields/columns/x1.png)|Write the geometry column name| +|![y](../img/fields/edgesSQL_fields/columns/y1.png)|Write the geometry column name| + +## Arguments tab +![Arguments tab](../img/tabs/arguments/arguments_astar.png) + +|Field|Action| +| ----------- | --------- | +|![fromVids](../img/fields/arguments/astar-dijkstra_fromVids.png)| Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the start vertices| +|![toVids](../img/fields/arguments/astar-dijkstra_toVids.png)|Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the destination vertices| +|![Heuristic](../img/fields/arguments/astar_heuristic.png)| Heuristic number. Current valid values `0~5` . Default ``5``| +|![Factor](../img/fields/arguments/astar_factor.png)| For units manipulation. `factor > 0`. Default ``1``. See `astar_factor`.| +|![Epsilon](../img/fields/arguments/astar_epsilon.png)| For less restricted results. `epsilon >= 1`. Default ``1``.| +|![Directed](../img/fields/arguments/directedOFF.png)| Tick if the graph is directed ![Directed](../img/fields/arguments/directedON.png)| + +## Execute tab +![Execute tab](../img/tabs/execute/execute.png) + +|Button|Action| +| ----------- | --------- | +|![Preview](../img/buttons/execute/preview.png)| Draws in the canvas the resulting path | +|![Clear Preview](../img/buttons/execute/clearpreview.png)| Removes from the canvas objects generated with Preview| +|![Export](../img/buttons/execute/export.png)| Creates a one row per edge line geometry layer| +|![Export Merged](../img/buttons/execute/exportmergedON.png)| Creates a one row per path multiline geometry layer. As many rows as needed| + + +Depending on the pressed button the layer name will be +``` +() pgr_astar: to BBOX() +(M ) pgr_astar: to BBOX() +``` diff --git a/docs/functions/pgr_astarCost.md b/docs/functions/pgr_astarCost.md new file mode 100755 index 0000000..1ebe311 --- /dev/null +++ b/docs/functions/pgr_astarCost.md @@ -0,0 +1,59 @@ + + + + + +# pgr_astarCost +![pgr_astarCost](../img/functions/f_pgr_astarCost.png) + +|Button|Action| +| ----------- | --------- | +|![Help](../img/functions/helpButton.png)|Opens the web page of the documentation of pgr_astarCost| +|![Function](../img/functions/astarCost.png)| Choose pgr_astarCost on the drop down box| + +## Edges SQL tab +![Edges SQL tab](../img/tabs/edges_SQL/dijkstra-KSP_edgesSQL.png) + +|Field|Action| +| ----------- | --------- | +|![Edge table](../img/fields/edgesSQL_fields/edge_table.png)| Write the table name of the edges| +|![Edge schema](../img/fields/edgesSQL_fields/edge_schema.png)|Write the schema of the edge table| +|![Geometry](../img/fields/edgesSQL_fields/geometry.png)|Write the geometry column name| +|![BBOX](../img/fields/edgesSQL_fields/BBOX.png)|Tick to use the Bounding Box of the QGIS canvas to limit the rows of edge table ![BBOX](../img/fields/edgesSQL_fields/BBOXon.png)| + +### Columns + +|Field|Action| +| ----------- | --------- | +|![Id](../img/fields/edgesSQL_fields/columns/Id.png)| Write the column that has the edge identifier| +|![Source](../img/fields/edgesSQL_fields/columns/source.png)|Write the column that has the edge source| +|![Target](../img/fields/edgesSQL_fields/columns/target.png)|Write the column that has the edge target| +|![Cost](../img/fields/edgesSQL_fields/columns/cost.png)|Write the column that has the cost of the edge source -> target| +|![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCostOFF.png)|Write the column that has the cost of the edge target -> source, the column will be used when the box is ticked ![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCost.png)| + +## Arguments tab +![Arguments tab](../img/tabs/arguments/arguments_astar.png) + +|Field|Action| +| ----------- | --------- | +|![fromVids](../img/fields/arguments/astar-dijkstra_fromVids.png)| Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the start vertices| +|![toVids](../img/fields/arguments/astar-dijkstra_toVids.png)|Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the destination vertices| +|![Heuristic](../img/fields/arguments/astar_heuristic.png)| Heuristic number. Current valid values `0~5` . Default ``5``| +|![Factor](../img/fields/arguments/astar_factor.png)| For units manipulation. `factor > 0`. Default ``1``. See `astar_factor`.| +|![Epsilon](../img/fields/arguments/astar_epsilon.png)| For less restricted results. `epsilon >= 1`. Default ``1``.| +|![Directed](../img/fields/arguments/directedOFF.png)| Tick if the graph is directed ![Directed](../img/fields/arguments/directedON.png)| + +## Execute tab +![Execute tab](../img/tabs/execute/execute.png) + +|Button|Action| +| ----------- | --------- | +|![Preview](../img/buttons/execute/preview.png)| Draws in the canvas the resulting path | +|![Clear Preview](../img/buttons/execute/clearpreview.png)| Removes from the canvas objects generated with Preview| +|![Export](../img/buttons/execute/export.png)| Creates a one row per edge line geometry layer| +|![Export Merged](../img/buttons/execute/exportmergedOFF.png)| Disabled| + +Depending on the pressed button the layer name will be +``` +() pgr_astarCost: to BBOX() +``` diff --git a/docs/functions/pgr_bdAstar.md b/docs/functions/pgr_bdAstar.md new file mode 100755 index 0000000..c67c7f4 --- /dev/null +++ b/docs/functions/pgr_bdAstar.md @@ -0,0 +1,63 @@ + + + + + +# pgr_bdAstar +![pgr_bdAstar](../img/functions/f_pgr_bdAstar.png) + +|Button|Action| +| ----------- | --------- | +|![Help](../img/functions/helpButton.png)|Opens the web page of the documentation of pgr_bdAstar| +|![Function](../img/functions/bdAstar.png)| Choose pgr_bdAstar on the drop down box| + +## Edges SQL tab +![Edges SQL tab](../img/tabs/edges_SQL/astar_edgesSQL.png) + +|Field|Action| +| ----------- | --------- | +|![Edge table](../img/fields/edgesSQL_fields/edge_table.png)| Write the table name of the edges| +|![Edge schema](../img/fields/edgesSQL_fields/edge_schema.png)|Write the schema of the edge table| +|![Geometry](../img/fields/edgesSQL_fields/geometry.png)|Write the geometry column name| +|![BBOX](../img/fields/edgesSQL_fields/BBOX.png)|Tick to use the Bounding Box of the QGIS canvas to limit the rows of edge table ![BBOX](../img/fields/edgesSQL_fields/BBOXon.png)| + +### Columns + +|Field|Action| +| ----------- | --------- | +|![Id](../img/fields/edgesSQL_fields/columns/Id.png)| Write the column that has the edge identifier| +|![Source](../img/fields/edgesSQL_fields/columns/source.png)|Write the column that has the edge source| +|![Target](../img/fields/edgesSQL_fields/columns/target.png)|Write the column that has the edge target| +|![Cost](../img/fields/edgesSQL_fields/columns/cost.png)|Write the column that has the cost of the edge source -> target| +|![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCostOFF.png)|Write the column that has the cost of the edge target -> source, the column will be used when the box is ticked ![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCost.png)| +|![x](../img/fields/edgesSQL_fields/columns/x1.png)|Write the geometry column name| +|![y](../img/fields/edgesSQL_fields/columns/y1.png)|Write the geometry column name| + +## Arguments tab +![Arguments tab](../img/tabs/arguments/arguments_astar.png) + +|Field|Action| +| ----------- | --------- | +|![fromVids](../img/fields/arguments/astar-dijkstra_fromVids.png)| Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the start vertices| +|![toVids](../img/fields/arguments/astar-dijkstra_toVids.png)|Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the destination vertices| +|![Heuristic](../img/fields/arguments/astar_heuristic.png)| Heuristic number. Current valid values `0~5` . Default ``5``| +|![Factor](../img/fields/arguments/astar_factor.png)| For units manipulation. `factor > 0`. Default ``1``. See `astar_factor`.| +|![Epsilon](../img/fields/arguments/astar_epsilon.png)| For less restricted results. `epsilon >= 1`. Default ``1``.| +|![Directed](../img/fields/arguments/directedOFF.png)| Tick if the graph is directed ![Directed](../img/fields/arguments/directedON.png)| + +## Execute tab +![Execute tab](../img/tabs/execute/execute.png) + +|Button|Action| +| ----------- | --------- | +|![Preview](../img/buttons/execute/preview.png)| Draws in the canvas the resulting path | +|![Clear Preview](../img/buttons/execute/clearpreview.png)| Removes from the canvas objects generated with Preview| +|![Export](../img/buttons/execute/export.png)| Creates a one row per edge line geometry layer| +|![Export Merged](../img/buttons/execute/exportmergedON.png)| Creates a one row per path multi line geometry layer. As many rows as needed| + + +Depending on the pressed button the layer name will be +``` +() pgr_bdAstar: to BBOX() +(M ) pgr_bdAstar: to BBOX() +``` diff --git a/docs/functions/pgr_bdAstarCost.md b/docs/functions/pgr_bdAstarCost.md new file mode 100755 index 0000000..1fd8ba1 --- /dev/null +++ b/docs/functions/pgr_bdAstarCost.md @@ -0,0 +1,56 @@ + + + + + +# pgr_bdAstarCost +![pgr_bdAstarCost](../img/functions/f_pgr_bdAstarCost.png) + +|Button|Action| +| ----------- | --------- | +|![Help](../img/functions/helpButton.png)|Opens the web page of the documentation of pgr_bdAstarCost| +|![Function](../img/functions/bdAstarCost.png)| Choose pgr_bdAstarCost on the drop down box| + +## Edges SQL tab +![Edges SQL tab](../img/tabs/edges_SQL/astar_edgesSQL.png) + +|Field|Action| +| ----------- | --------- | +|![Edge table](../img/fields/edgesSQL_fields/edge_table.png)| Write the table name of the edges| +|![Edge schema](../img/fields/edgesSQL_fields/edge_schema.png)|Write the schema of the edge table| +|![Geometry](../img/fields/edgesSQL_fields/geometry.png)|Write the geometry column name| +|![BBOX](../img/fields/edgesSQL_fields/BBOX.png)|Tick to use the Bounding Box of the QGIS canvas to limit the rows of edge table ![BBOX](../img/fields/edgesSQL_fields/BBOXon.png)| + +### Columns + +|Field|Action| +| ----------- | --------- | +|![Id](../img/fields/edgesSQL_fields/columns/Id.png)| Write the column that has the edge identifier| +|![Source](../img/fields/edgesSQL_fields/columns/source.png)|Write the column that has the edge source| +|![Target](../img/fields/edgesSQL_fields/columns/target.png)|Write the column that has the edge target| +|![Cost](../img/fields/edgesSQL_fields/columns/cost.png)|Write the column that has the cost of the edge source -> target| +|![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCostOFF.png)|Write the column that has the cost of the edge target -> source, the column will be used when the box is ticked ![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCost.png)| + +## Arguments tab +![Arguments tab](../img/tabs/arguments/arguments_astar.png) + +|Field|Action| +| ----------- | --------- | +|![fromVids](../img/fields/arguments/astar-dijkstra_fromVids.png)| Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the start vertices| +|![toVids](../img/fields/arguments/astar-dijkstra_toVids.png)|Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the destination vertices| +|![Directed](../img/fields/arguments/directedOFF.png)| Tick if the graph is directed ![Directed](../img/fields/arguments/directedON.png)| + +## Execute tab +![Execute tab](../img/tabs/execute/ExecuteCost.png) + +|Button|Action| +| ----------- | --------- | +|![Preview](../img/buttons/execute/preview.png)| Draws in the canvas the resulting path | +|![Clear Preview](../img/buttons/execute/clearpreview.png)| Removes from the canvas objects generated with Preview| +|![Export](../img/buttons/execute/export.png)| Creates a one row per edge line geometry layer| +|![Export Merged](../img/buttons/execute/exportmergedOFF.png)| Disabled| + +Depending on the pressed button the layer name will be +``` +() pgr_bdAstarCost: to BBOX() +``` diff --git a/docs/functions/pgr_bdDijkstra.md b/docs/functions/pgr_bdDijkstra.md new file mode 100755 index 0000000..bf2f4f0 --- /dev/null +++ b/docs/functions/pgr_bdDijkstra.md @@ -0,0 +1,57 @@ + + + + + +# pgr_bdDijkstra +![pgr_bdDijkstra](../img/functions/f_pgr_bdDijkstra.png) + +|Button|Action| +| ----------- | --------- | +|![Help](../img/functions/helpButton.png)|Opens the web page of the documentation of pgr_bdDijkstra| +|![Function](../img/functions/bdDijkstra.png)| Choose pgr_bdDijkstra on the drop down box| + +## Edges SQL tab +![Edges SQL tab](../img/tabs/edges_SQL/dijkstra-KSP_edgesSQL.png) + +|Field|Action| +| ----------- | --------- | +|![Edge table](../img/fields/edgesSQL_fields/edge_table.png)| Write the table name of the edges| +|![Edge schema](../img/fields/edgesSQL_fields/edge_schema.png)|Write the schema of the edge table| +|![Geometry](../img/fields/edgesSQL_fields/geometry.png)|Write the geometry column name| +|![BBOX](../img/fields/edgesSQL_fields/BBOX.png)|Tick to use the Bounding Box of the QGIS canvas to limit the rows of edge table ![BBOX](../img/fields/edgesSQL_fields/BBOXon.png)| + +### Columns + +|Field|Action| +| ----------- | --------- | +|![Id](../img/fields/edgesSQL_fields/columns/Id.png)| Write the column that has the edge identifier| +|![Source](../img/fields/edgesSQL_fields/columns/source.png)|Write the column that has the edge source| +|![Target](../img/fields/edgesSQL_fields/columns/target.png)|Write the column that has the edge target| +|![Cost](../img/fields/edgesSQL_fields/columns/cost.png)|Write the column that has the cost of the edge source -> target| +|![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCostOFF.png)|Write the column that has the cost of the edge target -> source, the column will be used when the box is ticked ![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCost.png)| + +## Arguments tab +![Arguments tab](../img/tabs/arguments/arguments_dijkstra.png) + +|Field|Action| +| ----------- | --------- | +|![fromVids](../img/fields/arguments/astar-dijkstra_fromVids.png)| Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the start vertices| +|![toVids](../img/fields/arguments/astar-dijkstra_toVids.png)|Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the destination vertices| +|![Directed](../img/fields/arguments/directedOFF.png)| Tick if the graph is directed ![Directed](../img/fields/arguments/directedON.png)| + +## Execute tab +![Execute tab](../img/tabs/execute/execute.png) + +|Button|Action| +| ----------- | --------- | +|![Preview](../img/buttons/execute/preview.png)| Draws in the canvas the resulting path | +|![Clear Preview](../img/buttons/execute/clearpreview.png)| Removes from the canvas objects generated with Preview| +|![Export](../img/buttons/execute/export.png)| Creates a one row per edge line geometry layer| +|![Export Merged](../img/buttons/execute/exportmergedON.png)| Creates a one row per path multiline geometry layer. As many rows as needed| + +Depending on the pressed button the layer name will be +``` +() pgr_bdDijkstra: to BBOX() +(M ) pgr_bdDijkstra: to BBOX() +``` diff --git a/docs/functions/pgr_bdDijkstraCost.md b/docs/functions/pgr_bdDijkstraCost.md new file mode 100755 index 0000000..a84f800 --- /dev/null +++ b/docs/functions/pgr_bdDijkstraCost.md @@ -0,0 +1,56 @@ + + + + + +# pgr_bdDijkstraCost +![pgr_bdDijkstraCost](../img/functions/f_pgr_bdDijkstraCost.png) + +|Button|Action| +| ----------- | --------- | +|![Help](../img/functions/helpButton.png)|Opens the web page of the documentation of pgr_bdDijkstraCost| +|![Function](../img/functions/bdDijkstraCost.png)| Choose pgr_bdDijkstraCost on the drop down box| + +## Edges SQL tab +![Edges SQL tab](../img/tabs/edges_SQL/dijkstra-KSP_edgesSQL.png) + +|Field|Action| +| ----------- | --------- | +|![Edge table](../img/fields/edgesSQL_fields/edge_table.png)| Write the table name of the edges| +|![Edge schema](../img/fields/edgesSQL_fields/edge_schema.png)|Write the schema of the edge table| +|![Geometry](../img/fields/edgesSQL_fields/geometry.png)|Write the geometry column name| +|![BBOX](../img/fields/edgesSQL_fields/BBOX.png)|Tick to use the Bounding Box of the QGIS canvas to limit the rows of edge table ![BBOX](../img/fields/edgesSQL_fields/BBOXon.png)| + +### Columns + +|Field|Action| +| ----------- | --------- | +|![Id](../img/fields/edgesSQL_fields/columns/Id.png)| Write the column that has the edge identifier| +|![Source](../img/fields/edgesSQL_fields/columns/source.png)|Write the column that has the edge source| +|![Target](../img/fields/edgesSQL_fields/columns/target.png)|Write the column that has the edge target| +|![Cost](../img/fields/edgesSQL_fields/columns/cost.png)|Write the column that has the cost of the edge source -> target| +|![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCostOFF.png)|Write the column that has the cost of the edge target -> source, the column will be used when the box is ticked ![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCost.png)| + +## Arguments tab +![Arguments tab](../img/tabs/arguments/arguments_dijkstra.png) + +|Field|Action| +| ----------- | --------- | +|![fromVids](../img/fields/arguments/astar-dijkstra_fromVids.png)| Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the start vertices| +|![toVids](../img/fields/arguments/astar-dijkstra_toVids.png)|Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the destination vertices| +|![Directed](../img/fields/arguments/directedOFF.png)| Tick if the graph is directed ![Directed](../img/fields/arguments/directedON.png)| + +## Execute tab +![Execute tab](../img/tabs/execute/ExecuteCost.png) + +|Button|Action| +| ----------- | --------- | +|![Preview](../img/buttons/execute/preview.png)| Draws in the canvas the resulting path | +|![Clear Preview](../img/buttons/execute/clearpreview.png)| Removes from the canvas objects generated with Preview| +|![Export](../img/buttons/execute/export.png)| Creates a one row per edge line geometry layer| +|![Export Merged](../img/buttons/execute/exportmergedOFF.png)| Disabled| + +Depending on the pressed button the layer name will be +``` +() pgr_bdDijkstraCost: to BBOX() +``` diff --git a/docs/functions/pgr_dijkstra.md b/docs/functions/pgr_dijkstra.md new file mode 100755 index 0000000..1d084f2 --- /dev/null +++ b/docs/functions/pgr_dijkstra.md @@ -0,0 +1,57 @@ + + + + + +# pgr_dijkstra +![pgr_dijkstra](../img/functions/f_pgr_dijkstra.png) + +|Button|Action| +| ----------- | --------- | +|![Help](../img/functions/helpButton.png)|Opens the web page of the documentation of pgr_dijkstra| +|![Function](../img/functions/dijkstra.png)| Choose pgr_dijkstra on the drop down box| + +## Edges SQL tab +![Edges SQL tab](../img/tabs/edges_SQL/dijkstra-KSP_edgesSQL.png) + +|Field|Action| +| ----------- | --------- | +|![Edge table](../img/fields/edgesSQL_fields/edge_table.png)| Write the table name of the edges| +|![Edge schema](../img/fields/edgesSQL_fields/edge_schema.png)|Write the schema of the edge table| +|![Geometry](../img/fields/edgesSQL_fields/geometry.png)|Write the geometry column name| +|![BBOX](../img/fields/edgesSQL_fields/BBOX.png)|Tick to use the Bounding Box of the QGIS canvas to limit the rows of edge table ![BBOX](../img/fields/edgesSQL_fields/BBOXon.png)| + +### Columns + +|Field|Action| +| ----------- | --------- | +|![Id](../img/fields/edgesSQL_fields/columns/Id.png)| Write the column that has the edge identifier| +|![Source](../img/fields/edgesSQL_fields/columns/source.png)|Write the column that has the edge source| +|![Target](../img/fields/edgesSQL_fields/columns/target.png)|Write the column that has the edge target| +|![Cost](../img/fields/edgesSQL_fields/columns/cost.png)|Write the column that has the cost of the edge source -> target| +|![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCostOFF.png)|Write the column that has the cost of the edge target -> source, the column will be used when the box is ticked ![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCost.png)| + +## Arguments tab +![Arguments tab](../img/tabs/arguments/arguments_dijkstra.png) + +|Field|Action| +| ----------- | --------- | +|![fromVids](../img/fields/arguments/astar-dijkstra_fromVids.png)| Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the start vertices| +|![toVids](../img/fields/arguments/astar-dijkstra_toVids.png)|Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the destination vertices| +|![Directed](../img/fields/arguments/directedOFF.png)| Tick if the graph is directed ![Directed](../img/fields/arguments/directedON.png)| + +## Execute tab +![Execute tab](../img/tabs/execute/execute.png) + +|Button|Action| +| ----------- | --------- | +|![Preview](../img/buttons/execute/preview.png)| Draws in the canvas the resulting path | +|![Clear Preview](../img/buttons/execute/clearpreview.png)| Removes from the canvas objects generated with Preview| +|![Export](../img/buttons/execute/export.png)| Creates a one row per edge line geometry layer| +|![Export Merged](../img/buttons/execute/exportmergedON.png)| Creates a one row per path multiline geometry layer. As many rows as needed| + +Depending on the pressed button the layer name will be +``` +() pgr_dijkstra: to BBOX() +(M ) pgr_dijkstra: to BBOX() +``` diff --git a/docs/functions/pgr_dijkstraCost.md b/docs/functions/pgr_dijkstraCost.md new file mode 100755 index 0000000..c3b7861 --- /dev/null +++ b/docs/functions/pgr_dijkstraCost.md @@ -0,0 +1,56 @@ + + + + + +# pgr_dijkstraCost +![pgr_dijkstraCost](../img/functions/f_pgr_dijkstraCost.png) + +|Button|Action| +| ----------- | --------- | +|![Help](../img/functions/helpButton.png)|Opens the web page of the documentation of pgr_dijkstraCost| +|![Function](../img/functions/dijkstraCost.png)| Choose pgr_dijkstraCost on the drop down box| + +## Edges SQL tab +![Edges SQL tab](../img/tabs/edges_SQL/dijkstra-KSP_edgesSQL.png) + +|Field|Action| +| ----------- | --------- | +|![Edge table](../img/fields/edgesSQL_fields/edge_table.png)| Write the table name of the edges| +|![Edge schema](../img/fields/edgesSQL_fields/edge_schema.png)|Write the schema of the edge table| +|![Geometry](../img/fields/edgesSQL_fields/geometry.png)|Write the geometry column name| +|![BBOX](../img/fields/edgesSQL_fields/BBOX.png)|Tick to use the Bounding Box of the QGIS canvas to limit the rows of edge table ![BBOX](../img/fields/edgesSQL_fields/BBOXon.png)| + +### Columns + +|Field|Action| +| ----------- | --------- | +|![Id](../img/fields/edgesSQL_fields/columns/Id.png)| Write the column that has the edge identifier| +|![Source](../img/fields/edgesSQL_fields/columns/source.png)|Write the column that has the edge source| +|![Target](../img/fields/edgesSQL_fields/columns/target.png)|Write the column that has the edge target| +|![Cost](../img/fields/edgesSQL_fields/columns/cost.png)|Write the column that has the cost of the edge source -> target| +|![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCostOFF.png)|Write the column that has the cost of the edge target -> source, the column will be used when the box is ticked ![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCost.png)| + +## Arguments tab +![Arguments tab](../img/tabs/arguments/arguments_dijkstra.png) + +|Field|Action| +| ----------- | --------- | +|![fromVids](../img/fields/arguments/astar-dijkstra_fromVids.png)| Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the start vertices| +|![toVids](../img/fields/arguments/astar-dijkstra_toVids.png)|Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the destination vertices| +|![Directed](../img/fields/arguments/directedOFF.png)| Tick if the graph is directed ![Directed](../img/fields/arguments/directedON.png)| + +## Execute tab +![Execute tab](../img/tabs/execute/ExecuteCost.png) + +|Button|Action| +| ----------- | --------- | +|![Preview](../img/buttons/execute/preview.png)| Draws in the canvas the resulting path | +|![Clear Preview](../img/buttons/execute/clearpreview.png)| Removes from the canvas objects generated with Preview| +|![Export](../img/buttons/execute/export.png)| Creates a one row per edge line geometry layer| +|![Export Merged](../img/buttons/execute/exportmergedOFF.png)| Disabled| + +Depending on the pressed button the layer name will be +``` +() pgr_dijkstraCost: to BBOX() +``` diff --git a/docs/img/KSP1-1.png b/docs/img/KSP1-1.png new file mode 100755 index 0000000000000000000000000000000000000000..290636504928bf9331c8a1d36538d1b730b1b69c GIT binary patch literal 23140 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 B+0Xz0 literal 0 HcmV?d00001 diff --git a/docs/img/KSP1.png b/docs/img/KSP1.png new file mode 100755 index 0000000000000000000000000000000000000000..3e9f8aee410d83ef360e9efa1920c73039ac976e GIT binary patch literal 7156 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 C1jGOU literal 0 HcmV?d00001 diff --git a/docs/img/astar1.png b/docs/img/astar1.png new file mode 100755 index 0000000000000000000000000000000000000000..7f5e8e63288be2123accc9ee068d1ac5e6ba3544 GIT binary patch literal 11689 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 literal 0 HcmV?d00001 diff --git a/docs/img/buttons/database.png b/docs/img/buttons/database.png new file mode 100755 index 0000000000000000000000000000000000000000..f16244870c6f310381e70513903676fd01643a54 GIT binary patch literal 3515 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 literal 0 HcmV?d00001 diff --git a/docs/img/buttons/execute/clearpreview.png b/docs/img/buttons/execute/clearpreview.png new file mode 100755 index 0000000000000000000000000000000000000000..6a460800843181e37eacb1d4f8e5f6b8d3ed35ed GIT binary patch literal 1742 zcmV;<1~K`GP)Na|ykN4rx<@5tDwPT-d@Ps@ zhP{1%qPV2Y+Sqal?_C4W}qDy53j@e^TgZr-A7Apj6Uh?3)zfpAI#eSwlv ze^OGpt)KJ;AOHd7m3q+<2cUGMj-6fx0s)oa`teF!5BaSrKR!R~V4^yw|06J!N+l!ntF{d*t>w#lCbjFGWB0DAkYJ8Y@^kinmONCNnIAC1F>V?D1a83E~ zC2>ZJC%lS}OPBPW8?$Sw6{d@!t-ZW*bB+JR){NA`nr6b%Yf5BfhT=JuVtH|fIG$(CRf947E$x1t+98TknVZLu{3OI^r=fn zzH(G#AJ}#cLZZ(n{u~o-mbLq6hQ@cimn=I=Lh39sFT0rUFB(AmcQ@2^rldExc)K+f z7r)Q~kWcap7`A35_ljBoP($&*m0Nm2u+tHZ7z<}>HsGmY6Yag`DZqlOZ9_DN&gWhSzgi~O!z?1-t z?J#BfFzjAlsRjT5k){FjL;b8dOa@(%mswyDICG?x0Y)0zEgzz1o$-NWS46I zkSsS#>>wK55ASgPyoUlF!U4~VO6w8%G_L@Brim(;UJfgZx< z7-9-}J&A0vcUDB_xTIVrZ@RZ{UcPQ0kZoGFzey_KSQr3k>ZEc8mrHLS;~x&rH8C=9pLlG0km*}dOhhB;(b+{ombo>8 z;NiwthZ3a=3OUG=oBrTV{^LgB9A}0NL&!LAFUPP<;}PaS>zQ^2)>kwuke;!B=b1Ya zX|uXjsdy<7S2uJBKsby1**OWx4`pfuNYnH}TqQ?<8WfENd`CMj4N#LfE3bR#Paaz_yQW!7aQK4hksJFPy9b92Js7uiaUzFlKy5Q&d$0YZr8;44sFzUesCozac*2?3UN z{g)wrzP+jp)Yhh~Tvi^Euwe}Iv$;6t-OZ=k8G0?zd)qBVHy`x5eRCpu;cRh!$f4xV zvNJ?=*z}W1lvn<*z49{!^~F)2UPfhhyZ?*6-b4FoAb^rhX07*qoM6N<$f(H^j1poj5 literal 0 HcmV?d00001 diff --git a/docs/img/buttons/execute/export.png b/docs/img/buttons/execute/export.png new file mode 100755 index 0000000000000000000000000000000000000000..43249f81867c08aa7ac64136dd0c2fe739bc3827 GIT binary patch literal 1271 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 pVIYGL5(}vo3002ovPDHLkV1nDn2WkKS literal 0 HcmV?d00001 diff --git a/docs/img/buttons/execute/preview.png b/docs/img/buttons/execute/preview.png new file mode 100755 index 0000000000000000000000000000000000000000..f9cb25d31d2f1c1b27a20087ef37cefe87c04a59 GIT binary patch literal 1206 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 literal 0 HcmV?d00001 diff --git a/docs/img/dijkstra1-1.png b/docs/img/dijkstra1-1.png new file mode 100755 index 0000000000000000000000000000000000000000..152792ce37a951bbef8686af76e8afb4bcebb765 GIT binary patch literal 24367 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

>tgGSYHGr>g4kC=TA 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 F{tro8zajtt literal 0 HcmV?d00001 diff --git a/docs/img/dijkstra1.png b/docs/img/dijkstra1.png new file mode 100755 index 0000000000000000000000000000000000000000..0d31f83fd6382cedc25a08ff56627072e18f442e GIT binary patch literal 6199 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 literal 0 HcmV?d00001 diff --git a/docs/img/fields/arguments/KSP_toVid.png b/docs/img/fields/arguments/KSP_toVid.png new file mode 100755 index 0000000000000000000000000000000000000000..cf43175151e70539353810067f7c7bbf6fb4c365 GIT binary patch literal 1974 zcmV;n2TAyeP)UWO00003b3#c}2nYz< z;ZNWI000nlMObuGZ)S9NVRB^vQ)qQ`bY*g5g3t*700&Y@L_t(|+U=ZsR8#jI!0#jP z1jt(gB8CD11TBIJg5?p~S?h2fRBFzVc3tafcTPL$HfKGZ^Qf!qPS@J4>hX-~DR^qz z*-ckV%SI3jN)f??Vi^fdrUi#dAkTY4UiY^@A{|N9CTb{W{5~iDs$ zi#lB{1OkaY7<>yLGXrfFo)bk;I-Q;%NqBi;4VTNw%*ennY>uj?)9I7vCria*s6wnU znan!5ZD$#Apak=8sz)M>-7#?8FahdQO#m8nR0n5 zpU=NtlL1wOg!9Ff!Q^C_R4j>Vmf37JT)p-HiV6e*m_Q*B;U-CmNDQJxEEZ3aZjZ+U z6DZ{Fad@nHi}uU0KF6fZPX(AbCnvEWH?dI23127x06^6skpe)7F-GfPhp}12mlkCy z*>s+l@|s-NyN2634eGVowRuSe(S&(0vzS==KwYE$Bwq7?zKC+}nED<*K9MO#Q+;U>%QO$qx5321S+e6)8l>PeT z-U{YzPjI5;S5KbKIq=q#X;TIV^bODK7~a&duVDR8MIy<)iaq)7)^`rR+ol~QDMr@T zBd=~sg0*Ih0vibC%?`uIxeJ%cCE4oh%_KqkfS<);5i)Lqj|Xd$F$6{L_+=R?D1KyVLu1?Umb6S9K@bG-4Yi-O z=08=!r^N}%ZrRYFD0;__!ZavT%l;P{89&~6=(meR32E#nFR5C}4av;9MtK0*v#td{!bvXm^P;A zv!@A%|Mc9J&DHDcp8I{X-VL3IZKY;&kF)5UF>=&Pd0tw+_m#>wgWC_*9RHp2Sbz$Q z+6;*aDJI9*cUNjrsy5lD?qXMMUMuHd2u-lKR#i0K(mE7U)3X*oT!MAB^-m%Q*?aap zt@PmsLu$Lg)$a3Sc{Qpf0vy5PvNo(M;6xUkDDw@IQ+v@?x##GKQ%x_g967S1VZaN$ zh+$9z{(ztGIh|gI5BJ@AV1Pmq;0yR~Mm2E1q8cD3tbUPHIOPUSB2I8v?V*Qf=c(_n=jyxlTbZ zVhEGQ8?|2L(Rdy&S^wG7TTgBZZm(}q)wifH6ibRpQTx_&9Q6Vrog5a=D1ex&kaQS>~OvOpOls zeH5KRhdRV2fd->gwlrU3>|Vf;1D^*C_=ST1l|obiU=*4XFK^bW%hHu#s#v>U36xo| zdR3tH#772_Lj2Y*J~+`WP%1OSn^;_~td#aPy{}2GP|ES}ovAB|#o75HyNRV!bYuWLMfZe)`3ntK~hURk(unGCLV#Igm=O)TI6VfS!*aZ(k7Lj9D#zD2dI zSp@=sf#GFokAA8-L!(#~imLG5HJZhaTZc7n;nw|6AANJrQwd^@sW zDHRndjYrX%hvt7<1)8Gn<*nA&Use6p&6MUmwsB4FNMt|k#w2TA+HHH|t!JzEJ8((f zqxJhX%b{s8wN1bhJ(j)U_@zHz@U=dqSpBu#IBGKjjG8Y`xdDsCGMg>I zPBij|$zo=+*y!!Q#DP%_5>94jx?VT@mBA3zEDoEUnwr97GNEdaND=V)3Ppy;;{hOw z42hyBlgUg-NPwzAA}*>h>~{YTxTnLycNQ{32G7EC;&M4AlNnx{8DPw0;&M1M^IEfU z374X%A)TItw}**6JT5mQBYkFW4}-${t3l>&0);@;AdtJ~zZj%lAC)Z0sQ>@~07*qo IM6N<$f=5Wa*8l(j literal 0 HcmV?d00001 diff --git a/docs/img/fields/arguments/Vid-selected.png b/docs/img/fields/arguments/Vid-selected.png new file mode 100755 index 0000000000000000000000000000000000000000..1ad4a979b2240f912cce0d9385442fef9563b2b7 GIT binary patch literal 753 zcmVvND?Zj~_o05)vj& zn)K(-AN(e;P}f0zetuZRYiny=U0od<90=A_EOf{?`}XZSc<|ui!-t7cOmhdlfB!x^ zJA3Wgwe0NdG|%?fvNja_`o#fZY~H-(?%lgqR#pN60s;a8Z{NPNv9W1rXrO+!U$f@F zgv9@oC$UKR`Yzz*{c_^O|NsC0fB*jdH4+dN72Uso|CcXca2ZR!gOZc~v#|UZ7KXa% z`t|GAuV05al#T5V3(NnuHY~ct#l`WLL*zT?&!7KsasOFZ{tF2Faki_pw{*0(bhI+> z-@;@u{71?G| zT6F~bhMOwiVqy8u$^M&-^)Cy{e>eRzA%3A`8%R;Mzj5Qnn>Vi_EDwGB#(VFz1Oo$u ziPB9^z4L3YKfAhUrJ}eL8D>(U9J=~g;o(~`2>Z%oMGNH{jLb}|dYT-HisTqaVU$^# z^+D2&yZ(7o<=c?-*}D~+qZAuzI_`~7DPw?$5k-WFx&t6^MCbfoKmY+k!dXBXjgjFL8A^Db&AqQ8z=~-9^xq?ODR=R1OtUq+8zq(K@dR$IkuBe04yUh$Azv0b%Z-zre7?5}voIJM2zAcgeF_+8b zWHR~tjNk9i<#M;d4u`{uMB>+QfB)d*O~XJ%!D8{xc}>%NzB|#W*56C6 z)qHUg2|-c3#;dBTswyIG#a{#h7ldFi$j0Wnf4|SpV0s#AH5eMgh1oZDrw9PD96tQE zW12yphfD@mR-j+`K0QTAvIs#zuwFjid$;yc4%7)jN->{jzM;(b{Mn;~Uu-#eX~ZN1 zDYfTkwtGkiTTj(A%`o&=PxJ2!tIZB=v_uYIec{WG#;$gFfAa1`-`^6S(4@p_b|?UF z97-c~Xn<{A+6}W`8FTdf$;Qt!wtd4Lr}z(-UiVOQHnw5l*jU>EZ!Ud)yPR>(UKH)) zV`er(#%eW)M&bM%I1V1%OB4PR0F260UrQhAb)HfI%vBpLCw;w$uOs002ovPDHLk FV1oV#8~XqN literal 0 HcmV?d00001 diff --git a/docs/img/fields/arguments/astar-dijkstra_fromVid.png b/docs/img/fields/arguments/astar-dijkstra_fromVid.png new file mode 100755 index 0000000000000000000000000000000000000000..068ac2044361a944ab4c731036153449f34b929d GIT binary patch literal 2243 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 RE>-{l002ovPDHLkV1m!_P0s)T literal 0 HcmV?d00001 diff --git a/docs/img/fields/arguments/astar-dijkstra_fromVids.png b/docs/img/fields/arguments/astar-dijkstra_fromVids.png new file mode 100755 index 0000000000000000000000000000000000000000..02ab1e7d3fa6d017d9c985494d622a5bce9c7709 GIT binary patch literal 2545 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 Hu0mjf&rj6~ literal 0 HcmV?d00001 diff --git a/docs/img/fields/arguments/astar-dijkstra_toVid.png b/docs/img/fields/arguments/astar-dijkstra_toVid.png new file mode 100755 index 0000000000000000000000000000000000000000..4f10b5f89e15282b33394f78956626c6cdebed9a GIT binary patch literal 2146 zcmV-o2%YzdP)BG} z?dT|gKb=s22Fz)mQY zDw(_^Fu;G+d7@6Qhr+Te0s&vA)4_ZT0&{r?WaZ~ukpBs0v$^$do55gM)F>L2>gVUf zVzDMF1E?*?Oj_=?d3d-9c>G0;QmIs(UES*tgw19{PlU{kL9gd?dBh^&@pwkP!DKQ) zPlPN2jcHgu(0s4IQDanFa4VHW4_*@yx+aoCpIOBd1Oc@LnHPeXCK1JOTeYH;%MwHf zCOeWDX56eCeN@{~alKRWRM2n2+#{wA{IAuCrkj8LT~3kAI`cUGp!nsqcW+>D8&|5j zrV2|UKO5{F9w*$a!L`lmhJUMX8&G}f`mH=Z=ga!zO+EE<4xAOYtg;i?yNbJ}i^1V% zyNU~+5g_v|L|^lM=280FMK6a_#R$M)~oBB#%n-mKR0H8-C$Kf^QO%q8R-XoQE_$MZMkXQk+(Z2M#1|!S(;@HFT4{}~RZ*=8Ot{&HR zG(GmsI`pryE0Ql?4ZipHf`2M-sF9_5q7C^#Glfp`-+@F*kiRv7ZeI(ag^2)8AiFI?tJ9dd}@A=`$ zQQS*C{TARyfl66o*dhP`ZI7FTzM<_Stpl0?GmdF>8r$h!MYl7HY%y4R=!%U28>MZM zr^B}Wlqb%UHnp67=cA6KL!TCeI2+{W4)1yMBVUhsK5T$26fmB^?G*45gC?Sb==lj|b0$AEAs?<@* zG0dqdAqE?2WxiXs#|g*)q5J;wS+UK|P_CDo^VAPB-@wdgRd)~vxubJtyj6-NMpSuM8fXPDvw?mw;`(lQ0S@hCvz3b@$t zuzvb9KFP_R&63(d)7`68#+Z}{#`GyPYAwR!^O11_}i?!t3z zBgAssezLC*-Nn0G zsbJFBbNkBzEQrl@8Bq?58=Q5pe~`lA%*fDDkAy@~d$qK>ss_ZShR>+bP-iBC7#

    } zrG`^yB|+jRg5=+Pev7gxDQxCRgclht>MSj(8^i!%?74Qf>M;%g0K~AOy<1};0P5_q z*3%isEK3bsgr@Q2o_#lh_Po12glf_o40?mv3T3jqLNRnr1cTtzbx32}Qz$rM!7X`Z znY&6e2`fQCN%3pbt~6bAz-fsADPXQbaUuCGIq-!8uNQstK~9Fsh%$xZ9e>H*K%d=J zV2e}2J}&IpnjA3Oj!@61_w62d|L9BUhe#Y@;`2{MHFN?12wnTRKcBAeGn1(_7h(J> zuf{B~C588w9s8=K4{OQ&Rq@y%%Ep3=@1-%IQkE_+HjVpa(6hx2Cu^{)n*ugJ98vVD z6$FZVve$aL_*`zj&@AuRot*FH>^`&oU{l0O{y(4Fjd$W=W8g;HmFqRN5kC)~dZbcX z9sP@_iI2^X>Pv2aHiQkt2gSL%xB&t@9PTc=Q{jL+z9ilmw=QAg%A0ldfdN7{H@Ahy zEy(K2xTeIR^=^^w30^gdDruW!P5^#A|> literal 0 HcmV?d00001 diff --git a/docs/img/fields/arguments/astar-dijkstra_toVids.png b/docs/img/fields/arguments/astar-dijkstra_toVids.png new file mode 100755 index 0000000000000000000000000000000000000000..d2ed51fa3bbe01f083212c47fb3ca4747eb4038a GIT binary patch literal 2420 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 Wk&(-ygWw+k0000s@23LqEaPT5iPhR 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 CQAh;< literal 0 HcmV?d00001 diff --git a/docs/img/fields/edgesSQL_fields/BBOX.png b/docs/img/fields/edgesSQL_fields/BBOX.png new file mode 100755 index 0000000000000000000000000000000000000000..78327da4a7770ca03dd4aa6a83be11a5985a9948 GIT binary patch literal 1124 zcmV-q1e^PbP)d>NP?q=s+fAlWQ6JoGX8tCydYuD?SD*+jEpQ?LeiR+zA4F`8a#{)3=9na-e20V zaKV<7*PeX*&BiCAY3Uai7pN=9^#A?A_PnXgS+mP5`574)82&t5T~T=4YC>0#91Gsq zph}= zW<~k>FXow@%Qvpyx}+!1`um2O@~P*){$~`l%gWHZFmvXq&;J=1{yy0{VJ%Zsp`RQJ zp+rT^a)X6i+Q`FR@yE-TU;d#=@X1?xT8O`Y@#+r)!@n21=WY4xTTvQrDksRv&LJRU z98g^2$GCa^j%WWF7zM1dv$f7lU2x{p^DUFt{13|ulw~2DH>e5z|9pLM*P-VsR))f; z7X176?98rH-;Axa*%%nUU%PZ$z{Ex!x$I_Du`(0Ad-3v@{|pR_g4XG|T4#ES8kYVI zDfX9PrbpgjU|?YQbA3*#>s*HafB*dBka0?{@{?y`VED(t!0`KIzrXtghW~&6{Nq;j z$!T;DVPg3I_4DU{d}{ot9%ba?=llQV(-#H?UIqq6eq$$tKYRAeWLrox6IW7EC2we^ z%-+3o%f8*4H%*D-+E`Jt>fv8VAe$F%+_`1%u5G(kwfTQuklnQF<$p$QK3=9zA3pv= zjmS?QJ~Hz1@h~tjFfe?-x^UJd{V3;;%V+F*{hw~$fCninpMtf&mB8)OS3jcI&d4sL z=HX?;aN+FDKMb5&dTJle9J%=uNx|>iM^C>|(bwf+WMKGlWyzES$|<>tY58`KXHVIW z$0M}y2E*U4kB@CU{6a)oftL|Q;`gV!JGY+xCa)~d%)lh>n&{26xwB{W*{7d=|NZ^> z`S}gKEt?tr6FsCD8Gc+_-oH;KEzL@hk<%bP-Qv#NDf{34qi5b=U|?Y3mDY90Z%xo* zMa~-x{~6f?6bxN!Yl7sN7#JA14Kq4B#1}4@QatDB$KR~{vRYO_tsMb6T#P?&ES|VW zJYj;PFe3v410%0VYKDHwW6cFjyuAT|8(czMkl7p@>A}S(s z_S|`5G+e%NMNCYLq?QZ)TDU)c{#?3z)!R3332G1*6LWF4mz0!bVqzL}-e6#0`1|+o qmoHxkw)wcYxOjPa2bCWf7#IL*nv__voNzG!0000{C@-V4&5bzNB@3eYP@5V?gm8ii1NoY&;v%(C=+04w69ln%fqB$r8e=}x z5F8FC=$dN8$u5Th0CJVQQ8z{gnWFG}e?Ep>i)*o~c#8LT6H=5&Bnn21e;cgbba2P9 zei~s2063l$$6BI005Yo!H%|8Ycg>}q-=U4#I@d;5&8@}j2hSbh|K-(M9r$esud1+_WmA)!f_tg`sAL?AnP#?Kivtz`6z+bqCIp>tC%gbe=V}*H&b> zJE{*f47gY%*|4iD;Ywp;pOXck$4qsfW7{k9qVNDdxCrOT)@E;1&P`8~jDJF?NY6== z&P@I01z@JECyn$L-ToKXMM=U#!^HBGtyR@|sOyujCRjjXO?kQ6*3fEmOd9JyV_&G) zwi*xY++gSLUbTEPsnR5`@ZW%;CTx~IDn+v<1i(EsI4n+m;*rn=3%DxH%NXU{75 zU+N2pPTjuKw`t!YudnRvHlDYbEvJuYovr2XSf*LT6ACcLtex?{NXM)l350wA0B~P# z`*<*M`)0f0gyk+9a5I9q!sraGMm*eq-R`$L3XO=(&Rq*vF5mP*xH=(r*7n`a`2`C+ z!{7J+u1bvOBY?S|+VvM=iuV+i?A>suN#DB&$bIruwCm0fo!?HajENQ?zl6tetJ~C1 zDPj~Hz@%A4&tP3OwP!AmJ3O?0o9A`bSTdYjNG1&`bLfi>oEx5g8d7 zbe>Ad1M{eBIR%ypkBSe=abN#|!=?VD_w`Y~P)kci#fSY$QYKx6VOY>%002$XBuP>f nwRizR5CVZ9s2Kb(9_aWBqOzN2rg3nu00000NkvXXu0mjf2yY78 literal 0 HcmV?d00001 diff --git a/docs/img/fields/edgesSQL_fields/columns/Id.png b/docs/img/fields/edgesSQL_fields/columns/Id.png new file mode 100755 index 0000000000000000000000000000000000000000..f8c28e3e0b107f0a9ec392229df1dbdc1ef9a053 GIT binary patch literal 765 zcmV>dh#Uo@5jh%>qhK^5N5K$` z$Um2+heu7j@P`0d|wxwWKa+D)yZ#T!tFURLul{JgN&kra_xa;z z9#Jt)XzZ~H3GtB{k^et^_#!AS3N79l`Gti?i&pwaBoi+m@3(jFe!}AQ%a^aDmWzzM z0z4nzyo2^P{(t-Y<@adOO81ClmN&N)xwv-am5=`z{(ZT-apS2kq{afPrkw@z!4(^B zfBnz!=lz9MTh9F%jS)ITGxgyb#!WbdUz zaub-#BD+40XJ=lZw`*wGYHl|ldFIh5ArCOpbQRs%bLVZWEJs6`rr^l2(#5*qoGVY@Z!}gZZ0mG4+#AG_wVMd v+uuev@z4zLaC57wsxUDzF^=w!93B7wp0nQt0(l-H00000NkvXXu0mjf>VA1= literal 0 HcmV?d00001 diff --git a/docs/img/fields/edgesSQL_fields/columns/cost.png b/docs/img/fields/edgesSQL_fields/columns/cost.png new file mode 100755 index 0000000000000000000000000000000000000000..f38c8021ef89f89ab158e0d13a2bd28abb175abf GIT binary patch literal 1406 zcmV-^1%djBP))SR8e83;RC$i$DP^zzxn_6?KS)0v%Wrn7;%gl z&M<~y6bdD6G@{;Z1dj8(WHJoHhSjS=p_IBxB_xRi*a(VJE0m4Xrg~w+nMxatNUBYd zNW?Tv0{}48#fSuXMP3oeD*|~%Ag>7I6?sLBGzR?M#2OlIoXh^Tr1puXAL69j?A6=k zpHH_R^g&r&?X7xpmEVM6IBVG6n(KAqpv5le41K>>_E}}xc6q7O+N}p;ygdX~ZA)DX zaI+gq)tZvLbVcZj;qc0+?`9`I4qJu1e!wg9LV0!w#s`ib;AO05~#lb*p5dxCmWc4yS6&CTl`aQPp{WNw-B z!9iG_mSr5vEPSBS17c$E&eX{Hc2CPQj-Dy3>F&n_lb5WGjtH4fKw#P6$4`*!^0ap$+s9gCC>=#|k_KX~H0BF^j0tFBdbG2uwrjJQDwpob{B9m$eb%AU3wRSgirU%Su*(ph8{;#mmaWY>@!#K_ z8k>B1i8HI|q6wb0B`f|w>1_GA{l287?Z)99v4@DP{Q(Y@IY;if?#n&oOE8A^R=or6 z;{9!WQ(cTcq9ATQGWx#fCf1-gK%qzo-*y_RI{)#`APw11T)Az59Ip2a-E5|3?= zK1vV&Z2k76o64bQjb5*qc;+1Ewmu!j z+v?5jsmw}BDR|gP1AL-iSaf9QECIAOT#Qc0tJSbvJ3H~rPa4dzV+l|LzsN&5x4%D*|~%Ag>7I6@k1WkXPi@HsCmq zqSUB#+tE!?IFAS3@x94bFbwlpp){g(S2lx><1(2ihG7t`lN^!!4aMCsNmCLcT>t<8 M07*qoM6N<$g6mbh?f?J) literal 0 HcmV?d00001 diff --git a/docs/img/fields/edgesSQL_fields/columns/reverseCost.png b/docs/img/fields/edgesSQL_fields/columns/reverseCost.png new file mode 100755 index 0000000000000000000000000000000000000000..a9ae3fb4e019f6df9e8cd1219fe893e81fcd07cb GIT binary patch literal 1883 zcmV-h2c-CkP)*6IT?+&u&5zc7c#U0tukTLbPfhTA@X$0*>;iB2cX_s;%M_wAEI{`htpL zA0jV#mtv{)F||Hur7{Ikv_R2X(U}&NghrVnAsC*?29j{MAFztjk#@#R1^4%9XXnnD z-SeMw?mg$;i*@OAz%XRN85ay`*!P|gLUnZtJw-82u@EFl$UQu89Jh#mb#)3CR~NCP zBjacbq0zL|DU@T!$SsmT^%TX3XHmprkzTK7=065TKSnEab0wSMtLAr44;Y2Tjg!mAnsaD+0y)$vQL4sS_3->SRxR!A;q@|xT@UvgO2 z554sV)5;^(XBLm;TX7nXtVt-BZ~f|fFZ(;E<5z7@b?Yn!+>daE?3I)OPDuw=)N5-G!_T zdD@7iL)kLAcHf5gw;z?|ERqdK6G(k3e)D%Ws}fEGj$*goZs$2bbMcO?MS^uHMgCGu zQ&11L(O_T+W&q5&8^)V0SwC0{*k$zGx1{^2vl?%q!7MI^bnBxeS-rr7t zU#04#35k59aCpra|04b{8&@|$-(UB(wrG25QX<0A?<#9VFB^IVKEYnO1!cG1Txu*m z(>^uYn~x#Ioi?N5KxD`_cVpPddX}Q-2d#nCxK$Y+7acsfJ2DTAn;rGuQeSCT%N;{g z<>uFlu|A!QEayqoz`~YpZ|eY&lNj%pPFvf-QS5m44MvJZM7y>P;j*CEJlo@69@_MJ zve^)m&fofh0aJp!Q?ky~PBNYCdG$jt0sz?y>^U#Y zJ(xPz5$ivjYWrIQ09-IGc#C{Y{j?N7g3am#jPTl{u?2&PT+3{^btGRBZc!>4 z4FmjTynXGu#()604(_8xR=p-O@H~U3=}zV!yVh<7ppEUS>ka?ZSHeY8{3hJ|?(@5|ERs$VWI)IbMou8Zz-;XK zSVP?(6aY;>1@U(u*2qOWV@>IK(cuXlCXAGfo4;YFhZ7q(6N3GW%MWuSqsR1F#Kp5> zKQ*LhZkw0X+6`QhJn(}AcbA72l4f=J-o)d|PK?7PB$M7+7be3o%=^9Mck)sbmS;Cp zh$DDr+KL?;N7!Kl1eAuv@90d*UN`%*PBYIXaAWdj-x*sz=}O(ZJ|wXd5z@(X<95w+ z!vX1Qk8R1j&}3wDdG>Pu^&k3J1IBxG@uD9;iJeo-ePwM2#dzcgv$!(Fiw{k`7G;4QQgeg1Qu5{YEU^v}${?_ZO6uKoTZ6c-0 z8ZM&BNI0d^2g?SRu;jMM-3I!1N{4`c?D0#p3YHGzpiK1SZMaBfC>)U;bZhR21R|r~69J3G;`90Ub`>mDKQIjK`j3IpkHIqf zktCtfv@jmA9BPe*Bp&mQ$Nl;pA#|foK{5ANEQSq9dU&`$-uo*UbN`Q-{}}!^{sIbH Vz@^D(R6+m%002ovPDHLkV1gV@kwE|e literal 0 HcmV?d00001 diff --git a/docs/img/fields/edgesSQL_fields/columns/reverseCostOFF.png b/docs/img/fields/edgesSQL_fields/columns/reverseCostOFF.png new file mode 100755 index 0000000000000000000000000000000000000000..31c183d608596dab40a6fe6f9d80ce2d2a4fb6fb GIT binary patch literal 2974 zcmV;P3t{w$P)Or}s`eTW2AQh9p3MkwYW_ltqs?$RHEJ9T3zrVP+6HK~YeVqc|`K$|?g$297v0 zIu446U|a%$kPxzOWbGxLbb77ssy813n1m?kffEV!`}oeg_f_5czgxH7t18svbOI00 zEd{}cfajJ&aGRe$$8qf)W`^K?5R?z9-cc}MAN)#d4`z%2M(G{F|&XFfJ7qs`JShX&+OZGVE!ZXNRs3$1fHR! zqr;q@mU>Oe0zgK3n$_0n?6a}JtCnZTxE{$~!R>YrQXvG+znA;mp%xAyLLgCuCrx-@ z;S*EhB$B9Fm{#8odw{gq8=A9e29j)&4gGd!SeaXrNBPGb+cD3P;a7`a={RHk` zw>o!3Z?h(Dl&1GOn19&4Y3HZs%w9qsJ^sNZPtO=3M-XWLdRyNiUcAS)WySUqi@$E( zDM~gmZ^y#aYi9Q9AL^($y|=!u)hRNK8EGW!4OMl`T|P{TLXB|=;eyuUVw-MsS{RK0 z0DBsXPg^yk(v6}(cXL&Bv(3X2bg&^dK01^_1HIiD+ErWGXm$EAB1Iv__!Og@0M^-7 zTiIZB27r=lO$pH&@u2eyGhNNqwJlaBgGrG(E;UI@`Ma8{YFccb0FYv3m?=IYghGHB zdwpeXYqyWZ1SM6+rbM8ovPugRuos=IB|_uUlhlG?rCPuNM^oX)C+$fy6GZ@=?W;Fe z{ad{Fje}Vl*QqVft=XX2vh1FWZM%-u=ElU4fIGiAR$|CrWa27zt$wRw!rC3LB+<=> z^8cK_+qnJdL;(QX{=ZF!r#<_|p0#QUm2O_~UD%5|Ud@oRJuQvhL1F~{iamoEQddN4 zJ$tGteA4pxf%O2}cwqIL-zG2LnxCNzG=Kiq$`x^X2?j6ak)7W0TAe{EvaK7 zQ!~@0*wJwAYs?sL^LJT7!8h+|9*a^#ZAh?OyP0_fuA@<$2Y4e0v6S}O zTFqTPmY}3E5edL{wpoxiB1}diBnUR>hIRXH#(`ILC zK73~Oq29o;44L3|izenwVBbDk_Gps!WzlWD{T?8USF>)*thH1JsYEP<}H3S+eF%b(y+H;k;!GatFsG3NWa*#UG{FNN+rJ3 zNT}6H+->j1MD$fdNPbOZBoZOIBo-gTc2$30SaV4{91dkMrP7DiHJIIzkz9w_uQVxz zfO~v?uBY+THy1B=L_ur-_xA=wkSQ&tt*NP^s2+m#F|m;vQGj7sudVb%JGyKq3SkF1 zCWi4NT15XC2JC12h^DW!kTgyD83vG4mzW`FX=o}ftfDm$rr59`;jmS0FXGhP`H7Eh z-*YN+>1ZhttO%j*n7L!!bY(xygig&8t~ypSU4Q&y+N=o*1Z;>RL^*Bwj^|SQ`Q!iq z5JG)K7?btb%B)=5xxH&%&Ho^5_Y;E~{&+i3r=;q39{;Lt?t<99p(ho}5LboSjUfmD z0B12x#+szsSe%1cKx3{*R4$&ZwGFPNkFYV(0=29R=GPDaB= z?;UM)asb$8t*dGEU;sfvc2-c)$J>wF#!eY6M*xBmQ?ez;KR9s4%3#2Op4N(bJ9m|9 z&Qf!})x`n`6%nyIaUc-5wjmiiYr**Lf;FoPit0N(jL+5CTvgHPK@k(~iK{sHkJFX_ zU~lu$4?b-ll`}RN4Kf4}@(`J)v98Sz_?L?pNi}+DS3{l6!(sr;dV8Ec3;?7;t7dHt zjW*C|LkIvsluD~`HP?2y0vG_ZKBv=jb;{&CjvgP20SHPar3sG1Kq~aAKx=)A!;b-g z^SgT7gT0Z8Xr(&X)lz46vlwu|MY*C#&|qYn`?sz4xtZDtZ1(f7-Kk(=&5hT%14_mOeLcRrJ7W6x&O7y|%K<#!(cl zN}9Ut@e~1|K@I!OqKSEbqYB>Nw|VK#cBfw;QAg)2dMVxzK5OL*-c8#U&wkAX(#XtN zYx1&`2-v}f&}YxRuW<8{*@vWA%l1D%`WMPpVoXWos_TmjFZeN#q99{JvWzBy2-a)3 zq9!87bg6bmv@Yomwx*`6u#(|`q~*G}6xqPV0PM9?SDkVC5kZh5MO1v46agq>N5<4w zT_~#Yu|QBVRaA1qm6D>*frt&s$$_fck`onvOp0|0sflXsh&uw+)#tvc^kY&SYDh{6 zmmt6aM@w0q&BGBSDU@mAN2o{uQXOgRxN!bt8=;I#Ptj4gu4-@hFK`+fFB-%2{5I81 z-4a0{f69mbM$)s&*oa5A>UbXG@hxn_;H`|K$nmjAsaS} z0cw@%bn%&t^t5aCEG;Y3Xf%DdfB9U?=h~skwO*fZ@BRXt)pkvDtwxiRJyEaMU-{6N z&$T>5gNUXV?L@t;2{WhIfEzgial4NjjaBy(&4O#i(;rUI&tCojX zEe{W`+M5kU30*D^uY;S1+wG>P8@!`&yRUrlf2X_od4bYt)%@S-c=!r|hv!z~|8N^C UWE2XS(*OVf07*qoM6N<$f~o4XMgRZ+ literal 0 HcmV?d00001 diff --git a/docs/img/fields/edgesSQL_fields/columns/source.png b/docs/img/fields/edgesSQL_fields/columns/source.png new file mode 100755 index 0000000000000000000000000000000000000000..e94cf13ff5711eb66ca2fb7ee6827aa6dede7488 GIT binary patch literal 1827 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 YfXjm`)UIa%f=>wqZe?#-33HGBALY@h!~g&Q literal 0 HcmV?d00001 diff --git a/docs/img/fields/edgesSQL_fields/columns/y1.png b/docs/img/fields/edgesSQL_fields/columns/y1.png new file mode 100755 index 0000000000000000000000000000000000000000..4ba97a4db3cbb7489af289abece7aaf11406e006 GIT binary patch literal 799 zcmV+)1K|9LP)3nU zg}YCURb{DMT7Lfab2Qp$3Zz8@;6>VKJvZ7y83m&;Hws2$ZZzgb!D!5lg3*{8jk!@U zOk(c;o9)$MG1IQVhp_(KU78wDy5{LW1_lO(fA7yPsSfrkSOMWu0{*=}yP(wDIcv$2 zf1}YrjhJH;aZL{7+O=rw^ZyJC3=IF@?OCw-mv@q{G}Hf&SC&*2_uu7_V5QX7{~s<^ zd_}f*+RA7DVBF=IUdhX!{%2>Ca;ctO=O{TE15~Z&xQt?=R8B8mcjwXO`3JH|L)2ZYT?#a&o`|NXmg=jo^KqdP)q1^Br+43wmqn3$*> dbEANs002bB*+Q3_Ml}Ec002ovPDHLkV1h^HiI4yQ literal 0 HcmV?d00001 diff --git a/docs/img/fields/edgesSQL_fields/edge_schema.png b/docs/img/fields/edgesSQL_fields/edge_schema.png new file mode 100755 index 0000000000000000000000000000000000000000..ca43651a89a1a17baed9dcfe2e7a7f0ea1290789 GIT binary patch literal 2239 zcmV;w2tfCVP)0018d0ssI2unZj500003b3#c}2nYz< z;ZNWI000nlMObuGZ)S9NVRB^vQ)qQ`bY*g5g3t*700>)2L_t(|+U=ZaR1{Yh$8S}2 zLwC~~OSibN$Y3Iy21OAObkJy`_ezA+fAZwv*?Y_@?{(|oX_{9ZvX(6-LjYnul^(e06~!CtCK+x1R$Kg9v}$fbw>?t++1;z z-mAU=2#TVpuCi{a$cfyS@ZTpIeW~qde>WfretUac)h`GBb?iS+n)UnHPxG-VPE-fR zulR%oOvCNOh{IV$zw0=rPF^d%nPVg9GV6@&PC|Ixxx2r&Ahy`jec9$^ZpMVJ?q)*N zvFtlfmB2UuEGS~-Z~%f*+&L8d!!Kp^8p?FE|LS$KKH?Do+839PM8^GGCPxOAcmMz_b>XqK2QJ>N)99JGF50kqmNmDl>ADu`6)E}Q#L|x_)Kr=kvp@MtNllBs zWW>@vq23m_tiKoktt&geBl>}DP-154sc=8eof|LO{UcqT92)(=er;lATFM?TB0IC7 z-PbVH89TzRNEgPYrly6@L1{aquB*EgeEQ+(*t7b+hf-6|r61n2Vye9n0d#rFw%u0@ z{lZgDpHB|o;%&!kzrodF>C%0tGSZSmhF8QLI$w(bw55sP?=7_pK9X`a>H7&ahrc^^ zzYPEYsji$W8L=TDBQ<%w?Zbl`LUMEsw6 z{R=S}CA!|nekOq@eA!@u)7hfVVjMprVXD2l5guh zd$c^ShxnHKi@$O{|H99~NRP!awiswcVL`q#|NZ5^qkQ^z%3oWcQ1K-lk^^8H83_pn z0BD6=VPIm?*=}gq(Jrf(w-rV%^owb)RJvAXl!gXizjQw)lY=7#S;tdC0wN@CzKfU5 zwBadajRq1a?-lDxh>gTA=ba=8q(uOnlazsw zPrN*nLbyWGXs(d8cAUYe)lG;80Hi=9Y%Z6-Y)6`= zX2b;mN@OJFxy(PlaXh!DOL7Le_yoInDa+373fUIj@927|NZ9nGUV}i;+l*6UL$UGH z;3KPtckMq?^}4hJ`q9bIUHM~nhpu%HQA}0Jmn$CiK6upJ(4axUCIFD8zE&-;6p;X( z-xvTu%0|^63P&25yrn%JT4nWW!9Y=W&q>liEFv4~8W5OZA-;3}jp&y!3{-~0Y?4!%$b|*ZknX4(8&{dmlINct8YVq zbgJj2<#OhY#*37VD!qY2tV9$b_5DkE6>qc)-FEwQT2UhnwETABsawXb?$#739bl?0 zD=2FL0H*PF*5zkiuGE^JnO@vT1EVZXNxx|{*4?^W=fNH6;jH@cXxalM4NP-wd9@mE zNxh@`tt*LLG%>a##%4+ELBEgZZ(b_j8|I&((U;mz^PXy7-3$Q08ZvLwQrX^}ei>Sh zvGpW($A0DQCDz(nOoy;y=Y_WbA;C8zYcQY z0?T^dmY~+i!^=H)sE~oxtPK%M?0V>)o?YP9pv2h7m445f7#4rv2*0&k28-Whyu&;f zy6rx^WO0&!BetD3ew^t38x#Sln=^fEl}}-sOapSQ{Zgo=qjJ0x>l~G+gIBc3}XXyvx+5*Jl5=%MTc(+h^lX8_jCDb&z3=a z>{j0DPVL)$KTVsz-#3aM8nmdsL@EK=I5*&IwsEiih)x>68AXFM;1L z#{L9@!TQEvu)Z-EtZxkFPk{fwsz)>}EjS6deq%6L-xv(mHwN=|`5#m`Z4kayJU{>d N002ovPDHLkV1hulVqO3M literal 0 HcmV?d00001 diff --git a/docs/img/fields/edgesSQL_fields/edge_table.png b/docs/img/fields/edgesSQL_fields/edge_table.png new file mode 100755 index 0000000000000000000000000000000000000000..d7ef8de976e2d24a98e2d12377f66d3dae3131d3 GIT binary patch literal 2537 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 CJ;O}^ literal 0 HcmV?d00001 diff --git a/docs/img/functions/KSP.png b/docs/img/functions/KSP.png new file mode 100755 index 0000000000000000000000000000000000000000..f3e52c10f1b8eb879c4ccd61b9082f8071efdd1c GIT binary patch literal 1570 zcmV+-2Hp9IP)LRn#I+<9*GEw8iC(h~6 zMSLv2At)eBR2XW2YD+8hf$cr}qvc_N>axwW`1}0RZ=m3t1QmMS#{8tD; zaJgKH<&a*d2gw4C43Eb%=nO`qvCknOgfYet8o;r!s+0ne0Gtj`E#S001dI_l1i<0_ zfo-k@$pTKGTW|<~lRE@Uc?RJCoT(ZE!2(X>5BhTLOGva>dt%iWze={s6Zr%}SW{WJ zLf#a=D(~Y_Pp<7N{PEQFX0?&#=`W0)oxNa+KWf>(G`+ZyBnS$P!RCibr>ABlgnAG# zcTkS?a|kc>?z;MtHS+q{oDGQ~3|0Bs4Zpi(uHF+DK<#XAYEZI#CN!$aA5+8L?D;iBWU^mk=Hq>iQz{Gwol zF==cnTfgywC~IR%xI4mTwNhyoB*h9?G=w<*;W7S}B@oMSFvf_+8X27s7kvC|a|anU z0ub$-PE^p63yKewD!vl86s_A`(~WT3Z<{t< z_D$P-p!BEj)BVmJywtl-jBG96evC-WFFv?+mWVpUC{3-Wzs*0&Nz0!jVG{@;L=B9d zII^xpR(iRmiyZ6<(x|#~;qa+@BO=ClgJg#p5=lg6MtYHAXH`|TjbtSQ5-qk-?GV1! zMLaDb%!7icp06jpAE~)^@t#S2?T@;^smZZCIwIVIrzTDG?rZs)z2ehm#{{sL43{A~ zYGlh1d2zMY&}|}m1xOR7tly9tc(-Ilddkwx`zs%rdd@t(B2SwBVZzL;wMROn%f3zt zrNJ~0Z{gaJ?BKrEHXCDv5Yy9xZawb8^>*vjYE5djmhkfCTHj8vy*PxX=YdZ33-F^1 z*+Ih?W5PqaV9P9B;g{PB%7XIWd(C=#_feBmb0*K$+^*OyTbJ9qQocyyf)S#RTeNre zWY&;F1cnJ>@z^;TY4UA_2%$v_=845)?N7D+RR*0(t+!l_4Ud&wEVd`rlkI^!)E&5| ztm@MB`*;fRoJTmp3Giq0CS+yDJuZ>$X)rwNvDu<2>9eA=H*P#I!%V(v8CM*UyL?&h z@?{cn#B<+lzhC>b`gmEL){M-W>itKnyrN@+Xx>rM(5CXzO0@|gW9!9Z7h1`GJVJsM z@mcOC^s<8Dt6EGxym9_!bDP#+G8>e2Cr{P71Pe#NlHDtaNEjj#hS;mzY7IPi_!%qHV%-rY5w^Mta0P&kYzfP+9V^bBm&Qat zTkJO|=6|D`r&uhpQv;bBcP&||`h3rlC@7SG|C>vfuZ#{A^7(w)i;25`8=$?RM(-OI z$aO*b`{xc+sKSziZQEQ}eP&DE&yD@uDJ?7|Z|($G+5-LyXuawj=n&ALk7%;9?#PzB zy0$JeA{f47-d?;gjx*q5&ZNbgCJoj_fQSSC+932egfkWAr7`0mE`Vb@gsWkrg?v6A zc7+4Zmu+ExE#Q1WV-#>&)k2;HoWLL8XL|^)u8el2lIPSK?&DB*P7|CQZxm>PQwIoSuG#aDP2sIhtm=FZPU@+KhHibg@8)UbQ UBQ_3GYXATM07*qoM6N<$f&<_G7XSbN literal 0 HcmV?d00001 diff --git a/docs/img/functions/astar.png b/docs/img/functions/astar.png new file mode 100755 index 0000000000000000000000000000000000000000..1218c6d6332eee636508ce330d8109408933be3c GIT binary patch literal 1610 zcmV-Q2DSN#P)thG#Aa2-HUtT?5$ZXFkJY*j37Rfr;$N>xOyOC24p zxD_Z?iVaW;Dq58#k&p-pfxLJ70T6@`nQ1#F^!~nN=FU4WZ_fMYy#G0KU(mDWW*`vE z3RcHQTU(o~yi%*xl8g{c6Aqj0>FL4e^BD|Ar)qyMuXJ^FadL1Z*&&!Fa=HB8gNNP- z2?PR0$C6f~C6XnWGLDXpt(sPyPS@=a05Hawq=sPHbgGm=GC?pqh-wLDJ43)2h(jQl zyg%q&Yl&nDW}sW*5C~@O5IWj3k`977bz?-Z1her6-L>}B725X4*Z1$qy(D|Arq}{k z-zf`{op}nh{(+%^lrykulPFXNBNu6OGL@(tHwFfs@nV2Y9}57pdMU0 zkk^(J79eDjdo`H3RayoBfs%j$uD{IJ>i@`GEXD7Rd3@@EtU=3m51q3#A;OCTKs6K{ z+$OzPsb<>yOo|F@$gB#>T{)ilJR3j6B%dAEv9YTGjDir!C`q(c6x5%J^8a% z%ztfq!t&?<9;K*Pu>GO~hj5ty_U`^c0HD8rdPB;Is(M&6zkuyLb?v72c_n=UQG0P( z%#R~hj4RK`zV>9~vh4L!tceKBv3zDo_r=G>N_q&iw6v^avA-`V?B+OSS#@T1#=nbU#}LFzrS~ z&InZ9EWEE*-n>!a9v&6yXaUIDD?D177RoT%WO6`L}Jz2srA-**i@@^^h0J^%u)7R_hfnAnf zt1r-c-;40NR>giz^>0p6MukOKsViD>VX zFs25&ECM#NO_wuv*8HD$Z%s_Hv1SVc-kB^ZZ3IkHO}9^Gp0BD?YB5{j=07oZ-Q1BD z7=!oQ(V<(j66a()N32aX5ZLuSnCuJwKMfqZ9^(_=2wv+!`NlPa4 z`vmjDlG4Hq3@*sSobb;LLYG6hTyQNUcpS+K!L%JhiQjOMi;D}{6;3d}YD@Ol63h?s zE(5`ARZHqD!3_KXesPAt<+2;(az_UTk{W_(B3CG^xEzE~_YC1_V`J5y)f)2ebOcky zip%xz7|P*r1Oh>)YH6BQsZ=_hj`U;%(*z;JX0v%b9)rR78@XBEnk*GmmH+?%07*qo IM6N<$f~N=xivR!s literal 0 HcmV?d00001 diff --git a/docs/img/functions/astarCost.png b/docs/img/functions/astarCost.png new file mode 100755 index 0000000000000000000000000000000000000000..b3a91a226b8648142b0a3581dda1d3887c35398e GIT binary patch literal 2147 zcmV-p2%PtcP)H??7z1$# z1e5m%J##IQEWr$POB@2h%pF4K_KYkC!JKwuM6d+2@dwXx?W;?)9koB~%Q&1@QmdgU zp~P#_AD6`h2@$R@{Qj}qBtJ2Fq1)0`=O4{EbwysK&|*p`89q6B`Jcw{2S0|c;?hml z_%~eHL?WiV9b>)Xc^Dpj{droU$Fj7w0d@xU&t1_d(n=Hx2+@f8)z-S>Kgum?F>Lg!|WLR)ij2GoJa&KR!&>{9yq) zvFBVVd-}GF1;cv^4l8bCryagtrD$r!f{`=gRz~>oX=R;~@{aHy%4GtGoP7cTKwo_( zDfvW29juGYryQoP-!z+F*eeiq6r@I-AF(>1bWiq`Uq&s>-r#$A-_fVRtGCAl@(=)k zz{NM9^S<8_q*mB|o&|!1+=|D`pE^LZVl{$ND;H$2C=p zJU;w@g>2!r<-t}&RWBiZ?#bF48xt+-CQ!M&xU;dpy%uXAUrXQnCO>HNmi^wA&3AG> zS-0_!b4K(iRc>l(!H_?vC6BjluR6E+qtiOyP-EVFa^Z_JVT)4sC)rw9^pPWxVAz;< zmd}A{Ye;x~kg005Y;&Gqq{1<%L`2Q=k-jk^n>FYQwv6}+__dJ(%0r~-|&}o>x{J% zl&AKdr{?ZD93n!xx@sjQ;tOI{yjQ;D_VnFJlek1qF9(^-FE%E+yKw(4Sy`_{i+k+G z`th|E(rGiitr@_yd40}Ie|6FIYQ3uH>Rsos@Nsr*Kvr&Hb3(+=O1`w{&8UbV36Dcr z^jT434|{!#vo#BlrK`WMty-Zn09eXmKifFd=GLBN5mD>5pDk-N3^EV^0DRs}2=f$i zITQ=GsGAIYk+9c=4G*v7KO8kHTq>%0Fv$7*Y?cD7yvjn)@)ccH?J7 zM*Ys4Z|p)261{AsQs0F!QQLRz27o0A@lvVpz;D68zcOeWRJzV+-1=0}!sFX8ZTQx> zQPpT16Kh+v-G*nN{xep`?VR;{?~ja4+L^v}$JT^UVUMnCTc7E%@3_|%mp#RU4(xV4 z?g$?bO=13>o(J0*0sWD`Zl?U+p|_y|$zH-08a-8fbO#(Nl6!;5b*7c=TAWnhVEnsq_GCPp+T& z;fY~z)6#3yTHY`(i4_96q4;u<(f|OUtNF2@?18eWjn=n3EwgIz^%0xzsjv2 zJu!$6jWy*DHF^vT>!EHEYq~=Z09Je(RD18f?p0O-|9|oHaQF0Zf1!G9Z-;;}!*;Ac zePm@+sY1tbnGm;n?g$nJhpEdxsQc@##dEZ5flJ_9($|<;=&}fSfNxjMm|2n6c5O{a z>Ly7BhO%-o76DjlYT!+b)bH_RW!#u(gx8!>L{{)Bni4%61B^by!~ z9o+4LmeS~yWc!>$2iG6pq;5kTv2(!uH6J=z5B>eB6|G-nCq``1f~9l7%=Jq`gkY#G zKa-O4V_gS}qHNrP7cB{-Fjxf5diVSEPb0py7`<@onn}d#np(l3D?@cY?U;Y*%GjX5 z=W}Cu)}qbY_^d?P05x5@^2?Y?p9&*em^-b*qS6S!heBh_1fMJq31WSQMJu? zPo^i|t!tqHQT9HQ6Bkbu^a>V)CZ>k=QMe#(k?@}zgf540G5^Zgpa8Ni1k-j1h2FzG z9336Wsc?e%Wm|H-mSBF6XBh})t6Gw031;9A@bfhUE|;oTDC}%)$kt~ zp4AYZHZ)ZHT&X4hPDe0REV*147bgyfBNPgasx=r4YPGtpt&Qx-2&M@_h@vPypU+@0 Z{so4M&J|^JrRD$t002ovPDHLkV1lN-5lH|5 literal 0 HcmV?d00001 diff --git a/docs/img/functions/bdAstar.png b/docs/img/functions/bdAstar.png new file mode 100755 index 0000000000000000000000000000000000000000..8e024136d827b9f155cc77090536f4a523730ec3 GIT binary patch literal 2018 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 IM6N<$g2omF)&Kwi literal 0 HcmV?d00001 diff --git a/docs/img/functions/bdDijkstra.png b/docs/img/functions/bdDijkstra.png new file mode 100755 index 0000000000000000000000000000000000000000..759e2be7431b32aea0e869dc8d089f284d99d8d3 GIT binary patch literal 2244 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 d^YbGJ;xBj&P}C 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 literal 0 HcmV?d00001 diff --git a/docs/img/functions/f_pgr_bdAstar.png b/docs/img/functions/f_pgr_bdAstar.png new file mode 100755 index 0000000000000000000000000000000000000000..1d4dc0b2de346f94018b769c525cbe5b54e12950 GIT binary patch literal 4104 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 Ef;iD8GXMYp literal 0 HcmV?d00001 diff --git a/docs/img/functions/f_pgr_bdDijkstra.png b/docs/img/functions/f_pgr_bdDijkstra.png new file mode 100755 index 0000000000000000000000000000000000000000..e5a2d1d0ac765d7a1c5cc40ecdb5aa077d152656 GIT binary patch literal 4313 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 Hu0mjf2G(s2 literal 0 HcmV?d00001 diff --git a/docs/img/functions/f_pgr_bdDijkstraCost.png b/docs/img/functions/f_pgr_bdDijkstraCost.png new file mode 100755 index 0000000000000000000000000000000000000000..846c0a7ebe599add303309ccab8027931b25d7ea GIT binary patch literal 4820 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 literal 0 HcmV?d00001 diff --git a/docs/img/functions/helpButton.png b/docs/img/functions/helpButton.png new file mode 100755 index 0000000000000000000000000000000000000000..497d2df1f03efc60f05784e2a731f36129519bc7 GIT binary patch literal 1063 zcmV+?1laqDP)kd%00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-;n4-pLtahRlj000BVNkl7%Q6rP#gnccM= z|0Mp2<4`+IS|T7#jEEAoRx3dWaA^arR3Sh@1yzU>65`k!LIMe--r!Ji01gqTL@h{d z6qP8YzmU{v>L#Xc{(v;`#%}D`YkR%Bk3-tTvE7zP^uRmK&YSn?`)1y^53go2=)Vqv z9z#49P`>m-Rn;4j$y_eCB?wUvnwtD}yPXhH1#}`Z>GOHrPS=(|Wm%q{n{US0;c!#| z%_)kj&Itgeo9S%f*YMm@GJ_EE)LKFveydq1J>YaYZ^dpG3We(O%Oal0e0S!0t<4e& zHuZGd5JG=0rG6ZaCR5orUT$;OT1pR>QsFlzHgXfOrIGQ!-hHk6?B&?;{!5FA3?aC| zW!)R}AM9!S=BKeeyL@dep7p{9J`_Utl8cGVr5g)}dv|?!{7n3=!YI#EN(hdx>yc01d;Y}0mG=*IKB7<8R3uVLgWG=U{8S>Hmqccg#O*%EZ_)Vg(YW7hKf1r& zY!cE+@$A)UpWBg0DV6d`1yL9toe2d47q8C?jEMr3B=%W;8(h{zD$f|t7!?Id8Lh9gyw$Tq*Y#h!~dYv`N zRIdC+%kLBb0C*1P@bjw61L1tEBKU#q4Y znx?C&rfGUn)3QoFUr>uht@pWruIY_#Gslt2?ys;Z07B@c?&dE~jveala68PWFWk=M z)z1f_l;;3|a=0(l;&n(r42F;Pb(D8gb(`K_zq7yn#K2W=z5CePyXO|uiF6(l?6OMR zJT<3BCI`<=zxhf#Y;N!e+w^{(Blz$OPfkSVKmF>I*=jRO62dsEC@ahHXItzC_5@6l zSOWHNo35`gw%P5WE_+u{EvTwiEE)iW5J6~TjBy-S*`C!wMNyRHWtXe2bdxel8LcSX z0E{m$OQM7^-r!R@O%uuFtv_PQ7RQN6lKlQBL{VJ-^KSw*3?r3F6$%9a`1ha~V?hvX hHrx7)!vCAO{|`a}wG_zMR)zoo002ovPDHLkV1m@+^`Za( literal 0 HcmV?d00001 diff --git a/docs/img/tabs/arguments/arguments_KSP.png b/docs/img/tabs/arguments/arguments_KSP.png new file mode 100755 index 0000000000000000000000000000000000000000..f68606738d2f3037759aca28025d6e8ebdeea660 GIT binary patch literal 11574 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�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 O0%Rl<#cM==1pj~6;8EKE literal 0 HcmV?d00001 diff --git a/docs/img/tabs/arguments/arguments_dijkstra.png b/docs/img/tabs/arguments/arguments_dijkstra.png new file mode 100755 index 0000000000000000000000000000000000000000..1d9c9318d3dee2f56f77efb4c470d5db44e04f1d GIT binary patch literal 10669 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 JM(9Vt{{o-$^LqdQ literal 0 HcmV?d00001 diff --git a/docs/img/tabs/arguments/plus_button.png b/docs/img/tabs/arguments/plus_button.png new file mode 100755 index 0000000000000000000000000000000000000000..f2a9289b1bc41cd92d1db4a76bcf75e14e073a9b GIT binary patch literal 900 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/img/tabs/edges_SQL/dijkstra-KSP_edgesSQL.png b/docs/img/tabs/edges_SQL/dijkstra-KSP_edgesSQL.png new file mode 100755 index 0000000000000000000000000000000000000000..7a5e85508ccd6f99a150af7d0e7b98f852dcbdd5 GIT binary patch literal 20214 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 b?;RGe9$W%;;iPr%NdgpPRHUmUjRXG|y1=D5 literal 0 HcmV?d00001 diff --git a/docs/img/tabs/execute/execute.png b/docs/img/tabs/execute/execute.png new file mode 100755 index 0000000000000000000000000000000000000000..8406c4be1bdeb794a131335b176fc00c4673ad84 GIT binary patch literal 9601 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 U|D >) < function >: < parameter > BBOX(< bbox >) +``` + +Where: + +- M = when Export Merged button is used +- < U|D >: + - U = Undirected + - D = Directed +- < bbox > = xMin yMin, xMax yMax diff --git a/functions/AstarBase.py b/functions/AstarBase.py new file mode 100755 index 0000000..0775461 --- /dev/null +++ b/functions/AstarBase.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +# /*PGR-GNU***************************************************************** +# File: AstarBase.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - cayetanobv +# - cvvergara +# - anitagraser +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ + +from __future__ import absolute_import +from .DijkstraBase import DijkstraBase +from psycopg2 import sql + + +class AstarBase(DijkstraBase): + + def __init__(self, ui): + DijkstraBase.__init__(self, ui) + + @classmethod + def getControlNames(self, version): + return self.commonControls + self.commonBoxes + self.astarControls + [ + 'labelSourceIds', 'lineEditSourceIds', 'buttonSelectSourceIds', + 'labelTargetIds', 'lineEditTargetIds', 'buttonSelectTargetIds', + ] + + @classmethod + def getQuery(self, args): + ''' returns the sql query in required signature format of pgr_dijkstra ''' + return sql.SQL(""" + SELECT seq, '(' || start_vid || ',' || end_vid || ')' AS path_name, + path_seq AS _path_seq, start_vid AS _start_vid, end_vid AS _end_vid, + node AS _node, edge AS _edge, cost AS _cost, lead(agg_cost) over() AS _agg_cost + FROM {function}(' + {innerQuery} + ', + {source_ids}, {target_ids}, {directed}, + heuristic := {astarHeuristic}, + factor := {astarFactor}, + epsilon := {astarEpsilon}) + """).format(**args) diff --git a/functions/CostBase.py b/functions/CostBase.py new file mode 100755 index 0000000..a36e399 --- /dev/null +++ b/functions/CostBase.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +# /*PGR-GNU***************************************************************** +# File: CostBase.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - cayetanobv +# - cvvergara +# - anitagraser +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ + +from __future__ import absolute_import +from psycopg2 import sql +from .FunctionBase import FunctionBase + + +class CostBase(FunctionBase): + + def __init__(self, ui): + FunctionBase.__init__(self, ui) + + @classmethod + def isSupportedVersion(self, version): + ''' Checks supported version ''' + # valid starting pgr v2.1 + return version >= 2.1 + + @classmethod + def canExportMerged(self): + return False + + def prepare(self, canvasItemList): + resultNodesTextAnnotations = canvasItemList['annotations'] + for anno in resultNodesTextAnnotations: + anno.setVisible(False) + canvasItemList['annotations'] = [] + + def getQuery(self, args): + ''' returns the sql query in required signature format of pgr_dijkstra ''' + return sql.SQL(""" + SELECT row_number() over() AS seq, + start_vid , end_vid, agg_cost AS cost, + '(' || start_vid || ',' || end_vid || ')' AS path_name + FROM {function}(' + {innerQuery} + ', + {source_ids}, {target_ids}, {directed}) + """).format(**args) + + def getExportQuery(self, args): + args['result_query'] = self.getQuery(args) + + return sql.SQL(""" + WITH + result AS ( {result_query} ) + SELECT result.*, ST_MakeLine(a.the_geom, b.the_geom) AS path_geom + + FROM result + JOIN {vertex_schema}.{vertex_table} AS a ON (start_vid = a.id) + JOIN {vertex_schema}.{vertex_table} AS b ON (end_vid = b.id) + """).format(**args) + + def draw(self, rows, con, args, geomType, canvasItemList, mapCanvas): + ''' draw the result ''' + self.drawCostPaths(rows, con, args, geomType, canvasItemList, mapCanvas) diff --git a/functions/DijkstraBase.py b/functions/DijkstraBase.py new file mode 100755 index 0000000..f48fb03 --- /dev/null +++ b/functions/DijkstraBase.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +# /*PGR-GNU***************************************************************** +# File: DijkstraBase.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - cayetanobv +# - cvvergara +# - anitagraser +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ + +from __future__ import absolute_import +from pgRoutingLayer import pgRoutingLayer_utils as Utils +from .FunctionBase import FunctionBase +from psycopg2 import sql + + +class DijkstraBase(FunctionBase): + + def __init__(self, ui): + FunctionBase.__init__(self, ui) + + @classmethod + def getControlNames(self, version): + ''' returns control names. ''' + return self.commonControls + self.commonBoxes + [ + 'labelSourceIds', 'lineEditSourceIds', 'buttonSelectSourceIds', + 'labelTargetIds', 'lineEditTargetIds', 'buttonSelectTargetIds'] + + def prepare(self, canvasItemList): + resultPathsRubberBands = canvasItemList['paths'] + for path in resultPathsRubberBands: + path.reset(Utils.getRubberBandType(False)) + canvasItemList['paths'] = [] + + @classmethod + def getQuery(self, args): + ''' returns the sql query in required signature format of pgr_dijkstra ''' + return sql.SQL(""" + SELECT seq, '(' || start_vid || ',' || end_vid || ')' AS path_name, + path_seq AS _path_seq, start_vid AS _start_vid, end_vid AS _end_vid, + node AS _node, edge AS _edge, cost AS _cost, lead(agg_cost) over() AS _agg_cost + FROM {function}(' + {innerQuery} + ', + {source_ids}, {target_ids}, {directed}) + """).format(**args) + + def getExportQuery(self, args): + return self.getJoinResultWithEdgeTable(args) + + def getExportMergeQuery(self, args): + return self.getExportManySourceManyTargetMergeQuery(args) + + def draw(self, rows, con, args, geomType, canvasItemList, mapCanvas): + columns = [2, 5, 6] + self.drawManyPaths(rows, columns, con, args, geomType, canvasItemList, mapCanvas) diff --git a/functions/FunctionBase.py b/functions/FunctionBase.py index e1b2ecc..02a0e30 100755 --- a/functions/FunctionBase.py +++ b/functions/FunctionBase.py @@ -1,39 +1,76 @@ -from builtins import str -from builtins import object -from qgis.core import (QgsMessageLog, Qgis, QgsGeometry,QgsWkbTypes) -from qgis.gui import QgsRubberBand -from qgis.PyQt.QtGui import QColor +# -*- coding: utf-8 -*- +# /*PGR-GNU***************************************************************** +# File: FunctionBase.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - cayetanobv +# - AasheeshT +# - sanak +# - cvvergara +# - anitagraser +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ + +from qgis.PyQt.QtCore import QSizeF, QPointF +from qgis.core import (QgsGeometry, QgsWkbTypes, QgsTextAnnotation) +from qgis.PyQt.QtGui import QColor, QTextDocument +from qgis.gui import QgsRubberBand, QgsMapCanvasAnnotationItem +from psycopg2 import sql from pgRoutingLayer import pgRoutingLayer_utils as Utils class FunctionBase(object): + minPGRversion = 2.1 + # the mayority of the functions have this values exportButton = True exportMergeButton = True exportEdgeBase = False commonControls = [ - 'labelId', 'lineEditId', - 'labelSource', 'lineEditSource', - 'labelTarget', 'lineEditTarget', - 'labelCost', 'lineEditCost', + 'labelId', 'lineEditId', + 'labelSource', 'lineEditSource', + 'labelTarget', 'lineEditTarget', + 'labelCost', 'lineEditCost', 'labelReverseCost', 'lineEditReverseCost'] commonBoxes = [ - 'checkBoxUseBBOX', - 'checkBoxDirected', - 'checkBoxHasReverseCost'] + 'checkBoxUseBBOX', + 'checkBoxDirected', + 'checkBoxHasReverseCost'] astarControls = [ - 'labelX1', 'lineEditX1', - 'labelY1', 'lineEditY1', - 'labelX2', 'lineEditX2', - 'labelY2', 'lineEditY2'] + 'labelX1', 'lineEditX1', + 'labelY1', 'lineEditY1', + 'labelX2', 'lineEditX2', + 'labelY2', 'lineEditY2', + 'labelAstarHeuristic', 'selectAstarHeuristic', + 'labelAstarFactor', 'selectAstarFactor', + 'labelAstarEpsilon', 'selectAstarEpsilon', 'showAstarEpsilon'] + def __init__(self, ui): + self.ui = ui + self.minVersion = 3.0 + self.maxVersion = 3.0 @classmethod def getName(self): return '' - + @classmethod def getControlNames(self, version): return self.commonControls + self.commonBoxes + [ @@ -41,13 +78,11 @@ def getControlNames(self, version): 'labelTargetIds', 'lineEditTargetIds', 'buttonSelectTargetIds', ] - - @classmethod def isEdgeBase(self): ''' checks if EdgeBase is set. ''' return self.exportEdgeBase - + @classmethod def canExport(self): ''' checks if exportButton is set ''' @@ -60,150 +95,113 @@ def canExportMerged(self): @classmethod def isSupportedVersion(self, version): - ''' returns true if version is between 2 and 3.0 ''' - return version >= 2.0 and version < 3.0 + ''' returns true if version is greater than minPGRversio ''' + return version >= self.minPGRversion @classmethod def whereClause(self, table, geometry, bbox): ''' returns where clause for sql parameterising ''' if bbox == ' ': - return ' ' + return sql.SQL(' WHERE true ') else: - return 'WHERE {0}.{1} {2}'.format(table, geometry, bbox) + return sql.SQL(' WHERE {0}.{1} {2}').format(table, geometry, bbox) def prepare(self, canvasItemList): pass - + + @classmethod def getQuery(self, args): - return '' - + pass + + @classmethod def getExportQuery(self, args): - return '' + pass + @classmethod def getExportMergeQuery(self, args): - return 'NOT AVAILABLE' - + pass + def draw(self, rows, con, args, geomType, canvasItemList, mapCanvas): pass - + def getJoinResultWithEdgeTable(self, args): '''returns a query which joins edge_table with result based on edge.id''' args['result_query'] = self.getQuery(args) - query = """ + query = sql.SQL(""" WITH - result AS ( %(result_query)s ) - SELECT + result AS ( {result_query} ) + SELECT CASE - WHEN result._node = %(edge_table)s.%(source)s - THEN %(edge_table)s.%(geometry)s - ELSE ST_Reverse(%(edge_table)s.%(geometry)s) + WHEN result._node = {edge_table}.{source} + THEN {edge_table}.{geometry} + ELSE ST_Reverse({edge_table}.{geometry}) END AS path_geom, - result.*, %(edge_table)s.* - FROM %(edge_table)s JOIN result - ON %(edge_table)s.%(id)s = result._edge ORDER BY result.seq - """ % args - return query - - - def getExportOneSourceOneTargetMergeQuery(self, args): - ''' returns merge query for one source and one target ''' - args['result_query'] = self.getQuery(args) - - args['with_geom_query'] = """ - SELECT - CASE - WHEN result._node = %(edge_table)s.%(source)s - THEN %(edge_table)s.%(geometry)s - ELSE ST_Reverse(%(edge_table)s.%(geometry)s) - END AS path_geom - FROM %(edge_table)s JOIN result - ON %(edge_table)s.%(id)s = result._edge - """ % args - - args['one_geom_query'] = """ - SELECT ST_LineMerge(ST_Union(path_geom)) AS path_geom - FROM with_geom - """ - - args['aggregates_query'] = """SELECT - SUM(_cost) AS agg_cost, - array_agg(_node ORDER BY seq) AS _nodes, - array_agg(_edge ORDER BY seq) AS _edges - FROM result - """ - - query = """WITH - result AS ( %(result_query)s ), - with_geom AS ( %(with_geom_query)s ), - one_geom AS ( %(one_geom_query)s ), - aggregates AS ( %(aggregates_query)s ) - SELECT row_number() over() as seq, - _nodes, _edges, agg_cost, path_geom - FROM aggregates, one_geom - """ % args + result.*, {edge_table}.* + FROM {edge_schema}.{edge_table} JOIN result + ON {edge_table}.{id} = result._edge ORDER BY result.seq + """).format(**args) return query - def getExportManySourceManyTargetMergeQuery(self, args): ''' returns merge query for many source and many target ''' - args['result_query'] = self.getQuery(args) + queries = {} + queries['result_query'] = self.getQuery(args) - args['with_geom_query'] = """ - SELECT + queries['geom_query'] = sql.SQL(""" + SELECT seq, result.path_name, CASE - WHEN result._node = %(edge_table)s.%(source)s - THEN %(edge_table)s.%(geometry)s - ELSE ST_Reverse(%(edge_table)s.%(geometry)s) + WHEN result._node = {edge_table}.{source} + THEN {edge_table}.{geometry} + ELSE ST_Reverse({edge_table}.{geometry}) END AS path_geom - FROM %(edge_table)s JOIN result - ON %(edge_table)s.%(id)s = result._edge - """ % args - - args['one_geom_query'] = """ - SELECT path_name, ST_LineMerge(ST_Union(path_geom)) AS path_geom - FROM with_geom - GROUP BY path_name - ORDER BY path_name - """ % args - - args['aggregates_query'] = """ + FROM {edge_schema}.{edge_table} JOIN result + ON {edge_table}.{id} = result._edge + """).format(**args) + + query = sql.SQL("""WITH + result AS ( {result_query} ), + with_geom AS ( {geom_query} ), + one_geom AS ( + SELECT path_name, ST_LineMerge(ST_Union(path_geom)) AS path_geom + FROM with_geom + GROUP BY path_name + ORDER BY path_name + ), + aggregates AS ( SELECT path_name, _start_vid, _end_vid, SUM(_cost) AS agg_cost, array_agg(_node ORDER BY _path_seq) AS _nodes, array_agg(_edge ORDER BY _path_seq) AS _edges - FROM result + FROM result GROUP BY path_name, _start_vid, _end_vid - ORDER BY _start_vid, _end_vid""" - - query = """WITH - result AS ( %(result_query)s ), - with_geom AS ( %(with_geom_query)s ), - one_geom AS ( %(one_geom_query)s ), - aggregates AS ( %(aggregates_query)s ) + ORDER BY _start_vid, _end_vid + ) SELECT row_number() over() as seq, path_name, _start_vid, _end_vid, agg_cost, _nodes, _edges, path_geom AS path_geom FROM aggregates JOIN one_geom USING (path_name) - """ % args + """).format(**queries) return query - - def drawManyPaths(self, rows, con, args, geomType, canvasItemList, mapCanvas): - ''' draws multi line string on the mapCanvas. ''' + @classmethod + def drawManyPaths(self, rows, columns, con, args, geomType, canvasItemList, mapCanvas): + ''' + draws multi line string on the mapCanvas. + ''' resultPathsRubberBands = canvasItemList['paths'] rubberBand = None - cur_path_id = str(-1) + "," + str(-1) + cur_path_id = None for row in rows: cur2 = con.cursor() - args['result_path_id'] = str(row[3]) + "," + str(row[4]) - args['result_node_id'] = row[5] - args['result_edge_id'] = row[6] - args['result_cost'] = row[7] - if args['result_path_id'] != cur_path_id: - cur_path_id = args['result_path_id'] + result_path_id = str(row[columns[0]]) + args['result_node_id'] = sql.Literal(row[columns[1]]) + args['result_edge_id'] = sql.Literal(row[columns[2]]) + + if result_path_id != cur_path_id: + cur_path_id = result_path_id if rubberBand: resultPathsRubberBands.append(rubberBand) rubberBand = None @@ -212,19 +210,21 @@ def drawManyPaths(self, rows, con, args, geomType, canvasItemList, mapCanvas): rubberBand.setColor(QColor(255, 0, 0, 128)) rubberBand.setWidth(4) - if args['result_edge_id'] != -1: - query2 = """ - SELECT ST_AsText(%(transform_s)s%(geometry)s%(transform_e)s) FROM %(edge_table)s - WHERE %(source)s = %(result_node_id)d AND %(id)s = %(result_edge_id)d + if row[columns[2]] != -1: + query2 = sql.SQL(""" + SELECT ST_AsText({transform_s}{geometry}{transform_e}) + FROM {edge_schema}.{edge_table} + WHERE {source} = {result_node_id} AND {id} = {result_edge_id} + UNION - SELECT ST_AsText(%(transform_s)sST_Reverse(%(geometry)s)%(transform_e)s) FROM %(edge_table)s - WHERE %(target)s = %(result_node_id)d AND %(id)s = %(result_edge_id)d; - """ % args - ##Utils.logMessage(query2) + + SELECT ST_AsText({transform_s}ST_Reverse({geometry}){transform_e}) + FROM {edge_schema}.{edge_table} + WHERE {target} = {result_node_id} AND {id} = {result_edge_id} + """).format(**args).as_string(con) + cur2.execute(query2) row2 = cur2.fetchone() - ##Utils.logMessage(str(row2[0])) - assert row2, "Invalid result geometry. (path_id:%(result_path_id)s, node_id:%(result_node_id)d, edge_id:%(result_edge_id)d)" % args geom = QgsGeometry().fromWkt(str(row2[0])) if geom.wkbType() == QgsWkbTypes.MultiLineString: @@ -239,28 +239,26 @@ def drawManyPaths(self, rows, con, args, geomType, canvasItemList, mapCanvas): resultPathsRubberBands.append(rubberBand) rubberBand = None - + @classmethod def drawOnePath(self, rows, con, args, geomType, canvasItemList, mapCanvas): ''' draws line string on the mapCanvas. ''' resultPathRubberBand = canvasItemList['path'] for row in rows: cur2 = con.cursor() - args['result_node_id'] = row[1] - args['result_edge_id'] = row[2] + args['result_node_id'] = sql.Literal(row[1]) + args['result_edge_id'] = sql.Literal(row[2]) args['result_cost'] = row[3] - if args['result_edge_id'] != -1: - query2 = """ - SELECT ST_AsText(%(transform_s)s%(geometry)s%(transform_e)s) FROM %(edge_table)s - WHERE %(source)s = %(result_node_id)d AND %(id)s = %(result_edge_id)d + if row[2] != -1: + query2 = sql.SQL(""" + SELECT ST_AsText({geom_t} FROM {edge_schema}.{edge_table} + WHERE {source} = {result_node_id} AND {id} = {result_edge_id} UNION - SELECT ST_AsText(%(transform_s)sST_Reverse(%(geometry)s)%(transform_e)s) FROM %(edge_table)s - WHERE %(target)s = %(result_node_id)d AND %(id)s = %(result_edge_id)d; - """ % args - ##Utils.logMessage(query2) + SELECT ST_AsText(ST_Reverse({geom_t}) FROM {edge_schema}.{edge_table} + WHERE {target} = {result_node_id} AND {id} = {result_edge_id}; + """).format(**args) + cur2.execute(query2) row2 = cur2.fetchone() - ##Utils.logMessage(str(row2[0])) - assert row2, "Invalid result geometry. (node_id:%(result_node_id)d, edge_id:%(result_edge_id)d)" % args geom = QgsGeometry().fromWkt(str(row2[0])) if geom.wkbType() == QgsWkbTypes.MultiLineString: @@ -271,12 +269,77 @@ def drawOnePath(self, rows, con, args, geomType, canvasItemList, mapCanvas): for pt in geom.asPolyline(): resultPathRubberBand.addPoint(pt) + @classmethod + def drawCostPaths(self, rows, con, args, geomType, canvasItemList, mapCanvas): + resultPathsRubberBands = canvasItemList['paths'] + rubberBand = None + cur_path_id = -1 + for row in rows: + cur2 = con.cursor() + args['result_path_id'] = row[0] + args['result_source_id'] = sql.Literal(row[1]) + args['result_target_id'] = sql.Literal(row[2]) + args['result_cost'] = row[3] + if args['result_path_id'] != cur_path_id: + cur_path_id = args['result_path_id'] + if rubberBand: + resultPathsRubberBands.append(rubberBand) + rubberBand = None + rubberBand = QgsRubberBand(mapCanvas, Utils.getRubberBandType(False)) + rubberBand.setColor(QColor(255, 0, 0, 128)) + rubberBand.setWidth(4) + if args['result_cost'] != -1: + query2 = sql.SQL(""" + SELECT ST_AsText( ST_MakeLine( + (SELECT {geometry_vt} FROM {vertex_schema}.{vertex_table} WHERE id = {result_source_id}), + (SELECT {geometry_vt} FROM {vertex_schema}.{vertex_table} WHERE id = {result_target_id}) + )) + """).format(**args) + # Utils.logMessage(query2) + cur2.execute(query2) + row2 = cur2.fetchone() + # Utils.logMessage(str(row2[0])) + geom = QgsGeometry().fromWkt(str(row2[0])) + if geom.wkbType() == QgsWkbTypes.MultiLineString: + for line in geom.asMultiPolyline(): + for pt in line: + rubberBand.addPoint(pt) + elif geom.wkbType() == QgsWkbTypes.LineString: + for pt in geom.asPolyline(): + rubberBand.addPoint(pt) - - - def __init__(self, ui): - self.ui = ui - self.minVersion = 3.0 - self.maxVersion = 3.0 + # TODO label the edge instead of labeling the target points + if rubberBand: + resultPathsRubberBands.append(rubberBand) + rubberBand = None + resultNodesTextAnnotations = canvasItemList['annotations'] + for row in rows: + cur2 = con.cursor() + args['result_seq'] = row[0] + args['result_source_id'] = sql.Literal(row[1]) + result_target_id = row[2] + args['result_target_id'] = sql.Literal(result_target_id) + result_cost = row[3] + query2 = sql.SQL(""" + SELECT ST_AsText( ST_startPoint({geometry}) ) FROM {edge_schema}.{edge_table} + WHERE {source} = {result_target_id} + UNION + SELECT ST_AsText( ST_endPoint( {geometry} ) ) FROM {edge_schema}.{edge_table} + WHERE {target} = {result_target_id} + """).format(**args) + cur2.execute(query2) + row2 = cur2.fetchone() + + geom = QgsGeometry().fromWkt(str(row2[0])) + pt = geom.asPoint() + textDocument = QTextDocument("{0!s}:{1}".format(result_target_id, result_cost)) + textAnnotation = QgsTextAnnotation() + textAnnotation.setMapPosition(geom.asPoint()) + textAnnotation.setFrameSize(QSizeF(textDocument.idealWidth(), 20)) + textAnnotation.setFrameOffsetFromReferencePoint(QPointF(20, -40)) + textAnnotation.setDocument(textDocument) + + QgsMapCanvasAnnotationItem(textAnnotation, mapCanvas) + resultNodesTextAnnotations.append(textAnnotation) diff --git a/functions/__init__.py b/functions/__init__.py deleted file mode 100755 index e69de29..0000000 diff --git a/functions/alphashape.py b/functions/alphashape.py deleted file mode 100755 index 88290af..0000000 --- a/functions/alphashape.py +++ /dev/null @@ -1,171 +0,0 @@ -from __future__ import absolute_import - -from builtins import str -from qgis.core import QgsCoordinateReferenceSystem, QgsCoordinateTransform, QgsPoint, QgsMessageLog, QgsProject -from qgis.gui import QgsRubberBand -import psycopg2 -from pgRoutingLayer import pgRoutingLayer_utils as Utils -from .FunctionBase import FunctionBase - -class Function(FunctionBase): - - @classmethod - def getName(self): - ''' returns Function name. ''' - return 'alphashape' - - @classmethod - def getControlNames(self, version): - ''' returns control names for this function. ''' - self.version = version - return self.commonControls + self.commonBoxes + [ - 'labelId', 'lineEditId', - 'labelSource', 'lineEditSource', - 'labelTarget', 'lineEditTarget', - 'labelCost', 'lineEditCost', - 'labelReverseCost', 'lineEditReverseCost', - 'labelSourceId', 'lineEditSourceId', 'buttonSelectSourceId', - 'labelDistance', 'lineEditDistance', - 'labelAlpha', 'lineEditAlpha', - 'checkBoxDirected', 'checkBoxHasReverseCost' - ] - - @classmethod - def canExportMerged(self): - return False - - def prepare(self, canvasItemList): - resultAreaRubberBand = canvasItemList['area'] - resultAreaRubberBand.reset(Utils.getRubberBandType(True)) - - def getQuery(self, args): - ''' returns the sql query for pgr_alphashape ''' - args['where_clause'] = self.whereClause(args['edge_table'], args['geometry'], args['BBOX']) - if args['version'] < 2.1: - return """ - SELECT x, y FROM pgr_alphashape($$ - WITH - dd AS ( - SELECT seq, id1 AS _node FROM pgr_drivingDistance(' - SELECT %(id)s::int4 AS id, - %(source)s::int4 AS source, - %(target)s::int4 AS target, - %(cost)s::float8 AS cost%(reverse_cost)s - FROM %(edge_table)s - %(where_clause)s', - %(source_id)s, %(distance)s, - %(directed)s, %(has_reverse_cost)s) - ), - node AS ( - SELECT dd.seq AS id, - ST_X(the_geom) AS x, ST_Y(the_geom) AS y - FROM %(edge_table)s_vertices_pgr JOIN dd - ON %(edge_table)s_vertices_pgr.id = dd._node - ) - SELECT * FROM node$$::text) - """ % args - - # V21.+ has pgr_drivingDistance with big int - # and pgr_alphaShape has an alpha value - args['alpha'] = ', ' + str(args['alpha']) - return """ - SELECT x, y FROM pgr_alphashape($$ - WITH - dd AS ( - SELECT seq, node AS _node FROM pgr_drivingDistance(' - SELECT %(id)s AS id, - %(source)s AS source, - %(target)s AS target, - %(cost)s AS cost%(reverse_cost)s - FROM %(edge_table)s - %(where_clause)s', - %(source_id)s, %(distance)s, - %(directed)s) - ), - node AS ( - SELECT dd.seq AS id, - ST_X(the_geom) AS x, ST_Y(the_geom) AS y - FROM %(edge_table)s_vertices_pgr JOIN dd - ON %(edge_table)s_vertices_pgr.id = dd._node - ) - SELECT * FROM node$$::text%(alpha)s) - """ % args - - - - def getExportQuery(self, args): - if args['version'] < 2.1: - return """ - SELECT 1 AS seq, ST_SetSRID(pgr_pointsAsPolygon, 0) AS path_geom FROM pgr_pointsAsPolygon($$ - WITH - dd AS ( - SELECT seq, id1 AS _node FROM pgr_drivingDistance(' - SELECT %(id)s::int4 AS id, - %(source)s::int4 AS source, - %(target)s::int4 AS target, - %(cost)s::float8 AS cost%(reverse_cost)s - FROM %(edge_table)s - %(where_clause)s', - %(source_id)s, %(distance)s, - %(directed)s, %(has_reverse_cost)s) - ), - node AS ( - SELECT dd.seq::int4 AS id, - ST_X(the_geom) AS x, ST_Y(the_geom) AS y - FROM %(edge_table)s_vertices_pgr JOIN dd - ON %(edge_table)s_vertices_pgr.id = dd._node - ) - SELECT * FROM node$$::text) - """ % args - - return """ - SELECT 1 AS seq, ST_SetSRID(pgr_pointsAsPolygon, 0) AS path_geom FROM pgr_pointsAsPolygon($$ - WITH - dd AS ( - SELECT seq, node AS _node FROM pgr_drivingDistance(' - SELECT %(id)s AS id, - %(source)s AS source, - %(target)s AS target, - %(cost)s AS cost%(reverse_cost)s - FROM %(edge_table)s - %(where_clause)s', - %(source_id)s, %(distance)s, - %(directed)s) - ), - node AS ( - SELECT dd.seq::int4 AS id, - ST_X(the_geom) AS x, ST_Y(the_geom) AS y - FROM %(edge_table)s_vertices_pgr JOIN dd - ON %(edge_table)s_vertices_pgr.id = dd._node - ) - SELECT * FROM node$$::text) - """ % args - - - - def draw(self, rows, con, args, geomType, canvasItemList, mapCanvas): - ''' draw the resulting polygon. ''' - - resultAreaRubberBand = canvasItemList['area'] - trans = None - - canvasCrs = Utils.getDestinationCrs(mapCanvas) - layerCrs = QgsCoordinateReferenceSystem() - Utils.createFromSrid(layerCrs, args['srid']) - trans = QgsCoordinateTransform(layerCrs, canvasCrs,QgsProject.instance()) - - # return columns are 'x', 'y' - for row in rows: - x = row[0] - y = row[1] - if args['version'] > 2.0 and ((x is None) or (y is None)): - Utils.logMessage(u'Alpha shape result geometry is MultiPolygon or has holes.\nPlease click [Export] button to see complete result.', level=QgsMessageLog.WARNING) - return - pt = QgsPoint(x, y) - if trans: - pt = trans.transform(pt.x(),pt.y()) - - resultAreaRubberBand.addPoint(pt) - - def __init__(self, ui): - FunctionBase.__init__(self, ui) diff --git a/functions/astar.py b/functions/astar.py deleted file mode 100755 index 231495a..0000000 --- a/functions/astar.py +++ /dev/null @@ -1,118 +0,0 @@ -from __future__ import absolute_import -from pgRoutingLayer import pgRoutingLayer_utils as Utils -from .FunctionBase import FunctionBase - -class Function(FunctionBase): - - version = 3.0 - - @classmethod - def getName(self): - ''' returns Function name. ''' - return 'astar' - - @classmethod - def getControlNames(self, version): - ''' returns control names for this function. ''' - self.version = version - if self.version < 2.4: - return self.commonControls + self.commonBoxes + self.astarControls + [ - 'labelSourceId', 'lineEditSourceId', 'buttonSelectSourceId', - 'labelTargetId', 'lineEditTargetId', 'buttonSelectTargetId', - ] - else: - return self.commonControls + self.commonBoxes + self.astarControls + [ - 'labelSourceIds', 'lineEditSourceIds', 'buttonSelectSourceIds', - 'labelTargetIds', 'lineEditTargetIds', 'buttonSelectTargetIds', - ] - - def prepare(self, canvasItemList): - if self.version < 2.4: - resultPathRubberBand = canvasItemList['path'] - resultPathRubberBand.reset(Utils.getRubberBandType(False)) - else: - resultPathsRubberBands = canvasItemList['paths'] - for path in resultPathsRubberBands: - path.reset(Utils.getRubberBandType(False)) - canvasItemList['paths'] = [] - - - def getQuery(self, args): - ''' returns the sql query in required signature format of pgr_astar ''' - args['where_clause'] = self.whereClause(args['edge_table'], args['geometry'], args['BBOX']) - if self.version < 2.3: - return """ - SELECT seq, id1 AS _node, id2 AS _edge, cost AS _cost - FROM pgr_astar(' - SELECT %(id)s::int4 AS id, - %(source)s::int4 AS source, - %(target)s::int4 AS target, - %(cost)s::float8 AS cost - %(reverse_cost)s, - %(x1)s::float8 AS x1, - %(y1)s::float8 AS y1, - %(x2)s::float8 AS x2, - %(y2)s::float8 AS y2 - FROM %(edge_table)s - %(where_clause)s', - %(source_id)s::int4, %(target_id)s::int4, %(directed)s, %(has_reverse_cost)s) - """ % args - elif self.version == 2.3: - return """ - SELECT seq, node AS _node, edge AS _edge, cost AS _cost, lead(agg_cost) over() AS _agg_cost - FROM pgr_astar(' - SELECT %(id)s AS id, - %(source)s AS source, - %(target)s AS target, - %(cost)s AS cost - %(reverse_cost)s, - %(x1)s AS x1, - %(y1)s AS y1, - %(x2)s AS x2, - %(y2)s AS y2 - FROM %(edge_table)s - %(where_clause)s', - %(source_id)s::int4, %(target_id)s::int4, %(directed)s, %(has_reverse_cost)s) - """ % args - else: - return """ - SELECT seq, '(' || start_vid || ',' || end_vid || ')' AS path_name, - path_seq AS _path_seq, start_vid AS _start_vid, end_vid AS _end_vid, - node AS _node, edge AS _edge, cost AS _cost, lead(agg_cost) over() AS _agg_cost - FROM pgr_astar(' - SELECT %(id)s AS id, - %(source)s AS source, - %(target)s AS target, - %(cost)s AS cost - %(reverse_cost)s, - %(x1)s AS x1, - %(y1)s AS y1, - %(x2)s AS x2, - %(y2)s AS y2 - FROM %(edge_table)s - %(where_clause)s', - array[%(source_ids)s]::BIGINT[], array[%(target_ids)s]::BIGINT[], %(directed)s) - """ % args - - def getExportQuery(self, args): - return self.getJoinResultWithEdgeTable(args) - - def getExportMergeQuery(self, args): - if self.version < 2.4: - return self.getExportOneSourceOneTargetMergeQuery(args) - else: - return self.getExportManySourceManyTargetMergeQuery(args) - - - def draw(self, rows, con, args, geomType, canvasItemList, mapCanvas): - ''' draw the result. ''' - if self.version < 2.4: - self.drawOnePath(rows, con, args, geomType, canvasItemList, mapCanvas) - else: - self.drawManyPaths(rows, con, args, geomType, canvasItemList, mapCanvas) - - - - - def __init__(self, ui): - FunctionBase.__init__(self, ui) diff --git a/functions/bdAstar.py b/functions/bdAstar.py deleted file mode 100755 index 9b90d1b..0000000 --- a/functions/bdAstar.py +++ /dev/null @@ -1,101 +0,0 @@ -from __future__ import absolute_import -from pgRoutingLayer import pgRoutingLayer_utils as Utils -from .FunctionBase import FunctionBase - -class Function(FunctionBase): - - version = 2.0 - - @classmethod - def getName(self): - ''' returns Function name. ''' - return 'bdAstar' - - @classmethod - def getControlNames(self, version): - ''' returns control names. ''' - self.version = version - if self.version < 2.5: - return self.commonControls + self.commonBoxes + self.astarControls + [ - 'labelSourceId', 'lineEditSourceId', 'buttonSelectSourceId', - 'labelTargetId', 'lineEditTargetId', 'buttonSelectTargetId', - ] - else: - return self.commonControls + self.commonBoxes + self.astarControls + [ - 'labelSourceIds', 'lineEditSourceIds', 'buttonSelectSourceIds', - 'labelTargetIds', 'lineEditTargetIds', 'buttonSelectTargetIds', - ] - - def prepare(self, canvasItemList): - if self.version < 2.5: - resultPathRubberBand = canvasItemList['path'] - resultPathRubberBand.reset(Utils.getRubberBandType(False)) - else: - resultPathsRubberBands = canvasItemList['paths'] - for path in resultPathsRubberBands: - path.reset(Utils.getRubberBandType(False)) - canvasItemList['paths'] = [] - - - def getQuery(self, args): - ''' returns the sql query in required signature format of pgr_bdAstar ''' - args['where_clause'] = self.whereClause(args['edge_table'], args['geometry'], args['BBOX']) - if self.version < 2.5: - return """ - SELECT seq, id1 AS _node, id2 AS _edge, cost AS _cost - FROM pgr_bdAstar(' - SELECT %(id)s::int4 AS id, - %(source)s::int4 AS source, - %(target)s::int4 AS target, - %(cost)s::float8 AS cost - %(reverse_cost)s, - %(x1)s::float8 AS x1, - %(y1)s::float8 AS y1, - %(x2)s::float8 AS x2, - %(y2)s::float8 AS y2 - FROM %(edge_table)s - %(where_clause)s', - %(source_id)s::int4, %(target_id)s::int4, %(directed)s, %(has_reverse_cost)s) - """ % args - else: - return """ - SELECT seq, '(' || start_vid || ',' || end_vid || ')' AS path_name, - path_seq AS _path_seq, start_vid AS _start_vid, end_vid AS _end_vid, - node AS _node, edge AS _edge, cost AS _cost, lead(agg_cost) over() AS _agg_cost - FROM pgr_bdAstar(' - SELECT %(id)s AS id, - %(source)s AS source, - %(target)s AS target, - %(cost)s AS cost - %(reverse_cost)s, - %(x1)s AS x1, - %(y1)s AS y1, - %(x2)s AS x2, - %(y2)s AS y2 - FROM %(edge_table)s - %(where_clause)s', - array[%(source_ids)s]::BIGINT[], array[%(target_ids)s]::BIGINT[], %(directed)s) - """ % args - - def getExportQuery(self, args): - return self.getJoinResultWithEdgeTable(args) - - def getExportMergeQuery(self, args): - if self.version < 2.5: - return self.getExportOneSourceOneTargetMergeQuery(args) - else: - return self.getExportManySourceManyTargetMergeQuery(args) - - - def draw(self, rows, con, args, geomType, canvasItemList, mapCanvas): - ''' draws the result ''' - if self.version < 2.5: - self.drawOnePath(rows, con, args, geomType, canvasItemList, mapCanvas) - else: - self.drawManyPaths(rows, con, args, geomType, canvasItemList, mapCanvas) - - - - - def __init__(self, ui): - FunctionBase.__init__(self, ui) diff --git a/functions/bdDijkstra.py b/functions/bdDijkstra.py deleted file mode 100755 index 2ca5e9d..0000000 --- a/functions/bdDijkstra.py +++ /dev/null @@ -1,106 +0,0 @@ -from __future__ import absolute_import -from pgRoutingLayer import pgRoutingLayer_utils as Utils -from .FunctionBase import FunctionBase - -class Function(FunctionBase): - - version = 2.0 - - @classmethod - def getName(self): - ''' returns Function name. ''' - return 'bdDijkstra' - - @classmethod - def getControlNames(self, version): - ''' returns control names. ''' - self.version = version - if self.version < 2.5: - return self.commonControls + self.commonBoxes + [ - 'labelSourceId', 'lineEditSourceId', 'buttonSelectSourceId', - 'labelTargetId', 'lineEditTargetId', 'buttonSelectTargetId', - ] - else: - return self.commonControls + self.commonBoxes + [ - 'labelSourceIds', 'lineEditSourceIds', 'buttonSelectSourceIds', - 'labelTargetIds', 'lineEditTargetIds', 'buttonSelectTargetIds', - ] - - def prepare(self, canvasItemList): - if self.version < 2.5: - resultPathRubberBand = canvasItemList['path'] - resultPathRubberBand.reset(Utils.getRubberBandType(False)) - else: - resultPathsRubberBands = canvasItemList['paths'] - for path in resultPathsRubberBands: - path.reset(Utils.getRubberBandType(False)) - canvasItemList['paths'] = [] - - - def getQuery(self, args): - ''' returns the sql query in required signature format of pgr_bdDijkstra ''' - args['where_clause'] = self.whereClause(args['edge_table'], args['geometry'], args['BBOX']) - if self.version < 2.4: - return """ - SELECT seq, id1 AS _node, id2 AS _edge, cost AS _cost - FROM pgr_bdDijkstra(' - SELECT %(id)s::int4 AS id, - %(source)s::int4 AS source, - %(target)s::int4 AS target, - %(cost)s::float8 AS cost - %(reverse_cost)s, - FROM %(edge_table)s - %(where_clause)s', - %(source_id)s::int4, %(target_id)s::int4, %(directed)s, %(has_reverse_cost)s) - """ % args - elif self.version == 2.4: - return """ - SELECT seq, node AS _node, edge AS _edge, cost AS _cost, lead(agg_cost) over() AS _agg_cost - FROM pgr_bdDijkstra(' - SELECT %(id)s AS id, - %(source)s AS source, - %(target)s AS target, - %(cost)s AS cost - %(reverse_cost)s, - FROM %(edge_table)s - %(where_clause)s', - %(source_id)s::int4, %(target_id)s::int4, %(directed)s, %(has_reverse_cost)s) - """ % args - else: - return """ - SELECT seq, '(' || start_vid || ',' || end_vid || ')' AS path_name, - path_seq AS _path_seq, start_vid AS _start_vid, end_vid AS _end_vid, - node AS _node, edge AS _edge, cost AS _cost, lead(agg_cost) over() AS _agg_cost - FROM pgr_bdDijkstra(' - SELECT %(id)s AS id, - %(source)s AS source, - %(target)s AS target, - %(cost)s AS cost - %(reverse_cost)s - FROM %(edge_table)s - %(where_clause)s', - array[%(source_ids)s]::BIGINT[], array[%(target_ids)s]::BIGINT[], %(directed)s) - """ % args - - def getExportQuery(self, args): - return self.getJoinResultWithEdgeTable(args) - - def getExportMergeQuery(self, args): - if self.version < 2.5: - return self.getExportOneSourceOneTargetMergeQuery(args) - else: - return self.getExportManySourceManyTargetMergeQuery(args) - - - def draw(self, rows, con, args, geomType, canvasItemList, mapCanvas): - ''' draw the result ''' - if self.version < 2.5: - self.drawOnePath(rows, con, args, geomType, canvasItemList, mapCanvas) - else: - self.drawManyPaths(rows, con, args, geomType, canvasItemList, mapCanvas) - - - - - def __init__(self, ui): - FunctionBase.__init__(self, ui) diff --git a/functions/dijkstra.py b/functions/dijkstra.py deleted file mode 100755 index b377d91..0000000 --- a/functions/dijkstra.py +++ /dev/null @@ -1,98 +0,0 @@ -from __future__ import absolute_import -from pgRoutingLayer import pgRoutingLayer_utils as Utils -from .FunctionBase import FunctionBase - -class Function(FunctionBase): - - version = 2.0 - - @classmethod - def getName(self): - ''' returns Function name. ''' - return 'dijkstra' - - - @classmethod - def getControlNames(self, version): - ''' returns control names. ''' - self.version = version - if self.version < 2.1: - # version 2.0 has only one to one - return self.commonControls + self.commonBoxes + [ - 'labelSourceId', 'lineEditSourceId', 'buttonSelectSourceId', - 'labelTargetId', 'lineEditTargetId', 'buttonSelectTargetId', - ] - else: - return self.commonControls + self.commonBoxes + [ - 'labelSourceIds', 'lineEditSourceIds', 'buttonSelectSourceIds', - 'labelTargetIds', 'lineEditTargetIds', 'buttonSelectTargetIds', - ] - - - def prepare(self, canvasItemList): - if self.version < 2.1: - resultPathRubberBand = canvasItemList['path'] - resultPathRubberBand.reset(Utils.getRubberBandType(False)) - else: - resultPathsRubberBands = canvasItemList['paths'] - for path in resultPathsRubberBands: - path.reset(Utils.getRubberBandType(False)) - canvasItemList['paths'] = [] - - - def getQuery(self, args): - ''' returns the sql query in required signature format of pgr_bdDijkstra ''' - args['where_clause'] = self.whereClause(args['edge_table'], args['geometry'], args['BBOX']) - if self.version < 2.1: - return """ - SELECT seq, id1 AS _node, id2 AS _edge, cost AS _cost - FROM pgr_dijkstra(' - SELECT %(id)s::int4 AS id, - %(source)s::int4 AS source, - %(target)s::int4 AS target, - %(cost)s::float8 AS cost - %(reverse_cost)s - FROM %(edge_table)s - %(where_clause)s', - %(source_id)s, %(target_id)s, %(directed)s, %(has_reverse_cost)s) - """ % args - else: - return """ - SELECT seq, '(' || start_vid || ',' || end_vid || ')' AS path_name, - path_seq AS _path_seq, start_vid AS _start_vid, end_vid AS _end_vid, - node AS _node, edge AS _edge, cost AS _cost, lead(agg_cost) over() AS _agg_cost - FROM pgr_dijkstra(' - SELECT %(id)s AS id, - %(source)s AS source, - %(target)s AS target, - %(cost)s AS cost - %(reverse_cost)s - FROM %(edge_table)s - %(where_clause)s', - array[%(source_ids)s]::BIGINT[], array[%(target_ids)s]::BIGINT[], %(directed)s) - """ % args - - def getExportQuery(self, args): - return self.getJoinResultWithEdgeTable(args) - - - def getExportMergeQuery(self, args): - if self.version < 2.1: - return self.getExportOneSourceOneTargetMergeQuery(args) - else: - return self.getExportManySourceManyTargetMergeQuery(args) - - - - def draw(self, rows, con, args, geomType, canvasItemList, mapCanvas): - ''' draw the result ''' - if self.version < 2.1: - self.drawOnePath(rows, con, args, geomType, canvasItemList, mapCanvas) - else: - self.drawManyPaths(rows, con, args, geomType, canvasItemList, mapCanvas) - - - - - def __init__(self, ui): - FunctionBase.__init__(self, ui) diff --git a/functions/dijkstraCost.py b/functions/dijkstraCost.py deleted file mode 100755 index 70e951f..0000000 --- a/functions/dijkstraCost.py +++ /dev/null @@ -1,159 +0,0 @@ -from __future__ import absolute_import -from builtins import str -from qgis.PyQt.QtCore import QSizeF, QPointF -from qgis.PyQt.QtGui import QColor, QTextDocument -from qgis.core import QgsGeometry, Qgis, QgsTextAnnotation, QgsWkbTypes, QgsAnnotation -from qgis.gui import QgsRubberBand, QgsMapCanvasAnnotationItem -import psycopg2 -from pgRoutingLayer import pgRoutingLayer_utils as Utils -from .FunctionBase import FunctionBase - -class Function(FunctionBase): - - @classmethod - def getName(self): - ''' returns Function name. ''' - return 'dijkstraCost' - - @classmethod - def isSupportedVersion(self, version): - ''' Checks supported version ''' - # valid starting pgr v2.1 - return version >= 2.1 - - - @classmethod - def canExportQuery(self): - return False - - @classmethod - def canExportMerged(self): - return False - - - - def prepare(self, canvasItemList): - resultNodesTextAnnotations = canvasItemList['annotations'] - for anno in resultNodesTextAnnotations: - anno.setVisible(False) - canvasItemList['annotations'] = [] - - - def getQuery(self, args): - ''' returns the sql query in required signature format of pgr_dijkstra ''' - args['where_clause'] = self.whereClause(args['edge_table'], args['geometry'], args['BBOX']) - return """ - SELECT row_number() over() AS seq, - start_vid , end_vid, agg_cost AS cost, - '(' || start_vid || ',' || end_vid || ')' AS path_name - FROM pgr_dijkstraCost(' - SELECT %(id)s AS id, - %(source)s AS source, - %(target)s AS target, - %(cost)s AS cost - %(reverse_cost)s - FROM %(edge_table)s - %(where_clause)s - ', - array[%(source_ids)s]::BIGINT[], array[%(target_ids)s]::BIGINT[], %(directed)s) - """ % args - - - def getExportQuery(self, args): - args['result_query'] = self.getQuery(args) - args['vertex_table'] = """ - %(edge_table)s_vertices_pgr - """ % args - - return """ - WITH - result AS ( %(result_query)s ) - SELECT result.*, ST_MakeLine(a.the_geom, b.the_geom) AS path_geom - - FROM result - JOIN %(vertex_table)s AS a ON (start_vid = a.id) - JOIN %(vertex_table)s AS b ON (end_vid = b.id) - """ % args - - - - - def draw(self, rows, con, args, geomType, canvasItemList, mapCanvas): - ''' draw the result ''' - resultPathsRubberBands = canvasItemList['paths'] - rubberBand = None - cur_path_id = -1 - for row in rows: - cur2 = con.cursor() - args['result_path_id'] = row[0] - args['result_source_id'] = row[1] - args['result_target_id'] = row[2] - args['result_cost'] = row[3] - if args['result_path_id'] != cur_path_id: - cur_path_id = args['result_path_id'] - if rubberBand: - resultPathsRubberBands.append(rubberBand) - rubberBand = None - - rubberBand = QgsRubberBand(mapCanvas, Utils.getRubberBandType(False)) - rubberBand.setColor(QColor(255, 0, 0, 128)) - rubberBand.setWidth(4) - if args['result_cost'] != -1: - query2 = """ - SELECT ST_AsText( ST_MakeLine( - (SELECT the_geom FROM %(edge_table)s_vertices_pgr WHERE id = %(result_source_id)d), - (SELECT the_geom FROM %(edge_table)s_vertices_pgr WHERE id = %(result_target_id)d) - )) - """ % args - ##Utils.logMessage(query2) - cur2.execute(query2) - row2 = cur2.fetchone() - ##Utils.logMessage(str(row2[0])) - assert row2, "Invalid result geometry. (path_id:%(result_path_id)d, saource_id:%(result_source_id)d, target_id:%(result_target_id)d)" % args - - geom = QgsGeometry().fromWkt(str(row2[0])) - if geom.wkbType() == QgsWkbTypes.MultiLineString: - for line in geom.asMultiPolyline(): - for pt in line: - rubberBand.addPoint(pt) - elif geom.wkbType() == QgsWkbTypes.LineString: - for pt in geom.asPolyline(): - rubberBand.addPoint(pt) - - if rubberBand: - resultPathsRubberBands.append(rubberBand) - rubberBand = None - resultNodesTextAnnotations = canvasItemList['annotations'] - Utils.setStartPoint(geomType, args) - Utils.setEndPoint(geomType, args) - for row in rows: - cur2 = con.cursor() - args['result_seq'] = row[0] - args['result_source_id'] = row[1] - args['result_target_id'] = row[2] - args['result_cost'] = row[3] - query2 = """ - SELECT ST_AsText(%(transform_s)s%(startpoint)s%(transform_e)s) FROM %(edge_table)s - WHERE %(source)s = %(result_target_id)d - UNION - SELECT ST_AsText(%(transform_s)s%(endpoint)s%(transform_e)s) FROM %(edge_table)s - WHERE %(target)s = %(result_target_id)d - """ % args - cur2.execute(query2) - row2 = cur2.fetchone() - assert row2, "Invalid result geometry. (target_id:%(result_target_id)d)" % args - - geom = QgsGeometry().fromWkt(str(row2[0])) - pt = geom.asPoint() - textDocument = QTextDocument("%(result_target_id)d:%(result_cost)f" % args) - textAnnotation = QgsTextAnnotation() - textAnnotation.setMapPosition(geom.asPoint()) - textAnnotation.setFrameSize(QSizeF(textDocument.idealWidth(), 20)) - textAnnotation.setFrameOffsetFromReferencePoint(QPointF(20, -40)) - textAnnotation.setDocument(textDocument) - - QgsMapCanvasAnnotationItem(textAnnotation, mapCanvas) - resultNodesTextAnnotations.append(textAnnotation) - - def __init__(self, ui): - FunctionBase.__init__(self, ui) diff --git a/functions/drivingDistance.py b/functions/drivingDistance.py index 4ec02aa..a727217 100755 --- a/functions/drivingDistance.py +++ b/functions/drivingDistance.py @@ -1,46 +1,75 @@ +# -*- coding: utf-8 -*- +# /*PGR-GNU***************************************************************** +# File: drivingDistance.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - cayetanobv +# - AasheeshT +# - sanak +# - cvvergara +# - anitagraser +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ + from __future__ import absolute_import -from builtins import str from qgis.PyQt.QtCore import Qt from qgis.PyQt.QtGui import * from qgis.core import QgsGeometry, QgsPointXY from qgis.gui import QgsVertexMarker -import psycopg2 +from psycopg2 import sql from pgRoutingLayer import pgRoutingLayer_utils as Utils from .FunctionBase import FunctionBase + class Function(FunctionBase): - + # TODO fix completely + @classmethod def getName(self): ''' returns Function name. ''' - return 'drivingDistance' - + return 'pgr_drivingDistance' + @classmethod def getControlNames(self, version): ''' returns control names. ''' if version < 2.1: # version 2.0 has only one to one return self.commonControls + self.commonBoxes + [ - 'labelSourceId', 'lineEditSourceId', 'buttonSelectSourceId', - 'labelDistance', 'lineEditDistance', - ] + 'labelSourceId', 'lineEditSourceId', 'buttonSelectSourceId', + 'labelDistance', 'lineEditDistance', + ] else: return self.commonControls + self.commonBoxes + [ - 'labelSourceIds', 'lineEditSourceIds', 'buttonSelectSourceIds', - 'labelDistance', 'lineEditDistance', - ] + 'labelSourceIds', 'lineEditSourceIds', 'buttonSelectSourceIds', + 'labelDistance', 'lineEditDistance', + ] def prepare(self, canvasItemList): resultNodesVertexMarkers = canvasItemList['markers'] for marker in resultNodesVertexMarkers: marker.setVisible(False) canvasItemList['markers'] = [] - + def getQuery(self, args): ''' returns the sql query in required signature format of pgr_drivingDistance ''' args['where_clause'] = self.whereClause(args['edge_table'], args['geometry'], args['BBOX']) if (args['version'] < 2.1): - return """ + return sql.SQL(""" SELECT seq, id1 AS _node, id2 AS _edge, cost AS _cost FROM pgr_drivingDistance(' SELECT %(id)s::int4 AS id, @@ -50,11 +79,11 @@ def getQuery(self, args): FROM %(edge_table)s %(where_clause)s', %(source_id)s, %(distance)s, - %(directed)s, %(has_reverse_cost)s)""" % args + %(directed)s, %(has_reverse_cost)s)""").format(**args) - #2.1 or greater - #TODO add equicost flag to gui - return """ + # 2.1 or greater + # TODO add equicost flag to gui + return sql.SQL(""" SELECT seq, '(' || from_v || ', %(distance)s)' AS path_name, from_v AS _from_v, node AS _node, edge AS _edge, @@ -68,27 +97,27 @@ def getQuery(self, args): %(where_clause)s', ARRAY[%(source_ids)s]::BIGINT[], %(distance)s, %(directed)s, false) - """ % args + """).format(**args) def getExportQuery(self, args): # points are returned args['result_query'] = self.getQuery(args) - args['with_geom_query'] = """ + args['with_geom_query'] = sql.SQL(""" SELECT result.*, ST_X(the_geom) AS x, ST_Y(the_geom) AS y, the_geom AS path_geom FROM %(edge_table)s_vertices_pgr JOIN result ON %(edge_table)s_vertices_pgr.id = result._node - """ % args + """).format(**args) - msgQuery = """WITH + msgQuery = sql.SQL("""WITH result AS ( %(result_query)s ), with_geom AS ( %(with_geom_query)s ) SELECT with_geom.* - FROM with_geom + FROM with_geom ORDER BY seq - """ % args + """).format(**args) return msgQuery def getExportMergeQuery(self, args): @@ -98,9 +127,10 @@ def getExportMergeQuery(self, args): def draw(self, rows, con, args, geomType, canvasItemList, mapCanvas): ''' draw the result ''' resultNodesVertexMarkers = canvasItemList['markers'] - table = """%(edge_table)s_vertices_pgr""" % args - srid, geomType = Utils.getSridAndGeomType(con, table, 'the_geom') - Utils.setTransformQuotes(args,srid, args['canvas_srid']) + schema = """%(edge_schema)s""" % args + table = """%(edge_table)s_vertices_pgr""" % args + srid, geomType = Utils.getSridAndGeomType(con, schema, table, 'the_geom') + Utils.setTransformQuotes(args, srid, args['canvas_srid']) for row in rows: cur2 = con.cursor() @@ -113,11 +143,11 @@ def draw(self, rows, con, args, geomType, canvasItemList, mapCanvas): args['result_edge_id'] = row[4] args['result_cost'] = row[5] - query2 = """ + query2 = sql.SQL(""" SELECT ST_AsText(%(transform_s)s the_geom %(transform_e)s) FROM %(edge_table)s_vertices_pgr WHERE id = %(result_node_id)d - """ % args + """).format(**args) cur2.execute(query2) row2 = cur2.fetchone() if (row2): diff --git a/functions/ksp.py b/functions/ksp.py deleted file mode 100755 index 8ae1bf8..0000000 --- a/functions/ksp.py +++ /dev/null @@ -1,252 +0,0 @@ -from __future__ import absolute_import -from qgis.PyQt.QtCore import * -from builtins import str -from qgis.PyQt.QtGui import QColor -from qgis.core import Qgis, QgsGeometry, QgsWkbTypes -from qgis.gui import QgsRubberBand -import psycopg2 -from pgRoutingLayer import pgRoutingLayer_utils as Utils -from .FunctionBase import FunctionBase - -class Function(FunctionBase): - - version = 2.0 - - - @classmethod - def getName(self): - ''' returns Function name. ''' - return 'ksp' - - @classmethod - def getControlNames(self, version): - ''' returns control names. ''' - # function pgr_ksp(text,integer,integer,integer, boolean) - # boolean is has_rcost - # only works for directed graph - self.version = version - if (self.version < 2.1): - return [ - 'labelId', 'lineEditId', - 'labelSource', 'lineEditSource', - 'labelTarget', 'lineEditTarget', - 'labelCost', 'lineEditCost', - 'labelReverseCost', 'lineEditReverseCost', - 'labelSourceId', 'lineEditSourceId', 'buttonSelectSourceId', - 'labelTargetId', 'lineEditTargetId', 'buttonSelectTargetId', - 'labelPaths', 'lineEditPaths', - 'checkBoxHasReverseCost' - ] - else: - # function pgr_ksp(text,bigint,bigint,integer,boolean,boolean) - return [ - 'labelId', 'lineEditId', - 'labelSource', 'lineEditSource', - 'labelTarget', 'lineEditTarget', - 'labelCost', 'lineEditCost', - 'labelReverseCost', 'lineEditReverseCost', - 'labelSourceId', 'lineEditSourceId', 'buttonSelectSourceId', - 'labelTargetId', 'lineEditTargetId', 'buttonSelectTargetId', - 'labelPaths', 'lineEditPaths', - 'checkBoxDirected', - 'checkBoxHasReverseCost', - 'checkBoxHeapPaths' - ] - - def prepare(self, canvasItemList): - resultPathsRubberBands = canvasItemList['paths'] - for path in resultPathsRubberBands: - path.reset(Utils.getRubberBandType(False)) - canvasItemList['paths'] = [] - - def getQuery(self, args): - ''' returns the sql query in required signature format of pgr_bdDijkstra ''' - if (self.version < 2.1): - return """ - SELECT - seq, id1 AS _route, - id2 AS _node, id3 AS _edge, - cost AS _cost - FROM pgr_ksp(' - SELECT %(id)s::int4 AS id, - %(source)s::int4 AS source, - %(target)s::int4 AS target, - %(cost)s::float8 AS cost - %(reverse_cost)s - FROM %(edge_table)s - WHERE %(edge_table)s.%(geometry)s && %(BBOX)s', - %(source_id)s, %(target_id)s, %(paths)s, %(has_reverse_cost)s)""" % args - else: - return """ - SELECT seq, - '(' || %(source_id)s || ', ' || %(target_id)s || ')-' || path_id AS path_name, - path_id AS _path_id, - path_seq AS _path_seq, - node AS _node, - edge AS _edge, - cost AS _cost - FROM pgr_ksp(' - SELECT %(id)s AS id, - %(source)s AS source, - %(target)s AS target, - %(cost)s AS cost - %(reverse_cost)s - FROM %(edge_table)s - WHERE %(edge_table)s.%(geometry)s && %(BBOX)s', - %(source_id)s, %(target_id)s, %(paths)s, - %(directed)s, %(heap_paths)s)""" % args - - def getExportQuery(self, args): - return self.getJoinResultWithEdgeTable(args) - - - def getExportMergeQuery(self, args): - if self.version < 2.1: - - args['result_query'] = self.getQuery(args) - - args['with_geom_query'] = """ - SELECT - seq, _route, - CASE - WHEN result._node = %(edge_table)s.%(source)s - THEN %(edge_table)s.%(geometry)s - ELSE ST_Reverse(%(edge_table)s.%(geometry)s) - END AS path_geom - FROM %(edge_table)s JOIN result - ON %(edge_table)s.%(id)s = result._edge - """ % args - - args['one_geom_query'] = """ - SELECT _route, ST_LineMerge(ST_Union(path_geom)) AS path_geom - FROM with_geom - GROUP BY _route - ORDER BY _route - """ % args - - args['aggregates_query'] = """SELECT - _route, - SUM(_cost) AS agg_cost, - array_agg(_node ORDER BY seq) AS _nodes, - array_agg(_edge ORDER BY seq) AS _edges - FROM result - GROUP BY _route - """ - - query = """WITH - result AS ( %(result_query)s ), - with_geom AS ( %(with_geom_query)s ), - one_geom AS ( %(one_geom_query)s ), - aggregates AS ( %(aggregates_query)s ) - SELECT row_number() over() as seq, - _route, _nodes, _edges, agg_cost, - path_geom FROM aggregates JOIN one_geom - USING (_route) - """ % args - - else: - - args['result_query'] = self.getQuery(args) - - args['with_geom_query'] = """ - SELECT - seq, result.path_name, - CASE - WHEN result._node = %(edge_table)s.%(source)s - THEN %(edge_table)s.%(geometry)s - ELSE ST_Reverse(%(edge_table)s.%(geometry)s) - END AS path_geom - FROM %(edge_table)s JOIN result - ON %(edge_table)s.%(id)s = result._edge - """ % args - - args['one_geom_query'] = """ - SELECT path_name, ST_LineMerge(ST_Union(path_geom)) AS path_geom - FROM with_geom - GROUP BY path_name - ORDER BY path_name - """ % args - - args['aggregates_query'] = """SELECT - path_name, _path_id, - SUM(_cost) AS agg_cost, - array_agg(_node ORDER BY _path_seq) AS _nodes, - array_agg(_edge ORDER BY _path_seq) AS _edges - FROM result - GROUP BY path_name, _path_id - """ - - query = """WITH - result AS ( %(result_query)s ), - with_geom AS ( %(with_geom_query)s ), - one_geom AS ( %(one_geom_query)s ), - aggregates AS ( %(aggregates_query)s ) - SELECT row_number() over() as seq, - _path_id, path_name, _nodes, _edges, agg_cost, - path_geom FROM aggregates JOIN one_geom - USING (path_name) - ORDER BY _path_id - """ % args - - return query - - - def draw(self, rows, con, args, geomType, canvasItemList, mapCanvas): - ''' draw the result ''' - resultPathsRubberBands = canvasItemList['paths'] - rubberBand = None - cur_route_id = -1 - for row in rows: - cur2 = con.cursor() - - if self.version < 2.1: - args['result_route_id'] = row[1] - args['result_node_id'] = row[2] - args['result_edge_id'] = row[3] - args['result_cost'] = row[4] - else: - args['result_route_id'] = row[2] - args['result_node_id'] = row[4] - args['result_edge_id'] = row[5] - args['result_cost'] = row[6] - - if args['result_route_id'] != cur_route_id: - cur_route_id = args['result_route_id'] - if rubberBand: - resultPathsRubberBands.append(rubberBand) - rubberBand = None - - rubberBand = QgsRubberBand(mapCanvas, Utils.getRubberBandType(False)) - rubberBand.setColor(QColor(255, 0, 0, 128)) - rubberBand.setWidth(4) - - if args['result_edge_id'] != -1: - #if args['result_edge_id'] != 0: # pgRouting <= 2.0.0rc1 - query2 = """ - SELECT ST_AsText(%(transform_s)s%(geometry)s%(transform_e)s) FROM %(edge_table)s - WHERE %(source)s = %(result_node_id)d AND %(id)s = %(result_edge_id)d - UNION - SELECT ST_AsText(%(transform_s)sST_Reverse(%(geometry)s)%(transform_e)s) FROM %(edge_table)s - WHERE %(target)s = %(result_node_id)d AND %(id)s = %(result_edge_id)d; - """ % args - ##Utils.logMessage(query2) - cur2.execute(query2) - row2 = cur2.fetchone() - ##Utils.logMessage(str(row2[0])) - assert row2, "Invalid result geometry. (route_id:%(result_route_id)d, node_id:%(result_node_id)d, edge_id:%(result_edge_id)d)" % args - - geom = QgsGeometry().fromWkt(str(row2[0])) - if geom.wkbType() == QgsWkbTypes.MultiLineString: - for line in geom.asMultiPolyline(): - for pt in line: - rubberBand.addPoint(pt) - elif geom.wkbType() == QgsWkbTypes.LineString: - for pt in geom.asPolyline(): - rubberBand.addPoint(pt) - - if rubberBand: - resultPathsRubberBands.append(rubberBand) - rubberBand = None - - def __init__(self, ui): - FunctionBase.__init__(self, ui) diff --git a/functions/pgr_KSP.py b/functions/pgr_KSP.py new file mode 100755 index 0000000..92cdcd0 --- /dev/null +++ b/functions/pgr_KSP.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- +# /*PGR-GNU***************************************************************** +# File: pgr_KSP.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - cayetanobv +# - cvvergara +# - anitagraser +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ + +from __future__ import absolute_import +from psycopg2 import sql +from .FunctionBase import FunctionBase + + +class Function(FunctionBase): + + minPGRversion = 2.1 + + def __init__(self, ui): + FunctionBase.__init__(self, ui) + + @classmethod + def getName(self): + ''' returns Function name. ''' + return 'pgr_KSP' + + @classmethod + def getControlNames(self, version): + ''' returns control names. ''' + return self.commonControls + self.commonBoxes + [ + 'labelSourceId', 'lineEditSourceId', 'buttonSelectSourceId', + 'labelTargetId', 'lineEditTargetId', 'buttonSelectTargetId', + 'labelPaths', 'lineEditPaths', 'checkBoxHeapPaths'] + + def getQuery(self, args): + ''' returns the sql query in required signature format of pgr_KSP ''' + return sql.SQL(""" + SELECT seq, + '(' || {source_id} || ', ' || {target_id} || ')-' || path_id AS path_name, + path_id AS _path_id, + path_seq AS _path_seq, + node AS _node, + edge AS _edge, + cost AS _cost + FROM pgr_KSP(' {innerQuery} ', + {source_id}, {target_id}, {Kpaths}, {directed}, {heap_paths}) + """).format(**args) + + def getExportQuery(self, args): + return self.getJoinResultWithEdgeTable(args) + + def getExportMergeQuery(self, args): + args['result_query'] = self.getQuery(args) + return sql.SQL("""WITH + result AS ( {result_query} ), + with_geom AS ( + SELECT seq, result.path_name, + CASE + WHEN result._node = et.{source} + THEN et.{geometry} + ELSE ST_Reverse(et.{geometry}) + END AS path_geom + FROM {edge_schema}.{edge_table} AS et JOIN result ON et.{id} = result._edge + ), + one_geom AS ( + SELECT path_name, ST_LineMerge(ST_Union(path_geom)) AS path_geom + FROM with_geom GROUP BY path_name ORDER BY path_name + ), + aggregates AS ( + SELECT + path_name, _path_id, + SUM(_cost) AS agg_cost, + array_agg(_node ORDER BY _path_seq) AS _nodes, + array_agg(_edge ORDER BY _path_seq) AS _edges + FROM result + GROUP BY path_name, _path_id + ) + SELECT row_number() over() as seq, + _path_id, path_name, _nodes, _edges, agg_cost, path_geom + FROM aggregates JOIN one_geom USING (path_name) ORDER BY _path_id + """).format(**args) + + def draw(self, rows, con, args, geomType, canvasItemList, mapCanvas): + ''' draw the result ''' + columns = [2, 4, 5] + self.drawManyPaths(rows, columns, con, args, geomType, canvasItemList, mapCanvas) diff --git a/functions/pgr_aStar.py b/functions/pgr_aStar.py new file mode 100755 index 0000000..9b3c3f5 --- /dev/null +++ b/functions/pgr_aStar.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# /*PGR-GNU***************************************************************** +# File: pgr_aStar.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - cayetanobv +# - cvvergara +# - anitagraser +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ + +from __future__ import absolute_import +from .AstarBase import AstarBase + + +class Function(AstarBase): + + minPGRversion = 2.4 + + def __init__(self, ui): + AstarBase.__init__(self, ui) + + @classmethod + def getName(self): + ''' returns Function name. ''' + return 'pgr_aStar' diff --git a/functions/pgr_aStarCost.py b/functions/pgr_aStarCost.py new file mode 100755 index 0000000..bb7f9a5 --- /dev/null +++ b/functions/pgr_aStarCost.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +# /*PGR-GNU***************************************************************** +# File: pgr_aStarCost.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - cayetanobv +# - cvvergara +# - anitagraser +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ + +from __future__ import absolute_import +from .CostBase import CostBase + + +class Function(CostBase): + + minPGRversion = 2.4 + + def __init__(self, ui): + CostBase.__init__(self, ui) + + @classmethod + def getName(self): + ''' returns Function name. ''' + return 'pgr_aStarCost' + + @classmethod + def getControlNames(self, version): + ''' returns control names for this function. ''' + return self.commonControls + self.commonBoxes + self.astarControls + [ + 'labelSourceIds', 'lineEditSourceIds', 'buttonSelectSourceIds', + 'labelTargetIds', 'lineEditTargetIds', 'buttonSelectTargetIds'] diff --git a/functions/pgr_bdAstar.py b/functions/pgr_bdAstar.py new file mode 100755 index 0000000..90e1466 --- /dev/null +++ b/functions/pgr_bdAstar.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# /*PGR-GNU***************************************************************** +# File: pgr_bdAstar.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - cayetanobv +# - cvvergara +# - anitagraser +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ + +from __future__ import absolute_import +from .AstarBase import AstarBase + + +class Function(AstarBase): + + minPGRversion = 2.5 + + def __init__(self, ui): + AstarBase.__init__(self, ui) + + @classmethod + def getName(self): + ''' returns Function name. ''' + return 'pgr_bdAstar' diff --git a/functions/pgr_bdAstarCost.py b/functions/pgr_bdAstarCost.py new file mode 100755 index 0000000..31fb3ec --- /dev/null +++ b/functions/pgr_bdAstarCost.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +# /*PGR-GNU***************************************************************** +# File: pgr_bdAstarCost.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - cayetanobv +# - cvvergara +# - anitagraser +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ + +from __future__ import absolute_import +from .CostBase import CostBase + + +class Function(CostBase): + + minPGRversion = 2.5 + + def __init__(self, ui): + CostBase.__init__(self, ui) + + @classmethod + def getName(self): + ''' returns Function name. ''' + return 'pgr_bdAstarCost' + + @classmethod + def getControlNames(self, version): + ''' returns control names for this function. ''' + return self.commonControls + self.commonBoxes + self.astarControls + [ + 'labelSourceIds', 'lineEditSourceIds', 'buttonSelectSourceIds', + 'labelTargetIds', 'lineEditTargetIds', 'buttonSelectTargetIds'] diff --git a/functions/pgr_bdDijkstra.py b/functions/pgr_bdDijkstra.py new file mode 100755 index 0000000..6465ec5 --- /dev/null +++ b/functions/pgr_bdDijkstra.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# /*PGR-GNU***************************************************************** +# File: pgr_bdDijkstra.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - cayetanobv +# - cvvergara +# - anitagraser +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ + +from .DijkstraBase import DijkstraBase + + +class Function(DijkstraBase): + + minPGRversion = 2.5 + + def __init__(self, ui): + DijkstraBase.__init__(self, ui) + + @classmethod + def getName(self): + ''' returns Function name. ''' + return 'pgr_bdDijkstra' diff --git a/functions/pgr_bdDijkstraCost.py b/functions/pgr_bdDijkstraCost.py new file mode 100755 index 0000000..dbc05a9 --- /dev/null +++ b/functions/pgr_bdDijkstraCost.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# /*PGR-GNU***************************************************************** +# File: pgr_bdDijkstraCost.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - cayetanobv +# - cvvergara +# - anitagraser +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ + +from __future__ import absolute_import +from .CostBase import CostBase + + +class Function(CostBase): + + minPGRversion = 2.5 + + def __init__(self, ui): + CostBase.__init__(self, ui) + + @classmethod + def getName(self): + ''' returns Function name. ''' + return 'pgr_bdDijkstraCost' diff --git a/functions/pgr_dijkstra.py b/functions/pgr_dijkstra.py new file mode 100755 index 0000000..7892a44 --- /dev/null +++ b/functions/pgr_dijkstra.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# /*PGR-GNU***************************************************************** +# File: pgr_dijkstra.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - cayetanobv +# - cvvergara +# - anitagraser +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ + +from .DijkstraBase import DijkstraBase + + +class Function(DijkstraBase): + + minPGRversion = 2.1 + + def __init__(self, ui): + DijkstraBase.__init__(self, ui) + + @classmethod + def getName(self): + ''' returns Function name. ''' + return 'pgr_dijkstra' diff --git a/functions/pgr_dijkstraCost.py b/functions/pgr_dijkstraCost.py new file mode 100755 index 0000000..540811b --- /dev/null +++ b/functions/pgr_dijkstraCost.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# /*PGR-GNU***************************************************************** +# File: pgr_dijkstraCost.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - cayetanobv +# - cvvergara +# - anitagraser +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ + +from __future__ import absolute_import +from .CostBase import CostBase + + +class Function(CostBase): + + minPGRversion = 2.2 + + def __init__(self, ui): + CostBase.__init__(self, ui) + + @classmethod + def getName(self): + ''' returns Function name. ''' + return 'pgr_dijkstraCost' diff --git a/functions/trsp_edge.py b/functions/trsp_edge.py deleted file mode 100755 index 8d26b06..0000000 --- a/functions/trsp_edge.py +++ /dev/null @@ -1,229 +0,0 @@ -from __future__ import absolute_import -from qgis.PyQt.QtCore import * -from qgis.PyQt.QtGui import * -from qgis.PyQt.QtWidgets import * -from builtins import str -from qgis.core import Qgis, QgsGeometry, QgsWkbTypes -from qgis.gui import QgsRubberBand -import psycopg2 -from pgRoutingLayer import pgRoutingLayer_utils as Utils -from .FunctionBase import FunctionBase - -class Function(FunctionBase): - - @classmethod - def getName(self): - ''' returns Function name. ''' - return 'trsp(edge)' - - @classmethod - def getControlNames(self, version): - ''' returns control names. ''' - return self.commonControls + self.commonBoxes + [ - 'labelSourceId', 'lineEditSourceId', 'buttonSelectSourceId', - 'labelSourcePos', 'lineEditSourcePos', - 'labelTargetId', 'lineEditTargetId', 'buttonSelectTargetId', - 'labelTargetPos', 'lineEditTargetPos', - 'labelTurnRestrictSql', 'plainTextEditTurnRestrictSql' ] - - - @classmethod - def isEdgeBase(self): - return True - - def prepare(self, canvasItemList): - resultPathRubberBand = canvasItemList['path'] - resultPathRubberBand.reset(Utils.getRubberBandType(False)) - - def getQuery(self, args): - ''' returns the sql query in required signature format of pgr_trsp_edge ''' - args['where_clause'] = self.whereClause(args['edge_table'], args['geometry'], args['BBOX']) - return """ - SELECT seq, id1 AS _node, id2 AS _edge, cost AS _cost FROM pgr_trsp(' - SELECT %(id)s::int4 AS id, - %(source)s::int4 AS source, %(target)s::int4 AS target, - %(cost)s::float8 AS cost%(reverse_cost)s - FROM %(edge_table)s - %(where_clause)s', - %(source_id)s, %(source_pos)s, %(target_id)s, %(target_pos)s, %(directed)s, %(has_reverse_cost)s, %(turn_restrict_sql)s)""" % args - - def getExportQuery(self, args): - args['result_query'] = 'result AS (' + self.getQuery(args) + ')' - - args['max_seq_query'] = 'max_seq AS (SELECT max(seq), min(seq) FROM result) ' - - args['with_geom'] = """ with_geom AS ( - SELECT - lead(_node) over(), result.*, %(edge_table)s.* - FROM %(edge_table)s JOIN result - ON edge_table.id = result._edge ORDER BY result.seq)""" % args - - args['first_row_split'] = self.getRowSplit(args, 'first') - args['last_row_split'] = self.getRowSplit(args, 'last') - - args['intermediate_rows'] = """ intermediate_rows AS (SELECT - CASE - WHEN result._node = %(edge_table)s.%(source)s - THEN %(edge_table)s.%(geometry)s - ELSE ST_Reverse(%(edge_table)s.%(geometry)s) - END AS path_geom, - lead(_node) over(), result.*, %(edge_table)s.* - FROM %(edge_table)s JOIN result - ON %(edge_table)s.%(id)s = result._edge - WHERE seq not in ((select max FROM max_seq), (select min FROM max_seq)) - ORDER BY result.seq) """ % args - - return """ - WITH - %(result_query)s, - %(max_seq_query)s, - %(with_geom)s, - %(first_row_split)s, - %(last_row_split)s, - %(intermediate_rows)s, - join_query AS ((SELECT * FROM first_row) UNION (SELECT * FROM last_row) UNION (SELECT * FROM intermediate_rows)) - SELECT * FROM join_query order by seq - """ % args - - def getExportMergeQuery(self, args): - args['result_query'] = 'result AS (' + self.getQuery(args) + ')' - - args['max_seq_query'] = 'max_seq AS (SELECT max(seq), min(seq) FROM result) ' - - args['with_geom'] = """ with_geom AS ( - SELECT - lead(_node) over(), result.*, %(edge_table)s.* - FROM %(edge_table)s JOIN result - ON edge_table.id = result._edge ORDER BY result.seq)""" % args - - args['first_row_split'] = self.getRowSplit(args, 'first') - args['last_row_split'] = self.getRowSplit(args, 'last') - - args['intermediate_rows'] = """ intermediate_rows AS (SELECT - CASE - WHEN result._node = %(edge_table)s.%(source)s - THEN %(edge_table)s.%(geometry)s - ELSE ST_Reverse(%(edge_table)s.%(geometry)s) - END AS path_geom, - lead(_node) over(), result.*, %(edge_table)s.* - FROM %(edge_table)s JOIN result - ON %(edge_table)s.%(id)s = result._edge - WHERE seq not in ((select max FROM max_seq), (select min FROM max_seq)) - ORDER BY result.seq) """ % args - - return """ - WITH - %(result_query)s, - %(max_seq_query)s, - %(with_geom)s, - %(first_row_split)s, - %(last_row_split)s, - %(intermediate_rows)s, - join_query AS ((SELECT * FROM first_row) UNION (SELECT * FROM last_row) UNION (SELECT * FROM intermediate_rows)), - one_geom_query AS ( - SELECT ST_LineMerge(ST_Union(path_geom)) AS path_geom, - 1 AS seq, - SUM(_cost) AS agg_cost, - array_agg(_node ORDER BY seq) AS _nodes, - array_agg(_edge ORDER BY seq) AS _edges - FROM join_query) - SELECT * FROM one_geom_query order by seq - """ % args - - def draw(self, rows, con, args, geomType, canvasItemList, mapCanvas): - ''' draw the result ''' - resultPathRubberBand = canvasItemList['path'] - i = 0 - count = len(rows) - for row in rows: - query2 = "" - cur2 = con.cursor() - args['result_node_id'] = row[1] - args['result_edge_id'] = row[2] - args['result_cost'] = row[3] - - if i == 0 and args['result_node_id'] == -1: - args['result_next_node_id'] = rows[i + 1][1] - query2 = """ - SELECT ST_AsText(%(transform_s)sST_Line_Substring(%(geometry)s, %(source_pos)s, 1.0)%(transform_e)s) FROM %(edge_table)s - WHERE %(target)s = %(result_next_node_id)s AND %(id)s = %(result_edge_id)s - UNION - SELECT ST_AsText(%(transform_s)sST_Line_Substring(ST_Reverse(%(geometry)s), 1.0 - %(source_pos)s, 1.0)%(transform_e)s) FROM %(edge_table)s - WHERE %(source)s = %(result_next_node_id)s AND %(id)s = %(result_edge_id)s; - """ % args - elif i == (count - 1) and ((args['result_edge_id'] == -1) or (str(args['result_edge_id']) == args['target_id'])): - if args['result_edge_id'] != -1: - query2 = """ - SELECT ST_AsText(%(transform_s)sST_Line_Substring(%(geometry)s, 0.0, %(target_pos)s)%(transform_e)s) FROM %(edge_table)s - WHERE %(source)s = %(result_node_id)s AND %(id)s = %(result_edge_id)s - UNION - SELECT ST_AsText(%(transform_s)sST_Line_Substring(ST_Reverse(%(geometry)s), 0.0, 1.0 - %(target_pos)s)%(transform_e)s) FROM %(edge_table)s - WHERE %(target)s = %(result_node_id)s AND %(id)s = %(result_edge_id)s; - """ % args - else: - break - else: - query2 = """ - SELECT ST_AsText(%(transform_s)s%(geometry)s%(transform_e)s) FROM %(edge_table)s - WHERE %(source)s = %(result_node_id)d AND %(id)s = %(result_edge_id)d - UNION - SELECT ST_AsText(%(transform_s)sST_Reverse(%(geometry)s)%(transform_e)s) FROM %(edge_table)s - WHERE %(target)s = %(result_node_id)d AND %(id)s = %(result_edge_id)d; - """ % args - - ##Utils.logMessage(query2) - cur2.execute(query2) - row2 = cur2.fetchone() - ##Utils.logMessage(str(row2[0])) - assert row2, "Invalid result geometry. (node_id:%(result_node_id)d, edge_id:%(result_edge_id)d)" % args - - geom = QgsGeometry().fromWkt(str(row2[0])) - if geom.wkbType() == QgsWkbTypes.MultiLineString: - for line in geom.asMultiPolyline(): - for pt in line: - resultPathRubberBand.addPoint(pt) - elif geom.wkbType() == QgsWkbTypes.LineString: - for pt in geom.asPolyline(): - resultPathRubberBand.addPoint(pt) - - i = i + 1 - - def getRowSplit(self, args, which): - # PRIVATE method - # upper case for localy defined string values - #lower case come from args - local_args = {} - local_args['WHICH'] = which - local_args['geometry'] = args['geometry'] - if which == 'first': - local_args['WHAT'] = 'lead' - local_args['POSITION'] = """%(source_pos)s""" % args - local_args['MINMAX'] = 'min' - local_args['NODE'] = """%(target)s""" % args - else: - local_args['WHAT'] = '_node' - local_args['POSITION'] = """%(target_pos)s""" % args - local_args['MINMAX'] = 'max' - local_args['NODE'] = """%(source)s""" % args - - query = """ - %(WHICH)s_row_split AS ( - SELECT CASE - WHEN %(WHAT)s = %(NODE)s THEN - ST_split( ST_Snap( %(geometry)s, ST_LineInterpolatePoint(%(geometry)s, %(POSITION)s), 0.00001), - ST_LineInterpolatePoint(%(geometry)s, %(POSITION)s)) - ELSE - ST_reverse( ST_split( ST_Snap( %(geometry)s, ST_LineInterpolatePoint(%(geometry)s, %(POSITION)s), 0.00001), - ST_LineInterpolatePoint(%(geometry)s, %(POSITION)s))) - END AS line_geom, - st_length(%(geometry)s) AS length, - _cost - FROM with_geom WHERE seq = (select %(MINMAX)s FROM max_seq) ), - %(WHICH)s_row_dump AS (SELECT (st_dump(line_geom)).geom AS path_geom, length, _cost FROM %(WHICH)s_row_split), - %(WHICH)s_row_choose AS (SELECT path_geom FROM %(WHICH)s_row_dump WHERE abs(_cost - st_length(path_geom) / length) < 0.00001), - %(WHICH)s_row AS (SELECT * FROM %(WHICH)s_row_choose, with_geom WHERE seq = (select %(MINMAX)s FROM max_seq)) - """ % local_args - return query - - def __init__(self, ui): - FunctionBase.__init__(self, ui) diff --git a/functions/trsp_vertex.py b/functions/trsp_vertex.py deleted file mode 100755 index 02067e5..0000000 --- a/functions/trsp_vertex.py +++ /dev/null @@ -1,93 +0,0 @@ -from __future__ import absolute_import -from qgis.PyQt.QtCore import * -from qgis.PyQt.QtGui import * -from builtins import str -from qgis.core import Qgis, QgsGeometry, QgsWkbTypes -from qgis.gui import QgsRubberBand -import psycopg2 -from pgRoutingLayer import pgRoutingLayer_utils as Utils -from .FunctionBase import FunctionBase - -class Function(FunctionBase): - - @classmethod - def getName(self): - ''' returns Function name. ''' - return 'trsp(vertex)' - - @classmethod - def getControlNames(self, version): - ''' returns control names. ''' - return self.commonControls + self.commonBoxes + [ - 'labelSourceId', 'lineEditSourceId', 'buttonSelectSourceId', - 'labelTargetId', 'lineEditTargetId', 'buttonSelectTargetId', - 'labelTurnRestrictSql', 'plainTextEditTurnRestrictSql' - ] - - return [ - ] - - def isSupportedVersion(self, version): - ''' checks supported version. ''' - return version >= 2.0 - - def prepare(self, canvasItemList): - resultPathRubberBand = canvasItemList['path'] - resultPathRubberBand.reset(Utils.getRubberBandType(False)) - - def getQuery(self, args): - ''' returns the sql query in required signature format of trsp_vertex ''' - args['where_clause'] = self.whereClause(args['edge_table'], args['geometry'], args['BBOX']) - return """ - SELECT seq, id1 AS _node, id2 AS _edge, cost AS _cost FROM pgr_trsp(' - SELECT %(id)s::int4 AS id, - %(source)s::int4 AS source, - %(target)s::int4 AS target, - %(cost)s::float8 AS cost%(reverse_cost)s - FROM %(edge_table)s - %(where_clause)s', - %(source_id)s, %(target_id)s, - %(directed)s, %(has_reverse_cost)s, - %(turn_restrict_sql)s) - """ % args - - def getExportQuery(self, args): - return self.getJoinResultWithEdgeTable(args) - - def getExportMergeQuery(self, args): - return self.getExportOneSourceOneTargetMergeQuery(args) - - - def draw(self, rows, con, args, geomType, canvasItemList, mapCanvas): - ''' draw the result ''' - resultPathRubberBand = canvasItemList['path'] - for row in rows: - cur2 = con.cursor() - args['result_node_id'] = row[1] - args['result_edge_id'] = row[2] - args['result_cost'] = row[3] - if args['result_edge_id'] != -1: - query2 = """ - SELECT ST_AsText(%(transform_s)s%(geometry)s%(transform_e)s) FROM %(edge_table)s - WHERE %(source)s = %(result_node_id)d AND %(id)s = %(result_edge_id)d - UNION - SELECT ST_AsText(%(transform_s)sST_Reverse(%(geometry)s)%(transform_e)s) FROM %(edge_table)s - WHERE %(target)s = %(result_node_id)d AND %(id)s = %(result_edge_id)d; - """ % args - ##Utils.logMessage(query2) - cur2.execute(query2) - row2 = cur2.fetchone() - ##Utils.logMessage(str(row2[0])) - assert row2, "Invalid result geometry. (node_id:%(result_node_id)d, edge_id:%(result_edge_id)d)" % args - - geom = QgsGeometry().fromWkt(str(row2[0])) - if geom.wkbType() == QgsWkbTypes.MultiLineString: - for line in geom.asMultiPolyline(): - for pt in line: - resultPathRubberBand.addPoint(pt) - elif geom.wkbType() == QgsWkbTypes.LineString: - for pt in geom.asPolyline(): - resultPathRubberBand.addPoint(pt) - - def __init__(self, ui): - FunctionBase.__init__(self, ui) diff --git a/functions/trsp_via_edges.py b/functions/trsp_via_edges.py deleted file mode 100755 index 7eabaa2..0000000 --- a/functions/trsp_via_edges.py +++ /dev/null @@ -1,279 +0,0 @@ -from __future__ import absolute_import -from qgis.PyQt.QtCore import * -from builtins import str -from qgis.PyQt.QtGui import QColor -from qgis.core import Qgis, QgsGeometry, QgsWkbTypes -from qgis.gui import QgsRubberBand -import psycopg2 -from pgRoutingLayer import pgRoutingLayer_utils as Utils -from .FunctionBase import FunctionBase - -class Function(FunctionBase): - - @classmethod - def getName(self): - ''' returns Function name. ''' - return 'trsp(via edges)' - - @classmethod - def getControlNames(self, version): - ''' returns control names. ''' - return [ - 'labelId', 'lineEditId', - 'labelSource', 'lineEditSource', - 'labelTarget', 'lineEditTarget', - 'labelCost', 'lineEditCost', - 'labelReverseCost', 'lineEditReverseCost', - 'labelIds', 'lineEditIds', 'buttonSelectIds', - 'labelPcts', 'lineEditPcts', - 'checkBoxDirected', 'checkBoxHasReverseCost', - 'labelTurnRestrictSql', 'plainTextEditTurnRestrictSql' - ] - - @classmethod - def isEdgeBase(self): - return True - - @classmethod - def canExport(self): - return True - - @classmethod - def canExportMerged(self): - return True - - def isSupportedVersion(self, version): - return version >= 2.1 - - def prepare(self, canvasItemList): - resultPathsRubberBands = canvasItemList['paths'] - for path in resultPathsRubberBands: - path.reset(Utils.getRubberBandType(False)) - canvasItemList['paths'] = [] - - def getQuery(self, args): - ''' returns the sql query in required signature format of trsp_via_edges ''' - return """ - SELECT seq, id1 AS _path, id2 AS _node, id3 AS _edge, cost as _cost FROM pgr_trspViaEdges(' - SELECT %(id)s::int4 AS id, - %(source)s::int4 AS source, %(target)s::int4 AS target, - %(cost)s::float8 AS cost%(reverse_cost)s - FROM %(edge_table)s - WHERE %(edge_table)s.%(geometry)s && %(BBOX)s', - ARRAY[%(ids)s]::integer[], ARRAY[%(pcts)s]::float8[], - %(directed)s, %(has_reverse_cost)s, %(turn_restrict_sql)s)""" % args - - def getQueries(self, args): - args['edge_data_q'] = """ - edge_data AS ( - SELECT - unnest(ARRAY[%(ids)s::integer]) AS eid, - unnest(ARRAY[%(pcts)s::float8]) AS fraction - ), - geom_data AS ( - SELECT row_number() over() AS seq, - %(id)s, %(source)s, %(target)s, fraction, - ST_LineSubstring(%(geometry)s, fraction, 1) as totarget, - ST_Reverse(ST_LineSubstring(%(geometry)s, 0, fraction)) as tosource - FROM %(edge_table)s JOIN edge_data ON (%(edge_table)s.%(id)s = edge_data.eid) - ) - """ % args - - args['result_q'] = """ - result AS ( - SELECT seq, id1 AS _path, id2 AS _node, id3 AS _edge, cost as _cost - FROM pgr_trspViaEdges( - 'SELECT gid::int4 AS id, source::int4 AS source, target::int4 AS target, cost_s::float8 AS cost, reverse_cost_s::float8 AS reverse_cost - FROM %(edge_table)s WHERE %(edge_table)s.%(geometry)s && %(BBOX)s', - (select array_agg(eid::integer) from edge_data), - (select array_agg(fraction::float) from edge_data), - %(directed)s, %(has_reverse_cost)s, %(turn_restrict_sql)s) - ) - """ % args - - args['the_rest_q'] = """ - result1 AS ( - SELECT seq, _path, lead(_path) over (ORDER BY seq) AS nextpath, - _node, lead(_node) over(ORDER BY seq) AS nextnode, _edge, _cost FROM result - ), - result_geom AS ( - SELECT CASE - WHEN result1.nextnode = %(target)s - THEN %(geometry)s - ELSE ST_Reverse(%(geometry)s) - END AS path_geom, - result1.* - FROM %(edge_table)s JOIN result1 ON %(id)s = result1._edge ORDER BY result1.seq - ), - first_node AS ( - SELECT result1.seq, _node, nextnode, _edge, _cost, - CASE WHEN result1.nextnode = geom_data.target THEN geom_data.totarget ELSE geom_data.tosource END AS path_geom - FROM geom_data JOIN result1 ON geom_data.gid = result1._edge WHERE _node = -1 - ), - uturn_node AS ( - SELECT result1.seq, _node, nextnode, _edge, _cost, - CASE WHEN result1._node = geom_data.source THEN ST_MakeLine(ARRAY[ST_reverse(tosource), tosource]) ELSE ST_MakeLine(ARRAY[ST_reverse(totarget), totarget]) END AS path_geom - FROM geom_data JOIN result1 ON (gid = _edge) WHERE _node = nextnode - ), - last_node AS ( - SELECT result1.seq, _node, nextnode, _edge, _cost, - CASE - WHEN result1.nextnode = geom_data.target - THEN ST_Reverse(geom_data.totarget) - ELSE ST_reverse(geom_data.tosource) - END AS path_geom - FROM geom_data JOIN result1 ON geom_data.gid = result1._edge WHERE result1.seq = (select max(seq) from result1) - ), - normal_edge AS ( - SELECT * - FROM result_geom - WHERE _path = nextpath AND _node != -1 AND _node != nextnode AND seq != (select max(seq) from result) - ), - all_edges AS ( - SELECT seq, _node, _edge, _cost, path_geom FROM first_node - UNION SELECT seq, _node, _edge, _cost, path_geom FROM last_node - UNION SELECT seq, _node, _edge, _cost, path_geom FROM uturn_node - UNION SELECT seq, _node, _edge, _cost, path_geom FROM normal_edge - ) - """ % args - - - def getExportQuery(self, args): - self.getQueries(args) - - query = """ - WITH - %(edge_data_q)s, - %(result_q)s, - %(the_rest_q)s - SELECT - all_edges.*, %(edge_table)s.* - FROM %(edge_table)s JOIN all_edges - ON %(edge_table)s.%(id)s = all_edges._edge ORDER BY all_edges.seq - """ % args - return query - - def getExportMergeQuery(self, args): - self.getQueries(args) - - query = """ - WITH - %(edge_data_q)s, - %(result_q)s, - %(the_rest_q)s - SELECT 1 as seq, - array_agg(_node) as _nodes, - array_agg(_edge) as _edges, - ST_makeLine(path_geom) AS path_geom from all_edges - """ % args - return query - - def draw(self, rows, con, args, geomType, canvasItemList, mapCanvas): - ''' draw the result ''' - resultPathsRubberBands = canvasItemList['paths'] - rubberBand = None - cur_path_id = -1 - - i = 0 - count = len(rows) - ids = args['ids'].split(',') - args['last_id'] = ids[len(ids) - 1] - pcts = args['pcts'].split(',') - pct_idx = 0 - for row in rows: - cur2 = con.cursor() - args['result_path_id'] = row[1] - args['result_node_id'] = row[2] - args['result_edge_id'] = row[3] - args['result_cost'] = row[4] - - if args['result_path_id'] != cur_path_id: - cur_path_id = args['result_path_id'] - if rubberBand: - resultPathsRubberBands.append(rubberBand) - rubberBand = None - - rubberBand = QgsRubberBand(mapCanvas, Utils.getRubberBandType(False)) - rubberBand.setColor(QColor(255, 0, 0, 128)) - rubberBand.setWidth(4) - - query2 = "" - if i < (count - 1): - args['result_next_path_id'] = rows[i + 1][1] - args['result_next_node_id'] = rows[i + 1][2] - if args['result_next_path_id'] != args['result_path_id']: - pct_idx += 1 - elif i == (count - 1): - pct_idx = len(pcts) - 1 - args['current_pct'] = pcts[pct_idx] - - if i == 0 and args['result_node_id'] == -1: - query2 = """ - SELECT ST_AsText(%(transform_s)sST_Line_Substring(%(geometry)s, %(current_pct)s, 1.0)%(transform_e)s) FROM %(edge_table)s - WHERE %(target)s = %(result_next_node_id)s AND %(id)s = %(result_edge_id)s - UNION - SELECT ST_AsText(%(transform_s)sST_Line_Substring(ST_Reverse(%(geometry)s), 1.0 - %(current_pct)s, 1.0)%(transform_e)s) FROM %(edge_table)s - WHERE %(source)s = %(result_next_node_id)s AND %(id)s = %(result_edge_id)s; - """ % args - elif i < (count - 1) and (args['result_path_id'] != args['result_next_path_id']) and (args['result_node_id'] == args['result_next_node_id']): - # round trip case - query2 = """ - SELECT ST_AsText(ST_LineMerge(ST_Collect(ARRAY[ - ( - SELECT ST_AsText(%(transform_s)sST_Line_Substring(%(geometry)s, 0.0, %(current_pct)s)%(transform_e)s) FROM %(edge_table)s - WHERE %(source)s = %(result_node_id)s AND %(id)s = %(result_edge_id)s - UNION - SELECT ST_AsText(%(transform_s)sST_Line_Substring(ST_Reverse(%(geometry)s), 0.0, 1.0 - %(current_pct)s)%(transform_e)s) FROM %(edge_table)s - WHERE %(target)s = %(result_node_id)s AND %(id)s = %(result_edge_id)s - ), - ( - SELECT ST_AsText(%(transform_s)sST_Reverse(ST_Line_Substring(%(geometry)s, 0.0, %(current_pct)s))%(transform_e)s) FROM %(edge_table)s - WHERE %(source)s = %(result_node_id)s AND %(id)s = %(result_edge_id)s - UNION - SELECT ST_AsText(%(transform_s)sST_Reverse(ST_Line_Substring(ST_Reverse(%(geometry)s), 0.0, 1.0 - %(current_pct)s))%(transform_e)s) FROM %(edge_table)s - WHERE %(target)s = %(result_node_id)s AND %(id)s = %(result_edge_id)s - )]))); - """ % args - elif i == (count - 1) and ((args['result_edge_id'] == -1) or (str(args['result_edge_id']) == args['last_id'])): - if args['result_edge_id'] != -1: - query2 = """ - SELECT ST_AsText(%(transform_s)sST_Line_Substring(%(geometry)s, 0.0, %(current_pct)s)%(transform_e)s) FROM %(edge_table)s - WHERE %(source)s = %(result_node_id)s AND %(id)s = %(result_edge_id)s - UNION - SELECT ST_AsText(%(transform_s)sST_Line_Substring(ST_Reverse(%(geometry)s), 0.0, 1.0 - %(current_pct)s)%(transform_e)s) FROM %(edge_table)s - WHERE %(target)s = %(result_node_id)s AND %(id)s = %(result_edge_id)s; - """ % args - else: - break - else: - query2 = """ - SELECT ST_AsText(%(transform_s)s%(geometry)s%(transform_e)s) FROM %(edge_table)s - WHERE %(source)s = %(result_node_id)d AND %(id)s = %(result_edge_id)d - UNION - SELECT ST_AsText(%(transform_s)sST_Reverse(%(geometry)s)%(transform_e)s) FROM %(edge_table)s - WHERE %(target)s = %(result_node_id)d AND %(id)s = %(result_edge_id)d; - """ % args - - ##Utils.logMessage(query2) - cur2.execute(query2) - row2 = cur2.fetchone() - ##Utils.logMessage(str(row2[0])) - assert row2, "Invalid result geometry. (node_id:%(result_node_id)d, edge_id:%(result_edge_id)d)" % args - - geom = QgsGeometry().fromWkt(str(row2[0])) - if geom.wkbType() == QgsWkbTypes.MultiLineString: - for line in geom.asMultiPolyline(): - for pt in line: - rubberBand.addPoint(pt) - elif geom.wkbType() == QgsWkbTypes.LineString: - for pt in geom.asPolyline(): - rubberBand.addPoint(pt) - - i = i + 1 - - if rubberBand: - resultPathsRubberBands.append(rubberBand) - rubberBand = None - - def __init__(self, ui): - FunctionBase.__init__(self, ui) diff --git a/functions/trsp_via_vertices.py b/functions/trsp_via_vertices.py deleted file mode 100755 index 8523b04..0000000 --- a/functions/trsp_via_vertices.py +++ /dev/null @@ -1,125 +0,0 @@ -from __future__ import absolute_import -from qgis.PyQt.QtCore import * -from builtins import str -from qgis.PyQt.QtGui import QColor -from qgis.core import Qgis, QgsGeometry, QgsWkbTypes -from qgis.gui import QgsRubberBand -import psycopg2 -from pgRoutingLayer import pgRoutingLayer_utils as Utils -from .FunctionBase import FunctionBase - -class Function(FunctionBase): - - @classmethod - def getName(self): - ''' returns Function name. ''' - return 'trsp(via vertices)' - - @classmethod - def getControlNames(self, version): - ''' returns control names. ''' - return self.commonControls + self.commonBoxes + [ - 'labelIds', 'lineEditIds', 'buttonSelectIds', - 'labelTurnRestrictSql', 'plainTextEditTurnRestrictSql' - ] - - - def isSupportedVersion(self, version): - ''' checks the supported version ''' - return version >= 2.1 - - def prepare(self, canvasItemList): - resultPathsRubberBands = canvasItemList['paths'] - for path in resultPathsRubberBands: - path.reset(Utils.getRubberBandType(False)) - canvasItemList['paths'] = [] - - def getQuery(self, args): - ''' returns the sql query in required signature format of trsp_via_vertices ''' - args['where_clause'] = self.whereClause(args['edge_table'], args['geometry'], args['BBOX']) - return """ - SELECT seq, id1 AS _path, id2 AS _node, id3 AS _edge, cost AS _cost FROM pgr_trspViaVertices(' - SELECT %(id)s::int4 AS id, - %(source)s::int4 AS source, %(target)s::int4 AS target, - %(cost)s::float8 AS cost%(reverse_cost)s - FROM %(edge_table)s - %(where_clause)s', - ARRAY[%(ids)s]::integer[], - %(directed)s, %(has_reverse_cost)s, - %(turn_restrict_sql)s) - """ % args - - def getExportQuery(self, args): - args['result_query'] = self.getQuery(args) - - query = """ - WITH - result AS ( %(result_query)s ) - SELECT - CASE - WHEN result._node = %(edge_table)s.%(source)s - THEN %(edge_table)s.%(geometry)s - ELSE ST_Reverse(%(edge_table)s.%(geometry)s) - END AS path_geom, - result.*, %(edge_table)s.* - FROM %(edge_table)s JOIN result - ON %(edge_table)s.%(id)s = result._edge ORDER BY result.seq - """ % args - return query - - - - def getExportMergeQuery(self, args): - return self.getExportOneSourceOneTargetMergeQuery(args) - - - def draw(self, rows, con, args, geomType, canvasItemList, mapCanvas): - resultPathsRubberBands = canvasItemList['paths'] - rubberBand = None - cur_path_id = -1 - - for row in rows: - cur2 = con.cursor() - args['result_path_id'] = row[1] - args['result_node_id'] = row[2] - args['result_edge_id'] = row[3] - args['result_cost'] = row[4] - if args['result_path_id'] != cur_path_id: - cur_path_id = args['result_path_id'] - if rubberBand: - resultPathsRubberBands.append(rubberBand) - rubberBand = None - - rubberBand = QgsRubberBand(mapCanvas, Utils.getRubberBandType(False)) - rubberBand.setColor(QColor(255, 0, 0, 128)) - rubberBand.setWidth(4) - - if args['result_edge_id'] != -1: - query2 = """ - SELECT ST_AsText(%(transform_s)s%(geometry)s%(transform_e)s) FROM %(edge_table)s - WHERE %(source)s = %(result_node_id)d AND %(id)s = %(result_edge_id)d - UNION - SELECT ST_AsText(%(transform_s)sST_Reverse(%(geometry)s)%(transform_e)s) FROM %(edge_table)s - WHERE %(target)s = %(result_node_id)d AND %(id)s = %(result_edge_id)d; - """ % args - ##Utils.logMessage(query2) - cur2.execute(query2) - row2 = cur2.fetchone() - ##Utils.logMessage(str(row2[0])) - assert row2, "Invalid result geometry. (node_id:%(result_node_id)d, edge_id:%(result_edge_id)d)" % args - - geom = QgsGeometry().fromWkt(str(row2[0])) - if geom.wkbType() == QgsWkbTypes.MultiLineString: - for line in geom.asMultiPolyline(): - for pt in line: - rubberBand.addPoint(pt) - elif geom.wkbType() == QgsWkbTypes.LineString: - for pt in geom.asPolyline(): - rubberBand.addPoint(pt) - - if rubberBand: - resultPathsRubberBands.append(rubberBand) - rubberBand = None - - def __init__(self, ui): - FunctionBase.__init__(self, ui) diff --git a/functions/tsp_euclid.py b/functions/tsp_euclid.py deleted file mode 100755 index 7693033..0000000 --- a/functions/tsp_euclid.py +++ /dev/null @@ -1,177 +0,0 @@ -from __future__ import absolute_import -from builtins import str -from qgis.PyQt.QtCore import QPointF, QSizeF -from qgis.PyQt.QtGui import QTextDocument -from qgis.core import QgsGeometry, Qgis, QgsTextAnnotation, QgsWkbTypes -from qgis.gui import * -import psycopg2 -from pgRoutingLayer import pgRoutingLayer_utils as Utils -from .FunctionBase import FunctionBase - -class Function(FunctionBase): - - @classmethod - def getName(self): - ''' returns Function name. ''' - return 'tsp(euclid)' - - @classmethod - def getControlNames(self, version): - ''' returns control names. ''' - return [ - 'labelId', 'lineEditId', - 'labelSource', 'lineEditSource', - 'labelTarget', 'lineEditTarget', - 'labelIds', 'lineEditIds', 'buttonSelectIds', - 'labelSourceId', 'lineEditSourceId', 'buttonSelectSourceId', - 'labelTargetId', 'lineEditTargetId', 'buttonSelectTargetId' - ] - - @classmethod - def canExport(self): - return False - - @classmethod - def canExportMerged(self): - return False - - def isSupportedVersion(self, version): - return version >= 2.0 - - def prepare(self, canvasItemList): - resultNodesTextAnnotations = canvasItemList['annotations'] - for anno in resultNodesTextAnnotations: - anno.setVisible(False) - canvasItemList['annotations'] = [] - - def getQuery(self, args): - ''' returns the sql query in required signature format of tsp_euclid ''' - return """ - SELECT seq, id1 AS internal, id2 AS node, cost FROM pgr_tsp(' - SELECT id::int4, - ST_X(the_geom) AS x, - ST_Y(the_geom) AS y, - the_geom - FROM %(edge_table)s_vertices_pgr WHERE id IN (%(ids)s)', - %(source_id)s::int4, %(target_id)s::int4) - """ % args - - def getExportQuery(self, args): - args['result_query'] = self.getQuery(args) - - query = """ - WITH - result AS ( %(result_query)s ) - SELECT - CASE - WHEN result._node = %(edge_table)s.%(source)s - THEN %(edge_table)s.%(geometry)s - ELSE ST_Reverse(%(edge_table)s.%(geometry)s) - END AS path_geom, - result.*, %(edge_table)s.* - FROM %(edge_table)s JOIN result - ON %(edge_table)s.%(id)s = result._edge ORDER BY result.seq - """ % args - return query - - def draw(self, rows, con, args, geomType, canvasItemList, mapCanvas): - ''' draw the result ''' - resultPathsRubberBands = canvasItemList['path'] - i = 0 - for row in rows: - if i == 0: - prevrow = row - firstrow = row - i += 1 - cur2 = con.cursor() - args['result_seq'] = row[0] - args['result_source_id'] = prevrow[2] - args['result_target_id'] = row[2] - args['result_cost'] = row[3] - query2 = """ - SELECT ST_AsText( ST_MakeLine( - (SELECT the_geom FROM %(edge_table)s_vertices_pgr WHERE id = %(result_source_id)d), - (SELECT the_geom FROM %(edge_table)s_vertices_pgr WHERE id = %(result_target_id)d) - )) - """ % args - ##Utils.logMessage(query2) - cur2.execute(query2) - row2 = cur2.fetchone() - ##Utils.logMessage(str(row2[0])) - assert row2, "Invalid result geometry. (path_id:%(result_path_id)d, saource_id:%(result_source_id)d, target_id:%(result_target_id)d)" % args - - geom = QgsGeometry().fromWkt(str(row2[0])) - if geom.wkbType() == QgsWkbTypes.MultiLineString: - for line in geom.asMultiPolyline(): - for pt in line: - resultPathsRubberBands.addPoint(pt) - elif geom.wkbType() == QgsWkbTypes.LineString: - for pt in geom.asPolyline(): - resultPathsRubberBands.addPoint(pt) - prevrow = row - lastrow = row - - args['result_source_id'] = lastrow[2] - args['result_target_id'] = firstrow[2] - args['result_cost'] = row[3] - query2 = """ - SELECT ST_AsText( ST_MakeLine( - (SELECT the_geom FROM %(edge_table)s_vertices_pgr WHERE id = %(result_source_id)d), - (SELECT the_geom FROM %(edge_table)s_vertices_pgr WHERE id = %(result_target_id)d) - )) - """ % args - # Utils.logMessage(query2) - cur2.execute(query2) - row2 = cur2.fetchone() - # Utils.logMessage(str(row2[0])) - assert row2, "Invalid result geometry. (path_id:%(result_path_id)d, saource_id:%(result_source_id)d, target_id:%(result_target_id)d)" % args - - geom = QgsGeometry().fromWkt(str(row2[0])) - if geom.wkbType() == QgsWkbTypes.MultiLineString: - for line in geom.asMultiPolyline(): - for pt in line: - resultPathsRubberBands.addPoint(pt) - elif geom.wkbType() == QgsWkbTypes.LineString: - for pt in geom.asPolyline(): - resultPathsRubberBands.addPoint(pt) - - - - - - ############ ANOTATIONS - resultNodesTextAnnotations = canvasItemList['annotations'] - Utils.setStartPoint(geomType, args) - Utils.setEndPoint(geomType, args) - # return columns are 'seq', 'id1(internal index)', 'id2(node id)', 'cost' - for row in rows: - cur2 = con.cursor() - args['result_seq'] = row[0] - args['result_internal_id'] = row[1] - args['result_node_id'] = row[2] - args['result_cost'] = row[3] - query2 = """ - SELECT ST_AsText(%(transform_s)s%(startpoint)s%(transform_e)s) FROM %(edge_table)s - WHERE %(source)s = %(result_node_id)d - UNION - SELECT ST_AsText(%(transform_s)s%(endpoint)s%(transform_e)s) FROM %(edge_table)s - WHERE %(target)s = %(result_node_id)d - """ % args - cur2.execute(query2) - row2 = cur2.fetchone() - assert row2, "Invalid result geometry. (node_id:%(result_node_id)d)" % args - - geom = QgsGeometry().fromWkt(str(row2[0])) - pt = geom.asPoint() - textDocument = QTextDocument("%(result_seq)d:%(result_node_id)d" % args) - textAnnotation = QgsTextAnnotation() - textAnnotation.setMapPosition(geom.asPoint()) - textAnnotation.setFrameSize(QSizeF(textDocument.idealWidth(), 20)) - textAnnotation.setFrameOffsetFromReferencePoint(QPointF(20, -40)) - textAnnotation.setDocument(textDocument) - - QgsMapCanvasAnnotationItem(textAnnotation, mapCanvas) - resultNodesTextAnnotations.append(textAnnotation) - - def __init__(self, ui): - FunctionBase.__init__(self, ui) diff --git a/help/Makefile b/help/Makefile new file mode 100755 index 0000000..9def777 --- /dev/null +++ b/help/Makefile @@ -0,0 +1,130 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/template_class.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/template_class.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/template_class" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/template_class" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + make -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/help/make.bat b/help/make.bat new file mode 100755 index 0000000..3377610 --- /dev/null +++ b/help/make.bat @@ -0,0 +1,155 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. changes to make an overview over all changed/added/deprecated items + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\template_class.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\template_class.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +:end diff --git a/help/source/conf.py b/help/source/conf.py new file mode 100755 index 0000000..a5aca08 --- /dev/null +++ b/help/source/conf.py @@ -0,0 +1,216 @@ +# -*- coding: utf-8 -*- +# +# PhotoLinker documentation build configuration file, created by +# sphinx-quickstart on Sun Feb 12 17:11:03 2012. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +#import sys, os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['sphinx.ext.todo', 'sphinx.ext.imgmath', 'sphinx.ext.viewcode'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'pgRoutingLayer' +copyright = u'2018, pgRouting team' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '3.0' +# The full version, including alpha/beta/rc tags. +release = '3.0' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = [] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_TemplateModuleNames = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'TemplateClassdoc' + + +# -- Options for LaTeX output -------------------------------------------------- + +# The paper size ('letter' or 'a4'). +#latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +#latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'pgRoutingLayer.tex', u'pgRoutingLayer Documentation', + u'pgRouting team', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Additional stuff for the LaTeX preamble. +#latex_preamble = '' + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'TemplateClass', u'pgRoutingLayer Documentation', + [u'foo'], 1) +] diff --git a/help/source/index.rst b/help/source/index.rst new file mode 100755 index 0000000..553c567 --- /dev/null +++ b/help/source/index.rst @@ -0,0 +1,20 @@ +.. PhotoLinker documentation master file, created by + sphinx-quickstart on Sun Feb 12 17:11:03 2012. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to PhotoLinker's documentation! +============================================ + +Contents: + +.. toctree:: + :maxdepth: 2 + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/icons/about.png b/icons/about.png new file mode 100755 index 0000000000000000000000000000000000000000..22d2c170f6b903cff322c9fa7ffad7f4186e1b7b GIT binary patch literal 2262 zcmV;{2r2i8P)@EAl&A3gC443JU_?l4G30h$j&|2iBfPJB@QfO&!TiVPWN+z;2RsWUq>tyKcCRUlSr2m-n8@+AQS0)5a%?=Be| zKiJqU`So`^&pU4Ai?&ZgJoiQuO{aR0hQyE(Ap}wi1R||PYmL^LrIkf&yXi{GW)%=iBzfZ5w-c}I zKXKack6qKUyDl-=o-x(D7Fi{SU)^$j_44fxZ17s9!Rw8uc?XR>NZ ziFvZ4Z+19mPhzNb-+P~NLD6m716kT?ee=n07tEQS$4d>zc#E=F% z_I!i}?%Z^hVVcGr3)j?T0hj<0zi-p(D@$ZSP6o%@dujb7gvVn}3Od&fra{tH968g^ zdo8{64n;78VBONW+*(_f23IvVfX6aPN*fm|ojt>x?i!$~ILPX&OXa>pZJU6Xr4##l z+YQ&u^CRHkN8L^^8IIo#*Y_zfzj)~=ul?gJ10!*~9t+E3ajJU|t#vw>r6kSRWES6V z=>cH<@(RC@Vq2O4G)t<>rvuRTNoYzmo5qAIEYl<$x3MhK1t*bGuxe3Jx&~;iIoCgi zWf`t&jn<%)=In(b0IEt0(ONH=03Zky7G$OCx^#_C76*u&r~$6jF1&&jRnybPZKZhk zL?4!EfOd+LQX0dMTnfiQ2&Uy_qS1lL43O_OmeEMU4Jt7KL^>`p+`^Me&DD!%uxjBX zC!(bzQVN92 zN=o6i^8;z)N+}Mv4$<8ob(wMirOl&yBA z0r(@a`h(49)$nMHs?tK{%?Z%mdx=zlrgn->rIlve>RIWQ4Dj;dew0!UBdLGTXje(` zj9li;DqtiW=biW4ls^)yPrIO{u`ZlUs$GAsZ?*++_svTXLb%GDJWf3;rBSxRGQcvx zl#V3ElZ+>AlD0zG%K1)dv~qyov9=Nf{Ppk0Y};15S{m!Z6IlQxlGYicele$4nU<8iScp9$8C~Ho1|@H+je?wb8R_gMS1jv!u)af;o(@q zdgL?nz(_|!G`D=6?mRzSyRo*yswxgL78|FdXUK_YA)Sm6jz_O5%fr^1r0szEpnaI6 ztsDR@6XQvn>lPKUd1V<%Tk(UZ8Y1o8{ZDl7eR%)pjAUAr-TbT9w{ED}@YCw;TWmU7*qA~dl5`NsH*_00|KZ$7*Qg#Mh7 z>@jB6T=(j+GXt9kE=7YY7SA!}%??mgUPx#pO5ae#f$aXC^7G{3BWc^rE6U?r>no`) z2@)T-`Q-}-5--*_pY(bo8~abKwZCvGp0(nk467jcQccCI^-nx-qrc3Za?f2H;dn9@QlQW(J+U(s^N+A3gQAXmiWicY6=Na8GowJp@EA z=Um_ia*9@e?|xrS@S)q+E%ANlYs<{JSL9vRQR>r+BRu~`Q}X4#AI77h?q_-q{b2_% z>dFwHz6gL9$Of`A3d?2&s)7b|hS2d>{}dlS-|HF<1B1ZW<(`ZrkO|}fnU>|x&Z$_x++R3vy_Jzu z14gbE((foyQM5gh7#lhn={xhzNc%g@$z&|-(j5kdT@cAHdpI=!3-Gz@_}nULxj+?Q k0|{4RK-_&!^8bAO3q6Oq>b67H1poj507*qoM6N<$f><3=cmMzZ literal 0 HcmV?d00001 diff --git a/icons/pgr_fn.svg b/icons/pgr_fn.svg new file mode 100755 index 0000000..4255ba2 --- /dev/null +++ b/icons/pgr_fn.svg @@ -0,0 +1,84 @@ + + + + + + + + + + image/svg+xml + + + + + + + pgr_ () + + + + diff --git a/metadata.txt b/metadata.txt index 4832c8d..950df7a 100755 --- a/metadata.txt +++ b/metadata.txt @@ -2,28 +2,26 @@ name=pgRoutingLayer description=Dockable widget that adds pgRouting layers about=Dockable widget that adds pgRouting layers -version=2.2.2 + - pgr_astar pgr_astarCost + - pgr_bdAstar pgr_astarCost + - pgr_dijstra pgr_dijstraCost + - pgr_bdDijstra pgr_bdDijstraCost + - pgr_KSP +version=3.0.0 qgisMinimumVersion=3.0 -qgisMaximumVersion=4.0 -author=Anita Graser, Ko Nagase, Vicky Vergara +qgisMaximumVersion=3.99 +author=Anita Graser, Ko Nagase, Vicky Vergara, Cayetano Benavent, Aasheesh Tiwari email=project@pgrouting.org -changelog=2.2.2 - - Bug fix: activating alphashape.py to use BBOX by mixedbredie - 2.2.1 - - Bug fix activating plugin - 2.2.0 - - Support for pgRouting V2.0 up to v2.5 - - BBOX is optional - 2.1.0 - - change support sites - - port to pgRouting 2.1 API by pgRouting team - - drop QGIS 1.8 support - 2.0.0 - - port to 2.0 API by Ko Nagase +changelog=3.0.0 + - Support for QGIS 3 (Python 3 and PyQt5). + - Removed deprecated functions. + - Support only for some functions that are known to be on pgRouting 3.0 + 2.2.2 + - Last experimental release works only for QGIS 2.x tags=pgRouting,PostGIS,routing,network analysis icon=icon.png -experimental=True -homepage=https://github.com/pgRouting/pgRoutingLayer/wiki -tracker=https://github.com/pgRouting/pgRoutingLayer +experimental=False +homepage=https://qgis.pgrouting.org/ +tracker=https://github.com/pgRouting/pgRoutingLayer/issues repository=https://github.com/pgRouting/pgRoutingLayer category=Database diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100755 index 0000000..964fd6b --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,18 @@ +site_name: pgRoutingLayer +nav: +- Home: index.md +- Introduction: + - Main buttons: intro/buttons.md + - Layer naming convention: intro/layer_naming_convention.md +- Functions: + - pgr_aStar: functions/pgr_aStar.md + - pgr_astarCost: functions/pgr_astarCost.md + - pgr_bdAstar: functions/pgr_bdAstar.md + - pgr_bdAstarCost: functions/pgr_bdAstarCost.md + - pgr_bdDijkstra: functions/pgr_bdDijkstra.md + - pgr_bdDijkstraCost: functions/pgr_bdDijkstraCost.md + - pgr_djikstra: functions/pgr_dijkstra.md + - pgr_djikstraCost: functions/pgr_dijkstraCost.md + - pgr_KSP: functions/pgr_KSP.md + +theme: readthedocs diff --git a/pb_tool.cfg b/pb_tool.cfg new file mode 100755 index 0000000..6b15e07 --- /dev/null +++ b/pb_tool.cfg @@ -0,0 +1,42 @@ +[plugin] +# Name of the plugin. This is the name of the directory that will +# be created in .qgis2/python/plugins +name: pgRoutingLayer + +# Full path to where you want your plugin directory copied. If empty, +# the QGIS default path will be used. Don't include the plugin name in +# the path. +# if this does not work then use like +# pb_tool deploy -p /home/vicky/.local/share/QGIS/QGIS3/profiles/default/python/plugins + +plugin_path: ~/.local/share/QGIS/QGIS3/profiles/default/python/plugins/ + +[files] +# Python files that should be deployed with the plugin +python_files: __init__.py pgRoutingLayer.py pgRoutingLayer_utils.py dbConnection.py + +# The main dialog file that is loaded (not compiled) +main_dialog: ui_pgRoutingLayer.ui + +# Other ui files for dialogs you create (these will be compiled) +compiled_ui_files: + +# Resource file(s) that will be compiled +resource_files: resources.qrc + +# Other files required for the plugin +extras: metadata.txt icon.png + +# Other directories to be deployed with the plugin. +# These must be subdirectories under the plugin directory +extra_dirs: functions connectors utilities icons + +# ISO code(s) for any locales (translations), separated by spaces. +# Corresponding .ts files must exist in the i18n directory +locales: + +[help] +# the built help directory that should be deployed with the plugin +dir: help/build/html +# the name of the directory to target in the deployed plugin +target: help diff --git a/pgRoutingLayer.py b/pgRoutingLayer.py index 13cc00b..7877652 100755 --- a/pgRoutingLayer.py +++ b/pgRoutingLayer.py @@ -1,61 +1,66 @@ -""" -/*************************************************************************** - pgRouting Layer - a QGIS plugin - - based on "Fast SQL Layer" plugin. Copyright 2011 Pablo Torres Carreira - ------------------- - begin : 2011-11-25 - copyright : (c) 2011 by Anita Graser - email : anita.graser.at@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -""" +# -*- coding: utf-8 -*- +# /*PGR-GNU***************************************************************** +# File: pgRoutingLayer.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - AasheeshT +# - cayetanobv +# - sanak +# - veniversum +# - cvvergara +# - anitagraser +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ + from __future__ import absolute_import # Import the PyQt and QGIS libraries -from builtins import str -from builtins import object from qgis.PyQt import uic -from qgis.PyQt.QtCore import Qt, QObject, pyqtSignal, QRegExp, QSettings -from qgis.PyQt.QtGui import QColor, QIcon, QIntValidator, QDoubleValidator,QRegExpValidator, QCursor -from qgis.PyQt.QtWidgets import QAction, QDockWidget, QApplication, QLabel, QLineEdit, QPushButton, QWidget,QGridLayout,QToolButton,QVBoxLayout,QHBoxLayout,QSplitter,QGroupBox,QScrollArea,QPlainTextEdit, QMessageBox -from qgis.core import QgsMessageLog,Qgis,QgsRectangle, QgsCoordinateReferenceSystem, QgsCoordinateTransform, QgsProject, QgsGeometry,QgsWkbTypes -from qgis.gui import QgsVertexMarker,QgsRubberBand,QgsMapToolEmitPoint +from qgis.PyQt.QtCore import Qt, QRegExp, QSettings, QUrl +from qgis.PyQt.QtGui import QColor, QIcon, QIntValidator, QDoubleValidator, QRegExpValidator, QCursor +from qgis.PyQt.QtWidgets import QAction, QApplication, QMessageBox +from qgis.core import QgsRectangle, QgsCoordinateReferenceSystem, QgsCoordinateTransform +from qgis.core import QgsProject, QgsGeometry, QgsWkbTypes +from qgis.gui import QgsVertexMarker, QgsRubberBand, QgsMapToolEmitPoint from pgRoutingLayer import dbConnection -from qgis.utils import iface from pgRoutingLayer import pgRoutingLayer_utils as Utils -#import highlighter as hl +from pgRoutingLayer.utilities import pgr_queries as PgrQ import os import psycopg2 +from psycopg2 import sql import re +from PyQt5.QtGui import QDesktopServices conn = dbConnection.ConnectionManager() -class PgRoutingLayer(object): + +class PgRoutingLayer: SUPPORTED_FUNCTIONS = [ - 'tsp_euclid', - 'dijkstra', - 'trsp_vertex', - 'astar', - 'drivingDistance', - 'alphashape', - 'tsp_euclid', - 'bdDijkstra', - 'bdAstar', - 'dijkstraCost', - 'trsp_edge', - 'ksp', - 'trsp_via_vertices', - 'trsp_via_edges' + + 'pgr_aStar', + 'pgr_aStarCost', + 'pgr_bdAstar', + 'pgr_bdAstarCost', + 'pgr_bdDijkstra', + 'pgr_bdDijkstraCost', + 'pgr_dijkstra', + 'pgr_dijkstraCost', + 'pgr_KSP', ] TOGGLE_CONTROL_NAMES = [ @@ -64,12 +69,17 @@ class PgRoutingLayer(object): 'labelTarget', 'lineEditTarget', 'labelCost', 'lineEditCost', 'labelReverseCost', 'lineEditReverseCost', + 'labelX1', 'lineEditX1', 'labelY1', 'lineEditY1', 'labelX2', 'lineEditX2', 'labelY2', 'lineEditY2', - 'labelRule', 'lineEditRule', - 'labelToCost', 'lineEditToCost', + 'labelAstarHeuristic', 'selectAstarHeuristic', + 'labelAstarFactor', 'selectAstarFactor', + 'labelAstarEpsilon', 'selectAstarEpsilon', 'showAstarEpsilon', + + # 'labelRule', 'lineEditRule', + # 'labelToCost', 'lineEditToCost', 'labelIds', 'lineEditIds', 'buttonSelectIds', 'labelPcts', 'lineEditPcts', 'labelSourceId', 'lineEditSourceId', 'buttonSelectSourceId', @@ -86,13 +96,26 @@ class PgRoutingLayer(object): 'checkBoxHeapPaths', 'checkBoxUseBBOX', 'labelTurnRestrictSql', 'plainTextEditTurnRestrictSql', + # 'checkBoxDetails', + # 'label_pointsTable','lineEditPointsTable', + # 'labelPid', 'lineEditPid', 'labelEdge_id', 'lineEditEdge_id', + # 'labelFraction', 'lineEditFraction', 'labelSide', 'lineEditSide','labelDrivingSide','checkBoxLeft','checkBoxRight' + ] + + ASTAR_HEURISTICS = [ + '= 0', + '= abs(max(dx, dy))', + '= abs(min(dx, dy))', + '= dx * dx + dy * dy', + '= sqrt(dx * dx + dy * dy)', + '= abs(dx) + abs(dy)', ] + FIND_RADIUS = 10 FRACTION_DECIMAL_PLACES = 2 version = 2.6 functions = {} - def __init__(self, iface): # Save reference to the QGIS interface self.iface = iface @@ -127,21 +150,19 @@ def __init__(self, iface): resultAreaRubberBand = QgsRubberBand(self.iface.mapCanvas(), Utils.getRubberBandType(True)) resultAreaRubberBand.setColor(Qt.magenta) resultAreaRubberBand.setWidth(2) - if not Utils.isQGISv1(): - resultAreaRubberBand.setBrushStyle(Qt.Dense4Pattern) + resultAreaRubberBand.setBrushStyle(Qt.Dense4Pattern) self.canvasItemList['area'] = resultAreaRubberBand def initGui(self): # Create action that will start plugin configuration self.action = QAction(QIcon(":/plugins/pgRoutingLayer/icon.png"), "pgRouting Layer", self.iface.mainWindow()) - #Add toolbar button and menu item + # Add toolbar button and menu item self.iface.addPluginToDatabaseMenu("&pgRouting Layer", self.action) - #self.iface.addToolBarIcon(self.action) - #load the form + # load the form path = os.path.dirname(os.path.abspath(__file__)) self.dock = uic.loadUi(os.path.join(path, "ui_pgRoutingLayer.ui")) - self.iface.addDockWidget(Qt.LeftDockWidgetArea, self.dock) + self.iface.addDockWidget(Qt.RightDockWidgetArea, self.dock) self.idsEmitPoint = QgsMapToolEmitPoint(self.iface.mapCanvas()) self.sourceIdEmitPoint = QgsMapToolEmitPoint(self.iface.mapCanvas()) @@ -149,12 +170,7 @@ def initGui(self): self.sourceIdsEmitPoint = QgsMapToolEmitPoint(self.iface.mapCanvas()) self.targetIdsEmitPoint = QgsMapToolEmitPoint(self.iface.mapCanvas()) - #self.idsEmitPoint.setButton(buttonSelectIds) - #self.targetIdEmitPoint.setButton(buttonSelectTargetId) - #self.sourceIdEmitPoint.setButton(buttonSelectSourceId) - #self.targetIdsEmitPoint.setButton(buttonSelectTargetId) - - #connect the action to each method + # connect the action to each method self.action.triggered.connect(self.show) self.dock.buttonReloadConnections.clicked.connect(self.reloadConnections) self.dock.comboConnections.currentIndexChanged.connect(self.updateConnectionEnabled) @@ -170,6 +186,9 @@ def initGui(self): self.dock.buttonSelectTargetId.clicked.connect(self.selectTargetId) self.targetIdEmitPoint.canvasClicked.connect(self.setTargetId) + # Function help + self.dock.buttonFunctionHelp.clicked.connect(self.openHelp) + # More than one source id can be selected in some functions/version self.dock.buttonSelectSourceIds.clicked.connect(self.selectSourceIds) self.sourceIdsEmitPoint.canvasClicked.connect(self.setSourceIds) @@ -188,11 +207,18 @@ def initGui(self): self.functions = {} for funcfname in self.SUPPORTED_FUNCTIONS: # import the function - exec("from pgRoutingLayer.functions import %s as function" % funcfname, globals(),globals()) + exec("from pgRoutingLayer.functions import %s as function" % funcfname, globals(), globals()) funcname = function.Function.getName() self.functions[funcname] = function.Function(self.dock) self.dock.comboBoxFunction.addItem(funcname) + for heuristic in self.ASTAR_HEURISTICS: + self.dock.selectAstarHeuristic.addItem(heuristic) + + self.dock.selectAstarEpsilon.setMinimum(0) + self.dock.selectAstarEpsilon.setMinimum(1) + self.dock.selectAstarEpsilon.valueChanged.connect(self.astarEpsilonChanged) + self.dock.lineEditIds.setValidator(QRegExpValidator(QRegExp("[0-9,]+"), self.dock)) self.dock.lineEditPcts.setValidator(QRegExpValidator(QRegExp("[0-9,.]+"), self.dock)) @@ -209,7 +235,7 @@ def initGui(self): self.dock.lineEditAlpha.setValidator(QDoubleValidator()) self.dock.lineEditPaths.setValidator(QIntValidator()) - #populate the combo with connections + # populate the combo with connections self.reloadMessage = False self.reloadConnections() self.loadSettings() @@ -238,14 +264,13 @@ def reloadConnections(self): actions = conn.getAvailableConnections() self.actionsDb = {} for a in actions: - self.actionsDb[ str(a.text()) ] = a + self.actionsDb[str(a.text())] = a for dbname in self.actionsDb: db = None try: db = self.actionsDb[dbname].connect() con = db.con - version = Utils.getPgrVersion(con) if (Utils.getPgrVersion(con) != 0): self.dock.comboConnections.addItem(dbname) @@ -266,11 +291,10 @@ def reloadConnections(self): self.reloadMessage = oldReloadMessage self.updateConnectionEnabled() - def updateConnectionEnabled(self): - ''' Updates the database connection name and function ''' + ''' Updates the database connection name and function ''' dbname = str(self.dock.comboConnections.currentText()) - if dbname =='': + if dbname == '': return db = self.actionsDb[dbname].connect() @@ -278,11 +302,10 @@ def updateConnectionEnabled(self): self.version = Utils.getPgrVersion(con) if self.reloadMessage: QMessageBox.information(self.dock, self.dock.windowTitle(), - 'Selected database: ' + dbname + '\npgRouting version: ' + str(self.version)) + 'Selected database: ' + dbname + '\npgRouting version: ' + str(self.version)) - - currentFunction = str (self.dock.comboBoxFunction.currentText()) - if currentFunction ==' ': + currentFunction = str(self.dock.comboBoxFunction.currentText()) + if currentFunction == ' ': return self.loadFunctionsForVersion() @@ -293,8 +316,8 @@ def loadFunctionsForVersion(self): currentText = str(self.dock.comboBoxFunction.currentText()) self.dock.comboBoxFunction.clear() - #for funcname, function in self.functions.items(): - for funcname in sorted(self.functions): + # for funcname, function in self.functions.items(): + for funcname in self.functions: function = self.functions[funcname] if (function.isSupportedVersion(self.version)): self.dock.comboBoxFunction.addItem(function.getName()) @@ -303,12 +326,10 @@ def loadFunctionsForVersion(self): if idx >= 0: self.dock.comboBoxFunction.setCurrentIndex(idx) - - def updateFunctionEnabled(self, text): ''' Updates the GUI fields of the selected function. ''' - text = str (self.dock.comboBoxFunction.currentText()) - if text== '': + text = str(self.dock.comboBoxFunction.currentText()) + if text == '': return self.clear() function = self.functions.get(str(text)) @@ -327,15 +348,11 @@ def updateFunctionEnabled(self, text): self.dock.gridLayoutSqlColumns.invalidate() self.dock.gridLayoutArguments.invalidate() - gridLayoutSqlColumnsHeight = self.dock.gridLayoutSqlColumns.sizeHint().height() - gridLayoutArgumentsHeight = self.dock.gridLayoutArguments.sizeHint().height() - self.dock.splitter.setSizes([gridLayoutSqlColumnsHeight + 97, gridLayoutArgumentsHeight + 47]) - if (not self.dock.checkBoxHasReverseCost.isChecked()) or (not self.dock.checkBoxHasReverseCost.isEnabled()): self.dock.lineEditReverseCost.setEnabled(False) # if type(edge/node) changed, clear input - if (self.prevType != None) and (self.prevType != function.isEdgeBase()): + if (self.prevType is not None) and (self.prevType != function.isEdgeBase()): self.clear() self.prevType = function.isEdgeBase() @@ -366,16 +383,16 @@ def selectIds(self, checked): def setIds(self, pt): ''' Sets the ids on mapCanvas with color ''' function = self.functions[str(self.dock.comboBoxFunction.currentText())] - args = self.getBaseArguments() + args = self.getArguments() mapCanvas = self.iface.mapCanvas() if not function.isEdgeBase(): - result, id, wkt = self.findNearestNode(args, pt) + result, the_id, wkt = self.findNearestNode(args, pt) if result: ids = self.dock.lineEditIds.text() if not ids: - self.dock.lineEditIds.setText(str(id)) + self.dock.lineEditIds.setText(str(the_id)) else: - self.dock.lineEditIds.setText(ids + "," + str(id)) + self.dock.lineEditIds.setText(ids + "," + str(the_id)) geom = QgsGeometry().fromWkt(wkt) vertexMarker = QgsVertexMarker(mapCanvas) vertexMarker.setColor(Qt.green) @@ -383,13 +400,13 @@ def setIds(self, pt): vertexMarker.setCenter(geom.asPoint()) self.idsVertexMarkers.append(vertexMarker) else: - result, id, wkt, pos, pointWkt = self.findNearestLink(args, pt) + result, the_id, wkt, pos, pointWkt = self.findNearestLink(args, pt) if result: ids = self.dock.lineEditIds.text() if not ids: - self.dock.lineEditIds.setText(str(id)) + self.dock.lineEditIds.setText(str(the_id)) else: - self.dock.lineEditIds.setText(ids + "," + str(id)) + self.dock.lineEditIds.setText(ids + "," + str(the_id)) geom = QgsGeometry().fromWkt(wkt) idRubberBand = QgsRubberBand(mapCanvas, Utils.getRubberBandType(False)) idRubberBand.setColor(Qt.yellow) @@ -429,19 +446,19 @@ def selectSourceId(self, checked): def setSourceId(self, pt): ''' Sets the source id by finding nearest node and displays in mapCanvas with color ''' function = self.functions[str(self.dock.comboBoxFunction.currentText())] - args = self.getBaseArguments() + args = self.getArguments() if not function.isEdgeBase(): - result, id, wkt = self.findNearestNode(args, pt) + result, source_id, wkt = self.findNearestNode(args, pt) if result: - self.dock.lineEditSourceId.setText(str(id)) + self.dock.lineEditSourceId.setText(str(source_id)) geom = QgsGeometry().fromWkt(wkt) self.sourceIdVertexMarker.setCenter(geom.asPoint()) self.sourceIdVertexMarker.setVisible(True) self.dock.buttonSelectSourceId.click() else: - result, id, wkt, pos, pointWkt = self.findNearestLink(args, pt) + result, source_id, wkt, pos, pointWkt = self.findNearestLink(args, pt) if result: - self.dock.lineEditSourceId.setText(str(id)) + self.dock.lineEditSourceId.setText(str(source_id)) geom = QgsGeometry().fromWkt(wkt) if geom.wkbType() == QgsWkbTypes.MultiLineString: for line in geom.asMultiPolyline(): @@ -457,7 +474,6 @@ def setSourceId(self, pt): self.dock.buttonSelectSourceId.click() Utils.refreshMapCanvas(self.iface.mapCanvas()) - def selectSourceIds(self, checked): ''' Selects the source ids and dispaly its value on lineEdit. ''' if checked: @@ -473,14 +489,14 @@ def selectSourceIds(self, checked): def setSourceIds(self, pt): ''' Sets the source id by finding nearest node and displays in mapCanvas with color ''' - args = self.getBaseArguments() - result, id, wkt = self.findNearestNode(args, pt) + args = self.getArguments() + result, source_id, wkt = self.findNearestNode(args, pt) if result: ids = self.dock.lineEditSourceIds.text() if not ids: - self.dock.lineEditSourceIds.setText(str(id)) + self.dock.lineEditSourceIds.setText(str(source_id)) else: - self.dock.lineEditSourceIds.setText(ids + "," + str(id)) + self.dock.lineEditSourceIds.setText(ids + "," + str(source_id)) geom = QgsGeometry().fromWkt(wkt) mapCanvas = self.iface.mapCanvas() vertexMarker = QgsVertexMarker(mapCanvas) @@ -490,7 +506,6 @@ def setSourceIds(self, pt): self.sourceIdsVertexMarkers.append(vertexMarker) Utils.refreshMapCanvas(mapCanvas) - def selectTargetId(self, checked): ''' Selects the target id and dispaly its value on lineEdit. ''' if checked: @@ -505,19 +520,19 @@ def selectTargetId(self, checked): def setTargetId(self, pt): ''' Sets the target id by finding nearest node and displays in mapCanvas with color ''' function = self.functions[str(self.dock.comboBoxFunction.currentText())] - args = self.getBaseArguments() + args = self.getArguments() if not function.isEdgeBase(): - result, id, wkt = self.findNearestNode(args, pt) + result, target_id, wkt = self.findNearestNode(args, pt) if result: - self.dock.lineEditTargetId.setText(str(id)) + self.dock.lineEditTargetId.setText(str(target_id)) geom = QgsGeometry().fromWkt(wkt) self.targetIdVertexMarker.setCenter(geom.asPoint()) self.targetIdVertexMarker.setVisible(True) self.dock.buttonSelectTargetId.click() else: - result, id, wkt, pos, pointWkt = self.findNearestLink(args, pt) + result, target_id, wkt, pos, pointWkt = self.findNearestLink(args, pt) if result: - self.dock.lineEditTargetId.setText(str(id)) + self.dock.lineEditTargetId.setText(str(target_id)) geom = QgsGeometry().fromWkt(wkt) if geom.wkbType() == QgsWkbTypes.MultiLineString: for line in geom.asMultiPolyline(): @@ -548,14 +563,14 @@ def selectTargetIds(self, checked): def setTargetIds(self, pt): ''' Sets the target ids by finding nearest node and displays in mapCanvas with color ''' - args = self.getBaseArguments() - result, id, wkt = self.findNearestNode(args, pt) + args = self.getArguments() + result, targetId, wkt = self.findNearestNode(args, pt) if result: ids = self.dock.lineEditTargetIds.text() if not ids: - self.dock.lineEditTargetIds.setText(str(id)) + self.dock.lineEditTargetIds.setText(str(targetId)) else: - self.dock.lineEditTargetIds.setText(ids + "," + str(id)) + self.dock.lineEditTargetIds.setText(ids + "," + str(targetId)) geom = QgsGeometry().fromWkt(wkt) mapCanvas = self.iface.mapCanvas() vertexMarker = QgsVertexMarker(mapCanvas) @@ -565,6 +580,14 @@ def setTargetIds(self, pt): self.targetIdsVertexMarkers.append(vertexMarker) Utils.refreshMapCanvas(mapCanvas) + def astarEpsilonChanged(self, state): + ''' + This method will be called when the epsilon slider is dragged by the user. + The value() of the slider ranges from 1-99 + ''' + size = self.dock.selectAstarEpsilon.value() / 100 + self.dock.showAstarEpsilon.setText(str(size)) + def updateReverseCostEnabled(self, state): ''' Updates the reverse cost checkBox ''' if state == Qt.Checked: @@ -576,50 +599,47 @@ def run(self): """ Draws a Preview on the canvas""" QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) - function = self.functions[str(self.dock.comboBoxFunction.currentText())] - args = self.getArguments(function.getControlNames(self.version)) - - empties = [] - for key in list(args.keys()): - if not args[key]: - empties.append(key) - - if len(empties) > 0: - QApplication.restoreOverrideCursor() - QMessageBox.warning(self.dock, self.dock.windowTitle(), - 'Following argument is not specified.\n' + ','.join(empties)) - return - db = None try: dbname = str(self.dock.comboConnections.currentText()) db = self.actionsDb[dbname].connect() - con = db.con + function = self.functions[str(self.dock.comboBoxFunction.currentText())] + args = self.getArguments() + + empties = [] + for key in list(args.keys()): + if key != 'srid' and not args[key]: + empties.append(key) + + if len(empties) > 0: + QApplication.restoreOverrideCursor() + QMessageBox.warning(self.dock, self.dock.windowTitle(), + 'Following argument is not specified.\n' + ','.join(empties)) + return + version = Utils.getPgrVersion(con) args['version'] = version - srid, geomType = Utils.getSridAndGeomType(con, args['edge_table'], args['geometry']) if (function.getName() == 'tsp(euclid)'): - args['node_query'] = Utils.getNodeQuery(args, geomType) + args['node_query'] = PgrQ.getNodeQuery(args) function.prepare(self.canvasItemList) + cur = con.cursor() + cur.execute(function.getQuery(args).as_string(con)) - args['BBOX'], args['printBBOX'] = self.getBBOX(srid, args['use_bbox']) - query = function.getQuery(args) - #QMessageBox.information(self.dock, self.dock.windowTitle(), 'Geometry Query:' + query) + # QMessageBox.information(self.dock, self.dock.windowTitle(), 'Geometry Query:' + + # function.getQuery(args).as_string(con)) - cur = con.cursor() - cur.execute(query) rows = cur.fetchall() - if len(rows) == 0: - QMessageBox.information(self.dock, self.dock.windowTitle(), 'No paths found in ' + self.getLayerName(args)) + if len(rows) == 0: + QMessageBox.information(self.dock, self.dock.windowTitle(), + 'No paths found in ' + self.getLayerName(args, con)) - args['srid'] = srid args['canvas_srid'] = Utils.getCanvasSrid(Utils.getDestinationCrs(self.iface.mapCanvas())) - Utils.setTransformQuotes(args, srid, args['canvas_srid']) - function.draw(rows, con, args, geomType, self.canvasItemList, self.iface.mapCanvas()) + Utils.setTransformQuotes(args, args['srid'], args['canvas_srid']) + function.draw(rows, con, args, args['geomType'], self.canvasItemList, self.iface.mapCanvas()) except psycopg2.DatabaseError as e: QApplication.restoreOverrideCursor() @@ -638,63 +658,56 @@ def run(self): if db and db.con: try: db.con.close() - except: + except Exception: QMessageBox.critical(self.dock, self.dock.windowTitle(), - 'server closed the connection unexpectedly') + 'server closed the connection unexpectedly') def export(self): ''' Exports the result layer ''' QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) - function = self.functions[str(self.dock.comboBoxFunction.currentText())] - args = self.getArguments(function.getControlNames(self.version)) - - empties = [] - for key in list(args.keys()): - if not args[key]: - empties.append(key) - - if len(empties) > 0: - QApplication.restoreOverrideCursor() - QMessageBox.warning(self.dock, self.dock.windowTitle(), - 'Following argument is not specified.\n' + ','.join(empties)) - return - db = None try: dbname = str(self.dock.comboConnections.currentText()) db = self.actionsDb[dbname].connect() - con = db.con - version = Utils.getPgrVersion(con) + function = self.functions[str(self.dock.comboBoxFunction.currentText())] + args = self.getArguments() - args['version'] = version - if (self.version!=version) : + empties = [] + for key in list(args.keys()): + if key != 'srid' and not args[key]: + empties.append(key) + + if len(empties) > 0: + QApplication.restoreOverrideCursor() QMessageBox.warning(self.dock, self.dock.windowTitle(), - 'versions are different') + 'Following argument is not specified.\n' + ','.join(empties)) + return + version = Utils.getPgrVersion(con) - srid, geomType = Utils.getSridAndGeomType(con, '%(edge_table)s' % args, '%(geometry)s' % args) - args['BBOX'], args['printBBOX'] = self.getBBOX(srid, args['use_bbox']) + args['version'] = version + if (self.version != version): + QMessageBox.warning(self.dock, self.dock.windowTitle(), + 'versions are different') - #get the EXPORT query + # get the EXPORT query msgQuery = function.getExportQuery(args) - #QMessageBox.information(self.dock, self.dock.windowTitle(), 'Geometry Query:\n' + msgQuery) - Utils.logMessage('Export:\n' + msgQuery) + # Utils.logMessage('Export:\n' + msgQuery.as_string(con)) - query = self.cleanQuery(msgQuery) + query = self.cleanQuery(msgQuery.as_string(con)) uri = db.getURI() uri.setDataSource("", "(" + query + ")", "path_geom", "", "seq") - layerName = self.getLayerName(args) + layerName = self.getLayerName(args, con) vl = self.iface.addVectorLayer(uri.uri(), layerName, db.getProviderName()) if not vl: - QMessageBox.information(self.dock, self.dock.windowTitle(), 'Invalid Layer:\n - No paths found or\n - Failed to create vector layer from query') - #QMessageBox.information(self.dock, self.dock.windowTitle(), 'pgRouting Query:' + function.getQuery(args)) - #QMessageBox.information(self.dock, self.dock.windowTitle(), 'Geometry Query:' + msgQuery) + QMessageBox.information(self.dock, self.dock.windowTitle(), + 'Invalid Layer:\n - No paths found or\n - Failed to create vector layer from query') except psycopg2.DatabaseError as e: QApplication.restoreOverrideCursor() @@ -709,11 +722,12 @@ def export(self): if db and db.con: try: db.con.close() - except: + except Exception: QMessageBox.critical(self.dock, self.dock.windowTitle(), - 'server closed the connection unexpectedly') + 'server closed the connection unexpectedly') - def cleanQuery(self, msgQuery): + @classmethod + def cleanQuery(cls, msgQuery): ''' Cleans the query ''' query = msgQuery.replace('\n', ' ') query = re.sub(r'\s+', ' ', query) @@ -722,70 +736,79 @@ def cleanQuery(self, msgQuery): query = query.strip() return query - def getBBOX(self, srid, use_bbox): - """ Returns the (Ready to use in query BBOX , print BBOX) """ - if use_bbox == 'false': - return ' ', ' ' + def getBBOX(self, srid): + """ + Returns the in ready to use args: BBOX , printBBOX + """ bbox = {} - bbox['srid'] = srid - bbox['xMin'] = self.iface.mapCanvas().extent().xMinimum() - bbox['yMin'] = self.iface.mapCanvas().extent().yMinimum() - bbox['xMax'] = self.iface.mapCanvas().extent().xMaximum() - bbox['yMax'] = self.iface.mapCanvas().extent().yMaximum() - text = "BBOX(" + str(round(bbox['xMin'],2)) - text += " " + str(round(bbox['yMin'],2)) - text += "," + str(round(bbox['xMax'],2)) - text += " " + str(round(bbox['yMax'],2)) + ")" - return """ - && ST_MakeEnvelope( - %(xMin)s, %(yMin)s, - %(xMax)s, %(yMax)s, %(srid)s + canvasCrs = Utils.getDestinationCrs(self.iface.mapCanvas()) + canvasSrid = Utils.getCanvasSrid(canvasCrs) + bbox['srid'] = sql.Literal(canvasSrid) + bbox['prefix'] = sql.SQL("") + bbox['suffix'] = sql.SQL("") + if srid != canvasSrid: + if srid == 0: + bbox['prefix'] = sql.SQL("ST_SetSRID(") + else: + bbox['prefix'] = sql.SQL("ST_Transform(") + bbox['suffix'] = sql.SQL(", {})").format(sql.Literal(srid)) + xMin = self.iface.mapCanvas().extent().xMinimum() + yMin = self.iface.mapCanvas().extent().yMinimum() + xMax = self.iface.mapCanvas().extent().xMaximum() + yMax = self.iface.mapCanvas().extent().yMaximum() + bbox['xMin'] = sql.Literal(xMin) + bbox['yMin'] = sql.Literal(yMin) + bbox['xMax'] = sql.Literal(xMax) + bbox['yMax'] = sql.Literal(yMax) + text = "BBOX(" + str(round(xMin, 2)) + text += " " + str(round(yMin, 2)) + text += "," + str(round(xMax, 2)) + text += " " + str(round(yMax, 2)) + ")" + return sql.SQL(""" + ST_MakeEnvelope( + {xMin}, {yMin}, + {xMax}, {yMax}, {srid} ) - """ % bbox, text - + """).format(**bbox), text def exportMerged(self): ''' exports the result layer with input layer ''' QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) - function = self.functions[str(self.dock.comboBoxFunction.currentText())] - args = self.getArguments(function.getControlNames(self.version)) - - empties = [] - for key in list(args.keys()): - if not args[key]: - empties.append(key) - - if len(empties) > 0: - QApplication.restoreOverrideCursor() - QMessageBox.warning(self.dock, self.dock.windowTitle(), - 'Following argument is not specified.\n' + ','.join(empties)) - return - db = None try: dbname = str(self.dock.comboConnections.currentText()) db = self.actionsDb[dbname].connect() - con = db.con + function = self.functions[str(self.dock.comboBoxFunction.currentText())] + args = self.getArguments() + + empties = [] + for key in list(args.keys()): + if key != 'srid' and not args[key]: + empties.append(key) + + if len(empties) > 0: + QApplication.restoreOverrideCursor() + QMessageBox.warning(self.dock, self.dock.windowTitle(), + 'Following argument is not specified.\n' + ','.join(empties)) + return + version = Utils.getPgrVersion(con) args['version'] = version - srid, geomType = Utils.getSridAndGeomType(con, '%(edge_table)s' % args, '%(geometry)s' % args) - args['BBOX'], args['printBBOX'] = self.getBBOX(srid, args['use_bbox']) - # get the exportMerge query msgQuery = function.getExportMergeQuery(args) - Utils.logMessage('Export merged:\n' + msgQuery) + Utils.logMessage('Export merged:\n' + msgQuery.as_string(con)) - query = self.cleanQuery(msgQuery) + query = self.cleanQuery(msgQuery.as_string(con)) uri = db.getURI() uri.setDataSource("", "(" + query + ")", "path_geom", "", "seq") # add vector layer to map - layerName = self.getLayerName(args, 'M') + layerName = self.getLayerName(args, con, 'M') vl = self.iface.addVectorLayer(uri.uri(), layerName, db.getProviderName()) if not vl: @@ -797,9 +820,11 @@ def exportMerged(self): 'alphaShape' ] if function.getName() in bigIntFunctions: - QMessageBox.information(self.dock, self.dock.windowTitle(), 'Invalid Layer:\n - No paths found') + QMessageBox.information(self.dock, self.dock.windowTitle(), + 'Invalid Layer:\n - No paths found') else: - QMessageBox.information(self.dock, self.dock.windowTitle(), 'Invalid Layer:\n - No paths found or\n - Failed to create vector layer from query') + QMessageBox.information(self.dock, self.dock.windowTitle(), + 'Invalid Layer:\n - No paths found or\n - Failed to create vector layer from query') except psycopg2.DatabaseError as e: QApplication.restoreOverrideCursor() @@ -814,30 +839,29 @@ def exportMerged(self): if db and db.con: try: db.con.close() - except: + except Exception: QMessageBox.critical(self.dock, self.dock.windowTitle(), - 'server closed the connection unexpectedly') + 'server closed the connection unexpectedly') - def getLayerName(self, args, letter=''): + def getLayerName(self, args, con, letter=''): ''' returns the layer Name ''' function = self.functions[str(self.dock.comboBoxFunction.currentText())] layerName = "(" + letter if 'directed' in args and args['directed'] == 'true': - layerName += "D) " + layerName += "D) " else: - layerName += "U) " + layerName += "U) " layerName += function.getName() + ": " - if 'source_id' in args: - layerName += args['source_id'] + layerName += args['source_id'].as_string(con) elif 'ids' in args: layerName += "{" + args['ids'] + "}" else: - layerName += "[" + args['source_ids'] + "]" + layerName += "[" + args['source_ids'].as_string(con) + "]" if 'ids' in args: layerName += " " @@ -846,45 +870,42 @@ def getLayerName(self, args, letter=''): else: layerName += " to " if 'target_id' in args: - layerName += args['target_id'] + layerName += args['target_id'].as_string(con) else: - layerName += "[" + args['target_ids'] + "]" + layerName += "[" + args['target_ids'].as_string(con) + "]" if 'paths' in args: - layerName += " - K = " + args['paths'] + layerName += " - K = " + args['paths'] if 'heap_paths' in args and args['heap_paths'] == 'true': layerName += '+' - layerName += " " + args['printBBOX'] + layerName += " " + args['printBBOX'] return layerName - - - def clear(self): ''' Clears the selected ids ''' - #self.dock.lineEditIds.setText("") + # self.dock.lineEditIds.setText("") for marker in self.idsVertexMarkers: marker.setVisible(False) self.idsVertexMarkers = [] - #self.dock.lineEditSourceIds.setText("") + # self.dock.lineEditSourceIds.setText("") for marker in self.sourceIdsVertexMarkers: marker.setVisible(False) self.sourceIdsVertexMarkers = [] - #self.dock.lineEditTargetIds.setText("") + # self.dock.lineEditTargetIds.setText("") for marker in self.targetIdsVertexMarkers: marker.setVisible(False) self.targetIdsVertexMarkers = [] - #self.dock.lineEditPcts.setText("") - #self.dock.lineEditSourceId.setText("") + # self.dock.lineEditPcts.setText("") + # self.dock.lineEditSourceId.setText("") self.sourceIdVertexMarker.setVisible(False) - #self.dock.lineEditSourcePos.setText("0.5") - #self.dock.lineEditTargetId.setText("") + # self.dock.lineEditSourcePos.setText("0.5") + # self.dock.lineEditTargetId.setText("") self.targetIdVertexMarker.setVisible(False) - #self.dock.lineEditTargetPos.setText("0.5") + # self.dock.lineEditTargetPos.setText("0.5") for rubberBand in self.idsRubberBands: rubberBand.reset(Utils.getRubberBandType(False)) self.idsRubberBands = [] @@ -917,43 +938,112 @@ def toggleSelectButton(self, button): if selectButton.isChecked(): selectButton.click() - def getArguments(self, controls): - ''' updates the GUI field text to args ''' + def get_innerQueryArguments(self, controls): + args = {} + + args['edge_schema'] = sql.Identifier(str(self.dock.lineEditSchema.text())) + args['edge_table'] = sql.Identifier(str(self.dock.lineEditTable.text())) + args['geometry'] = sql.Identifier(str(self.dock.lineEditGeometry.text())) + args['id'] = sql.Identifier(str(self.dock.lineEditId.text())) + args['source'] = sql.Identifier(str(self.dock.lineEditSource.text())) + args['target'] = sql.Identifier(str(self.dock.lineEditTarget.text())) + args['cost'] = sql.Identifier(str(self.dock.lineEditCost.text())) + + if not self.dock.checkBoxHasReverseCost.isChecked(): + args['reverse_cost'] = sql.SQL(" -1 ") + else: + args['reverse_cost'] = sql.SQL("{}").format(sql.Identifier( + str(self.dock.lineEditReverseCost.text()))) + + if 'lineEditX1' in controls: + args['x1'] = sql.Identifier(self.dock.lineEditX1.text()) + args['y1'] = sql.Identifier(self.dock.lineEditY1.text()) + args['x2'] = sql.Identifier(self.dock.lineEditX2.text()) + args['y2'] = sql.Identifier(self.dock.lineEditY2.text()) + + return args + + def get_whereClause(self, edge_schema, edge_table, geometry, conn): + args = {} + args['srid'], args['geomType'] = Utils.getSridAndGeomType(conn, edge_schema, edge_table, geometry) + args['dbsrid'] = sql.Literal(args['srid']) + if self.dock.checkBoxUseBBOX.isChecked(): + args['BBOX'], args['printBBOX'] = self.getBBOX(args['srid']) + args['where_clause'] = sql.SQL(' WHERE {0}.{1} && {2}').format(edge_table, geometry, + args['BBOX']) + else: + args['BBOX'] = sql.SQL("") + args['printBBOX'] = ' ' + args['where_clause'] = sql.SQL(' WHERE true ') + + return args + + def get_innerQuery(self, controls, conn): args = {} - args['edge_table'] = self.dock.lineEditTable.text() - args['geometry'] = self.dock.lineEditGeometry.text() - if 'lineEditId' in controls: - args['id'] = self.dock.lineEditId.text() + args = self.get_innerQueryArguments(controls) + args.update(self.get_whereClause(args['edge_schema'], args['edge_table'], args['geometry'], conn)) - if 'lineEditSource' in controls: - args['source'] = self.dock.lineEditSource.text() + if 'lineEditX1' not in controls: + args['innerQuery'] = PgrQ.getEdgesQuery(args) + else: + args['innerQuery'] = PgrQ.getEdgesQueryXY(args) - if 'lineEditTarget' in controls: - args['target'] = self.dock.lineEditTarget.text() + return args - if 'lineEditCost' in controls: - args['cost'] = self.dock.lineEditCost.text() + def getArguments(self): + ''' updates the GUI field text to args ''' + db = None + try: + dbname = str(self.dock.comboConnections.currentText()) + db = self.actionsDb[dbname].connect() - if 'lineEditReverseCost' in controls: - args['reverse_cost'] = self.dock.lineEditReverseCost.text() + function = self.functions[str(self.dock.comboBoxFunction.currentText())] + return self._getArguments(function.getControlNames(self.version), db.con) - if 'lineEditX1' in controls: - args['x1'] = self.dock.lineEditX1.text() + except psycopg2.DatabaseError as e: + QApplication.restoreOverrideCursor() + QMessageBox.critical(self.dock, self.dock.windowTitle(), '%s' % e) - if 'lineEditY1' in controls: - args['y1'] = self.dock.lineEditY1.text() + except SystemError as e: + QApplication.restoreOverrideCursor() + QMessageBox.critical(self.dock, self.dock.windowTitle(), '%s' % e) + + except AssertionError as e: + QApplication.restoreOverrideCursor() + QMessageBox.warning(self.dock, self.dock.windowTitle(), '%s' % e) + + finally: + QApplication.restoreOverrideCursor() + if db and db.con: + try: + db.con.close() + except Exception: + QMessageBox.critical(self.dock, self.dock.windowTitle(), + 'server closed the connection unexpectedly') - if 'lineEditX2' in controls: - args['x2'] = self.dock.lineEditX2.text() + def _getArguments(self, controls, conn): + ''' updates the GUI field text to args ''' - if 'lineEditY2' in controls: - args['y2'] = self.dock.lineEditY2.text() + args = {} + args = self.get_innerQuery(controls, conn) + function = str(self.dock.comboBoxFunction.currentText()).lower() + args['function'] = sql.Identifier(str(function)) + + if function in ['pgr_astarcost', 'pgr_dijkstracost', 'pgr_bdastarcost', 'pgr_bddijkstracost']: + # TODO: capture vertices table, geometry of vertices table + args['vertex_schema'] = sql.Identifier(str(self.dock.lineEditSchema.text())) + args['vertex_table'] = sql.Identifier(str(self.dock.lineEditTable.text()) + '_vertices_pgr') + args['geometry_vt'] = sql.Identifier(str(self.dock.lineEditGeometry.text())) + # QMessageBox.information(self.dock, self.dock.windowTitle(), + # 'TODO: capture vertices table, geometry of vertices table, label the edges') - if 'lineEditRule' in controls: - args['rule'] = self.dock.lineEditRule.text() + if 'lineEditX1' in controls: + args['astarHeuristic'] = sql.Literal(str(self.dock.selectAstarHeuristic.currentIndex())) + args['astarFactor'] = sql.Literal(str(self.dock.selectAstarFactor.text())) + args['astarEpsilon'] = sql.Literal(str(self.dock.selectAstarEpsilon.value())) - if 'lineEditToCost' in controls: - args['to_cost'] = self.dock.lineEditToCost.text() + # args['rule'] = self.dock.lineEditRule.text() if 'lineEditRule' in controls + # args['to_cost'] = self.dock.lineEditToCost.text() if 'lineEditToCost' in controls: if 'lineEditIds' in controls: args['ids'] = self.dock.lineEditIds.text() @@ -961,23 +1051,26 @@ def getArguments(self, controls): if 'lineEditPcts' in controls: args['pcts'] = self.dock.lineEditPcts.text() + # Used in pgr_KSP if 'lineEditSourceId' in controls: - args['source_id'] = self.dock.lineEditSourceId.text() + args['source_id'] = sql.Literal(self.dock.lineEditSourceId.text()) + args['target_id'] = sql.Literal(self.dock.lineEditTargetId.text()) + + # Used in pgr_KSP + if 'lineEditPaths' in controls: + args['Kpaths'] = sql.Literal(self.dock.lineEditPaths.text()) if 'lineEditSourcePos' in controls: args['source_pos'] = self.dock.lineEditSourcePos.text() if 'lineEditSourceIds' in controls: - args['source_ids'] = self.dock.lineEditSourceIds.text() - - if 'lineEditTargetId' in controls: - args['target_id'] = self.dock.lineEditTargetId.text() + args['source_ids'] = sql.SQL("string_to_array({}, ',')::BIGINT[]").format(sql.Literal(str(self.dock.lineEditSourceIds.text()))) if 'lineEditTargetPos' in controls: args['target_pos'] = self.dock.lineEditTargetPos.text() if 'lineEditTargetIds' in controls: - args['target_ids'] = self.dock.lineEditTargetIds.text() + args['target_ids'] = sql.SQL("string_to_array({}, ',')::BIGINT[]").format(sql.Literal(str(self.dock.lineEditTargetIds.text()))) if 'lineEditDistance' in controls: args['distance'] = self.dock.lineEditDistance.text() @@ -985,251 +1078,78 @@ def getArguments(self, controls): if 'lineEditAlpha' in controls: args['alpha'] = self.dock.lineEditAlpha.text() - if 'lineEditPaths' in controls: - args['paths'] = self.dock.lineEditPaths.text() - - if 'checkBoxDirected' in controls: - args['directed'] = str(self.dock.checkBoxDirected.isChecked()).lower() + args['directed'] = sql.SQL("directed := {}::BOOLEAN").format(sql.Literal(str(self.dock.checkBoxDirected.isChecked()).lower())) if 'checkBoxHeapPaths' in controls: - args['heap_paths'] = str(self.dock.checkBoxHeapPaths.isChecked()).lower() - - if 'checkBoxUseBBOX' in controls: - args['use_bbox'] = str(self.dock.checkBoxUseBBOX.isChecked()).lower() - else: - args['use_bbox'] = 'false' + args['heap_paths'] = sql.SQL("heap_paths := {}::BOOLEAN").format(sql.Literal(str(self.dock.checkBoxHeapPaths.isChecked()).lower())) - - - if 'checkBoxHasReverseCost' in controls: - args['has_reverse_cost'] = str(self.dock.checkBoxHasReverseCost.isChecked()).lower() - if args['has_reverse_cost'] == 'false': - args['reverse_cost'] = ' ' - else: - args['reverse_cost'] = ', ' + args['reverse_cost'] + '::float8 AS reverse_cost' - - if 'plainTextEditTurnRestrictSql' in controls: - args['turn_restrict_sql'] = self.dock.plainTextEditTurnRestrictSql.toPlainText() - - return args - - def getBaseArguments(self): - ''' updates base arguments from GUI to args ''' - args = {} - args['edge_table'] = self.dock.lineEditTable.text() - args['geometry'] = self.dock.lineEditGeometry.text() - args['id'] = self.dock.lineEditId.text() - args['source'] = self.dock.lineEditSource.text() - args['target'] = self.dock.lineEditTarget.text() - - empties = [] - for key in list(args.keys()): - if not args[key]: - empties.append(key) - - if len(empties) > 0: - QApplication.restoreOverrideCursor() - QMessageBox.warning(self.dock, self.dock.windowTitle(), - 'Following argument is not specified.\n' + ','.join(empties)) - return None + # if 'labelDrivingSide' in controls: + # args['driving_side'] = str('b') + # if (self.dock.checkBoxLeft.isChecked() == True and self.dock.checkBoxRight.isChecked() == False): + # args['driving_side'] = str('l') + # elif (self.dock.checkBoxLeft.isChecked() == False and self.dock.checkBoxRight.isChecked() == True): + # args['driving_side'] = str('r') return args - # emulate "matching.sql" - "find_nearest_node_within_distance" def findNearestNode(self, args, pt): ''' finds the nearest node to selected point ''' distance = self.iface.mapCanvas().getCoordinateTransform().mapUnitsPerPixel() * self.FIND_RADIUS rect = QgsRectangle(pt.x() - distance, pt.y() - distance, pt.x() + distance, pt.y() + distance) canvasCrs = Utils.getDestinationCrs(self.iface.mapCanvas()) - db = None - try: - dbname = str(self.dock.comboConnections.currentText()) - db = self.actionsDb[dbname].connect() - - con = db.con - #srid, geomType = self.getSridAndGeomType(con, args) - #srid, geomType = Utils.getSridAndGeomType(con, args['edge_table'], args['geometry']) - srid, geomType = Utils.getSridAndGeomType(con, '%(edge_table)s' % args, '%(geometry)s' % args) - layerCrs = QgsCoordinateReferenceSystem() - Utils.createFromSrid(layerCrs, srid) - trans = QgsCoordinateTransform(canvasCrs, layerCrs, QgsProject.instance()) - pt = trans.transform(pt) - rect = trans.transform(rect) - - args['canvas_srid'] = Utils.getCanvasSrid(canvasCrs) - args['srid'] = srid - args['x'] = pt.x() - args['y'] = pt.y() - args['minx'] = rect.xMinimum() - args['miny'] = rect.yMinimum() - args['maxx'] = rect.xMaximum() - args['maxy'] = rect.yMaximum() - - Utils.setStartPoint(geomType, args) - Utils.setEndPoint(geomType, args) - #Utils.setTransformQuotes(args) - Utils.setTransformQuotes(args, srid, args['canvas_srid']) - - # Getting nearest source - query1 = """ - SELECT %(source)s, - ST_Distance( - %(startpoint)s, - ST_GeomFromText('POINT(%(x)f %(y)f)', %(srid)d) - ) AS dist, - ST_AsText(%(transform_s)s%(startpoint)s%(transform_e)s) - FROM %(edge_table)s - WHERE ST_SetSRID('BOX3D(%(minx)f %(miny)f, %(maxx)f %(maxy)f)'::BOX3D, %(srid)d) - && %(geometry)s ORDER BY dist ASC LIMIT 1""" % args - - ##Utils.logMessage(query1) - cur1 = con.cursor() - cur1.execute(query1) - row1 = cur1.fetchone() - d1 = None - source = None - wkt1 = None - if row1: - d1 = row1[1] - source = row1[0] - wkt1 = row1[2] - - # Getting nearest target - query2 = """ - SELECT %(target)s, - ST_Distance( - %(endpoint)s, - ST_GeomFromText('POINT(%(x)f %(y)f)', %(srid)d) - ) AS dist, - ST_AsText(%(transform_s)s%(endpoint)s%(transform_e)s) - FROM %(edge_table)s - WHERE ST_SetSRID('BOX3D(%(minx)f %(miny)f, %(maxx)f %(maxy)f)'::BOX3D, %(srid)d) - && %(geometry)s ORDER BY dist ASC LIMIT 1""" % args - - ##Utils.logMessage(query2) - cur2 = con.cursor() - cur2.execute(query2) - row2 = cur2.fetchone() - d2 = None - target = None - wkt2 = None - if row2: - d2 = row2[1] - target = row2[0] - wkt2 = row2[2] - - # Checking what is nearer - source or target - d = None - node = None - wkt = None - if d1 and (not d2): - node = source - d = d1 - wkt = wkt1 - elif (not d1) and d2: - node = target - d = d2 - wkt = wkt2 - elif d1 and d2: - if d1 < d2: - node = source - d = d1 - wkt = wkt1 - else: - node = target - d = d2 - wkt = wkt2 - - ##Utils.logMessage(str(d)) - if (d == None) or (d > distance): - node = None - wkt = None - return False, None, None - - return True, node, wkt - - except psycopg2.DatabaseError as e: - QApplication.restoreOverrideCursor() - QMessageBox.critical(self.dock, self.dock.windowTitle(), '%s' % e) + layerCrs = QgsCoordinateReferenceSystem() + Utils.createFromSrid(layerCrs, args['srid']) + trans = QgsCoordinateTransform(canvasCrs, layerCrs, QgsProject.instance()) + pt = trans.transform(pt) + rect = trans.transform(rect) + + args['canvas_srid'] = Utils.getCanvasSrid(canvasCrs) + args['dbcanvas_srid'] = sql.Literal(args['canvas_srid']) + args['x'] = sql.Literal(pt.x()) + args['y'] = sql.Literal(pt.y()) + args['SBBOX'] = self.getBBOX(args['srid'])[0] + args['geom_t'] = Utils.getTransformedGeom(args['srid'], args['dbcanvas_srid'], args['geometry']) + + db, cur = self._exec_sql(PgrQ.get_closestVertexInfo(args)) + if cur: + row = cur.fetchone() + db.con.close() + return True, row[0], row[2] + else: return False, None, None - finally: - if db and db.con: - db.con.close() - # emulate "matching.sql" - "find_nearest_link_within_distance" def findNearestLink(self, args, pt): ''' finds the nearest link to selected point ''' distance = self.iface.mapCanvas().getCoordinateTransform().mapUnitsPerPixel() * self.FIND_RADIUS rect = QgsRectangle(pt.x() - distance, pt.y() - distance, pt.x() + distance, pt.y() + distance) canvasCrs = Utils.getDestinationCrs(self.iface.mapCanvas()) - db = None - try: - dbname = str(self.dock.comboConnections.currentText()) - db = self.actionsDb[dbname].connect() - - con = db.con - cur = con.cursor() - srid, geomType = Utils.getSridAndGeomType(con, '%(edge_table)s' % args, '%(geometry)s' % args) - - - layerCrs = QgsCoordinateReferenceSystem() - Utils.createFromSrid(layerCrs, srid) - trans = QgsCoordinateTransform(canvasCrs, layerCrs, QgsProject.instance()) - pt = trans.transform(pt) - rect = trans.transform(rect) - - args['canvas_srid'] = Utils.getCanvasSrid(canvasCrs) - args['srid'] = srid - args['x'] = pt.x() - args['y'] = pt.y() - args['minx'] = rect.xMinimum() - args['miny'] = rect.yMinimum() - args['maxx'] = rect.xMaximum() - args['maxy'] = rect.yMaximum() - args['decimal_places'] = self.FRACTION_DECIMAL_PLACES - - #Utils.setTransformQuotes(args) - Utils.setTransformQuotes(args, srid, args['canvas_srid']) - - # Searching for a link within the distance - query = """ - WITH point AS ( - SELECT ST_GeomFromText('POINT(%(x)f %(y)f)', %(srid)d) AS geom - ) - SELECT %(id)s, - ST_Distance(%(geometry)s, point.geom) AS dist, - ST_AsText(%(transform_s)s%(geometry)s%(transform_e)s) AS wkt, - ROUND(ST_Line_Locate_Point(%(geometry)s, point.geom)::numeric, %(decimal_places)d) AS pos, - ST_AsText(%(transform_s)sST_Line_Interpolate_point(%(geometry)s, - ROUND(ST_Line_Locate_Point(%(geometry)s, point.geom)::numeric, %(decimal_places)d))%(transform_e)s) AS pointWkt - FROM %(edge_table)s, point - WHERE ST_SetSRID('BOX3D(%(minx)f %(miny)f, %(maxx)f %(maxy)f)'::BOX3D, %(srid)d) - && %(geometry)s ORDER BY dist ASC LIMIT 1""" % args - - ##Utils.logMessage(query) - cur = con.cursor() - cur.execute(query) + layerCrs = QgsCoordinateReferenceSystem() + Utils.createFromSrid(layerCrs, args['srid']) + trans = QgsCoordinateTransform(canvasCrs, layerCrs, QgsProject.instance()) + pt = trans.transform(pt) + rect = trans.transform(rect) + + args['canvas_srid'] = Utils.getCanvasSrid(canvasCrs) + args['x'] = pt.x() + args['y'] = pt.y() + args['minx'] = rect.xMinimum() + args['miny'] = rect.yMinimum() + args['maxx'] = rect.xMaximum() + args['maxy'] = rect.yMaximum() + args['decimal_places'] = self.FRACTION_DECIMAL_PLACES + + Utils.setTransformQuotes(args, args['srid'], args['canvas_srid']) + + db, cur = self._exec_sql(PgrQ.get_closestEdgeInfo(args)) + if cur: row = cur.fetchone() - if not row: - return False, None, None - link = row[0] - wkt = row[2] - pos = row[3] - pointWkt = row[4] - - return True, link, wkt, pos, pointWkt - - except psycopg2.DatabaseError as e: - QApplication.restoreOverrideCursor() - QMessageBox.critical(self.dock, self.dock.windowTitle(), '%s' % e) - return False, None, None - - finally: - if db and db.con: - db.con.close() + db.con.close() + return True, row[0], row[2], row[3], [4] + else: + return False, None, None, None, None def loadSettings(self): ''' loads the default settings ''' @@ -1241,19 +1161,27 @@ def loadSettings(self): if idx >= 0: self.dock.comboBoxFunction.setCurrentIndex(idx) - self.dock.lineEditTable.setText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/edge_table', 'roads')) + self.dock.lineEditSchema.setText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/edge_schema', 'public')) + self.dock.lineEditTable.setText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/edge_table', 'edge_table')) self.dock.lineEditGeometry.setText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/geometry', 'the_geom')) + self.dock.lineEditId.setText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/id', 'id')) self.dock.lineEditSource.setText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/source', 'source')) self.dock.lineEditTarget.setText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/target', 'target')) self.dock.lineEditCost.setText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/cost', 'cost')) self.dock.lineEditReverseCost.setText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/reverse_cost', 'reverse_cost')) + self.dock.lineEditX1.setText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/x1', 'x1')) self.dock.lineEditY1.setText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/y1', 'y1')) self.dock.lineEditX2.setText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/x2', 'x2')) self.dock.lineEditY2.setText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/y2', 'y2')) - self.dock.lineEditRule.setText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/rule', 'rule')) - self.dock.lineEditToCost.setText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/to_cost', 'to_cost')) + + self.dock.selectAstarHeuristic.setCurrentIndex(int(Utils.getStringValue(settings, '/pgRoutingLayer/sql/heuristic', '5'))) + self.dock.selectAstarFactor.setText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/factor', '1')) + self.dock.selectAstarEpsilon.setTickPosition(int(Utils.getStringValue(settings, '/pgRoutingLayer/sql/epsilon', '100'))) + + # self.dock.lineEditRule.setText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/rule', 'rule')) + # self.dock.lineEditToCost.setText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/to_cost', 'to_cost')) self.dock.lineEditIds.setText(Utils.getStringValue(settings, '/pgRoutingLayer/ids', '')) self.dock.lineEditPcts.setText(Utils.getStringValue(settings, '/pgRoutingLayer/pcts', '')) @@ -1273,14 +1201,15 @@ def loadSettings(self): self.dock.checkBoxDirected.setChecked(Utils.getBoolValue(settings, '/pgRoutingLayer/directed', False)) self.dock.checkBoxHeapPaths.setChecked(Utils.getBoolValue(settings, '/pgRoutingLayer/heap_paths', False)) self.dock.checkBoxHasReverseCost.setChecked(Utils.getBoolValue(settings, '/pgRoutingLayer/has_reverse_cost', False)) - self.dock.plainTextEditTurnRestrictSql.setPlainText(Utils.getStringValue(settings, '/pgRoutingLayer/turn_restrict_sql', 'null')) def saveSettings(self): settings = QSettings() settings.setValue('/pgRoutingLayer/Database', self.dock.comboConnections.currentText()) settings.setValue('/pgRoutingLayer/Function', self.dock.comboBoxFunction.currentText()) + settings.setValue('/pgRoutingLayer/sql/edge_schema', self.dock.lineEditSchema.text()) settings.setValue('/pgRoutingLayer/sql/edge_table', self.dock.lineEditTable.text()) + # settings.setValue('/pgRoutingLayer/sql/pointsOfInterest', self.dock.lineEditPointsTable.text()) settings.setValue('/pgRoutingLayer/sql/geometry', self.dock.lineEditGeometry.text()) settings.setValue('/pgRoutingLayer/sql/id', self.dock.lineEditId.text()) @@ -1293,9 +1222,12 @@ def saveSettings(self): settings.setValue('/pgRoutingLayer/sql/y1', self.dock.lineEditY1.text()) settings.setValue('/pgRoutingLayer/sql/x2', self.dock.lineEditX2.text()) settings.setValue('/pgRoutingLayer/sql/y2', self.dock.lineEditY2.text()) + settings.setValue('/pgRoutingLayer/sql/heuristic', self.dock.selectAstarHeuristic.currentIndex()) + settings.setValue('/pgRoutingLayer/sql/factor', self.dock.selectAstarFactor.text()) + settings.setValue('/pgRoutingLayer/sql/epsilon', self.dock.selectAstarEpsilon.tickPosition()) - settings.setValue('/pgRoutingLayer/sql/rule', self.dock.lineEditRule.text()) - settings.setValue('/pgRoutingLayer/sql/to_cost', self.dock.lineEditToCost.text()) + # settings.setValue('/pgRoutingLayer/sql/rule', self.dock.lineEditRule.text()) + # settings.setValue('/pgRoutingLayer/sql/to_cost', self.dock.lineEditToCost.text()) settings.setValue('/pgRoutingLayer/ids', self.dock.lineEditIds.text()) settings.setValue('/pgRoutingLayer/pcts', self.dock.lineEditPcts.text()) @@ -1314,4 +1246,43 @@ def saveSettings(self): settings.setValue('/pgRoutingLayer/directed', self.dock.checkBoxDirected.isChecked()) settings.setValue('/pgRoutingLayer/heap_paths', self.dock.checkBoxHeapPaths.isChecked()) settings.setValue('/pgRoutingLayer/has_reverse_cost', self.dock.checkBoxHasReverseCost.isChecked()) - settings.setValue('/pgRoutingLayer/turn_restrict_sql', self.dock.plainTextEditTurnRestrictSql.toPlainText()) + + def openHelp(self, checked): + function = str(self.dock.comboBoxFunction.currentText()) + db = None + try: + dbname = str(self.dock.comboConnections.currentText()) + db = self.actionsDb[dbname].connect() + con = db.con + version = Utils.getPgrVersion(con) + except psycopg2.DatabaseError: + # database didn't have pgrouting + return 0 + except SystemError: + return 0 + url = QUrl('https://docs.pgrouting.org/' + str(version) + '/en/' + function + '.html') + try: + QDesktopServices.openUrl(url) + except Exception: + QMessageBox.information(self.dock, self.dock.windowTitle(), + "Network error: No connection. \n Please check your network connection.") + return + + # Caller must close the connection to the database + def _exec_sql(self, query): + db = None + try: + dbname = str(self.dock.comboConnections.currentText()) + db = self.actionsDb[dbname].connect() + cursor = db.con.cursor() + cursor.execute(query.as_string(db.con)) + return db, cursor + + except psycopg2.Error as e: + # do the rollback to avoid a "current transaction aborted, commands ignored" errors + db.con.rollback() + QApplication.restoreOverrideCursor() + QMessageBox.critical(self.dock, self.dock.windowTitle(), '%s' % e) + if db and db.con: + db.con.close() + return None, None diff --git a/pgRoutingLayer_utils.py b/pgRoutingLayer_utils.py index 3af160d..f2b8516 100755 --- a/pgRoutingLayer_utils.py +++ b/pgRoutingLayer_utils.py @@ -1,56 +1,82 @@ +# -*- coding: utf-8 -*- +# /*PGR-GNU***************************************************************** +# File: pgRoutingLayer_utils.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - AasheeshT +# - cayetanobv +# - sanak +# - cvvergara +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ + + from qgis.core import QgsMessageLog, Qgis, QgsWkbTypes -from qgis.gui import QgsMapCanvas -from qgis.PyQt.QtCore import QVariant, QSettings -#from PyQt4.QtGui import * +from qgis.PyQt.QtCore import QVariant import psycopg2 +from psycopg2 import sql import sip -def getSridAndGeomType(con, table, geometry): +def getSridAndGeomType(con, schema, table, geometry): ''' retrieve Spatial Reference Id and geometry type, example 4326(WGS84) , Point ''' args = {} + args['schema'] = schema args['table'] = table args['geometry'] = geometry cur = con.cursor() - cur.execute(""" - SELECT ST_SRID(%(geometry)s), ST_GeometryType(%(geometry)s) - FROM %(table)s + cur.execute(sql.SQL(""" + SELECT ST_SRID({geometry}), ST_GeometryType({geometry}) + FROM {schema}.{table} LIMIT 1 - """ % args) + """).format(**args).as_string(con)) row = cur.fetchone() return row[0], row[1] -def setStartPoint(geomType, args): - ''' records startpoint of geometry and stores in args dictionary. ''' - - if geomType == 'ST_MultiLineString': - args['startpoint'] = "ST_StartPoint(ST_GeometryN(%(geometry)s, 1))" % args - elif geomType == 'ST_LineString': - args['startpoint'] = "ST_StartPoint(%(geometry)s)" % args +def getTransformedGeom(srid, canvas_srid, geometry): + ''' + gets transformed geometry to canvas srid + srid - normal value + canvas_srid, geometry - composed values + ''' + if srid == 0: + return sql.SQL("ST_SetSRID({}, {})").format(geometry, canvas_srid) + else: + return sql.SQL("ST_transform({}, {})").format(geometry, canvas_srid) -def setEndPoint(geomType, args): - ''' records endpoint and stores in args. ''' - - if geomType == 'ST_MultiLineString': - args['endpoint'] = "ST_EndPoint(ST_GeometryN(%(geometry)s, 1))" % args - elif geomType == 'ST_LineString': - args['endpoint'] = "ST_EndPoint(%(geometry)s)" % args def setTransformQuotes(args, srid, canvas_srid): ''' Sets transformQuotes ''' if srid > 0 and canvas_srid > 0: - args['transform_s'] = "ST_Transform(" - args['transform_e'] = ", %(canvas_srid)d)" % args + args['transform_s'] = sql.SQL("ST_Transform(") + args['transform_e'] = sql.SQL(", {})").format(sql.Literal(canvas_srid)) else: - args['transform_s'] = "" - args['transform_e'] = "" + args['transform_s'] = sql.SQL("") + args['transform_e'] = sql.SQL("") + def isSIPv2(): '''Checks the version of SIP ''' return sip.getapi('QVariant') > 1 + def getStringValue(settings, key, value): ''' returns key and its corresponding value. example: ("interval",30). ''' if isSIPv2(): @@ -58,6 +84,7 @@ def getStringValue(settings, key, value): else: return settings.value(key, QVariant(value)).toString() + def getBoolValue(settings, key, value): ''' returns True if settings exist otherwise False. ''' if isSIPv2(): @@ -65,74 +92,38 @@ def getBoolValue(settings, key, value): else: return settings.value(key, QVariant(value)).toBool() -def isQGISv1(): - ''' returns True if QGis has version l.9 or less, otherwise False. ''' - return Qgis.QGIS_VERSION_INT < 10900 def getDestinationCrs(mapCanvas): ''' returns Coordinate Reference ID of map/overlaid layers. ''' - if isQGISv1(): - return mapCanvas.mapRenderer().destinationSrs() - else: - if Qgis.QGIS_VERSION_INT < 20400: - return mapCanvas.mapRenderer().destinationCrs() - else: - return mapCanvas.mapSettings().destinationCrs() + return mapCanvas.mapSettings().destinationCrs() + def getCanvasSrid(crs): ''' Returns SRID based on QGIS version. ''' - if isQGISv1(): - return crs.epsg() - else: - return crs.postgisSrid() + return crs.postgisSrid() + def createFromSrid(crs, srid): ''' Creates EPSG crs for QGIS version 1 or Creates Spatial reference system based of SRID for QGIS version 2. ''' - if isQGISv1(): - return crs.createFromEpsg(srid) - else: - return crs.createFromSrid(srid) + return crs.createFromSrid(srid) + def getRubberBandType(isPolygon): ''' returns RubberBandType as polygon or lineString ''' - if isQGISv1(): - return isPolygon + if isPolygon: + return QgsWkbTypes.PolygonGeometry else: - if isPolygon: - return QgsWkbTypes.PolygonGeometry - else: - return QgsWkbTypes.LineGeometry + return QgsWkbTypes.LineGeometry + def refreshMapCanvas(mapCanvas): ''' refreshes the mapCanvas , RubberBand is cleared. ''' - if Qgis.QGIS_VERSION_INT < 20400: - return mapCanvas.clear() - else: - return mapCanvas.refresh() + return mapCanvas.refresh() + def logMessage(message, level=Qgis.Info): QgsMessageLog.logMessage(message, 'pgRouting Layer', level) -def getNodeQuery(args, geomType): - ''' returns a sql query to get nodes from a geometry. ''' - setStartPoint(geomType, args) - setEndPoint(geomType, args) - return """ - WITH node AS ( - SELECT id::int4, - ST_X(%(geometry)s) AS x, - ST_Y(%(geometry)s) AS y, - %(geometry)s - FROM ( - SELECT %(source)s::int4 AS id, - %(startpoint)s AS %(geometry)s - FROM %(edge_table)s - UNION - SELECT %(target)s::int4 AS id, - %(endpoint)s AS %(geometry)s - FROM %(edge_table)s - ) AS node - )""" % args def getPgrVersion(con): ''' returns version of PostgreSQL database. ''' @@ -140,13 +131,20 @@ def getPgrVersion(con): cur = con.cursor() cur.execute('SELECT version FROM pgr_version()') row = cur.fetchone()[0] - versions = ''.join([i for i in row if i.isdigit()]) + versions = ''.join([i for i in row if i.isdigit()]) version = versions[0] if versions[1]: version += '.' + versions[1] return float(version) - except psycopg2.DatabaseError as e: - #database didn't have pgrouting + except psycopg2.DatabaseError: + # database didn't have pgrouting return 0 - except SystemError as e: + except SystemError: return 0 + + +def tableName(schema, table): + if not schema: + return sql.SQL(""), sql.Identifier(table) + else: + return sql.SQL("{}.").format(sql.Identifier(schema)), sql.Identifier(table) diff --git a/readme.md b/readme.md index 378244b..514e1aa 100755 --- a/readme.md +++ b/readme.md @@ -1,10 +1,11 @@ -# Welcome to PgRouting Layer! +# Welcome to pgRoutingLayer -A plugin for QGIS by Anita Graser, Ko Nagase and Vicky Vergara +A plugin for QGIS created by by Anita Graser, Ko Nagase and Vicky Vergara. -* project home and bug tracker: https://github.com/pgrouting/pgRoutingLayer -* plugin repository: http://plugins.qgis.org/plugins +pgRoutingLayer is currently developed and maintained by pgRouting community. +- Project home and bug tracker: [https://github.com/pgrouting/pgRoutingLayer](https://github.com/pgrouting/pgRoutingLayer) +- Plugin repository: [https://plugins.qgis.org/plugins/pgRoutingLayer/](https://plugins.qgis.org/plugins/pgRoutingLayer/) ## What is the goal @@ -12,22 +13,22 @@ PgRouting Layer is a plugin for QGIS that serves as a GUI for pgRouting - a popu ## What this plugin currently does -Please check the pgRouting documentation for detailed descriptons: http://docs.pgrouting.org/2.4/en/doc/index.html +Please check plugin documentation for detailed descriptions: [http://qgis.pgrouting.org](http://qgis.pgrouting.org) -PgRoutingLayer currently supports the following functions: +pgRoutingLayer currently supports the following functions: + +- `pgr_aStar` +- `pgr_aStarCost` +- `pgr_bdAstar` +- `pgr_bdAstarCost` +- `pgr_bdDijkstra` +- `pgr_bdDijkstraCost` +- `pgr_dijkstra` +- `pgr_dijkstraCost` +- `pgr_KSP` + +Functions detailed descriptions: [http://docs.pgrouting.org](http://docs.pgrouting.org) -* alphashape -* astar -* bdAstar -* bdDijkstra -* dijkstra -* dijkstraCost -* drivingDistance -* ksp -* shootingStar -* trsp_edge -* trsp_vertex -* tsp_euclid ## License @@ -38,7 +39,7 @@ the Free Software Foundation; either version 2 of the License, or ## Installation -This plugin can be installed using the QGIS Plugin Manager. You will have to enable "experimental" plugins. +This plugin can be installed using the QGIS Plugin Manager. ### Dependencies diff --git a/requirements.txt b/requirements.txt new file mode 100755 index 0000000..504add7 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +mkdocs +pb_tool diff --git a/resources.qrc b/resources.qrc new file mode 100755 index 0000000..01dfdc6 --- /dev/null +++ b/resources.qrc @@ -0,0 +1,6 @@ + + + icon.png + + + diff --git a/tests/Test_FunctionBase.py b/tests/Test_FunctionBase.py index ebaf654..22a4455 100755 --- a/tests/Test_FunctionBase.py +++ b/tests/Test_FunctionBase.py @@ -1,11 +1,41 @@ +# coding=utf-8 +# -*- coding: utf-8 -*- +# /*PGR-GNU***************************************************************** +# File: qgis_models.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - cayetanobv +# - AasheeshT +# - cvvergara +# - anitagraser +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ + import unittest import FunctionBase as FB - class TestFB(unittest.TestCase): def test_getJoinResultWithEdgeTable(self): - args = {'geometry' : 'test_geom','source': 'test_source','startpoint' : 10,'id':'test_id','edge_table':'test_Table','target':100,'endpoint':90} + args = { + 'geometry': 'test_geom', 'source': 'test_source', 'startpoint': 10, + 'id': 'test_id', 'edge_table': 'test_Table', 'target': 100, 'endpoint': 90 + } expected_sql = """ WITH @@ -22,14 +52,18 @@ def test_getJoinResultWithEdgeTable(self): """ self.maxDiff = None - self.assertEqual(FB.getJoinResultWithEdgeTable(args),expected_sql) + self.assertEqual(FB.getJoinResultWithEdgeTable(args), expected_sql) def test_getExportManySourceManyTargetMergeQuery(self): - args = {'geometry' : 'test_geom','source': 'test_source','startpoint' : 10,'id':'test_id','edge_table':'test_Table','target':100,'endpoint':90} + args = { + 'geometry': 'test_geom', 'source': 'test_source', 'startpoint': 10, + 'id': 'test_id', 'edge_table': 'test_Table', 'target': 100, 'endpoint': 90 + } + expected_sql = """WITH result AS ( ), - with_geom AS ( + with_geom AS ( SELECT seq, result.path_name, CASE @@ -40,13 +74,13 @@ def test_getExportManySourceManyTargetMergeQuery(self): FROM test_Table JOIN result ON test_Table.test_id = result._edge ), - one_geom AS ( + one_geom AS ( SELECT path_name, ST_LineMerge(ST_Union(path_geom)) AS path_geom FROM with_geom GROUP BY path_name ORDER BY path_name ), - aggregates AS ( + aggregates AS ( SELECT path_name, _start_vid, _end_vid, SUM(_cost) AS agg_cost, @@ -62,21 +96,9 @@ def test_getExportManySourceManyTargetMergeQuery(self): """ self.maxDiff = None - self.assertEqual(FB.getExportManySourceManyTargetMergeQuery(args),expected_sql) - - - - - - - - - - + self.assertEqual(FB.getExportManySourceManyTargetMergeQuery(args), expected_sql) if __name__ == '__main__': - unittest.main() - diff --git a/tests/Test_utils.py b/tests/Test_utils.py index 4943bcf..ba66f8b 100755 --- a/tests/Test_utils.py +++ b/tests/Test_utils.py @@ -1,3 +1,31 @@ +# coding=utf-8 +# -*- coding: utf-8 -*- +# /*PGR-GNU***************************************************************** +# File: Test_utils.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - cayetanobv +# - AasheeshT +# - cvvergara +# - anitagraser +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ + import pgRoutingLayer_utils as utils import unittest import sys @@ -5,8 +33,6 @@ from qgis.gui import * from PyQt4.QtCore import * from PyQt4.QtGui import * -import psycopg2 -import sip @@ -49,9 +75,9 @@ def test_getBoolValue(self): setting.setValue('/pgRoutingLayer/Database', 99) self.assertTrue(utils.getBoolValue(setting,'/pgRoutingLayer/Database', 99)) - + def test_getDestinationCrs(self): - app = QApplication(sys.argv) + QApplication(sys.argv) # create a map canvas widget canvas = QgsMapCanvas() canvas.setCanvasColor(QColor('white')) @@ -95,46 +121,10 @@ def test_getNodeQuery(self): ST_EndPoint(ST_GeometryN(test_geom, 1)) AS test_geom FROM test_Table ) AS node - )""" + )""" self.maxDiff = None geomType = 'ST_MultiLineString' self.assertMultiLineEqual(utils.getNodeQuery(args,geomType),expected_sql) if __name__ == '__main__': unittest.main() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/qgis_models.py b/tests/qgis_models.py index 24eed3d..534525b 100755 --- a/tests/qgis_models.py +++ b/tests/qgis_models.py @@ -1,4 +1,30 @@ # coding=utf-8 +# -*- coding: utf-8 -*- +# /*PGR-GNU***************************************************************** +# File: qgis_models.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - cayetanobv +# - AasheeshT +# - cvvergara +# - anitagraser +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ import logging import sys @@ -6,8 +32,7 @@ from PyQt4.QtCore import QObject, pyqtSlot, pyqtSignal, QCoreApplication from qgis.core import QgsMapLayerRegistry, QgsApplication, QgsVectorLayer from qgis.gui import QgsMapCanvasLayer -import config - +import config LOGGER = logging.getLogger('QGIS') @@ -41,7 +66,7 @@ def set_up_interface(): return qgis_app, canvas, iface -#noinspection PyMethodMayBeStatic,PyPep8Naming + class QgisInterface(QObject): """Class to expose QGIS objects and functions to plugins. @@ -71,7 +96,6 @@ def __init__(self, canvas): # For processing module self.destCrs = None - @pyqtSlot('QgsMapLayer') def addLayer(self, layer): """Handle a layer being added to the registry so it shows up in canvas. @@ -97,7 +121,8 @@ def removeAllLayers(self): """Remove layers from the canvas before they get deleted.""" self.canvas.setLayerSet([]) - def newProject(self): + @classmethod + def newProject(cls): """Create new project.""" # noinspection PyArgumentList QgsMapLayerRegistry.instance().removeAllMapLayers() @@ -183,17 +208,16 @@ def addToolBarIcon(self, action): """ pass - def addPluginToDatabaseMenu(self,name,action): + def addPluginToDatabaseMenu(self, name, action): """Adds plugin to database menu in QGIS. - :param name : Name of plugin + :param name : Name of plugin :type name : str :param action: Action to add to the toolbar. :type action: QAction """ pass - def removeToolBarIcon(self, action): """Remove an action (icon) from the plugin toolbar. @@ -271,20 +295,24 @@ def layerCount(self): class HybridLayer(QgsVectorLayer): def __init__(self, layer_type, layer_name): - type = '{}?crs=EPSG:3857'.format(layer_type) - QgsVectorLayer.__init__(self, type, layer_name, 'memory', False) + geom_type = '{}?crs=EPSG:3857'.format(layer_type) + QgsVectorLayer.__init__(self, geom_type, layer_name, 'memory', False) + @staticmethod def type(self): # QgsMapLayer.RasterLayer return 1 + @staticmethod def rasterType(self): # QgsRasterLayer.Multiband return 2 + @staticmethod def bandCount(self): # One band for each RGBa return 4 + @staticmethod def bandName(self, index): return 'Band {}'.format(index) diff --git a/tests/test_init.py b/tests/test_init.py index dc04b0e..4f1092b 100755 --- a/tests/test_init.py +++ b/tests/test_init.py @@ -1,4 +1,31 @@ # coding=utf-8 +# -*- coding: utf-8 -*- +# /*PGR-GNU***************************************************************** +# File: test_init.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - cayetanobv +# - AasheeshT +# - cvvergara +# - anitagraser +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ + import os import unittest import logging @@ -15,7 +42,6 @@ class TestInit(unittest.TestCase): def test_read_init(self): """Test that the plugin __init__ will validate on plugins.qgis.org.""" - required_metadata = [ 'name', 'description', @@ -42,5 +68,6 @@ def test_read_init(self): self.assertIn(expectation, dict(metadata), message) + if __name__ == '__main__': unittest.main() diff --git a/ui_pgRoutingLayer.ui b/ui_pgRoutingLayer.ui index 373a89e..4f54394 100755 --- a/ui_pgRoutingLayer.ui +++ b/ui_pgRoutingLayer.ui @@ -6,8 +6,8 @@ 0 0 - 265 - 1077 + 333 + 640 @@ -17,52 +17,48 @@ - pgRouting Layer + &pgRouting Layer - + 3 - - + + + QLayout::SetFixedSize + + 3 - - - - - - - Database - - - + + 0 + - - - - - - Function - - - - - + - + 0 0 - - + + + 22 + 22 + + + + ... + + + + icons/about.pngicons/about.png - + @@ -85,7 +81,20 @@ - + + + + + + + Database + + + Qt::AutoText + + + + true @@ -110,6 +119,41 @@ + + + + + 0 + 0 + + + + + + + + + + + + 50 + 25 + + + + + + + + + + icons/pgr_fn.svg + + + true + + + @@ -118,896 +162,1119 @@ 3 - + + 0 + + + 0 + + + 0 + + 0 - - - Qt::Vertical + + + + 315 + 0 + + + + Qt::LeftToRight + + + QTabWidget::West + + + 0 - - - - - - sql - - - - 3 + + + Edges SQL + + + + + 10 + 150 + 261 + 401 + - - QLayout::SetDefaultConstraint + + + 0 + 0 + - - 6 + + + 0 + 0 + - - - - 3 - - - - - - - - edge_table - - - - - - - Name of the table containing the routable network - - - - - - - - - - - - - geometry - - - - - - - Name of the geometry column in network table - - - - - - - BBOX + + Columns + + + + 3 + + + 6 + + + 6 + + + 6 + + + 6 + + + + + + 0 + 0 + + + + + 0 + 90 + + + + true + + + + + 0 + 0 + 241 + 355 + + + + QLayout::SetMinimumSize + + + 6 + + + 6 + + + 6 + + + 6 + + + 3 + + + + + + + Column name: Target + + + + + + + + + + Column name: Source + + + + + + + + + + Column name: x value of source + + + + + + + Column name: y value of source + + + + + + + Reverse Cost + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + Id + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + X1 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Column name: y value of target + + + + + + + + + + Source + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 22 + 22 + + + + Tick: to use Reverse Cost + + + + + + + + + + + + + X2 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Column name: Cost from target to source + + + + + + + Column name: Cost from source to target + + + + + + + + + + Column name: x value of target + + + + + + + + + + Target + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Column name: Edge identifier + + + + + + + + + + Y1 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Y2 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + Cost + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + - - - - - - - - 0 - 0 - - - - - 0 - 70 - - - - - 16777215 - 16777215 - - - - true - - - - - 0 - 0 - 221 - 392 - + + + + + + + + 14 + 14 + 239 + 139 + + + + + + + + + + Edge table + + + + + + + Name of the table containing the routable network + + + + + + + + + + + + + Schema + + + + + + + Name of the table containing the routable network + + + + + + + + + + + + + Geometry + + + + + + + Name of the geometry column in network table - - - QLayout::SetMinimumSize - - - 6 - - - 3 - - - - - 3 - - - - - rule - - - - - - - - - - id - - - - - - - identifier of the edge - - - - - - - - - - - - - source - - - - - - - Name of the source column - - - - - - - - - - - - - target - - - - - - - - - - cost - - - - - - - Name of the target column - - - - - - - - - - reverse_cost - - - - - - - Name of the edge cost column - - - - - - - - - - x1 - - - - - - - Name of the reverse_cost column. Used only when ticked. - - - - - - - - - - y1 - - - - - - - x2 - - - - - - - y2 - - - - - - - to_cost - - - - - - - - - - - - - - - - - - - - - - - 16777215 - 16777215 - - - - When ticked, reverse_cost will be used. - - - - - - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - + + + + + BBOX + + + + + - - - - 0 - 0 - - - + + Arguments - - - - 6 + + + + + 0 + 0 + 271 + 521 + + + + + 0 + 0 + - - - - - 0 - 0 - - - - - 0 - 90 - - - - true - - - - - 0 - 0 - 221 - 381 - + + + 0 + 0 + + + + Arguments + + + + 3 + + + 6 + + + 6 + + + 6 + + + 6 + + + + + + 0 + 0 + - - - QLayout::SetMinimumSize - - - 6 - - - 3 + + + 0 + 90 + + + + true + + + + + 0 + 0 + 235 + 599 + - - - - 3 - - - - - source_ids - - - - - - - - - - - - - - paths - - - - - - - - - - - - - - - - source_id - - - - - - - - - - target_id - - - - - - - - - - ids - - - - - - - id of the end node - - - - - - - - - - id of the start node - - - - - - - - - - - - - - - - - - 0 - 0 - - - - - 22 - 22 - - - - - - - - - - - icons/add.pngicons/add.png - - - true - - - - - - - - - - distance - - - - - - - - 0 - 0 - - - - - 22 - 22 - - - - - - - - - - - icons/add.pngicons/add.png - - - true - - - - - - - - - - - - - - - 16777215 - 16777215 - - - - - - - - - - - - 0 - 0 - - - - - 22 - 22 - - - - - - - - - - - icons/add.pngicons/add.png - - - true - - - Qt::ToolButtonIconOnly - - - - - - - - - - source_pos - - - - - - - - - - turn + + + QLayout::SetMinimumSize + + + 6 + + + 6 + + + 6 + + + 6 + + + 3 + + + + + 3 + + + + + K + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + 6 + + + QComboBox::NoInsert + + + + + + + + + + + + + From Vid + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + + 0 + 0 + + + + + 22 + 22 + + + + + + + + + + + icons/add.pngicons/add.png + + + true + + + + + + + Value of: Vertex Identifier + + + + + + + + + + + 0 + 0 + + + + + 22 + 22 + + + + ... + + + + icons/add.pngicons/add.png + + + true + + + + + + + + + + distance + + + + + + + + 16777215 + 16777215 + + + + + + + + + + + + + + turn _restrict _sql - - - - - - - - 0 - 0 - - - - - 16777215 - 50 - - - - 40 - - - - - - - target_ids - - - - - - - - - - target_pos - - - - - - - 3 - - - QLayout::SetMaximumSize - - - - - - 16777215 - 16777215 - - - - Tick if the graph is directed - - - - - - directed - - - - - - - Tick for algorithm heap paths - - - heap_paths - - - - - - - - - pcts - - - - - - - - - - - 0 - 0 - - - - - 22 - 22 - - - - ... - - - - icons/add.pngicons/add.png - - - true - - - - - - - alpha - - - - - - - - - - - - - - 22 - 22 - - - - ... - - - - icons/add.pngicons/add.png - - - true - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - + + + + + + + + 0 + 0 + + + + + 16777215 + 50 + + + + 40 + + + + + + + + + + target_pos + + + + + + + 3 + + + QLayout::SetMaximumSize + + + + + + 16777215 + 16777215 + + + + Tick if the graph is directed + + + + + + directed + + + + + + + Tick for algorithm heap paths + + + heap_paths + + + + + + + + + alpha + + + + + + + + + + Comma separated values of: Vertex Identifiers + + + + + + + Comma separated values of: Vertex Identifiers + + + + + + + From Vids + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + pcts + + + + + + + + 22 + 22 + + + + ... + + + + icons/add.pngicons/add.png + + + true + + + + + + + To Vids + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Value of: Vertex Identifier + + + + + + + + + + + 0 + 0 + + + + + 22 + 22 + + + + + + + + + + + icons/add.pngicons/add.png + + + true + + + + + + + + + + To Vid + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + source_pos + + + + + + + + + + + + + + + 0 + 0 + + + + + 22 + 22 + + + + + + + + + + + icons/add.pngicons/add.png + + + true + + + Qt::ToolButtonIconOnly + + + + + + + + 400 + 16777212 + + + + 1 + + + 100 + + + 99 + + + Qt::Horizontal + + + + + + + Epsilon + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Value: Number of cycles + + + + + + + Heuristic + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + ids + + + + + + + + + + + + + + Factor + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + 1 + + + Qt::AlignCenter + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + - - - + + + + + + + Execute + + + + + 11 + 17 + 231 + 121 + + + + + + + + 70 + 32 + + + + + 16777215 + 16777215 + + + + + + + Preview + + + + + + + + 70 + 32 + + + + + + + Clear preview + + + + + + + + 70 + 32 + + + + + + + Export + + + + + + + + 70 + 32 + + + + Export merged + + + + + - - - - 0 - - - - - 3 - - - - - - 70 - 32 - - - - - 16777215 - 16777215 - - - - - - - Preview - - - - - - - - 70 - 32 - - - - - - - Clear preview - - - - - - - - - 3 - - - - - - 70 - 32 - - - - - - - Export - - - - - - - - 70 - 32 - - - - Export merged - - - - - - - - comboConnections - comboBoxFunction lineEditTable lineEditGeometry - scrollAreaSqlColumns - lineEditId - lineEditSource - lineEditTarget - lineEditCost - lineEditReverseCost - lineEditX1 - lineEditY1 - lineEditX2 - lineEditY2 - lineEditRule - lineEditToCost - lineEditIds - buttonSelectIds - lineEditSourceId - buttonSelectSourceId - lineEditSourcePos - lineEditTargetId - buttonSelectTargetId - lineEditTargetPos - lineEditTargetIds - buttonSelectTargetIds - lineEditDistance - lineEditPaths - plainTextEditTurnRestrictSql - buttonRun diff --git a/utilities/pgr_queries.py b/utilities/pgr_queries.py new file mode 100755 index 0000000..49210e6 --- /dev/null +++ b/utilities/pgr_queries.py @@ -0,0 +1,119 @@ +# coding=utf-8 +# -*- coding: utf-8 -*- +# /*PGR-GNU***************************************************************** +# File: pgr_queries.py +# +# Copyright (c) 2011~2019 pgRouting developers +# Mail: project@pgrouting.org +# +# Developer's GitHub nickname: +# - cayetanobv +# - cvvergara +# - anitagraser +# ------ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# ********************************************************************PGR-GNU*/ + +from psycopg2 import sql + + +def getNodeQuery(args, geomType): + ''' returns a sql query to get nodes from a geometry. ''' + return sql.SQL(""" + WITH node AS ( + SELECT {id}, + ST_X({geometry}) AS x, + ST_Y({geometry}) AS y, + {geometry} + FROM ( + SELECT {source} AS id, ST_StartPoint({geom_t}) AS _geom + FROM {edge_schema}.{edge_table} + UNION + SELECT {target}, ST_EndPoint({geom_t}) + FROM {edge_schema}.{edge_table} + ) AS node + )""").format(**args) + + +def getEdgesQuery(args): + return sql.SQL(""" + SELECT {id} AS id, + {source} AS source, + {target} AS target, + {cost}::FLOAT AS cost, + {reverse_cost}::FLOAT AS reverse_cost + FROM {edge_schema}.{edge_table} {where_clause} + """.replace("\\n", r"\n")).format(**args) + + +def getEdgesQueryXY(args): + return sql.SQL(""" + SELECT {id} AS id, + {source} AS source, + {target} AS target, + {cost}::FLOAT AS cost, + {reverse_cost}::FLOAT AS reverse_cost, + {x1}::FLOAT AS x1, + {y1}::FLOAT AS y1, + {x2}::FLOAT AS x2, + {y2}::FLOAT AS y2 + FROM {edge_schema}.{edge_table} {where_clause} + """.replace("\\n", r"\n")).format(**args) + + +def get_closestVertexInfo(args): + return sql.SQL(""" + WITH + near_source AS(SELECT {source}, + ST_Distance( + ST_StartPoint({geom_t}), + ST_GeomFromText('POINT({x} {y})', {dbcanvas_srid}) + ) AS dist, + ST_AsText(ST_StartPoint({geom_t})) AS point + FROM {edge_schema}.{edge_table} + WHERE {geom_t} && {SBBOX} ORDER BY dist ASC LIMIT 1 + ), + near_target AS(SELECT {target}, + ST_Distance( + ST_EndPoint({geom_t}), + ST_GeomFromText('POINT({x} {y})', {dbcanvas_srid}) + ) AS dist, + ST_AsText(ST_EndPoint({geom_t})) + FROM {edge_schema}.{edge_table} + WHERE {geom_t} && {SBBOX} ORDER BY dist ASC LIMIT 1 + ), + the_union AS ( + SELECT * FROM near_source UNION SELECT * FROM near_target + ) + SELECT {source}, dist, point + FROM the_union + ORDER BY dist ASC LIMIT 1 + """).format(**args) + + +def get_closestEdgeInfo(args): + # Not sure this is correct but has the main idea + return sql.SQL(""" + WITH point AS ( + SELECT ST_GeomFromText('POINT({x} {y})', {dbcanvas_srid}) AS geom + ) + SELECT {id)s, + ST_Distance( {geometry}, point.geom) AS dist, + ST_AsText( {geom_t} ) AS wkt, + ROUND(ST_Line_Locate_Point( {geometry} , point.geom)::numeric, {decimal_places}) AS pos, + ST_AsText({transform_s)sST_Line_Interpolate_point({geometry}, + ROUND(ST_Line_Locate_Point({geometry}, point.geom)::numeric, {decimal_places})){transform_e}) AS pointWkt + FROM {edge_schema}.{edge_table}, point + WHERE ST_SetSRID('BOX3D({minx} {miny}, {maxx} {maxy})'::BOX3D, {srid}) + && {geometry} ORDER BY dist ASC LIMIT 1""").format(args) From 6cfc04a5f1612f903e6031ca2bdc116f4f38853e Mon Sep 17 00:00:00 2001 From: AasheeshT Date: Mon, 8 Apr 2019 00:21:50 +0530 Subject: [PATCH 3/6] doc deleted --- docs/CNAME | 1 - docs/functions/pgr_KSP.md | 59 ---------------- docs/functions/pgr_aStar.md | 63 ------------------ docs/functions/pgr_astarCost.md | 59 ---------------- docs/functions/pgr_bdAstar.md | 63 ------------------ docs/functions/pgr_bdAstarCost.md | 56 ---------------- docs/functions/pgr_bdDijkstra.md | 57 ---------------- docs/functions/pgr_bdDijkstraCost.md | 56 ---------------- docs/functions/pgr_dijkstra.md | 57 ---------------- docs/functions/pgr_dijkstraCost.md | 56 ---------------- docs/img/KSP1-1.png | Bin 23140 -> 0 bytes docs/img/KSP1.png | Bin 7156 -> 0 bytes docs/img/astar1.png | Bin 11689 -> 0 bytes docs/img/buttons/database.png | Bin 3515 -> 0 bytes docs/img/buttons/database_.png | Bin 7480 -> 0 bytes docs/img/buttons/execute/clearpreview.png | Bin 1742 -> 0 bytes docs/img/buttons/execute/export.png | Bin 1271 -> 0 bytes docs/img/buttons/execute/exportmergedOFF.png | Bin 1821 -> 0 bytes docs/img/buttons/execute/exportmergedON.png | Bin 2111 -> 0 bytes docs/img/buttons/execute/preview.png | Bin 1206 -> 0 bytes docs/img/buttons/pgr_functions.png | Bin 3822 -> 0 bytes docs/img/buttons/pgr_functions_.png | Bin 19683 -> 0 bytes docs/img/dijkstra1-1.png | Bin 24367 -> 0 bytes docs/img/dijkstra1.png | Bin 6199 -> 0 bytes docs/img/fields/arguments/KSP_fromVid.png | Bin 2220 -> 0 bytes docs/img/fields/arguments/KSP_heapPaths.png | Bin 1468 -> 0 bytes docs/img/fields/arguments/KSP_heapPathsON.png | Bin 1470 -> 0 bytes docs/img/fields/arguments/KSP_k.png | Bin 697 -> 0 bytes docs/img/fields/arguments/KSP_toVid.png | Bin 1974 -> 0 bytes docs/img/fields/arguments/Vid-selected.png | Bin 753 -> 0 bytes docs/img/fields/arguments/Vid-selected2.png | Bin 619 -> 0 bytes .../arguments/astar-dijkstra_fromVid.png | Bin 2243 -> 0 bytes .../arguments/astar-dijkstra_fromVids.png | Bin 2545 -> 0 bytes .../fields/arguments/astar-dijkstra_toVid.png | Bin 2146 -> 0 bytes .../arguments/astar-dijkstra_toVids.png | Bin 2420 -> 0 bytes docs/img/fields/arguments/astar_epsilon.png | Bin 1832 -> 0 bytes docs/img/fields/arguments/astar_epsilon2.png | Bin 2139 -> 0 bytes docs/img/fields/arguments/astar_factor.png | Bin 1115 -> 0 bytes docs/img/fields/arguments/astar_heuristic.png | Bin 12082 -> 0 bytes docs/img/fields/arguments/directedOFF.png | Bin 1149 -> 0 bytes docs/img/fields/arguments/directedON.png | Bin 1159 -> 0 bytes docs/img/fields/columns_astar.png | Bin 11442 -> 0 bytes docs/img/fields/edgesSQL_fields/BBOX.png | Bin 1124 -> 0 bytes docs/img/fields/edgesSQL_fields/BBOXon.png | Bin 1121 -> 0 bytes .../img/fields/edgesSQL_fields/columns/Id.png | Bin 765 -> 0 bytes .../fields/edgesSQL_fields/columns/cost.png | Bin 1406 -> 0 bytes .../edgesSQL_fields/columns/reverseCost.png | Bin 1883 -> 0 bytes .../columns/reverseCostOFF.png | Bin 2974 -> 0 bytes .../fields/edgesSQL_fields/columns/source.png | Bin 1827 -> 0 bytes .../fields/edgesSQL_fields/columns/target.png | Bin 1864 -> 0 bytes .../img/fields/edgesSQL_fields/columns/x1.png | Bin 812 -> 0 bytes .../img/fields/edgesSQL_fields/columns/xy.png | Bin 2257 -> 0 bytes .../img/fields/edgesSQL_fields/columns/y1.png | Bin 799 -> 0 bytes .../fields/edgesSQL_fields/edge_schema.png | Bin 2239 -> 0 bytes .../img/fields/edgesSQL_fields/edge_table.png | Bin 2537 -> 0 bytes docs/img/fields/edgesSQL_fields/geometry.png | Bin 2468 -> 0 bytes docs/img/fields/layers.png | Bin 8073 -> 0 bytes docs/img/functions/KSP.png | Bin 1570 -> 0 bytes docs/img/functions/astar.png | Bin 1610 -> 0 bytes docs/img/functions/astarCost.png | Bin 2147 -> 0 bytes docs/img/functions/bdAstar.png | Bin 2018 -> 0 bytes docs/img/functions/bdAstarCost.png | Bin 2546 -> 0 bytes docs/img/functions/bdDijkstra.png | Bin 2244 -> 0 bytes docs/img/functions/bdDijkstraCost.png | Bin 2730 -> 0 bytes docs/img/functions/dijkstra.png | Bin 1943 -> 0 bytes docs/img/functions/dijkstraCost.png | Bin 2458 -> 0 bytes docs/img/functions/f_pgr_KSP.png | Bin 3631 -> 0 bytes docs/img/functions/f_pgr_astar.png | Bin 3665 -> 0 bytes docs/img/functions/f_pgr_astarCost.png | Bin 4243 -> 0 bytes docs/img/functions/f_pgr_bdAstar.png | Bin 4104 -> 0 bytes docs/img/functions/f_pgr_bdAstarCost.png | Bin 4622 -> 0 bytes docs/img/functions/f_pgr_bdDijkstra.png | Bin 4313 -> 0 bytes docs/img/functions/f_pgr_bdDijkstraCost.png | Bin 4820 -> 0 bytes docs/img/functions/f_pgr_dijkstra.png | Bin 3996 -> 0 bytes docs/img/functions/f_pgr_dijkstraCost.png | Bin 4555 -> 0 bytes docs/img/functions/helpButton.png | Bin 1063 -> 0 bytes docs/img/tabs/arguments/arguments_KSP.png | Bin 11574 -> 0 bytes docs/img/tabs/arguments/arguments_astar.png | Bin 15468 -> 0 bytes .../img/tabs/arguments/arguments_dijkstra.png | Bin 10669 -> 0 bytes docs/img/tabs/arguments/plus_button.png | Bin 900 -> 0 bytes docs/img/tabs/edges_SQL/astar_edgesSQL.png | Bin 23830 -> 0 bytes .../tabs/edges_SQL/dijkstra-KSP_edgesSQL.png | Bin 20214 -> 0 bytes docs/img/tabs/execute/ExecuteCost.png | Bin 9424 -> 0 bytes docs/img/tabs/execute/execute.png | Bin 9601 -> 0 bytes docs/index.md | 51 -------------- docs/intro/buttons.md | 41 ------------ docs/intro/layer_naming_convention.md | 15 ----- 87 files changed, 634 deletions(-) delete mode 100755 docs/CNAME delete mode 100755 docs/functions/pgr_KSP.md delete mode 100755 docs/functions/pgr_aStar.md delete mode 100755 docs/functions/pgr_astarCost.md delete mode 100755 docs/functions/pgr_bdAstar.md delete mode 100755 docs/functions/pgr_bdAstarCost.md delete mode 100755 docs/functions/pgr_bdDijkstra.md delete mode 100755 docs/functions/pgr_bdDijkstraCost.md delete mode 100755 docs/functions/pgr_dijkstra.md delete mode 100755 docs/functions/pgr_dijkstraCost.md delete mode 100755 docs/img/KSP1-1.png delete mode 100755 docs/img/KSP1.png delete mode 100755 docs/img/astar1.png delete mode 100755 docs/img/buttons/database.png delete mode 100755 docs/img/buttons/database_.png delete mode 100755 docs/img/buttons/execute/clearpreview.png delete mode 100755 docs/img/buttons/execute/export.png delete mode 100755 docs/img/buttons/execute/exportmergedOFF.png delete mode 100755 docs/img/buttons/execute/exportmergedON.png delete mode 100755 docs/img/buttons/execute/preview.png delete mode 100755 docs/img/buttons/pgr_functions.png delete mode 100755 docs/img/buttons/pgr_functions_.png delete mode 100755 docs/img/dijkstra1-1.png delete mode 100755 docs/img/dijkstra1.png delete mode 100755 docs/img/fields/arguments/KSP_fromVid.png delete mode 100755 docs/img/fields/arguments/KSP_heapPaths.png delete mode 100755 docs/img/fields/arguments/KSP_heapPathsON.png delete mode 100755 docs/img/fields/arguments/KSP_k.png delete mode 100755 docs/img/fields/arguments/KSP_toVid.png delete mode 100755 docs/img/fields/arguments/Vid-selected.png delete mode 100755 docs/img/fields/arguments/Vid-selected2.png delete mode 100755 docs/img/fields/arguments/astar-dijkstra_fromVid.png delete mode 100755 docs/img/fields/arguments/astar-dijkstra_fromVids.png delete mode 100755 docs/img/fields/arguments/astar-dijkstra_toVid.png delete mode 100755 docs/img/fields/arguments/astar-dijkstra_toVids.png delete mode 100755 docs/img/fields/arguments/astar_epsilon.png delete mode 100755 docs/img/fields/arguments/astar_epsilon2.png delete mode 100755 docs/img/fields/arguments/astar_factor.png delete mode 100755 docs/img/fields/arguments/astar_heuristic.png delete mode 100755 docs/img/fields/arguments/directedOFF.png delete mode 100755 docs/img/fields/arguments/directedON.png delete mode 100755 docs/img/fields/columns_astar.png delete mode 100755 docs/img/fields/edgesSQL_fields/BBOX.png delete mode 100755 docs/img/fields/edgesSQL_fields/BBOXon.png delete mode 100755 docs/img/fields/edgesSQL_fields/columns/Id.png delete mode 100755 docs/img/fields/edgesSQL_fields/columns/cost.png delete mode 100755 docs/img/fields/edgesSQL_fields/columns/reverseCost.png delete mode 100755 docs/img/fields/edgesSQL_fields/columns/reverseCostOFF.png delete mode 100755 docs/img/fields/edgesSQL_fields/columns/source.png delete mode 100755 docs/img/fields/edgesSQL_fields/columns/target.png delete mode 100755 docs/img/fields/edgesSQL_fields/columns/x1.png delete mode 100755 docs/img/fields/edgesSQL_fields/columns/xy.png delete mode 100755 docs/img/fields/edgesSQL_fields/columns/y1.png delete mode 100755 docs/img/fields/edgesSQL_fields/edge_schema.png delete mode 100755 docs/img/fields/edgesSQL_fields/edge_table.png delete mode 100755 docs/img/fields/edgesSQL_fields/geometry.png delete mode 100755 docs/img/fields/layers.png delete mode 100755 docs/img/functions/KSP.png delete mode 100755 docs/img/functions/astar.png delete mode 100755 docs/img/functions/astarCost.png delete mode 100755 docs/img/functions/bdAstar.png delete mode 100755 docs/img/functions/bdAstarCost.png delete mode 100755 docs/img/functions/bdDijkstra.png delete mode 100755 docs/img/functions/bdDijkstraCost.png delete mode 100755 docs/img/functions/dijkstra.png delete mode 100755 docs/img/functions/dijkstraCost.png delete mode 100755 docs/img/functions/f_pgr_KSP.png delete mode 100755 docs/img/functions/f_pgr_astar.png delete mode 100755 docs/img/functions/f_pgr_astarCost.png delete mode 100755 docs/img/functions/f_pgr_bdAstar.png delete mode 100755 docs/img/functions/f_pgr_bdAstarCost.png delete mode 100755 docs/img/functions/f_pgr_bdDijkstra.png delete mode 100755 docs/img/functions/f_pgr_bdDijkstraCost.png delete mode 100755 docs/img/functions/f_pgr_dijkstra.png delete mode 100755 docs/img/functions/f_pgr_dijkstraCost.png delete mode 100755 docs/img/functions/helpButton.png delete mode 100755 docs/img/tabs/arguments/arguments_KSP.png delete mode 100755 docs/img/tabs/arguments/arguments_astar.png delete mode 100755 docs/img/tabs/arguments/arguments_dijkstra.png delete mode 100755 docs/img/tabs/arguments/plus_button.png delete mode 100755 docs/img/tabs/edges_SQL/astar_edgesSQL.png delete mode 100755 docs/img/tabs/edges_SQL/dijkstra-KSP_edgesSQL.png delete mode 100755 docs/img/tabs/execute/ExecuteCost.png delete mode 100755 docs/img/tabs/execute/execute.png delete mode 100755 docs/index.md delete mode 100755 docs/intro/buttons.md delete mode 100755 docs/intro/layer_naming_convention.md diff --git a/docs/CNAME b/docs/CNAME deleted file mode 100755 index 7dbc892..0000000 --- a/docs/CNAME +++ /dev/null @@ -1 +0,0 @@ -qgis.pgrouting.org diff --git a/docs/functions/pgr_KSP.md b/docs/functions/pgr_KSP.md deleted file mode 100755 index 155546d..0000000 --- a/docs/functions/pgr_KSP.md +++ /dev/null @@ -1,59 +0,0 @@ - - - - - -# pgr_KSP -![pgr_KSP](../img/functions/f_pgr_KSP.png) - -|Button|Action| -| ----------- | --------- | -|![Help](../img/functions/helpButton.png)|Opens the web page of the documentation of pgr_KSP| -|![Function](../img/functions/KSP.png)| Choose pgr_KSP on the drop down box| - -## Edges SQL tab -![Edges SQL tab](../img/tabs/edges_SQL/dijkstra-KSP_edgesSQL.png) - -|Field|Action| -| ----------- | --------- | -|![Edge table](../img/fields/edgesSQL_fields/edge_table.png)| Write the table name of the edges| -|![Edge schema](../img/fields/edgesSQL_fields/edge_schema.png)|Write the schema of the edge table| -|![Geometry](../img/fields/edgesSQL_fields/geometry.png)|Write the geometry column name| -|![BBOX](../img/fields/edgesSQL_fields/BBOX.png)|Tick to use the Bounding Box of the QGIS canvas to limit the rows of edge table ![BBOX](../img/fields/edgesSQL_fields/BBOXon.png)| - -### Columns - -|Field|Action| -| ----------- | --------- | -|![Id](../img/fields/edgesSQL_fields/columns/Id.png)| Write the column that has the edge identifier| -|![Source](../img/fields/edgesSQL_fields/columns/source.png)|Write the column that has the edge source| -|![Target](../img/fields/edgesSQL_fields/columns/target.png)|Write the column that has the edge target| -|![Cost](../img/fields/edgesSQL_fields/columns/cost.png)|Write the column that has the cost of the edge source -> target| -|![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCostOFF.png)|Write the column that has the cost of the edge target -> source, the column will be used when the box is ticked ![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCost.png)| - -## Arguments tab -![Arguments tab](../img/tabs/arguments/arguments_KSP.png) - -|Field|Action| -| ----------- | --------- | -|![fromVid](../img/fields/arguments/KSP_fromVid.png)| Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the start vertex| -|![toVid](../img/fields/arguments/KSP_toVid.png)|Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the start vertex| -|![K](../img/fields/arguments/KSP_k.png)| ... | -|![Heap paths](../img/fields/arguments/KSP_heapPaths.png)| Tick.. ![Heap paths](../img/fields/arguments/KSP_heapPathsON.png) -|![Directed](../img/fields/arguments/directedOFF.png)| Tick if the graph is directed ![Directed](../img/fields/arguments/directedON.png)| - -## Execute tab -![Execute tab](../img/tabs/execute/execute.png) - -|Button|Action| -| ----------- | --------- | -|![Preview](../img/buttons/execute/preview.png)| Draws in the canvas the resulting path | -|![Clear Preview](../img/buttons/execute/clearpreview.png)| Removes from the canvas objects generated with Preview| -|![Export](../img/buttons/execute/export.png)| Creates a one row per edge line geometry layer| -|![Export Merged](../img/buttons/execute/exportmergedON.png)| Creates a one row per path multiline geometry layer. As many rows as needed| - -Depending on the pressed button the layer name will be -``` -() pgr_KSP: to BBOX() -(M ) pgr_KSP: to BBOX() -``` diff --git a/docs/functions/pgr_aStar.md b/docs/functions/pgr_aStar.md deleted file mode 100755 index 01bfa6a..0000000 --- a/docs/functions/pgr_aStar.md +++ /dev/null @@ -1,63 +0,0 @@ - - - - - -# pgr_astar -![pgr_astar](../img/functions/f_pgr_astar.png) - -|Button|Action| -| ----------- | --------- | -|![Help](../img/functions/helpButton.png)|Opens the web page of the documentation of pgr_astar| -|![Function](../img/functions/astar.png)| Choose pgr_astar on the drop down box| - -## Edges SQL tab -![Edges SQL tab](../img/tabs/edges_SQL/astar_edgesSQL.png) - -|Field|Action| -| ----------- | --------- | -|![Edge table](../img/fields/edgesSQL_fields/edge_table.png)| Write the table name of the edges| -|![Edge schema](../img/fields/edgesSQL_fields/edge_schema.png)|Write the schema of the edge table| -|![Geometry](../img/fields/edgesSQL_fields/geometry.png)|Write the geometry column name| -|![BBOX](../img/fields/edgesSQL_fields/BBOX.png)|Tick to use the Bounding Box of the QGIS canvas to limit the rows of edge table ![BBOX](../img/fields/edgesSQL_fields/BBOXon.png)| - -### Columns - -|Field|Action| -| ----------- | --------- | -|![Id](../img/fields/edgesSQL_fields/columns/Id.png)| Write the column that has the edge identifier| -|![Source](../img/fields/edgesSQL_fields/columns/source.png)|Write the column that has the edge source| -|![Target](../img/fields/edgesSQL_fields/columns/target.png)|Write the column that has the edge target| -|![Cost](../img/fields/edgesSQL_fields/columns/cost.png)|Write the column that has the cost of the edge source -> target| -|![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCostOFF.png)|Write the column that has the cost of the edge target -> source, the column will be used when the box is ticked ![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCost.png)| -|![x](../img/fields/edgesSQL_fields/columns/x1.png)|Write the geometry column name| -|![y](../img/fields/edgesSQL_fields/columns/y1.png)|Write the geometry column name| - -## Arguments tab -![Arguments tab](../img/tabs/arguments/arguments_astar.png) - -|Field|Action| -| ----------- | --------- | -|![fromVids](../img/fields/arguments/astar-dijkstra_fromVids.png)| Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the start vertices| -|![toVids](../img/fields/arguments/astar-dijkstra_toVids.png)|Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the destination vertices| -|![Heuristic](../img/fields/arguments/astar_heuristic.png)| Heuristic number. Current valid values `0~5` . Default ``5``| -|![Factor](../img/fields/arguments/astar_factor.png)| For units manipulation. `factor > 0`. Default ``1``. See `astar_factor`.| -|![Epsilon](../img/fields/arguments/astar_epsilon.png)| For less restricted results. `epsilon >= 1`. Default ``1``.| -|![Directed](../img/fields/arguments/directedOFF.png)| Tick if the graph is directed ![Directed](../img/fields/arguments/directedON.png)| - -## Execute tab -![Execute tab](../img/tabs/execute/execute.png) - -|Button|Action| -| ----------- | --------- | -|![Preview](../img/buttons/execute/preview.png)| Draws in the canvas the resulting path | -|![Clear Preview](../img/buttons/execute/clearpreview.png)| Removes from the canvas objects generated with Preview| -|![Export](../img/buttons/execute/export.png)| Creates a one row per edge line geometry layer| -|![Export Merged](../img/buttons/execute/exportmergedON.png)| Creates a one row per path multiline geometry layer. As many rows as needed| - - -Depending on the pressed button the layer name will be -``` -() pgr_astar: to BBOX() -(M ) pgr_astar: to BBOX() -``` diff --git a/docs/functions/pgr_astarCost.md b/docs/functions/pgr_astarCost.md deleted file mode 100755 index 1ebe311..0000000 --- a/docs/functions/pgr_astarCost.md +++ /dev/null @@ -1,59 +0,0 @@ - - - - - -# pgr_astarCost -![pgr_astarCost](../img/functions/f_pgr_astarCost.png) - -|Button|Action| -| ----------- | --------- | -|![Help](../img/functions/helpButton.png)|Opens the web page of the documentation of pgr_astarCost| -|![Function](../img/functions/astarCost.png)| Choose pgr_astarCost on the drop down box| - -## Edges SQL tab -![Edges SQL tab](../img/tabs/edges_SQL/dijkstra-KSP_edgesSQL.png) - -|Field|Action| -| ----------- | --------- | -|![Edge table](../img/fields/edgesSQL_fields/edge_table.png)| Write the table name of the edges| -|![Edge schema](../img/fields/edgesSQL_fields/edge_schema.png)|Write the schema of the edge table| -|![Geometry](../img/fields/edgesSQL_fields/geometry.png)|Write the geometry column name| -|![BBOX](../img/fields/edgesSQL_fields/BBOX.png)|Tick to use the Bounding Box of the QGIS canvas to limit the rows of edge table ![BBOX](../img/fields/edgesSQL_fields/BBOXon.png)| - -### Columns - -|Field|Action| -| ----------- | --------- | -|![Id](../img/fields/edgesSQL_fields/columns/Id.png)| Write the column that has the edge identifier| -|![Source](../img/fields/edgesSQL_fields/columns/source.png)|Write the column that has the edge source| -|![Target](../img/fields/edgesSQL_fields/columns/target.png)|Write the column that has the edge target| -|![Cost](../img/fields/edgesSQL_fields/columns/cost.png)|Write the column that has the cost of the edge source -> target| -|![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCostOFF.png)|Write the column that has the cost of the edge target -> source, the column will be used when the box is ticked ![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCost.png)| - -## Arguments tab -![Arguments tab](../img/tabs/arguments/arguments_astar.png) - -|Field|Action| -| ----------- | --------- | -|![fromVids](../img/fields/arguments/astar-dijkstra_fromVids.png)| Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the start vertices| -|![toVids](../img/fields/arguments/astar-dijkstra_toVids.png)|Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the destination vertices| -|![Heuristic](../img/fields/arguments/astar_heuristic.png)| Heuristic number. Current valid values `0~5` . Default ``5``| -|![Factor](../img/fields/arguments/astar_factor.png)| For units manipulation. `factor > 0`. Default ``1``. See `astar_factor`.| -|![Epsilon](../img/fields/arguments/astar_epsilon.png)| For less restricted results. `epsilon >= 1`. Default ``1``.| -|![Directed](../img/fields/arguments/directedOFF.png)| Tick if the graph is directed ![Directed](../img/fields/arguments/directedON.png)| - -## Execute tab -![Execute tab](../img/tabs/execute/execute.png) - -|Button|Action| -| ----------- | --------- | -|![Preview](../img/buttons/execute/preview.png)| Draws in the canvas the resulting path | -|![Clear Preview](../img/buttons/execute/clearpreview.png)| Removes from the canvas objects generated with Preview| -|![Export](../img/buttons/execute/export.png)| Creates a one row per edge line geometry layer| -|![Export Merged](../img/buttons/execute/exportmergedOFF.png)| Disabled| - -Depending on the pressed button the layer name will be -``` -() pgr_astarCost: to BBOX() -``` diff --git a/docs/functions/pgr_bdAstar.md b/docs/functions/pgr_bdAstar.md deleted file mode 100755 index c67c7f4..0000000 --- a/docs/functions/pgr_bdAstar.md +++ /dev/null @@ -1,63 +0,0 @@ - - - - - -# pgr_bdAstar -![pgr_bdAstar](../img/functions/f_pgr_bdAstar.png) - -|Button|Action| -| ----------- | --------- | -|![Help](../img/functions/helpButton.png)|Opens the web page of the documentation of pgr_bdAstar| -|![Function](../img/functions/bdAstar.png)| Choose pgr_bdAstar on the drop down box| - -## Edges SQL tab -![Edges SQL tab](../img/tabs/edges_SQL/astar_edgesSQL.png) - -|Field|Action| -| ----------- | --------- | -|![Edge table](../img/fields/edgesSQL_fields/edge_table.png)| Write the table name of the edges| -|![Edge schema](../img/fields/edgesSQL_fields/edge_schema.png)|Write the schema of the edge table| -|![Geometry](../img/fields/edgesSQL_fields/geometry.png)|Write the geometry column name| -|![BBOX](../img/fields/edgesSQL_fields/BBOX.png)|Tick to use the Bounding Box of the QGIS canvas to limit the rows of edge table ![BBOX](../img/fields/edgesSQL_fields/BBOXon.png)| - -### Columns - -|Field|Action| -| ----------- | --------- | -|![Id](../img/fields/edgesSQL_fields/columns/Id.png)| Write the column that has the edge identifier| -|![Source](../img/fields/edgesSQL_fields/columns/source.png)|Write the column that has the edge source| -|![Target](../img/fields/edgesSQL_fields/columns/target.png)|Write the column that has the edge target| -|![Cost](../img/fields/edgesSQL_fields/columns/cost.png)|Write the column that has the cost of the edge source -> target| -|![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCostOFF.png)|Write the column that has the cost of the edge target -> source, the column will be used when the box is ticked ![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCost.png)| -|![x](../img/fields/edgesSQL_fields/columns/x1.png)|Write the geometry column name| -|![y](../img/fields/edgesSQL_fields/columns/y1.png)|Write the geometry column name| - -## Arguments tab -![Arguments tab](../img/tabs/arguments/arguments_astar.png) - -|Field|Action| -| ----------- | --------- | -|![fromVids](../img/fields/arguments/astar-dijkstra_fromVids.png)| Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the start vertices| -|![toVids](../img/fields/arguments/astar-dijkstra_toVids.png)|Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the destination vertices| -|![Heuristic](../img/fields/arguments/astar_heuristic.png)| Heuristic number. Current valid values `0~5` . Default ``5``| -|![Factor](../img/fields/arguments/astar_factor.png)| For units manipulation. `factor > 0`. Default ``1``. See `astar_factor`.| -|![Epsilon](../img/fields/arguments/astar_epsilon.png)| For less restricted results. `epsilon >= 1`. Default ``1``.| -|![Directed](../img/fields/arguments/directedOFF.png)| Tick if the graph is directed ![Directed](../img/fields/arguments/directedON.png)| - -## Execute tab -![Execute tab](../img/tabs/execute/execute.png) - -|Button|Action| -| ----------- | --------- | -|![Preview](../img/buttons/execute/preview.png)| Draws in the canvas the resulting path | -|![Clear Preview](../img/buttons/execute/clearpreview.png)| Removes from the canvas objects generated with Preview| -|![Export](../img/buttons/execute/export.png)| Creates a one row per edge line geometry layer| -|![Export Merged](../img/buttons/execute/exportmergedON.png)| Creates a one row per path multi line geometry layer. As many rows as needed| - - -Depending on the pressed button the layer name will be -``` -() pgr_bdAstar: to BBOX() -(M ) pgr_bdAstar: to BBOX() -``` diff --git a/docs/functions/pgr_bdAstarCost.md b/docs/functions/pgr_bdAstarCost.md deleted file mode 100755 index 1fd8ba1..0000000 --- a/docs/functions/pgr_bdAstarCost.md +++ /dev/null @@ -1,56 +0,0 @@ - - - - - -# pgr_bdAstarCost -![pgr_bdAstarCost](../img/functions/f_pgr_bdAstarCost.png) - -|Button|Action| -| ----------- | --------- | -|![Help](../img/functions/helpButton.png)|Opens the web page of the documentation of pgr_bdAstarCost| -|![Function](../img/functions/bdAstarCost.png)| Choose pgr_bdAstarCost on the drop down box| - -## Edges SQL tab -![Edges SQL tab](../img/tabs/edges_SQL/astar_edgesSQL.png) - -|Field|Action| -| ----------- | --------- | -|![Edge table](../img/fields/edgesSQL_fields/edge_table.png)| Write the table name of the edges| -|![Edge schema](../img/fields/edgesSQL_fields/edge_schema.png)|Write the schema of the edge table| -|![Geometry](../img/fields/edgesSQL_fields/geometry.png)|Write the geometry column name| -|![BBOX](../img/fields/edgesSQL_fields/BBOX.png)|Tick to use the Bounding Box of the QGIS canvas to limit the rows of edge table ![BBOX](../img/fields/edgesSQL_fields/BBOXon.png)| - -### Columns - -|Field|Action| -| ----------- | --------- | -|![Id](../img/fields/edgesSQL_fields/columns/Id.png)| Write the column that has the edge identifier| -|![Source](../img/fields/edgesSQL_fields/columns/source.png)|Write the column that has the edge source| -|![Target](../img/fields/edgesSQL_fields/columns/target.png)|Write the column that has the edge target| -|![Cost](../img/fields/edgesSQL_fields/columns/cost.png)|Write the column that has the cost of the edge source -> target| -|![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCostOFF.png)|Write the column that has the cost of the edge target -> source, the column will be used when the box is ticked ![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCost.png)| - -## Arguments tab -![Arguments tab](../img/tabs/arguments/arguments_astar.png) - -|Field|Action| -| ----------- | --------- | -|![fromVids](../img/fields/arguments/astar-dijkstra_fromVids.png)| Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the start vertices| -|![toVids](../img/fields/arguments/astar-dijkstra_toVids.png)|Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the destination vertices| -|![Directed](../img/fields/arguments/directedOFF.png)| Tick if the graph is directed ![Directed](../img/fields/arguments/directedON.png)| - -## Execute tab -![Execute tab](../img/tabs/execute/ExecuteCost.png) - -|Button|Action| -| ----------- | --------- | -|![Preview](../img/buttons/execute/preview.png)| Draws in the canvas the resulting path | -|![Clear Preview](../img/buttons/execute/clearpreview.png)| Removes from the canvas objects generated with Preview| -|![Export](../img/buttons/execute/export.png)| Creates a one row per edge line geometry layer| -|![Export Merged](../img/buttons/execute/exportmergedOFF.png)| Disabled| - -Depending on the pressed button the layer name will be -``` -() pgr_bdAstarCost: to BBOX() -``` diff --git a/docs/functions/pgr_bdDijkstra.md b/docs/functions/pgr_bdDijkstra.md deleted file mode 100755 index bf2f4f0..0000000 --- a/docs/functions/pgr_bdDijkstra.md +++ /dev/null @@ -1,57 +0,0 @@ - - - - - -# pgr_bdDijkstra -![pgr_bdDijkstra](../img/functions/f_pgr_bdDijkstra.png) - -|Button|Action| -| ----------- | --------- | -|![Help](../img/functions/helpButton.png)|Opens the web page of the documentation of pgr_bdDijkstra| -|![Function](../img/functions/bdDijkstra.png)| Choose pgr_bdDijkstra on the drop down box| - -## Edges SQL tab -![Edges SQL tab](../img/tabs/edges_SQL/dijkstra-KSP_edgesSQL.png) - -|Field|Action| -| ----------- | --------- | -|![Edge table](../img/fields/edgesSQL_fields/edge_table.png)| Write the table name of the edges| -|![Edge schema](../img/fields/edgesSQL_fields/edge_schema.png)|Write the schema of the edge table| -|![Geometry](../img/fields/edgesSQL_fields/geometry.png)|Write the geometry column name| -|![BBOX](../img/fields/edgesSQL_fields/BBOX.png)|Tick to use the Bounding Box of the QGIS canvas to limit the rows of edge table ![BBOX](../img/fields/edgesSQL_fields/BBOXon.png)| - -### Columns - -|Field|Action| -| ----------- | --------- | -|![Id](../img/fields/edgesSQL_fields/columns/Id.png)| Write the column that has the edge identifier| -|![Source](../img/fields/edgesSQL_fields/columns/source.png)|Write the column that has the edge source| -|![Target](../img/fields/edgesSQL_fields/columns/target.png)|Write the column that has the edge target| -|![Cost](../img/fields/edgesSQL_fields/columns/cost.png)|Write the column that has the cost of the edge source -> target| -|![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCostOFF.png)|Write the column that has the cost of the edge target -> source, the column will be used when the box is ticked ![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCost.png)| - -## Arguments tab -![Arguments tab](../img/tabs/arguments/arguments_dijkstra.png) - -|Field|Action| -| ----------- | --------- | -|![fromVids](../img/fields/arguments/astar-dijkstra_fromVids.png)| Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the start vertices| -|![toVids](../img/fields/arguments/astar-dijkstra_toVids.png)|Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the destination vertices| -|![Directed](../img/fields/arguments/directedOFF.png)| Tick if the graph is directed ![Directed](../img/fields/arguments/directedON.png)| - -## Execute tab -![Execute tab](../img/tabs/execute/execute.png) - -|Button|Action| -| ----------- | --------- | -|![Preview](../img/buttons/execute/preview.png)| Draws in the canvas the resulting path | -|![Clear Preview](../img/buttons/execute/clearpreview.png)| Removes from the canvas objects generated with Preview| -|![Export](../img/buttons/execute/export.png)| Creates a one row per edge line geometry layer| -|![Export Merged](../img/buttons/execute/exportmergedON.png)| Creates a one row per path multiline geometry layer. As many rows as needed| - -Depending on the pressed button the layer name will be -``` -() pgr_bdDijkstra: to BBOX() -(M ) pgr_bdDijkstra: to BBOX() -``` diff --git a/docs/functions/pgr_bdDijkstraCost.md b/docs/functions/pgr_bdDijkstraCost.md deleted file mode 100755 index a84f800..0000000 --- a/docs/functions/pgr_bdDijkstraCost.md +++ /dev/null @@ -1,56 +0,0 @@ - - - - - -# pgr_bdDijkstraCost -![pgr_bdDijkstraCost](../img/functions/f_pgr_bdDijkstraCost.png) - -|Button|Action| -| ----------- | --------- | -|![Help](../img/functions/helpButton.png)|Opens the web page of the documentation of pgr_bdDijkstraCost| -|![Function](../img/functions/bdDijkstraCost.png)| Choose pgr_bdDijkstraCost on the drop down box| - -## Edges SQL tab -![Edges SQL tab](../img/tabs/edges_SQL/dijkstra-KSP_edgesSQL.png) - -|Field|Action| -| ----------- | --------- | -|![Edge table](../img/fields/edgesSQL_fields/edge_table.png)| Write the table name of the edges| -|![Edge schema](../img/fields/edgesSQL_fields/edge_schema.png)|Write the schema of the edge table| -|![Geometry](../img/fields/edgesSQL_fields/geometry.png)|Write the geometry column name| -|![BBOX](../img/fields/edgesSQL_fields/BBOX.png)|Tick to use the Bounding Box of the QGIS canvas to limit the rows of edge table ![BBOX](../img/fields/edgesSQL_fields/BBOXon.png)| - -### Columns - -|Field|Action| -| ----------- | --------- | -|![Id](../img/fields/edgesSQL_fields/columns/Id.png)| Write the column that has the edge identifier| -|![Source](../img/fields/edgesSQL_fields/columns/source.png)|Write the column that has the edge source| -|![Target](../img/fields/edgesSQL_fields/columns/target.png)|Write the column that has the edge target| -|![Cost](../img/fields/edgesSQL_fields/columns/cost.png)|Write the column that has the cost of the edge source -> target| -|![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCostOFF.png)|Write the column that has the cost of the edge target -> source, the column will be used when the box is ticked ![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCost.png)| - -## Arguments tab -![Arguments tab](../img/tabs/arguments/arguments_dijkstra.png) - -|Field|Action| -| ----------- | --------- | -|![fromVids](../img/fields/arguments/astar-dijkstra_fromVids.png)| Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the start vertices| -|![toVids](../img/fields/arguments/astar-dijkstra_toVids.png)|Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the destination vertices| -|![Directed](../img/fields/arguments/directedOFF.png)| Tick if the graph is directed ![Directed](../img/fields/arguments/directedON.png)| - -## Execute tab -![Execute tab](../img/tabs/execute/ExecuteCost.png) - -|Button|Action| -| ----------- | --------- | -|![Preview](../img/buttons/execute/preview.png)| Draws in the canvas the resulting path | -|![Clear Preview](../img/buttons/execute/clearpreview.png)| Removes from the canvas objects generated with Preview| -|![Export](../img/buttons/execute/export.png)| Creates a one row per edge line geometry layer| -|![Export Merged](../img/buttons/execute/exportmergedOFF.png)| Disabled| - -Depending on the pressed button the layer name will be -``` -() pgr_bdDijkstraCost: to BBOX() -``` diff --git a/docs/functions/pgr_dijkstra.md b/docs/functions/pgr_dijkstra.md deleted file mode 100755 index 1d084f2..0000000 --- a/docs/functions/pgr_dijkstra.md +++ /dev/null @@ -1,57 +0,0 @@ - - - - - -# pgr_dijkstra -![pgr_dijkstra](../img/functions/f_pgr_dijkstra.png) - -|Button|Action| -| ----------- | --------- | -|![Help](../img/functions/helpButton.png)|Opens the web page of the documentation of pgr_dijkstra| -|![Function](../img/functions/dijkstra.png)| Choose pgr_dijkstra on the drop down box| - -## Edges SQL tab -![Edges SQL tab](../img/tabs/edges_SQL/dijkstra-KSP_edgesSQL.png) - -|Field|Action| -| ----------- | --------- | -|![Edge table](../img/fields/edgesSQL_fields/edge_table.png)| Write the table name of the edges| -|![Edge schema](../img/fields/edgesSQL_fields/edge_schema.png)|Write the schema of the edge table| -|![Geometry](../img/fields/edgesSQL_fields/geometry.png)|Write the geometry column name| -|![BBOX](../img/fields/edgesSQL_fields/BBOX.png)|Tick to use the Bounding Box of the QGIS canvas to limit the rows of edge table ![BBOX](../img/fields/edgesSQL_fields/BBOXon.png)| - -### Columns - -|Field|Action| -| ----------- | --------- | -|![Id](../img/fields/edgesSQL_fields/columns/Id.png)| Write the column that has the edge identifier| -|![Source](../img/fields/edgesSQL_fields/columns/source.png)|Write the column that has the edge source| -|![Target](../img/fields/edgesSQL_fields/columns/target.png)|Write the column that has the edge target| -|![Cost](../img/fields/edgesSQL_fields/columns/cost.png)|Write the column that has the cost of the edge source -> target| -|![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCostOFF.png)|Write the column that has the cost of the edge target -> source, the column will be used when the box is ticked ![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCost.png)| - -## Arguments tab -![Arguments tab](../img/tabs/arguments/arguments_dijkstra.png) - -|Field|Action| -| ----------- | --------- | -|![fromVids](../img/fields/arguments/astar-dijkstra_fromVids.png)| Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the start vertices| -|![toVids](../img/fields/arguments/astar-dijkstra_toVids.png)|Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the destination vertices| -|![Directed](../img/fields/arguments/directedOFF.png)| Tick if the graph is directed ![Directed](../img/fields/arguments/directedON.png)| - -## Execute tab -![Execute tab](../img/tabs/execute/execute.png) - -|Button|Action| -| ----------- | --------- | -|![Preview](../img/buttons/execute/preview.png)| Draws in the canvas the resulting path | -|![Clear Preview](../img/buttons/execute/clearpreview.png)| Removes from the canvas objects generated with Preview| -|![Export](../img/buttons/execute/export.png)| Creates a one row per edge line geometry layer| -|![Export Merged](../img/buttons/execute/exportmergedON.png)| Creates a one row per path multiline geometry layer. As many rows as needed| - -Depending on the pressed button the layer name will be -``` -() pgr_dijkstra: to BBOX() -(M ) pgr_dijkstra: to BBOX() -``` diff --git a/docs/functions/pgr_dijkstraCost.md b/docs/functions/pgr_dijkstraCost.md deleted file mode 100755 index c3b7861..0000000 --- a/docs/functions/pgr_dijkstraCost.md +++ /dev/null @@ -1,56 +0,0 @@ - - - - - -# pgr_dijkstraCost -![pgr_dijkstraCost](../img/functions/f_pgr_dijkstraCost.png) - -|Button|Action| -| ----------- | --------- | -|![Help](../img/functions/helpButton.png)|Opens the web page of the documentation of pgr_dijkstraCost| -|![Function](../img/functions/dijkstraCost.png)| Choose pgr_dijkstraCost on the drop down box| - -## Edges SQL tab -![Edges SQL tab](../img/tabs/edges_SQL/dijkstra-KSP_edgesSQL.png) - -|Field|Action| -| ----------- | --------- | -|![Edge table](../img/fields/edgesSQL_fields/edge_table.png)| Write the table name of the edges| -|![Edge schema](../img/fields/edgesSQL_fields/edge_schema.png)|Write the schema of the edge table| -|![Geometry](../img/fields/edgesSQL_fields/geometry.png)|Write the geometry column name| -|![BBOX](../img/fields/edgesSQL_fields/BBOX.png)|Tick to use the Bounding Box of the QGIS canvas to limit the rows of edge table ![BBOX](../img/fields/edgesSQL_fields/BBOXon.png)| - -### Columns - -|Field|Action| -| ----------- | --------- | -|![Id](../img/fields/edgesSQL_fields/columns/Id.png)| Write the column that has the edge identifier| -|![Source](../img/fields/edgesSQL_fields/columns/source.png)|Write the column that has the edge source| -|![Target](../img/fields/edgesSQL_fields/columns/target.png)|Write the column that has the edge target| -|![Cost](../img/fields/edgesSQL_fields/columns/cost.png)|Write the column that has the cost of the edge source -> target| -|![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCostOFF.png)|Write the column that has the cost of the edge target -> source, the column will be used when the box is ticked ![Reverse Cost](../img/fields/edgesSQL_fields/columns/reverseCost.png)| - -## Arguments tab -![Arguments tab](../img/tabs/arguments/arguments_dijkstra.png) - -|Field|Action| -| ----------- | --------- | -|![fromVids](../img/fields/arguments/astar-dijkstra_fromVids.png)| Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the start vertices| -|![toVids](../img/fields/arguments/astar-dijkstra_toVids.png)|Choose with ![plus](../img/tabs/arguments/plus_button.png) or write the comma separated identifiers of the destination vertices| -|![Directed](../img/fields/arguments/directedOFF.png)| Tick if the graph is directed ![Directed](../img/fields/arguments/directedON.png)| - -## Execute tab -![Execute tab](../img/tabs/execute/ExecuteCost.png) - -|Button|Action| -| ----------- | --------- | -|![Preview](../img/buttons/execute/preview.png)| Draws in the canvas the resulting path | -|![Clear Preview](../img/buttons/execute/clearpreview.png)| Removes from the canvas objects generated with Preview| -|![Export](../img/buttons/execute/export.png)| Creates a one row per edge line geometry layer| -|![Export Merged](../img/buttons/execute/exportmergedOFF.png)| Disabled| - -Depending on the pressed button the layer name will be -``` -() pgr_dijkstraCost: to BBOX() -``` diff --git a/docs/img/KSP1-1.png b/docs/img/KSP1-1.png deleted file mode 100755 index 290636504928bf9331c8a1d36538d1b730b1b69c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23140 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 B+0Xz0 diff --git a/docs/img/KSP1.png b/docs/img/KSP1.png deleted file mode 100755 index 3e9f8aee410d83ef360e9efa1920c73039ac976e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7156 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 C1jGOU diff --git a/docs/img/astar1.png b/docs/img/astar1.png deleted file mode 100755 index 7f5e8e63288be2123accc9ee068d1ac5e6ba3544..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11689 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 diff --git a/docs/img/buttons/database.png b/docs/img/buttons/database.png deleted file mode 100755 index f16244870c6f310381e70513903676fd01643a54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3515 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 diff --git a/docs/img/buttons/execute/clearpreview.png b/docs/img/buttons/execute/clearpreview.png deleted file mode 100755 index 6a460800843181e37eacb1d4f8e5f6b8d3ed35ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1742 zcmV;<1~K`GP)Na|ykN4rx<@5tDwPT-d@Ps@ zhP{1%qPV2Y+Sqal?_C4W}qDy53j@e^TgZr-A7Apj6Uh?3)zfpAI#eSwlv ze^OGpt)KJ;AOHd7m3q+<2cUGMj-6fx0s)oa`teF!5BaSrKR!R~V4^yw|06J!N+l!ntF{d*t>w#lCbjFGWB0DAkYJ8Y@^kinmONCNnIAC1F>V?D1a83E~ zC2>ZJC%lS}OPBPW8?$Sw6{d@!t-ZW*bB+JR){NA`nr6b%Yf5BfhT=JuVtH|fIG$(CRf947E$x1t+98TknVZLu{3OI^r=fn zzH(G#AJ}#cLZZ(n{u~o-mbLq6hQ@cimn=I=Lh39sFT0rUFB(AmcQ@2^rldExc)K+f z7r)Q~kWcap7`A35_ljBoP($&*m0Nm2u+tHZ7z<}>HsGmY6Yag`DZqlOZ9_DN&gWhSzgi~O!z?1-t z?J#BfFzjAlsRjT5k){FjL;b8dOa@(%mswyDICG?x0Y)0zEgzz1o$-NWS46I zkSsS#>>wK55ASgPyoUlF!U4~VO6w8%G_L@Brim(;UJfgZx< z7-9-}J&A0vcUDB_xTIVrZ@RZ{UcPQ0kZoGFzey_KSQr3k>ZEc8mrHLS;~x&rH8C=9pLlG0km*}dOhhB;(b+{ombo>8 z;NiwthZ3a=3OUG=oBrTV{^LgB9A}0NL&!LAFUPP<;}PaS>zQ^2)>kwuke;!B=b1Ya zX|uXjsdy<7S2uJBKsby1**OWx4`pfuNYnH}TqQ?<8WfENd`CMj4N#LfE3bR#Paaz_yQW!7aQK4hksJFPy9b92Js7uiaUzFlKy5Q&d$0YZr8;44sFzUesCozac*2?3UN z{g)wrzP+jp)Yhh~Tvi^Euwe}Iv$;6t-OZ=k8G0?zd)qBVHy`x5eRCpu;cRh!$f4xV zvNJ?=*z}W1lvn<*z49{!^~F)2UPfhhyZ?*6-b4FoAb^rhX07*qoM6N<$f(H^j1poj5 diff --git a/docs/img/buttons/execute/export.png b/docs/img/buttons/execute/export.png deleted file mode 100755 index 43249f81867c08aa7ac64136dd0c2fe739bc3827..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1271 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 pVIYGL5(}vo3002ovPDHLkV1nDn2WkKS diff --git a/docs/img/buttons/execute/preview.png b/docs/img/buttons/execute/preview.png deleted file mode 100755 index f9cb25d31d2f1c1b27a20087ef37cefe87c04a59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1206 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 diff --git a/docs/img/dijkstra1-1.png b/docs/img/dijkstra1-1.png deleted file mode 100755 index 152792ce37a951bbef8686af76e8afb4bcebb765..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24367 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

    >tgGSYHGr>g4kC=TA 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 F{tro8zajtt diff --git a/docs/img/dijkstra1.png b/docs/img/dijkstra1.png deleted file mode 100755 index 0d31f83fd6382cedc25a08ff56627072e18f442e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6199 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 diff --git a/docs/img/fields/arguments/KSP_toVid.png b/docs/img/fields/arguments/KSP_toVid.png deleted file mode 100755 index cf43175151e70539353810067f7c7bbf6fb4c365..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1974 zcmV;n2TAyeP)UWO00003b3#c}2nYz< z;ZNWI000nlMObuGZ)S9NVRB^vQ)qQ`bY*g5g3t*700&Y@L_t(|+U=ZsR8#jI!0#jP z1jt(gB8CD11TBIJg5?p~S?h2fRBFzVc3tafcTPL$HfKGZ^Qf!qPS@J4>hX-~DR^qz z*-ckV%SI3jN)f??Vi^fdrUi#dAkTY4UiY^@A{|N9CTb{W{5~iDs$ zi#lB{1OkaY7<>yLGXrfFo)bk;I-Q;%NqBi;4VTNw%*ennY>uj?)9I7vCria*s6wnU znan!5ZD$#Apak=8sz)M>-7#?8FahdQO#m8nR0n5 zpU=NtlL1wOg!9Ff!Q^C_R4j>Vmf37JT)p-HiV6e*m_Q*B;U-CmNDQJxEEZ3aZjZ+U z6DZ{Fad@nHi}uU0KF6fZPX(AbCnvEWH?dI23127x06^6skpe)7F-GfPhp}12mlkCy z*>s+l@|s-NyN2634eGVowRuSe(S&(0vzS==KwYE$Bwq7?zKC+}nED<*K9MO#Q+;U>%QO$qx5321S+e6)8l>PeT z-U{YzPjI5;S5KbKIq=q#X;TIV^bODK7~a&duVDR8MIy<)iaq)7)^`rR+ol~QDMr@T zBd=~sg0*Ih0vibC%?`uIxeJ%cCE4oh%_KqkfS<);5i)Lqj|Xd$F$6{L_+=R?D1KyVLu1?Umb6S9K@bG-4Yi-O z=08=!r^N}%ZrRYFD0;__!ZavT%l;P{89&~6=(meR32E#nFR5C}4av;9MtK0*v#td{!bvXm^P;A zv!@A%|Mc9J&DHDcp8I{X-VL3IZKY;&kF)5UF>=&Pd0tw+_m#>wgWC_*9RHp2Sbz$Q z+6;*aDJI9*cUNjrsy5lD?qXMMUMuHd2u-lKR#i0K(mE7U)3X*oT!MAB^-m%Q*?aap zt@PmsLu$Lg)$a3Sc{Qpf0vy5PvNo(M;6xUkDDw@IQ+v@?x##GKQ%x_g967S1VZaN$ zh+$9z{(ztGIh|gI5BJ@AV1Pmq;0yR~Mm2E1q8cD3tbUPHIOPUSB2I8v?V*Qf=c(_n=jyxlTbZ zVhEGQ8?|2L(Rdy&S^wG7TTgBZZm(}q)wifH6ibRpQTx_&9Q6Vrog5a=D1ex&kaQS>~OvOpOls zeH5KRhdRV2fd->gwlrU3>|Vf;1D^*C_=ST1l|obiU=*4XFK^bW%hHu#s#v>U36xo| zdR3tH#772_Lj2Y*J~+`WP%1OSn^;_~td#aPy{}2GP|ES}ovAB|#o75HyNRV!bYuWLMfZe)`3ntK~hURk(unGCLV#Igm=O)TI6VfS!*aZ(k7Lj9D#zD2dI zSp@=sf#GFokAA8-L!(#~imLG5HJZhaTZc7n;nw|6AANJrQwd^@sW zDHRndjYrX%hvt7<1)8Gn<*nA&Use6p&6MUmwsB4FNMt|k#w2TA+HHH|t!JzEJ8((f zqxJhX%b{s8wN1bhJ(j)U_@zHz@U=dqSpBu#IBGKjjG8Y`xdDsCGMg>I zPBij|$zo=+*y!!Q#DP%_5>94jx?VT@mBA3zEDoEUnwr97GNEdaND=V)3Ppy;;{hOw z42hyBlgUg-NPwzAA}*>h>~{YTxTnLycNQ{32G7EC;&M4AlNnx{8DPw0;&M1M^IEfU z374X%A)TItw}**6JT5mQBYkFW4}-${t3l>&0);@;AdtJ~zZj%lAC)Z0sQ>@~07*qo IM6N<$f=5Wa*8l(j diff --git a/docs/img/fields/arguments/Vid-selected.png b/docs/img/fields/arguments/Vid-selected.png deleted file mode 100755 index 1ad4a979b2240f912cce0d9385442fef9563b2b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 753 zcmVvND?Zj~_o05)vj& zn)K(-AN(e;P}f0zetuZRYiny=U0od<90=A_EOf{?`}XZSc<|ui!-t7cOmhdlfB!x^ zJA3Wgwe0NdG|%?fvNja_`o#fZY~H-(?%lgqR#pN60s;a8Z{NPNv9W1rXrO+!U$f@F zgv9@oC$UKR`Yzz*{c_^O|NsC0fB*jdH4+dN72Uso|CcXca2ZR!gOZc~v#|UZ7KXa% z`t|GAuV05al#T5V3(NnuHY~ct#l`WLL*zT?&!7KsasOFZ{tF2Faki_pw{*0(bhI+> z-@;@u{71?G| zT6F~bhMOwiVqy8u$^M&-^)Cy{e>eRzA%3A`8%R;Mzj5Qnn>Vi_EDwGB#(VFz1Oo$u ziPB9^z4L3YKfAhUrJ}eL8D>(U9J=~g;o(~`2>Z%oMGNH{jLb}|dYT-HisTqaVU$^# z^+D2&yZ(7o<=c?-*}D~+qZAuzI_`~7DPw?$5k-WFx&t6^MCbfoKmY+k!dXBXjgjFL8A^Db&AqQ8z=~-9^xq?ODR=R1OtUq+8zq(K@dR$IkuBe04yUh$Azv0b%Z-zre7?5}voIJM2zAcgeF_+8b zWHR~tjNk9i<#M;d4u`{uMB>+QfB)d*O~XJ%!D8{xc}>%NzB|#W*56C6 z)qHUg2|-c3#;dBTswyIG#a{#h7ldFi$j0Wnf4|SpV0s#AH5eMgh1oZDrw9PD96tQE zW12yphfD@mR-j+`K0QTAvIs#zuwFjid$;yc4%7)jN->{jzM;(b{Mn;~Uu-#eX~ZN1 zDYfTkwtGkiTTj(A%`o&=PxJ2!tIZB=v_uYIec{WG#;$gFfAa1`-`^6S(4@p_b|?UF z97-c~Xn<{A+6}W`8FTdf$;Qt!wtd4Lr}z(-UiVOQHnw5l*jU>EZ!Ud)yPR>(UKH)) zV`er(#%eW)M&bM%I1V1%OB4PR0F260UrQhAb)HfI%vBpLCw;w$uOs002ovPDHLk FV1oV#8~XqN diff --git a/docs/img/fields/arguments/astar-dijkstra_fromVid.png b/docs/img/fields/arguments/astar-dijkstra_fromVid.png deleted file mode 100755 index 068ac2044361a944ab4c731036153449f34b929d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2243 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 RE>-{l002ovPDHLkV1m!_P0s)T diff --git a/docs/img/fields/arguments/astar-dijkstra_fromVids.png b/docs/img/fields/arguments/astar-dijkstra_fromVids.png deleted file mode 100755 index 02ab1e7d3fa6d017d9c985494d622a5bce9c7709..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2545 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 Hu0mjf&rj6~ diff --git a/docs/img/fields/arguments/astar-dijkstra_toVid.png b/docs/img/fields/arguments/astar-dijkstra_toVid.png deleted file mode 100755 index 4f10b5f89e15282b33394f78956626c6cdebed9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2146 zcmV-o2%YzdP)BG} z?dT|gKb=s22Fz)mQY zDw(_^Fu;G+d7@6Qhr+Te0s&vA)4_ZT0&{r?WaZ~ukpBs0v$^$do55gM)F>L2>gVUf zVzDMF1E?*?Oj_=?d3d-9c>G0;QmIs(UES*tgw19{PlU{kL9gd?dBh^&@pwkP!DKQ) zPlPN2jcHgu(0s4IQDanFa4VHW4_*@yx+aoCpIOBd1Oc@LnHPeXCK1JOTeYH;%MwHf zCOeWDX56eCeN@{~alKRWRM2n2+#{wA{IAuCrkj8LT~3kAI`cUGp!nsqcW+>D8&|5j zrV2|UKO5{F9w*$a!L`lmhJUMX8&G}f`mH=Z=ga!zO+EE<4xAOYtg;i?yNbJ}i^1V% zyNU~+5g_v|L|^lM=280FMK6a_#R$M)~oBB#%n-mKR0H8-C$Kf^QO%q8R-XoQE_$MZMkXQk+(Z2M#1|!S(;@HFT4{}~RZ*=8Ot{&HR zG(GmsI`pryE0Ql?4ZipHf`2M-sF9_5q7C^#Glfp`-+@F*kiRv7ZeI(ag^2)8AiFI?tJ9dd}@A=`$ zQQS*C{TARyfl66o*dhP`ZI7FTzM<_Stpl0?GmdF>8r$h!MYl7HY%y4R=!%U28>MZM zr^B}Wlqb%UHnp67=cA6KL!TCeI2+{W4)1yMBVUhsK5T$26fmB^?G*45gC?Sb==lj|b0$AEAs?<@* zG0dqdAqE?2WxiXs#|g*)q5J;wS+UK|P_CDo^VAPB-@wdgRd)~vxubJtyj6-NMpSuM8fXPDvw?mw;`(lQ0S@hCvz3b@$t zuzvb9KFP_R&63(d)7`68#+Z}{#`GyPYAwR!^O11_}i?!t3z zBgAssezLC*-Nn0G zsbJFBbNkBzEQrl@8Bq?58=Q5pe~`lA%*fDDkAy@~d$qK>ss_ZShR>+bP-iBC7#

      } zrG`^yB|+jRg5=+Pev7gxDQxCRgclht>MSj(8^i!%?74Qf>M;%g0K~AOy<1};0P5_q z*3%isEK3bsgr@Q2o_#lh_Po12glf_o40?mv3T3jqLNRnr1cTtzbx32}Qz$rM!7X`Z znY&6e2`fQCN%3pbt~6bAz-fsADPXQbaUuCGIq-!8uNQstK~9Fsh%$xZ9e>H*K%d=J zV2e}2J}&IpnjA3Oj!@61_w62d|L9BUhe#Y@;`2{MHFN?12wnTRKcBAeGn1(_7h(J> zuf{B~C588w9s8=K4{OQ&Rq@y%%Ep3=@1-%IQkE_+HjVpa(6hx2Cu^{)n*ugJ98vVD z6$FZVve$aL_*`zj&@AuRot*FH>^`&oU{l0O{y(4Fjd$W=W8g;HmFqRN5kC)~dZbcX z9sP@_iI2^X>Pv2aHiQkt2gSL%xB&t@9PTc=Q{jL+z9ilmw=QAg%A0ldfdN7{H@Ahy zEy(K2xTeIR^=^^w30^gdDruW!P5^#A|> diff --git a/docs/img/fields/arguments/astar-dijkstra_toVids.png b/docs/img/fields/arguments/astar-dijkstra_toVids.png deleted file mode 100755 index d2ed51fa3bbe01f083212c47fb3ca4747eb4038a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2420 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 Wk&(-ygWw+k0000s@23LqEaPT5iPhR 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 CQAh;< diff --git a/docs/img/fields/edgesSQL_fields/BBOX.png b/docs/img/fields/edgesSQL_fields/BBOX.png deleted file mode 100755 index 78327da4a7770ca03dd4aa6a83be11a5985a9948..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1124 zcmV-q1e^PbP)d>NP?q=s+fAlWQ6JoGX8tCydYuD?SD*+jEpQ?LeiR+zA4F`8a#{)3=9na-e20V zaKV<7*PeX*&BiCAY3Uai7pN=9^#A?A_PnXgS+mP5`574)82&t5T~T=4YC>0#91Gsq zph}= zW<~k>FXow@%Qvpyx}+!1`um2O@~P*){$~`l%gWHZFmvXq&;J=1{yy0{VJ%Zsp`RQJ zp+rT^a)X6i+Q`FR@yE-TU;d#=@X1?xT8O`Y@#+r)!@n21=WY4xTTvQrDksRv&LJRU z98g^2$GCa^j%WWF7zM1dv$f7lU2x{p^DUFt{13|ulw~2DH>e5z|9pLM*P-VsR))f; z7X176?98rH-;Axa*%%nUU%PZ$z{Ex!x$I_Du`(0Ad-3v@{|pR_g4XG|T4#ES8kYVI zDfX9PrbpgjU|?YQbA3*#>s*HafB*dBka0?{@{?y`VED(t!0`KIzrXtghW~&6{Nq;j z$!T;DVPg3I_4DU{d}{ot9%ba?=llQV(-#H?UIqq6eq$$tKYRAeWLrox6IW7EC2we^ z%-+3o%f8*4H%*D-+E`Jt>fv8VAe$F%+_`1%u5G(kwfTQuklnQF<$p$QK3=9zA3pv= zjmS?QJ~Hz1@h~tjFfe?-x^UJd{V3;;%V+F*{hw~$fCninpMtf&mB8)OS3jcI&d4sL z=HX?;aN+FDKMb5&dTJle9J%=uNx|>iM^C>|(bwf+WMKGlWyzES$|<>tY58`KXHVIW z$0M}y2E*U4kB@CU{6a)oftL|Q;`gV!JGY+xCa)~d%)lh>n&{26xwB{W*{7d=|NZ^> z`S}gKEt?tr6FsCD8Gc+_-oH;KEzL@hk<%bP-Qv#NDf{34qi5b=U|?Y3mDY90Z%xo* zMa~-x{~6f?6bxN!Yl7sN7#JA14Kq4B#1}4@QatDB$KR~{vRYO_tsMb6T#P?&ES|VW zJYj;PFe3v410%0VYKDHwW6cFjyuAT|8(czMkl7p@>A}S(s z_S|`5G+e%NMNCYLq?QZ)TDU)c{#?3z)!R3332G1*6LWF4mz0!bVqzL}-e6#0`1|+o qmoHxkw)wcYxOjPa2bCWf7#IL*nv__voNzG!0000{C@-V4&5bzNB@3eYP@5V?gm8ii1NoY&;v%(C=+04w69ln%fqB$r8e=}x z5F8FC=$dN8$u5Th0CJVQQ8z{gnWFG}e?Ep>i)*o~c#8LT6H=5&Bnn21e;cgbba2P9 zei~s2063l$$6BI005Yo!H%|8Ycg>}q-=U4#I@d;5&8@}j2hSbh|K-(M9r$esud1+_WmA)!f_tg`sAL?AnP#?Kivtz`6z+bqCIp>tC%gbe=V}*H&b> zJE{*f47gY%*|4iD;Ywp;pOXck$4qsfW7{k9qVNDdxCrOT)@E;1&P`8~jDJF?NY6== z&P@I01z@JECyn$L-ToKXMM=U#!^HBGtyR@|sOyujCRjjXO?kQ6*3fEmOd9JyV_&G) zwi*xY++gSLUbTEPsnR5`@ZW%;CTx~IDn+v<1i(EsI4n+m;*rn=3%DxH%NXU{75 zU+N2pPTjuKw`t!YudnRvHlDYbEvJuYovr2XSf*LT6ACcLtex?{NXM)l350wA0B~P# z`*<*M`)0f0gyk+9a5I9q!sraGMm*eq-R`$L3XO=(&Rq*vF5mP*xH=(r*7n`a`2`C+ z!{7J+u1bvOBY?S|+VvM=iuV+i?A>suN#DB&$bIruwCm0fo!?HajENQ?zl6tetJ~C1 zDPj~Hz@%A4&tP3OwP!AmJ3O?0o9A`bSTdYjNG1&`bLfi>oEx5g8d7 zbe>Ad1M{eBIR%ypkBSe=abN#|!=?VD_w`Y~P)kci#fSY$QYKx6VOY>%002$XBuP>f nwRizR5CVZ9s2Kb(9_aWBqOzN2rg3nu00000NkvXXu0mjf2yY78 diff --git a/docs/img/fields/edgesSQL_fields/columns/Id.png b/docs/img/fields/edgesSQL_fields/columns/Id.png deleted file mode 100755 index f8c28e3e0b107f0a9ec392229df1dbdc1ef9a053..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 765 zcmV>dh#Uo@5jh%>qhK^5N5K$` z$Um2+heu7j@P`0d|wxwWKa+D)yZ#T!tFURLul{JgN&kra_xa;z z9#Jt)XzZ~H3GtB{k^et^_#!AS3N79l`Gti?i&pwaBoi+m@3(jFe!}AQ%a^aDmWzzM z0z4nzyo2^P{(t-Y<@adOO81ClmN&N)xwv-am5=`z{(ZT-apS2kq{afPrkw@z!4(^B zfBnz!=lz9MTh9F%jS)ITGxgyb#!WbdUz zaub-#BD+40XJ=lZw`*wGYHl|ldFIh5ArCOpbQRs%bLVZWEJs6`rr^l2(#5*qoGVY@Z!}gZZ0mG4+#AG_wVMd v+uuev@z4zLaC57wsxUDzF^=w!93B7wp0nQt0(l-H00000NkvXXu0mjf>VA1= diff --git a/docs/img/fields/edgesSQL_fields/columns/cost.png b/docs/img/fields/edgesSQL_fields/columns/cost.png deleted file mode 100755 index f38c8021ef89f89ab158e0d13a2bd28abb175abf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 zcmV-^1%djBP))SR8e83;RC$i$DP^zzxn_6?KS)0v%Wrn7;%gl z&M<~y6bdD6G@{;Z1dj8(WHJoHhSjS=p_IBxB_xRi*a(VJE0m4Xrg~w+nMxatNUBYd zNW?Tv0{}48#fSuXMP3oeD*|~%Ag>7I6?sLBGzR?M#2OlIoXh^Tr1puXAL69j?A6=k zpHH_R^g&r&?X7xpmEVM6IBVG6n(KAqpv5le41K>>_E}}xc6q7O+N}p;ygdX~ZA)DX zaI+gq)tZvLbVcZj;qc0+?`9`I4qJu1e!wg9LV0!w#s`ib;AO05~#lb*p5dxCmWc4yS6&CTl`aQPp{WNw-B z!9iG_mSr5vEPSBS17c$E&eX{Hc2CPQj-Dy3>F&n_lb5WGjtH4fKw#P6$4`*!^0ap$+s9gCC>=#|k_KX~H0BF^j0tFBdbG2uwrjJQDwpob{B9m$eb%AU3wRSgirU%Su*(ph8{;#mmaWY>@!#K_ z8k>B1i8HI|q6wb0B`f|w>1_GA{l287?Z)99v4@DP{Q(Y@IY;if?#n&oOE8A^R=or6 z;{9!WQ(cTcq9ATQGWx#fCf1-gK%qzo-*y_RI{)#`APw11T)Az59Ip2a-E5|3?= zK1vV&Z2k76o64bQjb5*qc;+1Ewmu!j z+v?5jsmw}BDR|gP1AL-iSaf9QECIAOT#Qc0tJSbvJ3H~rPa4dzV+l|LzsN&5x4%D*|~%Ag>7I6@k1WkXPi@HsCmq zqSUB#+tE!?IFAS3@x94bFbwlpp){g(S2lx><1(2ihG7t`lN^!!4aMCsNmCLcT>t<8 M07*qoM6N<$g6mbh?f?J) diff --git a/docs/img/fields/edgesSQL_fields/columns/reverseCost.png b/docs/img/fields/edgesSQL_fields/columns/reverseCost.png deleted file mode 100755 index a9ae3fb4e019f6df9e8cd1219fe893e81fcd07cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1883 zcmV-h2c-CkP)*6IT?+&u&5zc7c#U0tukTLbPfhTA@X$0*>;iB2cX_s;%M_wAEI{`htpL zA0jV#mtv{)F||Hur7{Ikv_R2X(U}&NghrVnAsC*?29j{MAFztjk#@#R1^4%9XXnnD z-SeMw?mg$;i*@OAz%XRN85ay`*!P|gLUnZtJw-82u@EFl$UQu89Jh#mb#)3CR~NCP zBjacbq0zL|DU@T!$SsmT^%TX3XHmprkzTK7=065TKSnEab0wSMtLAr44;Y2Tjg!mAnsaD+0y)$vQL4sS_3->SRxR!A;q@|xT@UvgO2 z554sV)5;^(XBLm;TX7nXtVt-BZ~f|fFZ(;E<5z7@b?Yn!+>daE?3I)OPDuw=)N5-G!_T zdD@7iL)kLAcHf5gw;z?|ERqdK6G(k3e)D%Ws}fEGj$*goZs$2bbMcO?MS^uHMgCGu zQ&11L(O_T+W&q5&8^)V0SwC0{*k$zGx1{^2vl?%q!7MI^bnBxeS-rr7t zU#04#35k59aCpra|04b{8&@|$-(UB(wrG25QX<0A?<#9VFB^IVKEYnO1!cG1Txu*m z(>^uYn~x#Ioi?N5KxD`_cVpPddX}Q-2d#nCxK$Y+7acsfJ2DTAn;rGuQeSCT%N;{g z<>uFlu|A!QEayqoz`~YpZ|eY&lNj%pPFvf-QS5m44MvJZM7y>P;j*CEJlo@69@_MJ zve^)m&fofh0aJp!Q?ky~PBNYCdG$jt0sz?y>^U#Y zJ(xPz5$ivjYWrIQ09-IGc#C{Y{j?N7g3am#jPTl{u?2&PT+3{^btGRBZc!>4 z4FmjTynXGu#()604(_8xR=p-O@H~U3=}zV!yVh<7ppEUS>ka?ZSHeY8{3hJ|?(@5|ERs$VWI)IbMou8Zz-;XK zSVP?(6aY;>1@U(u*2qOWV@>IK(cuXlCXAGfo4;YFhZ7q(6N3GW%MWuSqsR1F#Kp5> zKQ*LhZkw0X+6`QhJn(}AcbA72l4f=J-o)d|PK?7PB$M7+7be3o%=^9Mck)sbmS;Cp zh$DDr+KL?;N7!Kl1eAuv@90d*UN`%*PBYIXaAWdj-x*sz=}O(ZJ|wXd5z@(X<95w+ z!vX1Qk8R1j&}3wDdG>Pu^&k3J1IBxG@uD9;iJeo-ePwM2#dzcgv$!(Fiw{k`7G;4QQgeg1Qu5{YEU^v}${?_ZO6uKoTZ6c-0 z8ZM&BNI0d^2g?SRu;jMM-3I!1N{4`c?D0#p3YHGzpiK1SZMaBfC>)U;bZhR21R|r~69J3G;`90Ub`>mDKQIjK`j3IpkHIqf zktCtfv@jmA9BPe*Bp&mQ$Nl;pA#|foK{5ANEQSq9dU&`$-uo*UbN`Q-{}}!^{sIbH Vz@^D(R6+m%002ovPDHLkV1gV@kwE|e diff --git a/docs/img/fields/edgesSQL_fields/columns/reverseCostOFF.png b/docs/img/fields/edgesSQL_fields/columns/reverseCostOFF.png deleted file mode 100755 index 31c183d608596dab40a6fe6f9d80ce2d2a4fb6fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2974 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 UWE2XS(*OVf07*qoM6N<$f~o4XMgRZ+ diff --git a/docs/img/fields/edgesSQL_fields/columns/source.png b/docs/img/fields/edgesSQL_fields/columns/source.png deleted file mode 100755 index e94cf13ff5711eb66ca2fb7ee6827aa6dede7488..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1827 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 YfXjm`)UIa%f=>wqZe?#-33HGBALY@h!~g&Q diff --git a/docs/img/fields/edgesSQL_fields/columns/y1.png b/docs/img/fields/edgesSQL_fields/columns/y1.png deleted file mode 100755 index 4ba97a4db3cbb7489af289abece7aaf11406e006..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 799 zcmV+)1K|9LP)3nU zg}YCURb{DMT7Lfab2Qp$3Zz8@;6>VKJvZ7y83m&;Hws2$ZZzgb!D!5lg3*{8jk!@U zOk(c;o9)$MG1IQVhp_(KU78wDy5{LW1_lO(fA7yPsSfrkSOMWu0{*=}yP(wDIcv$2 zf1}YrjhJH;aZL{7+O=rw^ZyJC3=IF@?OCw-mv@q{G}Hf&SC&*2_uu7_V5QX7{~s<^ zd_}f*+RA7DVBF=IUdhX!{%2>Ca;ctO=O{TE15~Z&xQt?=R8B8mcjwXO`3JH|L)2ZYT?#a&o`|NXmg=jo^KqdP)q1^Br+43wmqn3$*> dbEANs002bB*+Q3_Ml}Ec002ovPDHLkV1h^HiI4yQ diff --git a/docs/img/fields/edgesSQL_fields/edge_schema.png b/docs/img/fields/edgesSQL_fields/edge_schema.png deleted file mode 100755 index ca43651a89a1a17baed9dcfe2e7a7f0ea1290789..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2239 zcmV;w2tfCVP)0018d0ssI2unZj500003b3#c}2nYz< z;ZNWI000nlMObuGZ)S9NVRB^vQ)qQ`bY*g5g3t*700>)2L_t(|+U=ZaR1{Yh$8S}2 zLwC~~OSibN$Y3Iy21OAObkJy`_ezA+fAZwv*?Y_@?{(|oX_{9ZvX(6-LjYnul^(e06~!CtCK+x1R$Kg9v}$fbw>?t++1;z z-mAU=2#TVpuCi{a$cfyS@ZTpIeW~qde>WfretUac)h`GBb?iS+n)UnHPxG-VPE-fR zulR%oOvCNOh{IV$zw0=rPF^d%nPVg9GV6@&PC|Ixxx2r&Ahy`jec9$^ZpMVJ?q)*N zvFtlfmB2UuEGS~-Z~%f*+&L8d!!Kp^8p?FE|LS$KKH?Do+839PM8^GGCPxOAcmMz_b>XqK2QJ>N)99JGF50kqmNmDl>ADu`6)E}Q#L|x_)Kr=kvp@MtNllBs zWW>@vq23m_tiKoktt&geBl>}DP-154sc=8eof|LO{UcqT92)(=er;lATFM?TB0IC7 z-PbVH89TzRNEgPYrly6@L1{aquB*EgeEQ+(*t7b+hf-6|r61n2Vye9n0d#rFw%u0@ z{lZgDpHB|o;%&!kzrodF>C%0tGSZSmhF8QLI$w(bw55sP?=7_pK9X`a>H7&ahrc^^ zzYPEYsji$W8L=TDBQ<%w?Zbl`LUMEsw6 z{R=S}CA!|nekOq@eA!@u)7hfVVjMprVXD2l5guh zd$c^ShxnHKi@$O{|H99~NRP!awiswcVL`q#|NZ5^qkQ^z%3oWcQ1K-lk^^8H83_pn z0BD6=VPIm?*=}gq(Jrf(w-rV%^owb)RJvAXl!gXizjQw)lY=7#S;tdC0wN@CzKfU5 zwBadajRq1a?-lDxh>gTA=ba=8q(uOnlazsw zPrN*nLbyWGXs(d8cAUYe)lG;80Hi=9Y%Z6-Y)6`= zX2b;mN@OJFxy(PlaXh!DOL7Le_yoInDa+373fUIj@927|NZ9nGUV}i;+l*6UL$UGH z;3KPtckMq?^}4hJ`q9bIUHM~nhpu%HQA}0Jmn$CiK6upJ(4axUCIFD8zE&-;6p;X( z-xvTu%0|^63P&25yrn%JT4nWW!9Y=W&q>liEFv4~8W5OZA-;3}jp&y!3{-~0Y?4!%$b|*ZknX4(8&{dmlINct8YVq zbgJj2<#OhY#*37VD!qY2tV9$b_5DkE6>qc)-FEwQT2UhnwETABsawXb?$#739bl?0 zD=2FL0H*PF*5zkiuGE^JnO@vT1EVZXNxx|{*4?^W=fNH6;jH@cXxalM4NP-wd9@mE zNxh@`tt*LLG%>a##%4+ELBEgZZ(b_j8|I&((U;mz^PXy7-3$Q08ZvLwQrX^}ei>Sh zvGpW($A0DQCDz(nOoy;y=Y_WbA;C8zYcQY z0?T^dmY~+i!^=H)sE~oxtPK%M?0V>)o?YP9pv2h7m445f7#4rv2*0&k28-Whyu&;f zy6rx^WO0&!BetD3ew^t38x#Sln=^fEl}}-sOapSQ{Zgo=qjJ0x>l~G+gIBc3}XXyvx+5*Jl5=%MTc(+h^lX8_jCDb&z3=a z>{j0DPVL)$KTVsz-#3aM8nmdsL@EK=I5*&IwsEiih)x>68AXFM;1L z#{L9@!TQEvu)Z-EtZxkFPk{fwsz)>}EjS6deq%6L-xv(mHwN=|`5#m`Z4kayJU{>d N002ovPDHLkV1hulVqO3M diff --git a/docs/img/fields/edgesSQL_fields/edge_table.png b/docs/img/fields/edgesSQL_fields/edge_table.png deleted file mode 100755 index d7ef8de976e2d24a98e2d12377f66d3dae3131d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2537 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 CJ;O}^ diff --git a/docs/img/functions/KSP.png b/docs/img/functions/KSP.png deleted file mode 100755 index f3e52c10f1b8eb879c4ccd61b9082f8071efdd1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1570 zcmV+-2Hp9IP)LRn#I+<9*GEw8iC(h~6 zMSLv2At)eBR2XW2YD+8hf$cr}qvc_N>axwW`1}0RZ=m3t1QmMS#{8tD; zaJgKH<&a*d2gw4C43Eb%=nO`qvCknOgfYet8o;r!s+0ne0Gtj`E#S001dI_l1i<0_ zfo-k@$pTKGTW|<~lRE@Uc?RJCoT(ZE!2(X>5BhTLOGva>dt%iWze={s6Zr%}SW{WJ zLf#a=D(~Y_Pp<7N{PEQFX0?&#=`W0)oxNa+KWf>(G`+ZyBnS$P!RCibr>ABlgnAG# zcTkS?a|kc>?z;MtHS+q{oDGQ~3|0Bs4Zpi(uHF+DK<#XAYEZI#CN!$aA5+8L?D;iBWU^mk=Hq>iQz{Gwol zF==cnTfgywC~IR%xI4mTwNhyoB*h9?G=w<*;W7S}B@oMSFvf_+8X27s7kvC|a|anU z0ub$-PE^p63yKewD!vl86s_A`(~WT3Z<{t< z_D$P-p!BEj)BVmJywtl-jBG96evC-WFFv?+mWVpUC{3-Wzs*0&Nz0!jVG{@;L=B9d zII^xpR(iRmiyZ6<(x|#~;qa+@BO=ClgJg#p5=lg6MtYHAXH`|TjbtSQ5-qk-?GV1! zMLaDb%!7icp06jpAE~)^@t#S2?T@;^smZZCIwIVIrzTDG?rZs)z2ehm#{{sL43{A~ zYGlh1d2zMY&}|}m1xOR7tly9tc(-Ilddkwx`zs%rdd@t(B2SwBVZzL;wMROn%f3zt zrNJ~0Z{gaJ?BKrEHXCDv5Yy9xZawb8^>*vjYE5djmhkfCTHj8vy*PxX=YdZ33-F^1 z*+Ih?W5PqaV9P9B;g{PB%7XIWd(C=#_feBmb0*K$+^*OyTbJ9qQocyyf)S#RTeNre zWY&;F1cnJ>@z^;TY4UA_2%$v_=845)?N7D+RR*0(t+!l_4Ud&wEVd`rlkI^!)E&5| ztm@MB`*;fRoJTmp3Giq0CS+yDJuZ>$X)rwNvDu<2>9eA=H*P#I!%V(v8CM*UyL?&h z@?{cn#B<+lzhC>b`gmEL){M-W>itKnyrN@+Xx>rM(5CXzO0@|gW9!9Z7h1`GJVJsM z@mcOC^s<8Dt6EGxym9_!bDP#+G8>e2Cr{P71Pe#NlHDtaNEjj#hS;mzY7IPi_!%qHV%-rY5w^Mta0P&kYzfP+9V^bBm&Qat zTkJO|=6|D`r&uhpQv;bBcP&||`h3rlC@7SG|C>vfuZ#{A^7(w)i;25`8=$?RM(-OI z$aO*b`{xc+sKSziZQEQ}eP&DE&yD@uDJ?7|Z|($G+5-LyXuawj=n&ALk7%;9?#PzB zy0$JeA{f47-d?;gjx*q5&ZNbgCJoj_fQSSC+932egfkWAr7`0mE`Vb@gsWkrg?v6A zc7+4Zmu+ExE#Q1WV-#>&)k2;HoWLL8XL|^)u8el2lIPSK?&DB*P7|CQZxm>PQwIoSuG#aDP2sIhtm=FZPU@+KhHibg@8)UbQ UBQ_3GYXATM07*qoM6N<$f&<_G7XSbN diff --git a/docs/img/functions/astar.png b/docs/img/functions/astar.png deleted file mode 100755 index 1218c6d6332eee636508ce330d8109408933be3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1610 zcmV-Q2DSN#P)thG#Aa2-HUtT?5$ZXFkJY*j37Rfr;$N>xOyOC24p zxD_Z?iVaW;Dq58#k&p-pfxLJ70T6@`nQ1#F^!~nN=FU4WZ_fMYy#G0KU(mDWW*`vE z3RcHQTU(o~yi%*xl8g{c6Aqj0>FL4e^BD|Ar)qyMuXJ^FadL1Z*&&!Fa=HB8gNNP- z2?PR0$C6f~C6XnWGLDXpt(sPyPS@=a05Hawq=sPHbgGm=GC?pqh-wLDJ43)2h(jQl zyg%q&Yl&nDW}sW*5C~@O5IWj3k`977bz?-Z1her6-L>}B725X4*Z1$qy(D|Arq}{k z-zf`{op}nh{(+%^lrykulPFXNBNu6OGL@(tHwFfs@nV2Y9}57pdMU0 zkk^(J79eDjdo`H3RayoBfs%j$uD{IJ>i@`GEXD7Rd3@@EtU=3m51q3#A;OCTKs6K{ z+$OzPsb<>yOo|F@$gB#>T{)ilJR3j6B%dAEv9YTGjDir!C`q(c6x5%J^8a% z%ztfq!t&?<9;K*Pu>GO~hj5ty_U`^c0HD8rdPB;Is(M&6zkuyLb?v72c_n=UQG0P( z%#R~hj4RK`zV>9~vh4L!tceKBv3zDo_r=G>N_q&iw6v^avA-`V?B+OSS#@T1#=nbU#}LFzrS~ z&InZ9EWEE*-n>!a9v&6yXaUIDD?D177RoT%WO6`L}Jz2srA-**i@@^^h0J^%u)7R_hfnAnf zt1r-c-;40NR>giz^>0p6MukOKsViD>VX zFs25&ECM#NO_wuv*8HD$Z%s_Hv1SVc-kB^ZZ3IkHO}9^Gp0BD?YB5{j=07oZ-Q1BD z7=!oQ(V<(j66a()N32aX5ZLuSnCuJwKMfqZ9^(_=2wv+!`NlPa4 z`vmjDlG4Hq3@*sSobb;LLYG6hTyQNUcpS+K!L%JhiQjOMi;D}{6;3d}YD@Ol63h?s zE(5`ARZHqD!3_KXesPAt<+2;(az_UTk{W_(B3CG^xEzE~_YC1_V`J5y)f)2ebOcky zip%xz7|P*r1Oh>)YH6BQsZ=_hj`U;%(*z;JX0v%b9)rR78@XBEnk*GmmH+?%07*qo IM6N<$f~N=xivR!s diff --git a/docs/img/functions/astarCost.png b/docs/img/functions/astarCost.png deleted file mode 100755 index b3a91a226b8648142b0a3581dda1d3887c35398e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2147 zcmV-p2%PtcP)H??7z1$# z1e5m%J##IQEWr$POB@2h%pF4K_KYkC!JKwuM6d+2@dwXx?W;?)9koB~%Q&1@QmdgU zp~P#_AD6`h2@$R@{Qj}qBtJ2Fq1)0`=O4{EbwysK&|*p`89q6B`Jcw{2S0|c;?hml z_%~eHL?WiV9b>)Xc^Dpj{droU$Fj7w0d@xU&t1_d(n=Hx2+@f8)z-S>Kgum?F>Lg!|WLR)ij2GoJa&KR!&>{9yq) zvFBVVd-}GF1;cv^4l8bCryagtrD$r!f{`=gRz~>oX=R;~@{aHy%4GtGoP7cTKwo_( zDfvW29juGYryQoP-!z+F*eeiq6r@I-AF(>1bWiq`Uq&s>-r#$A-_fVRtGCAl@(=)k zz{NM9^S<8_q*mB|o&|!1+=|D`pE^LZVl{$ND;H$2C=p zJU;w@g>2!r<-t}&RWBiZ?#bF48xt+-CQ!M&xU;dpy%uXAUrXQnCO>HNmi^wA&3AG> zS-0_!b4K(iRc>l(!H_?vC6BjluR6E+qtiOyP-EVFa^Z_JVT)4sC)rw9^pPWxVAz;< zmd}A{Ye;x~kg005Y;&Gqq{1<%L`2Q=k-jk^n>FYQwv6}+__dJ(%0r~-|&}o>x{J% zl&AKdr{?ZD93n!xx@sjQ;tOI{yjQ;D_VnFJlek1qF9(^-FE%E+yKw(4Sy`_{i+k+G z`th|E(rGiitr@_yd40}Ie|6FIYQ3uH>Rsos@Nsr*Kvr&Hb3(+=O1`w{&8UbV36Dcr z^jT434|{!#vo#BlrK`WMty-Zn09eXmKifFd=GLBN5mD>5pDk-N3^EV^0DRs}2=f$i zITQ=GsGAIYk+9c=4G*v7KO8kHTq>%0Fv$7*Y?cD7yvjn)@)ccH?J7 zM*Ys4Z|p)261{AsQs0F!QQLRz27o0A@lvVpz;D68zcOeWRJzV+-1=0}!sFX8ZTQx> zQPpT16Kh+v-G*nN{xep`?VR;{?~ja4+L^v}$JT^UVUMnCTc7E%@3_|%mp#RU4(xV4 z?g$?bO=13>o(J0*0sWD`Zl?U+p|_y|$zH-08a-8fbO#(Nl6!;5b*7c=TAWnhVEnsq_GCPp+T& z;fY~z)6#3yTHY`(i4_96q4;u<(f|OUtNF2@?18eWjn=n3EwgIz^%0xzsjv2 zJu!$6jWy*DHF^vT>!EHEYq~=Z09Je(RD18f?p0O-|9|oHaQF0Zf1!G9Z-;;}!*;Ac zePm@+sY1tbnGm;n?g$nJhpEdxsQc@##dEZ5flJ_9($|<;=&}fSfNxjMm|2n6c5O{a z>Ly7BhO%-o76DjlYT!+b)bH_RW!#u(gx8!>L{{)Bni4%61B^by!~ z9o+4LmeS~yWc!>$2iG6pq;5kTv2(!uH6J=z5B>eB6|G-nCq``1f~9l7%=Jq`gkY#G zKa-O4V_gS}qHNrP7cB{-Fjxf5diVSEPb0py7`<@onn}d#np(l3D?@cY?U;Y*%GjX5 z=W}Cu)}qbY_^d?P05x5@^2?Y?p9&*em^-b*qS6S!heBh_1fMJq31WSQMJu? zPo^i|t!tqHQT9HQ6Bkbu^a>V)CZ>k=QMe#(k?@}zgf540G5^Zgpa8Ni1k-j1h2FzG z9336Wsc?e%Wm|H-mSBF6XBh})t6Gw031;9A@bfhUE|;oTDC}%)$kt~ zp4AYZHZ)ZHT&X4hPDe0REV*147bgyfBNPgasx=r4YPGtpt&Qx-2&M@_h@vPypU+@0 Z{so4M&J|^JrRD$t002ovPDHLkV1lN-5lH|5 diff --git a/docs/img/functions/bdAstar.png b/docs/img/functions/bdAstar.png deleted file mode 100755 index 8e024136d827b9f155cc77090536f4a523730ec3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2018 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 IM6N<$g2omF)&Kwi diff --git a/docs/img/functions/bdDijkstra.png b/docs/img/functions/bdDijkstra.png deleted file mode 100755 index 759e2be7431b32aea0e869dc8d089f284d99d8d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2244 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 d^YbGJ;xBj&P}C zfFdp;ib{fMKtk%gKN19upd39byfdGFa?YI0+&go>_jkX)-<-!gb;<($-upYV`1TrD2_! zz4A$6{@xQs#Z@8&B(eFsAhN&c?1k3X>b(ZQ9m$MIt$W3&An*jU5!ib@5a(J9r}Up=&= za^eW2+E3g-Vj`plS0X$2pJz&rqi6qUQs3*JZx$>IH!HNz2u5E|ZuK=sqp>y{T-&R-khT6a1<^TeGO z3O%02A22CyPS4A$HlL}L5@Ti_F>?$~jvsb!O+@MN*j`2H`F9(Ktk^%BQLy!wQ>8B? z3Js~3Ur0>U7#kw2KcAcbddSkWa34c_X4$z9G)!MBx}BG?`)sMO8ON~moiICmoHGpr z+PW({x9u!^EYV;jj>FifrDI;_B<#9Zuc?}TheR71y)E3GfYkR1;WI1ems#Oqo^1qL zTwG#kY%kX$bmVJwf1N4xUAJ+E3$^k7-qkCT@@zB0`b*BHq}=GSaBJdVp1P`F-SU%4 zcYnjz^{>ulo(hawv*Rb8nHk>nVP3gEIqT7YWji)_FccMs5))qOM}BBZ+Lsr%B%Gj! zCq?+ML`ReM%SNRh_@)OzC9Zl2t;pOd3DYX3p7GeU{(CD70N4P4{Lh_v{-G;#7xyF+ z2}HR|K*-=|XA6S(@}`)y19yhU`svDw%V|D|UM7}8S93Ti<%VnQ&&xbH+S&_gKPIHo zGnNfwl;o%1lCO>v5IV(| zPa~7eOdp-Pnp@X|{U`q5&c*{g-Ff1-UepgIin3c-EA#Y|f1Eem5(h9EpHHd2^4pb4 zsgA^P?9F|@Vko{-!-v{4$Rsm7z}U{-E*2yV;JM!34jQqz5yB=}gPzG@o1CBi*`I~a z`hOoR;1U2v=8v2bXnFhh>r#lb>}B0>@9c&D)++Gyo(}v@8E8ajgj-x((t%{(?`z+U z#t;BNX3&Yob~84Y+9;Q6B@#Kt;j)ci$Cw-zCWFwhs{wDtx5Bj-)%9{|gE@~!Hufa2 zIdn|lx@V_l4C4+72rzBQo-Clj`OqnbF{wUtH^lvV_|W<}nH0fkaO&D$QXLMbZ>ZH;c`0M6%zZ1r-NZFjeb>rH9 zIU8}an#1(kN$1RDETjDA3_{4gxrljCxxm*WyvXcB0#T=hO_5`lCU*GC;|G6vC0-$cqCQ;UvK{ElyLaqJxl9lAO;x8)-){Oqk%7tO@&-pnkEq+V{z$bNHa)AT7ONq^ zs8)_PY)qrp13+XjNy4h?#`kQa&?}@3(9+R~O9W8)?BW%p+OQs@ru~z6E+u*Q)hbbw zTBVS^s;a1wL!8Z5qa7=b9W1Wb0@z%8Y2R6)_XuAm2J5TJUpDCgAh2v4tSDNo1^^tL zNmD+1@=}9d&3sP!I63xla_m&S*3=Z! zi@uFrv1ylce7~af%*)S}cr%iDFQ2ek0UQ8<+k{}}4L{Ec+U^vblrS2$83$)Oc3NQR z&e(_oI+x+=RR|%37*!CqCedC$F%gRB7pA%Qgeb=YJe76uShQhzv?Dr6wMFtZP$Y zbD5eLIfRb2U$%poUh=X|ZQh%TO81D4X|30qIt1|EL|NZhempg?ysk+HFp{O)=;*m4 zSSFoW{?RG^?~`VGq7|N5Ge5Ts*aSomvqWwY(QynlI)qDwMSi{m(YheIwnMn(;_PH? zZH;z?Bf4L-Mf+NZtU60y%{>pFWo0%{3y-%L!ednE^J8Cuj`k_+k zlah+6DqH5w_YVwo_yuP;b2jIdAu?dW;zb4L*Zu`eCg#g8FP4=xFJ2tDWJw4?pkI0> zj4@^df(6Ufrviq-3uC@7Ep5s=HHXXPu*=Ef<>#uwV2~G=YPH&49n9l$-Q8WqVlhDw z&t>*|c3(+JDLa%poh2%Z-wIcYic6iHrS`UVy*gN_R94qs?}v~?B6;>x*Xxbz*5&l? zZ##Ol>yw`iV_-cni(dg(wHl3`jqL-$+SaZ=bGf#$Sq%UV)|SHpT}1+J*8#S+wiT6C zdcFR+Og$~F;?}J@%l;IK5CVXTisrU9y`P`0g#~r}x=N|kcz8%865h{eD;o_gUS#y_ zT@_90P5aLsI$7@HCY>{3(3}Z_eB7mnvdTAodtTA3?xsl3C(3v4y29b0$Ve{$NKdbp zh3?+4;R27x0e~Y%s=`O^kB`q~7nsG%rmI~YU{PgbcHzyKsbT3km0P|$-_WEc2;^iZ z8WH3=ZS26LBLzeKod0l#xn035zMe(n1iz%9%J9of0374yDS_g$VuK2TzqDTPHXgU%T3(uXqWo^w{ zzFf93sorEqass^ij)=t%7V{HKVIF~*p3j2jSU8Xgs(5Bq?9>0SZvsktJ4|BM|eCy zREELZw_p1Bqil`F2mr~+rECvH!~4EA!SkoGlgvim9qR-)l2^neRx$_?9Ilnr zJ8bg2g_FF6hz;7`cD`y3)Fze2$zGgxx~!>9$LG-&e4dB1B(GeNU#@VKiWj{eAh6)J zX*$v`R6E;CnpBz|BOGI#kx>Hx0|wY$EQl_@8tda@4FDG|)B(Vfw~iMTDP=OJva-cj zD`F)Q9>(D9Epc_T>gX{2_~SJIu(7fD{`;A=*Wcc}d2IKS&z$L3Bwr*F(f0Nh^5RAH z^=bfEx-_Kgu&U}-0O-?4^upeEtSL+Scx%~^_x?7mAGi63P5=0TjQnW-p_D_rK3h3` zxVP=yb)jU-4joH7elT%EbibNipCnw=u_61Cq2N+s!KK2Vvz^n01vu+s&F~PfwTY*= zG|l5ud_KMYyUQep<7_Jk>+eW$2n#+B09`DrkDD<#EAQ&mQGVUcV^vjab#*I3ux|Zm zvnl0rNdS;ag+)b*%*<;D!DpX^n{BH3xoAX$2LR;fH?*|qI2>Zn-pRhcHl0?sD@c;C zvEk?E)!(^eh=}mGdbO##x>X>c#*KIHI_&i68vrnLXrCv_SB+&~FG;{rA-B>p|Mr7d$hw2e*R;)?hYsyHT1-uh|7xBO z*D3rRP_Uz!sEE z7{~1Y}D9Rfa0 z5+sL1QWS?vQ`25?5%S2>#mdrKcW9cTDAJNoYYj#YNnnh-o8XM}8gl{Z6IAM~nkN{FNa7JXXD*t?qu_ga(iOZ{R z46&mC2|Qk%G2EszrN$=fF$?C%oGp1=`XQZM%#GBoiG^)CgAsMoj^jD^(|^o!sZM%7 zX6}m3$pyEK_x5yL*g9kKlu5JV{+`+zwsQ4cZ?-+_C8z7dhzbw%1NZl^E2&ZXy4jZ0 zHWLUD1R_b|no`ryW-M=L=a3{x5CnnxNhM`9%HQ?tp~*?DHk>Mvji~%7S zHOeJ%*CYUlit^gD>B99|)yE&7@%Oj4mhft?slvluxm-?N-5t4H*{QLQKwF#s@}))( z53!SzP+&;|0QxEFp|P=j!{<375xst0c<;>!?k2T7k&wE(otD^GsN33%EiG-x+D3AB zII^-9Bh@|2N;*0_5)Xa$gE7WP7`AlFY|XYmZ~r{aeeLUg?k<49ZS=hNM$b`IWbKRp zlLu0!5(M)1 ze@vfaUS7SyU@}Xw*)2CTs5`5~adDX{m45f0Nv>|<|HnPlG`DCm2oV6*H7VOI`-(`B zl@PbKv|_MF0Dv{^nl3kiK#wu0NbKxnW#<^Ty!=mVKYjE!CzJafR|^#9tUu`IzW;nTpcU{@RX6h$8&3pMw7u{G#X8aVA?f0 zy`iI{!#IABo5^VEV=uV-H06G_W@KJ77j=X}dg3In2QD^a`awsjrI)9qzFwW2T&mL< zQ>OUz zT2y=9+);Qmtz_`5-wD)($^X4%9r}BBj*T$PdvC^pf?Yg0{@6td!F3t)!F-!@$uunh|~{rkNI#Y!#Db!hDSv-~(19A8@z*SP7+w`XW5v1{nq zKsQp;S+~WHdJXp84vaAX>{(q*;{9l`7SJuLSUTWJriqr!)5R*d~_ni;EZj ze{V$AsncPy(EAIvTlQh`RKe*gE9Ormfo6{J zDJs9dZbzCxWF_G90ikw{ruDWW*i#%i)Xjp=>msVX`_V@Tk>ulbZ@_?_v(^)tHEnH% z6)T?IpRM%p^%zCDTx;*^BB4QhGdm@#+4l{P2OrSjmXll7d{=4ea;JUgu8AGSwjHr} zVy<=xN`$P$;$bqeEXbfY7>peq48{aOaJd6%nkGpSo>TWM!{AMu^IYAmVq=4z1}D3F zVCd0=GU}4lEo({|+f9JD_5;Sf`}Qbtw}Zvu?`{n5$yTs2$Kr{&%H#2r%G-8!_cb9< zG)2+WBa}vQ`!=7)N9Y-8#oj$da=G%z;TaYJ`dJ7l$0ue-VhpBV@cFK;eYsrjGni;WLBocPxyi{>28TL5Gq=lv#S6z(iCFC8D_%F62LW{eo`*?pzpQe$T3Y^l`psa}W;2o^6oR|$f6F8`VISk%|6FI=b# z8`5X~n*r=b>{%4jsID->ufEx3vx^qNu$pDo?Z( zv=vbq1VJE7GJ6>lrbNg@a`yWpmWP5?Y8|lW`zybbz4qQYXMI`UT6^zrX)wQ&D0f4QA**Je^k$}^;ft8h2MP-#v zr+Y3_KYO;Kq2cbj{|ZJ30YF7XyGo@SKHQ4WXWzM_R4CMLZW4)v`}l-qyn(?Bj)6t2 zysc};(Tp>f%e`Eri)M^kG-H&PtMp7-`Ho|m^7gKNaq0Oudi=pc77Im0cmP03N_9wZ z{MM~ExLg(hoI6()Hu328?b*x&X7Cb5*S=D)sIn!!pnmzB(3GsoFOO$7w{;N&vbPpZ z2ymYJ#>j+od1HMYM!MVf8a@}u<=vT?4FQ2tsno2ZqJ8O-b5g0{sKKo;DRo8Tm3bI@O`w%vp1OTg8Siz zA%_na>9mHo7mo1rv(3n;Pd-~Ak#J|ua*vHI=aN}WsxE4wx93l(hK;UKP(*W z?P4tya2pkOkE9kCRLVCUO#h#l$p@0MSIry!uuhL2k$v+`o=`{~JtCuN+}f&1xlqmH zvDU5&mdm>%BNB^>6np`j&ts)rsBUTLMhL~k1OhCR5zJ**t#yE7NDV_cqgM4FF&;(1WWrJty=uTsyG)*blM> zm60QH@SMDK{fZC?!t$ISo7^V*St7B>h657bLSiVJ72J1 zc#&+SNJQD#@MXm-o0_@+VD;*tzRjwtI|0DaQ8Wae09}7-%g!9zcXu8;mHh4Q&8y!W z<6@2gjCDU8Jb9~?W?b|oM_ztGUVg!2UT5_o0#3VGGd{>;Q`{8}MR7T79*^2`{1(Y# zIamooN7%7h1fRzRKsU>p*32KBmUDZ~q~ZNlWK~sXb#*5~uzAa5lRD*aNC1#Zg+)d3 zix+DVg3mt>GwD^+dTDsL8vx|yHg|MrSuEnv;Wxd#EqgU>UyvkWY01mYX}Wt?A0F;@ z`*vG(b*DhUo-)<7Z?mgc{|x|R$2vYy?rJF8w<;D#1~r^bmB}?6r!nuYiJ9TX1u)99 z4sVaWRH`B^JSMyoDBo8RcI;2Dk&UN6+^Aac9y+u4d@+0G_TBG!kq?fb$co>2EVEj1 zSBu3XX2tw*k)OG-wWXEgy(rM0M*>(l`2+)ip(gon8_!gnp#cMSR~?@ z_U=|xw3n2$Aq2DDbkE3WplQtGvq$>c06=lEqNqrY5KIks1Avs2YK$Qu(9XowN8sYc z8jRtMDXw{WEf|BJpAAL*KQq+b`sA|}1cBaOIO0ijS7X)pX{>j?h&z2U_Rs$R-uw3> zGCkmylx^FxZK8H2o;>vRa=Y|XS-qP}=;qWt$!PATxKm#(^dS3phs2JfX8(R$!nenc zZknJv75{xb4J?oGV+Gd_e4TWwMf1}nNS9e3zyF%pe#WMQaS2=IyORSM0s!M6v zg*lrNQLV=C^;fw^kH{7*NHQ9+xj82!#2x@rQ>pZVN}78q#v#JMZwKVz1+kN{FNa(+ahGB>lv(2;w+#A(_)W31VL1a8yj zkGJeiud&hM^{7Q54rW{qHQ*8%+i~P5Cm{e>l}2m+BLQL9il zs|@AM-7JzM34$QdFsY=hM)B&f0k%MOb?GxQ>H#1m#6B`25o16ICQWjRJ2(pfA|pL^ z?6`5KPPt*jHD6yF3kkQbRv8xN%;B&a8}G_wirz^32&h!LTlp<+Zen|Tp}>p+0Mj-J z6Ixojw|Z<=hYenp;C=y@D-yErU8f|L{4SNs(9xkn7M7BG&5^l<7%4F}9S|Vx z9PEgPE(qc7${$Yr>yoTVg9xNmDCn^?#ux)KA3iN=!?fSE%2M|2{OqHSOlkB915MLDj(mb3vdWD#jZNM)Wwh(}=_N~M`t(1;l78imMq>~N*e6cTNxxE8Royvq zq|L;MPNwBhv6!2ky(Blc(cGNF-#esA#-w?^m?Ny zAe&@!b8}a3-FVHKi%O*~{?IIE7xAxg8`bR{8Vo`NfVFLkZnIZJq{v)|J3Bft*dPGF z>TY$Pn?Rt47jkGL5F9K8fY49}dwa9``nwoogiu^uVOD1SC!dU+J=<&0q4gmY zD>#3)Wc1sw3c3nT{BOQR@PD|nEQO(-hf`1Hjf)PF7@ISbuQk)2k2QorrBs_adO8RY z7~2cdb6aUY0MOLlEYw&JbF`K44074IE432$g%SivXfEiit?Dp(S`s}28Zvn4@Cc&z z6T=t-KzQh|J*V^LP4%~t2$HW?X|(!nN#$%7i7{rAC~};;RKiP4y|psZf52p~s7P*a zZ}!$(9s^WujI>T?Jb$iIqcMm?RB(vH@+jZ%X#>yilTXr*B*^YdA}Qi#UX(z<&dzEC zfN|rU06-|DO3R{q_3*M~zRQ;R{=y@#{kQmIj0vmIK;ysu7*(v$aGl4-eDwBk76!ZN z>({jG*!97DHCyZ){D!{^sfM4_Fn+|bS?;L0OEPwCUA@*!z_IiTpA?Ya4wyD}7AEaW zsc7!dV2;GmXZ-Tde)lRHV;DAd(U`4qtKW^coAK$U0Stc{2Q%k%e>*^?w@F-1yBZpD zZ`*^xU_6kNBek=6bK;1)W>uR?iwI;b;yKw0lhaEptEv}I_p`FPC)TpEbG*IWrBdnR z=Z7?n2?C)?a)8SvgMy@5tznqkH)08|xOl~{dn3}WTn!BgzCRk4$FBNZ z{eJA)fJc;ZjFpGi{iS`$(RD#gt%t$W2CHvyF?}KlwBU8GqVhYN_nsAq%mq9iAk?i^ zcecs{-Ng}OUHCk1pU^tEe|CfrN&bBF^YIxtgS~XIMy1lPU;pgh(lWr$qvho?jg7aH zgaS={dSY6;_d9O=R#-bOf4T8^rLoVQ_FlX(W}J{oH5vR0bnWAp2$_q;<3hwC0eYQY zZ|LcvF(wFt!x>3Y6iJfsoOamKG~Tf@$Jxa^CMMu%(6YZ69$0MBT_s6hZY*i(HUi?< z_)J;*!6b1%V{zEpZD9k63&!UdJSkndT&_aVYHfYr{scC~W>f4(#2a~QE04=V&#E|i z_)w8drZ|^8pD&=EMHppyE#DhAKugj!^5dP6jPEdbUUc>Jbg#HwSyf#}9~P)!D2L;wr;&zTH3r|f#0G< zfjEx+*_IGOh#D3Ylw2PaCKH+$^J7U#Q|g5%27^YuREmFuT=jZ=VNr=jqv=-@Oa{Zn z#YrF#;5hzBo?(A{eqv(j@e?yBty27h)(`^93{yNAa@DBSRwD5o<5kt6`}JB)LvuR-*jRE$`8io|7(EM!#p3dc zN}W#kNFLzi$@1FTwq^eg#xM*3%FCNoD&3$#Vm6z+aYLz4s9jx!LLu}11xt+yipQ3F z*;jc}`=&$b$Iq8}I!mG^4U3vI%+p13Jhg1o;mh*o_Fi%6(G2wXefcyR77^hA07*$Q zX>k1d^;eio8UUO=T^Tm|(8i6K)N7{rKa8$Dtzbb#Lt5U=m}wzN85LW;yIkMYj^mh} zmBmy3PSc+mns7R2q>uejcbo2tj|92A8!e_w2qVt7;tFGC5oh%m$nUklu@7|r)+M?MTH<=*rGy+Pc?!<}fot>t@ z0Gra%rq~5PwYTf{?wuqMbXi}s2d=4B_Cu@Gh@g0KRNW(3`>=|cw#w{6Se@#u#R7Me_`u~C!s zvy8=}EnOBYmv=-)Bo-7X*c_70q9y$-YiQ`eFf2AU004IHx|Wz&YGcD*zdlo|HH;5; zy+f-e6WXyO_v2M*YPA6Xjvg&3EL2>*S|1uZVB#eA?qWKv0RRjJQ~&0g9ub|jzwX_B z_*`MF%E%Df4;=gI@_AArhU8hl+;Sc3E9%!mGSXC~9!>b+Vy;Y~Mhv07=eU?R=M3ZD ze;b_czcVF9-GEylOu-jFDq-la-|Lc7A^d_pg@uxGJKSt|fII9NOZ@4W%a%9@V>7;Db$ zJEmV6<|`uZzb*asBOk0hK}?KYxhup~h_&4;D_7fF^hfU-w}YgL=Ej%F0%mtQEsx-4|oc?v%kG06-$)6%@!*QmQcwKL0$->{rd}rQzYO0Fa$s z-_oL`(eV8Tp7rt)b$i;L5Ckp~v9hynwYBNP!(FdmZ<5JcIUI7_c$c2VE?)c%07i~< z_)EE~p>)@x-6%4!_GEIQT*Gi2{?d}zNv=!)qdeol#@%O2RD`9+Q?mo)yUN23zcYfU z`~HnJs#&jK$9JA7A}4R${)*?FN<)f__|1ne%M@)|Bp5s;c4d?=-`LpD$nc5^uwxMb zmX6-R0AQ#(wR+9*@&8lD+d)M;<1f|?Sr)&_CvET1 zrcrNyH7}Tp0RRY`e1go+Wl&@v+`d1lP_D%-oTQNp=S}kDVyGqe;Me{};p}~M|M?r=9L1sJ^uR%A=k7fV=EeB;P;72)p83P>F-hy4xiu@b zc2*WmN-dpEqti(ygCyyst%&>5Gag2x@qFGb7Lzm@O|2bziI~@{)byG1B`3>FCdB76 z%zJms%bSafn=lNfJnNpGUTZQTHisPQV+{aBMT&v~IflXba903GN|GT2{sFdTt=@x_ zlq!VanQ<;TISmMbudg+o{y$}?JM^bcmg6|~{0oEsYVK;R{3%uX`Im8C?Dm3$kKg~~ zpyT$KAuUN8He}lTd-IwRV!iCl=kJ}=_=I&u%KGFTrzR{~8@F2A^NzZ~1P;TdzB$9s zk*lvb^45y@pGI$Zet<{lNY3iL-?)=e;l4I33;=*|p7O!M%GtXFYq!5LkN^Pa?4u$8 zbmk}QX1)B{uGa=|NT%jeZZS7_O#t`KaB94f_{oOM!7IOc*Wc1md+w`MA8z4oe|Kc# z4|{%OJiqmDs3oRpsA^CTJ2@;mffFKAh-x*4Z@$hxbg*#NtP@5f;`13&sT}|$C&>UH{PsB6 zCuh%9<2V);=GfGz1^|0|Ue9m$?9EpybrUAK1q9gs<=mC-H))C&4+p|x=*)-!W%lJN zLreChV#f)yhg*?=aa9^EB{Et*JvT~f&t)>`eJ+%d4nv1I@@RmuT>^Z>N=1ta zfbG9v-6s(iIXjm}&3*r?(Y560N&FUPw=p0F&Q+}p=>kpErq=4l%OZnPnmjoSbLMrr2}D>gSbuTQN)pL>P}yIK`j zDZHG;#Wl@1hT%9y5O}phU9U2f)pyVcg1~Vc$J`{s(kjIew?4K&wYTfj({BQRRB9I) zk%$mr7>pU?7`JZ<07OQ5Y}$0?Mve00kAL;?v9=U4YpRuDVNMJNt*)-Euu#z*Y43qb zrMs5f;OZ){v*U5NbO11KlQ7fJ(6Ro@3=0eT7wf|M?@CawfXlStkzJqDg(7ylN@Zwi zQDK%MVOMdCZz;f(2$>HE5VrQV_+1x-P)EhNqespb-qK(=rd23RBTWb)1Q>tNgt;G2 zc)77KY1igeZ?~-d`bBqhxbJHAE)@~rB70lb?>Eloaxi5}s}T*jU3kXUW+mHF#Q6P= zMPd;sn_H3P)5|wo4A|W>1BwS5WBq*Jd20m#c(}Xu{ub|T1qlLovf%=t zsiVCNMw7u{)awlfgR#?K=um65I(=uSVf-*>qrvE4&FNZVxm~cyDb?mV9v+WAd5Xu9 zB|&4xICURtn>pkA6)Vo=T&+KRs3?5=w_2@X$&z7DKkWtB}$;Wb93;??N%cp*=zt8m|gG#C9It;YuU|?*{OUrIF0RU*KuV$9qXl&CN z4IQ`gPG6`Ny1NK5z<7L4YjtId5fJL^vtsYe*yfp+!pYA z14fQ>D?5H9x6uGdTYLUcl00yXln<@dWxuHm2ymXAt3A)yX#fBY-vXwKWic9)TK&|R=?py8A&4$LL`Ajj&hd>S&7Nl=12PV z`92E@z6PFH9&1`7*%u+%80FOs6DP7R*hv&@knKQ@dPab*gy~Q6Pgo{H0j7L_^EmCNhP9tOA zetr-Qf$hZQOByz9eQl_^9FQ;}*XZZ#(IuwS83l{W_?}1=)TvYu8vO z9Nhm=;%7=7#uPaQz5LD_19*1Ny|qHSBYtVrmug@;21R`IdZ-XgwPmN)CR}akq%jy4 zuA>&c9?U>MmrkGd%a%{0Qs{y6*S|BC%4Z)Ju%18uaz6E9h_q|lgTY|jdm>9>YyIr# z!8P@&CY2V$F)Is}qYdv=T1iEv?8S+`VsV#Q%gD^~@^qI-B=?^mnoJ1CF$}xcNGL2+ zD3!OJ9AGkuz(9#sYjAVjCJ?fUist>j-I03XVu&>O_GnnPd(r3Wg}ayf-{W+ivEsn8 z_nM;*EeoWM@KHQCXuX4r`7Z*;W=x|OiN5{_L}Y5 zYlXGt{FXJ}RTz8px7UknVn^|)a7FPq$hF6~#4x@pJ-Zrh(g(n*p|-Xq?~8yi_n*1c`*-^hXe1%-u*)2C*# zIrN7SMrocgJLCE&Nw`FQusM<%K@^Wlt^)_UmtU`_l*#(l1e?WjavH#3Fdo9~=H%3` z-;jCq=+vNKyN70bDJULCxe5gWPfrh>PS-EDhG7_k!Qk`x4>o&5Xn%ZuPHsa=$_o++ z_kmuB8Wt2!fLw7LeDiti)ofD<~dA{tGvbYYB;Y*FpdQ002ovPDHLkV1m~NJcR%N diff --git a/docs/img/functions/f_pgr_bdAstar.png b/docs/img/functions/f_pgr_bdAstar.png deleted file mode 100755 index 1d4dc0b2de346f94018b769c525cbe5b54e12950..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4104 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 Ef;iD8GXMYp diff --git a/docs/img/functions/f_pgr_bdDijkstra.png b/docs/img/functions/f_pgr_bdDijkstra.png deleted file mode 100755 index e5a2d1d0ac765d7a1c5cc40ecdb5aa077d152656..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4313 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 Hu0mjf2G(s2 diff --git a/docs/img/functions/f_pgr_bdDijkstraCost.png b/docs/img/functions/f_pgr_bdDijkstraCost.png deleted file mode 100755 index 846c0a7ebe599add303309ccab8027931b25d7ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4820 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 diff --git a/docs/img/functions/helpButton.png b/docs/img/functions/helpButton.png deleted file mode 100755 index 497d2df1f03efc60f05784e2a731f36129519bc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1063 zcmV+?1laqDP)kd%00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-;n4-pLtahRlj000BVNkl7%Q6rP#gnccM= z|0Mp2<4`+IS|T7#jEEAoRx3dWaA^arR3Sh@1yzU>65`k!LIMe--r!Ji01gqTL@h{d z6qP8YzmU{v>L#Xc{(v;`#%}D`YkR%Bk3-tTvE7zP^uRmK&YSn?`)1y^53go2=)Vqv z9z#49P`>m-Rn;4j$y_eCB?wUvnwtD}yPXhH1#}`Z>GOHrPS=(|Wm%q{n{US0;c!#| z%_)kj&Itgeo9S%f*YMm@GJ_EE)LKFveydq1J>YaYZ^dpG3We(O%Oal0e0S!0t<4e& zHuZGd5JG=0rG6ZaCR5orUT$;OT1pR>QsFlzHgXfOrIGQ!-hHk6?B&?;{!5FA3?aC| zW!)R}AM9!S=BKeeyL@dep7p{9J`_Utl8cGVr5g)}dv|?!{7n3=!YI#EN(hdx>yc01d;Y}0mG=*IKB7<8R3uVLgWG=U{8S>Hmqccg#O*%EZ_)Vg(YW7hKf1r& zY!cE+@$A)UpWBg0DV6d`1yL9toe2d47q8C?jEMr3B=%W;8(h{zD$f|t7!?Id8Lh9gyw$Tq*Y#h!~dYv`N zRIdC+%kLBb0C*1P@bjw61L1tEBKU#q4Y znx?C&rfGUn)3QoFUr>uht@pWruIY_#Gslt2?ys;Z07B@c?&dE~jveala68PWFWk=M z)z1f_l;;3|a=0(l;&n(r42F;Pb(D8gb(`K_zq7yn#K2W=z5CePyXO|uiF6(l?6OMR zJT<3BCI`<=zxhf#Y;N!e+w^{(Blz$OPfkSVKmF>I*=jRO62dsEC@ahHXItzC_5@6l zSOWHNo35`gw%P5WE_+u{EvTwiEE)iW5J6~TjBy-S*`C!wMNyRHWtXe2bdxel8LcSX z0E{m$OQM7^-r!R@O%uuFtv_PQ7RQN6lKlQBL{VJ-^KSw*3?r3F6$%9a`1ha~V?hvX hHrx7)!vCAO{|`a}wG_zMR)zoo002ovPDHLkV1m@+^`Za( diff --git a/docs/img/tabs/arguments/arguments_KSP.png b/docs/img/tabs/arguments/arguments_KSP.png deleted file mode 100755 index f68606738d2f3037759aca28025d6e8ebdeea660..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11574 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�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 O0%Rl<#cM==1pj~6;8EKE diff --git a/docs/img/tabs/arguments/arguments_dijkstra.png b/docs/img/tabs/arguments/arguments_dijkstra.png deleted file mode 100755 index 1d9c9318d3dee2f56f77efb4c470d5db44e04f1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10669 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 JM(9Vt{{o-$^LqdQ diff --git a/docs/img/tabs/arguments/plus_button.png b/docs/img/tabs/arguments/plus_button.png deleted file mode 100755 index f2a9289b1bc41cd92d1db4a76bcf75e14e073a9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 900 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 z 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 diff --git a/docs/img/tabs/edges_SQL/dijkstra-KSP_edgesSQL.png b/docs/img/tabs/edges_SQL/dijkstra-KSP_edgesSQL.png deleted file mode 100755 index 7a5e85508ccd6f99a150af7d0e7b98f852dcbdd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20214 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 b?;RGe9$W%;;iPr%NdgpPRHUmUjRXG|y1=D5 diff --git a/docs/img/tabs/execute/execute.png b/docs/img/tabs/execute/execute.png deleted file mode 100755 index 8406c4be1bdeb794a131335b176fc00c4673ad84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9601 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 U|D >) < function >: < parameter > BBOX(< bbox >) -``` - -Where: - -- M = when Export Merged button is used -- < U|D >: - - U = Undirected - - D = Directed -- < bbox > = xMin yMin, xMax yMax From d13899dc2a38ca73c7fad7940ebd638237419a1b Mon Sep 17 00:00:00 2001 From: AasheeshT Date: Mon, 8 Apr 2019 00:28:14 +0530 Subject: [PATCH 4/6] deleted about.png --- icons/about.png | Bin 2262 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 icons/about.png diff --git a/icons/about.png b/icons/about.png deleted file mode 100755 index 22d2c170f6b903cff322c9fa7ffad7f4186e1b7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2262 zcmV;{2r2i8P)@EAl&A3gC443JU_?l4G30h$j&|2iBfPJB@QfO&!TiVPWN+z;2RsWUq>tyKcCRUlSr2m-n8@+AQS0)5a%?=Be| zKiJqU`So`^&pU4Ai?&ZgJoiQuO{aR0hQyE(Ap}wi1R||PYmL^LrIkf&yXi{GW)%=iBzfZ5w-c}I zKXKack6qKUyDl-=o-x(D7Fi{SU)^$j_44fxZ17s9!Rw8uc?XR>NZ ziFvZ4Z+19mPhzNb-+P~NLD6m716kT?ee=n07tEQS$4d>zc#E=F% z_I!i}?%Z^hVVcGr3)j?T0hj<0zi-p(D@$ZSP6o%@dujb7gvVn}3Od&fra{tH968g^ zdo8{64n;78VBONW+*(_f23IvVfX6aPN*fm|ojt>x?i!$~ILPX&OXa>pZJU6Xr4##l z+YQ&u^CRHkN8L^^8IIo#*Y_zfzj)~=ul?gJ10!*~9t+E3ajJU|t#vw>r6kSRWES6V z=>cH<@(RC@Vq2O4G)t<>rvuRTNoYzmo5qAIEYl<$x3MhK1t*bGuxe3Jx&~;iIoCgi zWf`t&jn<%)=In(b0IEt0(ONH=03Zky7G$OCx^#_C76*u&r~$6jF1&&jRnybPZKZhk zL?4!EfOd+LQX0dMTnfiQ2&Uy_qS1lL43O_OmeEMU4Jt7KL^>`p+`^Me&DD!%uxjBX zC!(bzQVN92 zN=o6i^8;z)N+}Mv4$<8ob(wMirOl&yBA z0r(@a`h(49)$nMHs?tK{%?Z%mdx=zlrgn->rIlve>RIWQ4Dj;dew0!UBdLGTXje(` zj9li;DqtiW=biW4ls^)yPrIO{u`ZlUs$GAsZ?*++_svTXLb%GDJWf3;rBSxRGQcvx zl#V3ElZ+>AlD0zG%K1)dv~qyov9=Nf{Ppk0Y};15S{m!Z6IlQxlGYicele$4nU<8iScp9$8C~Ho1|@H+je?wb8R_gMS1jv!u)af;o(@q zdgL?nz(_|!G`D=6?mRzSyRo*yswxgL78|FdXUK_YA)Sm6jz_O5%fr^1r0szEpnaI6 ztsDR@6XQvn>lPKUd1V<%Tk(UZ8Y1o8{ZDl7eR%)pjAUAr-TbT9w{ED}@YCw;TWmU7*qA~dl5`NsH*_00|KZ$7*Qg#Mh7 z>@jB6T=(j+GXt9kE=7YY7SA!}%??mgUPx#pO5ae#f$aXC^7G{3BWc^rE6U?r>no`) z2@)T-`Q-}-5--*_pY(bo8~abKwZCvGp0(nk467jcQccCI^-nx-qrc3Za?f2H;dn9@QlQW(J+U(s^N+A3gQAXmiWicY6=Na8GowJp@EA z=Um_ia*9@e?|xrS@S)q+E%ANlYs<{JSL9vRQR>r+BRu~`Q}X4#AI77h?q_-q{b2_% z>dFwHz6gL9$Of`A3d?2&s)7b|hS2d>{}dlS-|HF<1B1ZW<(`ZrkO|}fnU>|x&Z$_x++R3vy_Jzu z14gbE((foyQM5gh7#lhn={xhzNc%g@$z&|-(j5kdT@cAHdpI=!3-Gz@_}nULxj+?Q k0|{4RK-_&!^8bAO3q6Oq>b67H1poj507*qoM6N<$f><3=cmMzZ From 7d4f15c61de45df7742e9e705670f608e8fa0c6c Mon Sep 17 00:00:00 2001 From: AasheeshT Date: Mon, 8 Apr 2019 00:29:34 +0530 Subject: [PATCH 5/6] readme deleted --- readme.md | 48 ------------------------------------------------ 1 file changed, 48 deletions(-) delete mode 100755 readme.md diff --git a/readme.md b/readme.md deleted file mode 100755 index 514e1aa..0000000 --- a/readme.md +++ /dev/null @@ -1,48 +0,0 @@ -# Welcome to pgRoutingLayer - -A plugin for QGIS created by by Anita Graser, Ko Nagase and Vicky Vergara. - -pgRoutingLayer is currently developed and maintained by pgRouting community. - -- Project home and bug tracker: [https://github.com/pgrouting/pgRoutingLayer](https://github.com/pgrouting/pgRoutingLayer) -- Plugin repository: [https://plugins.qgis.org/plugins/pgRoutingLayer/](https://plugins.qgis.org/plugins/pgRoutingLayer/) - -## What is the goal - -PgRouting Layer is a plugin for QGIS that serves as a GUI for pgRouting - a popular routing solution for PostGIS databases. - -## What this plugin currently does - -Please check plugin documentation for detailed descriptions: [http://qgis.pgrouting.org](http://qgis.pgrouting.org) - -pgRoutingLayer currently supports the following functions: - -- `pgr_aStar` -- `pgr_aStarCost` -- `pgr_bdAstar` -- `pgr_bdAstarCost` -- `pgr_bdDijkstra` -- `pgr_bdDijkstraCost` -- `pgr_dijkstra` -- `pgr_dijkstraCost` -- `pgr_KSP` - -Functions detailed descriptions: [http://docs.pgrouting.org](http://docs.pgrouting.org) - - -## License - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -## Installation - -This plugin can be installed using the QGIS Plugin Manager. - -### Dependencies - -pgRouting v2.x up and running to use this plugin. - -Additionally, QGIS needs python-psycopg2 installed to be able to connect to the database. From 9c42706551c8417fc97aa5c5a3d90dbdd066780b Mon Sep 17 00:00:00 2001 From: AasheeshT Date: Mon, 8 Apr 2019 00:40:33 +0530 Subject: [PATCH 6/6] Add Dropdown Menu for pgRoutingLayer Add dropdown menu for schema, edge table, geometry. --- pgRoutingLayer.py | 61 +++++++++++++++++++++++++++++++++++++++----- ui_pgRoutingLayer.ui | 52 +++++++++++-------------------------- 2 files changed, 70 insertions(+), 43 deletions(-) mode change 100644 => 100755 pgRoutingLayer.py mode change 100644 => 100755 ui_pgRoutingLayer.ui diff --git a/pgRoutingLayer.py b/pgRoutingLayer.py old mode 100644 new mode 100755 index 7877652..a9b1f50 --- a/pgRoutingLayer.py +++ b/pgRoutingLayer.py @@ -174,6 +174,7 @@ def initGui(self): self.action.triggered.connect(self.show) self.dock.buttonReloadConnections.clicked.connect(self.reloadConnections) self.dock.comboConnections.currentIndexChanged.connect(self.updateConnectionEnabled) + self.dock.SchemacomboBox.currentIndexChanged.connect(self.updateEdgeTable) self.dock.comboBoxFunction.currentIndexChanged.connect(self.updateFunctionEnabled) self.dock.buttonSelectIds.clicked.connect(self.selectIds) @@ -234,6 +235,7 @@ def initGui(self): self.dock.lineEditDistance.setValidator(QDoubleValidator()) self.dock.lineEditAlpha.setValidator(QDoubleValidator()) self.dock.lineEditPaths.setValidator(QIntValidator()) + # populate the combo with connections self.reloadMessage = False @@ -241,6 +243,10 @@ def initGui(self): self.loadSettings() Utils.logMessage("startup version " + str(self.version)) self.reloadMessage = True + #experiment + layers=QgsProject.instance().layerTreeRoot().children() + self.dock.EdgeTablecomboBox.clear() + self.dock.EdgeTablecomboBox.addItems([layer.name() for layer in layers]) def show(self): self.iface.addDockWidget(Qt.LeftDockWidgetArea, self.dock) @@ -291,6 +297,48 @@ def reloadConnections(self): self.reloadMessage = oldReloadMessage self.updateConnectionEnabled() + + def updateSchemaTable(self,con): + self.dock.SchemacomboBox.clear() + cursor=con.cursor() + cursor.execute("""select schema_name +from information_schema.schemata""") + for schema in cursor.fetchall(): + self.dock.SchemacomboBox.addItems(schema) + + + def updateEdgeTable(self): + + dbname = str(self.dock.comboConnections.currentText()) + if dbname == '': + return + + db = self.actionsDb[dbname].connect() + con = db.con + cursor = con.cursor() + curSchema =str(self.dock.SchemacomboBox.currentText()) + tab={} + tab['temp']= curSchema + + query=sql.SQL("""SELECT table_name FROM information_schema.tables +WHERE table_schema='public' """) + + cursor.execute(query.as_string(con)) + for table in cursor.fetchall(): + self.dock.EdgeTablecomboBox.addItems(table) + self.updateGeometryTable(con) + + def updateGeometryTable(self,con): + curTable =str(self.dock.EdgeTablecomboBox.currentText()) + self.dock.GeometrycomboBox.clear() + cursor=con.cursor() + cursor.execute("""SELECT geometry_columns.f_geometry_column FROM geometry_columns""") + for geom in cursor.fetchall(): + self.dock.GeometrycomboBox.addItems(geom) + + + + def updateConnectionEnabled(self): ''' Updates the database connection name and function ''' dbname = str(self.dock.comboConnections.currentText()) @@ -309,6 +357,7 @@ def updateConnectionEnabled(self): return self.loadFunctionsForVersion() + self.updateSchemaTable(con) self.updateFunctionEnabled(currentFunction) def loadFunctionsForVersion(self): @@ -941,9 +990,9 @@ def toggleSelectButton(self, button): def get_innerQueryArguments(self, controls): args = {} - args['edge_schema'] = sql.Identifier(str(self.dock.lineEditSchema.text())) - args['edge_table'] = sql.Identifier(str(self.dock.lineEditTable.text())) - args['geometry'] = sql.Identifier(str(self.dock.lineEditGeometry.text())) + args['edge_schema'] = sql.Identifier(str(self.dock.SchemacomboBox.currentText())) + args['edge_table'] = sql.Identifier(str(self.dock.EdgeTablecomboBox.currentText())) + args['geometry'] = sql.Identifier(str(self.dock.GeometrycomboBox.currentText())) args['id'] = sql.Identifier(str(self.dock.lineEditId.text())) args['source'] = sql.Identifier(str(self.dock.lineEditSource.text())) args['target'] = sql.Identifier(str(self.dock.lineEditTarget.text())) @@ -1161,9 +1210,9 @@ def loadSettings(self): if idx >= 0: self.dock.comboBoxFunction.setCurrentIndex(idx) - self.dock.lineEditSchema.setText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/edge_schema', 'public')) - self.dock.lineEditTable.setText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/edge_table', 'edge_table')) - self.dock.lineEditGeometry.setText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/geometry', 'the_geom')) + self.dock.SchemacomboBox.findText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/edge_schema', 'public')) + self.dock.EdgeTablecomboBox.findText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/edge_table', 'edge_table')) + self.dock.GeometrycomboBox.findText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/geometry', 'the_geom')) self.dock.lineEditId.setText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/id', 'id')) self.dock.lineEditSource.setText(Utils.getStringValue(settings, '/pgRoutingLayer/sql/source', 'source')) diff --git a/ui_pgRoutingLayer.ui b/ui_pgRoutingLayer.ui old mode 100644 new mode 100755 index 4f54394..1971275 --- a/ui_pgRoutingLayer.ui +++ b/ui_pgRoutingLayer.ui @@ -6,7 +6,7 @@ 0 0 - 333 + 339 640 @@ -258,7 +258,7 @@ 0 0 241 - 355 + 362 @@ -515,17 +515,7 @@ - Edge table - - - - - - - Name of the table containing the routable network - - - + Schema @@ -535,17 +525,7 @@ - Schema - - - - - - - Name of the table containing the routable network - - - + Edge Table @@ -559,13 +539,6 @@ - - - - Name of the geometry column in network table - - - @@ -573,6 +546,15 @@ + + + + + + + + + @@ -642,8 +624,8 @@ 0 0 - 235 - 599 + 213 + 450 @@ -1272,10 +1254,6 @@ _sql - - lineEditTable - lineEditGeometry -