Hi,
I am sorry to interfere in this thread but I think my findings will help you.
I also want to report a possible bug.
I have worked to a plugin which display the coordinate in DMS when the user
execute a mouse left click on the map.
When the geometries are displayed on the projection, the conversion on the fly
to DMS does not work properly.
To have properly displayed the coordinate in DMS or Decimal degree you need to
re-project your data to a coordinate reference system (WGS84 or GRS80, or
other).
For example:
If data is displayed in projection reference system (stereographic in my case)
and data is stored in world coordinates system (X and Y).
X = -1081940.67048 and Y = 2561405.89514 will be displayed as 140040’13.726 W.
There is not such latitude2561405053’42.489 N
This is the projection: +proj=sterea +lat_0=53.5 +lon_0=-76.0 +k=1 +x_0=0
+y_0=0 +a=6381816.160744 +b=6381816.160744 +units=m +no_defs
The conversion is done by the function toDegreesMinutesSeconds from QsgPoint
class.
It looks the function is not able to do to re-projection back to the spheroid.
I think this is a bug.
The function toDegreesMinutesSeconds works properly if it is applied to Decimal
degree coordinate.
What to be done!
First you need to reproject your data by using QgsCoordinateTransform .
Ex.
crs = qgis.core.QgsCoordinateRefernceSystem(<idCRS>, qgis.core.
QgsCoordinateRefernceSystem.InternalCrsId) # if you use a customized coordinate
reference system
prs = qgis.core.QgsCoordinateRefernceSystem(<idPRS>, qgis.core.
QgsCoordinateRefernceSystem.InternalCrsId) # if you use a customized projected
reference system
transformation = = qgis.core. QgsCoordinateTransform(crs, prs)
#transformation object is used to re-project your coordinates.
For example:
point = qgis.core.QgsPoint(X, Y) # X and Y are in world coordinate system meters
#apply transformation to reproject your point
reprojectedPoint = transformation.transform(point,
QgsCoordinateTransform.ForwardTransform)
print reprojectedPoint #you will get the point in decimal degrees.
pointDMS = reprojectedPoint. toDegreesMinutesSeconds(3, True, True) #your will
get the point in degrees minutes seconds with respect to crs
if you want to input DMS data then you have to do the same steps but in reverse:
1. Convert DMS to decimal degrees;
2. Apply QgsCoordinateTransform to decimal degrees so you get X and Y.
You can build a plugin based on this class. Check out the function drawLine
where I input a lat and long in DMS format and write the line geometry in x/y
format. If you have write your geometry in lat and long decimal degrees you do
not have to apply QgsCoordinateTransform.
#spam_activate_map_background
import qgis
from PyQt4 import QtGui, QtCore
class LineGeometryDMSInput:
def __init__(self):
self.__prs = qgis.core.QgsCoordinateReferenceSystem(100006,
qgis.core.QgsCoordinateReferenceSystem.InternalCrsId)
self.__crs = qgis.core.QgsCoordinateReferenceSystem(100000,
qgis.core.QgsCoordinateReferenceSystem.InternalCrsId)
self.__transformation = qgis.core.QgsCoordinateTransform(self.__ prs ,
self.__ crs)
def drawLine(self, lineStartDMS, lineEndDMS):
start_Point = lineStartDMS.split(',')
end_Point = lineEndDMS.split(',')
startLine = (self.fromDmsToDecimal(start_Point[0], 5),
self.fromDmsToDecimal(start_Point[1], 5))
endLine = (self.fromDmsToDecimal(end_Point[0], 5),
self.fromDmsToDecimal(end_Point[1], 5))
line_start = qgis.core.QgsPoint(startLine[1], startLine[0])
line_end = qgis.core.QgsPoint(endLine[1], endLine[0])
pointGeomStartTransformed = self.__
transformation.transform(line_start,
qgis.core.QgsCoordinateTransform.ForwardTransform)
pointGeomEndTransformed = self.__ transformation.transform(line_end,
qgis.core.QgsCoordinateTransform.ForwardTransform)
layer = qgis.utils.iface.activeLayer()
latestID = int(layer.featureCount())
layer.startEditing()
caps = layer.dataProvider().capabilities()
if caps & qgis.core.QgsVectorDataProvider.AddFeatures:
featureLine = qgis.core.QgsFeature(layer.pendingFields())
geom =
qgis.core.QgsGeometry.fromPolyline([pointGeomStartTransformed,
pointGeomEndTransformed])
#if your data is stored in geographical coordinate use this
#geom = qgis.core.QgsGeometry.fromPolyline([line_start, line_end])
featureLine.setGeometry(geom)
layer.dataProvider().addFeatures([featureLine])
layer.commitChanges()
layer.updateExtents()
layer.startEditing()
qgis.utils.iface.zoomToActiveLayer()
def fromDmsToDecimal(self, dmsString, precision):
degree = float(dmsString.strip()[:2])
decimal_minutes = float(dmsString.strip()[2:-9])
decimal_seconds = float(dmsString.strip()[5:-2])
decimal = round(degree + decimal_minutes/60 + decimal_seconds/3600,
precision)
if 'S' in dmsString or 'W' in dmsString:
decimal = decimal * (-1.0)
return decimal
Thanks,
Marian
From: [email protected]
[mailto:[email protected]] On Behalf Of Alexandre Neto
Sent: September-09-15 8:24 AM
To: Pedro Venâncio
Cc: QGIS User
Subject: Re: [Qgis-user] Edit vertex using DMS coordinates Plugin?
I know NumericalDigitize and NumericalVertexEdit, but none of them allows the
user to input coordinates in DMS formats.
We receive coordinates in many formats, and mostly in some form of Degree,
minutes and deciimal Seconds, or Degree, and decimal minutes.
Normally I put the coordinates in a CSV and open it in QGIS to import the
coordinates. But It would be nicer the be able to add/edit them directly in one
of those format instead.
I did not know the node edit widget, looks interesting.
Thanks,
Alexandre
Em qua, 9 de set de 2015 às 12:22, Pedro Venâncio
<[email protected]<mailto:[email protected]>> escreveu:
Hi Alexandre,
Anyone know if it's possible or if there is a plugin that allow one to introduce
Have you tried NumericalDigitize plugin?
and modify vertex using introducing Degree, Minutes and Seconds (or any other
variation) values.
For editing, we have in QGIS master the new Node editor widget [0], which has
the Vertex editor list (i).
I don't know if you can work with Degrees, Minutes and Seconds in any of them,
but with decimal degrees they work well.
Best regards,
Pedro Venâncio
[0] https://github.com/qgis/QGIS/pull/2217
________________________________
This electronic message, as well as any transmitted files included in the
electronic message, may contain privileged or confidential information and is
intended solely for the use of the individual(s) or entity to which it is
addressed. If you have received this electronic message in error please notify
the sender immediately and delete the electronic message. Any unauthorized
copying, disclosure or distribution of the electronic message is strictly
forbidden. NAV CANADA accepts no liability for any damage caused by any virus
and/or other malicious code transmitted by this electronic communication.
Le présent message électronique et tout fichier qui peut y être joint peuvent
contenir des renseignements privilégiés ou confidentiels destinés à l’usage
exclusif des personnes ou des organismes à qui ils s’adressent. Si vous avez
reçu ce message électronique par erreur, veuillez en informer l’expéditeur
immédiatement et supprimez le. Toute reproduction, divulgation ou distribution
du présent message électronique est strictement interdite. NAV CANADA n’assume
aucune responsabilité en cas de dommage causé par tout virus ou autre programme
malveillant transmis par ce message électronique.
_______________________________________________
Qgis-user mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/qgis-user