teleinfor
路人甲
路人甲
  • 注册日期2004-09-14
  • 发帖数45
  • QQ
  • 铜币242枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:3671回复:10

[讨论]如何为通过一点point创建的三个扇形进行标注?

楼主#
更多 发布于:2007-12-17 09:52
<P>通过一个给定的经纬度(x,y),可以创建三个扇形区域,方位角分别相差120度,扇形角度60度。 我想为每一个扇形进行标注显示,请问如何显示呢???</P>
<P>比如显示:扇区1、扇区2、扇区3,分别在各自的扇形朝向显示。我现在的标注总是标注在圆心上面。</P>
<P>请坛子里的xd帮忙出招。谢谢了!最近坛子里的人气不旺啊。。。</P><img src="images/post/smile/dvbbs/em11.gif" /><img src="images/post/smile/dvbbs/em11.gif" /><img src="images/post/smile/dvbbs/em11.gif" /><img src="images/post/smile/dvbbs/em12.gif" /><img src="images/post/smile/dvbbs/em12.gif" />
喜欢0 评分0
teleinfor
路人甲
路人甲
  • 注册日期2004-09-14
  • 发帖数45
  • QQ
  • 铜币242枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2007-12-28 13:25
<P>这里有个VB版本的绘制扇区的给你直接用吧。免得改写了 :)</P>
<BLOCKQUOTE>
<P>'创建扇区<BR>Private Function FeatureFactoryCell(ByVal longitude As Double, ByVal latitude As Double, <BR>ByVal angle As Integer, ByVal Lac As Integer, ByVal sectorSign As Integer) As Feature</P>
<P><BR>Dim FeatureRegion As Feature<BR>Dim FeatureCircular As Feature<BR>Dim FeatureSector  As Feature<BR>Dim pointCenter  As New Point<BR>Dim pointTemp  As New Point<BR>Dim pointRegion As New Points<BR>Dim angleInteger As Integer<BR>Dim angleMod As Integer<BR>Dim angleTemp1 As Integer<BR>Dim angleTemp2 As Integer</P>
<P>pointCenter.Set longitude, latitude</P>
<P>If (angle < 0 Or angle > 360) Then<BR> MsgBox "基站小区角度存在误差"<BR> End If</P>
<P>'增加扇区的中心点<BR>pointTemp.Set longitude, latitude<BR>pointRegion.Add pointTemp</P>
<P>'三角形的右上角坐标,并添加到点集<BR>angleTemp1 = angle + 30</P>
<P>If (angleTemp1 > 360) Then<BR>   angleTemp1 = angleTemp1 - 360<BR>End If</P>
<P>  angleInteger = angleTemp1 \ 90<BR>  angleMod = angleTemp1 Mod 90<BR>  </P>
<P><BR>    Select Case angleInteger<BR>        Case 0<BR>            pointTemp.Set longitude + distanceRegion * Sin(angleMod / 180 * 3.14159265358979), <BR>latitude + distanceRegion * Cos(angleMod / 180 * 3.14159265358979)<BR>        Case 1<BR>            pointTemp.Set longitude + distanceRegion * Cos(angleMod / 180 * 3.14159265358979), <BR>latitude - distanceRegion * Sin(angleMod / 180 * 3.14159265358979)<BR>        Case 2<BR>            pointTemp.Set longitude - distanceRegion * Sin(angleMod / 180 * 3.14159265358979), <BR>latitude - distanceRegion * Cos(angleMod / 180 * 3.14159265358979)<BR>        Case 3<BR>            pointTemp.Set longitude - distanceRegion * Cos(angleMod / 180 * 3.14159265358979), <BR>latitude + distanceRegion * Sin(angleMod / 180 * 3.14159265358979)<BR>        Case 4<BR>            pointTemp.Set longitude + distanceRegion * Sin(angleMod / 180 * 3.14159265358979), <BR>latitude + distanceRegion * Cos(angleMod / 180 * 3.14159265358979)<BR>    <BR>    End Select</P>
<P>pointRegion.Add pointTemp</P>
<P>'三角形的左上角坐标,并添加到点集<BR>    angleTemp1 = angle - 30</P>
<P>If (angleTemp1 < 0) Then<BR>   angleTemp1 = angleTemp1 + 360<BR>End If</P>
<P>    angleInteger = angleTemp1 \ 90<BR>    angleMod = angleTemp1 Mod 90</P>
<P><BR>    Select Case angleInteger<BR>        Case 0<BR>            pointTemp.Set longitude + distanceRegion * Sin(angleMod / 180 * 3.14159265358979), <BR>latitude + distanceRegion * Cos(angleMod / 180 * 3.14159265358979)<BR>        Case 1<BR>            pointTemp.Set longitude + distanceRegion * Cos(angleMod / 180 * 3.14159265358979), <BR>latitude - distanceRegion * Sin(angleMod / 180 * 3.14159265358979)<BR>        Case 2<BR>            pointTemp.Set longitude - distanceRegion * Sin(angleMod / 180 * 3.14159265358979), <BR>latitude - distanceRegion * Cos(angleMod / 180 * 3.14159265358979)<BR>        Case 3<BR>            pointTemp.Set longitude - distanceRegion * Cos(angleMod / 180 * 3.14159265358979), <BR>latitude + distanceRegion * Sin(angleMod / 180 * 3.14159265358979)<BR>        Case 4<BR>            pointTemp.Set longitude + distanceRegion * Sin(angleMod / 180 * 3.14159265358979), <BR>latitude + distanceRegion * Cos(angleMod / 180 * 3.14159265358979)<BR>    End Select</P>
<P>pointRegion.Add pointTemp</P>
<P>If sectorSign = 1 Then</P>
<P>    Set FeatureRegion = Map1.FeatureFactory.CreateRegion(pointRegion)<BR>    Set FeatureCircular = Map1.FeatureFactory.CreateCircularRegion(miCircleTypeMap, pointCenter, 0.1, , 15)   '(圆形)<BR>    Set FeatureSector = Map1.FeatureFactory.IntersectFeatures(FeatureRegion, FeatureCircular) '(组合图元)</P>
<P>Else<BR>    Set FeatureRegion = Map1.FeatureFactory.CreateRegion(pointRegion)<BR>    Set FeatureCircular = Map1.FeatureFactory.CreateCircularRegion(miCircleTypeMap, pointCenter, 0.3, , 15)  '(圆形)<BR>    Set FeatureSector = Map1.FeatureFactory.IntersectFeatures(FeatureRegion, FeatureCircular) '(组合图元)</P>
<P>End If<BR>  <BR>  '连接数据库,设置扇区样式</P>
<br>
<P>   Dim SQL As String<BR>   Dim cn As New ADODB.Connection<BR>   Dim rs As New ADODB.Recordset</P>
<P>cn.Provider = "Microsoft.Jet.OLEDB.4.0"<BR>cn.ConnectionString = "Data Source=" ; App.Path ; "\data.mdb"<BR>cn.Open<BR>SQL = "select LAC,RED,BLUE,GREEN from laccolor"<BR>Set rs = New ADODB.Recordset<BR>Set rs.ActiveConnection = cn<BR>rs.Open SQL<BR>rs.MoveFirst</P>
<P>While Not rs.EOF<BR>If Lac = rs.Fields.Item("LAC") Then<BR>FeatureSector.Style.RegionColor = RGB(rs.Fields.Item("RED"), rs.Fields.Item("BLUE"), rs.Fields.Item("GREEN"))<BR>'rs.MoveLast<BR>End If<BR>rs.MoveNext<BR>Wend</P>
<P>rs.Close<BR>cn.Close<BR> <BR> Set FeatureFactoryCell = FeatureSector</P>
<P>End Function</P></BLOCKQUOTE>
举报 回复(0) 喜欢(0)     评分
teleinfor
路人甲
路人甲
  • 注册日期2004-09-14
  • 发帖数45
  • QQ
  • 铜币242枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2007-12-27 17:07
你图元的标注是如何控制位置的?
举报 回复(0) 喜欢(0)     评分
teleinfor
路人甲
路人甲
  • 注册日期2004-09-14
  • 发帖数45
  • QQ
  • 铜币242枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2007-12-27 17:05
<P>OK.回头我整理一下,给你贴代码出来。看来你是做直放站GIS维护管理软件?我是做网络规划优化数据分析软件。</P>
<P>以前用VB的,现在专用VC了。</P>
举报 回复(0) 喜欢(0)     评分
heling234
路人甲
路人甲
  • 注册日期2005-01-16
  • 发帖数4
  • QQ
  • 铜币118枚
  • 威望0点
  • 贡献值0点
  • 银元0个
4楼#
发布于:2007-12-27 14:30
我是通过上面给图元属性值的。
举报 回复(0) 喜欢(0)     评分
heling234
路人甲
路人甲
  • 注册日期2005-01-16
  • 发帖数4
  • QQ
  • 铜币118枚
  • 威望0点
  • 贡献值0点
  • 银元0个
5楼#
发布于:2007-12-27 14:30
<P>  On Error GoTo UpdateErr<BR>    <BR>  <BR>    Dim Daytem1 As String<BR>    Dim Monthtem1 As String<BR>    Dim Yeartem1 As String<BR>    Dim Time1 As String</P>
<P>    <BR>    Daytem1 = Day(DTPicker1.Value)<BR>    Monthtem1 = Month(DTPicker1.Value)<BR>    Yeartem1 = Year(DTPicker1.Value)</P>
<P>    <BR>    If Val(Daytem1) >= 0 And Val(Daytem1) <= 9 Then Daytem1 = "0" ; Daytem1<BR>    If Val(Monthtem1) >= 0 And Val(Monthtem1) <= 9 Then Monthtem1 = "0" ; Monthtem1<BR>    If Val(Yeartem1) >= 0 And Val(Yeartem1) <= 9 Then Yeartem1 = "0" ; Yeartem1<BR>    Time1 = Yeartem1 ; Monthtem1 ; Daytem1<BR>  <BR>  <BR>  faulty_reg.Recordset.Fields("设备编号").Value = datPrimaryRS.Recordset.Fields("设备编号").Value<BR>  faulty_reg.Recordset.Fields("直放站名").Value = datPrimaryRS.Recordset.Fields("直放站名").Value<BR>  faulty_reg.Recordset.Fields("类型").Value = datPrimaryRS.Recordset.Fields("类型").Value<BR>  faulty_reg.Recordset.Fields("设备厂商").Value = datPrimaryRS.Recordset.Fields("设备厂商").Value<BR>  faulty_reg.Recordset.Fields("设备型号").Value = datPrimaryRS.Recordset.Fields("设备型号").Value<BR>  faulty_reg.Recordset.Fields("覆盖场所").Value = datPrimaryRS.Recordset.Fields("覆盖场所").Value<BR>  faulty_reg.Recordset.Fields("主从类型").Value = datPrimaryRS.Recordset.Fields("主从类型").Value<BR>  faulty_reg.Recordset.Fields("故障次数").Value = 1<BR>  faulty_reg.Recordset.Fields("故障时间").Value = Val(Time1)<BR>  <BR>  faulty_reg.Recordset.UpdateBatch adAffectAll<BR>    cmdAdd.Enabled = True<BR>    cmdUpdate.Enabled = False<BR>    cmdRefresh.Enabled = False<BR>    cmdClose.Enabled = True<BR>  Exit Sub<BR>UpdateErr:<BR>  MsgBox Err.Description</P>
举报 回复(0) 喜欢(0)     评分
heling234
路人甲
路人甲
  • 注册日期2005-01-16
  • 发帖数4
  • QQ
  • 铜币118枚
  • 威望0点
  • 贡献值0点
  • 银元0个
6楼#
发布于:2007-12-27 14:28
能把代码给出来吗?或发到我邮箱(<a href="mailthl130@163.com" target="_blank" >hl130@163.com</A>), 谢谢!!我画过,但是三扇区不是很一致。
举报 回复(0) 喜欢(0)     评分
teleinfor
路人甲
路人甲
  • 注册日期2004-09-14
  • 发帖数45
  • QQ
  • 铜币242枚
  • 威望0点
  • 贡献值0点
  • 银元0个
7楼#
发布于:2007-12-27 13:49
<P>回楼上的xd,当然可以说说了,思路如下:</P>
<P>1、通过给定坐标(x,y),首先创建一个圆形区域feature=FeatureFactory.CreateCircularRegion 方法,圆形的半径你自己确定</P>
<P>2、在通过给定点,创建一个三角形区域(FeatureFactory.CreateRegion 方法)pt1(x,y),pt2(x,y),pt3(x,y)这个三角形大一点,扇形角度通过它控制,然后和圆形取交集就可以了。FeatureFactory.IntersectFeatures 方法。具体pt2/pt3你可以根据需要定位到指定位置,比如利用sin/cos函数等等计算出它的位置就行。</P>
<P>如有疑问,欢迎讨论交流!</P>
举报 回复(0) 喜欢(0)     评分
heling234
路人甲
路人甲
  • 注册日期2005-01-16
  • 发帖数4
  • QQ
  • 铜币118枚
  • 威望0点
  • 贡献值0点
  • 银元0个
8楼#
发布于:2007-12-27 13:35
<P>请问你的扇形是怎么画出来的,能说说吗?</P>
举报 回复(0) 喜欢(0)     评分
teleinfor
路人甲
路人甲
  • 注册日期2004-09-14
  • 发帖数45
  • QQ
  • 铜币242枚
  • 威望0点
  • 贡献值0点
  • 银元0个
9楼#
发布于:2007-12-22 21:56
<P>根据一个点创建的三个扇形区域,扇形区域根据需要进行了颜色填充的。如何控制标注位置呢??</P>
<P>比如说(x,y)一点,我创建了3个扇形区域对象,每个区域都想都有自己的field值。</P>
举报 回复(0) 喜欢(0)     评分
上一页
游客

返回顶部