এসকিউএল সার্ভারে কো-অর্ডিনেটস (দ্রাঘিমাংশ / অক্ষাংশ, গুগল ম্যাপ থেকে) সঞ্চয় করার সর্বোত্তম উপায় কী?


103

আমি এসকিউএল সার্ভার ২০০৮-এ একটি টেবিল ডিজাইন করছি যা ব্যবহারকারীর একটি তালিকা এবং একটি Google মানচিত্রের সমন্বয় (দ্রাঘিমাংশ এবং অক্ষাংশ) সংরক্ষণ করবে।

আমার কি দুটি ক্ষেত্রের প্রয়োজন হবে, বা এটি 1 দিয়ে করা যেতে পারে?

এই ধরণের ডেটা সংরক্ষণের জন্য সবচেয়ে ভাল (বা সবচেয়ে সাধারণ) ডেটা টাইপ কী?

উত্তর:


54

এসকিউএল সার্ভার ২০০৮-এ প্রবর্তিত নতুন স্পেসিয়াল ডেটা-টাইপগুলির দিকে একবার নজর দিন They এগুলি এ জাতীয় টাস্কের জন্য ডিজাইন করা হয়েছে এবং সূচীকরণ এবং ক্যোয়ারিংকে আরও সহজ এবং আরও দক্ষ করে তুলেছে।

অধিক তথ্য:


63

ন্যায্য সতর্কতা! জিওগ্রাফি টাইপ ব্যবহার করার পরামর্শ নেওয়ার আগে নিশ্চিত হয়ে নিন যে ডেটা অ্যাক্সেস করার জন্য আপনি লিনক বা সত্তা ফ্রেমওয়ার্ক ব্যবহার করার পরিকল্পনা করছেন না কারণ এটি সমর্থিত নয় (নভেম্বর ২০১০ পর্যন্ত) এবং আপনি দুঃখ পাবেন!

জুলাই 2017 আপডেট করুন

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


1
আসল উত্তর পোস্ট হওয়ার পরে, আমি এই নিবন্ধটি পেলাম জেসনফোলাস.com/blog/archive/2010/02/14/… একটি সম্ভাব্য কাজের বিষয়ে আলোচনা করা।
নরম্যান এইচ

56
সতর্কতা আর বৈধ নয়। EF এখন ভূগোল প্রকারের সমর্থন করে।
মার্সেলো ম্যাসন

1
নার্ভলেস ইএফ স্থানিক
প্রকারকে

1
হাইবারনেট 5 স্থানগত এখনও উদাহরণস্বরূপ নয় :(
ইউজিন

1
ফেয়ার সতর্কতা এখনও অস্তিত্ব ফ্রেমওয়ার্ক কোর 2.0 প্রয়োগ করে github.com/aspnet/EntityFrameworkCore/issues/1100
ono2012

29

আমি এসকিউএল সার্ভারের উত্তর জানি না তবে ...

ইন মাইএসকিউএল এটা হিসাবে সংরক্ষণFLOAT( 10, 6 )

এটি গুগল বিকাশকারী ডকুমেন্টেশন থেকে সরকারী প্রস্তাবনা ।

CREATE TABLE `coords` (
  `lat` FLOAT( 10, 6 ) NOT NULL ,
  `lng` FLOAT( 10, 6 ) NOT NULL ,
) ENGINE = MYISAM ;

19
প্রশ্নটি স্পষ্টভাবে এসকিউএল সার্ভারকে জানিয়েছে, মাইএসকিউএল নয়। এবং আপনি অবশ্যই তাদের মতো কেবল অক্ষাংশ এবং দ্রাঘিমাংশের একটি টেবিল চাইবেন না।
আরাকনিদ

2
সম্মত -বাজার উত্তর। নতুন জিওগ্রাফি স্থানিক প্রকারটি ব্যবহার করুন।
খাঁটি.ক্রোম


14
নির্ভুলতার কারণে আমি ভাসা ব্যবহার করব না। দশমিক (9,6) ব্যবহার করুন।
কাপ্তান

সেখানে প্রকৃত ক্ষেত্রে যেখানে কোথায় আছেন latএবং lngসুখ্যাতি georgraphy, এমনকি এসকিউএল 2014. উচ্চ ঘনত্ব ইনডেক্স উদাহরণস্বরূপ সঙ্গে: সব বিন্দু একটি আয়তক্ষেত্র withing হয় এটি। কেবলমাত্র আমি নিশ্চিত নই, আমি দেখতে পাচ্ছি যে গুগল ম্যাপস এখন 6 সংখ্যার পরিবর্তে 7 ব্যবহার করে?
নেনাড

22

আমি যেভাবে এটি করি: আমি অক্ষাংশ এবং দ্রাঘিমাংশ সঞ্চয় করি এবং তারপরে আমার কাছে একটি তৃতীয় কলাম রয়েছে যা 1 ম দুটি কলামের একটি স্বয়ংক্রিয়ভাবে প্রাপ্ত ভূগোল প্রকার। টেবিলটি এমন দেখাচ্ছে:

CREATE TABLE [dbo].[Geopoint]
(
    [GeopointId] BIGINT NOT NULL PRIMARY KEY IDENTITY, 
    [Latitude] float NOT NULL, 
    [Longitude] float NOT NULL, 
    [ts] ROWVERSION NOT NULL, 
    [GeographyPoint]  AS ([geography]::STGeomFromText(((('POINT('+CONVERT([varchar](20),[Longitude]))+' ')+CONVERT([varchar](20),[Latitude]))+')',(4326))) 
)

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


আমি যা খুঁজছিলাম তার জন্য দুর্দান্ত, আপনার কাছে ট্র্যাক / লাইনগুলির জন্য কিছু আছে
7:30 এগ্রি

আপনার দৃশ্যের উপর নির্ভর করে আরেকটি পদ্ধতির কাজও করতে পারে যা দীর্ঘ এবং ল্যাট সংরক্ষণ করে এবং তারপরে গতিশীলভাবে রানটাইমের সময় ফ্লাইতে ভৌগলিক অবজেক্ট তৈরি করে।
Zapnologica

1
দুর্দান্ত ধারণা তবে সচেতন হন যে আপনি যদি কারও অভিপ্রায় হয় তবে গণিত কলামগুলিতে স্থানিক সূচকগুলি তৈরি করতে পারবেন না।
hvaughan3

1
@ hvaughan3 আমি মনে করি আপনি যদি এটির একটি স্থির গণিত কলাম তৈরি করেন তবে আপনি করতে পারেন ।
নিকজি

2
ধন্যবাদ এবং +1, আপনার উত্তর আমাকে সাহায্য করেছে। তবে আমি মনে করি Pointপরিবর্তে এটি ব্যবহার করা ভাল STGeomFromText। উদাহরণস্বরূপ: [geography]::Point([Latitude], [Longitude], 4326)
default.kramer

21

যারা "এখানে একটি নতুন ধরণের, আমরা এটি ব্যবহার করি" বলেছিলেন তাদের পক্ষে আমি কন্ট্র্রিয়ান হিসাবে ঘৃণা করি। নতুন এসকিউএল সার্ভার ২০০৮ স্থানিক প্রকারের এর কিছু উপকার রয়েছে - যথা দক্ষতা, তবে আপনি অন্ধভাবে বলতে পারবেন না যে সর্বদা এই ধরণের ব্যবহার করুন। এটি সত্যিই কিছু বড় ছবির সমস্যার উপর নির্ভর করে।

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

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

আলাদাভাবে / একটি পৃথক স্থানে দীর্ঘ / ল্যাট সংরক্ষণ করা উভয়ই কার্যকর সমাধান এবং আপনার নিজের অবস্থার উপর নির্ভর করে একটি অপরটির পক্ষে পছন্দনীয়।


জিআইএস এবং স্থানিক ডেটা প্রসেসিংয়ে কমপক্ষে 2000 এর দশক থেকে দীর্ঘ ইতিহাস এবং মানক পাঠ্য, বাইনারি উপস্থাপনা রয়েছে। আপনি যদি স্থানিক ধরণের এবং মান উপস্থাপনা ব্যবহার না করেন তবে আপনি উল্লিখিত সমস্ত সমস্যার সমাধান করবেন
Panagiotis Kanavos

15

আপনি যা করতে চান তা হল অক্ষাংশ এবং দ্রাঘিমাংশকে নতুন এসকিউএল ২০০8 স্থানিক প্রকার -> জিওগ্রাফি হিসাবে সংরক্ষণ করুন।

এখানে একটি টেবিলের স্ক্রিন শট দেওয়া আছে, যা আমার কাছে রয়েছে।

Alt পাঠ্য http://img20.imageshack.us/img20/6839/zipcodetable.png

এই সারণীতে, আমাদের দুটি ক্ষেত্র রয়েছে যা ভূগোলের ডেটা সঞ্চয় করে।

  • সীমানা: এটি বহুভুজ যা পিন কোডের সীমানা
  • কেন্দ্রবিন্দু: এটি হল অক্ষাংশ / দ্রাঘিমাংশ বিন্দু যা এই বহুভুজটির ভিজ্যুয়াল মিডল পয়েন্ট উপস্থাপন করে।

আপনি এটি জিওগ্রাফি টাইপ হিসাবে ডাটাবেসে সংরক্ষণ করতে চান তার মূল কারণটি হ'ল আপনি তারপরে সমস্ত প্রাকৃতিক পদ্ধতিগুলি -> যেমন বন্ধ করে নিতে পারেন। পলিতে পয়েন্ট, দুটি পয়েন্টের মধ্যে দূরত্ব ইত্যাদি

বিটিডাব্লু, আমরা ল্যাট / লম্বা ডেটা পুনরুদ্ধার করতে এবং আমাদের এসকিএল ২০০৮ ডিবিতে এটি সঞ্চয় করতে গুগলের মানচিত্র এপিআই ব্যবহার করি - সুতরাং এই পদ্ধতিটি কার্যকর হয়।


1
এবং যদি আপনি এখনও ২০০৮ এ না থাকেন, বা আপনি যদি এসকিউএলসিই ব্যবহার করেন তবে কী হবে? দ্বিতীয়টি জিওগ্রাফি টাইপ সমর্থন করে না ...
ফ্রেটজে

3
যদি এসকিএলসিই বা <২০০৮ বাইনারি সমর্থন করে তবে ফলাফলগুলি ভেরিনারি এবং এটি সংরক্ষণের জন্য স্পেসিয়াল টুলস লাইব্রেরি ডেলিকে আপনার .NET কোডে এই বাইনারি ডেটার উপস্থাপনের বিরুদ্ধে স্থানিক গণনা করতে ব্যবহার করা সম্ভব। সেরা সমাধান নয়, তবে কিছু সমস্যার সম্ভাব্য সমাধান । (বর্গক্ষেত্রের স্থানিকের জন্য সংকেত .. d ডিএল ধরার জন্য)।
বিশুদ্ধ.ক্রোম

2
চিত্রের লিঙ্কটি নষ্ট হয়েছে
ব্রায়ান ডেনি

urgh :( কিছুই চিত্রাবলীর জন্য ধন্যবাদ। আমি বহু বছর ধরে আইএস ব্যবহার করি নি :( imgur.com
পুরোভাবে

1
-1, এই উত্তরটি চিত্র ব্যতীত অসম্পূর্ণ। দয়া করে এটি একটি নতুন চিত্র বা একটি পাঠ্য সারণীর বিবরণ দিয়ে প্রতিস্থাপন করা বা এই উত্তরটি মুছে ফেলার বিষয়ে বিবেচনা করুন।
ইলমারি করোনেন

11

এসকিউএল সার্ভারের স্থানিক সম্পর্কিত তথ্যের জন্য সমর্থন রয়েছে। আপনি http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx এ আরও দেখতে পারেন

পর্যায়ক্রমে আপনি তথ্য দুটি প্রাথমিক ক্ষেত্র হিসাবে সংরক্ষণ করতে পারেন, সাধারণত একটি ফ্লোট হ'ল বেশিরভাগ ডিভাইস দ্বারা প্রমিত স্ট্যান্ডার্ড ডেটা টাইপ এবং এটি গুগল মানচিত্রের জন্য পর্যাপ্ত পরিমাণের চেয়ে এক ইঞ্চি বা দুইয়ের মধ্যে যথেষ্ট সঠিক।


2

দ্রষ্টব্য : এটি সাম্প্রতিক এসকিউএল সার্ভারের উপর ভিত্তি করে একটি সাম্প্রতিক উত্তর,। নেট স্ট্যাক আপডেট

গুগল ম্যাপ থেকে অক্ষাংশ এবং দ্রাঘিমাংশ ভৌগলিক ডেটা টাইপের অধীনে এসকিউএল সার্ভারে পয়েন্ট (নোট মূলধন পি) ডেটা হিসাবে সংরক্ষণ করা উচিত।

বর্তমানে উপস্থিত তথ্য ধরে নেওয়া যাক একটি টেবিল সঞ্চিত Sampleকলাম অধীনে varchar যেমন latএবং lonকোয়েরি আপনি নিচে ভূগোল রূপান্তর সাহায্য করবে

alter table Sample add latlong geography
go
update Sample set latlong= geography::Point(lat,lon,4326)
go

PS: পরবর্তী সময় আপনি ফলাফল এবং বার্তাগুলি ট্যাব বাদ দিয়ে ভূগোলের ডেটা সহ এই টেবিলটিতে একটি নির্বাচন করুন, আপনি ভিজ্যুয়ালাইজেশনের জন্য নীচের মতো স্থানিক ফলাফল ট্যাবও পাবেন

এসএসএমএস জিও ফলাফল ট্যাব


0

আপনি যদি সত্ত্বা ফ্রেমওয়ার্ক 5 ব্যবহার করেন তবে <ব্যবহার করতে পারেন DbGeography। এমএসডিএন থেকে উদাহরণ:

public class University  
{ 
    public int UniversityID { get; set; } 
    public string Name { get; set; } 
    public DbGeography Location { get; set; } 
}

public partial class UniversityContext : DbContext 
{ 
    public DbSet<University> Universities { get; set; } 
}

using (var context = new UniversityContext ()) 
{ 
    context.Universities.Add(new University() 
        { 
            Name = "Graphic Design Institute", 
            Location = DbGeography.FromText("POINT(-122.336106 47.605049)"), 
        }); 

    context. Universities.Add(new University() 
        { 
            Name = "School of Fine Art", 
            Location = DbGeography.FromText("POINT(-122.335197 47.646711)"), 
        }); 

    context.SaveChanges(); 

    var myLocation = DbGeography.FromText("POINT(-122.296623 47.640405)"); 

    var university = (from u in context.Universities 
                        orderby u.Location.Distance(myLocation) 
                        select u).FirstOrDefault(); 

    Console.WriteLine( 
        "The closest University to you is: {0}.", 
        university.Name); 
}

https://msdn.microsoft.com/en-us/library/hh859721(v=vs.113).aspx

কিছু আমি তখন সঙ্গে লড়াই আমি ব্যবহার শুরু DbGeographyছিল coordinateSystemId। নীচের কোডটির একটি দুর্দান্ত ব্যাখ্যা এবং উত্সের জন্য নীচের উত্তরটি দেখুন।

public class GeoHelper
{
    public const int SridGoogleMaps = 4326;
    public const int SridCustomMap = 3857;

    public static DbGeography FromLatLng(double lat, double lng)
    {
        return DbGeography.PointFromText(
            "POINT("
            + lng.ToString() + " "
            + lat.ToString() + ")",
            SridGoogleMaps);
    }
}

https://stackoverflow.com/a/25563269/3850405


-4

আপনি যদি কেবল একটি ইউআরএল-তে স্থান পরিবর্তন করতে যাচ্ছেন তবে আমি অনুমান করি যে একটি ক্ষেত্র এটি করবে - যাতে আপনি একটি ইউআরএল তৈরি করতে পারেন

http://maps.google.co.uk/maps?q=12.345678,12.345678&z=6

তবে এটি দুটি টুকরো ডেটা হওয়ায় আমি এগুলিকে পৃথক ক্ষেত্রে সংরক্ষণ করব store


এই আমার ক্ষেত্রে। আমাকে স্থানাঙ্কগুলি কেবল একটি ক্ষেত্রে সংরক্ষণ করতে হবে এবং কমা দ্বারা পৃথক করা দরকার। আমি মনে করি যে কোনও একটি ক্ষেত্রের ধরণ হিসাবে একটি টেক্সট ব্যবহার করতে পারে। আপনি কি মনে করেন?
আমর

-10

উভয়ই ভাসা হিসাবে সংরক্ষণ করুন এবং তাদের.i.em এ অনন্য কী শব্দ ব্যবহার করুন

create table coordinates(
coord_uid counter primary key,
latitude float,
longitude float,
constraint la_long unique(latitude, longitude)
);

অক্ষাংশ এবং দ্রাঘিমাংশের জুটির একমাত্র অনন্য সেট রয়েছে তা নিশ্চিত করার জন্য। আপনি আপনার টেবিলে দু'বার সমন্বয় store 0,0 store সঞ্চয় করতে চান না, তাই না?
গ্রাভিটন

1
আপনি সম্ভবত এর মতো আলাদা আলাদা স্থানাঙ্কের টেবিলটি রাখতে চান না, বিশেষত স্বতন্ত্রতা সীমাবদ্ধতার সাথে এটি একটি রক্ষণাবেক্ষণের দুঃস্বপ্নের ক্ষেত্রে পরিচালনা করে যা দুটি অবস্থান একই পয়েন্টটিকে উল্লেখ করে, নির্বিঘ্নিত সারিগুলি পরিষ্কার করার কথা উল্লেখ না করে।
আরাকনিড

2
> আপনি সম্ভবত এর মতো আলাদা কোনও স্থানাঙ্ক টেবিল রাখতে চান না - মোটেও না? কখনো? আপনি কীভাবে এটি 1 ফিল্ডে সঞ্চয় করবেন? এসকিউএল ২০০ Sp স্পেশিয়াল টাইপ ব্যবহার না করে কয়েক মিলিয়ন মানুষের কি হবে?
সেলি

2
এই জাতীয় সীমাবদ্ধতা থাকা একটি খারাপ সিদ্ধান্ত। ধরুন বব যে ঘরে অ্যালিস থাকতেন, সেখানে থাকেন House Aএবং সেখানে চলে যান House B। শীঘ্রই বব তার ঠিকানা (অবস্থান) সংরক্ষণ করতে সক্ষম হবেনা, কারণ অ্যালিস এখনও তার আপডেট করেনি - বা কখনও করবে না।
jweyrich

@ স্যালি - তিনি যা বলেছিলেন তা নয়। তার মন্তব্য পড়ুন। তিনি বলেছিলেন যে পৃথক টেবিলে এক জোড়া মান রেখে যাওয়ার কোনও কারণ নেই । কেবল আসল / দীর্ঘটি মূল টেবিলের উপর রাখুন এবং একটি দ্বিতীয় টেবিলের ওভারহেড এবং সমস্ত জিনস সংরক্ষণ করুন।
নিকজি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.