মানচিত্রে দুই বা ততোধিক পয়েন্ট প্রদর্শন করতে কীভাবে অনুকূল জুম-স্তর গণনা করবেন


12

আমরা একটি স্থিতিশীল মানচিত্রে বেশ কয়েকটি চিহ্নিতকারী প্রদর্শন করতে চাই এবং গুগল মানচিত্রের মতো অনুকূল জুম-স্তর গণনা করতে চাই। আমরা ইতিমধ্যে সীমানা আয়তক্ষেত্র এবং মানচিত্রের কেন্দ্রবিন্দু গণনা করেছি তবে এখন পুরো আবদ্ধ আয়তক্ষেত্রটি প্রদর্শনের জন্য সঠিক জুমলেভেল গণনা করতে আমাদের একটি কঠিন সময় আছে। কেউ দয়া করে আমাদের সঠিক দিকে নির্দেশ করতে পারেন?


এটি খুব পরিশীলিত নয়, তবে কেন কেবল এমবিআরকে 120% দিয়ে গুণাবেন এবং এটিতে জুম করবেন না? অন্য কিছু আপনার "সর্বোত্তম" সংজ্ঞা উপর নির্ভর করে, তাই না?
থমএম

থমএম এর ধারণাকে +1 করুন। আর্কজিআইএস ঠিক এটিই করে।
রাগী ইয়াছার বারহুম

1
দুঃখিত, তবে এই এমবিআরটি কী?
রডরিগো

উত্তর:


5

জুম স্তরটি পেতে আপনার মানচিত্রের পিক্সেল মাত্রা জানতে হবে to গোলাকার ত্রৈমাসিকের স্থানাঙ্কগুলিতে আপনাকে নিজের গণিতও করতে হবে।

  1. দ্রাঘিমাংশকে দ্রাঘিমাংশে রূপান্তর করুন, গোলাকার ম্যারেটারকে দ্রাঘিমাংশ x, y।
  2. গোলাকার কর্টরেটে আপনার দুটি পয়েন্টের মধ্যে দূরত্ব পান।
  3. নিরক্ষীয় অঞ্চলটি প্রায় 40 মিটার দীর্ঘ প্রজেক্টড এবং টাইলগুলি 256 পিক্সেল প্রশস্ত, সুতরাং প্রদত্ত জুম স্তরে মানচিত্রটির পিক্সেল দৈর্ঘ্য প্রায় 256 * দূরত্ব / 40000000 * 2 ^ জুম । জুম = 0, জুম = 1, জুম = 2 চেষ্টা করুন যতক্ষণ না আপনার মানচিত্রের পিক্সেলের মাত্রার জন্য দূরত্বটি দীর্ঘ হয়।

1
আশা করি আপনি আসলে কী জিজ্ঞাসা করছেন আমি দূর থেকে বুঝতে পেরেছি। = \
মিশাল মিগুরস্কি

এই উত্তরটি খুঁজতে গিয়ে এই প্রশ্নটি পেয়েছি, ধন্যবাদ।
বেনিয়ামিনগোল্ডার

@ মিশালমিগুরস্কি আপনি কীভাবে গোলাকৃতির পারটারে 2 পয়েন্টের মধ্যকার দূরত্ব গণনা করবেন তা ব্যাখ্যা করতে পারেন? বিশেষত এক্স স্থানাঙ্ক ... আমি ধন্যবাদ stucked।
otmezger

5

এটি আমি প্রণীত C # কোড ব্যবহার করি :

    public void ZoomToArea (Bounds2 mapArea, float paddingFactor)
    {
        double ry1 = Math.Log((Math.Sin(GeometryUtils.Deg2Rad(mapArea.MinY)) + 1) 
            / Math.Cos(GeometryUtils.Deg2Rad(mapArea.MinY)));
        double ry2 = Math.Log((Math.Sin(GeometryUtils.Deg2Rad(mapArea.MaxY)) + 1) 
            / Math.Cos(GeometryUtils.Deg2Rad(mapArea.MaxY)));
        double ryc = (ry1 + ry2) / 2;
        double centerY = GeometryUtils.Rad2Deg(Math.Atan(Math.Sinh(ryc)));

        double resolutionHorizontal = mapArea.DeltaX / Viewport.Width;

        double vy0 = Math.Log(Math.Tan(Math.PI*(0.25 + centerY/360)));
        double vy1 = Math.Log(Math.Tan(Math.PI*(0.25 + mapArea.MaxY/360)));
        double viewHeightHalf = Viewport.Height/2.0f;
        double zoomFactorPowered = viewHeightHalf
            / (40.7436654315252*(vy1 - vy0));
        double resolutionVertical = 360.0 / (zoomFactorPowered * 256);

        double resolution = Math.Max(resolutionHorizontal, resolutionVertical) 
            * paddingFactor;
        double zoom = Math.Log(360 / (resolution * 256), 2);
        double lon = mapArea.Center.X;
        double lat = centerY;

        CenterMapOnPoint(new PointD2(lon, lat), zoom);
    }
  • mapArea: দীর্ঘ / ল্যাট কর্ডগুলিতে আবদ্ধ বাক্স (x = দীর্ঘ, y = ল্যাট)
  • paddingFactor: এটি থমএম উল্লেখ করে "120%" প্রভাব পেতে ব্যবহার করা যেতে পারে। 1.2 এর মান আপনাকে 120% পাবে।

মনে রাখবেন যে আমার ক্ষেত্রে zoomএকটি আসল নম্বর হতে পারে। ওয়েব মানচিত্রের ক্ষেত্রে আপনার একটি পূর্ণসংখ্যার জুম মান প্রয়োজন, সুতরাং (int)Math.Floor(zoom)এটির মতো আপনার ব্যবহার করা উচিত ।

অবশ্যই, এই কোডটি কেবলমাত্র ওয়েব মার্কেটর প্রক্ষেপণের ক্ষেত্রে প্রযোজ্য।


1
এর জন্য ধন্যবাদ. সেন্টারম্যাপঅনপয়েন্টের জন্য কোড পাওয়া যায়?
mcintyre321

পারফেক্ট! আমি ওস্মড্রয়েড এসডিকে বাউন্ডিংবক্সের জুম গণনা করতে এটি ব্যবহার করেছি এবং এটি কাজ করে :)
বিল্ডা

আমি এই গ্রন্থাগারগুলি কোথায় পাই? আমি কোনও জ্যামিতি ইউটিস বা বাউন্ডস 2 অ্যাসেম্বলিগুলি খুঁজে পাচ্ছি না। আমার কি ম্যাপারেটিভ থেকে কিছু ডাউনলোড করার দরকার আছে? আমি কেবল সেখানে একটি অ্যাপ্লিকেশন দেখি।
ডাওলার্স

@ ডাউনার্স GeometryUtilsকেবলমাত্র ডিগ্রিগুলিকে রেডিয়ান এবং পিছনে রূপান্তর করতে এখানে ব্যবহৃত হয়, এটি একটি সাধারণ গণিতের সূত্র। Bounds2মূলত কেবল একটি আয়তক্ষেত্রের কাঠামো। এই কোডটি সিউডোকোড হিসাবে সরাসরি অনুলিপি-যাযোগ্য কিছুের চেয়ে বেশি সরবরাহ করা হয়েছিল।
ইগোর ব্রেজক

1
এটি দুর্দান্ত ইগোরব্রেজসি- আপনাকে অনেক ধন্যবাদ! অন্যরা পাইথন কোডটি লিখছেন এমন ক্ষেত্রে আমি এটিকে পাইথনটিতে
চার্লি হফম্যান

1

আপনি যদি ওপেনলায়ার্স ব্যবহার করছেন তবে Map.getZoomForExtentমানচিত্রে সর্বোচ্চ জুম স্তরটি গণনা করতে পারেন যা পুরো মাত্রায় ফিট করতে পারে। extentচাহিদা মানচিত্রের অভিক্ষেপ করা। আপনি fill_factorমানচিত্রের প্রান্তে পয়েন্টগুলি প্রদর্শন এড়াতে max_zoomএবং সম্ভাব্য জুমটি সীমাবদ্ধ করতে একটি ব্যবহার করতে পারেন :

extent = extent.scale(1/fill_ratio);
var zoom = Math.min(map.getZoomForExtent(map_extent), max_zoom);
map.setCenter(extent.getCenterLonLat(), zoom);

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