回答:
Pythonで座標を変換する最も簡単な方法は、pyproj、つまりPROJ.4ライブラリへのPythonインターフェイスです。実際には:
from pyproj import Proj, transform
inProj = Proj(init='epsg:3857')
outProj = Proj(init='epsg:4326')
x1,y1 = -11705274.6374,4826473.6922
x2,y2 = transform(inProj,outProj,x1,y1)
print x2,y2
返却値 -105.150271116 39.7278572773
デフォルトでは、リンク先のサイトは空間参照システムEPSG 3857(WGS84 Webメルカトル)を使用します。ここでこの情報を見つけました。
目的のEPSGを下のフォームに入力して別の空間参照系を指定するかSpatial Reference
、返された座標をPythonで変換できます。
たとえば、GDAL Pythonバインディングを使用して、この点を投影座標系(EPSG 3857)から地理座標系(EPSG 4326)に変換できます。
import ogr, osr
pointX = -11705274.6374
pointY = 4826473.6922
# Spatial Reference System
inputEPSG = 3857
outputEPSG = 4326
# create a geometry from coordinates
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(pointX, pointY)
# create coordinate transformation
inSpatialRef = osr.SpatialReference()
inSpatialRef.ImportFromEPSG(inputEPSG)
outSpatialRef = osr.SpatialReference()
outSpatialRef.ImportFromEPSG(outputEPSG)
coordTransform = osr.CoordinateTransformation(inSpatialRef, outSpatialRef)
# transform point
point.Transform(coordTransform)
# print point in EPSG 4326
print point.GetX(), point.GetY()
これにより、ポイントの座標が返されます-105.150271116 39.7278572773
。
afalcianoには正しい答えがありますが、pyprojのさまざまな使用法を含めたいと考えました。
それはないあなたがPROJ4文字列を知っている必要とし、ほんの少し高速です。
import pyproj
p = pyproj.Proj("+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +a=6378137 +b=6378137 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs")
lon, lat = p(x, y, inverse=True)
print lat, lon
p = pyproj.Proj(init='epsg:3857')
ください。結果は同じです。
Marcel Wilsonが提案したコードを試してみましたが、より高速です。
from pyproj import Proj, transform
import time
import pyproj
# Test 1 - 0.0006158 s
start=time.time()
inProj = Proj(init='epsg:3857')
outProj = Proj(init='epsg:4326')
x1,y1 = -11705274.6374,4826473.6922
x2,y2 = transform(inProj,outProj,x1,y1)
end=time.time()
print(y2,x2)
print('%.7f' % (end-start))
# Test 2 - 0.0000517 s --- factor 11,9
start=time.time()
x,y = -11705274.6374,4826473.6922
p = pyproj.Proj("+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +a=6378137 +b=6378137 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs")
lon, lat = p(x, y, inverse=True)
end=time.time()
print(lat, lon)
print('%.7f' % (end-start))
-----------------
39.72785727727918 -105.15027111593008
0.0006158
39.72785727727918 -105.15027111593008
0.0000517
QGIS内でこれを行う方法を探しているときに、この投稿を見つけました。ここで説明したように、使用されるメソッドは次のようになります。
def convertProjection(self,x,y,from_crs,to_crs):
crsSrc = QgsCoordinateReferenceSystem(from_crs)
crsDest = QgsCoordinateReferenceSystem(to_crs)
xform = QgsCoordinateTransform(crsSrc, crsDest)
pt = xform.transform(QgsPoint(x,y))
return pt.x, pt.y
# Remove the "EPSG:" part
from_crs = 3857
to_crs = 4326
x = -11705274.6374
y = 4826473.6922
lon, lat = self.convertProjection(x,y,from_crs, to_crs)
v3.x
する場合は使用する必要があることに注意してくださいxform = QgsCoordinateTransform(crsSrc, crsDest, QgsProject.instance())
accepts のtransform
機能pyproj
もarrays
データフレームに関して非常に便利であることに注意してください。
import pandas as pd
from pyproj import Proj, transform
df = pd.DataFrame({'x': [-11705274.6374]*100,
'y': [4826473.6922]*100})
inProj, outProj = Proj(init='epsg:3857'), Proj(init='epsg:4326')
df['x2'], df['y2'] = transform(inProj, outProj, df['x'].tolist(), df['y'].tolist())
import cv2
import numpy as np
def onMouse(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
# draw circle here (etc...)
print('x = %f, y = %f'%((x*2/100),(y*2/100)))
a=float(input("enter length of original dimension in cm"))
b=float(input("enter width of original dimension in cm"))
print("origional image coordinates")
im=cv2.imread('mask1.jpg',0)
re_im=cv2.resize(im,(round(a*100/2),round(b*100/2)))
cv2.imshow('image',re_im)
cv2.setMouseCallback('image', onMouse)
cv2.waitKey(0)
cv2.destroyAllWindows()