我使用了一个非常有用的程序来获取空间数据并将其放入 SQL Server 数据库中。我很好奇是否有可能使用geometry
数据类型来找到彼此接壤的美国州?
编辑:我假设如果两个州彼此接壤,那么这些州的几何数据的相当一部分将是相同的(因为它们沿边界共享一个轮廓)
我使用了一个非常有用的程序来获取空间数据并将其放入 SQL Server 数据库中。我很好奇是否有可能使用geometry
数据类型来找到彼此接壤的美国州?
编辑:我假设如果两个州彼此接壤,那么这些州的几何数据的相当一部分将是相同的(因为它们沿边界共享一个轮廓)
我前段时间使用 SQL2005 做过这个,但我相信这个逻辑可能仍然适用。获得空间数据后,与您类似,我将其加载到 SQL 中。到达那里后,我决定分解并写出每个坐标(在我的情况下,纬度/经度存储在边界几何字段中)及其对应的状态到一个新表中。虽然不是完全必要的,但它帮助我查看了数据,并使处理逻辑不那么复杂。谈到这一点,我怀疑(但不确定)为不同州共享的边界列出的点将是为两个州列出的相同点(谢天谢地)。一旦我有了新的一对多(状态到坐标)表,下面的伪代码就解释了我做了什么。我的工作代码(在 .Net 中完成)具有此处未提及的复杂性,例如建立序列号、边界距离等。
大纲:
Loop through each State (StatePoints table)
Get all coords/points of current State (coords in my case are lat/long combos)
Loop through each coord of current State
_lat = row["Latitude"]
_long = row["Longitude"];
//Using the above, locate other States in the same table with shared Coords. Something like the following.
//the where condition state_id <> currState_id is simply to omit the current state's borders since you're only bordering Contiguous states.
strSQL = "SELECT state_id, Latitude, Longitude from ..." +
" WHERE (ROUND(Latitude, 6, 1) = " + _lat + ") AND (ROUND(Longitude, 6, 1) = " + _long + ") AND (state_id <> " + currState_id + ")" +
dtStateSharedPoints = db.ExecuteDataSet(CommandType.Text, strSQL).Tables[0];
//--------------------------------------------------
//Loop through the shared lat/long matches. Note: typically there will only be one,
//however several States can meet at a single point
//--------------------------------------------------
Loop through the shared lat/long matches (dtStateSharedPoints).
borderState_id = Convert.ToInt32(row["state_id"]);
strSQL = "INSERT INTO ContigStates(state_id, borderState_id, Latitude, Longitude) ..."
db.ExecuteNonQuery(CommandType.Text, strSQL);
一些县和州的边界位于水道边缘(不是中心)。根据您使用的数据,这些数据可能不会显示为连续的。您可能需要考虑这些。
当时我可能在这上面花了两天多的时间。除非您有其他原因,否则即使只需要一天的时间,当您将工时与美元进行比较时,从数据公司购买它可能更可行。你可以在这里找到相邻的县,如果你问的话,我相信他们会做州。除此之外,还没有买,我不知道该推荐谁……它可能值得一试。
我希望这有帮助