我使用了一个非常有用的程序来获取空间数据并将其放入SQL Server数据库中。我很好奇是否有可能使用geometry
数据类型来查找彼此相邻的美国州?
编辑:我假设如果两个状态相互接近,那些状态的几何数据的相当一部分将是相同的(因为它们沿着它们的边界共享轮廓)
答案 0 :(得分:1)
我前段时间使用SQL2005做过这个,但我相信逻辑可能仍然适用。得到了空间数据,类似于我加载到SQL中。在那里,我决定分解并将每个Coord(在我的情况下,存储在边界geom字段中的lat / long)写入一个新表中。虽然不是完全必要的,但它帮助我查看数据并使得进程逻辑不那么复杂。谈到这一点,我怀疑(但不确定)为不同国家共享的边界列出的点数将与两个州列出的点相同(幸运的是)。一旦我有了新的一对多(状态到坐标)表,下面的伪代码就解释了我的所作所为。我的工作代码(在.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);
有些县和州有水道边缘(不是中心)的边界。根据您使用的数据,这些数据可能不会显示为连续的。你可能需要考虑这些。
我当时可能花了两天多的时间。除非你有其他理由,否则即使只花了一天时间,当你将工时与美元进行比较时,从数据公司购买这个产品可能更为可行。你可以得到连续的县here,如果你问的话,我相信他们会做各州。除此之外,没有买它,我不知道推荐谁...它可能值得一试。
我希望这会有所帮助