গ্রাউন্ড কন্ট্রোল পয়েন্টগুলি ব্যবহার করে স্থানীয় স্থানাঙ্ক সিস্টেমের স্থানাঙ্ক থেকে বৈশ্বিক স্থানাঙ্ক সিস্টেমে রূপান্তরিত করতে PROJ.4 লাইব্রেরি ব্যবহার করছেন?


9

আমার একটি পয়েন্ট ক্লাউড রয়েছে যার স্থানাঙ্কগুলি স্থানীয় স্থানাঙ্ক ব্যবস্থার সাথে সম্মানজনক। আমার জিপিএস মান সহ গ্রাউন্ড কন্ট্রোল পয়েন্ট রয়েছে। আমি কি এই স্থানীয় স্থানাঙ্কগুলিকে PROJ.4 বা অন্য কোনও লাইব্রেরি ব্যবহার করে একটি বৈশ্বিক স্থানাঙ্ক সিস্টেমে রূপান্তর করতে পারি?

উপরে বর্ণিত সমস্যার জন্য পাইথনের যে কোনও কোডই একটি দুর্দান্ত সহায়তা হবে।


কিছু কোড প্রত্যাশিত?
হাকফিন

জিপিএসের স্থানাঙ্কগুলি সাধারণত WGS84 হয়, সুতরাং তারা সম্ভবত ইতিমধ্যে বিশ্বব্যাপী। জিপিএস (যেমন এনএডিডি 83) এর চেয়ে আলাদা একটি ডেটামের সাথে যদি গ্রাউন্ড কন্ট্রোল পয়েন্টগুলি স্থানীয় প্রক্ষেপণে থাকে তবে ডেটামটি রূপান্তর করতে হবে। PROJ4 যতদূর জানি আমি ডেটাম শিফটকে সমর্থন করি।
ওয়েবিন্দ

এখানে একটি অনুরূপ প্রশ্ন, তবে আরও অনেক বিশদ সহ: gis.stackexchange.com/questions/357910
trusktr

উত্তর:


7

আপনি আপনার স্থানীয় স্থানাঙ্ক সিস্টেম এবং একটি জিওরফারেন্সযুক্ত সমন্বিত সিস্টেমের মধ্যে একটি সূক্ষ্ম রূপান্তর পরিচালনা করছেন বলে মনে হচ্ছে ।

আফাইন মূলত সমস্ত সমন্বিত সিস্টেমকে রূপান্তর করে এবং নীচে ম্যাট্রিক্স সমীকরণ দ্বারা প্রতিনিধিত্ব করা যেতে পারে।

|x_1 y_1 1| |a d|   |x'_1 y'_1|
|x_2 y_2 1| |b e| = |x'_2 y'_2|
|x_3 y_3 1| |c f|   |x'_3 y'_3|
input     transform.  output
coords    matrix      coords
(n x 3)   (3 x 2)     (n x 2)

তবে আপনার দ্বি-পদক্ষেপের সমস্যা রয়েছে।

  1. এই ইনপুট এবং আউটপুট স্থানাঙ্ক পরিচিত পেয়ারিং (আপনার জিপিএস পয়েন্ট এবং আপনার স্থানীয়ভাবে-সংজ্ঞায়িত গ্রিড তাদের নিজ নিজ অবস্থানে) থেকে রূপান্তর ম্যাট্রিক্স।
  2. আপনার পয়েন্ট মেঘকে জিওরিফারেন্স করতে এই রূপান্তর ম্যাট্রিক্সটি ব্যবহার করুন

Proj.4 # 2 এ ছাড়িয়েছে: পরিচিত রূপান্তর ম্যাট্রিক্সের সাথে জিওরিফারেন্সেড সমন্বিত সিস্টেমগুলির মধ্যে স্থানান্তরিত হচ্ছে। এটা আমার জ্ঞান করতে ব্যবহার করা যাবে না এটি বিন্দু তথ্য থেকে একটি রূপান্তর ম্যাট্রিক্স। তবে, আপনি নিম্পিতে কিছু হালকা লিনিয়ার বীজগণিত (একটি ন্যূনতম-স্কোয়ার্স ম্যাট্রিক্স বিপরীত) ব্যবহার করে সহজেই পুরো জিনিসটি করতে পারেন। আমি বেশ কয়েকটি ফিল্ড স্টাডি থেকে ডেটা হ্রাস করার জন্য এই শ্রেণীর একটি সংস্করণ ব্যবহার করেছি:

import numpy as N 

def augment(a):
    """Add a final column of ones to input data"""
    arr = N.ones((a.shape[0],a.shape[1]+1))
    arr[:,:-1] = a
    return arr

class Affine(object):
    def __init__(self, array=None):
        self.trans_matrix = array

    def transform(self, points):
        """Transform locally projected data using transformation matrix"""
        return N.dot(augment(N.array(points)), self.trans_matrix)

    @classmethod
    def from_tiepoints(cls, fromCoords, toCoords):
        "Produce affine transform by ingesting local and georeferenced coordinates for tie points"""
        fromCoords = augment(N.array(fromCoords))
        toCoords = N.array(toCoords)
        trans_matrix, residuals, rank, sv = N.linalg.lstsq(fromCoords, toCoords)

        affine =  cls(trans_matrix) # Setup affine transform from transformation matrix
        sol = N.dot(fromCoords,affine.trans_matrix) # Compute model solution
        print "Pixel errors:"
        print (toCoords - sol)
        return affine

এটি যেমন ব্যবহার করা যেতে পারে:

transform = Affine.from_tiepoints(gps_points_local,gps_points_geo)
projected_data = transform.transform(local_point_cloud)

projected_coordinatesএখন ডাব্লুজিএস ৮৮, ইউটিএম, বা যে কোনও সমন্বয় ব্যবস্থা আপনার জিপিএস দ্বারা রেকর্ড করা আছে। এই পদ্ধতির একটি প্রধান বৈশিষ্ট্যটি হ'ল এটি যে কোনও সংখ্যক টাই পয়েন্ট (3 বা ততোধিক) এর সাথে ব্যবহার করা যেতে পারে এবং আরও বেশি টাই পয়েন্টগুলি ব্যবহার করা হয় নির্ভুলতা অর্জন করে। আপনি মূলত আপনার সমস্ত টাই পয়েন্টের মধ্যে সেরা ফিট খুঁজে পাচ্ছেন।


হ্যালো! আপনি উল্লেখ করেছেন যে প্রজ (Proj4) কাস্টম ট্রান্সফর্ম অংশটি পরিচালনা করতে পারে না? এর অর্থ কি gis.stackexchange.com/questions/357910 এ প্রযুক্তিগতভাবে কোনও খাঁটি প্রোজ উত্তর নেই ?
trusktr


0

স্থানীয় সমন্বয় ব্যবস্থাটি সনাক্ত করা সর্বদা সহজ, যেমনটি আমরা এখানে করেছি:

প্লেনে WGS84 উপবৃত্তাকার স্টেরিওগ্রাফিক প্রজেকশন [অজগর]

জিডিএল এখন জিসিপি পয়েন্ট ব্যবহার করে ভেক্টর ডেটা রূপান্তর করতে সক্ষম।


হ্যালো! আমি এই জিনিস নতুন। Gis.stackexchange.com/questions/357910 এ আমার প্রশ্নের জন্য আমার কী প্রয়োজন তা আসলে কোনও "স্টেরিওগ্রাফিক" প্রক্ষেপণ ?
trusktr

0

কয়েক সপ্তাহ আগে আমি একই সমস্যার মধ্যে আটকে গিয়েছিলাম, আমি পাইগন স্ক্রিপ্টটি আবিষ্কার করতে পারি যা সাহায্য করতে পারে। এখান থেকে আসল সমাধান

import pyproj
import math
import numpy as np
from statistics import mean
import scipy.optimize as optimize

#This function converts the numbers into text
def text_2_CRS(params):
    # print(params)  # <-- you'll see that params is a NumPy array
    x_0, y_0, gamma, alpha, lat_0, lonc = params # <-- for readability you may wish to assign names to the component variables
    pm = '+proj=omerc +lat_0='+ str(lat_0) +' +lonc='+ str(lonc) +' +alpha=' + str(alpha) + ' +gamma=' + str(
        gamma) + ' +k=0.999585495 +x_0=' + str(x_0) + ' +y_0=' + str(y_0) + ' +ellps=GRS80 +units=m +no_defs'
    return pm

#Optimisation function
def convert(params):
    pm = text_2_CRS(params)
    trans_points = []
    #Put your control points in mine grid coordinates here
    points_local = [[5663.648, 7386.58],
                    [20265.326, 493.126],
                    [1000, -10000],
                    [-1000, -10000],
                    [1331.817, 2390.206],
                    [5794, -1033.6],
                    ]
    # Put your control points here mga here
    points_mga = [[567416.145863305, 7434410.3451835],
                  [579090.883705669, 7423265.25196681],
                  [557507.390559793, 7419390.6658927],
                  [555610.407664593, 7420021.64968145],
                  [561731.125709093, 7431037.98474379],
                  [564883.285081307, 7426382.75146683],
                  ]
    for i in range(len(points_local)):
        #note that EPSG:28350 is MGA94 Zone 50
        trans = pyproj.transform(pyproj.Proj(pm), pyproj.Proj("EPSG:28350"), points_local[i][0], points_local[i][1])
        trans_points.append(trans)
    error = []
    #this finds the difference between the control points
    for i in range(len(points_mga)):
        x1 = trans_points[i][0]
        y1 = trans_points[i][1]
        x2 = points_mga[i][0]
        y2 = points_mga[i][1]
        error.append(math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2))

    print("Current Params are: ")
    with np.printoptions(precision=3, suppress=True):
        print(params)
    print("Current average error is: " + str(mean(error)) + " meters")
    print("String to use is: " + pm)
    print('')

    return mean(error)


#Add your inital guess
x_0 = 950
y_0 = -1200
gamma = -18.39841101
alpha=-0
lat_0 = -23.2583926082939
lonc = 117.589084840039


#define your control points
points_local = [[5663.648,7386.58],
          [20265.326,493.126],
          [1000,-10000],
          [-1000,-10000],
          [1331.817,2390.206],
          [5794,-1033.6],
          ]

points_mga = [[567416.145863305,7434410.3451835],
          [579090.883705669,7423265.25196681],
          [557507.390559793,7419390.6658927],
          [555610.407664593,7420021.64968145],
          [561731.125709093,7431037.98474379],
          [564883.285081307,7426382.75146683],
          ]


params = [x_0, y_0, gamma,alpha, lat_0, lonc]

error = convert(params)

print(error)

result = optimize.minimize(convert, params, method='Powell')
if result.success:
    fitted_params = result.x
    print(fitted_params)
else:
    raise ValueError(result.message)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.