ฉันจะดำเนินการเปลี่ยนรูปทางภูมิศาสตร์และพารามิเตอร์ 3 พารามิเตอร์ใน SQL Server 2012 ได้อย่างไร


10

ฉันมีตารางที่มีคอลัมน์ละติจูดลองจิจูด (NAD27) อยู่ในนั้น ฉันคำนวณคอลัมน์อีกสองคอลัมน์คือ X และ Y ซึ่งแทนตำแหน่ง Web Mercator (WGS84)

ขณะนี้ฉันกำลังใช้ Arcmap เพื่อทำสิ่งนี้โดยใช้การเปลี่ยนรูปทางภูมิศาสตร์ที่แนะนำสำหรับพื้นที่การศึกษา - การเปลี่ยนรูปทางภูมิศาสตร์ 3 พารามิเตอร์ (จุดศูนย์กลางทางภูมิศาสตร์) - เพื่อเปลี่ยนจาก NAD27 เป็น WGS84

ฉันต้องการทำสิ่งนี้อย่างสมบูรณ์ภายใน Sql Server 2012 จากสิ่งที่ฉันสามารถบอกได้ SQL Server ไม่รองรับการแปลงข้อมูลจากกล่อง ไม่มีใครรู้เกี่ยวกับห้องสมุด Sql ที่รองรับการเปลี่ยนรูปทางภูมิศาสตร์นี้? ฉันต้องการใช้ค่าสัมประสิทธิ์แบบเดียวกันใน Sql ที่ฉันใช้ใน Arcmap

ฉันยังต้องการฉายภาพจาก WGS84 lat / long เข้าสู่เว็บ Mercator ฉันเห็นสูตรนี้มีการใช้งานใน javascriptแต่ถ้ามีคนมีขั้นตอนการจัดเก็บ Sql ที่ทำเช่นนี้มันจะดีมาก


สำหรับความรู้ของฉันไม่มีการแก้ปัญหา OO ทำงานในขณะนี้สำหรับการแปลงตัวเลข วิธีที่ง่ายที่สุดในการสร้างมันในฐานข้อมูลจะใช้sharpmap.codeplex.com lib- หรือใช้รหัสที่มีอยู่แล้วแปลงเป็น T-SQL ที่ฉันลอง ...
simplexio

@simplexio ขอบคุณโชคดีกับการแปลง T-SQL?
Kirk Kuykendall

คุณต้องการให้พิกัดแปลงของคุณแม่นยำเพียงใด หรือความถูกต้องมีความสำคัญมากขนาดนั้น?
Mintx

@Mintx ฉันต้องการสร้างผลลัพธ์เดียวกันกับที่ฉันใช้ Arcmap
Kirk Kuykendall

1
แน่นอน. หากคุณสามารถเปลี่ยน db เป็น PostGIS ได้ก็จะรองรับการเปลี่ยนรูปแบบใหม่ เซิร์ฟเวอร์ MS SQL อาจเป็น db ที่ดีและมีการสนับสนุนที่ดี แต่ฉันต้อง postgresq เมื่อเรากำลังพูดถึงเครื่องมือที่สร้างไว้แล้ว
simplexio

คำตอบ:


5

เกี่ยวกับ javascript ไปยัง SQL นี่อาจเป็นวิธีที่คุณจัดการ:

SELECT  FromX, 
        FromY, 
        CASE WHEN FromX > 180 THEN NULL ELSE FromX * 0.017453292519943295 * 6378137.0 END AS mercatorX_lon2,
        CASE WHEN FromY > 90 THEN NULL ELSE 3189068.5 * LOG((1.0 + SIN(FromY * 0.017453292519943295)) / (1.0 - SIN(FromY * 0.017453292519943295))) END AS mercatorY_lat2
FROM TABLENAME

ฉันคิดว่าต่อไปนี้จะตอบคำถามแรกของคุณ จะต้องมีการตรวจสอบข้อผิดพลาดเล็กน้อย เพื่อช่วยเหลือคุณสามารถค้นหาสมการดั้งเดิมได้ที่นี่: http://www.colorado.edu/geography/gcraft/notes/datum/gif/molodens.gif

--fromTheta :column --radians
--fromLamda :column --radians
--fromH     :column --meters

DECLARE @fromA float = 6378206.4        --radius of earth, meters
DECLARE @fromF float =1.0/294.9786982   --Flattening
DECLARE @toA float =6378137.0           --radius of earth, meters
DECLARE @toF float = 1.0/298.257223563  --Flattening
DECLARE @dA float = @toA - @fromA       --change in equatorial radius
DECLARE @dX float = -8.0                --change in X, meters
DECLARE @dY float = 160.0               --change in Y, meters
DECLARE @dZ float = 176.0               --change in Z, meters
DECLARE @dF float = @toF-@fromF         --change in flattening
DECLARE @fromES float = 2.0*@fromF - @fromF*@fromF --first eccentricity squared
DECLARE @bda float = 1.0-@fromF         --polar radius divided by equatorial radius

--RM = (@fromA*(1-@fromES)/POWER(1-@fromES*sin(fromTheta)*sin(fromTheta), 1.5))

--RN = (@fromA/SQRT(1.00-@fromES*sin(fromTheta)*sin(fromTheta)))

SELECT 

((((-@dX*sin(fromTheta)*cos(fromLamda)-@dY*sin(fromTheta)*sin(fromLamda))+@dZ*cos(fromTheta))+@dA*(@fromA/SQRT(1.00-@fromES*sin(fromTheta)*sin(fromTheta)))*@fromES*sin(fromTheta)*cos(fromTheta)/@fromA)+@df*((@fromA*(1-@fromES)/POWER(1-@fromES*sin(fromTheta)*sin(fromTheta), 1.5))/@bda+(@fromA/SQRT(1.00-@fromES*sin(fromTheta)*sin(fromTheta)))*@bda)*sin(fromTheta)*cos(fromTheta))/((@fromA*(1-@fromES)/POWER(1-@fromES*sin(fromTheta)*sin(fromTheta), 1.5)) + fromH) AS deltaTheta,
(-@dX*sin(fromLamda)+@dY*cos(fromLamda))/((((@fromA/SQRT(1.00-@fromES*sin(fromTheta)*sin(fromTheta))) +fromH) * cos(fromTheta)) AS deltaLamda,
@dX*cos(fromTheta)*cos(fromLamda)+@dY*cos(fromTheta)*sin(fromLamda)+@dZ*sin(fromTheta)-@da*@fromA/(@fromA/SQRT(1.00-@fromES*sin(fromTheta)*sin(fromTheta)))+@dF*@bda*(@fromA/SQRT(1.00-@fromES*sin(fromTheta)*sin(fromTheta)))*sin(fromTheta)*sin(fromTheta) AS deltaH

FROM TABLENAME

แก้ไข: ตัวแปรคู่ที่ควรเป็นชื่อคอลัมน์และเครื่องหมายจุลภาคและวงเล็บที่ขาดหายไป

แก้ไข: หนึ่งวงเล็บเพิ่มเติม

ฉันทดสอบสูตรนี้แล้วและใช้การสุ่มคะแนนเทียบกับการแปลง ArcGIS จำไว้ว่าหน่วยของคุณอาจมีหน่วยเป็นฟุต / องศา โปรดจำไว้ว่าผลลัพธ์เหล่านี้คือเดลต้าดังนั้นคุณจะต้องเพิ่มค่าเหล่านั้นลงในค่าของคุณเพื่อให้ได้ผลลัพธ์สุดท้าย


1
ขอบคุณฉันคิดว่าต้องใช้ XYZ deltas หลังจากแปลง lat เป็นพื้นที่ XYZ ซึ่งกำเนิดจากแกน XY และ Z เป็นศูนย์กลางของโลก
Kirk Kuykendall

ฉันจะพิมพ์ gif นั้นแล้ววางมันไว้ที่ผนังด้านหน้าโต๊ะของฉัน
nickves

@KirkKuykendall วิธีนี้เป็น Molodensky ย่อที่ deltas ที่คุณได้รับกลับมาเป็น arc-seconds และสามารถนำไปใช้กับ lat / long เริ่มต้นของคุณเพื่อรับการแปลไปยัง datum เป้าหมายของคุณ ฉันไม่รู้จัก AOI ของคุณ แต่ geocentric มักเป็นวิธีที่แม่นยำที่สุด (แต่ง่ายที่สุด!) ที่จะได้รับจาก NAD27-> WGS84
Mintx

นอกจากนี้ควรสังเกต@dX @dY @dZค่าของไอค์ที่อาจแตกต่างกันไปขึ้นอยู่กับNAD_1927_To_WGS_1984วิธีการคำนวณแบบศูนย์รวมที่คุณเลือก
Mintx

1

นี่คือลิงค์ไปยังคำถามที่คล้ายกัน:

http://sqlspatialtools.codeplex.com/discussions/286893

ฉันคิดว่าคำตอบแรกอาจมีประโยชน์ในการเข้าใจสิ่งที่คุณทำได้และสิ่งที่คุณไม่สามารถทำได้ใน SQL Server และรู้วิธีการแก้ไขปัญหาของคุณ

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