আমি বেশ কিছুদিন ধরে এই সমস্যাটি নিয়ে গবেষণা করে চলেছি কারণ আমি এমন একটি অ্যাপ্লিকেশন তৈরি করেছি যা ব্যবহারকারীকে ড্র্যাগবক্সের ক্রিয়া বা ব্যবহারকারীদের প্রবেশের পরিমাণ পয়েন্টের মাধ্যমে আগ্রহের ক্ষেত্র আয়তক্ষেত্র তৈরি করতে দেয়। যখন আমি এই দু: সাহসিক কাজ শুরু করেছি তখন আমি ওপেনলায়ার্সে সম্পূর্ণ নতুন ছিলাম। ম্যানুয়ালি প্রবেশ করানো পরিসীমা পয়েন্টগুলির সাথে সমস্যাটি ছিল যে এওআই যদি আন্তর্জাতিক তারিখরেখাকে coveredেকে দেয় তবে আঁকানো আয়তক্ষেত্রটি বিশ্বজুড়ে ভুল পথে আঁকতে পারে। অসংখ্য স্ট্যাক এক্সচেঞ্জ ব্যবহারকারী এই সমস্যাটি সম্পর্কে কেবল একজন ওপেনলায়ার্স প্রতিক্রিয়াকারীকে জানাতে বলেছিলেন যে (এবং আমি এখানে প্যারাফ্রেস করছি) "ওপেনলায়ার্সের পয়েন্টগুলির আঁকানোর দিকনির্দেশক উদ্দেশ্যটি জানার কোনও উপায় নেই তাই এটি ডিফল্ট ..."। ওহ, আমাকে সেই প্রতিক্রিয়ার জন্য বিএস পতাকা তুলতে হবে কারণ আমি এখন ওপেনলায়ার্সকে বিপজ্জনক বলে যথেষ্ট শিখেছি এবং এই বিষয়টি আমার কাছে ঘটছে। তাদের প্রতিক্রিয়া নিয়ে আমার যে সমস্যাটি রয়েছে তা হ'ল আমি স্থানাঙ্কগুলি এমন এক পর্যায়ে লোড করি যা সংজ্ঞায়িত করে উপরের ডান দ্রাঘিমাংশ এবং অক্ষাংশের পাশাপাশি নিম্ন বাম দ্রাঘিমাংশ এবং অক্ষাংশকে নির্দিষ্ট করে। যদি ওপরের ডান দ্রাঘিমাংশ আইডিএলের পশ্চিম দিকে থাকে এবং নিম্ন বাম দ্রাঘিমাংশ আইডিএলের পূর্ব দিকে থাকে তবে এটি বেশ স্পষ্টতই স্পষ্ট যে ব্যবহারকারী কোন উপায়ে বহুভুজটি কাটাতে চান এবং তবুও ওপেনলায়ারস দ্রাঘিমাংশটি মানচিত্রের অঙ্কন এবং আঁকার বিষয়ে জোর দেয় বহুভুজ বিশ্বজুড়ে ভুল উপায়। ব্যাপ্তি ও সমস্যাযুক্ত ওপেনলায়ার্স পদ্ধতি কলের একটি মাত্রা নীচে দেখানো হয়েছে। যদি ওপরের ডান দ্রাঘিমাংশ আইডিএলের পশ্চিম দিকে থাকে এবং নিম্ন বাম দ্রাঘিমাংশ আইডিএলের পূর্বদিকে থাকে তবে এটি বেশ স্পষ্টতই স্পষ্ট যে ব্যবহারকারী কোন উপায়ে বহুভুজটি কাটাতে চান এবং তবুও ওপেনলায়ারস দ্রাঘিমাংশটি মানচিত্রের অঙ্কন এবং আঁকার বিষয়ে জোর দেয় বহুভুজ বিশ্বজুড়ে ভুল উপায়। ব্যাপ্তি ও সমস্যাযুক্ত ওপেনলায়ার্স পদ্ধতি কলের একটি মাত্রা নীচে দেখানো হয়েছে। যদি ওপরের ডান দ্রাঘিমাংশ আইডিএলের পশ্চিম দিকে থাকে এবং নিম্ন বাম দ্রাঘিমাংশ আইডিএলের পূর্ব দিকে থাকে তবে এটি বেশ স্পষ্টতই স্পষ্ট যে ব্যবহারকারী কোন উপায়ে বহুভুজটি কাটাতে চান এবং তবুও ওপেনলায়ারস দ্রাঘিমাংশটি মানচিত্রের অঙ্কন এবং আঁকার বিষয়ে জোর দেয় বহুভুজ বিশ্বজুড়ে ভুল উপায়। ব্যাপ্তি ও সমস্যাযুক্ত ওপেনলায়ার্স পদ্ধতি কলের একটি মাত্রা নীচে দেখানো হয়েছে।
// I would start out with the following entered values as an example
lonLL = 175.781; // minX
latLL = 13.992; // minY
lonUR = -165.937;// maxX
latUR = 25.945; // maxY
// I would then make the following call
var manCoordEntryExtent = ol.extent.boundingExtent([[lonLL,latLL], [lonUR, latUR]]);
// Looking at the resulting structure in the debugger I get:
0: -165.937 // minX
1: 13.992 // minY
2: 175.781 // maxX
3: 25.945 // maxY
length: 4
__proto__: []
আপনি দেখতে পাচ্ছেন অনুদৈর্ঘ্য স্থানাঙ্কগুলি বিপরীত হয় এবং এরপরে আপনি সম্পূর্ণ সমন্বয় কাঠামো তৈরি করেন, একটি বহুভুজ। একটি বহুভুজ ফিচার এবং তারপরে সেই বৈশিষ্ট্যটি কোনও ভেক্টরটিতে প্রয়োগ করুন এবং অবশেষে কেবল এটির পরিকল্পনা করুন যে বহুভুজটি বিশ্বজুড়ে ভুল পথে চলে।
আমার কেন এটি হচ্ছে তা বোঝার দরকার ছিল তাই আমি ওপেনলায়ারস 4 লাইব্রেরিতে এই ol.extent.boundingExant পদ্ধতিটি খনন করেছি।
/**
* Build an extent that includes all given coordinates.
*
* @param {Array.<ol.Coordinate>} coordinates Coordinates.
* @return {ol.Extent} Bounding extent.
* @api
*/
ol.extent.boundingExtent = function(coordinates) {
var extent = ol.extent.createEmpty();
for (var i = 0, ii = coordinates.length; i < ii; ++i) {
ol.extent.extendCoordinate(extent, coordinates[i]);
}
return extent;
};
It first calls ol.extent.createEmpty to initially create an extent structure
/**
* Create an empty extent.
* @return {ol.Extent} Empty extent.
* @api
*/
ol.extent.createEmpty = function() {
return [Infinity, Infinity, -Infinity, -Infinity];
};
// It then iterates thru the number of coordinates and fills in the extent structure values, however...
// Here is where the problem is. Notice the complete lack of any explanation as to what the hell this
// method is doing. Why is it doing what it does? All I know is that it cannot handle plots across
// the IDL and it corrupts your extent structure if you try.
/**
* @param {ol.Extent} extent Extent.
* @param {ol.Coordinate} coordinate Coordinate.
*/
ol.extent.extendCoordinate = function(extent, coordinate) {
if (coordinate[0] < extent[0]) {
extent[0] = coordinate[0];
}
if (coordinate[0] > extent[2]) {
extent[2] = coordinate[0];
}
if (coordinate[1] < extent[1]) {
extent[1] = coordinate[1];
}
if (coordinate[1] > extent[3]) {
extent[3] = coordinate[1];
}
};
// The solution was for me to test for IDL myself and if found then create an empty extent and populate it myself manually.
// Using the same extent coordinates as before
lonLL = 175.781; // minX
latLL = 13.992; // minY
lonUR = -165.937;// maxX
latUR = 25.945; // maxY
// I test for Dateline instance (Dont have to worry about the potential of there being a polygon covering both Meridian
// and Anti-meridian as a valid polygon is limited to a maximum size of just over 12 million square kilometers.)
if ((lonLL > 0.0) && (lonUR < 0.0)) {
// Manually build the coordinates for the Area calculation as the boundingExtent
// codepath corrupts an extent to be plotted across the Dateline
var manCoordEntryExtent = ol.extent.createEmpty();
manCoordEntryExtent[0] = lonLL;
manCoordEntryExtent[1] = latLL;
manCoordEntryExtent[2] = lonUR + 360.0;
manCoordEntryExtent[3] = latUR;
} else {
var manCoordEntryExtent = ol.extent.boundingExtent([[lonLL,latLL], [lonUR, latUR]]);
}
// Looking at the resulting structure in the debugger I get:
0: 175.781 // minX
1: 13.992 // minY
2: 194.063 // maxX
3: 25.945 // maxY
length: 4
__proto__: []
আমার কোডটি অঞ্চলটিকে গতিশীলভাবে গণনা করে যাতে আমি নির্ধারণ করতে পারি যে ব্যবহারকারী কোনও বৈধ আকারের AOI বহুভুজ তৈরি করেছে কিনা। যখন আমি একটি ড্র্যাগবক্স উত্পাদিত নির্বাচনের প্রক্রিয়া করছি তখন আমি ফলস্বরূপ জ্যামিতি কাঠামো এবং একটি ইপিএসজির জন্য স্থানাঙ্কগুলির জন্য অনুরোধ করছি: 4326 প্রক্ষেপণ যখন এটি মোড়ানো পৃথিবী থেকে স্থানাঙ্কগুলি প্রথম 180.0 ডিগ্রি পেরিয়ে স্থানাঙ্কগুলি বর্ধমান অব্যাহত রাখে এভাবে দীর্ঘতর গণনার জন্য কারণ 360.0 - 165.937 = 194.063। আমার অঞ্চল গণনা কোডেপথ নিম্নলিখিত আইডিএল পরীক্ষাটি ব্যবহার করে এবং ম্যানুয়ালি প্রবেশ করানো স্থানাঙ্কগুলির জন্য একই কোডপথটি ব্যবহার করার জন্য আমাকে স্থানাঙ্ক মানটি অনুকরণ করার দরকার ছিল যেন এটি ড্র্যাগবক্স getGeometry কল থেকে ফিরে এসেছে। আমি আসলে একটি জিওজসন বহুভুজের কাঠামো পরীক্ষা করছি যা 3 ম মাত্রার অ্যারে যার 1 ম মাত্রার রিং নম্বর হচ্ছে,
function getArea(coords, extent) {
// Test for Western side of Dateline instance
if (((coords[0][0][0] <= -180.0) && (coords[0][2][0] > -180.0)) ||
// Test for Eastern side of Dateline instance
((coords[0][0][0] < 180.0) && (coords[0][2][0] >= 180.0))) {
.
.
.
এই পরীক্ষাগুলি যদি এই মুহুর্তে পাস হয় তবে কোডটি আইডিএলের উপরের ক্ষেত্রটি গণনা করার জন্য আমার বিকাশিত অ্যালগরিদম ব্যবহার করে অন্যথায় এটি অন্য কোথাও এটি সাধারণ হিসাবে গণনা করে।
আমি এরপরে বহুভুজ তৈরি করতে এই পরিমাণটি ব্যবহার করি, তারপরে একটি বহুভুজ ফিচার, তারপরে কোনও বৈশিষ্ট্যটি কোনও ভেক্টরে প্রয়োগ করুন এবং অবশেষে এটি প্লট করুন এবং এবার এটি সঠিকভাবে চক্রান্ত করেছিল। ক্ষেত্রফল গণনার সমস্যা সমাধানের জন্য আমি যে সমাধানটি নিয়ে এসেছিলাম তা প্লট করার সমস্যাটিও ঠিক করেছিলাম।
হতে পারে এই সমাধানটি অন্য কাউকে সহায়তা করবে বা তাদের অন্য দিকে চিন্তা করতে সহায়তা করবে। সমাধানটি আমার কাছে এলো যখন আমি অবশেষে আইডিএলের সমস্যাটি দুটি ইস্যুতে ভাঙ্গতে সক্ষম হয়েছি। আসল ক্ষেত্রের গণনা একটি ইস্যু ছিল অন্যটি আইডিএলের উপরে বহুভুজের চক্রান্ত।