অর্থো প্রজেকশন শৈল্পিক উত্পাদন করে


14

আমি কিগিস এবং "মহাকাশ থেকে বিশ্ব" ব্যবহার করে একটি গোলকের মতো দৃষ্টিভঙ্গি তৈরির চেষ্টা করছি -প্রজেক্ট http://spatialreferences.org/ref/sr-org/6980/ (প্রয়োজনীয় অর্থো-প্রজেকশন)। আর্কজিআইএস সঠিকভাবে আকারগুলিকে আবৃত করে তবে কিউজিআইএস (২.০১) কদর্য শিল্পী উত্পাদন করে।

এখানে চিত্র বর্ণনা লিখুন

আমাকে নিয়মিতভাবে বিভিন্ন কোণ দিয়ে গ্লোবস উত্পাদন করতে হবে সুতরাং যে কেউ এই সমস্যাটি কীভাবে ঠিক করবেন সে সম্পর্কে কী ধারণা আছে?


1
সম্পর্কিত কিউজিআইএস বাগ রিপোর্ট: hub.qgis.org/issues/2703
নট 101

অর্থোগ্রাফিক প্রজেকশনটি প্রি-লোড হওয়া কি খুব বড় প্রযুক্তিগত সমস্যা, যে কোনও দৃশ্যে পুনঃকেন্দ্রিক হতে পারে?

এটি প্রশ্নের উত্তর দেয় না। একটি কেন্দ্রীভূত প্রশ্ন জিজ্ঞাসা করতে শিখতে দয়া করে ট্যুরটি নিন।
জন পাওয়েল

উত্তর:


23

যেমনটি আন্দ্রে বলেছিলেন, এটি কাজ করার জন্য আপনাকে আপনার স্তরটি প্রজেক্ট করার আগে ক্রপ করতে হবে। আন্দ্রে একটি ম্যানুয়াল পদ্ধতি বর্ণনা করেছেন , যা প্রচুর ক্ষেত্রে ভাল কাজ করে: আপনার শেপফিলটি অরজিওথাল প্রবর্তনের মতো একই পরামিতিগুলির সাথে একটি আজিমুথাল সমতুল্য প্রক্ষেপণে প্রজেক্ট করুন, একটি ক্লিপিং বৃত্ত তৈরি করুন যা অর্থোগ্রাফিক প্রোজেকশনে দৃশ্যমান হবে এমন গোলার্ধকে কভার করে এবং এটি দিয়ে শেফফিলিটি ক্লিপ করুন। যাইহোক, এই পদ্ধতিটি মোটামুটি ম্যানুয়াল প্রচেষ্টা দরকার, এবং সমস্ত প্রক্ষেপণ প্যারামিটারের জন্য কাজ করে না, যেহেতু একটি অজিমুথাল ইক্যুইডিসিটিভ প্রজেকশনকে প্রকল্প করার জন্য অর্থোগ্রাফিক প্রজেকশন হিসাবে প্রজেক্ট করার অনুরূপ সমস্যা দেখা দিতে পারে।

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

ক্লিপিং স্তরটি 30 ° N, 110 ° E কেন্দ্রে একটি অর্থোগ্রাফিক প্রজেকশনটির মতো দেখায়:

স্ক্রিপ্টটি বর্তমানে নির্বাচিত স্তরটি ক্লিপিং স্তর দিয়ে ক্লিপ করে এবং ফলস্বরূপ স্তরটি প্রকল্পে যুক্ত করে। এর পরে স্তরটি orthographic প্রক্ষেপণে বাড়ে, বা উড়োজাহাজের সিআরএস-এ সংরক্ষণ করে অর্থোগ্রাফিক প্রজেকশনে প্রজেক্ট করা যেতে পারে:

এখানে স্ক্রিপ্ট। এটি আপনার পাইথন পথে সংরক্ষণের বিষয়ে নিশ্চিত হন, উদাহরণস্বরূপ 'cliportho.py' হিসাবে। তারপরে আপনি কিউজিআইএস পাইথন কনসোল ব্যবহার করে এটি আমদানি করতে পারেন import cliportho। একটি স্তর ক্লিপ করতে, কল করুন cliportho.doClip(iface, lat=30, lon=110, filename='A.shp')


import numpy as np
from qgis.core import *
import qgis.utils

import sys, os, imp


def doClip(iface, lat=30, lon=110, filename='result.shp'):
    sourceLayer = iface.activeLayer()

    sourceCrs = sourceLayer.dataProvider().crs()

    targetProjString = "+proj=ortho +lat_0=" + str(lat) + " +lon_0=" + str(lon) + "+x_0=0 +y_0=0 +a=6370997 +b=6370997 +units=m +no_defs"
    targetCrs = QgsCoordinateReferenceSystem()
    targetCrs.createFromProj4(targetProjString)

    transformTargetToSrc = QgsCoordinateTransform(targetCrs, sourceCrs).transform

    def circlePolygon(nPoints=20, radius=6370000, center=[0,0]):
        clipdisc = QgsVectorLayer("Polygon?crs=epsg:4326", "Clip disc", "memory")
        angles = np.linspace(0, 2*np.pi, nPoints, endpoint=False)
        circlePoints = np.array([ transformTargetToSrc(QgsPoint(center[0]+np.cos(angle)*radius, center[1]+np.sin(angle)*radius)) for angle in angles ])
        sortIdx = np.argsort(circlePoints[:,0])
        circlePoints = circlePoints[sortIdx,:]
        circlePoints = [ QgsPoint(point[0], point[1]) for point in circlePoints ]
        circlePoints.extend([QgsPoint(180,circlePoints[-1][1]), QgsPoint(180,np.sign(lat)*90), QgsPoint(-180,np.sign(lat)*90), QgsPoint(-180,circlePoints[0][1])])
        circle = QgsFeature()
        circle.setGeometry(QgsGeometry.fromPolygon( [circlePoints] ) )
        clipdisc.dataProvider().addFeatures([circle])
        QgsMapLayerRegistry.instance().addMapLayer(clipdisc)
        return clipdisc

    auxDisc = circlePolygon(nPoints = 3600)

    ###### The clipping stuff
    ## Code taken from the fTools plugin

    vproviderA = sourceLayer.dataProvider()
    vproviderB = auxDisc.dataProvider()

    inFeatA = QgsFeature()
    inFeatB = QgsFeature()
    outFeat = QgsFeature()

    fitA = vproviderA.getFeatures()

    nElement = 0  
    writer = QgsVectorFileWriter( filename, 'UTF8', vproviderA.fields(),
                                  vproviderA.geometryType(), vproviderA.crs() )

    index = QgsSpatialIndex()
    feat = QgsFeature()
    index = QgsSpatialIndex()
    fit = vproviderB.getFeatures()
    while fit.nextFeature( feat ):
        index.insertFeature( feat )

    while fitA.nextFeature( inFeatA ):
      nElement += 1
      geom = QgsGeometry( inFeatA.geometry() )
      atMap = inFeatA.attributes()
      intersects = index.intersects( geom.boundingBox() )
      first = True
      found = False
      if len( intersects ) > 0:
        for id in intersects:
          vproviderB.getFeatures( QgsFeatureRequest().setFilterFid( int( id ) ) ).nextFeature( inFeatB )
          tmpGeom = QgsGeometry( inFeatB.geometry() )
          if tmpGeom.intersects( geom ):
            found = True
            if first:
              outFeat.setGeometry( QgsGeometry( tmpGeom ) )
              first = False
            else:
              try:
                cur_geom = QgsGeometry( outFeat.geometry() )
                new_geom = QgsGeometry( cur_geom.combine( tmpGeom ) )
                outFeat.setGeometry( QgsGeometry( new_geom ) )
              except:
                GEOS_EXCEPT = False
                break
        if found:
          try:
            cur_geom = QgsGeometry( outFeat.geometry() )
            new_geom = QgsGeometry( geom.intersection( cur_geom ) )
            if new_geom.wkbType() == 0:
              int_com = QgsGeometry( geom.combine( cur_geom ) )
              int_sym = QgsGeometry( geom.symDifference( cur_geom ) )
              new_geom = QgsGeometry( int_com.difference( int_sym ) )
            try:
              outFeat.setGeometry( new_geom )
              outFeat.setAttributes( atMap )
              writer.addFeature( outFeat )
            except:
              FEAT_EXCEPT = False
              continue
          except:
            GEOS_EXCEPT = False
            continue
    del writer

    resultLayer = QgsVectorLayer(filename, sourceLayer.name() + " - Ortho: Lat " + str(lat) + ", Lon " + str(lon), "ogr")
    QgsMapLayerRegistry.instance().addMapLayer(resultLayer)

খুব প্রতিশ্রুতিবদ্ধ দেখাচ্ছে - আমি অবশ্যই এটি চেষ্টা করব এবং প্রতিক্রিয়া জানাতে খুশি হব। আমি আরকি প্রোগ্রামিংয়ে সামান্য হলেও কুইগিস প্রোগ্রামিং দিয়ে শুরু করি নি - তবে আপনি কী করছেন তা বোঝার চেষ্টা করব ;-) একটি প্লাগইন (সম্ভবত বেশ কয়েকটি স্তরের জন্য ব্যাচ ওয়ার্কিং) সম্ভবত সহায়ক হবে!
ব্যবহারকারী 1523709

1
এফওয়াইআই, "fTools" প্যাকেজ অপসারণের কারণে এই স্ক্রিপ্টটি আর QGIS 2.16 তে কাজ করে না।
স্পাইক উইলিয়ামস

2
@ স্পাইকওয়িলিয়ামস: fTools এর উপর নির্ভরতা অপসারণের জন্য আমি স্ক্রিপ্টটি আপডেট করেছি।
জেক

5

আপনাকে আপনার বহুভুজ ডেটা পৃথিবীর দৃশ্যমান অর্ধেকের কাছে ক্রপ করতে হবে, কারণ কিউজিআইএস নিজে নিজে এটি করে না।

আমি এখানে একটি টিউটোরিয়াল লিখেছি:

কিউজিআইএস-এ একটি মানচিত্র প্রজেক্ট করার পরে বহুভুজগুলি কোথায় গেল?


সম্পাদনা

আপনি যে চিত্রটি দেখান তা আসলে একটি অর্থো প্রক্ষেপণ নয়, এটি সমগ্র বিশ্বকে দেখায়, এবং কেবল বাহ্যিক স্থান থেকে দেখা যায় এমন দৃশ্যমান অর্ধেকও নয়। বিশ্বের মানচিত্রের জন্য, এখানে বর্ণিত হিসাবে কাটাটি কিছুটা সহজ:

কিউজিআইএস প্রদর্শন করে রবিনসন, মিলার নলাকার বা অন্যান্য প্রক্ষেপণ ব্যবহার করে প্রশান্ত মহাসাগরকে কেন্দ্র করে বিশ্ব দেশ আকারের ফাইলগুলি প্রদর্শন করে


থ্যাঙ্কস আন্দ্রে, সমস্যাটি বোঝার জন্য এটি বেশ সহায়ক ছিল - তবে যেহেতু আমাকে প্রায় প্রতিদিনের ভিত্তিতে এবং পরিবর্তনশীল দৃষ্টিকোণগুলির সাথে এর জন্য অনেকগুলি ম্যানুয়াল কাজ প্রয়োজন। আপনি কি কোনও প্লাগইন ইত্যাদি জানেন? আপনার সমাধান স্বয়ংক্রিয় করতে?
ব্যবহারকারী 1523709

একবার আপনি একটি ক্লিপিং সার্কেল তৈরি করলে, বাকী স্ক্রিপ্ট ব্যবহার করে বাকী কমান্ড লাইন স্তরে জিডিএল ব্যবহার করে করা যেতে পারে।
আন্দ্রেজে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.