पाइथन का उपयोग कर लेट / लोन को निर्देशांक निर्देशांक परिवर्तित करना?


50

मुझे लगता है कि यह एक बुनियादी सवाल है, लेकिन मैं इस समाधान को खोजने या पहचानने के लिए प्रतीत नहीं हो सकता।

यह साइट वापस आती है

Point:
X: -11705274.6374
Y: 4826473.6922

जब आप एक उदाहरण के रूप में 000090 के पहले मुख्य मूल्य के साथ खोज करते हैं। मुझे लगता है कि यह एक स्थानिक संदर्भ है और मुझे लगता है कि वह क्या है।

मैं निर्देशों या उदाहरणों की तलाश कर रहा हूं कि पायथन का उपयोग करके इसे अक्षांश और देशांतर में कैसे परिवर्तित किया जाए।

जवाबों:


100

पायथन में निर्देशांक को बदलने का सबसे सरल तरीका पाइप्रोज है , अर्थात पायजॉन इंटरफ़ेस को PROJ.4 लाइब्रेरी । असल में:

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


4
हां। पूरे रास्ते में पिप्रॉज।
sgillies

यह मेरे लिए काम करता है
lenhhoxung

36

डिफ़ॉल्ट रूप से आप जिस स्थान से जुड़े हैं वह स्थानिक संदर्भ प्रणाली EPSG 3857 (WGS84 वेब मर्केटर) का उपयोग करता है। मुझे यह जानकारी यहाँ मिली ।

आप या तो वांछित ईपीएसजी के तहत फार्म में एक और स्थानिक संदर्भ प्रणाली निर्दिष्ट Spatial Referenceकर सकते हैं या आप पायथन के साथ दिए गए निर्देशांक को परिवर्तित कर सकते हैं।

उदाहरण के लिए, आप इस बिंदु को अनुमानित समन्वय प्रणाली (EPSG 3857) से भौगोलिक समन्वय प्रणाली (EPSG 4326) में बदलने के लिए GDAL पायथन बाइंडिंग का उपयोग कर सकते हैं ।

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


6

आउटपुट एक स्थानिक / समन्वित संदर्भ प्रणाली नहीं है , यह निर्देशांक की एक जोड़ी है। आपको यह जानना होगा कि निर्देशांक को फिर से लागू करने के लिए स्थानिक संदर्भ क्या है।

हालाँकि, इस मामले में इसकी आवश्यकता नहीं है। बस सेवा के लिए एक उपयुक्त आउटपुट स्थानिक संदर्भ पास करें और यह लोण / लाट में निर्देशांक लौटाएगा।

यहाँ पृष्ठ में आउटपुट निर्देशांक के साथ लोन्स / लाट प्रारूप में WGS-84 भौगोलिक स्थानिक संदर्भ प्रणाली ( EPSG 4323 ) का उपयोग किया गया है।


6

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

2
आपको proj4 स्ट्रिंग की आवश्यकता नहीं है, इसके लिए दूसरी पंक्ति को प्रतिस्थापित करें p = pyproj.Proj(init='epsg:3857')और परिणाम समान है।
अल्फाबेटसअप

1
परिणाम एक ही है, लेकिन पिछले मैंने जाँच की यह थोड़ा तेज था।
मार्सेल विल्सन

3

मार्सेल विल्सन द्वारा सुझाए गए कोड की कोशिश की और यह तेज है:

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

1

क्यूजीआईएस के भीतर ऐसा करने के तरीकों की तलाश में मुझे यह पोस्ट मिली। जैसा कि यहां बताया गया है , उपयोग की जाने वाली विधि इस प्रकार है:

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)

2
ध्यान दें, क्यूजीआईएस 3 में एक ब्रेकिंग एपीआई परिवर्तन है, इसलिए यदि v3.xआपको उपयोग करने की आवश्यकता हैxform = QgsCoordinateTransform(crsSrc, crsDest, QgsProject.instance())
जॉनी

0

कृपया ध्यान दें कि डेटाफ़्रेम की बात होने पर यह 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())

-1
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()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.