[QGIS-Developer] Reg: QgsCoordinateTransform not working on Linux

Nyall Dawson nyall.dawson at gmail.com
Thu May 27 15:21:02 PDT 2021


On Thu, 27 May 2021 at 22:58, Prem Kumar <prem.netgis at gmail.com> wrote:
>
> Hi Team,
>
> Just wondering whether I'm missing something or a genuine bug, please advise below.
>
> All I am trying is, to take the geometry object in json format whose CRS is in WGS84 (EPSG:4326) and transform the geometry to EPSG:3857 CRS and eventually use it in further processing because rest of the processing is in EPSG:3857 CRS.
>
> I have written below code and it works like a charm on Windows 10 but it doesn't transform the geometry on Linux. Please advise if there is anything wrong or missing to add.

Your transformation code looks fine, so the only issue could be that
the proj library can't find the necessary data files. (Also the
missing QgsApplication initialization which was pointed out earlier).
Do the proj command line tools (such as "projinfo") work correctly for
you?

But while we're looking at this code, there's a lot of opportunity to
optimise this!

1. You don't need either the shapely or geojson modules to import
geometries from geojson. Instead just directly convert GeoJSON
features to QgsFeatures using QgsJsonUtils.stringToFeatureList() --
the conversions to shapely objects and then to QgsGeometries is adding
a LOT of overhead to your script.
2. In this example script you actually don't need to use JSON at all,
since you have a hardcoded list of coordinates. Instead you can make a
QgsGeometry directly using something like:

qgs_geom = QgsGeometry(QgsLineString([
QgsPoint(-78.853385,43.858452), QgsPoint(-78.85593, 43.85792) ]) )

that's the FASTEST way to create the QgsGeometry object, since there's
no json/string parsing involved at all.

Hope that helps!

Nyall


> Code Snippet for reproducing:
>
> from qgis.PyQt.QtCore import QVariant
> from shapely.geometry import shape
> import geojson,json
> from qgis.core import (QgsGeometry,QgsCoordinateReferenceSystem,QgsCoordinateTransform,QgsProject)
> from shapely import speedups as sups
> sups.disable()
>
> in_geometry='[{"type": "LineString","coordinates": [[-78.85338577199997,43.85845267000008],[-78.85593885699996,43.857924291000074]]}]'
> geomjson = json.loads(in_geometry)
> old_crs = QgsCoordinateReferenceSystem("EPSG:4326")
> new_crs = QgsCoordinateReferenceSystem("EPSG:3857")
> xtransform = QgsCoordinateTransform(old_crs, new_crs, QgsProject.instance())
> for i, g in enumerate(geomjson):
>     s = json.dumps(g)
>     g1 = geojson.loads(s)
>     shapely_geom = shape(g1)
>     qgs_geom=QgsGeometry.fromWkt(shapely_geom.wkt)
>     qgs_geom.transform(xtransform)
>     print (qgs_geom)
>
> Output from Pycharm:
> C:\Qgis\apps\Python37\python.exe C:/_WORK/SERVICE/test_transform.py
> <QgsGeometry: LineString (-8777918.77684544585645199 5443563.52439526654779911, -8778202.97550544328987598 5443481.85537817236036062)>
>
> Process finished with exit code 0
>
> Output from Linux terminal:
> (gisenv) admin at rd-temp-server:~/gis_service$ python3 test_transform.py
> Application path not initialized
> Application path not initialized
> <QgsGeometry: LineString (-78.85338600000000042 43.85845299999999725, -78.85593900000000644 43.85792399999999702)>
> (gisenv) admin at rd-temp-server:~/gis_service$
>
> Thanks.
> -Prem
> _______________________________________________
> QGIS-Developer mailing list
> QGIS-Developer at lists.osgeo.org
> List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer
> Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer


More information about the QGIS-Developer mailing list