Transforming single QgsGeometry object from one CRS to another using PyQGIS? Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern) Announcing the arrival of Valued Associate #679: Cesar Manara Unicorn Meta Zoo #1: Why another podcast?Convert from EPSG 3857 to EPSG 4326 QGIS2.18Specifying CRS for QgsCoordinateTransform?Splitting zAware polyline by points using ArcObjects with C#?How do I find the intersection of two polylines in PostGIS?Suitable projection for a map of JapanHelp, I have 10,000+ .shp files covering 3 UTM zones with unknown projectionsHow to Transform Many Projections Into One With SQL ServerChoosing UTM zone to use for large country?Changing projection on each page of data driven pagesHow can I find out what transformation geoserver is using?Looping Projection in ArcGIS ModelBuilder?
If my PI received research grants from a company to be able to pay my postdoc salary, did I have a potential conflict interest too?
Is it ethical to give a final exam after the professor has quit before teaching the remaining chapters of the course?
Amount of permutations on an NxNxN Rubik's Cube
Is it common practice to audition new musicians 1-2-1 before rehearsing with the entire band?
Fundamental Solution of the Pell Equation
What are the out-of-universe reasons for the references to Toby Maguire-era Spider-Man in ITSV
What is the meaning of the new sigil in Game of Thrones Season 8 intro?
Can a new player join a group only when a new campaign starts?
How to tell that you are a giant?
Generate an RGB colour grid
How to down pick a chord with skipped strings?
What is the longest distance a player character can jump in one leap?
Wu formula for manifolds with boundary
How to convince students of the implication truth values?
When a candle burns, why does the top of wick glow if bottom of flame is hottest?
Do I really need recursive chmod to restrict access to a folder?
Extracting terms with certain heads in a function
3 doors, three guards, one stone
T-test, ANOVA or Regression, what's the difference?
How to answer "Have you ever been terminated?"
Where are Serre’s lectures at Collège de France to be found?
Why wasn't DOSKEY integrated with command.com?
2001: A Space Odyssey's use of the song "Daisy Bell" (Bicycle Built for Two); life imitates art or vice-versa?
What do you call the main part of a joke?
Transforming single QgsGeometry object from one CRS to another using PyQGIS?
Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern)
Announcing the arrival of Valued Associate #679: Cesar Manara
Unicorn Meta Zoo #1: Why another podcast?Convert from EPSG 3857 to EPSG 4326 QGIS2.18Specifying CRS for QgsCoordinateTransform?Splitting zAware polyline by points using ArcObjects with C#?How do I find the intersection of two polylines in PostGIS?Suitable projection for a map of JapanHelp, I have 10,000+ .shp files covering 3 UTM zones with unknown projectionsHow to Transform Many Projections Into One With SQL ServerChoosing UTM zone to use for large country?Changing projection on each page of data driven pagesHow can I find out what transformation geoserver is using?Looping Projection in ArcGIS ModelBuilder?
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
I have a polyline layer with roads in WGS84 that covers several UTM zones. For every road I need to place a set of points at different distances (in metres). To do so I want to reproject each road to respective UTM zone, create points in this UTM zone, reproject points to WGS84 and add them to respectful layer. There is aQgsCoordinateTransform() class that allows to perform transformation for individual points, but it doesn't accept polylines. I guess I could manually disassemble polylines into the set of points, transform each of them and recreate a polyline, but I hope that there is a build-in method or class that I overlooked, that allows to transform individual polylines.
coordinate-system pyqgis geometry line
add a comment |
I have a polyline layer with roads in WGS84 that covers several UTM zones. For every road I need to place a set of points at different distances (in metres). To do so I want to reproject each road to respective UTM zone, create points in this UTM zone, reproject points to WGS84 and add them to respectful layer. There is aQgsCoordinateTransform() class that allows to perform transformation for individual points, but it doesn't accept polylines. I guess I could manually disassemble polylines into the set of points, transform each of them and recreate a polyline, but I hope that there is a build-in method or class that I overlooked, that allows to transform individual polylines.
coordinate-system pyqgis geometry line
One option would be to convert your polyline to a polygon, thentransformPolygon()that, then just take the outer ring again. Its pretty much just QVector operations all the way down...
– BradHards
Sep 21 '15 at 10:11
add a comment |
I have a polyline layer with roads in WGS84 that covers several UTM zones. For every road I need to place a set of points at different distances (in metres). To do so I want to reproject each road to respective UTM zone, create points in this UTM zone, reproject points to WGS84 and add them to respectful layer. There is aQgsCoordinateTransform() class that allows to perform transformation for individual points, but it doesn't accept polylines. I guess I could manually disassemble polylines into the set of points, transform each of them and recreate a polyline, but I hope that there is a build-in method or class that I overlooked, that allows to transform individual polylines.
coordinate-system pyqgis geometry line
I have a polyline layer with roads in WGS84 that covers several UTM zones. For every road I need to place a set of points at different distances (in metres). To do so I want to reproject each road to respective UTM zone, create points in this UTM zone, reproject points to WGS84 and add them to respectful layer. There is aQgsCoordinateTransform() class that allows to perform transformation for individual points, but it doesn't accept polylines. I guess I could manually disassemble polylines into the set of points, transform each of them and recreate a polyline, but I hope that there is a build-in method or class that I overlooked, that allows to transform individual polylines.
coordinate-system pyqgis geometry line
coordinate-system pyqgis geometry line
edited Jul 29 '17 at 7:53
PolyGeo♦
54k1782246
54k1782246
asked Sep 21 '15 at 8:44
SS_RebeliousSS_Rebelious
4,64611953
4,64611953
One option would be to convert your polyline to a polygon, thentransformPolygon()that, then just take the outer ring again. Its pretty much just QVector operations all the way down...
– BradHards
Sep 21 '15 at 10:11
add a comment |
One option would be to convert your polyline to a polygon, thentransformPolygon()that, then just take the outer ring again. Its pretty much just QVector operations all the way down...
– BradHards
Sep 21 '15 at 10:11
One option would be to convert your polyline to a polygon, then
transformPolygon() that, then just take the outer ring again. Its pretty much just QVector operations all the way down...– BradHards
Sep 21 '15 at 10:11
One option would be to convert your polyline to a polygon, then
transformPolygon() that, then just take the outer ring again. Its pretty much just QVector operations all the way down...– BradHards
Sep 21 '15 at 10:11
add a comment |
2 Answers
2
active
oldest
votes
use QgsGeometry.transform( QgsCoordinateTransform tr ). for example after created your instance of QgsCoordinateTransform with source and dest crs, for each geometry instance do:
sourceCrs = QgsCoordinateReferenceSystem(4326)
destCrs = QgsCoordinateReferenceSystem(2154)
tr = QgsCoordinateTransform(sourceCrs, destCrs, QgsProject.instance())
myGeometryInstance.transform(tr)
https://qgis.org/api/classQgsCoordinateTransform.html#aa5ad428819ac020f8f5716e835ab754f
beware that the transformation (applying QgsCoordinateTransform) will change the QgsGeometry instance.
Thank you for this answer. The operation gives me back a 0 number and my geometry doesn't seems to be reprojected.
– SIGIS
Sep 14 '17 at 8:42
can you give more details abut what you did? e.g. wkt of the geom, origin and dest epsg code and all that can be usefl to replicate. Obviously also qgis version and platform. tnx
– Luigi Pirelli
Sep 14 '17 at 10:54
Ok I missed a step to get a QgsCoordinateSystemReference class in the choosen coordinate eg 2154. It still gave back a 0 but the vertex has changed their coordinate.
– SIGIS
Sep 14 '17 at 12:23
This codesnippet does not work anymore in QGIS 3.4.4 : TypeError: QgsCoordinateTransform(): arguments did not match any overloaded call: overload 1: too many arguments overload 2: not enough arguments overload 3: not enough arguments overload 4: not enough arguments overload 5: argument 1 has unexpected type 'QgsCoordinateReferenceSystem'
– Riccardo
Jan 25 at 15:11
1
@Riccardo The API has changed and you need to add a third parameter QgsCoordinateTransformContext. You can get it from QgsProject.instance(). So the call should be likeQgsCoordinateTransform(crsSrc, crsDest, QgsProject.instance())
– spatialthoughts
Apr 4 at 11:19
|
show 1 more comment
Old Question, but duckduckgo brings you here for "pyqgis transform single geometry"
Just like Riccardo Pointed out, the accepted answer does not work for scripts in QGIS 3, the situation is explained in the api reference:
Python scripts should utilize the QgsProject.instance() project instance when creating QgsCoordinateTransform. This will ensure that any datum transforms defined in the project will be correctly respected during coordinate transforms. E.g.
transform = QgsCoordinateTransform(QgsCoordinateReferenceSystem("EPSG:3111"),
QgsCoordinateReferenceSystem("EPSG:4326"), QgsProject.instance())
Using QgsCoordinateTransform in QGIS 3 will transform the geometry instance inplace, and return 0:
geom = QgsGeometry(QgsPoint(5,20))
sourceCrs = QgsCoordinateReferenceSystem(4326)
destCrs = QgsCoordinateReferenceSystem(2154)
tr = QgsCoordinateTransform(sourceCrs, destCrs, QgsProject.instance())
geom.transform(tr)
#[out]: 0
geom
#[out]: <QgsGeometry: Point (930236.95432910311501473 3567516.9810206750407815)>
back_tr = QgsCoordinateTransform(destCrs, sourceCrs, QgsProject.instance())
geom.transform(back_tr)
#[out]: 0
geom
#[out]: <QgsGeometry: Point (5 19.99999999999911182)>
If you want to copy an already existing QgsGeometry Instance, the QgsGeometry class constructor will make the trick. From the docs:
Class: QgsGeometry
class qgis.core.QgsGeometry
Bases: sip.wrapper
Constructor
QgsGeometry(QgsGeometry) Copy constructor will prompt a deep copy of the object
example:
geom2 = QgsGeometry(geom)
geom2
#[out]: <QgsGeometry: Point (5 19.99999999999911182)>
geom
#[out]: <QgsGeometry: Point (5 19.99999999999911182)>
geom2.transform(tr)
#[out]: 0
geom2
#[out]: <QgsGeometry: Point (930236.95432910579256713 3567516.98102056747302413)>
geom
#[out]: <QgsGeometry: Point (5 19.99999999999911182)>
OMG, using project as an argument for transformation looks like a terrible design to me...
– SS_Rebelious
Mar 8 at 20:50
1
I was just copying the docs there.
– Javier JC
Mar 8 at 21:23
add a comment |
Your Answer
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "79"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fgis.stackexchange.com%2fquestions%2f163645%2ftransforming-single-qgsgeometry-object-from-one-crs-to-another-using-pyqgis%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
use QgsGeometry.transform( QgsCoordinateTransform tr ). for example after created your instance of QgsCoordinateTransform with source and dest crs, for each geometry instance do:
sourceCrs = QgsCoordinateReferenceSystem(4326)
destCrs = QgsCoordinateReferenceSystem(2154)
tr = QgsCoordinateTransform(sourceCrs, destCrs, QgsProject.instance())
myGeometryInstance.transform(tr)
https://qgis.org/api/classQgsCoordinateTransform.html#aa5ad428819ac020f8f5716e835ab754f
beware that the transformation (applying QgsCoordinateTransform) will change the QgsGeometry instance.
Thank you for this answer. The operation gives me back a 0 number and my geometry doesn't seems to be reprojected.
– SIGIS
Sep 14 '17 at 8:42
can you give more details abut what you did? e.g. wkt of the geom, origin and dest epsg code and all that can be usefl to replicate. Obviously also qgis version and platform. tnx
– Luigi Pirelli
Sep 14 '17 at 10:54
Ok I missed a step to get a QgsCoordinateSystemReference class in the choosen coordinate eg 2154. It still gave back a 0 but the vertex has changed their coordinate.
– SIGIS
Sep 14 '17 at 12:23
This codesnippet does not work anymore in QGIS 3.4.4 : TypeError: QgsCoordinateTransform(): arguments did not match any overloaded call: overload 1: too many arguments overload 2: not enough arguments overload 3: not enough arguments overload 4: not enough arguments overload 5: argument 1 has unexpected type 'QgsCoordinateReferenceSystem'
– Riccardo
Jan 25 at 15:11
1
@Riccardo The API has changed and you need to add a third parameter QgsCoordinateTransformContext. You can get it from QgsProject.instance(). So the call should be likeQgsCoordinateTransform(crsSrc, crsDest, QgsProject.instance())
– spatialthoughts
Apr 4 at 11:19
|
show 1 more comment
use QgsGeometry.transform( QgsCoordinateTransform tr ). for example after created your instance of QgsCoordinateTransform with source and dest crs, for each geometry instance do:
sourceCrs = QgsCoordinateReferenceSystem(4326)
destCrs = QgsCoordinateReferenceSystem(2154)
tr = QgsCoordinateTransform(sourceCrs, destCrs, QgsProject.instance())
myGeometryInstance.transform(tr)
https://qgis.org/api/classQgsCoordinateTransform.html#aa5ad428819ac020f8f5716e835ab754f
beware that the transformation (applying QgsCoordinateTransform) will change the QgsGeometry instance.
Thank you for this answer. The operation gives me back a 0 number and my geometry doesn't seems to be reprojected.
– SIGIS
Sep 14 '17 at 8:42
can you give more details abut what you did? e.g. wkt of the geom, origin and dest epsg code and all that can be usefl to replicate. Obviously also qgis version and platform. tnx
– Luigi Pirelli
Sep 14 '17 at 10:54
Ok I missed a step to get a QgsCoordinateSystemReference class in the choosen coordinate eg 2154. It still gave back a 0 but the vertex has changed their coordinate.
– SIGIS
Sep 14 '17 at 12:23
This codesnippet does not work anymore in QGIS 3.4.4 : TypeError: QgsCoordinateTransform(): arguments did not match any overloaded call: overload 1: too many arguments overload 2: not enough arguments overload 3: not enough arguments overload 4: not enough arguments overload 5: argument 1 has unexpected type 'QgsCoordinateReferenceSystem'
– Riccardo
Jan 25 at 15:11
1
@Riccardo The API has changed and you need to add a third parameter QgsCoordinateTransformContext. You can get it from QgsProject.instance(). So the call should be likeQgsCoordinateTransform(crsSrc, crsDest, QgsProject.instance())
– spatialthoughts
Apr 4 at 11:19
|
show 1 more comment
use QgsGeometry.transform( QgsCoordinateTransform tr ). for example after created your instance of QgsCoordinateTransform with source and dest crs, for each geometry instance do:
sourceCrs = QgsCoordinateReferenceSystem(4326)
destCrs = QgsCoordinateReferenceSystem(2154)
tr = QgsCoordinateTransform(sourceCrs, destCrs, QgsProject.instance())
myGeometryInstance.transform(tr)
https://qgis.org/api/classQgsCoordinateTransform.html#aa5ad428819ac020f8f5716e835ab754f
beware that the transformation (applying QgsCoordinateTransform) will change the QgsGeometry instance.
use QgsGeometry.transform( QgsCoordinateTransform tr ). for example after created your instance of QgsCoordinateTransform with source and dest crs, for each geometry instance do:
sourceCrs = QgsCoordinateReferenceSystem(4326)
destCrs = QgsCoordinateReferenceSystem(2154)
tr = QgsCoordinateTransform(sourceCrs, destCrs, QgsProject.instance())
myGeometryInstance.transform(tr)
https://qgis.org/api/classQgsCoordinateTransform.html#aa5ad428819ac020f8f5716e835ab754f
beware that the transformation (applying QgsCoordinateTransform) will change the QgsGeometry instance.
edited Apr 10 at 8:39
answered Sep 21 '15 at 13:25
Luigi PirelliLuigi Pirelli
1,623811
1,623811
Thank you for this answer. The operation gives me back a 0 number and my geometry doesn't seems to be reprojected.
– SIGIS
Sep 14 '17 at 8:42
can you give more details abut what you did? e.g. wkt of the geom, origin and dest epsg code and all that can be usefl to replicate. Obviously also qgis version and platform. tnx
– Luigi Pirelli
Sep 14 '17 at 10:54
Ok I missed a step to get a QgsCoordinateSystemReference class in the choosen coordinate eg 2154. It still gave back a 0 but the vertex has changed their coordinate.
– SIGIS
Sep 14 '17 at 12:23
This codesnippet does not work anymore in QGIS 3.4.4 : TypeError: QgsCoordinateTransform(): arguments did not match any overloaded call: overload 1: too many arguments overload 2: not enough arguments overload 3: not enough arguments overload 4: not enough arguments overload 5: argument 1 has unexpected type 'QgsCoordinateReferenceSystem'
– Riccardo
Jan 25 at 15:11
1
@Riccardo The API has changed and you need to add a third parameter QgsCoordinateTransformContext. You can get it from QgsProject.instance(). So the call should be likeQgsCoordinateTransform(crsSrc, crsDest, QgsProject.instance())
– spatialthoughts
Apr 4 at 11:19
|
show 1 more comment
Thank you for this answer. The operation gives me back a 0 number and my geometry doesn't seems to be reprojected.
– SIGIS
Sep 14 '17 at 8:42
can you give more details abut what you did? e.g. wkt of the geom, origin and dest epsg code and all that can be usefl to replicate. Obviously also qgis version and platform. tnx
– Luigi Pirelli
Sep 14 '17 at 10:54
Ok I missed a step to get a QgsCoordinateSystemReference class in the choosen coordinate eg 2154. It still gave back a 0 but the vertex has changed their coordinate.
– SIGIS
Sep 14 '17 at 12:23
This codesnippet does not work anymore in QGIS 3.4.4 : TypeError: QgsCoordinateTransform(): arguments did not match any overloaded call: overload 1: too many arguments overload 2: not enough arguments overload 3: not enough arguments overload 4: not enough arguments overload 5: argument 1 has unexpected type 'QgsCoordinateReferenceSystem'
– Riccardo
Jan 25 at 15:11
1
@Riccardo The API has changed and you need to add a third parameter QgsCoordinateTransformContext. You can get it from QgsProject.instance(). So the call should be likeQgsCoordinateTransform(crsSrc, crsDest, QgsProject.instance())
– spatialthoughts
Apr 4 at 11:19
Thank you for this answer. The operation gives me back a 0 number and my geometry doesn't seems to be reprojected.
– SIGIS
Sep 14 '17 at 8:42
Thank you for this answer. The operation gives me back a 0 number and my geometry doesn't seems to be reprojected.
– SIGIS
Sep 14 '17 at 8:42
can you give more details abut what you did? e.g. wkt of the geom, origin and dest epsg code and all that can be usefl to replicate. Obviously also qgis version and platform. tnx
– Luigi Pirelli
Sep 14 '17 at 10:54
can you give more details abut what you did? e.g. wkt of the geom, origin and dest epsg code and all that can be usefl to replicate. Obviously also qgis version and platform. tnx
– Luigi Pirelli
Sep 14 '17 at 10:54
Ok I missed a step to get a QgsCoordinateSystemReference class in the choosen coordinate eg 2154. It still gave back a 0 but the vertex has changed their coordinate.
– SIGIS
Sep 14 '17 at 12:23
Ok I missed a step to get a QgsCoordinateSystemReference class in the choosen coordinate eg 2154. It still gave back a 0 but the vertex has changed their coordinate.
– SIGIS
Sep 14 '17 at 12:23
This codesnippet does not work anymore in QGIS 3.4.4 : TypeError: QgsCoordinateTransform(): arguments did not match any overloaded call: overload 1: too many arguments overload 2: not enough arguments overload 3: not enough arguments overload 4: not enough arguments overload 5: argument 1 has unexpected type 'QgsCoordinateReferenceSystem'
– Riccardo
Jan 25 at 15:11
This codesnippet does not work anymore in QGIS 3.4.4 : TypeError: QgsCoordinateTransform(): arguments did not match any overloaded call: overload 1: too many arguments overload 2: not enough arguments overload 3: not enough arguments overload 4: not enough arguments overload 5: argument 1 has unexpected type 'QgsCoordinateReferenceSystem'
– Riccardo
Jan 25 at 15:11
1
1
@Riccardo The API has changed and you need to add a third parameter QgsCoordinateTransformContext. You can get it from QgsProject.instance(). So the call should be like
QgsCoordinateTransform(crsSrc, crsDest, QgsProject.instance())– spatialthoughts
Apr 4 at 11:19
@Riccardo The API has changed and you need to add a third parameter QgsCoordinateTransformContext. You can get it from QgsProject.instance(). So the call should be like
QgsCoordinateTransform(crsSrc, crsDest, QgsProject.instance())– spatialthoughts
Apr 4 at 11:19
|
show 1 more comment
Old Question, but duckduckgo brings you here for "pyqgis transform single geometry"
Just like Riccardo Pointed out, the accepted answer does not work for scripts in QGIS 3, the situation is explained in the api reference:
Python scripts should utilize the QgsProject.instance() project instance when creating QgsCoordinateTransform. This will ensure that any datum transforms defined in the project will be correctly respected during coordinate transforms. E.g.
transform = QgsCoordinateTransform(QgsCoordinateReferenceSystem("EPSG:3111"),
QgsCoordinateReferenceSystem("EPSG:4326"), QgsProject.instance())
Using QgsCoordinateTransform in QGIS 3 will transform the geometry instance inplace, and return 0:
geom = QgsGeometry(QgsPoint(5,20))
sourceCrs = QgsCoordinateReferenceSystem(4326)
destCrs = QgsCoordinateReferenceSystem(2154)
tr = QgsCoordinateTransform(sourceCrs, destCrs, QgsProject.instance())
geom.transform(tr)
#[out]: 0
geom
#[out]: <QgsGeometry: Point (930236.95432910311501473 3567516.9810206750407815)>
back_tr = QgsCoordinateTransform(destCrs, sourceCrs, QgsProject.instance())
geom.transform(back_tr)
#[out]: 0
geom
#[out]: <QgsGeometry: Point (5 19.99999999999911182)>
If you want to copy an already existing QgsGeometry Instance, the QgsGeometry class constructor will make the trick. From the docs:
Class: QgsGeometry
class qgis.core.QgsGeometry
Bases: sip.wrapper
Constructor
QgsGeometry(QgsGeometry) Copy constructor will prompt a deep copy of the object
example:
geom2 = QgsGeometry(geom)
geom2
#[out]: <QgsGeometry: Point (5 19.99999999999911182)>
geom
#[out]: <QgsGeometry: Point (5 19.99999999999911182)>
geom2.transform(tr)
#[out]: 0
geom2
#[out]: <QgsGeometry: Point (930236.95432910579256713 3567516.98102056747302413)>
geom
#[out]: <QgsGeometry: Point (5 19.99999999999911182)>
OMG, using project as an argument for transformation looks like a terrible design to me...
– SS_Rebelious
Mar 8 at 20:50
1
I was just copying the docs there.
– Javier JC
Mar 8 at 21:23
add a comment |
Old Question, but duckduckgo brings you here for "pyqgis transform single geometry"
Just like Riccardo Pointed out, the accepted answer does not work for scripts in QGIS 3, the situation is explained in the api reference:
Python scripts should utilize the QgsProject.instance() project instance when creating QgsCoordinateTransform. This will ensure that any datum transforms defined in the project will be correctly respected during coordinate transforms. E.g.
transform = QgsCoordinateTransform(QgsCoordinateReferenceSystem("EPSG:3111"),
QgsCoordinateReferenceSystem("EPSG:4326"), QgsProject.instance())
Using QgsCoordinateTransform in QGIS 3 will transform the geometry instance inplace, and return 0:
geom = QgsGeometry(QgsPoint(5,20))
sourceCrs = QgsCoordinateReferenceSystem(4326)
destCrs = QgsCoordinateReferenceSystem(2154)
tr = QgsCoordinateTransform(sourceCrs, destCrs, QgsProject.instance())
geom.transform(tr)
#[out]: 0
geom
#[out]: <QgsGeometry: Point (930236.95432910311501473 3567516.9810206750407815)>
back_tr = QgsCoordinateTransform(destCrs, sourceCrs, QgsProject.instance())
geom.transform(back_tr)
#[out]: 0
geom
#[out]: <QgsGeometry: Point (5 19.99999999999911182)>
If you want to copy an already existing QgsGeometry Instance, the QgsGeometry class constructor will make the trick. From the docs:
Class: QgsGeometry
class qgis.core.QgsGeometry
Bases: sip.wrapper
Constructor
QgsGeometry(QgsGeometry) Copy constructor will prompt a deep copy of the object
example:
geom2 = QgsGeometry(geom)
geom2
#[out]: <QgsGeometry: Point (5 19.99999999999911182)>
geom
#[out]: <QgsGeometry: Point (5 19.99999999999911182)>
geom2.transform(tr)
#[out]: 0
geom2
#[out]: <QgsGeometry: Point (930236.95432910579256713 3567516.98102056747302413)>
geom
#[out]: <QgsGeometry: Point (5 19.99999999999911182)>
OMG, using project as an argument for transformation looks like a terrible design to me...
– SS_Rebelious
Mar 8 at 20:50
1
I was just copying the docs there.
– Javier JC
Mar 8 at 21:23
add a comment |
Old Question, but duckduckgo brings you here for "pyqgis transform single geometry"
Just like Riccardo Pointed out, the accepted answer does not work for scripts in QGIS 3, the situation is explained in the api reference:
Python scripts should utilize the QgsProject.instance() project instance when creating QgsCoordinateTransform. This will ensure that any datum transforms defined in the project will be correctly respected during coordinate transforms. E.g.
transform = QgsCoordinateTransform(QgsCoordinateReferenceSystem("EPSG:3111"),
QgsCoordinateReferenceSystem("EPSG:4326"), QgsProject.instance())
Using QgsCoordinateTransform in QGIS 3 will transform the geometry instance inplace, and return 0:
geom = QgsGeometry(QgsPoint(5,20))
sourceCrs = QgsCoordinateReferenceSystem(4326)
destCrs = QgsCoordinateReferenceSystem(2154)
tr = QgsCoordinateTransform(sourceCrs, destCrs, QgsProject.instance())
geom.transform(tr)
#[out]: 0
geom
#[out]: <QgsGeometry: Point (930236.95432910311501473 3567516.9810206750407815)>
back_tr = QgsCoordinateTransform(destCrs, sourceCrs, QgsProject.instance())
geom.transform(back_tr)
#[out]: 0
geom
#[out]: <QgsGeometry: Point (5 19.99999999999911182)>
If you want to copy an already existing QgsGeometry Instance, the QgsGeometry class constructor will make the trick. From the docs:
Class: QgsGeometry
class qgis.core.QgsGeometry
Bases: sip.wrapper
Constructor
QgsGeometry(QgsGeometry) Copy constructor will prompt a deep copy of the object
example:
geom2 = QgsGeometry(geom)
geom2
#[out]: <QgsGeometry: Point (5 19.99999999999911182)>
geom
#[out]: <QgsGeometry: Point (5 19.99999999999911182)>
geom2.transform(tr)
#[out]: 0
geom2
#[out]: <QgsGeometry: Point (930236.95432910579256713 3567516.98102056747302413)>
geom
#[out]: <QgsGeometry: Point (5 19.99999999999911182)>
Old Question, but duckduckgo brings you here for "pyqgis transform single geometry"
Just like Riccardo Pointed out, the accepted answer does not work for scripts in QGIS 3, the situation is explained in the api reference:
Python scripts should utilize the QgsProject.instance() project instance when creating QgsCoordinateTransform. This will ensure that any datum transforms defined in the project will be correctly respected during coordinate transforms. E.g.
transform = QgsCoordinateTransform(QgsCoordinateReferenceSystem("EPSG:3111"),
QgsCoordinateReferenceSystem("EPSG:4326"), QgsProject.instance())
Using QgsCoordinateTransform in QGIS 3 will transform the geometry instance inplace, and return 0:
geom = QgsGeometry(QgsPoint(5,20))
sourceCrs = QgsCoordinateReferenceSystem(4326)
destCrs = QgsCoordinateReferenceSystem(2154)
tr = QgsCoordinateTransform(sourceCrs, destCrs, QgsProject.instance())
geom.transform(tr)
#[out]: 0
geom
#[out]: <QgsGeometry: Point (930236.95432910311501473 3567516.9810206750407815)>
back_tr = QgsCoordinateTransform(destCrs, sourceCrs, QgsProject.instance())
geom.transform(back_tr)
#[out]: 0
geom
#[out]: <QgsGeometry: Point (5 19.99999999999911182)>
If you want to copy an already existing QgsGeometry Instance, the QgsGeometry class constructor will make the trick. From the docs:
Class: QgsGeometry
class qgis.core.QgsGeometry
Bases: sip.wrapper
Constructor
QgsGeometry(QgsGeometry) Copy constructor will prompt a deep copy of the object
example:
geom2 = QgsGeometry(geom)
geom2
#[out]: <QgsGeometry: Point (5 19.99999999999911182)>
geom
#[out]: <QgsGeometry: Point (5 19.99999999999911182)>
geom2.transform(tr)
#[out]: 0
geom2
#[out]: <QgsGeometry: Point (930236.95432910579256713 3567516.98102056747302413)>
geom
#[out]: <QgsGeometry: Point (5 19.99999999999911182)>
edited Mar 8 at 23:39
answered Mar 8 at 14:44
Javier JCJavier JC
663
663
OMG, using project as an argument for transformation looks like a terrible design to me...
– SS_Rebelious
Mar 8 at 20:50
1
I was just copying the docs there.
– Javier JC
Mar 8 at 21:23
add a comment |
OMG, using project as an argument for transformation looks like a terrible design to me...
– SS_Rebelious
Mar 8 at 20:50
1
I was just copying the docs there.
– Javier JC
Mar 8 at 21:23
OMG, using project as an argument for transformation looks like a terrible design to me...
– SS_Rebelious
Mar 8 at 20:50
OMG, using project as an argument for transformation looks like a terrible design to me...
– SS_Rebelious
Mar 8 at 20:50
1
1
I was just copying the docs there.
– Javier JC
Mar 8 at 21:23
I was just copying the docs there.
– Javier JC
Mar 8 at 21:23
add a comment |
Thanks for contributing an answer to Geographic Information Systems Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fgis.stackexchange.com%2fquestions%2f163645%2ftransforming-single-qgsgeometry-object-from-one-crs-to-another-using-pyqgis%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
One option would be to convert your polyline to a polygon, then
transformPolygon()that, then just take the outer ring again. Its pretty much just QVector operations all the way down...– BradHards
Sep 21 '15 at 10:11