আরকিপিতে দুটি জ্যামিতির তুলনা করছেন?


18

আমি তাদের মধ্যে পার্থক্য সনাক্ত করার জন্য দুটি পৃথক বৈশিষ্ট্য শ্রেণীর তুলনা করার চেষ্টা করছি (একটি পৃথক ফাংশনের ধরণের)। আমার বেসিক ওয়ার্কফ্লো:

  1. আমি সার্চকার্সার ব্যবহার করে জ্যামিতিগুলি বের করি
  2. দুটি বৈশিষ্ট্য শ্রেণীর জ্যামিতিগুলি জিওজেএসএন হিসাবে একটি পরিবর্তিত __geo_interface__( ভেলভলন্ডন থেকে পেয়েছেreturn {'type': 'Polygon', 'coordinates': [[((pt.X, pt.Y) if pt else None) for pt in part] for part in self]} ) ব্যবহার করে সংরক্ষণ করুন । এটি ভাগ করা জ্যামিতি অবজেক্টটি এড়ানোর জন্য যা ইএসআরআই কার্সারগুলির সাথে ব্যবহার করে এবং গভীর অনুলিপি তৈরি করতে অক্ষমতা (এটি সম্পর্কে gis.stackex بدل আলোচনা সম্পর্কে এখানে কিছু আলোচনা)।
  3. একটি অনন্য শনাক্তকারীর উপর ভিত্তি করে দুটি বৈশিষ্ট্য বর্গের জ্যামিতিগুলি পরীক্ষা করুন। উদাহরণস্বরূপ, FC1 OID1 জ্যামিতিকে FC2 OID1 জ্যামিতির সাথে তুলনা করুন। ইএসআরআই অবজেক্ট উদাহরণ হিসাবে জ্যামিতিটি পেতে কল করুন arcpy.AsShape()( গর্তযুক্ত বহুভুজগুলি পড়ার জন্য সংশোধিত (উপরে পয়েন্ট 2 দেখুন) সাথে return cls(Array([map(lambda p: Point(*p) if p is not None else Point(), part) for part in coordinates]))তুলনা geom1.equals(geom2)করুন জ্যামিতি শ্রেণিতে নির্দেশিত হিসাবে কেবল ।

আমি জ্যামিতিতে 140 ডলার পরিবর্তনগুলি খুঁজে পেতে আশা করি, তবে আমার স্ক্রিপ্টটি জোর দিয়ে বলছে 430 রয়েছে I আমি জিওজেএসনের উপস্থাপনাগুলি যাচাই করার চেষ্টা করেছি এবং সেগুলি অভিন্ন, তবুও জ্যামিতি শ্রেণি সমান () তা বলতে অস্বীকার করেছে।

একটি উদাহরণ নীচে:

>>> geom1geoJSON 
{'type': 'Polygon', 'coordinates': [[(-122.8423481559999, 47.060497293000083), (-122.84239755599992, 47.059262423000064), (-122.84416913599989, 47.059309693000046), (-122.84416913599989, 47.060497293000083), (-122.8423481559999, 47.060497293000083)]]}
>>> geom2geoJSON 
{'type': 'Polygon', 'coordinates': [[(-122.8423481559999, 47.060497293000083), (-122.84239755599992, 47.059262423000064), (-122.84416913599989, 47.059309693000046), (-122.84416913599989, 47.060497293000083), (-122.8423481559999, 47.060497293000083)]]}
>>> geom1 = arcpy.AsShape(geom1geoJSON)
>>> geom2 = arcpy.AsShape(geom2geoJSON)
>>> geom1.equals(geom2)
False
>>> geom2.equals(geom1)
False

এখানে প্রত্যাশিত আচরণটি সত্য হওয়া উচিত (মিথ্যা নয়)।

আমি ogr জ্যামিতিতে স্থানান্তরিত করার আগে কারও কি কোনও পরামর্শ আছে? (আমি ogr.CreateGeometryFromGeoJSON হিসাবে দ্বিধাগ্রস্থ () একটি স্ট্রিং প্রত্যাশা করে এবং আরকি-র __geo_interface__একটি অভিধান প্রত্যাবর্তন করে এবং আমার মনে হয় যে আমি অতিরিক্ত জটিলতা যুক্ত করছি।

নিম্নলিখিত উত্সগুলি সহায়ক হিসাবে দেখা গেছে, যদিও তারা প্রশ্নের উত্তর দেয় না:

  1. arcpy.Geometry প্রশ্ন এখানে gis.stackexchange.com এ যা আমার লেখায় উপরে লিঙ্ক করা হয়েছিল।
  2. আরকিসিস ডটকম ফোরামগুলি থেকে আরপির পলিগন শ্রেণিতে ত্রুটি (স্পষ্টতই আর্কজিআইএস 10.0 এ প্রচুর নির্ভুল ত্রুটি রয়েছে যা তাত্ত্বিকভাবে 10.1 এ স্থির হয়েছে তবে আমি এটি যাচাই করতে পারছি না, 10.0 এসপি 5 এ আপনি এখনও ত্রুটিটি পেয়েছেন)।

উত্তর:


12

সমস্যাটি সম্ভবত ভাসমান পয়েন্ট নির্ভুলতার একটি । আপনার ক্ষেত্রে আপনি ইতিমধ্যে আরকি ব্যবহার করে জ্যামিতিগুলি বের করে নিয়েছেন এবং সেগুলি আপনার আরআইডির সাথে মেলে।

আনন্দের সাথে যেহেতু আপনি আরকি ইনস্টল করে পেয়েছেন আপনি অসাধারণ, যা সংখ্যার অ্যারের সেটগুলির তুলনা করা সহজ করে easy এই ক্ষেত্রে আমি numpy.allclose ফাংশনটি প্রস্তাব করব , যা নম্পুটি 1.3.0 এ উপলব্ধ (আর্কজিআইএস 10 দিয়ে ইনস্টল করা)।

আপনি উপরে যে নমুনাগুলি দিয়েছেন তা থেকে

geom1geoJSON = {'type': 'Polygon', 'coordinates': [[(-122.8423481559999, 47.060497293000083), (-122.84239755599992, 47.059262423000064), (-122.84416913599989, 47.059309693000046), (-122.84416913599989, 47.060497293000083), (-122.8423481559999, 47.060497293000083)]]}
geom2geoJSON = {'type': 'Polygon', 'coordinates': [[(-122.8423481559999, 47.060497293000083), (-122.84239755599992, 47.059262423000064), (-122.84416913599989, 47.059309693000046), (-122.84416913599989, 47.060497293000083), (-122.8423481559999, 47.060497293000083)]]}

import numpy as np

close = np.allclose(np.array(geom1geoJSON["coordinates"]), np.array(geom2geoJSON["coordinates"]), atol=1e-7)
#Returns True

atolশব্দ সহনশীলতা মান নির্দিষ্ট করে।

মনে রাখবেন যে আপনার মোটেও ব্যবহার arcpy.AsShapeকরা উচিত নয় । কখনো। আমি যেমন এই প্রশ্নে উল্লেখ করেছি (/ নির্লজ্জ প্লাগ) আর্কজিআইএস-এ একটি পরিচিত বাগ রয়েছে যা জ্যামিতিগুলি যখন কোনও সমন্বয় ব্যবস্থা ছাড়াই তৈরি করা হয় ( env.XYToleranceপরিবেশের পরিবর্তনশীল সেট করার পরেও ) এটি ছাঁটাই করে দেয় । এটি arcpy.AsShapeএড়ানোর কোনও উপায় নেই। ভাগ্যক্রমে geometry.__geo_interface__বিদ্যমান জ্যামিতিগুলি থেকে সঠিক জ্যামিতিগুলি বের করা হয় (যদিও এটি @ জেসনশায়ারের কাছ থেকে কোনও সমাধান ছাড়াই জটিল বহুভুজ পরিচালনা করে না)।


ধন্যবাদ. আমি এটি করতে নিম্পী ব্যবহার করার কথা ভাবি নি। আর একটি সমাধান দশমিক মডিউলটি ব্যবহার করছে এবং এর মাধ্যমে কাজ করছে বলে মনে হচ্ছে তবে এর জন্য আরও অনেক বেশি কাজ প্রয়োজন।
মিশালিস অভ্রাম

আমি মনে করি যে numpy.allclose() rtolপ্যারামিটারটি 0 তে সেট করা গুরুত্বপূর্ণ হবে ডিফল্টরূপে এটি 1e-05 এবং অ্যারের মানগুলি বড় হলে এটি একটি বড় সহনশীলতার দিকে নিয়ে যেতে পারে: stackoverflow.com/a/57063678/1914034
রাডার

11

স্থানাঙ্ক নির্ভুলতা এখানে একটি গুরুত্বপূর্ণ বিবেচনা হতে চলেছে। ভাসমান পয়েন্ট সংখ্যাগুলি সঠিকভাবে সংরক্ষণ করা যায় না।

আপনি যদি বৈশিষ্ট্য তুলনা সরঞ্জামটি ব্যবহার করেন তবে এটি কি ডিফল্ট এক্সওয়াই সহনশীলতা ব্যবহার করে প্রত্যাশিত ফলাফল নিয়ে আসে?


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

আমি ডিফল্ট সহনশীলতার সাথে ফিচারের তুলনা সরঞ্জামটি চেক করেছি (8.983e-009 যা বেশ ছোট তবে এটি একটি ফাইল জিডিবি) এবং এটি কিছু পরিবর্তনগুলি রিপোর্ট করে তবে সঠিকটি নয়। বিশেষত, এটি বলে যে এখানে ge৯ জ্যামিতির পরিবর্তন রয়েছে (আমি আগের তুলনায় ভাল ধারণা করি) তবে মনে হয় যে ওআইডি হ'ল অনন্য বৈশিষ্ট্যগুলি সনাক্ত করার উপায় (পুরাতন OID1 এবং নতুন OID1 অনুসন্ধান করা) যা সত্য নয় (আমি এটি ব্যবহারের জন্য সেট করে রেখেছি) আমার আরআইডিটি বাছাই হিসাবে তবে এটি পছন্দ করে না)। তাই ড্রইং বোর্ডে ফিরে আসুন।
মিশালিস অভ্রাম

4

পাশে @ blah328 উত্তর, আপনি hava পছন্দ প্রতিবেদন ট্যাবুলার মূল্যবোধ ও ক্ষেত্র সংজ্ঞা সঙ্গে পার্থক্য এবং মিল দুটি টেবিল তুলনা করতে ছক তুলনা

উদাহরণ:

import arcpy
from arcpy import env
arcpy.TableCompare_management(r'c:\Workspace\wells.dbf', r'c:\Workspace
\wells_new.dbf', 'WELL_ID', 'ALL', 'IGNORE_EXTENSION_PROPERTIES', 'WELL_DEPTH 0.001',
'#','CONTINUE_COMPARE', r'C:\Workspace\well_compare.txt' 

ধন্যবাদ যখন আমি অ্যাট্রিবিউট ডেটার তুলনা করার চেষ্টা করব তখন আমি এটি সন্ধান করব। আপাতত, দেখে মনে হচ্ছে আমি জ্যামিতির তুলনা করতে পারছি না, যা আরও গুরুত্বপূর্ণ।
মিশালিস অভ্রাম

3
def truncateCoordinates(myGeometry)
    trucated_coords = []
    partnum = 0

    for part in (myGeometry):
        for pnt in myGeometry.getPart(partnum):
            if pnt:
                trucated_coords.append("{:10.4f}".format(pnt.X))
                trucated_coords.append("{:10.4f}".format(pnt.Y))
             else:
                continue
        partnum += 1     
    return truncated_coords

যদি .equals()ফাংশনটি প্রত্যাশিতভাবে কাজ না করে এবং / অথবা স্থানাঙ্কগুলি আর্কজিআইএসে কিছুটা পরিবর্তন করা হয় তবে আপনি এক্সওয়াই স্থানাঙ্ককে ম্যাসেজ করতে পারেন, তারপরে জ্যামিতির স্ট্রিং সমতুল্য তুলনা করুন। লক্ষ্য করুন, truncateCoordinates()চতুর্থ দশমিক স্থান ছাড়িয়ে সমস্ত মান বন্ধ করে দিন।

geom1 = truncateCoordinates(feature1.Shape)
geom2 = truncateCoordinates(feature2.Shape)

geom1 == geom2

@ ক্লিভিস- জ্যামিতির তুলনা করার এটি একটি উপায়, তবে আপনি ঠিক একই জ্যামিতির সাথে তুলনা করার সময় জ্যামিতি.ইকুয়ালসের (জ্যামিতি) সত্য হওয়া উচিত বলে মনে হয়। স্থানাঙ্কগুলি ছিন্ন করা এক অর্থে একটি হ্যাক of সম্ভবত ইএসআরআইকে ভাসমানের পরিবর্তে দশমিক () টাইপ ব্যবহার করা শুরু করতে হবে যদি তারা অভ্যন্তরীণভাবে ভাসমান পয়েন্টের মানগুলি সঠিকভাবে পরিচালনা করতে না পারে তবে তাদের সমান স্ট্রিং হিসাবে উপস্থাপন করতে পারে।
মিশালিস অভ্রাম

1

আপনি "ARE_IDENTICAL_TO" ওভারল্যাপ_ টাইপ প্যারামিটার দিয়ে স্তর দ্বারা স্তর নির্বাচন করুন (ডেটা ম্যানেজমেন্ট) সরঞ্জামটি ব্যবহার করতে পারেন, নির্বাচনটি স্যুইচ করুন , সারি গণনাটি পরীক্ষা করুন এবং তারপরে আপত্তি বা অন্য কোনও প্রাসঙ্গিক তথ্য সংগ্রহ করতে সারিগুলির মধ্য দিয়ে লুপ করুন।

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