สองเท่าหรือทศนิยมสำหรับค่าละติจูด / ลองจิจูดใน C #


98

ประเภทข้อมูลที่ดีที่สุดที่จะใช้ในการจัดเก็บข้อมูลตำแหน่งทางภูมิศาสตร์ใน C # คืออะไร? ฉันจะใช้ทศนิยมเพื่อความแม่นยำ แต่การดำเนินการกับเลขทศนิยมทศนิยมจะช้ากว่าเลขทศนิยมฐานสอง (สองเท่า)

ฉันอ่านว่าส่วนใหญ่แล้วคุณจะไม่ต้องการความแม่นยำอีกต่อไปแล้ว 6 หรือ 7 หลักสำหรับละติจูดหรือลองจิจูด ความไม่แน่นอนของคู่ผสมมีความสำคัญหรือไม่หรือสามารถละเว้นได้หรือไม่?


6
ฉันจะถามคำถามตรงข้าม: ความแตกต่างของประสิทธิภาพมีความสำคัญหรือไม่หรือละเลยได้
Heinzi

1
ในฐานข้อมูลคุณควรใช้ "sql spatial data type" เพื่อจัดเก็บลองจิจูดและละติจูด
azhar_SE_nextbridge

8
โปรดสังเกตว่า. NET BCL เองใช้สองเท่าในคลาส GeoCoordinateซึ่งเป็นข้อบ่งชี้ที่ชัดเจนว่าความแม่นยำอาจเพียงพอ
Heinzi

1
TzdbZoneLocation ของ NodaTime ใช้สองเท่าเช่นกัน
Rick Davin

4
1) ฉันจะพิจารณาจุดคงที่ 2) เนื่องจากคุณมักจะต้องทำดำเนินการเกี่ยวกับวิชาตรีโกณมิติพิกัดทางภูมิศาสตร์และผู้ที่จะดำเนินการเฉพาะสำหรับdouble, doubleอาจจะเป็นแบบที่ดีที่สุด
CodesInChaos

คำตอบ:


121

ไปdoubleมีหลายเหตุผล

  • ฟังก์ชันตรีโกณมิติมีให้สำหรับคู่เท่านั้น
  • ความแม่นยำของสองเท่า (ช่วง 100 นาโนเมตร) นั้นไกลเกินกว่าที่คุณจะต้องการสำหรับค่า Lat / Lon
  • GeoCoordinate Classและโมดูลของบุคคลที่สาม (เช่นDotSpatial ) ยังใช้คู่สำหรับพิกัด

76

คู่มีความแม่นยำมากถึง 15 หลักทศนิยม สมมติว่าตัวเลขสามหลักเหล่านั้นจะอยู่ทางซ้ายของจุดทศนิยมสำหรับค่า lat / long (สูงสุด 180deg) ซึ่งจะทิ้งความแม่นยำ 12 หลักไว้ทางด้านขวา เนื่องจากองศาของละติจูด / ความยาวอยู่ที่ประมาณ 111 กม. 5 จาก 12 หลักเหล่านี้จะให้ความแม่นยำกับมิเตอร์ ตัวเลขอีก 3 หลักจะทำให้เรามีความแม่นยำเป็นมิลลิเมตร ตัวเลข 4 หลักที่เหลือจะทำให้เรามีความแม่นยำอยู่ที่ประมาณ 100 นาโนเมตร เนื่องจากสองครั้งจะชนะจากมุมมองของประสิทธิภาพและหน่วยความจำฉันจึงไม่เห็นเหตุผลที่จะพิจารณาใช้ทศนิยม


3
บวกหนึ่งสำหรับคำอธิบายโดยละเอียดและแม่นยำ
Najeeb

ตรงกับคำอธิบายที่ฉันต้องการเห็นขอบคุณ!
e4stwood

4

ฉันเคยเจอกับคำถามนี้มาแล้วเมื่อฉันเริ่มต้นด้วยการเขียนโปรแกรมอวกาศ ฉันอ่านหนังสือเล่มหนึ่งที่นำฉันไปสู่เรื่องนี้

//sql server has a really cool dll that deals with spacial data such like
//geography points and so on. 
//add this namespace
Using Microsoft.SqlServer.Types;

//SqlGeography.Point(dblLat, dblLon, srid)

var lat_lon_point = Microsoft.SqlServer.Types.SqlGeography.Point(lat, lon, 4326);

นี่เป็นวิธีที่ดีที่สุดเมื่อทำงานในแอปพลิเคชันของคุณด้วยข้อมูลระยะห่าง จากนั้นบันทึกข้อมูลใช้สิ่งนี้ใน sql

CREATE TABLE myGeoTable
{
LatLonPoint GEOMETRY 
}

มิฉะนั้นถ้าคุณใช้อย่างอื่นที่ไม่ใช่ sql เพียงแค่แปลงจุดเป็นเลขฐานสิบหกแล้วเก็บไว้ ฉันรู้ว่าหลังจากใช้ spacial มานานแล้วว่านี่ปลอดภัยที่สุด


ฉันมีปัญหาในการค้นหา LatLonPoint การอ้างอิงหรือแพ็คเกจใดที่คุณต้องรวมไว้หรือ 'การใช้งาน' อะไรในโครงการ c # ของคุณ (สมมติว่าสร้างตารางสำหรับ Identity model / c # code เนื่องจากประเภทนั้นไม่ได้ประเมินใน SSMS เช่นกัน) ขอบคุณล่วงหน้า!
คริส

1

สองเท่า

การรวมคำตอบเป็นวิธีที่ Microsoft แสดงตัวเองในไลบรารี SqlGeography

[get: Microsoft.SqlServer.Server.SqlMethod (IsDeterministic = true, IsPrecise = true)] Public System.Data.SqlTypes.SqlDouble Lat {get; } ค่าคุณสมบัติ SqlDouble A ค่า SqlDouble ที่ระบุละติจูด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.