ওপেনলেয়ার্সের সাথে ডেটলাইনে বিভক্ত লাইনস্ট্রিংস


9

কয়েক বছর আগে আমি আন্তর্জাতিক তারিখের রেখাটি প্রায় মোড়ানো পোস্ট করেছিলাম এবং @ জেডিওলিভ প্রস্তাব দিয়েছিলাম যে আমি ডেটলাইনটিতে বৈশিষ্ট্যগুলি বিভক্ত করেছি। তাই চেষ্টা করেছি।

আমি যখন ডেটলাইনে আমার স্যাটেলাইট ট্র্যাকটি বিভক্তকরণের সাথে বিভক্ত করার চেষ্টা করি তখন ফিরে আসি null। আমি জানি আমি সঠিকভাবে বিভক্ত হচ্ছি কারণ যখন আমি গ্রিনিচ লাইনে বিভক্ত হব তখন আমি প্রত্যাশিত ফলাফল পাই।

যে কেউ জানেন যে আমি কীভাবে ওপেনলায়ার্সের সাথে ডেট লাইনের সাথে একটি লাইনস্ট্রিং প্রোগ্রামযুক্তভাবে ভাগ করতে পারি ? আমি আপনার কাছে যদি উদাহরণ কোড চাই।

আমি চেষ্টা করেছি wrapDateLineকিন্তু আমার ভেক্টর স্তরটি এমনভাবে সত্ত্বেও এটি ভেক্টর স্তরগুলিতে কাজ করছে বলে মনে হচ্ছে না:

vectorLayer = new OpenLayers.Layer.Vector("GroundTracks", {
    renderers: ['Canvas', 'VML'],
    wrapDateLine: true}); // <-- shoud be wraping.

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

আমার কোডটি এখানে:

var features = [];
var format = new OpenLayers.Format.WKT({
    'internalProjection': map.baseLayer.projection,
    'externalProjection': prjGeographic
});
var satTrack = format.read("LINESTRING (95.538611 13.286511, 94.730711 16.908947, 93.901095 20.528750, 93.043594 24.145177, 92.150978 27.757436, 91.214579 31.364666, 90.223791 34.965899, 89.165364 38.560019, 88.022401 42.145679, 86.772901 45.721205, 85.387568 49.284424, 83.826433 52.832413, 82.033480 56.361087, 79.927797 59.864504, 77.388419 63.333664, 74.227306 66.754285, 70.139140 70.102478, 64.605267 73.335774, 56.712904 76.373458, 44.881134 79.052803, 26.939886 81.047314, 02.704174 81.839241, -21.686285 81.101751, -39.887660 79.141947, -51.906937 76.480894, -59.912477 73.452897, -65.514482 70.225089, -69.645366 66.880243, -72.834535 63.461797, -75.393132 59.994131, -77.512464 56.491789, -79.315407 52.963919, -80.884039 49.416549, -82.275114 45.853820, -83.529088 42.278691, -84.675583 38.693355, -85.736827 35.099503, -86.729876 31.498490, -87.668095 27.891443, -88.562176 24.279331, -89.420849 20.663020, -90.251389 17.043303, -91.059999 13.420926, -91.852092 09.796602, -92.632515 06.171020, -93.405728 02.544857, -94.175960 -01.081217, -94.947343 -04.706542, -95.724045 -08.330456, -96.510402 -11.952298, -97.311065 -15.571400, -98.131162 -19.187081, -98.976502 -22.798638, -99.853829 -26.405335, -100.771148 -30.006378, -101.738172 -33.600889, -102.766925 -37.187866, -103.872602 -40.766117, -105.074803 -44.334175, -106.399366 -47.890158, -107.881153 -51.431559, -109.568417 -54.954914, -111.529886 -58.455253, -113.866668 -61.925160, -116.733085 -65.353081, -120.374635 -68.720132, -125.199754 -71.993642, -131.916790 -75.113368, -141.772276 -77.960803, -156.750096 -80.294831, -178.475596 -81.673196, 156.248392 -81.611421, 135.042323 -80.136505, 120.556535 -77.748172, 111.014840 -74.872356, 104.485504 -71.737081, 99.775637 -68.454400, 96.208126 -65.081545, 93.391438 -61.649716, 91.089380 -58.177038, 89.152970 -54.674643, 87.484294 -51.149703, 86.016609 -47.607042, 84.702947 -44.050030, 83.509299 -40.481112, 82.410411 -36.902133, 81.387093 -33.314533, 80.424442 -29.719485, 79.510644 -26.117981, 78.636145 -22.510889, 77.793053 -18.898997, 76.974710 -15.283040, 76.175371 -11.663718, 75.389950 -08.041709, 74.613831 -04.417680, 73.842693 -00.792294, 73.072378 02.833789, 72.298749 06.459907, 71.517566 10.085391, 70.724342 13.709564, 69.914194 17.331733, 69.081655 20.951185, 68.220447 24.567170, 67.323194 28.178891, 66.381031 31.785476, 65.383084 35.385943, 64.315735 38.979152, 63.161579 42.563725, 61.897893 46.137940, 60.494337 49.699551, 58.909396 53.245525, 57.084691 56.771602, 54.935577 60.271560, 52.334964 63.735923, 49.084320 67.149569, 44.859585 70.487030, 39.107498 73.702694, 30.852243 76.709182, 18.420695 79.329532, -00.339911 81.212453, -25.028018 81.831766)");

var featGreenwichLine = format.read("LINESTRING(0 -89, 0 89)");
var featDateLine = format.read("LINESTRING(180 -89, 180 89)");

features.push(featGreenwichLine);
features.push(featDateLine);
features.push(satTrack);

var resultsGreenwich = satTrack.geometry.splitWith(featGreenwichLine.geometry);
var resultsDateLine = satTrack.geometry.splitWith(featDateLine.geometry);

console.log(resultsGreenwich); //<--RETURNS EXPECTED RESULTS.
console.log(resultsDateLine);//<--RETURNS NULL.

vectorLayer.addFeatures(features);

আমার প্রশ্নটি এই প্রশ্নের সদৃশ নয় কারণ তারা কীভাবে ogr2ogr এ এটি করতে চান তা জানতে চান

হালনাগাদ:

আমি দেখতে পাই এমন একটি সাধারণ ডেটাসেটের মতো দেখতে (২৪ ঘন্টা স্যাটেলাইট ট্র্যাক): লিনস্ট্রিং wkt এখানে পাওয়া যাবে ।

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


আপনি ওপ্লেলেয়ারগুলির কোন সংস্করণ ব্যবহার করছেন?
প্লেক্স

@ প্লাক্স ২.১.1.১ (সর্বশেষতম)
ক্যাপ্ট্রাড্রাগন

1
তাদের এপিআই অনুসারে, র‌্যাপডেটলাইন কেবলমাত্র বেস স্তরটিতে ব্যবহার করা উচিত, তাই এটি ভেক্টর স্তরটিতে কাজ করে না এতে অবাক হওয়ার কিছু নেই। তবে এটি কীভাবে ভেক্টর স্তরটিতে কাজ করবে তা আমার কোনও ধারণা নেই। ডেটলাইনটি অতিক্রম করে এমন একাধিক গলিতে আমি নিজেই একই রকম সমস্যা নিয়ে আসছি।
প্লাক্স


সুন্দর সমাধান। দুর্ভাগ্যক্রমে এটি আমার সমস্যার জন্য প্রযোজ্য নয়, আমি বিশ্বাস করি যে আমার সমস্যাটি জিওসিভার-সাইডে বেশি, এবং আমার বহুভুজের মধ্যে স্থানাঙ্ক রয়েছে যা ডেটলাইনের "অন্যদিকে" রয়েছে, যেমন -180.00000000000003 90.00000190734869 যা আমি বিশ্বাস করি জিওসিভারে কিছু সমস্যা তৈরি করে। আমার মানচিত্রে এটি প্রদর্শিত করতে আমার সমস্যা হচ্ছে না (আমার এটির একটি ডাব্লুএমএস রয়েছে) তবে জিওসভারের কাছে ডাব্লুএফএস-কোয়েরিতে আমি এগুলি ফিল্টারবক্স হিসাবে ব্যবহার করতে চাই :)
প্লাক্স

উত্তর:


2

সমস্যাটি হ'ল ওপেনলায়ার্স দৃষ্টিকোণ থেকে আপনার বৈশিষ্ট্যটি তারিখের রেখাটি অতিক্রম করে না, সুতরাং আপনার বিভক্ত লাইনটি আপনার বৈশিষ্ট্যটিকে ছেদ করে না। আপনার তথ্য থেকে উদাহরণ:

..., -178.475596 -81.673196, 156.248392 -81.611421,...

আপনি -178 থেকে 156 এ যান এবং এটি ওপেনলায়ার দৃষ্টিকোণ থেকে তারিখের লাইনটি অতিক্রম করে না। তারিখের লাইনে বিভক্ত হওয়ার পরিবর্তে আপনার ন্যূনতম এক্স মানের বিভক্ত হওয়া উচিত।

// Build the splitting line based on the min and max coordinates of the vector to split
var minX = 999999999;
var minY = -20037508.34 // minimum value of the spherical mercator projection
var maxY = 20037508.34  // maximum value of the spherical mercator projection
//Extract the minimum X from the data as bounds seems to be rounded.
for(var i=0; i<satTrack.geometry.components.length; i++) {
    if(satTrack.geometry.components[i].x < minX)
        minX = satTrack.geometry.components[i].x;
}
var pointList = [
    new OpenLayers.Geometry.Point(minX, minY),
    new OpenLayers.Geometry.Point(minX, maxY)
];
var featDateLine = new OpenLayers.Feature.Vector(
    new OpenLayers.Geometry.LineString(pointList)
);

আমি এখানে একটি উদাহরণ তৈরি করেছি যা সফলভাবে আপনার উপগ্রহ ট্র্যাকটিকে 2 টি বৈশিষ্ট্যে বিভক্ত করেছে: http://jsfiddle.net/6XJ5A/

আপনার আপডেটে একাধিক লাইনের সাথে ডাব্লুকেটি ব্যবহার করার জন্য, কোনও সরল রেখা ব্যবহার না করে আপনাকে অবশ্যই পুরো ডেটাসেটটি অতিক্রম করতে হবে এবং ডেটলাইন জুড়ে যাওয়া সমস্ত স্থানাঙ্কের সাথে আপনার স্প্লিট লাইনটি তৈরি করতে হবে। কোনও মাল্টলাইনের অভ্যন্তরে ছোট লাইন তৈরি করে, আপনি সমস্ত স্থানাঙ্কে বিভক্ত করতে পারেন যা তারিখরেখার বাইরে যেতে হবে। আপডেট হওয়া উদাহরণটি এখানে: http://jsfiddle.net/Jc274/

এবং কোড:

// Build the splitting line based on the min and max coordinates of the vector to split
var pointList = [];
var lastPoint = satTrack.geometry.components[0];
//Extract the minimum X from the data as bounds seems to be rounded.
for (var i = 1; i < satTrack.geometry.components.length; i++) {
    if (Math.abs(satTrack.geometry.components[i].x - lastPoint.x) > 10000000) {
        pointList.push(satTrack.geometry.components[i]);
    }
    lastPoint = satTrack.geometry.components[i];
}

var lineList = [];
for(var i=0; i<pointList.length; i++) {
    lineList.push(new OpenLayers.Geometry.LineString([
        new OpenLayers.Geometry.Point(pointList[i].x, pointList[i].y-0.00001), 
        new OpenLayers.Geometry.Point(pointList[i].x, pointList[i].y+0.00001)
    ]));
}

var featDateLine = new OpenLayers.Feature.Vector(
new OpenLayers.Geometry.MultiLineString(lineList), null, split_style);

এটি আপনাকে ডেটলাইনটি "ক্রস" করে এমন সমস্ত পয়েন্টগুলিতে বিভক্ত রেখা ফিরিয়ে দেবে

দ্রষ্টব্য যে আমি 2 টি স্থানাঙ্ককে সংযোগ করতে মানচিত্রের ওপারে যে রেখাটি সরিয়েছি সেগুলি সরাতে স্থানাঙ্কগুলির মধ্য দিয়ে আমি লুপও করব:

for (var i = 0; i < resultsDateLine.length; i++) {
    // Remove the first (or last) point of the line, the one that cross the dateline
    if (Math.abs(resultsDateLine[i].components[0].x - resultsDateLine[i].components[1].x) > 10000000) {
        resultsDateLine[i].removeComponent(resultsDateLine[i].components[0]);
    }
    if (Math.abs(resultsDateLine[i].components[resultsDateLine[i].components.length - 1].x - resultsDateLine[i].components[resultsDateLine[i].components.length - 2].x) > 10000000) {
        resultsDateLine[i].removeComponent(resultsDateLine[i].components[resultsDateLine[i].components.length - 1]);
    }
    features.push(new OpenLayers.Feature.Vector(resultsDateLine[i], null, style_array[i]));
}

আপডেট: আমি বিভক্ত লাইনটি যুক্ত করার জন্য প্রথম উদাহরণটি আপডেট করেছি। আমি সেই অনুযায়ী ব্যাখ্যাও আপডেট করেছি। এই পদ্ধতির আপনার প্রদত্ত 24 ঘন্টা স্যাটেলাইট ট্র্যাকের বুলেট প্রুফ নয়, তবে আমি এটিতে কাজ করছি।

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


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

আপনি সমস্যার ভুল বোঝাবুঝি করছেন কারণ ..., -178.475596 -81.673196, 156.248392 -81.611421,...একেবারে ডেটলাইনটি অতিক্রম করে। এখানে দেখুন
ক্যাপ্ট্রাড্রাগন

আমাকে কোড এবং আমার ব্যাখ্যা আপডেট করুন। আমি জানি এটি ডেটা লাইনটি অতিক্রম করবে, তবে ওপেনলায়াররা এটি সমর্থন করে না। ওএল দৃষ্টিকোণ থেকে, এটি ডেটলাইনটি অতিক্রম করছে না।
জুলিয়ান-স্যামুয়েল ল্যাক্রিক্স

সেটা ঠিক. এটাই সমস্যা। আমাকে ওপেনলায়ার্সকে কৌতুক করতে হবে এবং লাইনটি বিভক্ত করতে হবে যাতে এটি প্রান্তের উপরে চলে যায় এবং অন্যদিকে যেখানে এটি অনুমিত হয় সেখানে অবিরত থাকবে।
ক্যাপ্ট্রাড্রাগন

2

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

আমার ফলাফলগুলি এখানে:

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


1

SplitWith ফাংশন পৃথিবীর 3-মাত্রিক আকৃতি সম্পর্কে জানে না। এটি কেবলমাত্র 2-মাত্রিক বিশ্বে পরিচালনা করে। আপনার ক্ষেত্রে ক্ষেত্রে, আপনার সব LINESTRINGএক্স স্থানাঙ্ক -180 এবং 180 মধ্যে তাই OpenLayers 'দ্বি-মাত্রিক দৃষ্টিকোণ থেকে, লাইন স্ট্রিং আসলে আপনার বিভক্ত জ্যামিতি (তারিখ লাইন) ক্রস করে না এবং এটি ফিরে তাই বলে null

আমি বিশ্বাস করি যে বিভাজন করতে আপনাকে কিছু কাস্টম কোড লিখতে হবে। আমি এমন একটি অ্যালগরিদম কল্পনা করছি যা আপনার শিখরের উপর দিয়ে লুপ করে, আউটপুট লাইনের স্ট্রিং তৈরি করে:

  • প্রত্যেকটি সংলগ্ন জোড়ের জন্য উল্লম্বগুলি নির্ধারণ করে যে তাদের মধ্যে বিভাগটি তারিখের রেখাটি অতিক্রম করে কিনা।
  • যদি এটি না হয় তবে সেগমেন্টটি এটির মতো রাখুন এবং এটিকে "বর্তমান" আউটপুট লাইনের স্ট্রিংয়ে যুক্ত করুন।
  • যদি এটি হয় তবে সেগমেন্টটি দুটি ভাগে ভাগ করুন। "বর্তমান" লাইন স্ট্রিংয়ের একটি অংশ যুক্ত করুন, একটি নতুন "বর্তমান" লাইন স্ট্রিং শুরু করুন এবং অন্য অংশটিকে এই নতুন অংশে যুক্ত করুন।

একটি যুগলম্ব তারিখের রেখাটি অতিক্রম করে কিনা তা নির্ধারণের জন্য একটি যুক্তিসঙ্গত হিউরিস্টিক এটি X স্থানাঙ্কের মধ্যে পার্থক্য 180 ডিগ্রির বেশি কিনা তা দেখতে হবে। (যদিও এটি ভুল হতে পারে, উদাহরণস্বরূপ, মেরু অঞ্চলে Maybe সম্ভবত আপনি এত ভাগ্যবান যে কোনও উচ্চতর অক্ষাংশ না পাওয়ার জন্য))

বিভাগটিকে দুটি অংশে বিভক্ত করার কাজটি লিনিয়ার ইন্টারপোলেশন হিসাবে সহজ হতে পারে (যদি আপনি ট্র্যাকের নির্ভুলতার বিষয়ে খুব বেশি যত্ন না করেন)। আপনি যখন সনাক্ত করেন যে বিভাগটি তারিখের রেখাটি অতিক্রম করে আপনি দ্বিতীয় প্রান্তের একটি অনুলিপি তৈরি করেন এবং এর এক্স স্থানাঙ্ককে সরিয়ে নিয়ে যান (360 ডিগ্রি যোগ করে বা বিয়োগ করে) তারপরে Y স্থানাঙ্ককে ফাঁক করে দিন।

সম্পাদনা : এখানে একটি জেএসফিডাল যা আপনার ডেটাতে উপরের অ্যালগরিদমটি দেখায়: http://jsfiddle.net/85vjS/


0

যদি এটি গ্রিনউইচের সাথে কাজ করে তবে এটি আপনার সিআরএসের সীমানার মধ্যে রয়েছে। সুতরাং আমি প্রথমে আপনি যে পোস্টটিতে ইঙ্গিত করছেন সেই পোস্টের মতো একই কাজের পরামর্শ দেবো:

var featDateLine = format.read("LINESTRING(179.99 -89, 179.99 89)");

এবং হয়ত

var featDateLine = format.read("LINESTRING(-179.99 -89, -179.99 89)");

অন্য পক্ষের জন্য

আর একটি সমাধান সিআরএসে কাজ করা যা ডেটলাইনে "বাহিরের বাইরে" নয় " তারপরে আপনার সমস্যা ছাড়াই আপনার ডেটা বিভক্ত করতে সক্ষম হওয়া উচিত।


আমি ইতিমধ্যে উভয় চেষ্টা করেছি LINESTRING(179.99 -89, 179.99 89)এবং LINESTRING(-179.99 -89, -179.99 89)কোনও ফল লাভ হয়নি। সিআরএস সম্পর্কিত, দুর্ভাগ্যক্রমে, এটি আমার উদ্দেশ্যটির জন্য কার্যকর হবে না কারণ আমি স্যাটেলাইট ট্র্যাকগুলি ম্যাপ করছি যা বহুবার বিশ্ব জুড়ে যায়। সুতরাং সমস্ত সিআরএস কোথাও বিভক্ত হয়ে গেছে এবং আমি যেখানেই বিভক্ত হয়েছি একই সমস্যা থাকবে। আপনার ইনপুট জন্য ধন্যবাদ।
ক্যাপ্ট্রাড্রাগন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.