Google Drawing API多边形数组javascript

时间:2016-09-11 14:09:46

标签: javascript arrays google-maps google-maps-api-3

在多边形中需要重复最后的起点,以便在数组后面输入GeoJSON:

{
    "type": "Polygon",
    "coordinates": [
        [
            [15.99609375, 62.0215281910076],
            [-9.140625, 51.1793429792893],
            [12.12890625, 37.0200982013681],
            [44.12109375, 37.7185903255882],
            [49.5703125, 59.5343180010956],
            [15.99609375, 62.0215281910076]
        ]
    ]
}

在我的代码中,我不重复它并从我的地图中获取:

{
    "type": "Polygon",
    "coordinates": [
        [
            [15.99609375, 62.0215281910076],
            [-9.140625, 51.1793429792893],
            [12.12890625, 37.0200982013681],
            [44.12109375, 37.7185903255882],
            [49.5703125, 59.5343180010956]
        ]
    ]
}

你能告诉我,我怎样才能在数组末尾添加第一个值arr [0]?

    for(var i = 0; i < arr.length; i++)
    {
      shape=arr[i];

          tmp=new goo.Polygon({paths:this.mm_(shape.geometry)});
          break;

     tmp.setValues({map:map,id:shape.id})
     shapes.push(tmp);

    }
  return shapes;

整个代码如下所示:

<script type='text/javascript'>//<![CDATA[

  function initialize()
  {
      var goo             = google.maps,
          map_in          = new goo.Map(document.getElementById('map_in'),
                                        { zoom: 6,
                                          center: new goo.LatLng(52.344, 18.048)
                                        }),

          shapes          = [],
          selected_shape  = null,
          // drawman         = new goo.drawing.DrawingManager({map:map_in}),

          drawman = new google.maps.drawing.DrawingManager({
          map: map_in,
                drawingMode: goo.drawing.OverlayType.POLYGON,
                    drawingControl: true,
                    drawingControlOptions: {
                        position: goo.ControlPosition.TOP_CENTER,
                      drawingModes: [goo.drawing.OverlayType.POLYGON]
                  }
          })

          byId            = function(s){return document.getElementById(s)},
          clearSelection  = function(){
                              if(selected_shape){
                                selected_shape.set((selected_shape.type
                                                    ===
                                                    google.maps.drawing.OverlayType.MARKER
                                                   )?'draggable':'editable',false);
                                selected_shape = null;
                              }
                            },
          setSelection    = function(shape){
                              clearSelection();
                              selected_shape=shape;

                                selected_shape.set((selected_shape.type
                                                    ===
                                                    google.maps.drawing.OverlayType.MARKER
                                                   )?'draggable':'editable',true);

                            },
          clearShapes     = function(){
                              for(var i=0;i<shapes.length;++i){
                                shapes[i].setMap(null);
                              }
                              shapes=[];
                            };
      // map_in.bindTo('center',map_out,'center');
      // map_in.bindTo('zoom',map_out,'zoom');

      goo.event.addListener(drawman, 'overlaycomplete', function(e) {
          var shape   = e.overlay;
          shape.type  = e.type;
          goo.event.addListener(shape, 'click', function() {
            setSelection(this);
          });
          setSelection(shape);
          shapes.push(shape);
        });

      goo.event.addListener(map_in, 'click',clearSelection);
      goo.event.addDomListener(byId('clear_shapes'), 'click', clearShapes);
      goo.event.addListener(drawman, 'overlaycomplete', function(){
        var data=IO.IN(shapes,false);byId('data').innerHTML=JSON.stringify(data[0]);});
  }

  var IO={
    //returns array with storable google.maps.Overlay-definitions
    IN:function(arr,//array with google.maps.Overlays
                encoded//boolean indicating whether pathes should be stored encoded
                ){
        var shapes     = [],
            goo=google.maps,
            shape,tmp;

        for(var i = 0; i < arr.length; i++)
        {
          shape=arr[i];
          tmp={type:this.t_(shape.type),id:shape.id||null};

          switch(tmp.type){
             case 'POLYGON':
                tmp.coordinates=this.m_(shape.getPaths(),encoded);
               break;
         }
         shapes.push(tmp);
      }
      return shapes;
    },
    //returns array with google.maps.Overlays
    OUT:function(arr,//array containg the stored shape-definitions
                 map//map where to draw the shapes
                 ){
        var shapes     = [],
            goo=google.maps,
            map=map||null,
            shape,tmp;

        for(var i = 0; i < arr.length; i++)
        {
          shape=arr[i];

              tmp=new goo.Polygon({paths:this.mm_(shape.geometry)});
              break;

         tmp.setValues({map:map,id:shape.id})

         shapes.push(tmp);

        }
      return shapes;
    },
    l_:function(path,e){
      path=(path.getArray)?path.getArray():path;
      if(e){
        return google.maps.geometry.encoding.encodePath(path);
      }else{
        var r=[];
        for(var i=0;i<path.length;++i){
          r.push(this.p_(path[i]));
        }
        return r;
      }
    },
    ll_:function(path){
      if(typeof path==='string'){
        return google.maps.geometry.encoding.decodePath(path);
      }
      else{
        var r=[];
        for(var i=0;i<path.length;++i){
          r.push(this.pp_.apply(this,path[i]));
        }
        return r;
      }
    },

    m_:function(paths,e){
      var r=[];
      paths=(paths.getArray)?paths.getArray():paths;
      for(var i=0;i<paths.length;++i){
          r.push(this.l_(paths[i],e));
        }
       return r;
    },
    mm_:function(paths){
      var r=[];
      for(var i=0;i<paths.length;++i){
          r.push(this.ll_.call(this,paths[i]));

        }
       return r;
    },
    p_:function(latLng){
      return([latLng.lng(),latLng.lat()]);
    },
    pp_:function(lat,lng){
      return new google.maps.LatLng(lng,lat);
    },
    b_:function(bounds){
      return([this.p_(bounds.getSouthWest()),
              this.p_(bounds.getNorthEast())]);
    },
    bb_:function(sw,ne){
      return new google.maps.LatLngBounds(this.pp_.apply(this,sw),
                                          this.pp_.apply(this,ne));
    },
    t_:function(s){
      var t=['CIRCLE','MARKER','RECTANGLE','POLYLINE','POLYGON'];
      for(var i=0;i<t.length;++i){
         if(s===google.maps.drawing.OverlayType[t[i]]){
           return t[i];
         }
      }
    }

  }
  google.maps.event.addDomListener(window, 'load', initialize);
  //]]>

  </script>

2 个答案:

答案 0 :(得分:1)

这样的东西?

  <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="5" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <TabControl x:Name="tabControl">
        <TabItem Header="Општи подаци">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="5" />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="5" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="5" />
                    <RowDefinition Height="Auto" />

                </Grid.RowDefinitions>

                <Label x:Name="label"
                       Content="Кључ:" />
                <Label x:Name="label_Copy"
                       Content="Повезивање:"
                       Grid.Row="2" />
                <Label x:Name="label_Copy1"
                       Content="Линк за слику 1:"
                       Grid.Row="4" />

                <TextBox x:Name="textBoxKljuc"
                         Grid.Column="2"
                         TextWrapping="Wrap"
                         IsEnabled="False" />
                <TextBox x:Name="textBoxPovezivanje"
                         Grid.Column="2"
                         Grid.Row="2"
                         TextWrapping="Wrap"
                         IsEnabled="False" />
                <TextBox x:Name="textBoxLinkZaSliku1"
                         Grid.Column="2"
                         Grid.Row="4"
                         TextWrapping="Wrap"
                         Background="#FFECE7B7" />

            </Grid>
        </TabItem>
    </TabControl>
    <StackPanel Orientation="Horizontal"
                HorizontalAlignment="Right"
                Grid.Row="2">
        <Button x:Name="buttonSnimiObjekat"
                Content="Измени" />
        <Button x:Name="buttonOdustani"
                Content="Откажи" />
    </StackPanel>

</Grid>

答案 1 :(得分:0)

所以我终于找到了方法,如何解决这个问题。因为我注意到有一个非常流行的bug(Polygon需要关闭 - 第一个loc需要在最后重复)我决定在这里分享修复。 您需要添加以下行:

r.push(this.p_(path[0]));

到l_功能:

l_:function(path,e){
  path=(path.getArray)?path.getArray():path;
  if(e){
    return google.maps.geometry.encoding.encodePath(path);
  }else{
    var r=[];
    for(var i=0;i<path.length;++i){
      r.push(this.p_(path[i]));
    }
      r.push(this.p_(path[0]));
    return r;
  }
},